diff options
author | Chuck Miller <shadowmil@gmail.com> | 2009-12-25 05:00:31 -0500 |
---|---|---|
committer | Jared Adams <jaxad0127@gmail.com> | 2009-12-26 00:40:11 -0700 |
commit | 634aeeb9d58b01f9de6632a014a063ef0c4cf31e (patch) | |
tree | 70023dd2bcc12a3f96ec6f118d80e27411920531 | |
parent | 113fcc4f0a7a0921e94bc415515dd4b393a29d60 (diff) | |
download | tmwa-634aeeb9d58b01f9de6632a014a063ef0c4cf31e.tar.gz tmwa-634aeeb9d58b01f9de6632a014a063ef0c4cf31e.tar.bz2 tmwa-634aeeb9d58b01f9de6632a014a063ef0c4cf31e.tar.xz tmwa-634aeeb9d58b01f9de6632a014a063ef0c4cf31e.zip |
Used the "indent" C formatting program from GNU to do some clean ups
The command options used was:
-nbad -bap -sc -bl -blf -bli0 -cli4 -cbi0
-di5 -nbc -bls -ip2 -nut -ts4 -bap -i4 -sob -npsl
136 files changed, 101627 insertions, 82436 deletions
diff --git a/src/char/char.c b/src/char/char.c index c632d1b..2b25399 100644 --- a/src/char/char.c +++ b/src/char/char.c @@ -35,138 +35,148 @@ #endif struct mmo_map_server server[MAX_MAP_SERVERS]; -int server_fd[MAX_MAP_SERVERS]; -int server_freezeflag[MAX_MAP_SERVERS]; // Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed -int anti_freeze_enable = 0; -int ANTI_FREEZE_INTERVAL = 6; +int server_fd[MAX_MAP_SERVERS]; +int server_freezeflag[MAX_MAP_SERVERS]; // Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed +int anti_freeze_enable = 0; +int ANTI_FREEZE_INTERVAL = 6; -int login_fd, char_fd; +int login_fd, char_fd; char userid[24]; char passwd[24]; char server_name[20]; char wisp_server_name[24] = "Server"; char login_ip_str[16]; -int login_ip; -int login_port = 6900; +int login_ip; +int login_port = 6900; char char_ip_str[16]; -int char_ip; -int char_port = 6121; -int char_maintenance; -int char_new; -int email_creation = 0; // disabled by default +int char_ip; +int char_port = 6121; +int char_maintenance; +int char_new; +int email_creation = 0; // disabled by default char char_txt[1024]; -char backup_txt[1024]; //By zanetheinsane -char backup_txt_flag = 0; // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. => option By [Yor] +char backup_txt[1024]; //By zanetheinsane +char backup_txt_flag = 0; // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. => option By [Yor] char unknown_char_name[1024] = "Unknown"; char char_log_filename[1024] = "log/char.log"; //Added for lan support char lan_map_ip[128]; -int subneti[4]; -int subnetmaski[4]; -int name_ignoring_case = 0; // Allow or not identical name for characters but with a different case by [Yor] -int char_name_option = 0; // Option to know which letters/symbols are authorised in the name of a character (0: all, 1: only those in char_name_letters, 2: all EXCEPT those in char_name_letters) by [Yor] -char char_name_letters[1024] = ""; // list of letters/symbols authorised (or not) in a character name. by [Yor] - -struct char_session_data{ - int account_id, login_id1, login_id2, sex; - unsigned short packet_tmw_version; - int found_char[9]; - char email[40]; // e-mail (default: a@a.com) by [Yor] - time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) +int subneti[4]; +int subnetmaski[4]; +int name_ignoring_case = 0; // Allow or not identical name for characters but with a different case by [Yor] +int char_name_option = 0; // Option to know which letters/symbols are authorised in the name of a character (0: all, 1: only those in char_name_letters, 2: all EXCEPT those in char_name_letters) by [Yor] +char char_name_letters[1024] = ""; // list of letters/symbols authorised (or not) in a character name. by [Yor] + +struct char_session_data +{ + int account_id, login_id1, login_id2, sex; + unsigned short packet_tmw_version; + int found_char[9]; + char email[40]; // e-mail (default: a@a.com) by [Yor] + time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) }; #define AUTH_FIFO_SIZE 256 -struct { - int account_id, char_id, login_id1, login_id2, ip, char_pos, delflag, sex; - unsigned short packet_tmw_version; - time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) +struct +{ + int account_id, char_id, login_id1, login_id2, ip, char_pos, delflag, + sex; + unsigned short packet_tmw_version; + time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) } auth_fifo[AUTH_FIFO_SIZE]; -int auth_fifo_pos = 0; +int auth_fifo_pos = 0; -int check_ip_flag = 1; // It's to check IP of a player between char-server and other servers (part of anti-hacking system) +int check_ip_flag = 1; // It's to check IP of a player between char-server and other servers (part of anti-hacking system) -int char_id_count = 150000; +int char_id_count = 150000; struct mmo_charstatus *char_dat; -int char_num, char_max; -int max_connect_user = 0; -int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; -int start_zeny = 500; -int start_weapon = 1201; -int start_armor = 1202; +int char_num, char_max; +int max_connect_user = 0; +int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; +int start_zeny = 500; +int start_weapon = 1201; +int start_armor = 1202; // Initial position (it's possible to set it in conf file) -struct point start_point = {"new_1-1.gat", 53, 111}; +struct point start_point = { "new_1-1.gat", 53, 111 }; struct gm_account *gm_account = NULL; -int GM_num = 0; +int GM_num = 0; // online players by [Yor] char online_txt_filename[1024] = "online.txt"; char online_html_filename[1024] = "online.html"; -int online_sorting_option = 0; // sorting option to display online players in online files -int online_display_option = 1; // display options: to know which columns must be displayed -int online_refresh_html = 20; // refresh time (in sec) of the html file in the explorer -int online_gm_display_min_level = 20; // minimum GM level to display 'GM' when we want to display it +int online_sorting_option = 0; // sorting option to display online players in online files +int online_display_option = 1; // display options: to know which columns must be displayed +int online_refresh_html = 20; // refresh time (in sec) of the html file in the explorer +int online_gm_display_min_level = 20; // minimum GM level to display 'GM' when we want to display it -int *online_chars; // same size of char_dat, and id value of current server (or -1) -time_t update_online; // to update online files when we receiving information from a server (not less than 8 seconds) +int *online_chars; // same size of char_dat, and id value of current server (or -1) +time_t update_online; // to update online files when we receiving information from a server (not less than 8 seconds) //------------------------------ // Writing function of logs file //------------------------------ -int char_log(char *fmt, ...) { - FILE *logfp; - va_list ap; - struct timeval tv; - char tmpstr[2048]; - - va_start(ap, fmt); - - logfp = fopen_(char_log_filename, "a"); - if (logfp) { - if (fmt[0] == '\0') // jump a line if no message - fprintf(logfp, RETCODE); - else { - gettimeofday(&tv, NULL); - strftime(tmpstr, 24, "%d-%m-%Y %H:%M:%S", gmtime(&(tv.tv_sec))); - sprintf(tmpstr + 19, ".%03d: %s", (int)tv.tv_usec / 1000, fmt); - vfprintf(logfp, tmpstr, ap); - } - fclose_(logfp); - } - - va_end(ap); - return 0; +int char_log (char *fmt, ...) +{ + FILE *logfp; + va_list ap; + struct timeval tv; + char tmpstr[2048]; + + va_start (ap, fmt); + + logfp = fopen_ (char_log_filename, "a"); + if (logfp) + { + if (fmt[0] == '\0') // jump a line if no message + fprintf (logfp, RETCODE); + else + { + gettimeofday (&tv, NULL); + strftime (tmpstr, 24, "%d-%m-%Y %H:%M:%S", gmtime (&(tv.tv_sec))); + sprintf (tmpstr + 19, ".%03d: %s", (int) tv.tv_usec / 1000, fmt); + vfprintf (logfp, tmpstr, ap); + } + fclose_ (logfp); + } + + va_end (ap); + return 0; } //----------------------------------------------------- // Function to suppress control characters in a string. //----------------------------------------------------- -int remove_control_chars(unsigned char *str) { - int i; - int change = 0; - - for(i = 0; str[i]; i++) { - if (str[i] < 32) { - str[i] = '_'; - change = 1; - } - } - - return change; +int remove_control_chars (unsigned char *str) +{ + int i; + int change = 0; + + for (i = 0; str[i]; i++) + { + if (str[i] < 32) + { + str[i] = '_'; + change = 1; + } + } + + return change; } //---------------------------------------------------------------------- // Determine if an account (id) is a GM account // and returns its level (or 0 if it isn't a GM account or if not found) //---------------------------------------------------------------------- -int isGM(int account_id) { - int i; +int isGM (int account_id) +{ + int i; - for(i = 0; i < GM_num; i++) - if (gm_account[i].account_id == account_id) - return gm_account[i].level; - return 0; + for (i = 0; i < GM_num; i++) + if (gm_account[i].account_id == account_id) + return gm_account[i].level; + return 0; } //---------------------------------------------- @@ -177,3130 +187,3943 @@ int isGM(int account_id) { // and returns index if only 1 character is found // and similar to the searched name. //---------------------------------------------- -int search_character_index(char* character_name) { - int i, quantity, index; - - quantity = 0; - index = -1; - for(i = 0; i < char_num; i++) { - // Without case sensitive check (increase the number of similar character names found) - if (stricmp(char_dat[i].name, character_name) == 0) { - // Strict comparison (if found, we finish the function immediatly with correct value) - if (strcmp(char_dat[i].name, character_name) == 0) - return i; - quantity++; - index = i; - } - } - // Here, the exact character name is not found - // We return the found index of a similar account ONLY if there is 1 similar character - if (quantity == 1) - return index; - - // Exact character name is not found and 0 or more than 1 similar characters have been found ==> we say not found - return -1; +int search_character_index (char *character_name) +{ + int i, quantity, index; + + quantity = 0; + index = -1; + for (i = 0; i < char_num; i++) + { + // Without case sensitive check (increase the number of similar character names found) + if (stricmp (char_dat[i].name, character_name) == 0) + { + // Strict comparison (if found, we finish the function immediatly with correct value) + if (strcmp (char_dat[i].name, character_name) == 0) + return i; + quantity++; + index = i; + } + } + // Here, the exact character name is not found + // We return the found index of a similar account ONLY if there is 1 similar character + if (quantity == 1) + return index; + + // Exact character name is not found and 0 or more than 1 similar characters have been found ==> we say not found + return -1; } //------------------------------------- // Return character name with the index //------------------------------------- -char * search_character_name(int index) { +char *search_character_name (int index) +{ - if (index >= 0 && index < char_num) - return char_dat[index].name; + if (index >= 0 && index < char_num) + return char_dat[index].name; - return unknown_char_name; + return unknown_char_name; } //------------------------------------------------- // Function to create the character line (for save) //------------------------------------------------- -int mmo_char_tostr(char *str, struct mmo_charstatus *p) { - int i; - char *str_p = str; - - // on multi-map server, sometimes it's posssible that last_point become void. (reason???) We check that to not lost character at restart. - if (p->last_point.map[0] == '\0') { - memcpy(p->last_point.map, "prontera.gat", 16); - p->last_point.x = 273; - p->last_point.y = 354; - } - - str_p += sprintf(str_p, "%d\t%d,%d\t%s\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" - "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" - "\t%s,%d,%d\t%s,%d,%d,%d\t", - p->char_id, p->account_id, p->char_num, p->name, // - p->class, p->base_level, p->job_level, - p->base_exp, p->job_exp, p->zeny, - p->hp, p->max_hp, p->sp, p->max_sp, - p->str, p->agi, p->vit, p->int_, p->dex, p->luk, - p->status_point, p->skill_point, - p->option, p->karma, p->manner, // - p->party_id, p->guild_id, 0, - p->hair, p->hair_color, p->clothes_color, - p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom, - p->last_point.map, p->last_point.x, p->last_point.y, // - p->save_point.map, p->save_point.x, p->save_point.y, - p->partner_id); - for(i = 0; i < 10; i++) - if (p->memo_point[i].map[0]) { - str_p += sprintf(str_p, "%s,%d,%d", p->memo_point[i].map, p->memo_point[i].x, p->memo_point[i].y); - } - *(str_p++) = '\t'; - - for(i = 0; i < MAX_INVENTORY; i++) - if (p->inventory[i].nameid) { - str_p += sprintf(str_p, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ", - p->inventory[i].id, p->inventory[i].nameid, p->inventory[i].amount, p->inventory[i].equip, - p->inventory[i].identify, p->inventory[i].refine, p->inventory[i].attribute, - p->inventory[i].card[0], p->inventory[i].card[1], p->inventory[i].card[2], p->inventory[i].card[3], - p->inventory[i].broken); - } - *(str_p++) = '\t'; - - for(i = 0; i < MAX_CART; i++) - if (p->cart[i].nameid) { - str_p += sprintf(str_p, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ", - p->cart[i].id, p->cart[i].nameid, p->cart[i].amount, p->cart[i].equip, - p->cart[i].identify, p->cart[i].refine, p->cart[i].attribute, - p->cart[i].card[0], p->cart[i].card[1], p->cart[i].card[2], p->cart[i].card[3], - p->cart[i].broken); - } - *(str_p++) = '\t'; - - for(i = 0; i < MAX_SKILL; i++) - if (p->skill[i].id) { - str_p += sprintf(str_p, "%d,%d ", p->skill[i].id, p->skill[i].lv | (p->skill[i].flags << 16)); - } - *(str_p++) = '\t'; - - for(i = 0; i < p->global_reg_num; i++) - if (p->global_reg[i].str[0]) - str_p += sprintf(str_p, "%s,%d ", p->global_reg[i].str, p->global_reg[i].value); - *(str_p++) = '\t'; - - *str_p = '\0'; - return 0; +int mmo_char_tostr (char *str, struct mmo_charstatus *p) +{ + int i; + char *str_p = str; + + // on multi-map server, sometimes it's posssible that last_point become void. (reason???) We check that to not lost character at restart. + if (p->last_point.map[0] == '\0') + { + memcpy (p->last_point.map, "prontera.gat", 16); + p->last_point.x = 273; + p->last_point.y = 354; + } + + str_p += sprintf (str_p, "%d\t%d,%d\t%s\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" "\t%s,%d,%d\t%s,%d,%d,%d\t", p->char_id, p->account_id, p->char_num, p->name, // + p->class, p->base_level, p->job_level, p->base_exp, p->job_exp, p->zeny, p->hp, p->max_hp, p->sp, p->max_sp, p->str, p->agi, p->vit, p->int_, p->dex, p->luk, p->status_point, p->skill_point, p->option, p->karma, p->manner, // + p->party_id, p->guild_id, 0, p->hair, p->hair_color, p->clothes_color, p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom, p->last_point.map, p->last_point.x, p->last_point.y, // + p->save_point.map, p->save_point.x, p->save_point.y, + p->partner_id); + for (i = 0; i < 10; i++) + if (p->memo_point[i].map[0]) + { + str_p += + sprintf (str_p, "%s,%d,%d", p->memo_point[i].map, + p->memo_point[i].x, p->memo_point[i].y); + } + *(str_p++) = '\t'; + + for (i = 0; i < MAX_INVENTORY; i++) + if (p->inventory[i].nameid) + { + str_p += sprintf (str_p, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ", + p->inventory[i].id, p->inventory[i].nameid, + p->inventory[i].amount, p->inventory[i].equip, + p->inventory[i].identify, + p->inventory[i].refine, + p->inventory[i].attribute, + p->inventory[i].card[0], + p->inventory[i].card[1], + p->inventory[i].card[2], + p->inventory[i].card[3], + p->inventory[i].broken); + } + *(str_p++) = '\t'; + + for (i = 0; i < MAX_CART; i++) + if (p->cart[i].nameid) + { + str_p += sprintf (str_p, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ", + p->cart[i].id, p->cart[i].nameid, + p->cart[i].amount, p->cart[i].equip, + p->cart[i].identify, p->cart[i].refine, + p->cart[i].attribute, p->cart[i].card[0], + p->cart[i].card[1], p->cart[i].card[2], + p->cart[i].card[3], p->cart[i].broken); + } + *(str_p++) = '\t'; + + for (i = 0; i < MAX_SKILL; i++) + if (p->skill[i].id) + { + str_p += + sprintf (str_p, "%d,%d ", p->skill[i].id, + p->skill[i].lv | (p->skill[i].flags << 16)); + } + *(str_p++) = '\t'; + + for (i = 0; i < p->global_reg_num; i++) + if (p->global_reg[i].str[0]) + str_p += + sprintf (str_p, "%s,%d ", p->global_reg[i].str, + p->global_reg[i].value); + *(str_p++) = '\t'; + + *str_p = '\0'; + return 0; } //------------------------------------------------------------------------- // Function to set the character from the line (at read of characters file) //------------------------------------------------------------------------- -int mmo_char_fromstr(char *str, struct mmo_charstatus *p) { - int tmp_int[256]; - int set, next, len, i; - - // initilialise character - memset(p, '\0', sizeof(struct mmo_charstatus)); - - // If it's not char structure of version 1008 and after - if ((set = sscanf(str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" - "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" - "\t%[^,],%d,%d\t%[^,],%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, // - &tmp_int[3], &tmp_int[4], &tmp_int[5], - &tmp_int[6], &tmp_int[7], &tmp_int[8], - &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], - &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], - &tmp_int[19], &tmp_int[20], - &tmp_int[21], &tmp_int[22], &tmp_int[23], // - &tmp_int[24], &tmp_int[25], &tmp_int[26], - &tmp_int[27], &tmp_int[28], &tmp_int[29], - &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34], - p->last_point.map, &tmp_int[35], &tmp_int[36], // - p->save_point.map, &tmp_int[37], &tmp_int[38], &tmp_int[39], &next)) != 43) { - tmp_int[39] = 0; // partner id - // If not char structure from version 384 to 1007 - if ((set = sscanf(str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" - "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" - "\t%[^,],%d,%d\t%[^,],%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, // - &tmp_int[3], &tmp_int[4], &tmp_int[5], - &tmp_int[6], &tmp_int[7], &tmp_int[8], - &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], - &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], - &tmp_int[19], &tmp_int[20], - &tmp_int[21], &tmp_int[22], &tmp_int[23], // - &tmp_int[24], &tmp_int[25], &tmp_int[26], - &tmp_int[27], &tmp_int[28], &tmp_int[29], - &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34], - p->last_point.map, &tmp_int[35], &tmp_int[36], // - p->save_point.map, &tmp_int[37], &tmp_int[38], &next)) != 42) { - // It's char structure of a version before 384 - tmp_int[26] = 0; // pet id - set = sscanf(str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" - "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" - "\t%[^,],%d,%d\t%[^,],%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, // - &tmp_int[3], &tmp_int[4], &tmp_int[5], - &tmp_int[6], &tmp_int[7], &tmp_int[8], - &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], - &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], - &tmp_int[19], &tmp_int[20], - &tmp_int[21], &tmp_int[22], &tmp_int[23], // - &tmp_int[24], &tmp_int[25], // - &tmp_int[27], &tmp_int[28], &tmp_int[29], - &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34], - p->last_point.map, &tmp_int[35], &tmp_int[36], // - p->save_point.map, &tmp_int[37], &tmp_int[38], &next); - set += 2; - //printf("char: old char data ver.1\n"); - // Char structure of version 1007 or older - } else { - set++; - //printf("char: old char data ver.2\n"); - } - // Char structure of version 1008+ - } else { - //printf("char: new char data ver.3\n"); - } - if (set != 43) - return 0; - - p->char_id = tmp_int[0]; - p->account_id = tmp_int[1]; - p->char_num = tmp_int[2]; - p->class = tmp_int[3]; - p->base_level = tmp_int[4]; - p->job_level = tmp_int[5]; - p->base_exp = tmp_int[6]; - p->job_exp = tmp_int[7]; - p->zeny = tmp_int[8]; - p->hp = tmp_int[9]; - p->max_hp = tmp_int[10]; - p->sp = tmp_int[11]; - p->max_sp = tmp_int[12]; - p->str = tmp_int[13]; - p->agi = tmp_int[14]; - p->vit = tmp_int[15]; - p->int_ = tmp_int[16]; - p->dex = tmp_int[17]; - p->luk = tmp_int[18]; - p->status_point = tmp_int[19]; - p->skill_point = tmp_int[20]; - p->option = tmp_int[21]; - p->karma = tmp_int[22]; - p->manner = tmp_int[23]; - p->party_id = tmp_int[24]; - p->guild_id = tmp_int[25]; -// p->pet_id = tmp_int[26]; - p->hair = tmp_int[27]; - p->hair_color = tmp_int[28]; - p->clothes_color = tmp_int[29]; - p->weapon = tmp_int[30]; - p->shield = tmp_int[31]; - p->head_top = tmp_int[32]; - p->head_mid = tmp_int[33]; - p->head_bottom = tmp_int[34]; - p->last_point.x = tmp_int[35]; - p->last_point.y = tmp_int[36]; - p->save_point.x = tmp_int[37]; - p->save_point.y = tmp_int[38]; - p->partner_id = tmp_int[39]; - - // Some checks - for(i = 0; i < char_num; i++) { - if (char_dat[i].char_id == p->char_id) { - printf("\033[1;31mmmo_auth_init: ******Error: a character has an identical id to another.\n"); - printf(" character id #%d -> new character not readed.\n", p->char_id); - printf(" Character saved in log file.\033[0m\n"); - return -1; - } else if (strcmp(char_dat[i].name, p->name) == 0) { - printf("\033[1;31mmmo_auth_init: ******Error: character name already exists.\n"); - printf(" character name '%s' -> new character not readed.\n", p->name); - printf(" Character saved in log file.\033[0m\n"); - return -2; - } - } - - if (strcmpi(wisp_server_name, p->name) == 0) { - printf("mmo_auth_init: ******WARNING: character name has wisp server name.\n"); - printf(" Character name '%s' = wisp server name '%s'.\n", p->name, wisp_server_name); - printf(" Character readed. Suggestion: change the wisp server name.\n"); - char_log("mmo_auth_init: ******WARNING: character name has wisp server name: Character name '%s' = wisp server name '%s'." RETCODE, - p->name, wisp_server_name); - } - - if (str[next] == '\n' || str[next] == '\r') - return 1; // 新規データ - - next++; - - for(i = 0; str[next] && str[next] != '\t'; i++) { - if (sscanf(str+next, "%[^,],%d,%d%n", p->memo_point[i].map, &tmp_int[0], &tmp_int[1], &len) != 3) - return -3; - p->memo_point[i].x = tmp_int[0]; - p->memo_point[i].y = tmp_int[1]; - next += len; - if (str[next] == ' ') - next++; - } - - next++; - - for(i = 0; str[next] && str[next] != '\t'; i++) { - if (sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &len) == 12) { - // do nothing, it's ok - } else if (sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) { - tmp_int[11] = 0; // broken doesn't exist in this version -> 0 - } else // invalid structure - return -4; - p->inventory[i].id = tmp_int[0]; - p->inventory[i].nameid = tmp_int[1]; - p->inventory[i].amount = tmp_int[2]; - p->inventory[i].equip = tmp_int[3]; - p->inventory[i].identify = tmp_int[4]; - p->inventory[i].refine = tmp_int[5]; - p->inventory[i].attribute = tmp_int[6]; - p->inventory[i].card[0] = tmp_int[7]; - p->inventory[i].card[1] = tmp_int[8]; - p->inventory[i].card[2] = tmp_int[9]; - p->inventory[i].card[3] = tmp_int[10]; - p->inventory[i].broken = tmp_int[11]; - next += len; - if (str[next] == ' ') - next++; - } - - next++; - - for(i = 0; str[next] && str[next] != '\t'; i++) { - if (sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &len) == 12) { - // do nothing, it's ok - } else if (sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) { - tmp_int[11] = 0; // broken doesn't exist in this version -> 0 - } else // invalid structure - return -5; - p->cart[i].id = tmp_int[0]; - p->cart[i].nameid = tmp_int[1]; - p->cart[i].amount = tmp_int[2]; - p->cart[i].equip = tmp_int[3]; - p->cart[i].identify = tmp_int[4]; - p->cart[i].refine = tmp_int[5]; - p->cart[i].attribute = tmp_int[6]; - p->cart[i].card[0] = tmp_int[7]; - p->cart[i].card[1] = tmp_int[8]; - p->cart[i].card[2] = tmp_int[9]; - p->cart[i].card[3] = tmp_int[10]; - p->cart[i].broken = tmp_int[11]; - next += len; - if (str[next] == ' ') - next++; - } - - next++; - - for(i = 0; str[next] && str[next] != '\t'; i++) { - if (sscanf(str + next, "%d,%d%n", &tmp_int[0], &tmp_int[1], &len) != 2) - return -6; - p->skill[tmp_int[0]].id = tmp_int[0]; - p->skill[tmp_int[0]].lv = tmp_int[1] & 0xffff; - p->skill[tmp_int[0]].flags = ((tmp_int[1] >> 16) & 0xffff); - next += len; - if (str[next] == ' ') - next++; - } - - next++; - - for(i = 0; str[next] && str[next] != '\t' && str[next] != '\n' && str[next] != '\r'; i++) { // global_reg実装以前のathena.txt互換のため一応'\n'チェック - if (sscanf(str + next, "%[^,],%d%n", p->global_reg[i].str, &p->global_reg[i].value, &len) != 2) { - // because some scripts are not correct, the str can be "". So, we must check that. - // If it's, we must not refuse the character, but just this REG value. - // Character line will have something like: nov_2nd_cos,9 ,9 nov_1_2_cos_c,1 (here, ,9 is not good) - if (str[next] == ',' && sscanf(str + next, ",%d%n", &p->global_reg[i].value, &len) == 1) - i--; - else - return -7; - } - next += len; - if (str[next] == ' ') - next++; - } - p->global_reg_num = i; - - return 1; +int mmo_char_fromstr (char *str, struct mmo_charstatus *p) +{ + int tmp_int[256]; + int set, next, len, i; + + // initilialise character + memset (p, '\0', sizeof (struct mmo_charstatus)); + + // If it's not char structure of version 1008 and after + if ((set = sscanf (str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" "\t%[^,],%d,%d\t%[^,],%d,%d,%d%n", &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, // + &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], &tmp_int[19], &tmp_int[20], &tmp_int[21], &tmp_int[22], &tmp_int[23], // + &tmp_int[24], &tmp_int[25], &tmp_int[26], &tmp_int[27], &tmp_int[28], &tmp_int[29], &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34], p->last_point.map, &tmp_int[35], &tmp_int[36], // + p->save_point.map, &tmp_int[37], &tmp_int[38], + &tmp_int[39], &next)) != 43) + { + tmp_int[39] = 0; // partner id + // If not char structure from version 384 to 1007 + if ((set = sscanf (str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" "\t%[^,],%d,%d\t%[^,],%d,%d%n", &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, // + &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], &tmp_int[19], &tmp_int[20], &tmp_int[21], &tmp_int[22], &tmp_int[23], // + &tmp_int[24], &tmp_int[25], &tmp_int[26], &tmp_int[27], &tmp_int[28], &tmp_int[29], &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34], p->last_point.map, &tmp_int[35], &tmp_int[36], // + p->save_point.map, &tmp_int[37], &tmp_int[38], + &next)) != 42) + { + // It's char structure of a version before 384 + tmp_int[26] = 0; // pet id + set = sscanf (str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" "\t%[^,],%d,%d\t%[^,],%d,%d%n", &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, // + &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], &tmp_int[19], &tmp_int[20], &tmp_int[21], &tmp_int[22], &tmp_int[23], // + &tmp_int[24], &tmp_int[25], // + &tmp_int[27], &tmp_int[28], &tmp_int[29], &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34], p->last_point.map, &tmp_int[35], &tmp_int[36], // + p->save_point.map, &tmp_int[37], &tmp_int[38], + &next); + set += 2; + //printf("char: old char data ver.1\n"); + // Char structure of version 1007 or older + } + else + { + set++; + //printf("char: old char data ver.2\n"); + } + // Char structure of version 1008+ + } + else + { + //printf("char: new char data ver.3\n"); + } + if (set != 43) + return 0; + + p->char_id = tmp_int[0]; + p->account_id = tmp_int[1]; + p->char_num = tmp_int[2]; + p->class = tmp_int[3]; + p->base_level = tmp_int[4]; + p->job_level = tmp_int[5]; + p->base_exp = tmp_int[6]; + p->job_exp = tmp_int[7]; + p->zeny = tmp_int[8]; + p->hp = tmp_int[9]; + p->max_hp = tmp_int[10]; + p->sp = tmp_int[11]; + p->max_sp = tmp_int[12]; + p->str = tmp_int[13]; + p->agi = tmp_int[14]; + p->vit = tmp_int[15]; + p->int_ = tmp_int[16]; + p->dex = tmp_int[17]; + p->luk = tmp_int[18]; + p->status_point = tmp_int[19]; + p->skill_point = tmp_int[20]; + p->option = tmp_int[21]; + p->karma = tmp_int[22]; + p->manner = tmp_int[23]; + p->party_id = tmp_int[24]; + p->guild_id = tmp_int[25]; +// p->pet_id = tmp_int[26]; + p->hair = tmp_int[27]; + p->hair_color = tmp_int[28]; + p->clothes_color = tmp_int[29]; + p->weapon = tmp_int[30]; + p->shield = tmp_int[31]; + p->head_top = tmp_int[32]; + p->head_mid = tmp_int[33]; + p->head_bottom = tmp_int[34]; + p->last_point.x = tmp_int[35]; + p->last_point.y = tmp_int[36]; + p->save_point.x = tmp_int[37]; + p->save_point.y = tmp_int[38]; + p->partner_id = tmp_int[39]; + + // Some checks + for (i = 0; i < char_num; i++) + { + if (char_dat[i].char_id == p->char_id) + { + printf + ("\033[1;31mmmo_auth_init: ******Error: a character has an identical id to another.\n"); + printf + (" character id #%d -> new character not readed.\n", + p->char_id); + printf (" Character saved in log file.\033[0m\n"); + return -1; + } + else if (strcmp (char_dat[i].name, p->name) == 0) + { + printf + ("\033[1;31mmmo_auth_init: ******Error: character name already exists.\n"); + printf + (" character name '%s' -> new character not readed.\n", + p->name); + printf (" Character saved in log file.\033[0m\n"); + return -2; + } + } + + if (strcmpi (wisp_server_name, p->name) == 0) + { + printf + ("mmo_auth_init: ******WARNING: character name has wisp server name.\n"); + printf + (" Character name '%s' = wisp server name '%s'.\n", + p->name, wisp_server_name); + printf + (" Character readed. Suggestion: change the wisp server name.\n"); + char_log + ("mmo_auth_init: ******WARNING: character name has wisp server name: Character name '%s' = wisp server name '%s'." + RETCODE, p->name, wisp_server_name); + } + + if (str[next] == '\n' || str[next] == '\r') + return 1; // 新規データ + + next++; + + for (i = 0; str[next] && str[next] != '\t'; i++) + { + if (sscanf + (str + next, "%[^,],%d,%d%n", p->memo_point[i].map, &tmp_int[0], + &tmp_int[1], &len) != 3) + return -3; + p->memo_point[i].x = tmp_int[0]; + p->memo_point[i].y = tmp_int[1]; + next += len; + if (str[next] == ' ') + next++; + } + + next++; + + for (i = 0; str[next] && str[next] != '\t'; i++) + { + if (sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &tmp_int[11], &len) == 12) + { + // do nothing, it's ok + } + else if (sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &len) == 11) + { + tmp_int[11] = 0; // broken doesn't exist in this version -> 0 + } + else // invalid structure + return -4; + p->inventory[i].id = tmp_int[0]; + p->inventory[i].nameid = tmp_int[1]; + p->inventory[i].amount = tmp_int[2]; + p->inventory[i].equip = tmp_int[3]; + p->inventory[i].identify = tmp_int[4]; + p->inventory[i].refine = tmp_int[5]; + p->inventory[i].attribute = tmp_int[6]; + p->inventory[i].card[0] = tmp_int[7]; + p->inventory[i].card[1] = tmp_int[8]; + p->inventory[i].card[2] = tmp_int[9]; + p->inventory[i].card[3] = tmp_int[10]; + p->inventory[i].broken = tmp_int[11]; + next += len; + if (str[next] == ' ') + next++; + } + + next++; + + for (i = 0; str[next] && str[next] != '\t'; i++) + { + if (sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &tmp_int[11], &len) == 12) + { + // do nothing, it's ok + } + else if (sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &len) == 11) + { + tmp_int[11] = 0; // broken doesn't exist in this version -> 0 + } + else // invalid structure + return -5; + p->cart[i].id = tmp_int[0]; + p->cart[i].nameid = tmp_int[1]; + p->cart[i].amount = tmp_int[2]; + p->cart[i].equip = tmp_int[3]; + p->cart[i].identify = tmp_int[4]; + p->cart[i].refine = tmp_int[5]; + p->cart[i].attribute = tmp_int[6]; + p->cart[i].card[0] = tmp_int[7]; + p->cart[i].card[1] = tmp_int[8]; + p->cart[i].card[2] = tmp_int[9]; + p->cart[i].card[3] = tmp_int[10]; + p->cart[i].broken = tmp_int[11]; + next += len; + if (str[next] == ' ') + next++; + } + + next++; + + for (i = 0; str[next] && str[next] != '\t'; i++) + { + if (sscanf (str + next, "%d,%d%n", &tmp_int[0], &tmp_int[1], &len) != + 2) + return -6; + p->skill[tmp_int[0]].id = tmp_int[0]; + p->skill[tmp_int[0]].lv = tmp_int[1] & 0xffff; + p->skill[tmp_int[0]].flags = ((tmp_int[1] >> 16) & 0xffff); + next += len; + if (str[next] == ' ') + next++; + } + + next++; + + for (i = 0; + str[next] && str[next] != '\t' && str[next] != '\n' + && str[next] != '\r'; i++) + { // global_reg実装以前のathena.txt互換のため一応'\n'チェック + if (sscanf + (str + next, "%[^,],%d%n", p->global_reg[i].str, + &p->global_reg[i].value, &len) != 2) + { + // because some scripts are not correct, the str can be "". So, we must check that. + // If it's, we must not refuse the character, but just this REG value. + // Character line will have something like: nov_2nd_cos,9 ,9 nov_1_2_cos_c,1 (here, ,9 is not good) + if (str[next] == ',' + && sscanf (str + next, ",%d%n", &p->global_reg[i].value, + &len) == 1) + i--; + else + return -7; + } + next += len; + if (str[next] == ' ') + next++; + } + p->global_reg_num = i; + + return 1; } //--------------------------------- // Function to read characters file //--------------------------------- -int mmo_char_init(void) { - char line[65536]; - int i; - int ret, line_count; - FILE *fp; - - char_max = 256; - char_dat = calloc(sizeof(struct mmo_charstatus) * 256, 1); - if (!char_dat) { - printf("out of memory: mmo_char_init (calloc of char_dat).\n"); - exit(1); - } - online_chars = calloc(sizeof(int) * 256, 1); - if (!online_chars) { - printf("out of memory: mmo_char_init (calloc of online_chars).\n"); - exit(1); - } - for(i = 0; i < char_max; i++) - online_chars[i] = -1; - - char_num = 0; - - fp = fopen_(char_txt, "r"); - if (fp == NULL) { - printf("Characters file not found: %s.\n", char_txt); - char_log("Characters file not found: %s." RETCODE, char_txt); - char_log("Id for the next created character: %d." RETCODE, char_id_count); - return 0; - } - - line_count = 0; - while(fgets(line, sizeof(line)-1, fp)) { - int i, j; - line_count++; - - if (line[0] == '/' && line[1] == '/') - continue; - line[sizeof(line)-1] = '\0'; - - j = 0; - if (sscanf(line, "%d\t%%newid%%%n", &i, &j) == 1 && j > 0) { - if (char_id_count < i) - char_id_count = i; - continue; - } - - if (char_num >= char_max) { - char_max += 256; - char_dat = realloc(char_dat, sizeof(struct mmo_charstatus) * char_max); - if (!char_dat) { - printf("Out of memory: mmo_char_init (realloc of char_dat).\n"); - char_log("Out of memory: mmo_char_init (realloc of char_dat)." RETCODE); - exit(1); - } - online_chars = realloc(online_chars, sizeof(int) * char_max); - if (!online_chars) { - printf("Out of memory: mmo_char_init (realloc of online_chars).\n"); - char_log("Out of memory: mmo_char_init (realloc of online_chars)." RETCODE); - exit(1); - } - for(i = char_max - 256; i < char_max; i++) - online_chars[i] = -1; - } - - ret = mmo_char_fromstr(line, &char_dat[char_num]); - if (ret > 0) { // negative value or zero for errors - if (char_dat[char_num].char_id >= char_id_count) - char_id_count = char_dat[char_num].char_id + 1; - char_num++; - } else { - printf("mmo_char_init: in characters file, unable to read the line #%d.\n", line_count); - printf(" -> Character saved in log file.\n"); - switch (ret) { - case -1: - char_log("Duplicate character id in the next character line (character not readed):" RETCODE); - break; - case -2: - char_log("Duplicate character name in the next character line (character not readed):" RETCODE); - break; - case -3: - char_log("Invalid memo point structure in the next character line (character not readed):" RETCODE); - break; - case -4: - char_log("Invalid inventory item structure in the next character line (character not readed):" RETCODE); - break; - case -5: - char_log("Invalid cart item structure in the next character line (character not readed):" RETCODE); - break; - case -6: - char_log("Invalid skill structure in the next character line (character not readed):" RETCODE); - break; - case -7: - char_log("Invalid register structure in the next character line (character not readed):" RETCODE); - break; - default: // 0 - char_log("Unabled to get a character in the next line - Basic structure of line (before inventory) is incorrect (character not readed):" RETCODE); - break; - } - char_log("%s", line); - } - } - fclose_(fp); - - if (char_num == 0) { - printf("mmo_char_init: No character found in %s.\n", char_txt); - char_log("mmo_char_init: No character found in %s." RETCODE, char_txt); - } else if (char_num == 1) { - printf("mmo_char_init: 1 character read in %s.\n", char_txt); - char_log("mmo_char_init: 1 character read in %s." RETCODE, char_txt); - } else { - printf("mmo_char_init: %d characters read in %s.\n", char_num, char_txt); - char_log("mmo_char_init: %d characters read in %s." RETCODE, char_num, char_txt); - } - - char_log("Id for the next created character: %d." RETCODE, char_id_count); - - return 0; +int mmo_char_init (void) +{ + char line[65536]; + int i; + int ret, line_count; + FILE *fp; + + char_max = 256; + char_dat = calloc (sizeof (struct mmo_charstatus) * 256, 1); + if (!char_dat) + { + printf ("out of memory: mmo_char_init (calloc of char_dat).\n"); + exit (1); + } + online_chars = calloc (sizeof (int) * 256, 1); + if (!online_chars) + { + printf ("out of memory: mmo_char_init (calloc of online_chars).\n"); + exit (1); + } + for (i = 0; i < char_max; i++) + online_chars[i] = -1; + + char_num = 0; + + fp = fopen_ (char_txt, "r"); + if (fp == NULL) + { + printf ("Characters file not found: %s.\n", char_txt); + char_log ("Characters file not found: %s." RETCODE, char_txt); + char_log ("Id for the next created character: %d." RETCODE, + char_id_count); + return 0; + } + + line_count = 0; + while (fgets (line, sizeof (line) - 1, fp)) + { + int i, j; + line_count++; + + if (line[0] == '/' && line[1] == '/') + continue; + line[sizeof (line) - 1] = '\0'; + + j = 0; + if (sscanf (line, "%d\t%%newid%%%n", &i, &j) == 1 && j > 0) + { + if (char_id_count < i) + char_id_count = i; + continue; + } + + if (char_num >= char_max) + { + char_max += 256; + char_dat = + realloc (char_dat, sizeof (struct mmo_charstatus) * char_max); + if (!char_dat) + { + printf + ("Out of memory: mmo_char_init (realloc of char_dat).\n"); + char_log + ("Out of memory: mmo_char_init (realloc of char_dat)." + RETCODE); + exit (1); + } + online_chars = realloc (online_chars, sizeof (int) * char_max); + if (!online_chars) + { + printf + ("Out of memory: mmo_char_init (realloc of online_chars).\n"); + char_log + ("Out of memory: mmo_char_init (realloc of online_chars)." + RETCODE); + exit (1); + } + for (i = char_max - 256; i < char_max; i++) + online_chars[i] = -1; + } + + ret = mmo_char_fromstr (line, &char_dat[char_num]); + if (ret > 0) + { // negative value or zero for errors + if (char_dat[char_num].char_id >= char_id_count) + char_id_count = char_dat[char_num].char_id + 1; + char_num++; + } + else + { + printf + ("mmo_char_init: in characters file, unable to read the line #%d.\n", + line_count); + printf (" -> Character saved in log file.\n"); + switch (ret) + { + case -1: + char_log + ("Duplicate character id in the next character line (character not readed):" + RETCODE); + break; + case -2: + char_log + ("Duplicate character name in the next character line (character not readed):" + RETCODE); + break; + case -3: + char_log + ("Invalid memo point structure in the next character line (character not readed):" + RETCODE); + break; + case -4: + char_log + ("Invalid inventory item structure in the next character line (character not readed):" + RETCODE); + break; + case -5: + char_log + ("Invalid cart item structure in the next character line (character not readed):" + RETCODE); + break; + case -6: + char_log + ("Invalid skill structure in the next character line (character not readed):" + RETCODE); + break; + case -7: + char_log + ("Invalid register structure in the next character line (character not readed):" + RETCODE); + break; + default: // 0 + char_log + ("Unabled to get a character in the next line - Basic structure of line (before inventory) is incorrect (character not readed):" + RETCODE); + break; + } + char_log ("%s", line); + } + } + fclose_ (fp); + + if (char_num == 0) + { + printf ("mmo_char_init: No character found in %s.\n", char_txt); + char_log ("mmo_char_init: No character found in %s." RETCODE, + char_txt); + } + else if (char_num == 1) + { + printf ("mmo_char_init: 1 character read in %s.\n", char_txt); + char_log ("mmo_char_init: 1 character read in %s." RETCODE, char_txt); + } + else + { + printf ("mmo_char_init: %d characters read in %s.\n", char_num, + char_txt); + char_log ("mmo_char_init: %d characters read in %s." RETCODE, + char_num, char_txt); + } + + char_log ("Id for the next created character: %d." RETCODE, + char_id_count); + + return 0; } //--------------------------------------------------------- // Function to save characters in files (speed up by [Yor]) //--------------------------------------------------------- -void mmo_char_sync(void) { - char line[65536]; - int i, j, k; - int lock; - FILE *fp; - int id[char_num]; - - // Sorting before save (by [Yor]) - for(i = 0; i < char_num; i++) { - id[i] = i; - for(j = 0; j < i; j++) { - if ((char_dat[i].account_id < char_dat[id[j]].account_id) || - // if same account id, we sort by slot. - (char_dat[i].account_id == char_dat[id[j]].account_id && - char_dat[i].char_num < char_dat[id[j]].char_num)) { - for(k = i; k > j; k--) - id[k] = id[k-1]; - id[j] = i; // id[i] - break; - } - } - } - - // Data save - fp = lock_fopen(char_txt, &lock); - if (fp == NULL) { - printf("WARNING: Server can't not save characters.\n"); - char_log("WARNING: Server can't not save characters." RETCODE); - } else { - for(i = 0; i < char_num; i++) { - // create only once the line, and save it in the 2 files (it's speeder than repeat twice the loop and create twice the line) - mmo_char_tostr(line, &char_dat[id[i]]); // use of sorted index - fprintf(fp, "%s" RETCODE, line); - } - fprintf(fp, "%d\t%%newid%%" RETCODE, char_id_count); - lock_fclose(fp, char_txt, &lock); - } - - // Data save (backup) - if (backup_txt_flag) { // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. => option By [Yor] - fp = lock_fopen(backup_txt, &lock); - if (fp == NULL) { - printf("WARNING: Server can't not create backup of characters file.\n"); - char_log("WARNING: Server can't not create backup of characters file." RETCODE); - return; - } - for(i = 0; i < char_num; i++) { - // create only once the line, and save it in the 2 files (it's speeder than repeat twice the loop and create twice the line) - mmo_char_tostr(line, &char_dat[id[i]]); // use of sorted index - fprintf(fp, "%s" RETCODE, line); - } - fprintf(fp, "%d\t%%newid%%" RETCODE, char_id_count); - lock_fclose(fp, backup_txt, &lock); - } - - return; +void mmo_char_sync (void) +{ + char line[65536]; + int i, j, k; + int lock; + FILE *fp; + int id[char_num]; + + // Sorting before save (by [Yor]) + for (i = 0; i < char_num; i++) + { + id[i] = i; + for (j = 0; j < i; j++) + { + if ((char_dat[i].account_id < char_dat[id[j]].account_id) || + // if same account id, we sort by slot. + (char_dat[i].account_id == char_dat[id[j]].account_id && + char_dat[i].char_num < char_dat[id[j]].char_num)) + { + for (k = i; k > j; k--) + id[k] = id[k - 1]; + id[j] = i; // id[i] + break; + } + } + } + + // Data save + fp = lock_fopen (char_txt, &lock); + if (fp == NULL) + { + printf ("WARNING: Server can't not save characters.\n"); + char_log ("WARNING: Server can't not save characters." RETCODE); + } + else + { + for (i = 0; i < char_num; i++) + { + // create only once the line, and save it in the 2 files (it's speeder than repeat twice the loop and create twice the line) + mmo_char_tostr (line, &char_dat[id[i]]); // use of sorted index + fprintf (fp, "%s" RETCODE, line); + } + fprintf (fp, "%d\t%%newid%%" RETCODE, char_id_count); + lock_fclose (fp, char_txt, &lock); + } + + // Data save (backup) + if (backup_txt_flag) + { // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. => option By [Yor] + fp = lock_fopen (backup_txt, &lock); + if (fp == NULL) + { + printf + ("WARNING: Server can't not create backup of characters file.\n"); + char_log + ("WARNING: Server can't not create backup of characters file." + RETCODE); + return; + } + for (i = 0; i < char_num; i++) + { + // create only once the line, and save it in the 2 files (it's speeder than repeat twice the loop and create twice the line) + mmo_char_tostr (line, &char_dat[id[i]]); // use of sorted index + fprintf (fp, "%s" RETCODE, line); + } + fprintf (fp, "%d\t%%newid%%" RETCODE, char_id_count); + lock_fclose (fp, backup_txt, &lock); + } + + return; } //---------------------------------------------------- // Function to save (in a periodic way) datas in files //---------------------------------------------------- -int mmo_char_sync_timer(int tid, unsigned int tick, int id, int data) { - pid_t pid; +int mmo_char_sync_timer (int tid, unsigned int tick, int id, int data) +{ + pid_t pid; - // This can take a lot of time. Fork a child to handle the work and return at once - // If we're unable to fork just continue running the function normally - if ((pid = fork()) > 0) - return 0; + // This can take a lot of time. Fork a child to handle the work and return at once + // If we're unable to fork just continue running the function normally + if ((pid = fork ()) > 0) + return 0; - mmo_char_sync(); - inter_save(); + mmo_char_sync (); + inter_save (); - // If we're a child we should suicide now. - if (pid == 0) - exit(0); + // If we're a child we should suicide now. + if (pid == 0) + exit (0); - return 0; + return 0; } //---------------------------------------------------- // Remove trailing whitespace from a name //---------------------------------------------------- -static void remove_trailing_blanks(char *name) +static void remove_trailing_blanks (char *name) { - char *tail = name + strlen(name) - 1; + char *tail = name + strlen (name) - 1; - while (tail > name - && *tail == ' ') - *tail-- = 0; + while (tail > name && *tail == ' ') + *tail-- = 0; } //---------------------------------------------------- // Remove prefix whitespace from a name //---------------------------------------------------- -static void remove_prefix_blanks(char *name) +static void remove_prefix_blanks (char *name) { - char *dst = name; - char *src = name; + char *dst = name; + char *src = name; - while (*src == ' ') // find first nonblank - ++src; - while ((*dst++ = *src++)); // `strmove' + while (*src == ' ') // find first nonblank + ++src; + while ((*dst++ = *src++)); // `strmove' } //----------------------------------- // Function to create a new character //----------------------------------- -int make_new_char(int fd, unsigned char *dat) { - int i, j; - struct char_session_data *sd; - - sd = session[fd]->session_data; - - // remove control characters from the name - dat[23] = '\0'; - if (remove_control_chars(dat)) { - char_log("Make new char error (control char received in the name): (connection #%d, account: %d)." RETCODE, - fd, sd->account_id); - return -1; - } - - // Eliminate whitespace - remove_trailing_blanks((char *)dat); - remove_prefix_blanks((char *)dat); - - // check lenght of character name - if (strlen(dat) < 4) { - char_log("Make new char error (character name too small): (connection #%d, account: %d, name: '%s')." RETCODE, - fd, sd->account_id, dat); - return -1; - } - - // Check Authorised letters/symbols in the name of the character - if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised - for (i = 0; dat[i]; i++) - if (strchr(char_name_letters, dat[i]) == NULL) { - char_log("Make new char error (invalid letter in the name): (connection #%d, account: %d), name: %s, invalid letter: %c." RETCODE, - fd, sd->account_id, dat, dat[i]); - return -1; - } - } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden - for (i = 0; dat[i]; i++) - if (strchr(char_name_letters, dat[i]) != NULL) { - char_log("Make new char error (invalid letter in the name): (connection #%d, account: %d), name: %s, invalid letter: %c." RETCODE, - fd, sd->account_id, dat, dat[i]); - return -1; - } - } // else, all letters/symbols are authorised (except control char removed before) - - if (dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29] != 5*6 || // stats - dat[30] >= 9 || // slots (dat[30] can not be negativ) - dat[33] < 0 || dat[33] >= 20 || // hair style - dat[31] >= 12) { // hair color (dat[31] can not be negativ) - char_log("Make new char error (invalid values): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d" RETCODE, - fd, sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]); - return -1; - } - - // check individual stat value - for(i = 24; i <= 29; i++) { - if (dat[i] < 1 || dat[i] > 9) { - char_log("Make new char error (invalid stat value: not between 1 to 9): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d" RETCODE, - fd, sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]); - return -1; - } - } - - for(i = 0; i < char_num; i++) { - if ((name_ignoring_case != 0 && strcmp(char_dat[i].name, dat) == 0) || - (name_ignoring_case == 0 && strcmpi(char_dat[i].name, dat) == 0)) { - char_log("Make new char error (name already exists): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %s), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE, - fd, sd->account_id, dat[30], dat, char_dat[i].name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]); - return -1; - } - if (char_dat[i].account_id == sd->account_id && char_dat[i].char_num == dat[30]) { - char_log("Make new char error (slot already used): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %s), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE, - fd, sd->account_id, dat[30], dat, char_dat[i].name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]); - return -1; - } - } - - if (strcmp(wisp_server_name, dat) == 0) { - char_log("Make new char error (name used is wisp name for server): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %d), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE, - fd, sd->account_id, dat[30], dat, char_dat[i].name, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]); - return -1; - } - - if (char_num >= char_max) { - char_max += 256; - char_dat = realloc(char_dat, sizeof(struct mmo_charstatus) * char_max); - if (!char_dat) { - printf("Out of memory: make_new_char (realloc of char_dat).\n"); - char_log("Out of memory: make_new_char (realloc of char_dat)." RETCODE); - exit(1); - } - online_chars = realloc(online_chars, sizeof(int) * char_max); - if (!online_chars) { - printf("Out of memory: make_new_char (realloc of online_chars).\n"); - char_log("Out of memory: make_new_char (realloc of online_chars)." RETCODE); - exit(1); - } - for(j = char_max - 256; j < char_max; j++) - online_chars[j] = -1; - } - - char_log("Creation of New Character: (connection #%d, account: %d) slot %d, character Name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." RETCODE, - fd, sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], dat[31]); - - memset(&char_dat[i], 0, sizeof(struct mmo_charstatus)); - - char_dat[i].char_id = char_id_count++; - char_dat[i].account_id = sd->account_id; - char_dat[i].char_num = dat[30]; - strcpy(char_dat[i].name, dat); - char_dat[i].class = 0; - char_dat[i].base_level = 1; - char_dat[i].job_level = 1; - char_dat[i].base_exp = 0; - char_dat[i].job_exp = 0; - char_dat[i].zeny = start_zeny; - char_dat[i].str = dat[24]; - char_dat[i].agi = dat[25]; - char_dat[i].vit = dat[26]; - char_dat[i].int_ = dat[27]; - char_dat[i].dex = dat[28]; - char_dat[i].luk = dat[29]; - char_dat[i].max_hp = 40 * (100 + char_dat[i].vit) / 100; - char_dat[i].max_sp = 11 * (100 + char_dat[i].int_) / 100; - char_dat[i].hp = char_dat[i].max_hp; - char_dat[i].sp = char_dat[i].max_sp; - char_dat[i].status_point = 0; - char_dat[i].skill_point = 0; - char_dat[i].option = 0; - char_dat[i].karma = 0; - char_dat[i].manner = 0; - char_dat[i].party_id = 0; - char_dat[i].guild_id = 0; - char_dat[i].hair = dat[33]; - char_dat[i].hair_color = dat[31]; - char_dat[i].clothes_color = 0; - char_dat[i].inventory[0].nameid = start_weapon; // Knife - char_dat[i].inventory[0].amount = 1; - char_dat[i].inventory[0].equip = 0x02; - char_dat[i].inventory[0].identify = 1; - char_dat[i].inventory[0].broken = 0; - char_dat[i].inventory[1].nameid = start_armor; // Cotton Shirt - char_dat[i].inventory[1].amount = 1; - char_dat[i].inventory[1].equip = 0x10; - char_dat[i].inventory[1].identify = 1; - char_dat[i].inventory[1].broken = 0; - char_dat[i].weapon = 1; - char_dat[i].shield = 0; - char_dat[i].head_top = 0; - char_dat[i].head_mid = 0; - char_dat[i].head_bottom = 0; - memcpy(&char_dat[i].last_point, &start_point, sizeof(start_point)); - memcpy(&char_dat[i].save_point, &start_point, sizeof(start_point)); - char_num++; - - return i; +int make_new_char (int fd, unsigned char *dat) +{ + int i, j; + struct char_session_data *sd; + + sd = session[fd]->session_data; + + // remove control characters from the name + dat[23] = '\0'; + if (remove_control_chars (dat)) + { + char_log + ("Make new char error (control char received in the name): (connection #%d, account: %d)." + RETCODE, fd, sd->account_id); + return -1; + } + + // Eliminate whitespace + remove_trailing_blanks ((char *) dat); + remove_prefix_blanks ((char *) dat); + + // check lenght of character name + if (strlen (dat) < 4) + { + char_log + ("Make new char error (character name too small): (connection #%d, account: %d, name: '%s')." + RETCODE, fd, sd->account_id, dat); + return -1; + } + + // Check Authorised letters/symbols in the name of the character + if (char_name_option == 1) + { // only letters/symbols in char_name_letters are authorised + for (i = 0; dat[i]; i++) + if (strchr (char_name_letters, dat[i]) == NULL) + { + char_log + ("Make new char error (invalid letter in the name): (connection #%d, account: %d), name: %s, invalid letter: %c." + RETCODE, fd, sd->account_id, dat, dat[i]); + return -1; + } + } + else if (char_name_option == 2) + { // letters/symbols in char_name_letters are forbidden + for (i = 0; dat[i]; i++) + if (strchr (char_name_letters, dat[i]) != NULL) + { + char_log + ("Make new char error (invalid letter in the name): (connection #%d, account: %d), name: %s, invalid letter: %c." + RETCODE, fd, sd->account_id, dat, dat[i]); + return -1; + } + } // else, all letters/symbols are authorised (except control char removed before) + + if (dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29] != 5 * 6 || // stats + dat[30] >= 9 || // slots (dat[30] can not be negativ) + dat[33] < 0 || dat[33] >= 20 || // hair style + dat[31] >= 12) + { // hair color (dat[31] can not be negativ) + char_log + ("Make new char error (invalid values): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d" + RETCODE, fd, sd->account_id, dat[30], dat, dat[24], dat[25], + dat[26], dat[27], dat[28], dat[29], + dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], + dat[33], dat[31]); + return -1; + } + + // check individual stat value + for (i = 24; i <= 29; i++) + { + if (dat[i] < 1 || dat[i] > 9) + { + char_log + ("Make new char error (invalid stat value: not between 1 to 9): (connection #%d, account: %d) slot %d, name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d" + RETCODE, fd, sd->account_id, dat[30], dat, dat[24], dat[25], + dat[26], dat[27], dat[28], dat[29], + dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], + dat[33], dat[31]); + return -1; + } + } + + for (i = 0; i < char_num; i++) + { + if ((name_ignoring_case != 0 && strcmp (char_dat[i].name, dat) == 0) + || (name_ignoring_case == 0 + && strcmpi (char_dat[i].name, dat) == 0)) + { + char_log + ("Make new char error (name already exists): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %s), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." + RETCODE, fd, sd->account_id, dat[30], dat, char_dat[i].name, + dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], + dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], + dat[33], dat[31]); + return -1; + } + if (char_dat[i].account_id == sd->account_id + && char_dat[i].char_num == dat[30]) + { + char_log + ("Make new char error (slot already used): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %s), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." + RETCODE, fd, sd->account_id, dat[30], dat, char_dat[i].name, + dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], + dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], + dat[33], dat[31]); + return -1; + } + } + + if (strcmp (wisp_server_name, dat) == 0) + { + char_log + ("Make new char error (name used is wisp name for server): (connection #%d, account: %d) slot %d, name: %s (actual name of other char: %d), stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." + RETCODE, fd, sd->account_id, dat[30], dat, char_dat[i].name, + dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], + dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], + dat[33], dat[31]); + return -1; + } + + if (char_num >= char_max) + { + char_max += 256; + char_dat = + realloc (char_dat, sizeof (struct mmo_charstatus) * char_max); + if (!char_dat) + { + printf ("Out of memory: make_new_char (realloc of char_dat).\n"); + char_log ("Out of memory: make_new_char (realloc of char_dat)." + RETCODE); + exit (1); + } + online_chars = realloc (online_chars, sizeof (int) * char_max); + if (!online_chars) + { + printf + ("Out of memory: make_new_char (realloc of online_chars).\n"); + char_log + ("Out of memory: make_new_char (realloc of online_chars)." + RETCODE); + exit (1); + } + for (j = char_max - 256; j < char_max; j++) + online_chars[j] = -1; + } + + char_log + ("Creation of New Character: (connection #%d, account: %d) slot %d, character Name: %s, stats: %d+%d+%d+%d+%d+%d=%d, hair: %d, hair color: %d." + RETCODE, fd, sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], + dat[27], dat[28], dat[29], + dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29], dat[33], + dat[31]); + + memset (&char_dat[i], 0, sizeof (struct mmo_charstatus)); + + char_dat[i].char_id = char_id_count++; + char_dat[i].account_id = sd->account_id; + char_dat[i].char_num = dat[30]; + strcpy (char_dat[i].name, dat); + char_dat[i].class = 0; + char_dat[i].base_level = 1; + char_dat[i].job_level = 1; + char_dat[i].base_exp = 0; + char_dat[i].job_exp = 0; + char_dat[i].zeny = start_zeny; + char_dat[i].str = dat[24]; + char_dat[i].agi = dat[25]; + char_dat[i].vit = dat[26]; + char_dat[i].int_ = dat[27]; + char_dat[i].dex = dat[28]; + char_dat[i].luk = dat[29]; + char_dat[i].max_hp = 40 * (100 + char_dat[i].vit) / 100; + char_dat[i].max_sp = 11 * (100 + char_dat[i].int_) / 100; + char_dat[i].hp = char_dat[i].max_hp; + char_dat[i].sp = char_dat[i].max_sp; + char_dat[i].status_point = 0; + char_dat[i].skill_point = 0; + char_dat[i].option = 0; + char_dat[i].karma = 0; + char_dat[i].manner = 0; + char_dat[i].party_id = 0; + char_dat[i].guild_id = 0; + char_dat[i].hair = dat[33]; + char_dat[i].hair_color = dat[31]; + char_dat[i].clothes_color = 0; + char_dat[i].inventory[0].nameid = start_weapon; // Knife + char_dat[i].inventory[0].amount = 1; + char_dat[i].inventory[0].equip = 0x02; + char_dat[i].inventory[0].identify = 1; + char_dat[i].inventory[0].broken = 0; + char_dat[i].inventory[1].nameid = start_armor; // Cotton Shirt + char_dat[i].inventory[1].amount = 1; + char_dat[i].inventory[1].equip = 0x10; + char_dat[i].inventory[1].identify = 1; + char_dat[i].inventory[1].broken = 0; + char_dat[i].weapon = 1; + char_dat[i].shield = 0; + char_dat[i].head_top = 0; + char_dat[i].head_mid = 0; + char_dat[i].head_bottom = 0; + memcpy (&char_dat[i].last_point, &start_point, sizeof (start_point)); + memcpy (&char_dat[i].save_point, &start_point, sizeof (start_point)); + char_num++; + + return i; } //---------------------------------------------------- // This function return the name of the job (by [Yor]) //---------------------------------------------------- -char * job_name(int class) { - switch (class) { - case 0: return "Novice"; - case 1: return "Swordsman"; - case 2: return "Mage"; - case 3: return "Archer"; - case 4: return "Acolyte"; - case 5: return "Merchant"; - case 6: return "Thief"; - case 7: return "Knight"; - case 8: return "Priest"; - case 9: return "Wizard"; - case 10: return "Blacksmith"; - case 11: return "Hunter"; - case 12: return "Assassin"; - case 13: return "Knight 2"; - case 14: return "Crusader"; - case 15: return "Monk"; - case 16: return "Sage"; - case 17: return "Rogue"; - case 18: return "Alchemist"; - case 19: return "Bard"; - case 20: return "Dancer"; - case 21: return "Crusader 2"; - case 22: return "Wedding"; - case 23: return "Super Novice"; - case 4001: return "Novice High"; - case 4002: return "Swordsman High"; - case 4003: return "Mage High"; - case 4004: return "Archer High"; - case 4005: return "Acolyte High"; - case 4006: return "Merchant High"; - case 4007: return "Thief High"; - case 4008: return "Lord Knight"; - case 4009: return "High Priest"; - case 4010: return "High Wizard"; - case 4011: return "Whitesmith"; - case 4012: return "Sniper"; - case 4013: return "Assassin Cross"; - case 4014: return "Peko Knight"; - case 4015: return "Paladin"; - case 4016: return "Champion"; - case 4017: return "Professor"; - case 4018: return "Stalker"; - case 4019: return "Creator"; - case 4020: return "Clown"; - case 4021: return "Gypsy"; - case 4022: return "Peko Paladin"; - case 4023: return "Baby Novice"; - case 4024: return "Baby Swordsman"; - case 4025: return "Baby Mage"; - case 4026: return "Baby Archer"; - case 4027: return "Baby Acolyte"; - case 4028: return "Baby Merchant"; - case 4029: return "Baby Thief"; - case 4030: return "Baby Knight"; - case 4031: return "Baby Priest"; - case 4032: return "Baby Wizard"; - case 4033: return "Baby Blacksmith"; - case 4034: return "Baby Hunter"; - case 4035: return "Baby Assassin"; - case 4036: return "Baby Peco Knight"; - case 4037: return "Baby Crusader"; - case 4038: return "Baby Monk"; - case 4039: return "Baby Sage"; - case 4040: return "Baby Rogue"; - case 4041: return "Baby Alchemist"; - case 4042: return "Baby Bard"; - case 4043: return "Baby Dancer"; - case 4044: return "Baby Peco Crusader"; - case 4045: return "Super Baby"; - } - return "Unknown Job"; +char *job_name (int class) +{ + switch (class) + { + case 0: + return "Novice"; + case 1: + return "Swordsman"; + case 2: + return "Mage"; + case 3: + return "Archer"; + case 4: + return "Acolyte"; + case 5: + return "Merchant"; + case 6: + return "Thief"; + case 7: + return "Knight"; + case 8: + return "Priest"; + case 9: + return "Wizard"; + case 10: + return "Blacksmith"; + case 11: + return "Hunter"; + case 12: + return "Assassin"; + case 13: + return "Knight 2"; + case 14: + return "Crusader"; + case 15: + return "Monk"; + case 16: + return "Sage"; + case 17: + return "Rogue"; + case 18: + return "Alchemist"; + case 19: + return "Bard"; + case 20: + return "Dancer"; + case 21: + return "Crusader 2"; + case 22: + return "Wedding"; + case 23: + return "Super Novice"; + case 4001: + return "Novice High"; + case 4002: + return "Swordsman High"; + case 4003: + return "Mage High"; + case 4004: + return "Archer High"; + case 4005: + return "Acolyte High"; + case 4006: + return "Merchant High"; + case 4007: + return "Thief High"; + case 4008: + return "Lord Knight"; + case 4009: + return "High Priest"; + case 4010: + return "High Wizard"; + case 4011: + return "Whitesmith"; + case 4012: + return "Sniper"; + case 4013: + return "Assassin Cross"; + case 4014: + return "Peko Knight"; + case 4015: + return "Paladin"; + case 4016: + return "Champion"; + case 4017: + return "Professor"; + case 4018: + return "Stalker"; + case 4019: + return "Creator"; + case 4020: + return "Clown"; + case 4021: + return "Gypsy"; + case 4022: + return "Peko Paladin"; + case 4023: + return "Baby Novice"; + case 4024: + return "Baby Swordsman"; + case 4025: + return "Baby Mage"; + case 4026: + return "Baby Archer"; + case 4027: + return "Baby Acolyte"; + case 4028: + return "Baby Merchant"; + case 4029: + return "Baby Thief"; + case 4030: + return "Baby Knight"; + case 4031: + return "Baby Priest"; + case 4032: + return "Baby Wizard"; + case 4033: + return "Baby Blacksmith"; + case 4034: + return "Baby Hunter"; + case 4035: + return "Baby Assassin"; + case 4036: + return "Baby Peco Knight"; + case 4037: + return "Baby Crusader"; + case 4038: + return "Baby Monk"; + case 4039: + return "Baby Sage"; + case 4040: + return "Baby Rogue"; + case 4041: + return "Baby Alchemist"; + case 4042: + return "Baby Bard"; + case 4043: + return "Baby Dancer"; + case 4044: + return "Baby Peco Crusader"; + case 4045: + return "Super Baby"; + } + return "Unknown Job"; } //------------------------------------------------------------- // Function to create the online files (txt and html). by [Yor] //------------------------------------------------------------- -void create_online_files(void) { - int i, j, k, l; // for loops - int players; // count the number of players - FILE *fp; // for the txt file - FILE *fp2; // for the html file - char temp[256]; // to prepare what we must display - time_t time_server; // for number of seconds - struct tm *datetime; // variable for time in structure ->tm_mday, ->tm_sec, ... - int id[char_num]; - - if (online_display_option == 0) // we display nothing, so return - return; - - //char_log("Creation of online players files." RETCODE); - - // Get number of online players, id of each online players - players = 0; - // sort online characters. - for(i = 0; i < char_num; i++) { - if (online_chars[i] != -1) { - id[players] = i; - // use sorting option - switch (online_sorting_option) { - case 1: // by name (without case sensitive) - { - char *p_name = char_dat[i].name; //speed up sorting when there are a lot of players. But very rarely players have same name. - for(j = 0; j < players; j++) - if (stricmp(p_name, char_dat[id[j]].name) < 0 || - // if same name, we sort with case sensitive. - (stricmp(p_name, char_dat[id[j]].name) == 0 && - strcmp(p_name, char_dat[id[j]].name) < 0)) { - for(k = players; k > j; k--) - id[k] = id[k-1]; - id[j] = i; // id[players] - break; - } - } - break; - case 2: // by zeny - for(j = 0; j < players; j++) - if (char_dat[i].zeny < char_dat[id[j]].zeny || - // if same number of zenys, we sort by name. - (char_dat[i].zeny == char_dat[id[j]].zeny && - stricmp(char_dat[i].name, char_dat[id[j]].name) < 0)) { - for(k = players; k > j; k--) - id[k] = id[k-1]; - id[j] = i; // id[players] - break; - } - break; - case 3: // by base level - for(j = 0; j < players; j++) - if (char_dat[i].base_level < char_dat[id[j]].base_level || - // if same base level, we sort by base exp. - (char_dat[i].base_level == char_dat[id[j]].base_level && - char_dat[i].base_exp < char_dat[id[j]].base_exp)) { - for(k = players; k > j; k--) - id[k] = id[k-1]; - id[j] = i; // id[players] - break; - } - break; - case 4: // by job (and job level) - for(j = 0; j < players; j++) - if (char_dat[i].class < char_dat[id[j]].class || - // if same job, we sort by job level. - (char_dat[i].class == char_dat[id[j]].class && - char_dat[i].job_level < char_dat[id[j]].job_level) || - // if same job and job level, we sort by job exp. - (char_dat[i].class == char_dat[id[j]].class && - char_dat[i].job_level == char_dat[id[j]].job_level && - char_dat[i].job_exp < char_dat[id[j]].job_exp)) { - for(k = players; k > j; k--) - id[k] = id[k-1]; - id[j] = i; // id[players] - break; - } - break; - case 5: // by location map name - { - int cpm_result; // A lot of player maps are identical. So, test if done often twice. - for(j = 0; j < players; j++) - if ((cpm_result = strcmp(char_dat[i].last_point.map, char_dat[id[j]].last_point.map)) < 0 || // no map are identical and with upper cases (not use stricmp) - // if same map name, we sort by name. - (cpm_result == 0 && - stricmp(char_dat[i].name, char_dat[id[j]].name) < 0)) { - for(k = players; k > j; k--) - id[k] = id[k-1]; - id[j] = i; // id[players] - break; - } - } - break; - default: // 0 or invalid value: no sorting - break; - } - players++; - } - } - - // write files - fp = fopen_(online_txt_filename, "w"); - if (fp != NULL) { - fp2 = fopen_(online_html_filename, "w"); - if (fp2 != NULL) { - // get time - time(&time_server); // get time in seconds since 1/1/1970 - datetime = localtime(&time_server); // convert seconds in structure - strftime(temp, sizeof(temp), "%d %b %Y %X", datetime); // like sprintf, but only for date/time (05 dec 2003 15:12:52) - // write heading - fprintf(fp2, "<HTML>\n"); - fprintf(fp2, " <META http-equiv=\"Refresh\" content=\"%d\">\n", online_refresh_html); // update on client explorer every x seconds - fprintf(fp2, " <HEAD>\n"); - fprintf(fp2, " <TITLE>Online Players on %s</TITLE>\n", server_name); - fprintf(fp2, " </HEAD>\n"); - fprintf(fp2, " <BODY>\n"); - fprintf(fp2, " <H3>Online Players on %s (%s):</H3>\n", server_name, temp); - fprintf(fp, "Online Players on %s (%s):\n", server_name, temp); - fprintf(fp, "\n"); - - // If we display at least 1 player - if (players > 0) { - j = 0; // count the number of characters for the txt version and to set the separate line - fprintf(fp2, " <table border=\"1\" cellspacing=\"1\">\n"); - fprintf(fp2, " <tr>\n"); - if ((online_display_option & 1) || (online_display_option & 64)) { - fprintf(fp2, " <td><b>Name</b></td>\n"); - if (online_display_option & 64) { - fprintf(fp, "Name "); // 30 - j += 30; - } else { - fprintf(fp, "Name "); // 25 - j += 25; - } - } - if ((online_display_option & 6) == 6) { - fprintf(fp2, " <td><b>Job (levels)</b></td>\n"); - fprintf(fp, "Job Levels "); // 27 - j += 27; - } else if (online_display_option & 2) { - fprintf(fp2, " <td><b>Job</b></td>\n"); - fprintf(fp, "Job "); // 19 - j += 19; - } else if (online_display_option & 4) { - fprintf(fp2, " <td><b>Levels</b></td>\n"); - fprintf(fp, " Levels "); // 8 - j += 8; - } - if (online_display_option & 24) { // 8 or 16 - fprintf(fp2, " <td><b>Location</b></td>\n"); - if (online_display_option & 16) { - fprintf(fp, "Location ( x , y ) "); // 23 - j += 23; - } else { - fprintf(fp, "Location "); // 13 - j += 13; - } - } - if (online_display_option & 32) { - fprintf(fp2, " <td ALIGN=CENTER><b>zenys</b></td>\n"); - fprintf(fp, " Zenys "); // 16 - j += 16; - } - fprintf(fp2, " </tr>\n"); - fprintf(fp, "\n"); - for (k = 0; k < j; k++) - fprintf(fp, "-"); - fprintf(fp, "\n"); - - // display each player. - for (i = 0; i < players; i++) { - // get id of the character (more speed) - j = id[i]; - fprintf(fp2, " <tr>\n"); - // displaying the character name - if ((online_display_option & 1) || (online_display_option & 64)) { // without/with 'GM' display - strcpy(temp, char_dat[j].name); - l = isGM(char_dat[j].account_id); - if (online_display_option & 64) { - if (l >= online_gm_display_min_level) - fprintf(fp, "%-24s (GM) ", temp); - else - fprintf(fp, "%-24s ", temp); - } else - fprintf(fp, "%-24s ", temp); - // name of the character in the html (no < >, because that create problem in html code) - fprintf(fp2, " <td>"); - if ((online_display_option & 64) && l >= online_gm_display_min_level) - fprintf(fp2, "<b>"); - for (k = 0; temp[k]; k++) { - switch(temp[k]) { - case '<': // < - fprintf(fp2, "<"); - break; - case '>': // > - fprintf(fp2, ">"); - break; - default: - fprintf(fp2, "%c", temp[k]); - break; - }; - } - if ((online_display_option & 64) && l >= online_gm_display_min_level) - fprintf(fp2, "</b> (GM)"); - fprintf(fp2, "</td>\n"); - } - // displaying of the job - if (online_display_option & 6) { - char * jobname = job_name(char_dat[j].class); - if ((online_display_option & 6) == 6) { - fprintf(fp2, " <td>%s %d/%d</td>\n", jobname, char_dat[j].base_level, char_dat[j].job_level); - fprintf(fp, "%-18s %3d/%3d ", jobname, char_dat[j].base_level, char_dat[j].job_level); - } else if (online_display_option & 2) { - fprintf(fp2, " <td>%s</td>\n", jobname); - fprintf(fp, "%-18s ", jobname); - } else if (online_display_option & 4) { - fprintf(fp2, " <td>%d/%d</td>\n", char_dat[j].base_level, char_dat[j].job_level); - fprintf(fp, "%3d/%3d ", char_dat[j].base_level, char_dat[j].job_level); - } - } - // displaying of the map - if (online_display_option & 24) { // 8 or 16 - // prepare map name - memset(temp, 0, sizeof(temp)); - strncpy(temp, char_dat[j].last_point.map, 16); - if (strchr(temp, '.') != NULL) - temp[strchr(temp, '.') - temp] = '\0'; // suppress the '.gat' - // write map name - if (online_display_option & 16) { // map-name AND coordonates - fprintf(fp2, " <td>%s (%d, %d)</td>\n", temp, char_dat[j].last_point.x, char_dat[j].last_point.y); - fprintf(fp, "%-12s (%3d,%3d) ", temp, char_dat[j].last_point.x, char_dat[j].last_point.y); - } else { - fprintf(fp2, " <td>%s</td>\n", temp); - fprintf(fp, "%-12s ", temp); - } - } - // displaying number of zenys - if (online_display_option & 32) { - // write number of zenys - if (char_dat[j].zeny == 0) { // if no zeny - fprintf(fp2, " <td ALIGN=RIGHT>no zeny</td>\n"); - fprintf(fp, " no zeny "); - } else { - fprintf(fp2, " <td ALIGN=RIGHT>%d z</td>\n", char_dat[j].zeny); - fprintf(fp, "%13d z ", char_dat[j].zeny); - } - } - fprintf(fp, "\n"); - fprintf(fp2, " </tr>\n"); - } - fprintf(fp2, " </table>\n"); - fprintf(fp, "\n"); - } - - // Displaying number of online players - if (players == 0) { - fprintf(fp2, " <p>No user is online.</p>\n"); - fprintf(fp, "No user is online.\n"); - // no display if only 1 player - } else if (players == 1) { - } else { - fprintf(fp2, " <p>%d users are online.</p>\n", players); - fprintf(fp, "%d users are online.\n", players); - } - fprintf(fp2, " </BODY>\n"); - fprintf(fp2, "</HTML>\n"); - fclose_(fp2); - } - fclose_(fp); - } - - return; +void create_online_files (void) +{ + int i, j, k, l; // for loops + int players; // count the number of players + FILE *fp; // for the txt file + FILE *fp2; // for the html file + char temp[256]; // to prepare what we must display + time_t time_server; // for number of seconds + struct tm *datetime; // variable for time in structure ->tm_mday, ->tm_sec, ... + int id[char_num]; + + if (online_display_option == 0) // we display nothing, so return + return; + + //char_log("Creation of online players files." RETCODE); + + // Get number of online players, id of each online players + players = 0; + // sort online characters. + for (i = 0; i < char_num; i++) + { + if (online_chars[i] != -1) + { + id[players] = i; + // use sorting option + switch (online_sorting_option) + { + case 1: // by name (without case sensitive) + { + char *p_name = char_dat[i].name; //speed up sorting when there are a lot of players. But very rarely players have same name. + for (j = 0; j < players; j++) + if (stricmp (p_name, char_dat[id[j]].name) < 0 || + // if same name, we sort with case sensitive. + (stricmp (p_name, char_dat[id[j]].name) == 0 && + strcmp (p_name, char_dat[id[j]].name) < 0)) + { + for (k = players; k > j; k--) + id[k] = id[k - 1]; + id[j] = i; // id[players] + break; + } + } + break; + case 2: // by zeny + for (j = 0; j < players; j++) + if (char_dat[i].zeny < char_dat[id[j]].zeny || + // if same number of zenys, we sort by name. + (char_dat[i].zeny == char_dat[id[j]].zeny && + stricmp (char_dat[i].name, + char_dat[id[j]].name) < 0)) + { + for (k = players; k > j; k--) + id[k] = id[k - 1]; + id[j] = i; // id[players] + break; + } + break; + case 3: // by base level + for (j = 0; j < players; j++) + if (char_dat[i].base_level < + char_dat[id[j]].base_level || + // if same base level, we sort by base exp. + (char_dat[i].base_level == + char_dat[id[j]].base_level + && char_dat[i].base_exp < + char_dat[id[j]].base_exp)) + { + for (k = players; k > j; k--) + id[k] = id[k - 1]; + id[j] = i; // id[players] + break; + } + break; + case 4: // by job (and job level) + for (j = 0; j < players; j++) + if (char_dat[i].class < char_dat[id[j]].class || + // if same job, we sort by job level. + (char_dat[i].class == char_dat[id[j]].class && + char_dat[i].job_level < + char_dat[id[j]].job_level) || + // if same job and job level, we sort by job exp. + (char_dat[i].class == char_dat[id[j]].class && + char_dat[i].job_level == + char_dat[id[j]].job_level + && char_dat[i].job_exp < + char_dat[id[j]].job_exp)) + { + for (k = players; k > j; k--) + id[k] = id[k - 1]; + id[j] = i; // id[players] + break; + } + break; + case 5: // by location map name + { + int cpm_result; // A lot of player maps are identical. So, test if done often twice. + for (j = 0; j < players; j++) + if ((cpm_result = strcmp (char_dat[i].last_point.map, char_dat[id[j]].last_point.map)) < 0 || // no map are identical and with upper cases (not use stricmp) + // if same map name, we sort by name. + (cpm_result == 0 && + stricmp (char_dat[i].name, + char_dat[id[j]].name) < 0)) + { + for (k = players; k > j; k--) + id[k] = id[k - 1]; + id[j] = i; // id[players] + break; + } + } + break; + default: // 0 or invalid value: no sorting + break; + } + players++; + } + } + + // write files + fp = fopen_ (online_txt_filename, "w"); + if (fp != NULL) + { + fp2 = fopen_ (online_html_filename, "w"); + if (fp2 != NULL) + { + // get time + time (&time_server); // get time in seconds since 1/1/1970 + datetime = localtime (&time_server); // convert seconds in structure + strftime (temp, sizeof (temp), "%d %b %Y %X", datetime); // like sprintf, but only for date/time (05 dec 2003 15:12:52) + // write heading + fprintf (fp2, "<HTML>\n"); + fprintf (fp2, " <META http-equiv=\"Refresh\" content=\"%d\">\n", online_refresh_html); // update on client explorer every x seconds + fprintf (fp2, " <HEAD>\n"); + fprintf (fp2, " <TITLE>Online Players on %s</TITLE>\n", + server_name); + fprintf (fp2, " </HEAD>\n"); + fprintf (fp2, " <BODY>\n"); + fprintf (fp2, " <H3>Online Players on %s (%s):</H3>\n", + server_name, temp); + fprintf (fp, "Online Players on %s (%s):\n", server_name, temp); + fprintf (fp, "\n"); + + // If we display at least 1 player + if (players > 0) + { + j = 0; // count the number of characters for the txt version and to set the separate line + fprintf (fp2, " <table border=\"1\" cellspacing=\"1\">\n"); + fprintf (fp2, " <tr>\n"); + if ((online_display_option & 1) + || (online_display_option & 64)) + { + fprintf (fp2, " <td><b>Name</b></td>\n"); + if (online_display_option & 64) + { + fprintf (fp, "Name "); // 30 + j += 30; + } + else + { + fprintf (fp, "Name "); // 25 + j += 25; + } + } + if ((online_display_option & 6) == 6) + { + fprintf (fp2, " <td><b>Job (levels)</b></td>\n"); + fprintf (fp, "Job Levels "); // 27 + j += 27; + } + else if (online_display_option & 2) + { + fprintf (fp2, " <td><b>Job</b></td>\n"); + fprintf (fp, "Job "); // 19 + j += 19; + } + else if (online_display_option & 4) + { + fprintf (fp2, " <td><b>Levels</b></td>\n"); + fprintf (fp, " Levels "); // 8 + j += 8; + } + if (online_display_option & 24) + { // 8 or 16 + fprintf (fp2, " <td><b>Location</b></td>\n"); + if (online_display_option & 16) + { + fprintf (fp, "Location ( x , y ) "); // 23 + j += 23; + } + else + { + fprintf (fp, "Location "); // 13 + j += 13; + } + } + if (online_display_option & 32) + { + fprintf (fp2, + " <td ALIGN=CENTER><b>zenys</b></td>\n"); + fprintf (fp, " Zenys "); // 16 + j += 16; + } + fprintf (fp2, " </tr>\n"); + fprintf (fp, "\n"); + for (k = 0; k < j; k++) + fprintf (fp, "-"); + fprintf (fp, "\n"); + + // display each player. + for (i = 0; i < players; i++) + { + // get id of the character (more speed) + j = id[i]; + fprintf (fp2, " <tr>\n"); + // displaying the character name + if ((online_display_option & 1) + || (online_display_option & 64)) + { // without/with 'GM' display + strcpy (temp, char_dat[j].name); + l = isGM (char_dat[j].account_id); + if (online_display_option & 64) + { + if (l >= online_gm_display_min_level) + fprintf (fp, "%-24s (GM) ", temp); + else + fprintf (fp, "%-24s ", temp); + } + else + fprintf (fp, "%-24s ", temp); + // name of the character in the html (no < >, because that create problem in html code) + fprintf (fp2, " <td>"); + if ((online_display_option & 64) + && l >= online_gm_display_min_level) + fprintf (fp2, "<b>"); + for (k = 0; temp[k]; k++) + { + switch (temp[k]) + { + case '<': // < + fprintf (fp2, "<"); + break; + case '>': // > + fprintf (fp2, ">"); + break; + default: + fprintf (fp2, "%c", temp[k]); + break; + }; + } + if ((online_display_option & 64) + && l >= online_gm_display_min_level) + fprintf (fp2, "</b> (GM)"); + fprintf (fp2, "</td>\n"); + } + // displaying of the job + if (online_display_option & 6) + { + char *jobname = job_name (char_dat[j].class); + if ((online_display_option & 6) == 6) + { + fprintf (fp2, " <td>%s %d/%d</td>\n", + jobname, char_dat[j].base_level, + char_dat[j].job_level); + fprintf (fp, "%-18s %3d/%3d ", jobname, + char_dat[j].base_level, + char_dat[j].job_level); + } + else if (online_display_option & 2) + { + fprintf (fp2, " <td>%s</td>\n", jobname); + fprintf (fp, "%-18s ", jobname); + } + else if (online_display_option & 4) + { + fprintf (fp2, " <td>%d/%d</td>\n", + char_dat[j].base_level, + char_dat[j].job_level); + fprintf (fp, "%3d/%3d ", char_dat[j].base_level, + char_dat[j].job_level); + } + } + // displaying of the map + if (online_display_option & 24) + { // 8 or 16 + // prepare map name + memset (temp, 0, sizeof (temp)); + strncpy (temp, char_dat[j].last_point.map, 16); + if (strchr (temp, '.') != NULL) + temp[strchr (temp, '.') - temp] = '\0'; // suppress the '.gat' + // write map name + if (online_display_option & 16) + { // map-name AND coordonates + fprintf (fp2, " <td>%s (%d, %d)</td>\n", + temp, char_dat[j].last_point.x, + char_dat[j].last_point.y); + fprintf (fp, "%-12s (%3d,%3d) ", temp, + char_dat[j].last_point.x, + char_dat[j].last_point.y); + } + else + { + fprintf (fp2, " <td>%s</td>\n", temp); + fprintf (fp, "%-12s ", temp); + } + } + // displaying number of zenys + if (online_display_option & 32) + { + // write number of zenys + if (char_dat[j].zeny == 0) + { // if no zeny + fprintf (fp2, + " <td ALIGN=RIGHT>no zeny</td>\n"); + fprintf (fp, " no zeny "); + } + else + { + fprintf (fp2, + " <td ALIGN=RIGHT>%d z</td>\n", + char_dat[j].zeny); + fprintf (fp, "%13d z ", char_dat[j].zeny); + } + } + fprintf (fp, "\n"); + fprintf (fp2, " </tr>\n"); + } + fprintf (fp2, " </table>\n"); + fprintf (fp, "\n"); + } + + // Displaying number of online players + if (players == 0) + { + fprintf (fp2, " <p>No user is online.</p>\n"); + fprintf (fp, "No user is online.\n"); + // no display if only 1 player + } + else if (players == 1) + { + } + else + { + fprintf (fp2, " <p>%d users are online.</p>\n", players); + fprintf (fp, "%d users are online.\n", players); + } + fprintf (fp2, " </BODY>\n"); + fprintf (fp2, "</HTML>\n"); + fclose_ (fp2); + } + fclose_ (fp); + } + + return; } //--------------------------------------------------------------------- // This function return the number of online players in all map-servers //--------------------------------------------------------------------- -int count_users(void) { - int i, users; +int count_users (void) +{ + int i, users; - users = 0; - for(i = 0; i < MAX_MAP_SERVERS; i++) - if (server_fd[i] >= 0) - users += server[i].users; + users = 0; + for (i = 0; i < MAX_MAP_SERVERS; i++) + if (server_fd[i] >= 0) + users += server[i].users; - return users; + return users; } + //---------------------------------------- // [Fate] Find inventory item based on equipment mask, return view. ID must match view ID (!). //---------------------------------------- -static int -find_equip_view(struct mmo_charstatus *p, unsigned int equipmask) +static int find_equip_view (struct mmo_charstatus *p, unsigned int equipmask) { - int i; - for (i = 0; i < MAX_INVENTORY; i++) - if (p->inventory[i].nameid && p->inventory[i].amount - && p->inventory[i].equip & equipmask) - return p->inventory[i].nameid; - return 0; + int i; + for (i = 0; i < MAX_INVENTORY; i++) + if (p->inventory[i].nameid && p->inventory[i].amount + && p->inventory[i].equip & equipmask) + return p->inventory[i].nameid; + return 0; } //---------------------------------------- // Function to send characters to a player //---------------------------------------- -int mmo_char_send006b(int fd, struct char_session_data *sd) { - int i, j, found_num; - struct mmo_charstatus *p; - const int offset = 24; - - found_num = 0; - for(i = 0; i < char_num; i++) { - if (char_dat[i].account_id == sd->account_id) { - sd->found_char[found_num] = i; - found_num++; - if (found_num == 9) - break; - } - } - for(i = found_num; i < 9; i++) - sd->found_char[i] = -1; - - memset(WFIFOP(fd,0), 0, offset + found_num * 106); - WFIFOW(fd,0) = 0x6b; - WFIFOW(fd,2) = offset + found_num * 106; - - for(i = 0; i < found_num; i++) { - p = &char_dat[sd->found_char[i]]; - j = offset + (i * 106); // increase speed of code - - WFIFOL(fd,j) = p->char_id; - WFIFOL(fd,j+4) = p->base_exp; - WFIFOL(fd,j+8) = p->zeny; - WFIFOL(fd,j+12) = p->job_exp; - WFIFOL(fd,j+16) = 0; //p->job_level; // [Fate] We no longer reveal this to the player, as its meaning is weird. - - WFIFOW(fd,j+20) = find_equip_view(p, 0x0040); // 9: shoes - WFIFOW(fd,j+22) = find_equip_view(p, 0x0004); // 10: gloves - WFIFOW(fd,j+24) = find_equip_view(p, 0x0008); // 11: cape - WFIFOW(fd,j+26) = find_equip_view(p, 0x0010); // 12: misc1 - WFIFOL(fd,j+28) = p->option; - - WFIFOL(fd,j+32) = p->karma; - WFIFOL(fd,j+36) = p->manner; - - WFIFOW(fd,j+40) = p->status_point; - WFIFOW(fd,j+42) = (p->hp > 0x7fff) ? 0x7fff : p->hp; - WFIFOW(fd,j+44) = (p->max_hp > 0x7fff) ? 0x7fff : p->max_hp; - WFIFOW(fd,j+46) = (p->sp > 0x7fff) ? 0x7fff : p->sp; - WFIFOW(fd,j+48) = (p->max_sp > 0x7fff) ? 0x7fff : p->max_sp; - WFIFOW(fd,j+50) = DEFAULT_WALK_SPEED; // p->speed; - WFIFOW(fd,j+52) = p->class; - WFIFOW(fd,j+54) = p->hair; -// WFIFOW(fd,j+56) = p->weapon; // dont send weapon since TMW does not support it - WFIFOW(fd,j+56) = 0; - WFIFOW(fd,j+58) = p->base_level; - WFIFOW(fd,j+60) = p->skill_point; - WFIFOW(fd,j+62) = p->head_bottom; - WFIFOW(fd,j+64) = p->shield; - WFIFOW(fd,j+66) = p->head_top; - WFIFOW(fd,j+68) = p->head_mid; - WFIFOW(fd,j+70) = p->hair_color; - WFIFOW(fd,j+72) = find_equip_view(p, 0x0080); // 13: misc2 -// WFIFOW(fd,j+72) = p->clothes_color; - - memcpy(WFIFOP(fd,j+74), p->name, 24); - - WFIFOB(fd,j+98) = (p->str > 255) ? 255 : p->str; - WFIFOB(fd,j+99) = (p->agi > 255) ? 255 : p->agi; - WFIFOB(fd,j+100) = (p->vit > 255) ? 255 : p->vit; - WFIFOB(fd,j+101) = (p->int_ > 255) ? 255 : p->int_; - WFIFOB(fd,j+102) = (p->dex > 255) ? 255 : p->dex; - WFIFOB(fd,j+103) = (p->luk > 255) ? 255 : p->luk; - WFIFOB(fd,j+104) = p->char_num; - } - - WFIFOSET(fd,WFIFOW(fd,2)); - - return 0; +int mmo_char_send006b (int fd, struct char_session_data *sd) +{ + int i, j, found_num; + struct mmo_charstatus *p; + const int offset = 24; + + found_num = 0; + for (i = 0; i < char_num; i++) + { + if (char_dat[i].account_id == sd->account_id) + { + sd->found_char[found_num] = i; + found_num++; + if (found_num == 9) + break; + } + } + for (i = found_num; i < 9; i++) + sd->found_char[i] = -1; + + memset (WFIFOP (fd, 0), 0, offset + found_num * 106); + WFIFOW (fd, 0) = 0x6b; + WFIFOW (fd, 2) = offset + found_num * 106; + + for (i = 0; i < found_num; i++) + { + p = &char_dat[sd->found_char[i]]; + j = offset + (i * 106); // increase speed of code + + WFIFOL (fd, j) = p->char_id; + WFIFOL (fd, j + 4) = p->base_exp; + WFIFOL (fd, j + 8) = p->zeny; + WFIFOL (fd, j + 12) = p->job_exp; + WFIFOL (fd, j + 16) = 0; //p->job_level; // [Fate] We no longer reveal this to the player, as its meaning is weird. + + WFIFOW (fd, j + 20) = find_equip_view (p, 0x0040); // 9: shoes + WFIFOW (fd, j + 22) = find_equip_view (p, 0x0004); // 10: gloves + WFIFOW (fd, j + 24) = find_equip_view (p, 0x0008); // 11: cape + WFIFOW (fd, j + 26) = find_equip_view (p, 0x0010); // 12: misc1 + WFIFOL (fd, j + 28) = p->option; + + WFIFOL (fd, j + 32) = p->karma; + WFIFOL (fd, j + 36) = p->manner; + + WFIFOW (fd, j + 40) = p->status_point; + WFIFOW (fd, j + 42) = (p->hp > 0x7fff) ? 0x7fff : p->hp; + WFIFOW (fd, j + 44) = (p->max_hp > 0x7fff) ? 0x7fff : p->max_hp; + WFIFOW (fd, j + 46) = (p->sp > 0x7fff) ? 0x7fff : p->sp; + WFIFOW (fd, j + 48) = (p->max_sp > 0x7fff) ? 0x7fff : p->max_sp; + WFIFOW (fd, j + 50) = DEFAULT_WALK_SPEED; // p->speed; + WFIFOW (fd, j + 52) = p->class; + WFIFOW (fd, j + 54) = p->hair; +// WFIFOW(fd,j+56) = p->weapon; // dont send weapon since TMW does not support it + WFIFOW (fd, j + 56) = 0; + WFIFOW (fd, j + 58) = p->base_level; + WFIFOW (fd, j + 60) = p->skill_point; + WFIFOW (fd, j + 62) = p->head_bottom; + WFIFOW (fd, j + 64) = p->shield; + WFIFOW (fd, j + 66) = p->head_top; + WFIFOW (fd, j + 68) = p->head_mid; + WFIFOW (fd, j + 70) = p->hair_color; + WFIFOW (fd, j + 72) = find_equip_view (p, 0x0080); // 13: misc2 +// WFIFOW(fd,j+72) = p->clothes_color; + + memcpy (WFIFOP (fd, j + 74), p->name, 24); + + WFIFOB (fd, j + 98) = (p->str > 255) ? 255 : p->str; + WFIFOB (fd, j + 99) = (p->agi > 255) ? 255 : p->agi; + WFIFOB (fd, j + 100) = (p->vit > 255) ? 255 : p->vit; + WFIFOB (fd, j + 101) = (p->int_ > 255) ? 255 : p->int_; + WFIFOB (fd, j + 102) = (p->dex > 255) ? 255 : p->dex; + WFIFOB (fd, j + 103) = (p->luk > 255) ? 255 : p->luk; + WFIFOB (fd, j + 104) = p->char_num; + } + + WFIFOSET (fd, WFIFOW (fd, 2)); + + return 0; } -int set_account_reg2(int acc, int num, struct global_reg *reg) { - int i, c; - - c = 0; - for(i = 0; i < char_num; i++) { - if (char_dat[i].account_id == acc) { - memcpy(char_dat[i].account_reg2, reg, sizeof(char_dat[i].account_reg2)); - char_dat[i].account_reg2_num = num; - c++; - } - } - return c; +int set_account_reg2 (int acc, int num, struct global_reg *reg) +{ + int i, c; + + c = 0; + for (i = 0; i < char_num; i++) + { + if (char_dat[i].account_id == acc) + { + memcpy (char_dat[i].account_reg2, reg, + sizeof (char_dat[i].account_reg2)); + char_dat[i].account_reg2_num = num; + c++; + } + } + return c; } // Divorce a character from it's partner and let the map server know -int char_divorce(struct mmo_charstatus *cs) { - int i; - char buf[10]; - - if (cs == NULL) - return 0; - - if (cs->partner_id <= 0) - { - WBUFW(buf,0) = 0x2b12; - WBUFL(buf,2) = cs->char_id; - WBUFL(buf,6) = 0; // partner id 0 means failure - mapif_sendall(buf,10); - return 0; - } - - WBUFW(buf,0) = 0x2b12; - WBUFL(buf,2) = cs->char_id; - - for(i = 0; i < char_num; i++) { - if (char_dat[i].char_id == cs->partner_id && char_dat[i].partner_id == cs->char_id) { - WBUFL(buf,6) = cs->partner_id; - mapif_sendall(buf,10); - cs->partner_id = 0; - char_dat[i].partner_id = 0; - return 0; - } - // The other char doesn't have us as their partner, so just clear our partner - // Don't worry about this, as the map server should verify itself that the other doesn't have us as a partner, and so won't mess with their marriage - else if (char_dat[i].char_id == cs->partner_id) { - WBUFL(buf,6) = cs->partner_id; - mapif_sendall(buf,10); - cs->partner_id = 0; - return 0; - } - } - - // Our partner wasn't found, so just clear our marriage - WBUFL(buf,6) = cs->partner_id; - cs->partner_id = 0; - mapif_sendall(buf,10); - - return 0; +int char_divorce (struct mmo_charstatus *cs) +{ + int i; + char buf[10]; + + if (cs == NULL) + return 0; + + if (cs->partner_id <= 0) + { + WBUFW (buf, 0) = 0x2b12; + WBUFL (buf, 2) = cs->char_id; + WBUFL (buf, 6) = 0; // partner id 0 means failure + mapif_sendall (buf, 10); + return 0; + } + + WBUFW (buf, 0) = 0x2b12; + WBUFL (buf, 2) = cs->char_id; + + for (i = 0; i < char_num; i++) + { + if (char_dat[i].char_id == cs->partner_id + && char_dat[i].partner_id == cs->char_id) + { + WBUFL (buf, 6) = cs->partner_id; + mapif_sendall (buf, 10); + cs->partner_id = 0; + char_dat[i].partner_id = 0; + return 0; + } + // The other char doesn't have us as their partner, so just clear our partner + // Don't worry about this, as the map server should verify itself that the other doesn't have us as a partner, and so won't mess with their marriage + else if (char_dat[i].char_id == cs->partner_id) + { + WBUFL (buf, 6) = cs->partner_id; + mapif_sendall (buf, 10); + cs->partner_id = 0; + return 0; + } + } + + // Our partner wasn't found, so just clear our marriage + WBUFL (buf, 6) = cs->partner_id; + cs->partner_id = 0; + mapif_sendall (buf, 10); + + return 0; } //------------------------------------------------------------ // E-mail check: return 0 (not correct) or 1 (valid). by [Yor] //------------------------------------------------------------ -int e_mail_check(unsigned char *email) { - char ch; - unsigned char* last_arobas; - - // athena limits - if (strlen(email) < 3 || strlen(email) > 39) - return 0; +int e_mail_check (unsigned char *email) +{ + char ch; + unsigned char *last_arobas; - // part of RFC limits (official reference of e-mail description) - if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@') - return 0; + // athena limits + if (strlen (email) < 3 || strlen (email) > 39) + return 0; - if (email[strlen(email)-1] == '.') - return 0; + // part of RFC limits (official reference of e-mail description) + if (strchr (email, '@') == NULL || email[strlen (email) - 1] == '@') + return 0; - last_arobas = strrchr(email, '@'); + if (email[strlen (email) - 1] == '.') + return 0; - if (strstr(last_arobas, "@.") != NULL || - strstr(last_arobas, "..") != NULL) - return 0; + last_arobas = strrchr (email, '@'); - for(ch = 1; ch < 32; ch++) { - if (strchr(last_arobas, ch) != NULL) { - return 0; - break; - } - } + if (strstr (last_arobas, "@.") != NULL || + strstr (last_arobas, "..") != NULL) + return 0; - if (strchr(last_arobas, ' ') != NULL || - strchr(last_arobas, ';') != NULL) - return 0; + for (ch = 1; ch < 32; ch++) + { + if (strchr (last_arobas, ch) != NULL) + { + return 0; + break; + } + } + + if (strchr (last_arobas, ' ') != NULL || + strchr (last_arobas, ';') != NULL) + return 0; - // all correct - return 1; + // all correct + return 1; } //---------------------------------------------------------------------- // Force disconnection of an online player (with account value) by [Yor] //---------------------------------------------------------------------- -int disconnect_player(int accound_id) { - int i; - struct char_session_data *sd; - - // disconnect player if online on char-server - for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data)) { - if (sd->account_id == accound_id) { - session[i]->eof = 1; - return 1; - } - } - } - - return 0; +int disconnect_player (int accound_id) +{ + int i; + struct char_session_data *sd; + + // disconnect player if online on char-server + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data)) + { + if (sd->account_id == accound_id) + { + session[i]->eof = 1; + return 1; + } + } + } + + return 0; } // キャラ削除に伴うデータ削除 -static int char_delete(struct mmo_charstatus *cs) { - - // ギルド脱退 - if (cs->guild_id) - inter_guild_leave(cs->guild_id, cs->account_id, cs->char_id); - // パーティー脱退 - if (cs->party_id) - inter_party_leave(cs->party_id, cs->account_id); - // 離婚 - if (cs->partner_id) - char_divorce(cs); - - // Force the character (and all on the same account) to leave all map servers - { - unsigned char buf[6]; - WBUFW(buf,0) = 0x2afe; - WBUFL(buf,2) = cs->account_id; - mapif_sendall(buf, 6); - } - - return 0; +static int char_delete (struct mmo_charstatus *cs) +{ + + // ギルド脱退 + if (cs->guild_id) + inter_guild_leave (cs->guild_id, cs->account_id, cs->char_id); + // パーティー脱退 + if (cs->party_id) + inter_party_leave (cs->party_id, cs->account_id); + // 離婚 + if (cs->partner_id) + char_divorce (cs); + + // Force the character (and all on the same account) to leave all map servers + { + unsigned char buf[6]; + WBUFW (buf, 0) = 0x2afe; + WBUFL (buf, 2) = cs->account_id; + mapif_sendall (buf, 6); + } + + return 0; } -int parse_tologin(int fd) { - int i; - struct char_session_data *sd; - - // only login-server can have an access to here. - // so, if it isn't the login-server, we disconnect the session (fd != login_fd). - if (fd != login_fd || session[fd]->eof) { - if (fd == login_fd) { - printf("Char-server can't connect to login-server (connection #%d).\n", fd); - login_fd = -1; - } - close(fd); - delete_session(fd); - return 0; - } - - sd = session[fd]->session_data; - - while(RFIFOREST(fd) >= 2) { -// printf("parse_tologin: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd)); - - switch(RFIFOW(fd,0)) { - case 0x2711: - if (RFIFOREST(fd) < 3) - return 0; - if (RFIFOB(fd,2)) { -// printf("connect login server error : %d\n", RFIFOB(fd,2)); - printf("Can not connect to login-server.\n"); - printf("The server communication passwords (default s1/p1) is probably invalid.\n"); - printf("Also, please make sure your accounts file (default: accounts.txt) has those values present.\n"); - printf("If you changed the communication passwords, change them back at map_athena.conf and char_athena.conf\n"); - exit(1); - } else { - printf("Connected to login-server (connection #%d).\n", fd); - // if no map-server already connected, display a message... - for(i = 0; i < MAX_MAP_SERVERS; i++) - if (server_fd[i] >= 0 && server[i].map[0][0]) // if map-server online and at least 1 map - break; - if (i == MAX_MAP_SERVERS) - printf("Awaiting maps from map-server.\n"); - } - RFIFOSKIP(fd,3); - break; - - case 0x2713: - if (RFIFOREST(fd) < 51) - return 0; -// printf("parse_tologin 2713 : %d\n", RFIFOB(fd,6)); - for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) { - if (RFIFOB(fd,6) != 0) { - WFIFOW(i,0) = 0x6c; - WFIFOB(i,2) = 0x42; - WFIFOSET(i,3); - } else if (max_connect_user == 0 || count_users() < max_connect_user) { -// if (max_connect_user == 0) -// printf("max_connect_user (unlimited) -> accepted.\n"); -// else -// printf("count_users(): %d < max_connect_user (%d) -> accepted.\n", count_users(), max_connect_user); - memcpy(sd->email, RFIFOP(fd, 7), 40); - if (e_mail_check(sd->email) == 0) - strncpy(sd->email, "a@a.com", 40); // default e-mail - sd->connect_until_time = (time_t)RFIFOL(fd,47); - // send characters to player - mmo_char_send006b(i, sd); - } else { - // refuse connection: too much online players -// printf("count_users(): %d < max_connect_use (%d) -> fail...\n", count_users(), max_connect_user); - WFIFOW(i,0) = 0x6c; - WFIFOW(i,2) = 0; - WFIFOSET(i,3); - } - break; - } - } - RFIFOSKIP(fd,51); - break; - - // Receiving of an e-mail/time limit from the login-server (answer of a request because a player comes back from map-server to char-server) by [Yor] - case 0x2717: - if (RFIFOREST(fd) < 50) - return 0; - for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data)) { - if (sd->account_id == RFIFOL(fd,2)) { - memcpy(sd->email, RFIFOP(fd,6), 40); - if (e_mail_check(sd->email) == 0) - strncpy(sd->email, "a@a.com", 40); // default e-mail - sd->connect_until_time = (time_t)RFIFOL(fd,46); - break; - } - } - } - RFIFOSKIP(fd,50); - break; - - case 0x2721: // gm reply - if (RFIFOREST(fd) < 10) - return 0; - { - unsigned char buf[10]; - WBUFW(buf,0) = 0x2b0b; - WBUFL(buf,2) = RFIFOL(fd,2); // account - WBUFL(buf,6) = RFIFOL(fd,6); // GM level - mapif_sendall(buf,10); -// printf("parse_tologin: To become GM answer: char -> map.\n"); - } - RFIFOSKIP(fd,10); - break; - - case 0x2723: // changesex reply (modified by [Yor]) - if (RFIFOREST(fd) < 7) - return 0; - { - int acc, sex, i, j; - unsigned char buf[7]; - acc = RFIFOL(fd,2); - sex = RFIFOB(fd,6); - RFIFOSKIP(fd, 7); - if (acc > 0) { - for (i = 0; i < char_num; i++) { - if (char_dat[i].account_id == acc) { - int jobclass = char_dat[i].class; - char_dat[i].sex = sex; -// auth_fifo[i].sex = sex; - if (jobclass == 19 || jobclass == 20 || - jobclass == 4020 || jobclass == 4021 || - jobclass == 4042 || jobclass == 4043) { - // job modification - if (jobclass == 19 || jobclass == 20) { - char_dat[i].class = (sex) ? 19 : 20; - } else if (jobclass == 4020 || jobclass == 4021) { - char_dat[i].class = (sex) ? 4020 : 4021; - } else if (jobclass == 4042 || jobclass == 4043) { - char_dat[i].class = (sex) ? 4042 : 4043; - } - } - // to avoid any problem with equipment and invalid sex, equipment is unequiped. - for (j = 0; j < MAX_INVENTORY; j++) { - if (char_dat[i].inventory[j].nameid && char_dat[i].inventory[j].equip) - char_dat[i].inventory[j].equip = 0; - } - char_dat[i].weapon = 0; - char_dat[i].shield = 0; - char_dat[i].head_top = 0; - char_dat[i].head_mid = 0; - char_dat[i].head_bottom = 0; - } - } - // disconnect player if online on char-server - disconnect_player(acc); - } - WBUFW(buf,0) = 0x2b0d; - WBUFL(buf,2) = acc; - WBUFB(buf,6) = sex; - mapif_sendall(buf, 7); - } - break; - - case 0x2726: // Request to send a broadcast message (no answer) - if (RFIFOREST(fd) < 8 || RFIFOREST(fd) < (8 + RFIFOL(fd,4))) - return 0; - if (RFIFOL(fd,4) < 1) - char_log("Receiving a message for broadcast, but message is void." RETCODE); - else { - // at least 1 map-server - for(i = 0; i < MAX_MAP_SERVERS; i++) - if (server_fd[i] >= 0) - break; - if (i == MAX_MAP_SERVERS) - char_log("'ladmin': Receiving a message for broadcast, but no map-server is online." RETCODE); - else { - char buf[128]; - char message[RFIFOL(fd,4) + 1]; // +1 to add a null terminated if not exist in the packet - int lp; - char *p; - memset(message, '\0', sizeof(message)); - memcpy(message, RFIFOP(fd,8), RFIFOL(fd,4)); - message[sizeof(message)-1] = '\0'; - remove_control_chars(message); - // remove all first spaces - p = message; - while(p[0] == ' ') - p++; - // if message is only composed of spaces - if (p[0] == '\0') - char_log("Receiving a message for broadcast, but message is only a lot of spaces." RETCODE); - // else send message to all map-servers - else { - if (RFIFOW(fd,2) == 0) { - char_log("'ladmin': Receiving a message for broadcast (message (in yellow): %s)" RETCODE, - message); - lp = 4; - } else { - char_log("'ladmin': Receiving a message for broadcast (message (in blue): %s)" RETCODE, - message); - lp = 8; - } - // split message to max 80 char - while(p[0] != '\0') { // if not finish - if (p[0] == ' ') // jump if first char is a space - p++; - else { - char split[80]; - char* last_space; - sscanf(p, "%79[^\t]", split); // max 79 char, any char (\t is control char and control char was removed before) - split[sizeof(split)-1] = '\0'; // last char always \0 - if ((last_space = strrchr(split, ' ')) != NULL) { // searching space from end of the string - last_space[0] = '\0'; // replace it by NULL to have correct length of split - p++; // to jump the new NULL - } - p += strlen(split); - // send broadcast to all map-servers - WBUFW(buf,0) = 0x3800; - WBUFW(buf,2) = lp + strlen(split) + 1; - WBUFL(buf,4) = 0x65756c62; // only write if in blue (lp = 8) - memcpy(WBUFP(buf,lp), split, strlen(split) + 1); - mapif_sendall(buf, WBUFW(buf,2)); - } - } - } - } - } - RFIFOSKIP(fd,8 + RFIFOL(fd,4)); - break; - - // account_reg2変更通知 - case 0x2729: - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - { - struct global_reg reg[ACCOUNT_REG2_NUM]; - unsigned char buf[4096]; - int j, p, acc; - acc = RFIFOL(fd,4); - for (p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) { - memcpy(reg[j].str, RFIFOP(fd,p), 32); - reg[j].value = RFIFOL(fd,p+32); - } - set_account_reg2(acc, j, reg); - // 同垢ログインを禁止していれば送る必要は無い - memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2)); - WBUFW(buf,0) = 0x2b11; - mapif_sendall(buf, WBUFW(buf,2)); - RFIFOSKIP(fd,RFIFOW(fd,2)); -// printf("char: save_account_reg_reply\n"); - } - break; - - case 0x7924: { // [Fate] Itemfrob package: forwarded from login-server - if (RFIFOREST(fd) < 10) - return 0; - int source_id = RFIFOL(fd, 2); - int dest_id = RFIFOL(fd, 6); - unsigned char buf[10]; - - WBUFW(buf, 0) = 0x2afa; - WBUFL(buf, 2) = source_id; - WBUFL(buf, 6) = dest_id; - - mapif_sendall(buf, 10); // forward package to map servers - for (i = 0; i < char_num; i++) { - struct mmo_charstatus *c = char_dat + i; - struct storage *s = account2storage(c->account_id); - int changes = 0; - int j; -#define FIX(v) if (v == source_id) {v = dest_id; ++changes; } +int parse_tologin (int fd) +{ + int i; + struct char_session_data *sd; + + // only login-server can have an access to here. + // so, if it isn't the login-server, we disconnect the session (fd != login_fd). + if (fd != login_fd || session[fd]->eof) + { + if (fd == login_fd) + { + printf + ("Char-server can't connect to login-server (connection #%d).\n", + fd); + login_fd = -1; + } + close (fd); + delete_session (fd); + return 0; + } + + sd = session[fd]->session_data; + + while (RFIFOREST (fd) >= 2) + { +// printf("parse_tologin: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd)); + + switch (RFIFOW (fd, 0)) + { + case 0x2711: + if (RFIFOREST (fd) < 3) + return 0; + if (RFIFOB (fd, 2)) + { +// printf("connect login server error : %d\n", RFIFOB(fd,2)); + printf ("Can not connect to login-server.\n"); + printf + ("The server communication passwords (default s1/p1) is probably invalid.\n"); + printf + ("Also, please make sure your accounts file (default: accounts.txt) has those values present.\n"); + printf + ("If you changed the communication passwords, change them back at map_athena.conf and char_athena.conf\n"); + exit (1); + } + else + { + printf ("Connected to login-server (connection #%d).\n", + fd); + // if no map-server already connected, display a message... + for (i = 0; i < MAX_MAP_SERVERS; i++) + if (server_fd[i] >= 0 && server[i].map[0][0]) // if map-server online and at least 1 map + break; + if (i == MAX_MAP_SERVERS) + printf ("Awaiting maps from map-server.\n"); + } + RFIFOSKIP (fd, 3); + break; + + case 0x2713: + if (RFIFOREST (fd) < 51) + return 0; +// printf("parse_tologin 2713 : %d\n", RFIFOB(fd,6)); + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data) + && sd->account_id == RFIFOL (fd, 2)) + { + if (RFIFOB (fd, 6) != 0) + { + WFIFOW (i, 0) = 0x6c; + WFIFOB (i, 2) = 0x42; + WFIFOSET (i, 3); + } + else if (max_connect_user == 0 + || count_users () < max_connect_user) + { +// if (max_connect_user == 0) +// printf("max_connect_user (unlimited) -> accepted.\n"); +// else +// printf("count_users(): %d < max_connect_user (%d) -> accepted.\n", count_users(), max_connect_user); + memcpy (sd->email, RFIFOP (fd, 7), 40); + if (e_mail_check (sd->email) == 0) + strncpy (sd->email, "a@a.com", 40); // default e-mail + sd->connect_until_time = (time_t) RFIFOL (fd, 47); + // send characters to player + mmo_char_send006b (i, sd); + } + else + { + // refuse connection: too much online players +// printf("count_users(): %d < max_connect_use (%d) -> fail...\n", count_users(), max_connect_user); + WFIFOW (i, 0) = 0x6c; + WFIFOW (i, 2) = 0; + WFIFOSET (i, 3); + } + break; + } + } + RFIFOSKIP (fd, 51); + break; + + // Receiving of an e-mail/time limit from the login-server (answer of a request because a player comes back from map-server to char-server) by [Yor] + case 0x2717: + if (RFIFOREST (fd) < 50) + return 0; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data)) + { + if (sd->account_id == RFIFOL (fd, 2)) + { + memcpy (sd->email, RFIFOP (fd, 6), 40); + if (e_mail_check (sd->email) == 0) + strncpy (sd->email, "a@a.com", 40); // default e-mail + sd->connect_until_time = (time_t) RFIFOL (fd, 46); + break; + } + } + } + RFIFOSKIP (fd, 50); + break; + + case 0x2721: // gm reply + if (RFIFOREST (fd) < 10) + return 0; + { + unsigned char buf[10]; + WBUFW (buf, 0) = 0x2b0b; + WBUFL (buf, 2) = RFIFOL (fd, 2); // account + WBUFL (buf, 6) = RFIFOL (fd, 6); // GM level + mapif_sendall (buf, 10); +// printf("parse_tologin: To become GM answer: char -> map.\n"); + } + RFIFOSKIP (fd, 10); + break; + + case 0x2723: // changesex reply (modified by [Yor]) + if (RFIFOREST (fd) < 7) + return 0; + { + int acc, sex, i, j; + unsigned char buf[7]; + acc = RFIFOL (fd, 2); + sex = RFIFOB (fd, 6); + RFIFOSKIP (fd, 7); + if (acc > 0) + { + for (i = 0; i < char_num; i++) + { + if (char_dat[i].account_id == acc) + { + int jobclass = char_dat[i].class; + char_dat[i].sex = sex; +// auth_fifo[i].sex = sex; + if (jobclass == 19 || jobclass == 20 || + jobclass == 4020 || jobclass == 4021 || + jobclass == 4042 || jobclass == 4043) + { + // job modification + if (jobclass == 19 || jobclass == 20) + { + char_dat[i].class = (sex) ? 19 : 20; + } + else if (jobclass == 4020 + || jobclass == 4021) + { + char_dat[i].class = + (sex) ? 4020 : 4021; + } + else if (jobclass == 4042 + || jobclass == 4043) + { + char_dat[i].class = + (sex) ? 4042 : 4043; + } + } + // to avoid any problem with equipment and invalid sex, equipment is unequiped. for (j = 0; j < MAX_INVENTORY; j++) - FIX(c->inventory[j].nameid); - for (j = 0; j < MAX_CART; j++) - FIX(c->cart[j].nameid); - FIX(c->weapon); - FIX(c->shield); - FIX(c->head_top); - FIX(c->head_mid); - FIX(c->head_bottom); - - if (s) - for (j = 0; j < s->storage_amount; j++) - FIX(s->storage_[j].nameid); + { + if (char_dat[i].inventory[j].nameid + && char_dat[i].inventory[j].equip) + char_dat[i].inventory[j].equip = 0; + } + char_dat[i].weapon = 0; + char_dat[i].shield = 0; + char_dat[i].head_top = 0; + char_dat[i].head_mid = 0; + char_dat[i].head_bottom = 0; + } + } + // disconnect player if online on char-server + disconnect_player (acc); + } + WBUFW (buf, 0) = 0x2b0d; + WBUFL (buf, 2) = acc; + WBUFB (buf, 6) = sex; + mapif_sendall (buf, 7); + } + break; + + case 0x2726: // Request to send a broadcast message (no answer) + if (RFIFOREST (fd) < 8 + || RFIFOREST (fd) < (8 + RFIFOL (fd, 4))) + return 0; + if (RFIFOL (fd, 4) < 1) + char_log + ("Receiving a message for broadcast, but message is void." + RETCODE); + else + { + // at least 1 map-server + for (i = 0; i < MAX_MAP_SERVERS; i++) + if (server_fd[i] >= 0) + break; + if (i == MAX_MAP_SERVERS) + char_log + ("'ladmin': Receiving a message for broadcast, but no map-server is online." + RETCODE); + else + { + char buf[128]; + char message[RFIFOL (fd, 4) + 1]; // +1 to add a null terminated if not exist in the packet + int lp; + char *p; + memset (message, '\0', sizeof (message)); + memcpy (message, RFIFOP (fd, 8), RFIFOL (fd, 4)); + message[sizeof (message) - 1] = '\0'; + remove_control_chars (message); + // remove all first spaces + p = message; + while (p[0] == ' ') + p++; + // if message is only composed of spaces + if (p[0] == '\0') + char_log + ("Receiving a message for broadcast, but message is only a lot of spaces." + RETCODE); + // else send message to all map-servers + else + { + if (RFIFOW (fd, 2) == 0) + { + char_log + ("'ladmin': Receiving a message for broadcast (message (in yellow): %s)" + RETCODE, message); + lp = 4; + } + else + { + char_log + ("'ladmin': Receiving a message for broadcast (message (in blue): %s)" + RETCODE, message); + lp = 8; + } + // split message to max 80 char + while (p[0] != '\0') + { // if not finish + if (p[0] == ' ') // jump if first char is a space + p++; + else + { + char split[80]; + char *last_space; + sscanf (p, "%79[^\t]", split); // max 79 char, any char (\t is control char and control char was removed before) + split[sizeof (split) - 1] = '\0'; // last char always \0 + if ((last_space = + strrchr (split, ' ')) != NULL) + { // searching space from end of the string + last_space[0] = '\0'; // replace it by NULL to have correct length of split + p++; // to jump the new NULL + } + p += strlen (split); + // send broadcast to all map-servers + WBUFW (buf, 0) = 0x3800; + WBUFW (buf, 2) = lp + strlen (split) + 1; + WBUFL (buf, 4) = 0x65756c62; // only write if in blue (lp = 8) + memcpy (WBUFP (buf, lp), split, + strlen (split) + 1); + mapif_sendall (buf, WBUFW (buf, 2)); + } + } + } + } + } + RFIFOSKIP (fd, 8 + RFIFOL (fd, 4)); + break; + + // account_reg2変更通知 + case 0x2729: + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + { + struct global_reg reg[ACCOUNT_REG2_NUM]; + unsigned char buf[4096]; + int j, p, acc; + acc = RFIFOL (fd, 4); + for (p = 8, j = 0; + p < RFIFOW (fd, 2) && j < ACCOUNT_REG2_NUM; + p += 36, j++) + { + memcpy (reg[j].str, RFIFOP (fd, p), 32); + reg[j].value = RFIFOL (fd, p + 32); + } + set_account_reg2 (acc, j, reg); + // 同垢ログインを禁止していれば送る必要は無い + memcpy (buf, RFIFOP (fd, 0), RFIFOW (fd, 2)); + WBUFW (buf, 0) = 0x2b11; + mapif_sendall (buf, WBUFW (buf, 2)); + RFIFOSKIP (fd, RFIFOW (fd, 2)); +// printf("char: save_account_reg_reply\n"); + } + break; + + case 0x7924: + { // [Fate] Itemfrob package: forwarded from login-server + if (RFIFOREST (fd) < 10) + return 0; + int source_id = RFIFOL (fd, 2); + int dest_id = RFIFOL (fd, 6); + unsigned char buf[10]; + + WBUFW (buf, 0) = 0x2afa; + WBUFL (buf, 2) = source_id; + WBUFL (buf, 6) = dest_id; + + mapif_sendall (buf, 10); // forward package to map servers + for (i = 0; i < char_num; i++) + { + struct mmo_charstatus *c = char_dat + i; + struct storage *s = account2storage (c->account_id); + int changes = 0; + int j; +#define FIX(v) if (v == source_id) {v = dest_id; ++changes; } + for (j = 0; j < MAX_INVENTORY; j++) + FIX (c->inventory[j].nameid); + for (j = 0; j < MAX_CART; j++) + FIX (c->cart[j].nameid); + FIX (c->weapon); + FIX (c->shield); + FIX (c->head_top); + FIX (c->head_mid); + FIX (c->head_bottom); + + if (s) + for (j = 0; j < s->storage_amount; j++) + FIX (s->storage_[j].nameid); #undef FIX - if (changes) - char_log("itemfrob(%d -> %d): `%s'(%d, account %d): changed %d times\n", source_id, dest_id, - c->name, c->char_id, c->account_id, changes); + if (changes) + char_log + ("itemfrob(%d -> %d): `%s'(%d, account %d): changed %d times\n", + source_id, dest_id, c->name, c->char_id, + c->account_id, changes); - } + } - mmo_char_sync(); - inter_storage_save(); - RFIFOSKIP(fd,10); - break; + mmo_char_sync (); + inter_storage_save (); + RFIFOSKIP (fd, 10); + break; + } + + // Account deletion notification (from login-server) + case 0x2730: + if (RFIFOREST (fd) < 6) + return 0; + // Deletion of all characters of the account + for (i = 0; i < char_num; i++) + { + if (char_dat[i].account_id == RFIFOL (fd, 2)) + { + char_delete (&char_dat[i]); + if (i < char_num - 1) + { + memcpy (&char_dat[i], &char_dat[char_num - 1], + sizeof (struct mmo_charstatus)); + // if moved character owns to deleted account, check again it's character + if (char_dat[i].account_id == RFIFOL (fd, 2)) + { + i--; + // Correct moved character reference in the character's owner by [Yor] + } + else + { + int j, k; + struct char_session_data *sd2; + for (j = 0; j < fd_max; j++) + { + if (session[j] + && (sd2 = session[j]->session_data) + && sd2->account_id == + char_dat[char_num - 1].account_id) + { + for (k = 0; k < 9; k++) + { + if (sd2->found_char[k] == + char_num - 1) + { + sd2->found_char[k] = i; + break; + } + } + break; + } + } + } + } + char_num--; + } + } + // Deletion of the storage + inter_storage_delete (RFIFOL (fd, 2)); + // send to all map-servers to disconnect the player + { + unsigned char buf[6]; + WBUFW (buf, 0) = 0x2b13; + WBUFL (buf, 2) = RFIFOL (fd, 2); + mapif_sendall (buf, 6); } + // disconnect player if online on char-server + disconnect_player (RFIFOL (fd, 2)); + RFIFOSKIP (fd, 6); + break; + + // State change of account/ban notification (from login-server) by [Yor] + case 0x2731: + if (RFIFOREST (fd) < 11) + return 0; + // send to all map-servers to disconnect the player + { + unsigned char buf[11]; + WBUFW (buf, 0) = 0x2b14; + WBUFL (buf, 2) = RFIFOL (fd, 2); + WBUFB (buf, 6) = RFIFOB (fd, 6); // 0: change of statut, 1: ban + WBUFL (buf, 7) = RFIFOL (fd, 7); // status or final date of a banishment + mapif_sendall (buf, 11); + } + // disconnect player if online on char-server + disconnect_player (RFIFOL (fd, 2)); + RFIFOSKIP (fd, 11); + break; + + // Receiving GM acounts info from login-server (by [Yor]) + case 0x2732: + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + { + char buf[32000]; + if (gm_account != NULL) + free (gm_account); + gm_account = + calloc (sizeof (struct gm_account) * + ((RFIFOW (fd, 2) - 4) / 5), 1); + GM_num = 0; + for (i = 4; i < RFIFOW (fd, 2); i = i + 5) + { + gm_account[GM_num].account_id = RFIFOL (fd, i); + gm_account[GM_num].level = (int) RFIFOB (fd, i + 4); + //printf("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level); + GM_num++; + } + printf + ("From login-server: receiving of %d GM accounts information.\n", + GM_num); + char_log + ("From login-server: receiving of %d GM accounts information." + RETCODE, GM_num); + create_online_files (); // update online players files (perhaps some online players change of GM level) + // send new gm acccounts level to map-servers + memcpy (buf, RFIFOP (fd, 0), RFIFOW (fd, 2)); + WBUFW (buf, 0) = 0x2b15; + mapif_sendall (buf, RFIFOW (fd, 2)); + } + RFIFOSKIP (fd, RFIFOW (fd, 2)); + break; + + case 0x2741: // change password reply + if (RFIFOREST (fd) < 7) + return 0; + { + int acc, status, i; + acc = RFIFOL (fd, 2); + status = RFIFOB (fd, 6); + + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data)) + { + if (sd->account_id == acc) + { + WFIFOW (i, 0) = 0x62; + WFIFOB (i, 2) = status; + WFIFOSET (i, 3); + break; + } + } + } + } + RFIFOSKIP (fd, 7); + break; + + default: + session[fd]->eof = 1; + return 0; + } + } + RFIFOFLUSH (fd); - // Account deletion notification (from login-server) - case 0x2730: - if (RFIFOREST(fd) < 6) - return 0; - // Deletion of all characters of the account - for(i = 0; i < char_num; i++) { - if (char_dat[i].account_id == RFIFOL(fd,2)) { - char_delete(&char_dat[i]); - if (i < char_num - 1) { - memcpy(&char_dat[i], &char_dat[char_num-1], sizeof(struct mmo_charstatus)); - // if moved character owns to deleted account, check again it's character - if (char_dat[i].account_id == RFIFOL(fd,2)) { - i--; - // Correct moved character reference in the character's owner by [Yor] - } else { - int j, k; - struct char_session_data *sd2; - for (j = 0; j < fd_max; j++) { - if (session[j] && (sd2 = session[j]->session_data) && - sd2->account_id == char_dat[char_num-1].account_id) { - for (k = 0; k < 9; k++) { - if (sd2->found_char[k] == char_num-1) { - sd2->found_char[k] = i; - break; - } - } - break; - } - } - } - } - char_num--; - } - } - // Deletion of the storage - inter_storage_delete(RFIFOL(fd,2)); - // send to all map-servers to disconnect the player - { - unsigned char buf[6]; - WBUFW(buf,0) = 0x2b13; - WBUFL(buf,2) = RFIFOL(fd,2); - mapif_sendall(buf, 6); - } - // disconnect player if online on char-server - disconnect_player(RFIFOL(fd,2)); - RFIFOSKIP(fd,6); - break; - - // State change of account/ban notification (from login-server) by [Yor] - case 0x2731: - if (RFIFOREST(fd) < 11) - return 0; - // send to all map-servers to disconnect the player - { - unsigned char buf[11]; - WBUFW(buf,0) = 0x2b14; - WBUFL(buf,2) = RFIFOL(fd,2); - WBUFB(buf,6) = RFIFOB(fd,6); // 0: change of statut, 1: ban - WBUFL(buf,7) = RFIFOL(fd,7); // status or final date of a banishment - mapif_sendall(buf, 11); - } - // disconnect player if online on char-server - disconnect_player(RFIFOL(fd,2)); - RFIFOSKIP(fd,11); - break; - - // Receiving GM acounts info from login-server (by [Yor]) - case 0x2732: - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - { - char buf[32000]; - if (gm_account != NULL) - free(gm_account); - gm_account = calloc(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1); - GM_num = 0; - for (i = 4; i < RFIFOW(fd,2); i = i + 5) { - gm_account[GM_num].account_id = RFIFOL(fd,i); - gm_account[GM_num].level = (int)RFIFOB(fd,i+4); - //printf("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level); - GM_num++; - } - printf("From login-server: receiving of %d GM accounts information.\n", GM_num); - char_log("From login-server: receiving of %d GM accounts information." RETCODE, GM_num); - create_online_files(); // update online players files (perhaps some online players change of GM level) - // send new gm acccounts level to map-servers - memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2)); - WBUFW(buf,0) = 0x2b15; - mapif_sendall(buf, RFIFOW(fd,2)); - } - RFIFOSKIP(fd,RFIFOW(fd,2)); - break; - - case 0x2741: // change password reply - if (RFIFOREST(fd) < 7) - return 0; - { - int acc, status, i; - acc = RFIFOL(fd,2); - status = RFIFOB(fd,6); - - for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data)) { - if (sd->account_id == acc) { - WFIFOW(i,0) = 0x62; - WFIFOB(i,2) = status; - WFIFOSET(i,3); - break; - } - } - } - } - RFIFOSKIP(fd, 7); - break; - - - default: - session[fd]->eof = 1; - return 0; - } - } - RFIFOFLUSH(fd); - - return 0; + return 0; } //-------------------------------- // Map-server anti-freeze system //-------------------------------- -int map_anti_freeze_system(int tid, unsigned int tick, int id, int data) { - int i; - - //printf("Entering in map_anti_freeze_system function to check freeze of servers.\n"); - for(i = 0; i < MAX_MAP_SERVERS; i++) { - if (server_fd[i] >= 0) {// if map-server is online - //printf("map_anti_freeze_system: server #%d, flag: %d.\n", i, server_freezeflag[i]); - if (server_freezeflag[i]-- < 1) { // Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed - printf("Map-server anti-freeze system: char-server #%d is freezed -> disconnection.\n", i); - char_log("Map-server anti-freeze system: char-server #%d is freezed -> disconnection." RETCODE, - i); - session[server_fd[i]]->eof = 1; - } - } - } - - return 0; +int map_anti_freeze_system (int tid, unsigned int tick, int id, int data) +{ + int i; + + //printf("Entering in map_anti_freeze_system function to check freeze of servers.\n"); + for (i = 0; i < MAX_MAP_SERVERS; i++) + { + if (server_fd[i] >= 0) + { // if map-server is online + //printf("map_anti_freeze_system: server #%d, flag: %d.\n", i, server_freezeflag[i]); + if (server_freezeflag[i]-- < 1) + { // Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed + printf + ("Map-server anti-freeze system: char-server #%d is freezed -> disconnection.\n", + i); + char_log + ("Map-server anti-freeze system: char-server #%d is freezed -> disconnection." + RETCODE, i); + session[server_fd[i]]->eof = 1; + } + } + } + + return 0; } -int parse_frommap(int fd) { - int i, j; - int id; - - for(id = 0; id < MAX_MAP_SERVERS; id++) - if (server_fd[id] == fd) - break; - if (id == MAX_MAP_SERVERS || session[fd]->eof) { - if (id < MAX_MAP_SERVERS) { - printf("Map-server %d (session #%d) has disconnected.\n", id, fd); - memset(&server[id], 0, sizeof(struct mmo_map_server)); - server_fd[id] = -1; - for(j = 0; j < char_num; j++) - if (online_chars[j] == fd) - online_chars[j] = -1; - create_online_files(); // update online players files (to remove all online players of this server) - } - close(fd); - delete_session(fd); - return 0; - } - - while(RFIFOREST(fd) >= 2) { -// printf("parse_frommap: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd)); - - switch(RFIFOW(fd,0)) { - // request from map-server to reload GM accounts. Transmission to login-server (by Yor) - case 0x2af7: - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd,0) = 0x2709; - WFIFOSET(login_fd, 2); -// printf("char : request from map-server to reload GM accounts -> login-server.\n"); - } - RFIFOSKIP(fd,2); - break; - - // Receiving map names list from the map-server - case 0x2afa: - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - memset(server[id].map, 0, sizeof(server[id].map)); - j = 0; - for(i = 4; i < RFIFOW(fd,2); i += 16) { - memcpy(server[id].map[j], RFIFOP(fd,i), 16); -// printf("set map %d.%d : %s\n", id, j, server[id].map[j]); - j++; - } - { - unsigned char *p = (unsigned char *)&server[id].ip; - printf("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d.\n", - id, j, p[0], p[1], p[2], p[3], server[id].port); - printf("Map-server %d loading complete.\n", id); - char_log("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d. Map-server %d loading complete." RETCODE, - id, j, p[0], p[1], p[2], p[3], server[id].port, id); - } - WFIFOW(fd,0) = 0x2afb; - WFIFOB(fd,2) = 0; - memcpy(WFIFOP(fd,3), wisp_server_name, 24); // name for wisp to player - WFIFOSET(fd,27); - { - unsigned char buf[16384]; - int x; - if (j == 0) { - printf("WARNING: Map-Server %d have NO map.\n", id); - char_log("WARNING: Map-Server %d have NO map." RETCODE, id); - // Transmitting maps information to the other map-servers - } else { - WBUFW(buf,0) = 0x2b04; - WBUFW(buf,2) = j * 16 + 10; - WBUFL(buf,4) = server[id].ip; - WBUFW(buf,8) = server[id].port; - memcpy(WBUFP(buf,10), RFIFOP(fd,4), j * 16); - mapif_sendallwos(fd, buf, WBUFW(buf,2)); - } - // Transmitting the maps of the other map-servers to the new map-server - for(x = 0; x < MAX_MAP_SERVERS; x++) { - if (server_fd[x] >= 0 && x != id) { - WFIFOW(fd,0) = 0x2b04; - WFIFOL(fd,4) = server[x].ip; - WFIFOW(fd,8) = server[x].port; - j = 0; - for(i = 0; i < MAX_MAP_PER_SERVER; i++) - if (server[x].map[i][0]) - memcpy(WFIFOP(fd,10+(j++)*16), server[x].map[i], 16); - if (j > 0) { - WFIFOW(fd,2) = j * 16 + 10; - WFIFOSET(fd,WFIFOW(fd,2)); - } - } - } - } - RFIFOSKIP(fd,RFIFOW(fd,2)); - break; - - // 認証要求 - case 0x2afc: - if (RFIFOREST(fd) < 22) - return 0; - //printf("auth_fifo search: account: %d, char: %d, secure: %08x-%08x\n", RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14)); - for(i = 0; i < AUTH_FIFO_SIZE; i++) { - if (auth_fifo[i].account_id == RFIFOL(fd,2) && - auth_fifo[i].char_id == RFIFOL(fd,6) && - auth_fifo[i].login_id1 == RFIFOL(fd,10) && +int parse_frommap (int fd) +{ + int i, j; + int id; + + for (id = 0; id < MAX_MAP_SERVERS; id++) + if (server_fd[id] == fd) + break; + if (id == MAX_MAP_SERVERS || session[fd]->eof) + { + if (id < MAX_MAP_SERVERS) + { + printf ("Map-server %d (session #%d) has disconnected.\n", id, + fd); + memset (&server[id], 0, sizeof (struct mmo_map_server)); + server_fd[id] = -1; + for (j = 0; j < char_num; j++) + if (online_chars[j] == fd) + online_chars[j] = -1; + create_online_files (); // update online players files (to remove all online players of this server) + } + close (fd); + delete_session (fd); + return 0; + } + + while (RFIFOREST (fd) >= 2) + { +// printf("parse_frommap: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd)); + + switch (RFIFOW (fd, 0)) + { + // request from map-server to reload GM accounts. Transmission to login-server (by Yor) + case 0x2af7: + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x2709; + WFIFOSET (login_fd, 2); +// printf("char : request from map-server to reload GM accounts -> login-server.\n"); + } + RFIFOSKIP (fd, 2); + break; + + // Receiving map names list from the map-server + case 0x2afa: + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + memset (server[id].map, 0, sizeof (server[id].map)); + j = 0; + for (i = 4; i < RFIFOW (fd, 2); i += 16) + { + memcpy (server[id].map[j], RFIFOP (fd, i), 16); +// printf("set map %d.%d : %s\n", id, j, server[id].map[j]); + j++; + } + { + unsigned char *p = (unsigned char *) &server[id].ip; + printf + ("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d.\n", + id, j, p[0], p[1], p[2], p[3], server[id].port); + printf ("Map-server %d loading complete.\n", id); + char_log + ("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d. Map-server %d loading complete." + RETCODE, id, j, p[0], p[1], p[2], p[3], + server[id].port, id); + } + WFIFOW (fd, 0) = 0x2afb; + WFIFOB (fd, 2) = 0; + memcpy (WFIFOP (fd, 3), wisp_server_name, 24); // name for wisp to player + WFIFOSET (fd, 27); + { + unsigned char buf[16384]; + int x; + if (j == 0) + { + printf ("WARNING: Map-Server %d have NO map.\n", id); + char_log ("WARNING: Map-Server %d have NO map." + RETCODE, id); + // Transmitting maps information to the other map-servers + } + else + { + WBUFW (buf, 0) = 0x2b04; + WBUFW (buf, 2) = j * 16 + 10; + WBUFL (buf, 4) = server[id].ip; + WBUFW (buf, 8) = server[id].port; + memcpy (WBUFP (buf, 10), RFIFOP (fd, 4), j * 16); + mapif_sendallwos (fd, buf, WBUFW (buf, 2)); + } + // Transmitting the maps of the other map-servers to the new map-server + for (x = 0; x < MAX_MAP_SERVERS; x++) + { + if (server_fd[x] >= 0 && x != id) + { + WFIFOW (fd, 0) = 0x2b04; + WFIFOL (fd, 4) = server[x].ip; + WFIFOW (fd, 8) = server[x].port; + j = 0; + for (i = 0; i < MAX_MAP_PER_SERVER; i++) + if (server[x].map[i][0]) + memcpy (WFIFOP (fd, 10 + (j++) * 16), + server[x].map[i], 16); + if (j > 0) + { + WFIFOW (fd, 2) = j * 16 + 10; + WFIFOSET (fd, WFIFOW (fd, 2)); + } + } + } + } + RFIFOSKIP (fd, RFIFOW (fd, 2)); + break; + + // 認証要求 + case 0x2afc: + if (RFIFOREST (fd) < 22) + return 0; + //printf("auth_fifo search: account: %d, char: %d, secure: %08x-%08x\n", RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14)); + for (i = 0; i < AUTH_FIFO_SIZE; i++) + { + if (auth_fifo[i].account_id == RFIFOL (fd, 2) && + auth_fifo[i].char_id == RFIFOL (fd, 6) && + auth_fifo[i].login_id1 == RFIFOL (fd, 10) && #if CMP_AUTHFIFO_LOGIN2 != 0 - // here, it's the only area where it's possible that we doesn't know login_id2 (map-server asks just after 0x72 packet, that doesn't given the value) - (auth_fifo[i].login_id2 == RFIFOL(fd,14) || RFIFOL(fd,14) == 0) && // relate to the versions higher than 18 + // here, it's the only area where it's possible that we doesn't know login_id2 (map-server asks just after 0x72 packet, that doesn't given the value) + (auth_fifo[i].login_id2 == RFIFOL (fd, 14) || RFIFOL (fd, 14) == 0) && // relate to the versions higher than 18 #endif - (!check_ip_flag || auth_fifo[i].ip == RFIFOL(fd,18)) && - !auth_fifo[i].delflag) { - auth_fifo[i].delflag = 1; - WFIFOW(fd,0) = 0x2afd; - WFIFOW(fd,2) = 18 + sizeof(struct mmo_charstatus); - WFIFOL(fd,4) = RFIFOL(fd,2); - WFIFOL(fd,8) = auth_fifo[i].login_id2; - WFIFOL(fd,12) = (unsigned long)auth_fifo[i].connect_until_time; - char_dat[auth_fifo[i].char_pos].sex = auth_fifo[i].sex; - WFIFOW(fd, 16) = auth_fifo[i].packet_tmw_version; - fprintf(stderr, "From queue index %d: recalling packet version %d\n", i, auth_fifo[i].packet_tmw_version); - memcpy(WFIFOP(fd,18), &char_dat[auth_fifo[i].char_pos], sizeof(struct mmo_charstatus)); - WFIFOSET(fd, WFIFOW(fd,2)); - //printf("auth_fifo search success (auth #%d, account %d, character: %d).\n", i, RFIFOL(fd,2), RFIFOL(fd,6)); - break; - } - } - if (i == AUTH_FIFO_SIZE) { - WFIFOW(fd,0) = 0x2afe; - WFIFOL(fd,2) = RFIFOL(fd,2); - WFIFOSET(fd,6); - printf("auth_fifo search error! account %d not authentified.\n", RFIFOL(fd,2)); - } - RFIFOSKIP(fd,22); - break; - - // MAPサーバー上のユーザー数受信 - case 0x2aff: - if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - server[id].users = RFIFOW(fd,4); - if(anti_freeze_enable) - server_freezeflag[id] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed - // remove all previously online players of the server - for(i = 0; i < char_num; i++) - if (online_chars[i] == id) - online_chars[i] = -1; - // add online players in the list by [Yor] - for(i = 0; i < server[id].users; i++) { - int char_id = RFIFOL(fd,6+i*4); - for(j = 0; j < char_num; j++) - if (char_dat[j].char_id == char_id) { - online_chars[j] = id; - //printf("%d\n", char_id); - break; - } - } - if (update_online < time(NULL)) { // Time is done - update_online = time(NULL) + 8; - create_online_files(); // only every 8 sec. (normally, 1 server send users every 5 sec.) Don't update every time, because that takes time, but only every 2 connection. - // it set to 8 sec because is more than 5 (sec) and if we have more than 1 map-server, informations can be received in shifted. - } - RFIFOSKIP(fd,6+i*4); - break; - - // キャラデータ保存 - case 0x2b01: - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - for(i = 0; i < char_num; i++) { - if (char_dat[i].account_id == RFIFOL(fd,4) && - char_dat[i].char_id == RFIFOL(fd,8)) - break; - } - if (i != char_num) - memcpy(&char_dat[i], RFIFOP(fd,12), sizeof(struct mmo_charstatus)); - RFIFOSKIP(fd,RFIFOW(fd,2)); - break; - - // キャラセレ要求 - case 0x2b02: - if (RFIFOREST(fd) < 18) - return 0; - if (auth_fifo_pos >= AUTH_FIFO_SIZE) - auth_fifo_pos = 0; - //printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); - auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd,2); - auth_fifo[auth_fifo_pos].char_id = 0; - auth_fifo[auth_fifo_pos].login_id1 = RFIFOL(fd,6); - auth_fifo[auth_fifo_pos].login_id2 = RFIFOL(fd,10); - auth_fifo[auth_fifo_pos].delflag = 2; - auth_fifo[auth_fifo_pos].char_pos = 0; - auth_fifo[auth_fifo_pos].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server) - auth_fifo[auth_fifo_pos].ip = RFIFOL(fd,14); - auth_fifo_pos++; - WFIFOW(fd,0) = 0x2b03; - WFIFOL(fd,2) = RFIFOL(fd,2); - WFIFOB(fd,6) = 0; - WFIFOSET(fd,7); - RFIFOSKIP(fd,18); - break; - - // マップサーバー間移動要求 - case 0x2b05: - if (RFIFOREST(fd) < 49) - return 0; - if (auth_fifo_pos >= AUTH_FIFO_SIZE) - auth_fifo_pos = 0; - WFIFOW(fd,0) = 0x2b06; - memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 42); - //printf("auth_fifo set (auth#%d) - account: %d, secure: 0x%08x-0x%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); - auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd,2); - auth_fifo[auth_fifo_pos].char_id = RFIFOL(fd,14); - auth_fifo[auth_fifo_pos].login_id1 = RFIFOL(fd,6); - auth_fifo[auth_fifo_pos].login_id2 = RFIFOL(fd,10); - auth_fifo[auth_fifo_pos].delflag = 0; - auth_fifo[auth_fifo_pos].sex = RFIFOB(fd,44); - auth_fifo[auth_fifo_pos].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server) - auth_fifo[auth_fifo_pos].ip = RFIFOL(fd,45); - for(i = 0; i < char_num; i++) - if (char_dat[i].account_id == RFIFOL(fd,2) && - char_dat[i].char_id == RFIFOL(fd,14)) { - auth_fifo[auth_fifo_pos].char_pos = i; - auth_fifo_pos++; - WFIFOL(fd,6) = 0; - break; - } - if (i == char_num) - WFIFOW(fd,6) = 1; - WFIFOSET(fd,44); - RFIFOSKIP(fd,49); - break; - - // キャラ名検索 - case 0x2b08: - if (RFIFOREST(fd) < 6) - return 0; - for(i = 0; i < char_num; i++) { - if (char_dat[i].char_id == RFIFOL(fd,2)) - break; - } - WFIFOW(fd,0) = 0x2b09; - WFIFOL(fd,2) = RFIFOL(fd,2); - if (i != char_num) - memcpy(WFIFOP(fd,6), char_dat[i].name, 24); - else - memcpy(WFIFOP(fd,6), unknown_char_name, 24); - WFIFOSET(fd,30); - RFIFOSKIP(fd,6); - break; - - // it is a request to become GM - case 0x2b0a: - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; -// printf("parse_frommap: change gm -> login, account: %d, pass: '%s'.\n", RFIFOL(fd,4), RFIFOP(fd,8)); - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd,0) = 0x2720; - memcpy(WFIFOP(login_fd,2), RFIFOP(fd,2), RFIFOW(fd,2)-2); - WFIFOSET(login_fd, RFIFOW(fd,2)); - } else { - WFIFOW(fd,0) = 0x2b0b; - WFIFOL(fd,2) = RFIFOL(fd,4); - WFIFOL(fd,6) = 0; - WFIFOSET(fd, 10); - } - RFIFOSKIP(fd, RFIFOW(fd,2)); - break; - - // Map server send information to change an email of an account -> login-server - case 0x2b0c: - if (RFIFOREST(fd) < 86) - return 0; - if (login_fd > 0) { // don't send request if no login-server - memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), 86); // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B - WFIFOW(login_fd,0) = 0x2722; - WFIFOSET(login_fd, 86); - } - RFIFOSKIP(fd, 86); - break; - - // Map server ask char-server about a character name to do some operations (all operations are transmitted to login-server) - case 0x2b0e: - if (RFIFOREST(fd) < 44) - return 0; - { - char character_name[24]; - int acc = RFIFOL(fd,2); // account_id of who ask (-1 if nobody) - memcpy(character_name, RFIFOP(fd,6), 24); - character_name[sizeof(character_name) -1] = '\0'; - // prepare answer - WFIFOW(fd,0) = 0x2b0f; // answer - WFIFOL(fd,2) = acc; // who want do operation - WFIFOW(fd,30) = RFIFOW(fd, 30); // type of operation: 1-block, 2-ban, 3-unblock, 4-unban, 5-changesex - // search character - i = search_character_index(character_name); - if (i >= 0) { - memcpy(WFIFOP(fd,6), search_character_name(i), 24); // put correct name if found - WFIFOW(fd,32) = 0; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - switch(RFIFOW(fd, 30)) { - case 1: // block - if (acc == -1 || isGM(acc) >= isGM(char_dat[i].account_id)) { - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd,0) = 0x2724; - WFIFOL(login_fd,2) = char_dat[i].account_id; // account value - WFIFOL(login_fd,6) = 5; // status of the account - WFIFOSET(login_fd, 10); -// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 5); - } else - WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - } else - WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - break; - case 2: // ban - if (acc == -1 || isGM(acc) >= isGM(char_dat[i].account_id)) { - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd, 0) = 0x2725; - WFIFOL(login_fd, 2) = char_dat[i].account_id; // account value - WFIFOW(login_fd, 6) = RFIFOW(fd,32); // year - WFIFOW(login_fd, 8) = RFIFOW(fd,34); // month - WFIFOW(login_fd,10) = RFIFOW(fd,36); // day - WFIFOW(login_fd,12) = RFIFOW(fd,38); // hour - WFIFOW(login_fd,14) = RFIFOW(fd,40); // minute - WFIFOW(login_fd,16) = RFIFOW(fd,42); // second - WFIFOSET(login_fd,18); -// printf("char : status -> login: account %d, ban: %dy %dm %dd %dh %dmn %ds\n", -// char_dat[i].account_id, (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), (short)RFIFOW(fd,38), (short)RFIFOW(fd,40), (short)RFIFOW(fd,42)); - } else - WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - } else - WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - break; - case 3: // unblock - if (acc == -1 || isGM(acc) >= isGM(char_dat[i].account_id)) { - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd,0) = 0x2724; - WFIFOL(login_fd,2) = char_dat[i].account_id; // account value - WFIFOL(login_fd,6) = 0; // status of the account - WFIFOSET(login_fd, 10); -// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 0); - } else - WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - } else - WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - break; - case 4: // unban - if (acc == -1 || isGM(acc) >= isGM(char_dat[i].account_id)) { - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd, 0) = 0x272a; - WFIFOL(login_fd, 2) = char_dat[i].account_id; // account value - WFIFOSET(login_fd, 6); -// printf("char : status -> login: account %d, unban request\n", char_dat[i].account_id); - } else - WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - } else - WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - break; - case 5: // changesex - if (acc == -1 || isGM(acc) >= isGM(char_dat[i].account_id)) { - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd, 0) = 0x2727; - WFIFOL(login_fd, 2) = char_dat[i].account_id; // account value - WFIFOSET(login_fd, 6); -// printf("char : status -> login: account %d, change sex request\n", char_dat[i].account_id); - } else - WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - } else - WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - break; - } - } else { - // character name not found - memcpy(WFIFOP(fd,6), character_name, 24); - WFIFOW(fd,32) = 1; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - } - // send answer if a player ask, not if the server ask - if (acc != -1) { - WFIFOSET(fd, 34); - } - RFIFOSKIP(fd, 44); - break; - } - -// case 0x2b0f: not more used (available for futur usage) - - // account_reg保存要求 - case 0x2b10: - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - { - struct global_reg reg[ACCOUNT_REG2_NUM]; - int p, acc; - acc = RFIFOL(fd,4); - for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) { - memcpy(reg[j].str, RFIFOP(fd,p), 32); - reg[j].value = RFIFOL(fd, p+32); - } - set_account_reg2(acc, j, reg); - // loginサーバーへ送る - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd, 0) = 0x2728; - memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), RFIFOW(fd,2)); - WFIFOSET(login_fd, WFIFOW(login_fd,2)); - } - // ワールドへの同垢ログインがなければmapサーバーに送る必要はない - //memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2)); - //WBUFW(buf,0) = 0x2b11; - //mapif_sendall(buf, WBUFW(buf,2)); - RFIFOSKIP(fd, RFIFOW(fd,2)); -// printf("char: save_account_reg (from map)\n"); - break; - } - - // Map server is requesting a divorce - case 0x2b16: - if (RFIFOREST(fd) < 4) - return 0; - { - for (i = 0; i < char_num; i++) - if (char_dat[i].char_id == RFIFOL(fd, 2)) - break; - - if (i != char_num) - char_divorce(&char_dat[i]); - - RFIFOSKIP(fd,6); - break; - - } - - default: - // inter server処理に渡す - { - int r = inter_parse_frommap(fd); - if (r == 1) // 処理できた - break; - if (r == 2) // パケット長が足りない - return 0; - } - // inter server処理でもない場合は切断 - printf("char: unknown packet 0x%04x (%d bytes to read in buffer)! (from map).\n", RFIFOW(fd,0), RFIFOREST(fd)); - session[fd]->eof = 1; - return 0; - } - } - return 0; + (!check_ip_flag || auth_fifo[i].ip == RFIFOL (fd, 18)) + && !auth_fifo[i].delflag) + { + auth_fifo[i].delflag = 1; + WFIFOW (fd, 0) = 0x2afd; + WFIFOW (fd, 2) = 18 + sizeof (struct mmo_charstatus); + WFIFOL (fd, 4) = RFIFOL (fd, 2); + WFIFOL (fd, 8) = auth_fifo[i].login_id2; + WFIFOL (fd, 12) = + (unsigned long) auth_fifo[i].connect_until_time; + char_dat[auth_fifo[i].char_pos].sex = + auth_fifo[i].sex; + WFIFOW (fd, 16) = auth_fifo[i].packet_tmw_version; + fprintf (stderr, + "From queue index %d: recalling packet version %d\n", + i, auth_fifo[i].packet_tmw_version); + memcpy (WFIFOP (fd, 18), + &char_dat[auth_fifo[i].char_pos], + sizeof (struct mmo_charstatus)); + WFIFOSET (fd, WFIFOW (fd, 2)); + //printf("auth_fifo search success (auth #%d, account %d, character: %d).\n", i, RFIFOL(fd,2), RFIFOL(fd,6)); + break; + } + } + if (i == AUTH_FIFO_SIZE) + { + WFIFOW (fd, 0) = 0x2afe; + WFIFOL (fd, 2) = RFIFOL (fd, 2); + WFIFOSET (fd, 6); + printf + ("auth_fifo search error! account %d not authentified.\n", + RFIFOL (fd, 2)); + } + RFIFOSKIP (fd, 22); + break; + + // MAPサーバー上のユーザー数受信 + case 0x2aff: + if (RFIFOREST (fd) < 6 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + server[id].users = RFIFOW (fd, 4); + if (anti_freeze_enable) + server_freezeflag[id] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed + // remove all previously online players of the server + for (i = 0; i < char_num; i++) + if (online_chars[i] == id) + online_chars[i] = -1; + // add online players in the list by [Yor] + for (i = 0; i < server[id].users; i++) + { + int char_id = RFIFOL (fd, 6 + i * 4); + for (j = 0; j < char_num; j++) + if (char_dat[j].char_id == char_id) + { + online_chars[j] = id; + //printf("%d\n", char_id); + break; + } + } + if (update_online < time (NULL)) + { // Time is done + update_online = time (NULL) + 8; + create_online_files (); // only every 8 sec. (normally, 1 server send users every 5 sec.) Don't update every time, because that takes time, but only every 2 connection. + // it set to 8 sec because is more than 5 (sec) and if we have more than 1 map-server, informations can be received in shifted. + } + RFIFOSKIP (fd, 6 + i * 4); + break; + + // キャラデータ保存 + case 0x2b01: + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + for (i = 0; i < char_num; i++) + { + if (char_dat[i].account_id == RFIFOL (fd, 4) && + char_dat[i].char_id == RFIFOL (fd, 8)) + break; + } + if (i != char_num) + memcpy (&char_dat[i], RFIFOP (fd, 12), + sizeof (struct mmo_charstatus)); + RFIFOSKIP (fd, RFIFOW (fd, 2)); + break; + + // キャラセレ要求 + case 0x2b02: + if (RFIFOREST (fd) < 18) + return 0; + if (auth_fifo_pos >= AUTH_FIFO_SIZE) + auth_fifo_pos = 0; + //printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); + auth_fifo[auth_fifo_pos].account_id = RFIFOL (fd, 2); + auth_fifo[auth_fifo_pos].char_id = 0; + auth_fifo[auth_fifo_pos].login_id1 = RFIFOL (fd, 6); + auth_fifo[auth_fifo_pos].login_id2 = RFIFOL (fd, 10); + auth_fifo[auth_fifo_pos].delflag = 2; + auth_fifo[auth_fifo_pos].char_pos = 0; + auth_fifo[auth_fifo_pos].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server) + auth_fifo[auth_fifo_pos].ip = RFIFOL (fd, 14); + auth_fifo_pos++; + WFIFOW (fd, 0) = 0x2b03; + WFIFOL (fd, 2) = RFIFOL (fd, 2); + WFIFOB (fd, 6) = 0; + WFIFOSET (fd, 7); + RFIFOSKIP (fd, 18); + break; + + // マップサーバー間移動要求 + case 0x2b05: + if (RFIFOREST (fd) < 49) + return 0; + if (auth_fifo_pos >= AUTH_FIFO_SIZE) + auth_fifo_pos = 0; + WFIFOW (fd, 0) = 0x2b06; + memcpy (WFIFOP (fd, 2), RFIFOP (fd, 2), 42); + //printf("auth_fifo set (auth#%d) - account: %d, secure: 0x%08x-0x%08x\n", auth_fifo_pos, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); + auth_fifo[auth_fifo_pos].account_id = RFIFOL (fd, 2); + auth_fifo[auth_fifo_pos].char_id = RFIFOL (fd, 14); + auth_fifo[auth_fifo_pos].login_id1 = RFIFOL (fd, 6); + auth_fifo[auth_fifo_pos].login_id2 = RFIFOL (fd, 10); + auth_fifo[auth_fifo_pos].delflag = 0; + auth_fifo[auth_fifo_pos].sex = RFIFOB (fd, 44); + auth_fifo[auth_fifo_pos].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server) + auth_fifo[auth_fifo_pos].ip = RFIFOL (fd, 45); + for (i = 0; i < char_num; i++) + if (char_dat[i].account_id == RFIFOL (fd, 2) && + char_dat[i].char_id == RFIFOL (fd, 14)) + { + auth_fifo[auth_fifo_pos].char_pos = i; + auth_fifo_pos++; + WFIFOL (fd, 6) = 0; + break; + } + if (i == char_num) + WFIFOW (fd, 6) = 1; + WFIFOSET (fd, 44); + RFIFOSKIP (fd, 49); + break; + + // キャラ名検索 + case 0x2b08: + if (RFIFOREST (fd) < 6) + return 0; + for (i = 0; i < char_num; i++) + { + if (char_dat[i].char_id == RFIFOL (fd, 2)) + break; + } + WFIFOW (fd, 0) = 0x2b09; + WFIFOL (fd, 2) = RFIFOL (fd, 2); + if (i != char_num) + memcpy (WFIFOP (fd, 6), char_dat[i].name, 24); + else + memcpy (WFIFOP (fd, 6), unknown_char_name, 24); + WFIFOSET (fd, 30); + RFIFOSKIP (fd, 6); + break; + + // it is a request to become GM + case 0x2b0a: + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; +// printf("parse_frommap: change gm -> login, account: %d, pass: '%s'.\n", RFIFOL(fd,4), RFIFOP(fd,8)); + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x2720; + memcpy (WFIFOP (login_fd, 2), RFIFOP (fd, 2), + RFIFOW (fd, 2) - 2); + WFIFOSET (login_fd, RFIFOW (fd, 2)); + } + else + { + WFIFOW (fd, 0) = 0x2b0b; + WFIFOL (fd, 2) = RFIFOL (fd, 4); + WFIFOL (fd, 6) = 0; + WFIFOSET (fd, 10); + } + RFIFOSKIP (fd, RFIFOW (fd, 2)); + break; + + // Map server send information to change an email of an account -> login-server + case 0x2b0c: + if (RFIFOREST (fd) < 86) + return 0; + if (login_fd > 0) + { // don't send request if no login-server + memcpy (WFIFOP (login_fd, 0), RFIFOP (fd, 0), 86); // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B + WFIFOW (login_fd, 0) = 0x2722; + WFIFOSET (login_fd, 86); + } + RFIFOSKIP (fd, 86); + break; + + // Map server ask char-server about a character name to do some operations (all operations are transmitted to login-server) + case 0x2b0e: + if (RFIFOREST (fd) < 44) + return 0; + { + char character_name[24]; + int acc = RFIFOL (fd, 2); // account_id of who ask (-1 if nobody) + memcpy (character_name, RFIFOP (fd, 6), 24); + character_name[sizeof (character_name) - 1] = '\0'; + // prepare answer + WFIFOW (fd, 0) = 0x2b0f; // answer + WFIFOL (fd, 2) = acc; // who want do operation + WFIFOW (fd, 30) = RFIFOW (fd, 30); // type of operation: 1-block, 2-ban, 3-unblock, 4-unban, 5-changesex + // search character + i = search_character_index (character_name); + if (i >= 0) + { + memcpy (WFIFOP (fd, 6), search_character_name (i), 24); // put correct name if found + WFIFOW (fd, 32) = 0; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + switch (RFIFOW (fd, 30)) + { + case 1: // block + if (acc == -1 + || isGM (acc) >= + isGM (char_dat[i].account_id)) + { + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x2724; + WFIFOL (login_fd, 2) = char_dat[i].account_id; // account value + WFIFOL (login_fd, 6) = 5; // status of the account + WFIFOSET (login_fd, 10); +// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 5); + } + else + WFIFOW (fd, 32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + } + else + WFIFOW (fd, 32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + break; + case 2: // ban + if (acc == -1 + || isGM (acc) >= + isGM (char_dat[i].account_id)) + { + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x2725; + WFIFOL (login_fd, 2) = char_dat[i].account_id; // account value + WFIFOW (login_fd, 6) = RFIFOW (fd, 32); // year + WFIFOW (login_fd, 8) = RFIFOW (fd, 34); // month + WFIFOW (login_fd, 10) = RFIFOW (fd, 36); // day + WFIFOW (login_fd, 12) = RFIFOW (fd, 38); // hour + WFIFOW (login_fd, 14) = RFIFOW (fd, 40); // minute + WFIFOW (login_fd, 16) = RFIFOW (fd, 42); // second + WFIFOSET (login_fd, 18); +// printf("char : status -> login: account %d, ban: %dy %dm %dd %dh %dmn %ds\n", +// char_dat[i].account_id, (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), (short)RFIFOW(fd,38), (short)RFIFOW(fd,40), (short)RFIFOW(fd,42)); + } + else + WFIFOW (fd, 32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + } + else + WFIFOW (fd, 32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + break; + case 3: // unblock + if (acc == -1 + || isGM (acc) >= + isGM (char_dat[i].account_id)) + { + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x2724; + WFIFOL (login_fd, 2) = char_dat[i].account_id; // account value + WFIFOL (login_fd, 6) = 0; // status of the account + WFIFOSET (login_fd, 10); +// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 0); + } + else + WFIFOW (fd, 32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + } + else + WFIFOW (fd, 32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + break; + case 4: // unban + if (acc == -1 + || isGM (acc) >= + isGM (char_dat[i].account_id)) + { + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x272a; + WFIFOL (login_fd, 2) = char_dat[i].account_id; // account value + WFIFOSET (login_fd, 6); +// printf("char : status -> login: account %d, unban request\n", char_dat[i].account_id); + } + else + WFIFOW (fd, 32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + } + else + WFIFOW (fd, 32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + break; + case 5: // changesex + if (acc == -1 + || isGM (acc) >= + isGM (char_dat[i].account_id)) + { + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x2727; + WFIFOL (login_fd, 2) = char_dat[i].account_id; // account value + WFIFOSET (login_fd, 6); +// printf("char : status -> login: account %d, change sex request\n", char_dat[i].account_id); + } + else + WFIFOW (fd, 32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + } + else + WFIFOW (fd, 32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + break; + } + } + else + { + // character name not found + memcpy (WFIFOP (fd, 6), character_name, 24); + WFIFOW (fd, 32) = 1; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + } + // send answer if a player ask, not if the server ask + if (acc != -1) + { + WFIFOSET (fd, 34); + } + RFIFOSKIP (fd, 44); + break; + } + +// case 0x2b0f: not more used (available for futur usage) + + // account_reg保存要求 + case 0x2b10: + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + { + struct global_reg reg[ACCOUNT_REG2_NUM]; + int p, acc; + acc = RFIFOL (fd, 4); + for (p = 8, j = 0; + p < RFIFOW (fd, 2) && j < ACCOUNT_REG2_NUM; + p += 36, j++) + { + memcpy (reg[j].str, RFIFOP (fd, p), 32); + reg[j].value = RFIFOL (fd, p + 32); + } + set_account_reg2 (acc, j, reg); + // loginサーバーへ送る + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x2728; + memcpy (WFIFOP (login_fd, 0), RFIFOP (fd, 0), + RFIFOW (fd, 2)); + WFIFOSET (login_fd, WFIFOW (login_fd, 2)); + } + // ワールドへの同垢ログインがなければmapサーバーに送る必要はない + //memcpy(buf, RFIFOP(fd,0), RFIFOW(fd,2)); + //WBUFW(buf,0) = 0x2b11; + //mapif_sendall(buf, WBUFW(buf,2)); + RFIFOSKIP (fd, RFIFOW (fd, 2)); +// printf("char: save_account_reg (from map)\n"); + break; + } + + // Map server is requesting a divorce + case 0x2b16: + if (RFIFOREST (fd) < 4) + return 0; + { + for (i = 0; i < char_num; i++) + if (char_dat[i].char_id == RFIFOL (fd, 2)) + break; + + if (i != char_num) + char_divorce (&char_dat[i]); + + RFIFOSKIP (fd, 6); + break; + + } + + default: + // inter server処理に渡す + { + int r = inter_parse_frommap (fd); + if (r == 1) // 処理できた + break; + if (r == 2) // パケット長が足りない + return 0; + } + // inter server処理でもない場合は切断 + printf + ("char: unknown packet 0x%04x (%d bytes to read in buffer)! (from map).\n", + RFIFOW (fd, 0), RFIFOREST (fd)); + session[fd]->eof = 1; + return 0; + } + } + return 0; } -int search_mapserver(char *map) { - int i, j; - char temp_map[16]; - int temp_map_len; - -// printf("Searching the map-server for map '%s'... ", map); - strncpy(temp_map, map, sizeof(temp_map)); - temp_map[sizeof(temp_map)-1] = '\0'; - if (strchr(temp_map, '.') != NULL) - temp_map[strchr(temp_map, '.') - temp_map + 1] = '\0'; // suppress the '.gat', but conserve the '.' to be sure of the name of the map - - temp_map_len = strlen(temp_map); - for(i = 0; i < MAX_MAP_SERVERS; i++) - if (server_fd[i] >= 0) - for (j = 0; server[i].map[j][0]; j++) - //printf("%s : %s = %d\n", server[i].map[j], map, strncmp(server[i].map[j], temp_map, temp_map_len)); - if (strncmp(server[i].map[j], temp_map, temp_map_len) == 0) { -// printf("found -> server #%d.\n", i); - return i; - } - -// printf("not found.\n"); - return -1; +int search_mapserver (char *map) +{ + int i, j; + char temp_map[16]; + int temp_map_len; + +// printf("Searching the map-server for map '%s'... ", map); + strncpy (temp_map, map, sizeof (temp_map)); + temp_map[sizeof (temp_map) - 1] = '\0'; + if (strchr (temp_map, '.') != NULL) + temp_map[strchr (temp_map, '.') - temp_map + 1] = '\0'; // suppress the '.gat', but conserve the '.' to be sure of the name of the map + + temp_map_len = strlen (temp_map); + for (i = 0; i < MAX_MAP_SERVERS; i++) + if (server_fd[i] >= 0) + for (j = 0; server[i].map[j][0]; j++) + //printf("%s : %s = %d\n", server[i].map[j], map, strncmp(server[i].map[j], temp_map, temp_map_len)); + if (strncmp (server[i].map[j], temp_map, temp_map_len) == 0) + { +// printf("found -> server #%d.\n", i); + return i; + } + +// printf("not found.\n"); + return -1; } // char_mapifの初期化処理(現在はinter_mapif初期化のみ) -static int char_mapif_init(int fd) { - return inter_mapif_init(fd); +static int char_mapif_init (int fd) +{ + return inter_mapif_init (fd); } //----------------------------------------------------- // Test to know if an IP come from LAN or WAN. by [Yor] //----------------------------------------------------- -int lan_ip_check(unsigned char *p){ - int i; - int lancheck = 1; - -// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n", -// p[0], p[1], p[2], p[3], -// subneti[0], subneti[1], subneti[2], subneti[3], -// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]); - for(i = 0; i < 4; i++) { - if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) { - lancheck = 0; - break; - } - } - printf("LAN test (result): %s source\033[0m.\n", (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN"); - return lancheck; +int lan_ip_check (unsigned char *p) +{ + int i; + int lancheck = 1; + +// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n", +// p[0], p[1], p[2], p[3], +// subneti[0], subneti[1], subneti[2], subneti[3], +// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]); + for (i = 0; i < 4; i++) + { + if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) + { + lancheck = 0; + break; + } + } + printf ("LAN test (result): %s source\033[0m.\n", + (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN"); + return lancheck; } -int parse_char(int fd) { - int i, ch; - char email[40]; - struct char_session_data *sd; - unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; - - if (login_fd < 0 || session[fd]->eof) { // disconnect any player (already connected to char-server or coming back from map-server) if login-server is diconnected. - if (fd == login_fd) - login_fd = -1; - close(fd); - delete_session(fd); - return 0; - } - - sd = session[fd]->session_data; - - while (RFIFOREST(fd) >= 2) { -// if (RFIFOW(fd,0) < 30000) -// printf("parse_char: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd)); - - switch(RFIFOW(fd,0)) { - case 0x20b: //20040622暗号化ragexe対応 - if (RFIFOREST(fd) < 19) - return 0; - RFIFOSKIP(fd,19); - break; - - case 0x61: // change password request - if (RFIFOREST(fd) < 50) - return 0; - { - WFIFOW(login_fd,0) = 0x2740; - WFIFOL(login_fd,2) = sd->account_id; - memcpy(WFIFOP(login_fd,6), RFIFOP(fd,2), 24); - memcpy(WFIFOP(login_fd,30), RFIFOP(fd,26), 24); - WFIFOSET(login_fd,54); - } - RFIFOSKIP(fd,50); - break; - - case 0x65: // 接続要求 - if (RFIFOREST(fd) < 17) - return 0; - { - int GM_value; - if ((GM_value = isGM(RFIFOL(fd,2)))) - printf("Account Logged On; Account ID: %d (GM level %d).\n", RFIFOL(fd,2), GM_value); - else - printf("Account Logged On; Account ID: %d.\n", RFIFOL(fd,2)); - if (sd == NULL) { - sd = session[fd]->session_data = calloc(sizeof(struct char_session_data), 1); - memset(sd, 0, sizeof(struct char_session_data)); - memcpy(sd->email, "no mail", 40); // put here a mail without '@' to refuse deletion if we don't receive the e-mail - sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server) - } - sd->account_id = RFIFOL(fd,2); - sd->login_id1 = RFIFOL(fd,6); - sd->login_id2 = RFIFOL(fd,10); - sd->packet_tmw_version = RFIFOW(fd, 14); - sd->sex = RFIFOB(fd,16); - // send back account_id - WFIFOL(fd,0) = RFIFOL(fd,2); - WFIFOSET(fd,4); - // search authentification - for(i = 0; i < AUTH_FIFO_SIZE; i++) { - if (auth_fifo[i].account_id == sd->account_id && - auth_fifo[i].login_id1 == sd->login_id1 && +int parse_char (int fd) +{ + int i, ch; + char email[40]; + struct char_session_data *sd; + unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; + + if (login_fd < 0 || session[fd]->eof) + { // disconnect any player (already connected to char-server or coming back from map-server) if login-server is diconnected. + if (fd == login_fd) + login_fd = -1; + close (fd); + delete_session (fd); + return 0; + } + + sd = session[fd]->session_data; + + while (RFIFOREST (fd) >= 2) + { +// if (RFIFOW(fd,0) < 30000) +// printf("parse_char: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd)); + + switch (RFIFOW (fd, 0)) + { + case 0x20b: //20040622暗号化ragexe対応 + if (RFIFOREST (fd) < 19) + return 0; + RFIFOSKIP (fd, 19); + break; + + case 0x61: // change password request + if (RFIFOREST (fd) < 50) + return 0; + { + WFIFOW (login_fd, 0) = 0x2740; + WFIFOL (login_fd, 2) = sd->account_id; + memcpy (WFIFOP (login_fd, 6), RFIFOP (fd, 2), 24); + memcpy (WFIFOP (login_fd, 30), RFIFOP (fd, 26), 24); + WFIFOSET (login_fd, 54); + } + RFIFOSKIP (fd, 50); + break; + + case 0x65: // 接続要求 + if (RFIFOREST (fd) < 17) + return 0; + { + int GM_value; + if ((GM_value = isGM (RFIFOL (fd, 2)))) + printf + ("Account Logged On; Account ID: %d (GM level %d).\n", + RFIFOL (fd, 2), GM_value); + else + printf ("Account Logged On; Account ID: %d.\n", + RFIFOL (fd, 2)); + if (sd == NULL) + { + sd = session[fd]->session_data = + calloc (sizeof (struct char_session_data), 1); + memset (sd, 0, sizeof (struct char_session_data)); + memcpy (sd->email, "no mail", 40); // put here a mail without '@' to refuse deletion if we don't receive the e-mail + sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server) + } + sd->account_id = RFIFOL (fd, 2); + sd->login_id1 = RFIFOL (fd, 6); + sd->login_id2 = RFIFOL (fd, 10); + sd->packet_tmw_version = RFIFOW (fd, 14); + sd->sex = RFIFOB (fd, 16); + // send back account_id + WFIFOL (fd, 0) = RFIFOL (fd, 2); + WFIFOSET (fd, 4); + // search authentification + for (i = 0; i < AUTH_FIFO_SIZE; i++) + { + if (auth_fifo[i].account_id == sd->account_id && + auth_fifo[i].login_id1 == sd->login_id1 && #if CMP_AUTHFIFO_LOGIN2 != 0 - auth_fifo[i].login_id2 == sd->login_id2 && // relate to the versions higher than 18 + auth_fifo[i].login_id2 == sd->login_id2 && // relate to the versions higher than 18 #endif - (!check_ip_flag || auth_fifo[i].ip == session[fd]->client_addr.sin_addr.s_addr) && - auth_fifo[i].delflag == 2) { - auth_fifo[i].delflag = 1; - if (max_connect_user == 0 || count_users() < max_connect_user) { - if (login_fd > 0) { // don't send request if no login-server - // request to login-server to obtain e-mail/time limit - WFIFOW(login_fd,0) = 0x2716; - WFIFOL(login_fd,2) = sd->account_id; - WFIFOSET(login_fd,6); - } - // Record client version - auth_fifo[i].packet_tmw_version = sd->packet_tmw_version; - // send characters to player - mmo_char_send006b(fd, sd); - } else { - // refuse connection (over populated) - WFIFOW(fd,0) = 0x6c; - WFIFOW(fd,2) = 0; - WFIFOSET(fd,3); - } - break; - } - } - // authentification not found - if (i == AUTH_FIFO_SIZE) { - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd,0) = 0x2712; // ask login-server to authentify an account - WFIFOL(login_fd,2) = sd->account_id; - WFIFOL(login_fd,6) = sd->login_id1; - WFIFOL(login_fd,10) = sd->login_id2; // relate to the versions higher than 18 - WFIFOB(login_fd,14) = sd->sex; - WFIFOL(login_fd,15) = session[fd]->client_addr.sin_addr.s_addr; - WFIFOSET(login_fd,19); - } else { // if no login-server, we must refuse connection - WFIFOW(fd,0) = 0x6c; - WFIFOW(fd,2) = 0; - WFIFOSET(fd,3); - } - } - } - RFIFOSKIP(fd,17); - break; - - case 0x66: // キャラ選択 - if (!sd || RFIFOREST(fd) < 3) - return 0; - - // if we activated email creation and email is default email - if (email_creation != 0 && strcmp(sd->email, "a@a.com") == 0 && login_fd > 0) { // to modify an e-mail, login-server must be online - WFIFOW(fd, 0) = 0x70; - WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address - WFIFOSET(fd, 3); - - // otherwise, load the character - } else { - for (ch = 0; ch < 9; ch++) - if (sd->found_char[ch] >= 0 && char_dat[sd->found_char[ch]].char_num == RFIFOB(fd,2)) - break; - if (ch != 9) { - char_log("Character Selected, Account ID: %d, Character Slot: %d, Character Name: %s." RETCODE, - sd->account_id, RFIFOB(fd,2), char_dat[sd->found_char[ch]].name); - // searching map server - i = search_mapserver(char_dat[sd->found_char[ch]].last_point.map); - // if map is not found, we check major cities - if (i < 0) { - if ((i = search_mapserver("prontera.gat")) >= 0) { // check is done without 'gat'. - memcpy(char_dat[sd->found_char[ch]].last_point.map, "prontera.gat", 16); - char_dat[sd->found_char[ch]].last_point.x = 273; // savepoint coordonates - char_dat[sd->found_char[ch]].last_point.y = 354; - } else if ((i = search_mapserver("geffen.gat")) >= 0) { // check is done without 'gat'. - memcpy(char_dat[sd->found_char[ch]].last_point.map, "geffen.gat", 16); - char_dat[sd->found_char[ch]].last_point.x = 120; // savepoint coordonates - char_dat[sd->found_char[ch]].last_point.y = 100; - } else if ((i = search_mapserver("morocc.gat")) >= 0) { // check is done without 'gat'. - memcpy(char_dat[sd->found_char[ch]].last_point.map, "morocc.gat", 16); - char_dat[sd->found_char[ch]].last_point.x = 160; // savepoint coordonates - char_dat[sd->found_char[ch]].last_point.y = 94; - } else if ((i = search_mapserver("alberta.gat")) >= 0) { // check is done without 'gat'. - memcpy(char_dat[sd->found_char[ch]].last_point.map, "alberta.gat", 16); - char_dat[sd->found_char[ch]].last_point.x = 116; // savepoint coordonates - char_dat[sd->found_char[ch]].last_point.y = 57; - } else if ((i = search_mapserver("payon.gat")) >= 0) { // check is done without 'gat'. - memcpy(char_dat[sd->found_char[ch]].last_point.map, "payon.gat", 16); - char_dat[sd->found_char[ch]].last_point.x = 87; // savepoint coordonates - char_dat[sd->found_char[ch]].last_point.y = 117; - } else if ((i = search_mapserver("izlude.gat")) >= 0) { // check is done without 'gat'. - memcpy(char_dat[sd->found_char[ch]].last_point.map, "izlude.gat", 16); - char_dat[sd->found_char[ch]].last_point.x = 94; // savepoint coordonates - char_dat[sd->found_char[ch]].last_point.y = 103; - } else { - int j; - // get first online server (with a map) - i = 0; - for(j = 0; j < MAX_MAP_SERVERS; j++) - if (server_fd[j] >= 0 && server[j].map[0][0]) { // change save point to one of map found on the server (the first) - i = j; - memcpy(char_dat[sd->found_char[ch]].last_point.map, server[j].map[0], 16); - printf("Map-server #%d found with a map: '%s'.\n", j, server[j].map[0]); - // coordonates are unknown - break; - } - // if no map-server is connected, we send: server closed - if (j == MAX_MAP_SERVERS) { - WFIFOW(fd,0) = 0x81; - WFIFOL(fd,2) = 1; // 01 = Server closed - WFIFOSET(fd,3); - RFIFOSKIP(fd,3); - break; - } - } - } - WFIFOW(fd,0) = 0x71; - WFIFOL(fd,2) = char_dat[sd->found_char[ch]].char_id; - memcpy(WFIFOP(fd,6), char_dat[sd->found_char[ch]].last_point.map, 16); - printf("Character selection '%s' (account: %d, slot: %d).\n", char_dat[sd->found_char[ch]].name, sd->account_id, ch); - printf("--Send IP of map-server. "); - if (lan_ip_check(p)) - WFIFOL(fd, 22) = inet_addr(lan_map_ip); - else - WFIFOL(fd, 22) = server[i].ip; - WFIFOW(fd,26) = server[i].port; - WFIFOSET(fd,28); - if (auth_fifo_pos >= AUTH_FIFO_SIZE) - auth_fifo_pos = 0; - //printf("auth_fifo set #%d - account %d, char: %d, secure: %08x-%08x\n", auth_fifo_pos, sd->account_id, char_dat[sd->found_char[ch]].char_id, sd->login_id1, sd->login_id2); - auth_fifo[auth_fifo_pos].account_id = sd->account_id; - auth_fifo[auth_fifo_pos].char_id = char_dat[sd->found_char[ch]].char_id; - auth_fifo[auth_fifo_pos].login_id1 = sd->login_id1; - auth_fifo[auth_fifo_pos].login_id2 = sd->login_id2; - auth_fifo[auth_fifo_pos].delflag = 0; - auth_fifo[auth_fifo_pos].char_pos = sd->found_char[ch]; - auth_fifo[auth_fifo_pos].sex = sd->sex; - auth_fifo[auth_fifo_pos].connect_until_time = sd->connect_until_time; - auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr; - auth_fifo[auth_fifo_pos].packet_tmw_version = sd->packet_tmw_version; - auth_fifo_pos++; - } - } - RFIFOSKIP(fd,3); - break; - - case 0x67: // 作成 - if (!sd || RFIFOREST(fd) < 37) - return 0; - i = make_new_char(fd, RFIFOP(fd,2)); - if (i < 0) { - WFIFOW(fd,0) = 0x6e; - WFIFOB(fd,2) = 0x00; - WFIFOSET(fd,3); - RFIFOSKIP(fd,37); - break; - } - - WFIFOW(fd,0) = 0x6d; - memset(WFIFOP(fd,2), 0, 106); - - WFIFOL(fd,2) = char_dat[i].char_id; - WFIFOL(fd,2+4) = char_dat[i].base_exp; - WFIFOL(fd,2+8) = char_dat[i].zeny; - WFIFOL(fd,2+12) = char_dat[i].job_exp; - WFIFOL(fd,2+16) = char_dat[i].job_level; - - WFIFOL(fd,2+28) = char_dat[i].karma; - WFIFOL(fd,2+32) = char_dat[i].manner; - - WFIFOW(fd,2+40) = 0x30; - WFIFOW(fd,2+42) = (char_dat[i].hp > 0x7fff) ? 0x7fff : char_dat[i].hp; - WFIFOW(fd,2+44) = (char_dat[i].max_hp > 0x7fff) ? 0x7fff : char_dat[i].max_hp; - WFIFOW(fd,2+46) = (char_dat[i].sp > 0x7fff) ? 0x7fff : char_dat[i].sp; - WFIFOW(fd,2+48) = (char_dat[i].max_sp > 0x7fff) ? 0x7fff : char_dat[i].max_sp; - WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].speed; - WFIFOW(fd,2+52) = char_dat[i].class; - WFIFOW(fd,2+54) = char_dat[i].hair; - - WFIFOW(fd,2+58) = char_dat[i].base_level; - WFIFOW(fd,2+60) = char_dat[i].skill_point; - - WFIFOW(fd,2+64) = char_dat[i].shield; - WFIFOW(fd,2+66) = char_dat[i].head_top; - WFIFOW(fd,2+68) = char_dat[i].head_mid; - WFIFOW(fd,2+70) = char_dat[i].hair_color; - - memcpy(WFIFOP(fd,2+74), char_dat[i].name, 24); - - WFIFOB(fd,2+98) = (char_dat[i].str > 255) ? 255 : char_dat[i].str; - WFIFOB(fd,2+99) = (char_dat[i].agi > 255) ? 255 : char_dat[i].agi; - WFIFOB(fd,2+100) = (char_dat[i].vit > 255) ? 255 : char_dat[i].vit; - WFIFOB(fd,2+101) = (char_dat[i].int_ > 255) ? 255 : char_dat[i].int_; - WFIFOB(fd,2+102) = (char_dat[i].dex > 255) ? 255 : char_dat[i].dex; - WFIFOB(fd,2+103) = (char_dat[i].luk > 255) ? 255 : char_dat[i].luk; - WFIFOB(fd,2+104) = char_dat[i].char_num; - - WFIFOSET(fd,108); - RFIFOSKIP(fd,37); - for(ch = 0; ch < 9; ch++) { - if (sd->found_char[ch] == -1) { - sd->found_char[ch] = i; - break; - } - } - - case 0x68: // delete char //Yor's Fix - if (!sd || RFIFOREST(fd) < 46) - return 0; - memcpy(email, RFIFOP(fd,6), 40); - if (e_mail_check(email) == 0) - strncpy(email, "a@a.com", 40); // default e-mail - - // if we activated email creation and email is default email - if (email_creation != 0 && strcmp(sd->email, "a@a.com") == 0 && login_fd > 0) { // to modify an e-mail, login-server must be online - // if sended email is incorrect e-mail - if (strcmp(email, "a@a.com") == 0) { - WFIFOW(fd, 0) = 0x70; - WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address - WFIFOSET(fd, 3); - RFIFOSKIP(fd,46); - // we act like we have selected a character - } else { - // we change the packet to set it like selection. - for (i = 0; i < 9; i++) - if (char_dat[sd->found_char[i]].char_id == RFIFOL(fd,2)) { - // we save new e-mail - memcpy(sd->email, email, 40); - // we send new e-mail to login-server ('online' login-server is checked before) - WFIFOW(login_fd,0) = 0x2715; - WFIFOL(login_fd,2) = sd->account_id; - memcpy(WFIFOP(login_fd, 6), email, 40); - WFIFOSET(login_fd,46); - // skip part of the packet! (46, but leave the size of select packet: 3) - RFIFOSKIP(fd,43); - // change value to put new packet (char selection) - RFIFOW(fd, 0) = 0x66; - RFIFOB(fd, 2) = char_dat[sd->found_char[i]].char_num; - // not send packet, it's modify of actual packet - break; - } - if (i == 9) { - WFIFOW(fd, 0) = 0x70; - WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address - WFIFOSET(fd, 3); - RFIFOSKIP(fd,46); - } - } - - // otherwise, we delete the character - } else { - /*if (strcmpi(email, sd->email) != 0) { // if it's an invalid email - WFIFOW(fd, 0) = 0x70; - WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address - WFIFOSET(fd, 3); - // if mail is correct - } else {*/ - for (i = 0; i < 9; i++) { - struct mmo_charstatus *cs = NULL; - if (sd->found_char[i] >= 0 && (cs = &char_dat[sd->found_char[i]])->char_id == RFIFOL(fd,2)) { - char_delete(cs); // deletion process - - if (sd->found_char[i] != char_num - 1) { - memcpy(&char_dat[sd->found_char[i]], &char_dat[char_num-1], sizeof(struct mmo_charstatus)); - // Correct moved character reference in the character's owner - { - int j, k; - struct char_session_data *sd2; - for (j = 0; j < fd_max; j++) { - if (session[j] && (sd2 = session[j]->session_data) && - sd2->account_id == char_dat[char_num-1].account_id) { - for (k = 0; k < 9; k++) { - if (sd2->found_char[k] == char_num-1) { - sd2->found_char[k] = sd->found_char[i]; - break; - } - } - break; - } - } - } - } - - char_num--; - for(ch = i; ch < 9-1; ch++) - sd->found_char[ch] = sd->found_char[ch+1]; - sd->found_char[8] = -1; - WFIFOW(fd,0) = 0x6f; - WFIFOSET(fd,2); - break; - } - } - - if (i == 9) { - WFIFOW(fd,0) = 0x70; - WFIFOB(fd,2) = 0; - WFIFOSET(fd,3); - } - //} - RFIFOSKIP(fd,46); - } - break; - - case 0x2af8: // マップサーバーログイン - if (RFIFOREST(fd) < 60) - return 0; - WFIFOW(fd,0) = 0x2af9; - for(i = 0; i < MAX_MAP_SERVERS; i++) { - if (server_fd[i] < 0) - break; - } - if (i == MAX_MAP_SERVERS || strcmp(RFIFOP(fd,2), userid) || strcmp(RFIFOP(fd,26), passwd)){ - WFIFOB(fd,2) = 3; - WFIFOSET(fd,3); - RFIFOSKIP(fd,60); - } else { - int len; - WFIFOB(fd,2) = 0; - session[fd]->func_parse = parse_frommap; - server_fd[i] = fd; - if(anti_freeze_enable) - server_freezeflag[i] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed - server[i].ip = RFIFOL(fd,54); - server[i].port = RFIFOW(fd,58); - server[i].users = 0; - memset(server[i].map, 0, sizeof(server[i].map)); - WFIFOSET(fd,3); - RFIFOSKIP(fd,60); - realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); - char_mapif_init(fd); - // send gm acccounts level to map-servers - len = 4; - WFIFOW(fd,0) = 0x2b15; - for(i = 0; i < GM_num; i++) { - WFIFOL(fd,len) = gm_account[i].account_id; - WFIFOB(fd,len+4) = (unsigned char)gm_account[i].level; - len += 5; - } - WFIFOW(fd,2) = len; - WFIFOSET(fd,len); - return 0; - } - break; - - case 0x187: // Alive信号? - if (RFIFOREST(fd) < 6) - return 0; - RFIFOSKIP(fd, 6); - break; - - case 0x7530: // Athena情報所得 - WFIFOW(fd,0) = 0x7531; - WFIFOB(fd,2) = ATHENA_MAJOR_VERSION; - WFIFOB(fd,3) = ATHENA_MINOR_VERSION; - WFIFOB(fd,4) = ATHENA_REVISION; - WFIFOB(fd,5) = ATHENA_RELEASE_FLAG; - WFIFOB(fd,6) = ATHENA_OFFICIAL_FLAG; - WFIFOB(fd,7) = ATHENA_SERVER_INTER | ATHENA_SERVER_CHAR; - WFIFOW(fd,8) = ATHENA_MOD_VERSION; - WFIFOSET(fd,10); - RFIFOSKIP(fd,2); - return 0; - - case 0x7532: // 接続の切断(defaultと処理は一緒だが明示的にするため) - session[fd]->eof = 1; - return 0; - - default: - session[fd]->eof = 1; - return 0; - } - } - RFIFOFLUSH(fd); - return 0; + (!check_ip_flag + || auth_fifo[i].ip == + session[fd]->client_addr.sin_addr.s_addr) + && auth_fifo[i].delflag == 2) + { + auth_fifo[i].delflag = 1; + if (max_connect_user == 0 + || count_users () < max_connect_user) + { + if (login_fd > 0) + { // don't send request if no login-server + // request to login-server to obtain e-mail/time limit + WFIFOW (login_fd, 0) = 0x2716; + WFIFOL (login_fd, 2) = sd->account_id; + WFIFOSET (login_fd, 6); + } + // Record client version + auth_fifo[i].packet_tmw_version = + sd->packet_tmw_version; + // send characters to player + mmo_char_send006b (fd, sd); + } + else + { + // refuse connection (over populated) + WFIFOW (fd, 0) = 0x6c; + WFIFOW (fd, 2) = 0; + WFIFOSET (fd, 3); + } + break; + } + } + // authentification not found + if (i == AUTH_FIFO_SIZE) + { + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x2712; // ask login-server to authentify an account + WFIFOL (login_fd, 2) = sd->account_id; + WFIFOL (login_fd, 6) = sd->login_id1; + WFIFOL (login_fd, 10) = sd->login_id2; // relate to the versions higher than 18 + WFIFOB (login_fd, 14) = sd->sex; + WFIFOL (login_fd, 15) = + session[fd]->client_addr.sin_addr.s_addr; + WFIFOSET (login_fd, 19); + } + else + { // if no login-server, we must refuse connection + WFIFOW (fd, 0) = 0x6c; + WFIFOW (fd, 2) = 0; + WFIFOSET (fd, 3); + } + } + } + RFIFOSKIP (fd, 17); + break; + + case 0x66: // キャラ選択 + if (!sd || RFIFOREST (fd) < 3) + return 0; + + // if we activated email creation and email is default email + if (email_creation != 0 && strcmp (sd->email, "a@a.com") == 0 + && login_fd > 0) + { // to modify an e-mail, login-server must be online + WFIFOW (fd, 0) = 0x70; + WFIFOB (fd, 2) = 0; // 00 = Incorrect Email address + WFIFOSET (fd, 3); + + // otherwise, load the character + } + else + { + for (ch = 0; ch < 9; ch++) + if (sd->found_char[ch] >= 0 + && char_dat[sd->found_char[ch]].char_num == + RFIFOB (fd, 2)) + break; + if (ch != 9) + { + char_log + ("Character Selected, Account ID: %d, Character Slot: %d, Character Name: %s." + RETCODE, sd->account_id, RFIFOB (fd, 2), + char_dat[sd->found_char[ch]].name); + // searching map server + i = search_mapserver (char_dat + [sd->found_char[ch]].last_point. + map); + // if map is not found, we check major cities + if (i < 0) + { + if ((i = search_mapserver ("prontera.gat")) >= 0) + { // check is done without 'gat'. + memcpy (char_dat + [sd->found_char[ch]].last_point.map, + "prontera.gat", 16); + char_dat[sd->found_char[ch]].last_point.x = 273; // savepoint coordonates + char_dat[sd->found_char[ch]].last_point.y = + 354; + } + else if ((i = + search_mapserver ("geffen.gat")) >= 0) + { // check is done without 'gat'. + memcpy (char_dat + [sd->found_char[ch]].last_point.map, + "geffen.gat", 16); + char_dat[sd->found_char[ch]].last_point.x = 120; // savepoint coordonates + char_dat[sd->found_char[ch]].last_point.y = + 100; + } + else if ((i = + search_mapserver ("morocc.gat")) >= 0) + { // check is done without 'gat'. + memcpy (char_dat + [sd->found_char[ch]].last_point.map, + "morocc.gat", 16); + char_dat[sd->found_char[ch]].last_point.x = 160; // savepoint coordonates + char_dat[sd->found_char[ch]].last_point.y = + 94; + } + else if ((i = + search_mapserver ("alberta.gat")) >= 0) + { // check is done without 'gat'. + memcpy (char_dat + [sd->found_char[ch]].last_point.map, + "alberta.gat", 16); + char_dat[sd->found_char[ch]].last_point.x = 116; // savepoint coordonates + char_dat[sd->found_char[ch]].last_point.y = + 57; + } + else if ((i = + search_mapserver ("payon.gat")) >= 0) + { // check is done without 'gat'. + memcpy (char_dat + [sd->found_char[ch]].last_point.map, + "payon.gat", 16); + char_dat[sd->found_char[ch]].last_point.x = 87; // savepoint coordonates + char_dat[sd->found_char[ch]].last_point.y = + 117; + } + else if ((i = + search_mapserver ("izlude.gat")) >= 0) + { // check is done without 'gat'. + memcpy (char_dat + [sd->found_char[ch]].last_point.map, + "izlude.gat", 16); + char_dat[sd->found_char[ch]].last_point.x = 94; // savepoint coordonates + char_dat[sd->found_char[ch]].last_point.y = + 103; + } + else + { + int j; + // get first online server (with a map) + i = 0; + for (j = 0; j < MAX_MAP_SERVERS; j++) + if (server_fd[j] >= 0 + && server[j].map[0][0]) + { // change save point to one of map found on the server (the first) + i = j; + memcpy (char_dat + [sd-> + found_char[ch]].last_point. + map, server[j].map[0], 16); + printf + ("Map-server #%d found with a map: '%s'.\n", + j, server[j].map[0]); + // coordonates are unknown + break; + } + // if no map-server is connected, we send: server closed + if (j == MAX_MAP_SERVERS) + { + WFIFOW (fd, 0) = 0x81; + WFIFOL (fd, 2) = 1; // 01 = Server closed + WFIFOSET (fd, 3); + RFIFOSKIP (fd, 3); + break; + } + } + } + WFIFOW (fd, 0) = 0x71; + WFIFOL (fd, 2) = char_dat[sd->found_char[ch]].char_id; + memcpy (WFIFOP (fd, 6), + char_dat[sd->found_char[ch]].last_point.map, + 16); + printf + ("Character selection '%s' (account: %d, slot: %d).\n", + char_dat[sd->found_char[ch]].name, + sd->account_id, ch); + printf ("--Send IP of map-server. "); + if (lan_ip_check (p)) + WFIFOL (fd, 22) = inet_addr (lan_map_ip); + else + WFIFOL (fd, 22) = server[i].ip; + WFIFOW (fd, 26) = server[i].port; + WFIFOSET (fd, 28); + if (auth_fifo_pos >= AUTH_FIFO_SIZE) + auth_fifo_pos = 0; + //printf("auth_fifo set #%d - account %d, char: %d, secure: %08x-%08x\n", auth_fifo_pos, sd->account_id, char_dat[sd->found_char[ch]].char_id, sd->login_id1, sd->login_id2); + auth_fifo[auth_fifo_pos].account_id = sd->account_id; + auth_fifo[auth_fifo_pos].char_id = + char_dat[sd->found_char[ch]].char_id; + auth_fifo[auth_fifo_pos].login_id1 = sd->login_id1; + auth_fifo[auth_fifo_pos].login_id2 = sd->login_id2; + auth_fifo[auth_fifo_pos].delflag = 0; + auth_fifo[auth_fifo_pos].char_pos = + sd->found_char[ch]; + auth_fifo[auth_fifo_pos].sex = sd->sex; + auth_fifo[auth_fifo_pos].connect_until_time = + sd->connect_until_time; + auth_fifo[auth_fifo_pos].ip = + session[fd]->client_addr.sin_addr.s_addr; + auth_fifo[auth_fifo_pos].packet_tmw_version = + sd->packet_tmw_version; + auth_fifo_pos++; + } + } + RFIFOSKIP (fd, 3); + break; + + case 0x67: // 作成 + if (!sd || RFIFOREST (fd) < 37) + return 0; + i = make_new_char (fd, RFIFOP (fd, 2)); + if (i < 0) + { + WFIFOW (fd, 0) = 0x6e; + WFIFOB (fd, 2) = 0x00; + WFIFOSET (fd, 3); + RFIFOSKIP (fd, 37); + break; + } + + WFIFOW (fd, 0) = 0x6d; + memset (WFIFOP (fd, 2), 0, 106); + + WFIFOL (fd, 2) = char_dat[i].char_id; + WFIFOL (fd, 2 + 4) = char_dat[i].base_exp; + WFIFOL (fd, 2 + 8) = char_dat[i].zeny; + WFIFOL (fd, 2 + 12) = char_dat[i].job_exp; + WFIFOL (fd, 2 + 16) = char_dat[i].job_level; + + WFIFOL (fd, 2 + 28) = char_dat[i].karma; + WFIFOL (fd, 2 + 32) = char_dat[i].manner; + + WFIFOW (fd, 2 + 40) = 0x30; + WFIFOW (fd, 2 + 42) = + (char_dat[i].hp > 0x7fff) ? 0x7fff : char_dat[i].hp; + WFIFOW (fd, 2 + 44) = + (char_dat[i].max_hp > + 0x7fff) ? 0x7fff : char_dat[i].max_hp; + WFIFOW (fd, 2 + 46) = + (char_dat[i].sp > 0x7fff) ? 0x7fff : char_dat[i].sp; + WFIFOW (fd, 2 + 48) = + (char_dat[i].max_sp > + 0x7fff) ? 0x7fff : char_dat[i].max_sp; + WFIFOW (fd, 2 + 50) = DEFAULT_WALK_SPEED; // char_dat[i].speed; + WFIFOW (fd, 2 + 52) = char_dat[i].class; + WFIFOW (fd, 2 + 54) = char_dat[i].hair; + + WFIFOW (fd, 2 + 58) = char_dat[i].base_level; + WFIFOW (fd, 2 + 60) = char_dat[i].skill_point; + + WFIFOW (fd, 2 + 64) = char_dat[i].shield; + WFIFOW (fd, 2 + 66) = char_dat[i].head_top; + WFIFOW (fd, 2 + 68) = char_dat[i].head_mid; + WFIFOW (fd, 2 + 70) = char_dat[i].hair_color; + + memcpy (WFIFOP (fd, 2 + 74), char_dat[i].name, 24); + + WFIFOB (fd, 2 + 98) = + (char_dat[i].str > 255) ? 255 : char_dat[i].str; + WFIFOB (fd, 2 + 99) = + (char_dat[i].agi > 255) ? 255 : char_dat[i].agi; + WFIFOB (fd, 2 + 100) = + (char_dat[i].vit > 255) ? 255 : char_dat[i].vit; + WFIFOB (fd, 2 + 101) = + (char_dat[i].int_ > 255) ? 255 : char_dat[i].int_; + WFIFOB (fd, 2 + 102) = + (char_dat[i].dex > 255) ? 255 : char_dat[i].dex; + WFIFOB (fd, 2 + 103) = + (char_dat[i].luk > 255) ? 255 : char_dat[i].luk; + WFIFOB (fd, 2 + 104) = char_dat[i].char_num; + + WFIFOSET (fd, 108); + RFIFOSKIP (fd, 37); + for (ch = 0; ch < 9; ch++) + { + if (sd->found_char[ch] == -1) + { + sd->found_char[ch] = i; + break; + } + } + + case 0x68: // delete char //Yor's Fix + if (!sd || RFIFOREST (fd) < 46) + return 0; + memcpy (email, RFIFOP (fd, 6), 40); + if (e_mail_check (email) == 0) + strncpy (email, "a@a.com", 40); // default e-mail + + // if we activated email creation and email is default email + if (email_creation != 0 && strcmp (sd->email, "a@a.com") == 0 + && login_fd > 0) + { // to modify an e-mail, login-server must be online + // if sended email is incorrect e-mail + if (strcmp (email, "a@a.com") == 0) + { + WFIFOW (fd, 0) = 0x70; + WFIFOB (fd, 2) = 0; // 00 = Incorrect Email address + WFIFOSET (fd, 3); + RFIFOSKIP (fd, 46); + // we act like we have selected a character + } + else + { + // we change the packet to set it like selection. + for (i = 0; i < 9; i++) + if (char_dat[sd->found_char[i]].char_id == + RFIFOL (fd, 2)) + { + // we save new e-mail + memcpy (sd->email, email, 40); + // we send new e-mail to login-server ('online' login-server is checked before) + WFIFOW (login_fd, 0) = 0x2715; + WFIFOL (login_fd, 2) = sd->account_id; + memcpy (WFIFOP (login_fd, 6), email, 40); + WFIFOSET (login_fd, 46); + // skip part of the packet! (46, but leave the size of select packet: 3) + RFIFOSKIP (fd, 43); + // change value to put new packet (char selection) + RFIFOW (fd, 0) = 0x66; + RFIFOB (fd, 2) = + char_dat[sd->found_char[i]].char_num; + // not send packet, it's modify of actual packet + break; + } + if (i == 9) + { + WFIFOW (fd, 0) = 0x70; + WFIFOB (fd, 2) = 0; // 00 = Incorrect Email address + WFIFOSET (fd, 3); + RFIFOSKIP (fd, 46); + } + } + + // otherwise, we delete the character + } + else + { + /*if (strcmpi(email, sd->email) != 0) { // if it's an invalid email + * WFIFOW(fd, 0) = 0x70; + * WFIFOB(fd, 2) = 0; // 00 = Incorrect Email address + * WFIFOSET(fd, 3); + * // if mail is correct + * } else { */ + for (i = 0; i < 9; i++) + { + struct mmo_charstatus *cs = NULL; + if (sd->found_char[i] >= 0 + && (cs = + &char_dat[sd->found_char[i]])->char_id == + RFIFOL (fd, 2)) + { + char_delete (cs); // deletion process + + if (sd->found_char[i] != char_num - 1) + { + memcpy (&char_dat[sd->found_char[i]], + &char_dat[char_num - 1], + sizeof (struct mmo_charstatus)); + // Correct moved character reference in the character's owner + { + int j, k; + struct char_session_data *sd2; + for (j = 0; j < fd_max; j++) + { + if (session[j] + && (sd2 = + session[j]->session_data) + && sd2->account_id == + char_dat[char_num - 1].account_id) + { + for (k = 0; k < 9; k++) + { + if (sd2->found_char[k] == + char_num - 1) + { + sd2->found_char[k] = + sd->found_char[i]; + break; + } + } + break; + } + } + } + } + + char_num--; + for (ch = i; ch < 9 - 1; ch++) + sd->found_char[ch] = sd->found_char[ch + 1]; + sd->found_char[8] = -1; + WFIFOW (fd, 0) = 0x6f; + WFIFOSET (fd, 2); + break; + } + } + + if (i == 9) + { + WFIFOW (fd, 0) = 0x70; + WFIFOB (fd, 2) = 0; + WFIFOSET (fd, 3); + } + //} + RFIFOSKIP (fd, 46); + } + break; + + case 0x2af8: // マップサーバーログイン + if (RFIFOREST (fd) < 60) + return 0; + WFIFOW (fd, 0) = 0x2af9; + for (i = 0; i < MAX_MAP_SERVERS; i++) + { + if (server_fd[i] < 0) + break; + } + if (i == MAX_MAP_SERVERS || strcmp (RFIFOP (fd, 2), userid) + || strcmp (RFIFOP (fd, 26), passwd)) + { + WFIFOB (fd, 2) = 3; + WFIFOSET (fd, 3); + RFIFOSKIP (fd, 60); + } + else + { + int len; + WFIFOB (fd, 2) = 0; + session[fd]->func_parse = parse_frommap; + server_fd[i] = fd; + if (anti_freeze_enable) + server_freezeflag[i] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed + server[i].ip = RFIFOL (fd, 54); + server[i].port = RFIFOW (fd, 58); + server[i].users = 0; + memset (server[i].map, 0, sizeof (server[i].map)); + WFIFOSET (fd, 3); + RFIFOSKIP (fd, 60); + realloc_fifo (fd, FIFOSIZE_SERVERLINK, + FIFOSIZE_SERVERLINK); + char_mapif_init (fd); + // send gm acccounts level to map-servers + len = 4; + WFIFOW (fd, 0) = 0x2b15; + for (i = 0; i < GM_num; i++) + { + WFIFOL (fd, len) = gm_account[i].account_id; + WFIFOB (fd, len + 4) = + (unsigned char) gm_account[i].level; + len += 5; + } + WFIFOW (fd, 2) = len; + WFIFOSET (fd, len); + return 0; + } + break; + + case 0x187: // Alive信号? + if (RFIFOREST (fd) < 6) + return 0; + RFIFOSKIP (fd, 6); + break; + + case 0x7530: // Athena情報所得 + WFIFOW (fd, 0) = 0x7531; + WFIFOB (fd, 2) = ATHENA_MAJOR_VERSION; + WFIFOB (fd, 3) = ATHENA_MINOR_VERSION; + WFIFOB (fd, 4) = ATHENA_REVISION; + WFIFOB (fd, 5) = ATHENA_RELEASE_FLAG; + WFIFOB (fd, 6) = ATHENA_OFFICIAL_FLAG; + WFIFOB (fd, 7) = ATHENA_SERVER_INTER | ATHENA_SERVER_CHAR; + WFIFOW (fd, 8) = ATHENA_MOD_VERSION; + WFIFOSET (fd, 10); + RFIFOSKIP (fd, 2); + return 0; + + case 0x7532: // 接続の切断(defaultと処理は一緒だが明示的にするため) + session[fd]->eof = 1; + return 0; + + default: + session[fd]->eof = 1; + return 0; + } + } + RFIFOFLUSH (fd); + return 0; } // 全てのMAPサーバーにデータ送信(送信したmap鯖の数を返す) -int mapif_sendall(char *buf, unsigned int len) { - int i, c; - - c = 0; - for(i = 0; i < MAX_MAP_SERVERS; i++) { - int fd; - if ((fd = server_fd[i]) >= 0) { - memcpy(WFIFOP(fd,0), buf, len); - WFIFOSET(fd,len); - c++; - } - } - return c; +int mapif_sendall (char *buf, unsigned int len) +{ + int i, c; + + c = 0; + for (i = 0; i < MAX_MAP_SERVERS; i++) + { + int fd; + if ((fd = server_fd[i]) >= 0) + { + memcpy (WFIFOP (fd, 0), buf, len); + WFIFOSET (fd, len); + c++; + } + } + return c; } // 自分以外の全てのMAPサーバーにデータ送信(送信したmap鯖の数を返す) -int mapif_sendallwos(int sfd, unsigned char *buf, unsigned int len) { - int i, c; - - c = 0; - for(i = 0; i < MAX_MAP_SERVERS; i++) { - int fd; - if ((fd = server_fd[i]) >= 0 && fd != sfd) { - memcpy(WFIFOP(fd,0), buf, len); - WFIFOSET(fd, len); - c++; - } - } - return c; +int mapif_sendallwos (int sfd, unsigned char *buf, unsigned int len) +{ + int i, c; + + c = 0; + for (i = 0; i < MAX_MAP_SERVERS; i++) + { + int fd; + if ((fd = server_fd[i]) >= 0 && fd != sfd) + { + memcpy (WFIFOP (fd, 0), buf, len); + WFIFOSET (fd, len); + c++; + } + } + return c; } + // MAPサーバーにデータ送信(map鯖生存確認有り) -int mapif_send(int fd, unsigned char *buf, unsigned int len) { - int i; - - if (fd >= 0) { - for(i = 0; i < MAX_MAP_SERVERS; i++) { - if (fd == server_fd[i]) { - memcpy(WFIFOP(fd,0), buf, len); - WFIFOSET(fd,len); - return 1; - } - } - } - return 0; +int mapif_send (int fd, unsigned char *buf, unsigned int len) +{ + int i; + + if (fd >= 0) + { + for (i = 0; i < MAX_MAP_SERVERS; i++) + { + if (fd == server_fd[i]) + { + memcpy (WFIFOP (fd, 0), buf, len); + WFIFOSET (fd, len); + return 1; + } + } + } + return 0; } -int send_users_tologin(int tid, unsigned int tick, int id, int data) { - int users = count_users(); - char buf[16]; - - if (login_fd > 0 && session[login_fd]) { - // send number of user to login server - WFIFOW(login_fd,0) = 0x2714; - WFIFOL(login_fd,2) = users; - WFIFOSET(login_fd,6); - } - // send number of players to all map-servers - WBUFW(buf,0) = 0x2b00; - WBUFL(buf,2) = users; - mapif_sendall(buf, 6); - - return 0; +int send_users_tologin (int tid, unsigned int tick, int id, int data) +{ + int users = count_users (); + char buf[16]; + + if (login_fd > 0 && session[login_fd]) + { + // send number of user to login server + WFIFOW (login_fd, 0) = 0x2714; + WFIFOL (login_fd, 2) = users; + WFIFOSET (login_fd, 6); + } + // send number of players to all map-servers + WBUFW (buf, 0) = 0x2b00; + WBUFL (buf, 2) = users; + mapif_sendall (buf, 6); + + return 0; } -int check_connect_login_server(int tid, unsigned int tick, int id, int data) { - if (login_fd <= 0 || session[login_fd] == NULL) { - printf("Attempt to connect to login-server...\n"); - if ((login_fd = make_connection(login_ip, login_port)) < 0) - return 0; - session[login_fd]->func_parse = parse_tologin; - realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); - WFIFOW(login_fd,0) = 0x2710; - memset(WFIFOP(login_fd,2), 0, 24); - memcpy(WFIFOP(login_fd,2), userid, strlen(userid) < 24 ? strlen(userid) : 24); - memset(WFIFOP(login_fd,26), 0, 24); - memcpy(WFIFOP(login_fd,26), passwd, strlen(passwd) < 24 ? strlen(passwd) : 24); - WFIFOL(login_fd,50) = 0; - WFIFOL(login_fd,54) = char_ip; - WFIFOL(login_fd,58) = char_port; - memset(WFIFOP(login_fd,60), 0, 20); - memcpy(WFIFOP(login_fd,60), server_name, strlen(server_name) < 20 ? strlen(server_name) : 20); - WFIFOW(login_fd,80) = 0; - WFIFOW(login_fd,82) = char_maintenance; - WFIFOW(login_fd,84) = char_new; - WFIFOSET(login_fd,86); - } - return 0; +int check_connect_login_server (int tid, unsigned int tick, int id, int data) +{ + if (login_fd <= 0 || session[login_fd] == NULL) + { + printf ("Attempt to connect to login-server...\n"); + if ((login_fd = make_connection (login_ip, login_port)) < 0) + return 0; + session[login_fd]->func_parse = parse_tologin; + realloc_fifo (login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); + WFIFOW (login_fd, 0) = 0x2710; + memset (WFIFOP (login_fd, 2), 0, 24); + memcpy (WFIFOP (login_fd, 2), userid, + strlen (userid) < 24 ? strlen (userid) : 24); + memset (WFIFOP (login_fd, 26), 0, 24); + memcpy (WFIFOP (login_fd, 26), passwd, + strlen (passwd) < 24 ? strlen (passwd) : 24); + WFIFOL (login_fd, 50) = 0; + WFIFOL (login_fd, 54) = char_ip; + WFIFOL (login_fd, 58) = char_port; + memset (WFIFOP (login_fd, 60), 0, 20); + memcpy (WFIFOP (login_fd, 60), server_name, + strlen (server_name) < 20 ? strlen (server_name) : 20); + WFIFOW (login_fd, 80) = 0; + WFIFOW (login_fd, 82) = char_maintenance; + WFIFOW (login_fd, 84) = char_new; + WFIFOSET (login_fd, 86); + } + return 0; } //---------------------------------------------------------- // Return numerical value of a switch configuration by [Yor] // on/off, english, fran軋is, deutsch, espanol //---------------------------------------------------------- -int config_switch(const char *str) { - if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0) - return 1; - if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0) - return 0; +int config_switch (const char *str) +{ + if (strcmpi (str, "on") == 0 || strcmpi (str, "yes") == 0 + || strcmpi (str, "oui") == 0 || strcmpi (str, "ja") == 0 + || strcmpi (str, "si") == 0) + return 1; + if (strcmpi (str, "off") == 0 || strcmpi (str, "no") == 0 + || strcmpi (str, "non") == 0 || strcmpi (str, "nein") == 0) + return 0; - return atoi(str); + return atoi (str); } //------------------------------------------- // Reading Lan Support configuration by [Yor] //------------------------------------------- -int lan_config_read(const char *lancfgName) { - int j; - struct hostent * h = NULL; - char line[1024], w1[1024], w2[1024]; - FILE *fp; - - // set default configuration - strncpy(lan_map_ip, "127.0.0.1", sizeof(lan_map_ip)); - subneti[0] = 127; - subneti[1] = 0; - subneti[2] = 0; - subneti[3] = 1; - for(j = 0; j < 4; j++) - subnetmaski[j] = 255; - - fp = fopen_(lancfgName, "r"); - - if (fp == NULL) { - printf("LAN support configuration file not found: %s\n", lancfgName); - return 1; - } - - printf ("---start reading of Lan Support configuration...\n"); - - while(fgets(line, sizeof(line)-1, fp)) { - if (line[0] == '/' && line[1] == '/') - continue; - - line[sizeof(line)-1] = '\0'; - if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2) - continue; - - remove_control_chars(w1); - remove_control_chars(w2); - if (strcmpi(w1, "lan_map_ip") == 0) { // Read map-server Lan IP Address - h = gethostbyname(w2); - if (h != NULL) { - sprintf(lan_map_ip, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - } else { - strncpy(lan_map_ip, w2, sizeof(lan_map_ip)); - lan_map_ip[sizeof(lan_map_ip)-1] = 0; - } - printf("LAN IP of map-server: %s.\n", lan_map_ip); - } else if (strcmpi(w1, "subnet") == 0) { // Read Subnetwork - for(j = 0; j < 4; j++) - subneti[j] = 0; - h = gethostbyname(w2); - if (h != NULL) { - for(j = 0; j < 4; j++) - subneti[j] = (unsigned char)h->h_addr[j]; - } else { - sscanf(w2, "%d.%d.%d.%d", &subneti[0], &subneti[1], &subneti[2], &subneti[3]); - } - printf("Sub-network of the map-server: %d.%d.%d.%d.\n", subneti[0], subneti[1], subneti[2], subneti[3]); - } else if (strcmpi(w1, "subnetmask") == 0){ // Read Subnetwork Mask - for(j = 0; j < 4; j++) - subnetmaski[j] = 255; - h = gethostbyname(w2); - if (h != NULL) { - for(j = 0; j < 4; j++) - subnetmaski[j] = (unsigned char)h->h_addr[j]; - } else { - sscanf(w2, "%d.%d.%d.%d", &subnetmaski[0], &subnetmaski[1], &subnetmaski[2], &subnetmaski[3]); - } - printf("Sub-network mask of the map-server: %d.%d.%d.%d.\n", subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]); - } - } - fclose_(fp); - - // sub-network check of the map-server - { - unsigned int a0, a1, a2, a3; - unsigned char p[4]; - sscanf(lan_map_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3); - p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3; - printf("LAN test of LAN IP of the map-server: "); - if (lan_ip_check(p) == 0) { - printf("\033[1;31m***ERROR: LAN IP of the map-server doesn't belong to the specified Sub-network.\033[0m\n"); - } - } - - printf("---End reading of Lan Support configuration...\n"); - - return 0; +int lan_config_read (const char *lancfgName) +{ + int j; + struct hostent *h = NULL; + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + // set default configuration + strncpy (lan_map_ip, "127.0.0.1", sizeof (lan_map_ip)); + subneti[0] = 127; + subneti[1] = 0; + subneti[2] = 0; + subneti[3] = 1; + for (j = 0; j < 4; j++) + subnetmaski[j] = 255; + + fp = fopen_ (lancfgName, "r"); + + if (fp == NULL) + { + printf ("LAN support configuration file not found: %s\n", lancfgName); + return 1; + } + + printf ("---start reading of Lan Support configuration...\n"); + + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + + line[sizeof (line) - 1] = '\0'; + if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) != 2) + continue; + + remove_control_chars (w1); + remove_control_chars (w2); + if (strcmpi (w1, "lan_map_ip") == 0) + { // Read map-server Lan IP Address + h = gethostbyname (w2); + if (h != NULL) + { + sprintf (lan_map_ip, "%d.%d.%d.%d", + (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + } + else + { + strncpy (lan_map_ip, w2, sizeof (lan_map_ip)); + lan_map_ip[sizeof (lan_map_ip) - 1] = 0; + } + printf ("LAN IP of map-server: %s.\n", lan_map_ip); + } + else if (strcmpi (w1, "subnet") == 0) + { // Read Subnetwork + for (j = 0; j < 4; j++) + subneti[j] = 0; + h = gethostbyname (w2); + if (h != NULL) + { + for (j = 0; j < 4; j++) + subneti[j] = (unsigned char) h->h_addr[j]; + } + else + { + sscanf (w2, "%d.%d.%d.%d", &subneti[0], &subneti[1], + &subneti[2], &subneti[3]); + } + printf ("Sub-network of the map-server: %d.%d.%d.%d.\n", + subneti[0], subneti[1], subneti[2], subneti[3]); + } + else if (strcmpi (w1, "subnetmask") == 0) + { // Read Subnetwork Mask + for (j = 0; j < 4; j++) + subnetmaski[j] = 255; + h = gethostbyname (w2); + if (h != NULL) + { + for (j = 0; j < 4; j++) + subnetmaski[j] = (unsigned char) h->h_addr[j]; + } + else + { + sscanf (w2, "%d.%d.%d.%d", &subnetmaski[0], &subnetmaski[1], + &subnetmaski[2], &subnetmaski[3]); + } + printf ("Sub-network mask of the map-server: %d.%d.%d.%d.\n", + subnetmaski[0], subnetmaski[1], subnetmaski[2], + subnetmaski[3]); + } + } + fclose_ (fp); + + // sub-network check of the map-server + { + unsigned int a0, a1, a2, a3; + unsigned char p[4]; + sscanf (lan_map_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3); + p[0] = a0; + p[1] = a1; + p[2] = a2; + p[3] = a3; + printf ("LAN test of LAN IP of the map-server: "); + if (lan_ip_check (p) == 0) + { + printf + ("\033[1;31m***ERROR: LAN IP of the map-server doesn't belong to the specified Sub-network.\033[0m\n"); + } + } + + printf ("---End reading of Lan Support configuration...\n"); + + return 0; } -int char_config_read(const char *cfgName) { - struct hostent *h = NULL; - char line[1024], w1[1024], w2[1024]; - FILE *fp = fopen_(cfgName, "r"); - - if (fp == NULL) { - printf("Configuration file not found: %s.\n", cfgName); - exit(1); - } - - while(fgets(line, sizeof(line)-1, fp)) { - if (line[0] == '/' && line[1] == '/') - continue; - - line[sizeof(line)-1] = '\0'; - if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2) - continue; - - remove_control_chars(w1); - remove_control_chars(w2); - if (strcmpi(w1, "userid") == 0) { - memcpy(userid, w2, 24); - } else if (strcmpi(w1, "passwd") == 0) { - memcpy(passwd, w2, 24); - } else if (strcmpi(w1, "server_name") == 0) { - memcpy(server_name, w2, sizeof(server_name)); - server_name[sizeof(server_name) - 1] = '\0'; - printf("%s server has been intialized\n", w2); - } else if (strcmpi(w1, "wisp_server_name") == 0) { - if (strlen(w2) >= 4) { - memcpy(wisp_server_name, w2, sizeof(wisp_server_name)); - wisp_server_name[sizeof(wisp_server_name) - 1] = '\0'; - } - } else if (strcmpi(w1, "login_ip") == 0) { - h = gethostbyname(w2); - if (h != NULL) { - printf("Login server IP address : %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - sprintf(login_ip_str, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - } else - memcpy(login_ip_str, w2, 16); - } else if (strcmpi(w1, "login_port") == 0) { - login_port = atoi(w2); - } else if (strcmpi(w1, "char_ip") == 0) { - h = gethostbyname(w2); - if (h != NULL) { - printf("Character server IP address : %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - sprintf(char_ip_str, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - } else - memcpy(char_ip_str, w2, 16); - } else if (strcmpi(w1, "char_port") == 0) { - char_port = atoi(w2); - } else if (strcmpi(w1, "char_maintenance") == 0) { - char_maintenance = atoi(w2); - } else if (strcmpi(w1, "char_new") == 0) { - char_new = atoi(w2); - } else if (strcmpi(w1, "email_creation") == 0) { - email_creation = config_switch(w2); - } else if (strcmpi(w1, "char_txt") == 0) { - strcpy(char_txt, w2); - } else if (strcmpi(w1, "backup_txt") == 0) { //By zanetheinsane - strcpy(backup_txt, w2); - } else if (strcmpi(w1, "backup_txt_flag") == 0) { // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. By [Yor] - backup_txt_flag = config_switch(w2); - } else if (strcmpi(w1, "max_connect_user") == 0) { - max_connect_user = atoi(w2); - if (max_connect_user < 0) - max_connect_user = 0; // unlimited online players - } else if (strcmpi(w1, "check_ip_flag") == 0) { - check_ip_flag = config_switch(w2); - } else if (strcmpi(w1, "autosave_time") == 0) { - autosave_interval = atoi(w2)*1000; - if (autosave_interval <= 0) - autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; - } else if (strcmpi(w1, "start_point") == 0) { - char map[32]; - int x, y; - if (sscanf(w2, "%[^,],%d,%d", map, &x, &y) < 3) - continue; - if (strstr(map, ".gat") != NULL) { // Verify at least if '.gat' is in the map name - memcpy(start_point.map, map, 16); - start_point.x = x; - start_point.y = y; - } - } else if (strcmpi(w1, "start_zeny") == 0) { - start_zeny = atoi(w2); - if (start_zeny < 0) - start_zeny = 0; - } else if (strcmpi(w1, "start_weapon") == 0) { - start_zeny = atoi(w2); - if (start_weapon < 0) - start_weapon = 0; - } else if (strcmpi(w1, "start_armor") == 0) { - start_zeny = atoi(w2); - if (start_armor < 0) - start_armor = 0; - } else if (strcmpi(w1, "unknown_char_name") == 0) { - strcpy(unknown_char_name, w2); - unknown_char_name[24] = 0; - } else if (strcmpi(w1, "char_log_filename") == 0) { - strcpy(char_log_filename, w2); - } else if (strcmpi(w1, "name_ignoring_case") == 0) { - name_ignoring_case = config_switch(w2); - } else if (strcmpi(w1, "char_name_option") == 0) { - char_name_option = atoi(w2); - } else if (strcmpi(w1, "char_name_letters") == 0) { - strcpy(char_name_letters, w2); +int char_config_read (const char *cfgName) +{ + struct hostent *h = NULL; + char line[1024], w1[1024], w2[1024]; + FILE *fp = fopen_ (cfgName, "r"); + + if (fp == NULL) + { + printf ("Configuration file not found: %s.\n", cfgName); + exit (1); + } + + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + + line[sizeof (line) - 1] = '\0'; + if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) != 2) + continue; + + remove_control_chars (w1); + remove_control_chars (w2); + if (strcmpi (w1, "userid") == 0) + { + memcpy (userid, w2, 24); + } + else if (strcmpi (w1, "passwd") == 0) + { + memcpy (passwd, w2, 24); + } + else if (strcmpi (w1, "server_name") == 0) + { + memcpy (server_name, w2, sizeof (server_name)); + server_name[sizeof (server_name) - 1] = '\0'; + printf ("%s server has been intialized\n", w2); + } + else if (strcmpi (w1, "wisp_server_name") == 0) + { + if (strlen (w2) >= 4) + { + memcpy (wisp_server_name, w2, sizeof (wisp_server_name)); + wisp_server_name[sizeof (wisp_server_name) - 1] = '\0'; + } + } + else if (strcmpi (w1, "login_ip") == 0) + { + h = gethostbyname (w2); + if (h != NULL) + { + printf ("Login server IP address : %s -> %d.%d.%d.%d\n", w2, + (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + sprintf (login_ip_str, "%d.%d.%d.%d", + (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + } + else + memcpy (login_ip_str, w2, 16); + } + else if (strcmpi (w1, "login_port") == 0) + { + login_port = atoi (w2); + } + else if (strcmpi (w1, "char_ip") == 0) + { + h = gethostbyname (w2); + if (h != NULL) + { + printf ("Character server IP address : %s -> %d.%d.%d.%d\n", + w2, (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + sprintf (char_ip_str, "%d.%d.%d.%d", + (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + } + else + memcpy (char_ip_str, w2, 16); + } + else if (strcmpi (w1, "char_port") == 0) + { + char_port = atoi (w2); + } + else if (strcmpi (w1, "char_maintenance") == 0) + { + char_maintenance = atoi (w2); + } + else if (strcmpi (w1, "char_new") == 0) + { + char_new = atoi (w2); + } + else if (strcmpi (w1, "email_creation") == 0) + { + email_creation = config_switch (w2); + } + else if (strcmpi (w1, "char_txt") == 0) + { + strcpy (char_txt, w2); + } + else if (strcmpi (w1, "backup_txt") == 0) + { //By zanetheinsane + strcpy (backup_txt, w2); + } + else if (strcmpi (w1, "backup_txt_flag") == 0) + { // The backup_txt file was created because char deletion bug existed. Now it's finish and that take a lot of time to create a second file when there are a lot of characters. By [Yor] + backup_txt_flag = config_switch (w2); + } + else if (strcmpi (w1, "max_connect_user") == 0) + { + max_connect_user = atoi (w2); + if (max_connect_user < 0) + max_connect_user = 0; // unlimited online players + } + else if (strcmpi (w1, "check_ip_flag") == 0) + { + check_ip_flag = config_switch (w2); + } + else if (strcmpi (w1, "autosave_time") == 0) + { + autosave_interval = atoi (w2) * 1000; + if (autosave_interval <= 0) + autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; + } + else if (strcmpi (w1, "start_point") == 0) + { + char map[32]; + int x, y; + if (sscanf (w2, "%[^,],%d,%d", map, &x, &y) < 3) + continue; + if (strstr (map, ".gat") != NULL) + { // Verify at least if '.gat' is in the map name + memcpy (start_point.map, map, 16); + start_point.x = x; + start_point.y = y; + } + } + else if (strcmpi (w1, "start_zeny") == 0) + { + start_zeny = atoi (w2); + if (start_zeny < 0) + start_zeny = 0; + } + else if (strcmpi (w1, "start_weapon") == 0) + { + start_zeny = atoi (w2); + if (start_weapon < 0) + start_weapon = 0; + } + else if (strcmpi (w1, "start_armor") == 0) + { + start_zeny = atoi (w2); + if (start_armor < 0) + start_armor = 0; + } + else if (strcmpi (w1, "unknown_char_name") == 0) + { + strcpy (unknown_char_name, w2); + unknown_char_name[24] = 0; + } + else if (strcmpi (w1, "char_log_filename") == 0) + { + strcpy (char_log_filename, w2); + } + else if (strcmpi (w1, "name_ignoring_case") == 0) + { + name_ignoring_case = config_switch (w2); + } + else if (strcmpi (w1, "char_name_option") == 0) + { + char_name_option = atoi (w2); + } + else if (strcmpi (w1, "char_name_letters") == 0) + { + strcpy (char_name_letters, w2); // online files options - } else if (strcmpi(w1, "online_txt_filename") == 0) { - strcpy(online_txt_filename, w2); - } else if (strcmpi(w1, "online_html_filename") == 0) { - strcpy(online_html_filename, w2); - } else if (strcmpi(w1, "online_sorting_option") == 0) { - online_sorting_option = atoi(w2); - } else if (strcmpi(w1, "online_display_option") == 0) { - online_display_option = atoi(w2); - } else if (strcmpi(w1, "online_gm_display_min_level") == 0) { // minimum GM level to display 'GM' when we want to display it - online_gm_display_min_level = atoi(w2); - if (online_gm_display_min_level < 5) // send online file every 5 seconds to player is enough - online_gm_display_min_level = 5; - } else if (strcmpi(w1, "online_refresh_html") == 0) { - online_refresh_html = atoi(w2); - if (online_refresh_html < 1) - online_refresh_html = 1; - } else if(strcmpi(w1,"anti_freeze_enable")==0){ - anti_freeze_enable = config_switch(w2); - } else if (strcmpi(w1, "anti_freeze_interval") == 0) { - ANTI_FREEZE_INTERVAL = atoi(w2); - if (ANTI_FREEZE_INTERVAL < 5) - ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds - } else if (strcmpi(w1, "import") == 0) { - char_config_read(w2); - } - } - fclose_(fp); - - return 0; + } + else if (strcmpi (w1, "online_txt_filename") == 0) + { + strcpy (online_txt_filename, w2); + } + else if (strcmpi (w1, "online_html_filename") == 0) + { + strcpy (online_html_filename, w2); + } + else if (strcmpi (w1, "online_sorting_option") == 0) + { + online_sorting_option = atoi (w2); + } + else if (strcmpi (w1, "online_display_option") == 0) + { + online_display_option = atoi (w2); + } + else if (strcmpi (w1, "online_gm_display_min_level") == 0) + { // minimum GM level to display 'GM' when we want to display it + online_gm_display_min_level = atoi (w2); + if (online_gm_display_min_level < 5) // send online file every 5 seconds to player is enough + online_gm_display_min_level = 5; + } + else if (strcmpi (w1, "online_refresh_html") == 0) + { + online_refresh_html = atoi (w2); + if (online_refresh_html < 1) + online_refresh_html = 1; + } + else if (strcmpi (w1, "anti_freeze_enable") == 0) + { + anti_freeze_enable = config_switch (w2); + } + else if (strcmpi (w1, "anti_freeze_interval") == 0) + { + ANTI_FREEZE_INTERVAL = atoi (w2); + if (ANTI_FREEZE_INTERVAL < 5) + ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds + } + else if (strcmpi (w1, "import") == 0) + { + char_config_read (w2); + } + } + fclose_ (fp); + + return 0; } -void do_final(void) { - int i; +void do_final (void) +{ + int i; - // write online players files with no player - for(i = 0; i < char_num; i++) - online_chars[i] = -1; - create_online_files(); - free(online_chars); + // write online players files with no player + for (i = 0; i < char_num; i++) + online_chars[i] = -1; + create_online_files (); + free (online_chars); - mmo_char_sync(); - inter_save(); + mmo_char_sync (); + inter_save (); - if (gm_account != NULL) - free(gm_account); + if (gm_account != NULL) + free (gm_account); - free(char_dat); - delete_session(login_fd); - delete_session(char_fd); + free (char_dat); + delete_session (login_fd); + delete_session (char_fd); - char_log("----End of char-server (normal end with closing of all files)." RETCODE); + char_log ("----End of char-server (normal end with closing of all files)." + RETCODE); } -int do_init(int argc, char **argv) { - int i; +int do_init (int argc, char **argv) +{ + int i; + + // a newline in the log... + char_log (""); + char_log ("The char-server starting..." RETCODE); + + char_config_read ((argc < 2) ? CHAR_CONF_NAME : argv[1]); + lan_config_read ((argc > 1) ? argv[1] : LOGIN_LAN_CONF_NAME); - // a newline in the log... - char_log(""); - char_log("The char-server starting..." RETCODE); + login_ip = inet_addr (login_ip_str); + char_ip = inet_addr (char_ip_str); - char_config_read((argc < 2) ? CHAR_CONF_NAME : argv[1]); - lan_config_read((argc > 1) ? argv[1] : LOGIN_LAN_CONF_NAME); + for (i = 0; i < MAX_MAP_SERVERS; i++) + { + memset (&server[i], 0, sizeof (struct mmo_map_server)); + server_fd[i] = -1; + } - login_ip = inet_addr(login_ip_str); - char_ip = inet_addr(char_ip_str); + mmo_char_init (); - for(i = 0; i < MAX_MAP_SERVERS; i++) { - memset(&server[i], 0, sizeof(struct mmo_map_server)); - server_fd[i] = -1; - } + update_online = time (NULL); + create_online_files (); // update online players files at start of the server - mmo_char_init(); + inter_init ((argc > 2) ? argv[2] : inter_cfgName); // inter server 初期化 - update_online = time(NULL); - create_online_files(); // update online players files at start of the server + set_termfunc (do_final); + set_defaultparse (parse_char); - inter_init((argc > 2) ? argv[2] : inter_cfgName); // inter server 初期化 + char_fd = make_listen_port (char_port); - set_termfunc(do_final); - set_defaultparse(parse_char); + add_timer_func_list (check_connect_login_server, + "check_connect_login_server"); + add_timer_func_list (send_users_tologin, "send_users_tologin"); + add_timer_func_list (mmo_char_sync_timer, "mmo_char_sync_timer"); - char_fd = make_listen_port(char_port); + i = add_timer_interval (gettick () + 1000, check_connect_login_server, 0, + 0, 10 * 1000); + i = add_timer_interval (gettick () + 1000, send_users_tologin, 0, 0, + 5 * 1000); + i = add_timer_interval (gettick () + autosave_interval, + mmo_char_sync_timer, 0, 0, autosave_interval); - add_timer_func_list(check_connect_login_server, "check_connect_login_server"); - add_timer_func_list(send_users_tologin, "send_users_tologin"); - add_timer_func_list(mmo_char_sync_timer, "mmo_char_sync_timer"); - - i = add_timer_interval(gettick() + 1000, check_connect_login_server, 0, 0, 10 * 1000); - i = add_timer_interval(gettick() + 1000, send_users_tologin, 0, 0, 5 * 1000); - i = add_timer_interval(gettick() + autosave_interval, mmo_char_sync_timer, 0, 0, autosave_interval); - - if(anti_freeze_enable > 0) { - add_timer_func_list(map_anti_freeze_system, "map_anti_freeze_system"); - i = add_timer_interval(gettick() + 1000, map_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000); // checks every X seconds user specifies - } + if (anti_freeze_enable > 0) + { + add_timer_func_list (map_anti_freeze_system, + "map_anti_freeze_system"); + i = add_timer_interval (gettick () + 1000, map_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000); // checks every X seconds user specifies + } - char_log("The char-server is ready (Server is listening on the port %d)." RETCODE, char_port); + char_log ("The char-server is ready (Server is listening on the port %d)." + RETCODE, char_port); - printf("The char-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", char_port); + printf + ("The char-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", + char_port); - return 0; + return 0; } diff --git a/src/char/char.h b/src/char/char.h index ef06571..cc64024 100644 --- a/src/char/char.h +++ b/src/char/char.h @@ -10,21 +10,22 @@ #define DEFAULT_AUTOSAVE_INTERVAL 300*1000 -struct mmo_map_server{ - long ip; - short port; - int users; - char map[MAX_MAP_PER_SERVER][16]; +struct mmo_map_server +{ + long ip; + short port; + int users; + char map[MAX_MAP_PER_SERVER][16]; }; -int search_character_index(char* character_name); -char * search_character_name(int index); +int search_character_index (char *character_name); +char *search_character_name (int index); -int mapif_sendall(char *buf, unsigned int len); -int mapif_sendallwos(int fd,unsigned char *buf, unsigned int len); -int mapif_send(int fd,unsigned char *buf, unsigned int len); +int mapif_sendall (char *buf, unsigned int len); +int mapif_sendallwos (int fd, unsigned char *buf, unsigned int len); +int mapif_send (int fd, unsigned char *buf, unsigned int len); -int char_log(char *fmt, ...); +int char_log (char *fmt, ...); extern int autosave_interval; diff --git a/src/char/int_guild.c b/src/char/int_guild.c index f84964c..0d310f6 100644 --- a/src/char/int_guild.c +++ b/src/char/int_guild.c @@ -22,1380 +22,1689 @@ static int guild_newid = 10000; static int guild_exp[100]; -int mapif_parse_GuildLeave(int fd, int guild_id, int account_id, int char_id, int flag, const char *mes); -int mapif_guild_broken(int guild_id, int flag); -int guild_check_empty(struct guild *g); -int guild_calcinfo(struct guild *g); -int mapif_guild_basicinfochanged(int guild_id, int type, const void *data, int len); -int mapif_guild_info(int fd, struct guild *g); -int guild_break_sub(void *key, void *data, va_list ap); +int mapif_parse_GuildLeave (int fd, int guild_id, int account_id, + int char_id, int flag, const char *mes); +int mapif_guild_broken (int guild_id, int flag); +int guild_check_empty (struct guild *g); +int guild_calcinfo (struct guild *g); +int mapif_guild_basicinfochanged (int guild_id, int type, const void *data, + int len); +int mapif_guild_info (int fd, struct guild *g); +int guild_break_sub (void *key, void *data, va_list ap); // ギルドデータの文字列への変換 -int inter_guild_tostr(char *str, struct guild *g) { - int i, c, len; - - // 基本データ - len = sprintf(str, "%d\t%s\t%s\t%d,%d,%d,%d,%d\t%s#\t%s#\t", - g->guild_id, g->name, g->master, - g->guild_lv, g->max_member, g->exp, g->skill_point, g->castle_id, - g->mes1, g->mes2); - // メンバー - for(i = 0; i < g->max_member; i++) { - struct guild_member *m = &g->member[i]; - len += sprintf(str + len, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\t%s\t", - m->account_id, m->char_id, - m->hair, m->hair_color, m->gender, - m->class, m->lv, m->exp, m->exp_payper, m->position, - ((m->account_id > 0) ? m->name : "-")); - } - // 役職 - for(i = 0; i < MAX_GUILDPOSITION; i++) { - struct guild_position *p = &g->position[i]; - len += sprintf(str + len, "%d,%d\t%s#\t", p->mode, p->exp_mode, p->name); - } - // エンブレム - len += sprintf(str + len, "%d,%d,", g->emblem_len, g->emblem_id); - for(i = 0; i < g->emblem_len; i++) { - len += sprintf(str + len, "%02x", (unsigned char)(g->emblem_data[i])); - } - len += sprintf(str + len, "$\t"); - // 同盟リスト - c = 0; - for(i = 0; i < MAX_GUILDALLIANCE; i++) - if (g->alliance[i].guild_id > 0) - c++; - len += sprintf(str + len, "%d\t", c); - for(i = 0; i < MAX_GUILDALLIANCE; i++) { - struct guild_alliance *a = &g->alliance[i]; - if (a->guild_id > 0) - len += sprintf(str + len, "%d,%d\t%s\t", a->guild_id, a->opposition, a->name); - } - // 追放リスト - c = 0; - for(i = 0; i < MAX_GUILDEXPLUSION; i++) - if (g->explusion[i].account_id > 0) - c++; - len += sprintf(str + len, "%d\t", c); - for(i = 0; i < MAX_GUILDEXPLUSION; i++) { - struct guild_explusion *e = &g->explusion[i]; - if (e->account_id > 0) - len += sprintf(str + len, "%d,%d,%d,%d\t%s\t%s\t%s#\t", - e->account_id, e->rsv1, e->rsv2, e->rsv3, - e->name, e->acc, e->mes ); - } - // ギルドスキル - for(i = 0; i < MAX_GUILDSKILL; i++) { - len += sprintf(str + len, "%d,%d ", g->skill[i].id, g->skill[i].lv); - } - len += sprintf(str + len, "\t"); - - return 0; +int inter_guild_tostr (char *str, struct guild *g) +{ + int i, c, len; + + // 基本データ + len = sprintf (str, "%d\t%s\t%s\t%d,%d,%d,%d,%d\t%s#\t%s#\t", + g->guild_id, g->name, g->master, + g->guild_lv, g->max_member, g->exp, g->skill_point, + g->castle_id, g->mes1, g->mes2); + // メンバー + for (i = 0; i < g->max_member; i++) + { + struct guild_member *m = &g->member[i]; + len += sprintf (str + len, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\t%s\t", + m->account_id, m->char_id, + m->hair, m->hair_color, m->gender, + m->class, m->lv, m->exp, m->exp_payper, m->position, + ((m->account_id > 0) ? m->name : "-")); + } + // 役職 + for (i = 0; i < MAX_GUILDPOSITION; i++) + { + struct guild_position *p = &g->position[i]; + len += + sprintf (str + len, "%d,%d\t%s#\t", p->mode, p->exp_mode, + p->name); + } + // エンブレム + len += sprintf (str + len, "%d,%d,", g->emblem_len, g->emblem_id); + for (i = 0; i < g->emblem_len; i++) + { + len += + sprintf (str + len, "%02x", (unsigned char) (g->emblem_data[i])); + } + len += sprintf (str + len, "$\t"); + // 同盟リスト + c = 0; + for (i = 0; i < MAX_GUILDALLIANCE; i++) + if (g->alliance[i].guild_id > 0) + c++; + len += sprintf (str + len, "%d\t", c); + for (i = 0; i < MAX_GUILDALLIANCE; i++) + { + struct guild_alliance *a = &g->alliance[i]; + if (a->guild_id > 0) + len += + sprintf (str + len, "%d,%d\t%s\t", a->guild_id, a->opposition, + a->name); + } + // 追放リスト + c = 0; + for (i = 0; i < MAX_GUILDEXPLUSION; i++) + if (g->explusion[i].account_id > 0) + c++; + len += sprintf (str + len, "%d\t", c); + for (i = 0; i < MAX_GUILDEXPLUSION; i++) + { + struct guild_explusion *e = &g->explusion[i]; + if (e->account_id > 0) + len += sprintf (str + len, "%d,%d,%d,%d\t%s\t%s\t%s#\t", + e->account_id, e->rsv1, e->rsv2, e->rsv3, + e->name, e->acc, e->mes); + } + // ギルドスキル + for (i = 0; i < MAX_GUILDSKILL; i++) + { + len += sprintf (str + len, "%d,%d ", g->skill[i].id, g->skill[i].lv); + } + len += sprintf (str + len, "\t"); + + return 0; } // ギルドデータの文字列からの変換 -int inter_guild_fromstr(char *str, struct guild *g) { - int i, j, c; - int tmp_int[16]; - char tmp_str[4][256]; - char tmp_str2[4096]; - char *pstr; - - // 基本データ - memset(g, 0, sizeof(struct guild)); - if (sscanf(str, "%d\t%[^\t]\t%[^\t]\t%d,%d,%d,%d,%d\t%[^\t]\t%[^\t]\t", &tmp_int[0], - tmp_str[0], tmp_str[1], - &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], &tmp_int[5], - tmp_str[2], tmp_str[3]) < 8) - return 1; - - g->guild_id = tmp_int[0]; - g->guild_lv = tmp_int[1]; - g->max_member = tmp_int[2]; - g->exp = tmp_int[3]; - g->skill_point = tmp_int[4]; - g->castle_id = tmp_int[5]; - memcpy(g->name, tmp_str[0], 24); - memcpy(g->master, tmp_str[1], 24); - memcpy(g->mes1, tmp_str[2], 60); - memcpy(g->mes2, tmp_str[3], 120); - g->mes1[strlen(g->mes1)-1] = 0; - g->mes2[strlen(g->mes2)-1] = 0; - - for(j = 0; j < 6 && str != NULL; j++) // 位置スキップ - str = strchr(str + 1, '\t'); -// printf("GuildBaseInfo OK\n"); - - // メンバー - for(i = 0; i < g->max_member; i++) { - struct guild_member *m = &g->member[i]; - if (sscanf(str + 1, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\t%[^\t]\t", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], - &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], - tmp_str[0]) < 11) - return 1; - m->account_id = tmp_int[0]; - m->char_id = tmp_int[1]; - m->hair = tmp_int[2]; - m->hair_color = tmp_int[3]; - m->gender = tmp_int[4]; - m->class = tmp_int[5]; - m->lv = tmp_int[6]; - m->exp = tmp_int[7]; - m->exp_payper = tmp_int[8]; - m->position = tmp_int[9]; - memcpy(m->name, tmp_str[0], 24); - - for(j = 0; j < 2 && str != NULL; j++) // 位置スキップ - str = strchr(str + 1, '\t'); - } -// printf("GuildMemberInfo OK\n"); - // 役職 - i = 0; - while (sscanf(str+1, "%d,%d%n", &tmp_int[0], &tmp_int[1], &j) == 2 && str[1+j] == '\t') { - struct guild_position *p = &g->position[i]; - if (sscanf(str+1, "%d,%d\t%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str[0]) < 3) - return 1; - p->mode = tmp_int[0]; - p->exp_mode = tmp_int[1]; - tmp_str[0][strlen(tmp_str[0])-1] = 0; - memcpy(p->name, tmp_str[0], 24); - - for(j = 0; j < 2 && str != NULL; j++) // 位置スキップ - str = strchr(str+1, '\t'); - i++; - } -// printf("GuildPositionInfo OK\n"); - // エンブレム - tmp_int[1] = 0; - if (sscanf(str + 1, "%d,%d,%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str2)< 3 && - sscanf(str + 1, "%d,%[^\t]\t", &tmp_int[0], tmp_str2) < 2) - return 1; - g->emblem_len = tmp_int[0]; - g->emblem_id = tmp_int[1]; - for(i = 0, pstr = tmp_str2; i < g->emblem_len; i++, pstr += 2) { - int c1 = pstr[0], c2 = pstr[1], x1 = 0, x2 = 0; - if (c1 >= '0' && c1 <= '9') x1 = c1 - '0'; - if (c1 >= 'a' && c1 <= 'f') x1 = c1 - 'a' + 10; - if (c1 >= 'A' && c1 <= 'F') x1 = c1 - 'A' + 10; - if (c2 >= '0' && c2 <= '9') x2 = c2 - '0'; - if (c2 >= 'a' && c2 <= 'f') x2 = c2 - 'a' + 10; - if (c2 >= 'A' && c2 <= 'F') x2 = c2 - 'A' + 10; - g->emblem_data[i] = (x1<<4) | x2; - } -// printf("GuildEmblemInfo OK\n"); - str=strchr(str + 1, '\t'); // 位置スキップ - - // 同盟リスト - if (sscanf(str + 1, "%d\t", &c) < 1) - return 1; - str = strchr(str + 1, '\t'); // 位置スキップ - for(i = 0; i < c; i++) { - struct guild_alliance *a = &g->alliance[i]; - if (sscanf(str + 1, "%d,%d\t%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str[0]) < 3) - return 1; - a->guild_id = tmp_int[0]; - a->opposition = tmp_int[1]; - memcpy(a->name, tmp_str[0], 24); - - for(j = 0; j < 2 && str != NULL; j++) // 位置スキップ - str = strchr(str + 1, '\t'); - } -// printf("GuildAllianceInfo OK\n"); - // 追放リスト - if (sscanf(str+1, "%d\t", &c) < 1) - return 1; - str = strchr(str + 1, '\t'); // 位置スキップ - for(i = 0; i < c; i++) { - struct guild_explusion *e = &g->explusion[i]; - if (sscanf(str + 1, "%d,%d,%d,%d\t%[^\t]\t%[^\t]\t%[^\t]\t", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - tmp_str[0], tmp_str[1], tmp_str[2]) < 6) - return 1; - e->account_id = tmp_int[0]; - e->rsv1 = tmp_int[1]; - e->rsv2 = tmp_int[2]; - e->rsv3 = tmp_int[3]; - memcpy(e->name, tmp_str[0], 24); - memcpy(e->acc, tmp_str[1], 24); - tmp_str[2][strlen(tmp_str[2])-1] = 0; - memcpy(e->mes, tmp_str[2], 40); - - for(j = 0; j < 4 && str != NULL; j++) // 位置スキップ - str = strchr(str + 1, '\t'); - } -// printf("GuildExplusionInfo OK\n"); - // ギルドスキル - for(i = 0; i < MAX_GUILDSKILL; i++) { - if (sscanf(str+1,"%d,%d ", &tmp_int[0], &tmp_int[1]) < 2) - break; - g->skill[i].id = tmp_int[0]; - g->skill[i].lv = tmp_int[1]; - str = strchr(str + 1, ' '); - } - str = strchr(str + 1, '\t'); -// printf("GuildSkillInfo OK\n"); - - return 0; +int inter_guild_fromstr (char *str, struct guild *g) +{ + int i, j, c; + int tmp_int[16]; + char tmp_str[4][256]; + char tmp_str2[4096]; + char *pstr; + + // 基本データ + memset (g, 0, sizeof (struct guild)); + if (sscanf + (str, "%d\t%[^\t]\t%[^\t]\t%d,%d,%d,%d,%d\t%[^\t]\t%[^\t]\t", + &tmp_int[0], tmp_str[0], tmp_str[1], &tmp_int[1], &tmp_int[2], + &tmp_int[3], &tmp_int[4], &tmp_int[5], tmp_str[2], tmp_str[3]) < 8) + return 1; + + g->guild_id = tmp_int[0]; + g->guild_lv = tmp_int[1]; + g->max_member = tmp_int[2]; + g->exp = tmp_int[3]; + g->skill_point = tmp_int[4]; + g->castle_id = tmp_int[5]; + memcpy (g->name, tmp_str[0], 24); + memcpy (g->master, tmp_str[1], 24); + memcpy (g->mes1, tmp_str[2], 60); + memcpy (g->mes2, tmp_str[3], 120); + g->mes1[strlen (g->mes1) - 1] = 0; + g->mes2[strlen (g->mes2) - 1] = 0; + + for (j = 0; j < 6 && str != NULL; j++) // 位置スキップ + str = strchr (str + 1, '\t'); +// printf("GuildBaseInfo OK\n"); + + // メンバー + for (i = 0; i < g->max_member; i++) + { + struct guild_member *m = &g->member[i]; + if (sscanf (str + 1, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\t%[^\t]\t", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], + &tmp_int[8], &tmp_int[9], tmp_str[0]) < 11) + return 1; + m->account_id = tmp_int[0]; + m->char_id = tmp_int[1]; + m->hair = tmp_int[2]; + m->hair_color = tmp_int[3]; + m->gender = tmp_int[4]; + m->class = tmp_int[5]; + m->lv = tmp_int[6]; + m->exp = tmp_int[7]; + m->exp_payper = tmp_int[8]; + m->position = tmp_int[9]; + memcpy (m->name, tmp_str[0], 24); + + for (j = 0; j < 2 && str != NULL; j++) // 位置スキップ + str = strchr (str + 1, '\t'); + } +// printf("GuildMemberInfo OK\n"); + // 役職 + i = 0; + while (sscanf (str + 1, "%d,%d%n", &tmp_int[0], &tmp_int[1], &j) == 2 + && str[1 + j] == '\t') + { + struct guild_position *p = &g->position[i]; + if (sscanf + (str + 1, "%d,%d\t%[^\t]\t", &tmp_int[0], &tmp_int[1], + tmp_str[0]) < 3) + return 1; + p->mode = tmp_int[0]; + p->exp_mode = tmp_int[1]; + tmp_str[0][strlen (tmp_str[0]) - 1] = 0; + memcpy (p->name, tmp_str[0], 24); + + for (j = 0; j < 2 && str != NULL; j++) // 位置スキップ + str = strchr (str + 1, '\t'); + i++; + } +// printf("GuildPositionInfo OK\n"); + // エンブレム + tmp_int[1] = 0; + if (sscanf (str + 1, "%d,%d,%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str2) + < 3 && sscanf (str + 1, "%d,%[^\t]\t", &tmp_int[0], tmp_str2) < 2) + return 1; + g->emblem_len = tmp_int[0]; + g->emblem_id = tmp_int[1]; + for (i = 0, pstr = tmp_str2; i < g->emblem_len; i++, pstr += 2) + { + int c1 = pstr[0], c2 = pstr[1], x1 = 0, x2 = 0; + if (c1 >= '0' && c1 <= '9') + x1 = c1 - '0'; + if (c1 >= 'a' && c1 <= 'f') + x1 = c1 - 'a' + 10; + if (c1 >= 'A' && c1 <= 'F') + x1 = c1 - 'A' + 10; + if (c2 >= '0' && c2 <= '9') + x2 = c2 - '0'; + if (c2 >= 'a' && c2 <= 'f') + x2 = c2 - 'a' + 10; + if (c2 >= 'A' && c2 <= 'F') + x2 = c2 - 'A' + 10; + g->emblem_data[i] = (x1 << 4) | x2; + } +// printf("GuildEmblemInfo OK\n"); + str = strchr (str + 1, '\t'); // 位置スキップ + + // 同盟リスト + if (sscanf (str + 1, "%d\t", &c) < 1) + return 1; + str = strchr (str + 1, '\t'); // 位置スキップ + for (i = 0; i < c; i++) + { + struct guild_alliance *a = &g->alliance[i]; + if (sscanf + (str + 1, "%d,%d\t%[^\t]\t", &tmp_int[0], &tmp_int[1], + tmp_str[0]) < 3) + return 1; + a->guild_id = tmp_int[0]; + a->opposition = tmp_int[1]; + memcpy (a->name, tmp_str[0], 24); + + for (j = 0; j < 2 && str != NULL; j++) // 位置スキップ + str = strchr (str + 1, '\t'); + } +// printf("GuildAllianceInfo OK\n"); + // 追放リスト + if (sscanf (str + 1, "%d\t", &c) < 1) + return 1; + str = strchr (str + 1, '\t'); // 位置スキップ + for (i = 0; i < c; i++) + { + struct guild_explusion *e = &g->explusion[i]; + if (sscanf (str + 1, "%d,%d,%d,%d\t%[^\t]\t%[^\t]\t%[^\t]\t", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + tmp_str[0], tmp_str[1], tmp_str[2]) < 6) + return 1; + e->account_id = tmp_int[0]; + e->rsv1 = tmp_int[1]; + e->rsv2 = tmp_int[2]; + e->rsv3 = tmp_int[3]; + memcpy (e->name, tmp_str[0], 24); + memcpy (e->acc, tmp_str[1], 24); + tmp_str[2][strlen (tmp_str[2]) - 1] = 0; + memcpy (e->mes, tmp_str[2], 40); + + for (j = 0; j < 4 && str != NULL; j++) // 位置スキップ + str = strchr (str + 1, '\t'); + } +// printf("GuildExplusionInfo OK\n"); + // ギルドスキル + for (i = 0; i < MAX_GUILDSKILL; i++) + { + if (sscanf (str + 1, "%d,%d ", &tmp_int[0], &tmp_int[1]) < 2) + break; + g->skill[i].id = tmp_int[0]; + g->skill[i].lv = tmp_int[1]; + str = strchr (str + 1, ' '); + } + str = strchr (str + 1, '\t'); +// printf("GuildSkillInfo OK\n"); + + return 0; } // ギルド城データの文字列への変換 -int inter_guildcastle_tostr(char *str, struct guild_castle *gc) { - int len; - - len = sprintf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", // added Guardian HP [Valaris] - gc->castle_id, gc->guild_id, gc->economy, gc->defense, gc->triggerE, - gc->triggerD, gc->nextTime, gc->payTime, gc->createTime, gc->visibleC, - gc->visibleG0, gc->visibleG1, gc->visibleG2, gc->visibleG3, gc->visibleG4, - gc->visibleG5, gc->visibleG6, gc->visibleG7, gc->Ghp0, gc->Ghp1, gc->Ghp2, - gc->Ghp3, gc->Ghp4, gc->Ghp5, gc->Ghp6, gc->Ghp7); - - return 0; +int inter_guildcastle_tostr (char *str, struct guild_castle *gc) +{ + int len; + + len = sprintf (str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", // added Guardian HP [Valaris] + gc->castle_id, gc->guild_id, gc->economy, gc->defense, + gc->triggerE, gc->triggerD, gc->nextTime, gc->payTime, + gc->createTime, gc->visibleC, gc->visibleG0, gc->visibleG1, + gc->visibleG2, gc->visibleG3, gc->visibleG4, gc->visibleG5, + gc->visibleG6, gc->visibleG7, gc->Ghp0, gc->Ghp1, gc->Ghp2, + gc->Ghp3, gc->Ghp4, gc->Ghp5, gc->Ghp6, gc->Ghp7); + + return 0; } // ギルド城データの文字列からの変換 -int inter_guildcastle_fromstr(char *str, struct guild_castle *gc) { - int tmp_int[26]; - - memset(gc, 0, sizeof(struct guild_castle)); - // new structure of guild castle - if (sscanf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13], - &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], &tmp_int[19], &tmp_int[20], - &tmp_int[21], &tmp_int[22], &tmp_int[23], &tmp_int[24], &tmp_int[25]) == 26) { - gc->castle_id = tmp_int[0]; - gc->guild_id = tmp_int[1]; - gc->economy = tmp_int[2]; - gc->defense = tmp_int[3]; - gc->triggerE = tmp_int[4]; - gc->triggerD = tmp_int[5]; - gc->nextTime = tmp_int[6]; - gc->payTime = tmp_int[7]; - gc->createTime = tmp_int[8]; - gc->visibleC = tmp_int[9]; - gc->visibleG0 = tmp_int[10]; - gc->visibleG1 = tmp_int[11]; - gc->visibleG2 = tmp_int[12]; - gc->visibleG3 = tmp_int[13]; - gc->visibleG4 = tmp_int[14]; - gc->visibleG5 = tmp_int[15]; - gc->visibleG6 = tmp_int[16]; - gc->visibleG7 = tmp_int[17]; - gc->Ghp0 = tmp_int[18]; - gc->Ghp1 = tmp_int[19]; - gc->Ghp2 = tmp_int[20]; - gc->Ghp3 = tmp_int[21]; - gc->Ghp4 = tmp_int[22]; - gc->Ghp5 = tmp_int[23]; - gc->Ghp6 = tmp_int[24]; - gc->Ghp7 = tmp_int[25]; // end additions [Valaris] - // old structure of guild castle - } else if (sscanf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13], - &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17]) == 18) { - gc->castle_id = tmp_int[0]; - gc->guild_id = tmp_int[1]; - gc->economy = tmp_int[2]; - gc->defense = tmp_int[3]; - gc->triggerE = tmp_int[4]; - gc->triggerD = tmp_int[5]; - gc->nextTime = tmp_int[6]; - gc->payTime = tmp_int[7]; - gc->createTime = tmp_int[8]; - gc->visibleC = tmp_int[9]; - gc->visibleG0 = tmp_int[10]; - gc->visibleG1 = tmp_int[11]; - gc->visibleG2 = tmp_int[12]; - gc->visibleG3 = tmp_int[13]; - gc->visibleG4 = tmp_int[14]; - gc->visibleG5 = tmp_int[15]; - gc->visibleG6 = tmp_int[16]; - gc->visibleG7 = tmp_int[17]; - if (gc->visibleG0 == 1) - gc->Ghp0 = 15670 + 2000 * gc->defense; - else - gc->Ghp0 = 0; - if (gc->visibleG1 == 1) - gc->Ghp1 = 15670 + 2000 * gc->defense; - else - gc->Ghp1 = 0; - if (gc->visibleG2 == 1) - gc->Ghp2 = 15670 + 2000 * gc->defense; - else - gc->Ghp2 = 0; - if (gc->visibleG3 == 1) - gc->Ghp3 = 30214 + 2000 * gc->defense; - else - gc->Ghp3 = 0; - if (gc->visibleG4 == 1) - gc->Ghp4 = 30214 + 2000 * gc->defense; - else - gc->Ghp4 = 0; - if (gc->visibleG5 == 1) - gc->Ghp5 = 28634 + 2000 * gc->defense; - else - gc->Ghp5 = 0; - if (gc->visibleG6 == 1) - gc->Ghp6 = 28634 + 2000 * gc->defense; - else - gc->Ghp6 = 0; - if (gc->visibleG7 == 1) - gc->Ghp7 = 28634 + 2000 * gc->defense; - else - gc->Ghp7 = 0; - } else { - return 1; - } - - return 0; +int inter_guildcastle_fromstr (char *str, struct guild_castle *gc) +{ + int tmp_int[26]; + + memset (gc, 0, sizeof (struct guild_castle)); + // new structure of guild castle + if (sscanf + (str, + "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], + &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], + &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13], &tmp_int[14], + &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], &tmp_int[19], + &tmp_int[20], &tmp_int[21], &tmp_int[22], &tmp_int[23], &tmp_int[24], + &tmp_int[25]) == 26) + { + gc->castle_id = tmp_int[0]; + gc->guild_id = tmp_int[1]; + gc->economy = tmp_int[2]; + gc->defense = tmp_int[3]; + gc->triggerE = tmp_int[4]; + gc->triggerD = tmp_int[5]; + gc->nextTime = tmp_int[6]; + gc->payTime = tmp_int[7]; + gc->createTime = tmp_int[8]; + gc->visibleC = tmp_int[9]; + gc->visibleG0 = tmp_int[10]; + gc->visibleG1 = tmp_int[11]; + gc->visibleG2 = tmp_int[12]; + gc->visibleG3 = tmp_int[13]; + gc->visibleG4 = tmp_int[14]; + gc->visibleG5 = tmp_int[15]; + gc->visibleG6 = tmp_int[16]; + gc->visibleG7 = tmp_int[17]; + gc->Ghp0 = tmp_int[18]; + gc->Ghp1 = tmp_int[19]; + gc->Ghp2 = tmp_int[20]; + gc->Ghp3 = tmp_int[21]; + gc->Ghp4 = tmp_int[22]; + gc->Ghp5 = tmp_int[23]; + gc->Ghp6 = tmp_int[24]; + gc->Ghp7 = tmp_int[25]; // end additions [Valaris] + // old structure of guild castle + } + else if (sscanf + (str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], &tmp_int[4], + &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], + &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13], + &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17]) == 18) + { + gc->castle_id = tmp_int[0]; + gc->guild_id = tmp_int[1]; + gc->economy = tmp_int[2]; + gc->defense = tmp_int[3]; + gc->triggerE = tmp_int[4]; + gc->triggerD = tmp_int[5]; + gc->nextTime = tmp_int[6]; + gc->payTime = tmp_int[7]; + gc->createTime = tmp_int[8]; + gc->visibleC = tmp_int[9]; + gc->visibleG0 = tmp_int[10]; + gc->visibleG1 = tmp_int[11]; + gc->visibleG2 = tmp_int[12]; + gc->visibleG3 = tmp_int[13]; + gc->visibleG4 = tmp_int[14]; + gc->visibleG5 = tmp_int[15]; + gc->visibleG6 = tmp_int[16]; + gc->visibleG7 = tmp_int[17]; + if (gc->visibleG0 == 1) + gc->Ghp0 = 15670 + 2000 * gc->defense; + else + gc->Ghp0 = 0; + if (gc->visibleG1 == 1) + gc->Ghp1 = 15670 + 2000 * gc->defense; + else + gc->Ghp1 = 0; + if (gc->visibleG2 == 1) + gc->Ghp2 = 15670 + 2000 * gc->defense; + else + gc->Ghp2 = 0; + if (gc->visibleG3 == 1) + gc->Ghp3 = 30214 + 2000 * gc->defense; + else + gc->Ghp3 = 0; + if (gc->visibleG4 == 1) + gc->Ghp4 = 30214 + 2000 * gc->defense; + else + gc->Ghp4 = 0; + if (gc->visibleG5 == 1) + gc->Ghp5 = 28634 + 2000 * gc->defense; + else + gc->Ghp5 = 0; + if (gc->visibleG6 == 1) + gc->Ghp6 = 28634 + 2000 * gc->defense; + else + gc->Ghp6 = 0; + if (gc->visibleG7 == 1) + gc->Ghp7 = 28634 + 2000 * gc->defense; + else + gc->Ghp7 = 0; + } + else + { + return 1; + } + + return 0; } // ギルド関連データベース読み込み -int inter_guild_readdb() { - int i; - FILE *fp; - char line[1024]; - - fp = fopen_("db/exp_guild.txt", "r"); - if (fp == NULL) { - printf("can't read db/exp_guild.txt\n"); - return 1; - } - i = 0; - while(fgets(line, sizeof(line)-1, fp) && i < 100){ - if (line[0] == '/' && line[1] == '/') - continue; - guild_exp[i] = atoi(line); - i++; - } - fclose_(fp); - - return 0; +int inter_guild_readdb () +{ + int i; + FILE *fp; + char line[1024]; + + fp = fopen_ ("db/exp_guild.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/exp_guild.txt\n"); + return 1; + } + i = 0; + while (fgets (line, sizeof (line) - 1, fp) && i < 100) + { + if (line[0] == '/' && line[1] == '/') + continue; + guild_exp[i] = atoi (line); + i++; + } + fclose_ (fp); + + return 0; } // ギルドデータの読み込み -int inter_guild_init() { - char line[16384]; - struct guild *g; - struct guild_castle *gc; - FILE *fp; - int i, j, c = 0; - - inter_guild_readdb(); - - guild_db = numdb_init(); - castle_db = numdb_init(); - - if ((fp = fopen_(guild_txt,"r")) == NULL) - return 1; - while(fgets(line, sizeof(line)-1, fp)) { - j = 0; - if (sscanf(line, "%d\t%%newid%%\n%n", &i, &j) == 1 && j > 0 && guild_newid <= i) { - guild_newid = i; - continue; - } - - g = calloc(sizeof(struct guild), 1); - if(g == NULL){ - printf("int_guild: out of memory!\n"); - exit(0); - } - memset(g, 0, sizeof(struct guild)); - if (inter_guild_fromstr(line, g) == 0 && g->guild_id > 0) { - if (g->guild_id >= guild_newid) - guild_newid = g->guild_id + 1; - numdb_insert(guild_db, g->guild_id, g); - guild_check_empty(g); - guild_calcinfo(g); - } else { - printf("int_guild: broken data [%s] line %d\n", guild_txt, c); - free(g); - } - c++; - } - fclose_(fp); -// printf("int_guild: %s read done (%d guilds)\n", guild_txt, c); - - c = 0;//カウンタ初期化 - - if ((fp = fopen_(castle_txt, "r")) == NULL) { - return 1; - } - - while(fgets(line, sizeof(line)-1, fp)) { - gc = calloc(sizeof(struct guild_castle), 1); - if(gc == NULL){ - printf("int_guild: out of memory!\n"); - exit(0); - } - memset(gc, 0, sizeof(struct guild_castle)); - if (inter_guildcastle_fromstr(line, gc) == 0) { - numdb_insert(castle_db, gc->castle_id, gc); - } else { - printf("int_guild: broken data [%s] line %d\n", castle_txt, c); - free(gc); - } - c++; - } - - if (!c) { - printf(" %s - making Default Data...\n", castle_txt); - //デフォルトデータを作成 - for(i = 0; i < MAX_GUILDCASTLE; i++) { - gc = calloc(sizeof(struct guild_castle), 1); - if (gc == NULL) { - printf("int_guild: out of memory!\n"); - exit(0); - } - memset(gc, 0, sizeof(struct guild_castle)); - gc->castle_id = i; - gc->guild_id = 0; - gc->economy = 0; - gc->defense = 0; - gc->triggerE = 0; - gc->triggerD = 0; - gc->nextTime = 0; - gc->payTime = 0; - gc->createTime = 0; - gc->visibleC = 0; - gc->visibleG0 = 0; - gc->visibleG1 = 0; - gc->visibleG2 = 0; - gc->visibleG3 = 0; - gc->visibleG4 = 0; - gc->visibleG5 = 0; - gc->visibleG6 = 0; - gc->visibleG7 = 0; - gc->Ghp0 = 0; // guardian HP [Valaris] - gc->Ghp1 = 0; - gc->Ghp2 = 0; - gc->Ghp3 = 0; - gc->Ghp4 = 0; - gc->Ghp5 = 0; - gc->Ghp6 = 0; - gc->Ghp7 = 0; // end additions [Valaris] - numdb_insert(castle_db, gc->castle_id, gc); - } - printf(" %s - making done\n",castle_txt); - return 0; - } - - fclose_(fp); - - return 0; +int inter_guild_init () +{ + char line[16384]; + struct guild *g; + struct guild_castle *gc; + FILE *fp; + int i, j, c = 0; + + inter_guild_readdb (); + + guild_db = numdb_init (); + castle_db = numdb_init (); + + if ((fp = fopen_ (guild_txt, "r")) == NULL) + return 1; + while (fgets (line, sizeof (line) - 1, fp)) + { + j = 0; + if (sscanf (line, "%d\t%%newid%%\n%n", &i, &j) == 1 && j > 0 + && guild_newid <= i) + { + guild_newid = i; + continue; + } + + g = calloc (sizeof (struct guild), 1); + if (g == NULL) + { + printf ("int_guild: out of memory!\n"); + exit (0); + } + memset (g, 0, sizeof (struct guild)); + if (inter_guild_fromstr (line, g) == 0 && g->guild_id > 0) + { + if (g->guild_id >= guild_newid) + guild_newid = g->guild_id + 1; + numdb_insert (guild_db, g->guild_id, g); + guild_check_empty (g); + guild_calcinfo (g); + } + else + { + printf ("int_guild: broken data [%s] line %d\n", guild_txt, c); + free (g); + } + c++; + } + fclose_ (fp); +// printf("int_guild: %s read done (%d guilds)\n", guild_txt, c); + + c = 0; //カウンタ初期化 + + if ((fp = fopen_ (castle_txt, "r")) == NULL) + { + return 1; + } + + while (fgets (line, sizeof (line) - 1, fp)) + { + gc = calloc (sizeof (struct guild_castle), 1); + if (gc == NULL) + { + printf ("int_guild: out of memory!\n"); + exit (0); + } + memset (gc, 0, sizeof (struct guild_castle)); + if (inter_guildcastle_fromstr (line, gc) == 0) + { + numdb_insert (castle_db, gc->castle_id, gc); + } + else + { + printf ("int_guild: broken data [%s] line %d\n", castle_txt, c); + free (gc); + } + c++; + } + + if (!c) + { + printf (" %s - making Default Data...\n", castle_txt); + //デフォルトデータを作成 + for (i = 0; i < MAX_GUILDCASTLE; i++) + { + gc = calloc (sizeof (struct guild_castle), 1); + if (gc == NULL) + { + printf ("int_guild: out of memory!\n"); + exit (0); + } + memset (gc, 0, sizeof (struct guild_castle)); + gc->castle_id = i; + gc->guild_id = 0; + gc->economy = 0; + gc->defense = 0; + gc->triggerE = 0; + gc->triggerD = 0; + gc->nextTime = 0; + gc->payTime = 0; + gc->createTime = 0; + gc->visibleC = 0; + gc->visibleG0 = 0; + gc->visibleG1 = 0; + gc->visibleG2 = 0; + gc->visibleG3 = 0; + gc->visibleG4 = 0; + gc->visibleG5 = 0; + gc->visibleG6 = 0; + gc->visibleG7 = 0; + gc->Ghp0 = 0; // guardian HP [Valaris] + gc->Ghp1 = 0; + gc->Ghp2 = 0; + gc->Ghp3 = 0; + gc->Ghp4 = 0; + gc->Ghp5 = 0; + gc->Ghp6 = 0; + gc->Ghp7 = 0; // end additions [Valaris] + numdb_insert (castle_db, gc->castle_id, gc); + } + printf (" %s - making done\n", castle_txt); + return 0; + } + + fclose_ (fp); + + return 0; } -struct guild *inter_guild_search(int guild_id) { - struct guild *g; +struct guild *inter_guild_search (int guild_id) +{ + struct guild *g; - g=numdb_search(guild_db, guild_id); + g = numdb_search (guild_db, guild_id); - return g; + return g; } // ギルドデータのセーブ用 -int inter_guild_save_sub(void *key,void *data,va_list ap) { - char line[16384]; - FILE *fp; +int inter_guild_save_sub (void *key, void *data, va_list ap) +{ + char line[16384]; + FILE *fp; - inter_guild_tostr(line,(struct guild *)data); - fp=va_arg(ap,FILE *); - fprintf(fp,"%s" RETCODE,line); + inter_guild_tostr (line, (struct guild *) data); + fp = va_arg (ap, FILE *); + fprintf (fp, "%s" RETCODE, line); - return 0; + return 0; } // ギルド城データのセーブ用 -int inter_castle_save_sub(void *key, void *data, va_list ap) { - char line[16384]; - FILE *fp; +int inter_castle_save_sub (void *key, void *data, va_list ap) +{ + char line[16384]; + FILE *fp; - inter_guildcastle_tostr(line, (struct guild_castle *)data); - fp = va_arg(ap, FILE *); - fprintf(fp, "%s" RETCODE, line); + inter_guildcastle_tostr (line, (struct guild_castle *) data); + fp = va_arg (ap, FILE *); + fprintf (fp, "%s" RETCODE, line); - return 0; + return 0; } // ギルドデータのセーブ -int inter_guild_save() { - FILE *fp; - int lock; - - if ((fp = lock_fopen(guild_txt, &lock)) == NULL) { - printf("int_guild: cant write [%s] !!! data is lost !!!\n", guild_txt); - return 1; - } - numdb_foreach(guild_db, inter_guild_save_sub, fp); -// fprintf(fp, "%d\t%%newid%%\n", guild_newid); - lock_fclose(fp, guild_txt, &lock); -// printf("int_guild: %s saved.\n", guild_txt); - - if ((fp = lock_fopen(castle_txt,&lock)) == NULL) { - printf("int_guild: cant write [%s] !!! data is lost !!!\n", castle_txt); - return 1; - } - numdb_foreach(castle_db, inter_castle_save_sub, fp); - lock_fclose(fp, castle_txt, &lock); - - return 0; +int inter_guild_save () +{ + FILE *fp; + int lock; + + if ((fp = lock_fopen (guild_txt, &lock)) == NULL) + { + printf ("int_guild: cant write [%s] !!! data is lost !!!\n", + guild_txt); + return 1; + } + numdb_foreach (guild_db, inter_guild_save_sub, fp); +// fprintf(fp, "%d\t%%newid%%\n", guild_newid); + lock_fclose (fp, guild_txt, &lock); +// printf("int_guild: %s saved.\n", guild_txt); + + if ((fp = lock_fopen (castle_txt, &lock)) == NULL) + { + printf ("int_guild: cant write [%s] !!! data is lost !!!\n", + castle_txt); + return 1; + } + numdb_foreach (castle_db, inter_castle_save_sub, fp); + lock_fclose (fp, castle_txt, &lock); + + return 0; } // ギルド名検索用 -int search_guildname_sub(void *key, void *data, va_list ap) { - struct guild *g = (struct guild *)data, **dst; - char *str; - - str = va_arg(ap, char *); - dst = va_arg(ap, struct guild **); - if (strcmpi(g->name, str) == 0) - *dst = g; - return 0; +int search_guildname_sub (void *key, void *data, va_list ap) +{ + struct guild *g = (struct guild *) data, **dst; + char *str; + + str = va_arg (ap, char *); + dst = va_arg (ap, struct guild **); + if (strcmpi (g->name, str) == 0) + *dst = g; + return 0; } // ギルド名検索 -struct guild* search_guildname(char *str) { - struct guild *g = NULL; - numdb_foreach(guild_db, search_guildname_sub, str, &g); - return g; +struct guild *search_guildname (char *str) +{ + struct guild *g = NULL; + numdb_foreach (guild_db, search_guildname_sub, str, &g); + return g; } // ギルドが空かどうかチェック -int guild_check_empty(struct guild *g) { - int i; - - for(i = 0; i < g->max_member; i++) { - if (g->member[i].account_id > 0) { - return 0; - } - } - // 誰もいないので解散 - numdb_foreach(guild_db, guild_break_sub, g->guild_id); - numdb_erase(guild_db, g->guild_id); - inter_guild_storage_delete(g->guild_id); - mapif_guild_broken(g->guild_id, 0); - free(g); - - return 1; +int guild_check_empty (struct guild *g) +{ + int i; + + for (i = 0; i < g->max_member; i++) + { + if (g->member[i].account_id > 0) + { + return 0; + } + } + // 誰もいないので解散 + numdb_foreach (guild_db, guild_break_sub, g->guild_id); + numdb_erase (guild_db, g->guild_id); + inter_guild_storage_delete (g->guild_id); + mapif_guild_broken (g->guild_id, 0); + free (g); + + return 1; } // キャラの競合がないかチェック用 -int guild_check_conflict_sub(void *key, void *data, va_list ap) { - struct guild *g = (struct guild *)data; - int guild_id, account_id, char_id, i; - - guild_id = va_arg(ap, int); - account_id = va_arg(ap, int); - char_id = va_arg(ap, int); - - if (g->guild_id == guild_id) // 本来の所属なので問題なし - return 0; - - for(i = 0; i < MAX_GUILD; i++) { - if (g->member[i].account_id == account_id && g->member[i].char_id == char_id) { - // 別のギルドに偽の所属データがあるので脱退 - printf("int_guild: guild conflict! %d,%d %d!=%d\n", account_id, char_id, guild_id, g->guild_id); - mapif_parse_GuildLeave(-1, g->guild_id, account_id, char_id, 0, "**データ競合**"); - } - } - - return 0; +int guild_check_conflict_sub (void *key, void *data, va_list ap) +{ + struct guild *g = (struct guild *) data; + int guild_id, account_id, char_id, i; + + guild_id = va_arg (ap, int); + account_id = va_arg (ap, int); + char_id = va_arg (ap, int); + + if (g->guild_id == guild_id) // 本来の所属なので問題なし + return 0; + + for (i = 0; i < MAX_GUILD; i++) + { + if (g->member[i].account_id == account_id + && g->member[i].char_id == char_id) + { + // 別のギルドに偽の所属データがあるので脱退 + printf ("int_guild: guild conflict! %d,%d %d!=%d\n", account_id, + char_id, guild_id, g->guild_id); + mapif_parse_GuildLeave (-1, g->guild_id, account_id, char_id, 0, + "**データ競合**"); + } + } + + return 0; } + // キャラの競合がないかチェック -int guild_check_conflict(int guild_id, int account_id, int char_id) { - numdb_foreach(guild_db, guild_check_conflict_sub, guild_id, account_id, char_id); +int guild_check_conflict (int guild_id, int account_id, int char_id) +{ + numdb_foreach (guild_db, guild_check_conflict_sub, guild_id, account_id, + char_id); - return 0; + return 0; } -int guild_nextexp(int level) { - if (level < 100) - return guild_exp[level-1]; +int guild_nextexp (int level) +{ + if (level < 100) + return guild_exp[level - 1]; - return 0; + return 0; } // ギルドスキルがあるか確認 -int guild_checkskill(struct guild *g, int id){ - return g->skill[id-10000].lv; +int guild_checkskill (struct guild *g, int id) +{ + return g->skill[id - 10000].lv; } // ギルドの情報の再計算 -int guild_calcinfo(struct guild *g) { - int i, c, nextexp; - struct guild before = *g; - - // スキルIDの設定 - for(i = 0; i < 5; i++) - g->skill[i].id = i + 10000; - - // ギルドレベル - if (g->guild_lv <= 0) - g->guild_lv = 1; - nextexp = guild_nextexp(g->guild_lv); - if (nextexp > 0) { - while(g->exp >= nextexp) { // レベルアップ処理 - g->exp -= nextexp; - g->guild_lv++; - g->skill_point++; - nextexp = guild_nextexp(g->guild_lv); - } - } - - // ギルドの次の経験値 - g->next_exp = guild_nextexp(g->guild_lv); - - // メンバ上限(ギルド拡張適用) - g->max_member = 16 + guild_checkskill(g, 10004) * 2; - - // 平均レベルとオンライン人数 - g->average_lv = 0; - g->connect_member = 0; - c = 0; - for(i = 0; i < g->max_member; i++) { - if (g->member[i].account_id > 0) { - g->average_lv += g->member[i].lv; - c++; - if (g->member[i].online > 0) - g->connect_member++; - } - } - g->average_lv /= c; - - // 全データを送る必要がありそう - if (g->max_member != before.max_member || - g->guild_lv != before.guild_lv || - g->skill_point != before.skill_point) { - mapif_guild_info(-1, g); - return 1; - } - - return 0; +int guild_calcinfo (struct guild *g) +{ + int i, c, nextexp; + struct guild before = *g; + + // スキルIDの設定 + for (i = 0; i < 5; i++) + g->skill[i].id = i + 10000; + + // ギルドレベル + if (g->guild_lv <= 0) + g->guild_lv = 1; + nextexp = guild_nextexp (g->guild_lv); + if (nextexp > 0) + { + while (g->exp >= nextexp) + { // レベルアップ処理 + g->exp -= nextexp; + g->guild_lv++; + g->skill_point++; + nextexp = guild_nextexp (g->guild_lv); + } + } + + // ギルドの次の経験値 + g->next_exp = guild_nextexp (g->guild_lv); + + // メンバ上限(ギルド拡張適用) + g->max_member = 16 + guild_checkskill (g, 10004) * 2; + + // 平均レベルとオンライン人数 + g->average_lv = 0; + g->connect_member = 0; + c = 0; + for (i = 0; i < g->max_member; i++) + { + if (g->member[i].account_id > 0) + { + g->average_lv += g->member[i].lv; + c++; + if (g->member[i].online > 0) + g->connect_member++; + } + } + g->average_lv /= c; + + // 全データを送る必要がありそう + if (g->max_member != before.max_member || + g->guild_lv != before.guild_lv || + g->skill_point != before.skill_point) + { + mapif_guild_info (-1, g); + return 1; + } + + return 0; } //------------------------------------------------------------------- // map serverへの通信 // ギルド作成可否 -int mapif_guild_created(int fd, int account_id, struct guild *g) { - WFIFOW(fd,0) = 0x3830; - WFIFOL(fd,2) = account_id; - if (g != NULL) { - WFIFOL(fd,6) = g->guild_id; - printf("int_guild: created! %d %s\n", g->guild_id, g->name); - }else{ - WFIFOL(fd,6) = 0; - } - WFIFOSET(fd,10); - return 0; +int mapif_guild_created (int fd, int account_id, struct guild *g) +{ + WFIFOW (fd, 0) = 0x3830; + WFIFOL (fd, 2) = account_id; + if (g != NULL) + { + WFIFOL (fd, 6) = g->guild_id; + printf ("int_guild: created! %d %s\n", g->guild_id, g->name); + } + else + { + WFIFOL (fd, 6) = 0; + } + WFIFOSET (fd, 10); + return 0; } // ギルド情報見つからず -int mapif_guild_noinfo(int fd, int guild_id) { - WFIFOW(fd,0) = 0x3831; - WFIFOW(fd,2) = 8; - WFIFOL(fd,4) = guild_id; - WFIFOSET(fd,8); - printf("int_guild: info not found %d\n", guild_id); - - return 0; +int mapif_guild_noinfo (int fd, int guild_id) +{ + WFIFOW (fd, 0) = 0x3831; + WFIFOW (fd, 2) = 8; + WFIFOL (fd, 4) = guild_id; + WFIFOSET (fd, 8); + printf ("int_guild: info not found %d\n", guild_id); + + return 0; } // ギルド情報まとめ送り -int mapif_guild_info(int fd, struct guild *g) { - unsigned char buf[4 + sizeof(struct guild)]; - - WBUFW(buf,0) = 0x3831; - memcpy(buf + 4, g, sizeof(struct guild)); - WBUFW(buf,2) = 4 + sizeof(struct guild); -// printf("int_guild: sizeof(guild)=%d\n", sizeof(struct guild)); - if (fd < 0) - mapif_sendall(buf, WBUFW(buf,2)); - else - mapif_send(fd, buf, WBUFW(buf,2)); -// printf("int_guild: info %d %s\n", p->guild_id, p->name); - - return 0; +int mapif_guild_info (int fd, struct guild *g) +{ + unsigned char buf[4 + sizeof (struct guild)]; + + WBUFW (buf, 0) = 0x3831; + memcpy (buf + 4, g, sizeof (struct guild)); + WBUFW (buf, 2) = 4 + sizeof (struct guild); +// printf("int_guild: sizeof(guild)=%d\n", sizeof(struct guild)); + if (fd < 0) + mapif_sendall (buf, WBUFW (buf, 2)); + else + mapif_send (fd, buf, WBUFW (buf, 2)); +// printf("int_guild: info %d %s\n", p->guild_id, p->name); + + return 0; } // メンバ追加可否 -int mapif_guild_memberadded(int fd, int guild_id, int account_id, int char_id, int flag) { - WFIFOW(fd,0) = 0x3832; - WFIFOL(fd,2) = guild_id; - WFIFOL(fd,6) = account_id; - WFIFOL(fd,10) = char_id; - WFIFOB(fd,14) = flag; - WFIFOSET(fd, 15); - - return 0; +int mapif_guild_memberadded (int fd, int guild_id, int account_id, + int char_id, int flag) +{ + WFIFOW (fd, 0) = 0x3832; + WFIFOL (fd, 2) = guild_id; + WFIFOL (fd, 6) = account_id; + WFIFOL (fd, 10) = char_id; + WFIFOB (fd, 14) = flag; + WFIFOSET (fd, 15); + + return 0; } // 脱退/追放通知 -int mapif_guild_leaved(int guild_id, int account_id, int char_id, int flag, const char *name, const char *mes) { - unsigned char buf[79]; - - WBUFW(buf, 0) = 0x3834; - WBUFL(buf, 2) = guild_id; - WBUFL(buf, 6) = account_id; - WBUFL(buf,10) = char_id; - WBUFB(buf,14) = flag; - memcpy(WBUFP(buf,15), mes, 40); - memcpy(WBUFP(buf,55), name, 24); - mapif_sendall(buf, 79); - printf("int_guild: guild leaved %d %d %s %s\n", guild_id, account_id, name, mes); - - return 0; +int mapif_guild_leaved (int guild_id, int account_id, int char_id, int flag, + const char *name, const char *mes) +{ + unsigned char buf[79]; + + WBUFW (buf, 0) = 0x3834; + WBUFL (buf, 2) = guild_id; + WBUFL (buf, 6) = account_id; + WBUFL (buf, 10) = char_id; + WBUFB (buf, 14) = flag; + memcpy (WBUFP (buf, 15), mes, 40); + memcpy (WBUFP (buf, 55), name, 24); + mapif_sendall (buf, 79); + printf ("int_guild: guild leaved %d %d %s %s\n", guild_id, account_id, + name, mes); + + return 0; } // オンライン状態とLv更新通知 -int mapif_guild_memberinfoshort(struct guild *g, int idx) { - unsigned char buf[19]; - - WBUFW(buf, 0) = 0x3835; - WBUFL(buf, 2) = g->guild_id; - WBUFL(buf, 6) = g->member[idx].account_id; - WBUFL(buf,10) = g->member[idx].char_id; - WBUFB(buf,14) = g->member[idx].online; - WBUFW(buf,15) = g->member[idx].lv; - WBUFW(buf,17) = g->member[idx].class; - mapif_sendall(buf, 19); - return 0; +int mapif_guild_memberinfoshort (struct guild *g, int idx) +{ + unsigned char buf[19]; + + WBUFW (buf, 0) = 0x3835; + WBUFL (buf, 2) = g->guild_id; + WBUFL (buf, 6) = g->member[idx].account_id; + WBUFL (buf, 10) = g->member[idx].char_id; + WBUFB (buf, 14) = g->member[idx].online; + WBUFW (buf, 15) = g->member[idx].lv; + WBUFW (buf, 17) = g->member[idx].class; + mapif_sendall (buf, 19); + return 0; } // 解散通知 -int mapif_guild_broken(int guild_id, int flag) { - unsigned char buf[7]; +int mapif_guild_broken (int guild_id, int flag) +{ + unsigned char buf[7]; - WBUFW(buf,0) = 0x3836; - WBUFL(buf,2) = guild_id; - WBUFB(buf,6) = flag; - mapif_sendall(buf, 7); - printf("int_guild: broken %d\n", guild_id); + WBUFW (buf, 0) = 0x3836; + WBUFL (buf, 2) = guild_id; + WBUFB (buf, 6) = flag; + mapif_sendall (buf, 7); + printf ("int_guild: broken %d\n", guild_id); - return 0; + return 0; } // ギルド内発言 -int mapif_guild_message(int guild_id, int account_id, char *mes, int len) { - unsigned char buf[len+12]; - - WBUFW(buf,0) = 0x3837; - WBUFW(buf,2) = len + 12; - WBUFL(buf,4) = guild_id; - WBUFL(buf,8) = account_id; - memcpy(WBUFP(buf,12), mes, len); - mapif_sendall(buf, len + 12); - - return 0; +int mapif_guild_message (int guild_id, int account_id, char *mes, int len) +{ + unsigned char buf[len + 12]; + + WBUFW (buf, 0) = 0x3837; + WBUFW (buf, 2) = len + 12; + WBUFL (buf, 4) = guild_id; + WBUFL (buf, 8) = account_id; + memcpy (WBUFP (buf, 12), mes, len); + mapif_sendall (buf, len + 12); + + return 0; } // ギルド基本情報変更通知 -int mapif_guild_basicinfochanged(int guild_id, int type, const void *data, int len) { - unsigned char buf[2048]; - - WBUFW(buf,0) = 0x3839; - WBUFW(buf,2) = len+10; - WBUFL(buf,4) = guild_id; - WBUFW(buf,8) = type; - memcpy(WBUFP(buf,10),data,len); - mapif_sendall(buf,len+10); - return 0; +int mapif_guild_basicinfochanged (int guild_id, int type, const void *data, + int len) +{ + unsigned char buf[2048]; + + WBUFW (buf, 0) = 0x3839; + WBUFW (buf, 2) = len + 10; + WBUFL (buf, 4) = guild_id; + WBUFW (buf, 8) = type; + memcpy (WBUFP (buf, 10), data, len); + mapif_sendall (buf, len + 10); + return 0; } // ギルドメンバ情報変更通知 -int mapif_guild_memberinfochanged(int guild_id, int account_id, int char_id, int type, const void *data, int len) { - unsigned char buf[len + 18]; - - WBUFW(buf, 0) = 0x383a; - WBUFW(buf, 2) = len + 18; - WBUFL(buf, 4) = guild_id; - WBUFL(buf, 8) = account_id; - WBUFL(buf,12) = char_id; - WBUFW(buf,16) = type; - memcpy(WBUFP(buf,18), data, len); - mapif_sendall(buf,len+18); - - return 0; +int mapif_guild_memberinfochanged (int guild_id, int account_id, int char_id, + int type, const void *data, int len) +{ + unsigned char buf[len + 18]; + + WBUFW (buf, 0) = 0x383a; + WBUFW (buf, 2) = len + 18; + WBUFL (buf, 4) = guild_id; + WBUFL (buf, 8) = account_id; + WBUFL (buf, 12) = char_id; + WBUFW (buf, 16) = type; + memcpy (WBUFP (buf, 18), data, len); + mapif_sendall (buf, len + 18); + + return 0; } // ギルドスキルアップ通知 -int mapif_guild_skillupack(int guild_id, int skill_num, int account_id) { - unsigned char buf[14]; +int mapif_guild_skillupack (int guild_id, int skill_num, int account_id) +{ + unsigned char buf[14]; - WBUFW(buf, 0) = 0x383c; - WBUFL(buf, 2) = guild_id; - WBUFL(buf, 6) = skill_num; - WBUFL(buf,10) = account_id; - mapif_sendall(buf, 14); + WBUFW (buf, 0) = 0x383c; + WBUFL (buf, 2) = guild_id; + WBUFL (buf, 6) = skill_num; + WBUFL (buf, 10) = account_id; + mapif_sendall (buf, 14); - return 0; + return 0; } // ギルド同盟/敵対通知 -int mapif_guild_alliance(int guild_id1, int guild_id2, int account_id1, int account_id2, int flag, const char *name1, const char *name2) { - unsigned char buf[67]; - - WBUFW(buf, 0) = 0x383d; - WBUFL(buf, 2) = guild_id1; - WBUFL(buf, 6) = guild_id2; - WBUFL(buf,10) = account_id1; - WBUFL(buf,14) = account_id2; - WBUFB(buf,18) = flag; - memcpy(WBUFP(buf,19), name1, 24); - memcpy(WBUFP(buf,43), name2, 24); - mapif_sendall(buf, 67); - - return 0; +int mapif_guild_alliance (int guild_id1, int guild_id2, int account_id1, + int account_id2, int flag, const char *name1, + const char *name2) +{ + unsigned char buf[67]; + + WBUFW (buf, 0) = 0x383d; + WBUFL (buf, 2) = guild_id1; + WBUFL (buf, 6) = guild_id2; + WBUFL (buf, 10) = account_id1; + WBUFL (buf, 14) = account_id2; + WBUFB (buf, 18) = flag; + memcpy (WBUFP (buf, 19), name1, 24); + memcpy (WBUFP (buf, 43), name2, 24); + mapif_sendall (buf, 67); + + return 0; } // ギルド役職変更通知 -int mapif_guild_position(struct guild *g, int idx) { - unsigned char buf[sizeof(struct guild_position) + 12]; - - WBUFW(buf,0) = 0x383b; - WBUFW(buf,2) = sizeof(struct guild_position) + 12; - WBUFL(buf,4) = g->guild_id; - WBUFL(buf,8) = idx; - memcpy(WBUFP(buf,12), &g->position[idx], sizeof(struct guild_position)); - mapif_sendall(buf, WBUFW(buf,2)); - - return 0; +int mapif_guild_position (struct guild *g, int idx) +{ + unsigned char buf[sizeof (struct guild_position) + 12]; + + WBUFW (buf, 0) = 0x383b; + WBUFW (buf, 2) = sizeof (struct guild_position) + 12; + WBUFL (buf, 4) = g->guild_id; + WBUFL (buf, 8) = idx; + memcpy (WBUFP (buf, 12), &g->position[idx], + sizeof (struct guild_position)); + mapif_sendall (buf, WBUFW (buf, 2)); + + return 0; } // ギルド告知変更通知 -int mapif_guild_notice(struct guild *g) { - unsigned char buf[186]; +int mapif_guild_notice (struct guild *g) +{ + unsigned char buf[186]; - WBUFW(buf,0) = 0x383e; - WBUFL(buf,2) = g->guild_id; - memcpy(WBUFP(buf,6), g->mes1, 60); - memcpy(WBUFP(buf,66), g->mes2, 120); - mapif_sendall(buf, 186); + WBUFW (buf, 0) = 0x383e; + WBUFL (buf, 2) = g->guild_id; + memcpy (WBUFP (buf, 6), g->mes1, 60); + memcpy (WBUFP (buf, 66), g->mes2, 120); + mapif_sendall (buf, 186); - return 0; + return 0; } // ギルドエンブレム変更通知 -int mapif_guild_emblem(struct guild *g) { - unsigned char buf[2048]; - - WBUFW(buf,0) = 0x383f; - WBUFW(buf,2) = g->emblem_len + 12; - WBUFL(buf,4) = g->guild_id; - WBUFL(buf,8) = g->emblem_id; - memcpy(WBUFP(buf,12), g->emblem_data, g->emblem_len); - mapif_sendall(buf, WBUFW(buf,2)); - - return 0; +int mapif_guild_emblem (struct guild *g) +{ + unsigned char buf[2048]; + + WBUFW (buf, 0) = 0x383f; + WBUFW (buf, 2) = g->emblem_len + 12; + WBUFL (buf, 4) = g->guild_id; + WBUFL (buf, 8) = g->emblem_id; + memcpy (WBUFP (buf, 12), g->emblem_data, g->emblem_len); + mapif_sendall (buf, WBUFW (buf, 2)); + + return 0; } -int mapif_guild_castle_dataload(int castle_id, int index, int value) { - unsigned char buf[9]; +int mapif_guild_castle_dataload (int castle_id, int index, int value) +{ + unsigned char buf[9]; - WBUFW(buf,0) = 0x3840; - WBUFW(buf,2) = castle_id; - WBUFB(buf,4) = index; - WBUFL(buf,5) = value; - mapif_sendall(buf,9); + WBUFW (buf, 0) = 0x3840; + WBUFW (buf, 2) = castle_id; + WBUFB (buf, 4) = index; + WBUFL (buf, 5) = value; + mapif_sendall (buf, 9); - return 0; + return 0; } -int mapif_guild_castle_datasave(int castle_id, int index, int value) { - unsigned char buf[9]; +int mapif_guild_castle_datasave (int castle_id, int index, int value) +{ + unsigned char buf[9]; - WBUFW(buf,0) = 0x3841; - WBUFW(buf,2) = castle_id; - WBUFB(buf,4) = index; - WBUFL(buf,5) = value; - mapif_sendall(buf,9); + WBUFW (buf, 0) = 0x3841; + WBUFW (buf, 2) = castle_id; + WBUFB (buf, 4) = index; + WBUFL (buf, 5) = value; + mapif_sendall (buf, 9); - return 0; + return 0; } -int mapif_guild_castle_alldataload_sub(void *key, void *data, va_list ap) { - int fd = va_arg(ap, int); - int *p = va_arg(ap, int*); +int mapif_guild_castle_alldataload_sub (void *key, void *data, va_list ap) +{ + int fd = va_arg (ap, int); + int *p = va_arg (ap, int *); - memcpy(WFIFOP(fd,*p), (struct guild_castle*)data, sizeof(struct guild_castle)); - (*p) += sizeof(struct guild_castle); + memcpy (WFIFOP (fd, *p), (struct guild_castle *) data, + sizeof (struct guild_castle)); + (*p) += sizeof (struct guild_castle); - return 0; + return 0; } -int mapif_guild_castle_alldataload(int fd) { - int len = 4; +int mapif_guild_castle_alldataload (int fd) +{ + int len = 4; - WFIFOW(fd,0) = 0x3842; - numdb_foreach(castle_db, mapif_guild_castle_alldataload_sub, fd, &len); - WFIFOW(fd,2) = len; - WFIFOSET(fd, len); + WFIFOW (fd, 0) = 0x3842; + numdb_foreach (castle_db, mapif_guild_castle_alldataload_sub, fd, &len); + WFIFOW (fd, 2) = len; + WFIFOSET (fd, len); - return 0; + return 0; } //------------------------------------------------------------------- // map serverからの通信 // ギルド作成要求 -int mapif_parse_CreateGuild(int fd, int account_id, char *name, struct guild_member *master) { - struct guild *g; - int i; - - for(i = 0; i < 24 && name[i]; i++) { - if (!(name[i] & 0xe0) || name[i] == 0x7f) { - printf("int_guild: illeagal guild name [%s]\n", name); - mapif_guild_created(fd, account_id, NULL); - return 0; - } - } - - if ((g = search_guildname(name)) != NULL) { - printf("int_guild: same name guild exists [%s]\n", name); - mapif_guild_created(fd, account_id, NULL); - return 0; - } - g = calloc(sizeof(struct guild), 1); - if (g == NULL) { - printf("int_guild: CreateGuild: out of memory !\n"); - mapif_guild_created(fd, account_id, NULL); - exit(0); - } - memset(g, 0, sizeof(struct guild)); - g->guild_id = guild_newid++; - memcpy(g->name, name, 24); - memcpy(g->master, master->name, 24); - memcpy(&g->member[0], master, sizeof(struct guild_member)); - - g->position[0].mode = 0x11; - strcpy(g->position[ 0].name, "GuildMaster"); - strcpy(g->position[MAX_GUILDPOSITION-1].name, "Newbie"); - for(i = 1; i < MAX_GUILDPOSITION-1; i++) - sprintf(g->position[i].name, "Position %d", i + 1); - - // ここでギルド情報計算が必要と思われる - g->max_member = 16; - g->average_lv = master->lv; - for(i = 0; i < 5; i++) - g->skill[i].id = i + 10000; - - numdb_insert(guild_db, g->guild_id, g); - - mapif_guild_created(fd, account_id, g); - mapif_guild_info(fd, g); - - inter_log("guild %s (id=%d) created by master %s (id=%d)" RETCODE, - name, g->guild_id, master->name, master->account_id); - - return 0; +int mapif_parse_CreateGuild (int fd, int account_id, char *name, + struct guild_member *master) +{ + struct guild *g; + int i; + + for (i = 0; i < 24 && name[i]; i++) + { + if (!(name[i] & 0xe0) || name[i] == 0x7f) + { + printf ("int_guild: illeagal guild name [%s]\n", name); + mapif_guild_created (fd, account_id, NULL); + return 0; + } + } + + if ((g = search_guildname (name)) != NULL) + { + printf ("int_guild: same name guild exists [%s]\n", name); + mapif_guild_created (fd, account_id, NULL); + return 0; + } + g = calloc (sizeof (struct guild), 1); + if (g == NULL) + { + printf ("int_guild: CreateGuild: out of memory !\n"); + mapif_guild_created (fd, account_id, NULL); + exit (0); + } + memset (g, 0, sizeof (struct guild)); + g->guild_id = guild_newid++; + memcpy (g->name, name, 24); + memcpy (g->master, master->name, 24); + memcpy (&g->member[0], master, sizeof (struct guild_member)); + + g->position[0].mode = 0x11; + strcpy (g->position[0].name, "GuildMaster"); + strcpy (g->position[MAX_GUILDPOSITION - 1].name, "Newbie"); + for (i = 1; i < MAX_GUILDPOSITION - 1; i++) + sprintf (g->position[i].name, "Position %d", i + 1); + + // ここでギルド情報計算が必要と思われる + g->max_member = 16; + g->average_lv = master->lv; + for (i = 0; i < 5; i++) + g->skill[i].id = i + 10000; + + numdb_insert (guild_db, g->guild_id, g); + + mapif_guild_created (fd, account_id, g); + mapif_guild_info (fd, g); + + inter_log ("guild %s (id=%d) created by master %s (id=%d)" RETCODE, + name, g->guild_id, master->name, master->account_id); + + return 0; } // ギルド情報要求 -int mapif_parse_GuildInfo(int fd, int guild_id) { - struct guild *g; - - g = numdb_search(guild_db, guild_id); - if (g != NULL){ - guild_calcinfo(g); - mapif_guild_info(fd, g); - } else - mapif_guild_noinfo(fd, guild_id); - - return 0; +int mapif_parse_GuildInfo (int fd, int guild_id) +{ + struct guild *g; + + g = numdb_search (guild_db, guild_id); + if (g != NULL) + { + guild_calcinfo (g); + mapif_guild_info (fd, g); + } + else + mapif_guild_noinfo (fd, guild_id); + + return 0; } // ギルドメンバ追加要求 -int mapif_parse_GuildAddMember(int fd, int guild_id, struct guild_member *m) { - struct guild *g; - int i; - - g = numdb_search(guild_db, guild_id); - if (g == NULL) { - mapif_guild_memberadded(fd, guild_id, m->account_id, m->char_id, 1); - return 0; - } - - for(i = 0; i < g->max_member; i++) { - if (g->member[i].account_id == 0) { - memcpy(&g->member[i], m, sizeof(struct guild_member)); - mapif_guild_memberadded(fd, guild_id, m->account_id, m->char_id, 0); - guild_calcinfo(g); - mapif_guild_info(-1, g); - - return 0; - } - } - mapif_guild_memberadded(fd, guild_id, m->account_id, m->char_id, 1); - - return 0; +int mapif_parse_GuildAddMember (int fd, int guild_id, struct guild_member *m) +{ + struct guild *g; + int i; + + g = numdb_search (guild_db, guild_id); + if (g == NULL) + { + mapif_guild_memberadded (fd, guild_id, m->account_id, m->char_id, 1); + return 0; + } + + for (i = 0; i < g->max_member; i++) + { + if (g->member[i].account_id == 0) + { + memcpy (&g->member[i], m, sizeof (struct guild_member)); + mapif_guild_memberadded (fd, guild_id, m->account_id, m->char_id, + 0); + guild_calcinfo (g); + mapif_guild_info (-1, g); + + return 0; + } + } + mapif_guild_memberadded (fd, guild_id, m->account_id, m->char_id, 1); + + return 0; } // ギルド脱退/追放要求 -int mapif_parse_GuildLeave(int fd, int guild_id, int account_id, int char_id, int flag, const char *mes) { - struct guild *g = NULL; - int i, j; - - g = numdb_search(guild_db, guild_id); - if (g != NULL) { - for(i = 0; i < MAX_GUILD; i++) { - if (g->member[i].account_id == account_id && g->member[i].char_id == char_id) { -// printf("%d %d\n", i, (int)(&g->member[i])); -// printf("%d %s\n", i, g->member[i].name); - - if (flag) { // 追放の場合追放リストに入れる - for(j = 0; j < MAX_GUILDEXPLUSION; j++) { - if (g->explusion[j].account_id == 0) - break; - } - if (j == MAX_GUILDEXPLUSION) { // 一杯なので古いのを消す - for(j = 0; j < MAX_GUILDEXPLUSION - 1; j++) - g->explusion[j] = g->explusion[j+1]; - j = MAX_GUILDEXPLUSION - 1; - } - g->explusion[j].account_id = account_id; - memcpy(g->explusion[j].acc, "dummy", 24); - memcpy(g->explusion[j].name, g->member[i].name, 24); - memcpy(g->explusion[j].mes, mes, 40); - } - - mapif_guild_leaved(guild_id, account_id, char_id, flag, g->member[i].name, mes); -// printf("%d %d\n", i, (int)(&g->member[i])); -// printf("%d %s\n", i, (&g->member[i])->name); - memset(&g->member[i], 0, sizeof(struct guild_member)); - - if (guild_check_empty(g) == 0) - mapif_guild_info(-1,g);// まだ人がいるのでデータ送信 - - return 0; - } - } - } - return 0; +int mapif_parse_GuildLeave (int fd, int guild_id, int account_id, int char_id, + int flag, const char *mes) +{ + struct guild *g = NULL; + int i, j; + + g = numdb_search (guild_db, guild_id); + if (g != NULL) + { + for (i = 0; i < MAX_GUILD; i++) + { + if (g->member[i].account_id == account_id + && g->member[i].char_id == char_id) + { +// printf("%d %d\n", i, (int)(&g->member[i])); +// printf("%d %s\n", i, g->member[i].name); + + if (flag) + { // 追放の場合追放リストに入れる + for (j = 0; j < MAX_GUILDEXPLUSION; j++) + { + if (g->explusion[j].account_id == 0) + break; + } + if (j == MAX_GUILDEXPLUSION) + { // 一杯なので古いのを消す + for (j = 0; j < MAX_GUILDEXPLUSION - 1; j++) + g->explusion[j] = g->explusion[j + 1]; + j = MAX_GUILDEXPLUSION - 1; + } + g->explusion[j].account_id = account_id; + memcpy (g->explusion[j].acc, "dummy", 24); + memcpy (g->explusion[j].name, g->member[i].name, 24); + memcpy (g->explusion[j].mes, mes, 40); + } + + mapif_guild_leaved (guild_id, account_id, char_id, flag, + g->member[i].name, mes); +// printf("%d %d\n", i, (int)(&g->member[i])); +// printf("%d %s\n", i, (&g->member[i])->name); + memset (&g->member[i], 0, sizeof (struct guild_member)); + + if (guild_check_empty (g) == 0) + mapif_guild_info (-1, g); // まだ人がいるのでデータ送信 + + return 0; + } + } + } + return 0; } // オンライン/Lv更新 -int mapif_parse_GuildChangeMemberInfoShort(int fd, int guild_id, int account_id, int char_id, int online, int lv, int class) { - struct guild *g; - int i, alv, c; - - g = numdb_search(guild_db, guild_id); - if (g == NULL) - return 0; - - g->connect_member = 0; - - alv = 0; - c = 0; - for(i = 0; i < MAX_GUILD; i++) { - if (g->member[i].account_id == account_id && g->member[i].char_id == char_id) { - g->member[i].online = online; - g->member[i].lv = lv; - g->member[i].class = class; - mapif_guild_memberinfoshort(g, i); - } - if (g->member[i].account_id > 0) { - alv += g->member[i].lv; - c++; - } - if (g->member[i].online) - g->connect_member++; - } - // 平均レベル - g->average_lv = alv / c; - - return 0; +int mapif_parse_GuildChangeMemberInfoShort (int fd, int guild_id, + int account_id, int char_id, + int online, int lv, int class) +{ + struct guild *g; + int i, alv, c; + + g = numdb_search (guild_db, guild_id); + if (g == NULL) + return 0; + + g->connect_member = 0; + + alv = 0; + c = 0; + for (i = 0; i < MAX_GUILD; i++) + { + if (g->member[i].account_id == account_id + && g->member[i].char_id == char_id) + { + g->member[i].online = online; + g->member[i].lv = lv; + g->member[i].class = class; + mapif_guild_memberinfoshort (g, i); + } + if (g->member[i].account_id > 0) + { + alv += g->member[i].lv; + c++; + } + if (g->member[i].online) + g->connect_member++; + } + // 平均レベル + g->average_lv = alv / c; + + return 0; } // ギルド解散処理用(同盟/敵対を解除) -int guild_break_sub(void *key, void *data, va_list ap) { - struct guild *g = (struct guild *)data; - int guild_id = va_arg(ap, int); - int i; - - for(i = 0; i < MAX_GUILDALLIANCE; i++) { - if (g->alliance[i].guild_id == guild_id) - g->alliance[i].guild_id = 0; - } - return 0; +int guild_break_sub (void *key, void *data, va_list ap) +{ + struct guild *g = (struct guild *) data; + int guild_id = va_arg (ap, int); + int i; + + for (i = 0; i < MAX_GUILDALLIANCE; i++) + { + if (g->alliance[i].guild_id == guild_id) + g->alliance[i].guild_id = 0; + } + return 0; } // ギルド解散要求 -int mapif_parse_BreakGuild(int fd, int guild_id) { - struct guild *g; +int mapif_parse_BreakGuild (int fd, int guild_id) +{ + struct guild *g; - g = numdb_search(guild_db, guild_id); - if(g == NULL) - return 0; + g = numdb_search (guild_db, guild_id); + if (g == NULL) + return 0; - numdb_foreach(guild_db, guild_break_sub, guild_id); - numdb_erase(guild_db, guild_id); - inter_guild_storage_delete(guild_id); - mapif_guild_broken(guild_id, 0); + numdb_foreach (guild_db, guild_break_sub, guild_id); + numdb_erase (guild_db, guild_id); + inter_guild_storage_delete (guild_id); + mapif_guild_broken (guild_id, 0); - inter_log("guild %s (id=%d) broken" RETCODE, g->name, guild_id); - free(g); + inter_log ("guild %s (id=%d) broken" RETCODE, g->name, guild_id); + free (g); - return 0; + return 0; } // ギルドメッセージ送信 -int mapif_parse_GuildMessage(int fd, int guild_id, int account_id, char *mes, int len) { - return mapif_guild_message(guild_id, account_id, mes, len); +int mapif_parse_GuildMessage (int fd, int guild_id, int account_id, char *mes, + int len) +{ + return mapif_guild_message (guild_id, account_id, mes, len); } // ギルド基本データ変更要求 -int mapif_parse_GuildBasicInfoChange(int fd, int guild_id, int type, const char *data, int len) { - struct guild *g; - short dw = *((short *)data); - - g = numdb_search(guild_db, guild_id); - if (g == NULL) - return 0; - - switch(type) { - case GBI_GUILDLV: - if (dw > 0 && g->guild_lv + dw <= 50) { - g->guild_lv+=dw; - g->skill_point+=dw; - } else if (dw < 0 && g->guild_lv + dw >= 1) - g->guild_lv += dw; - mapif_guild_info(-1, g); - return 0; - default: - printf("int_guild: GuildBasicInfoChange: Unknown type %d\n", type); - break; - } - mapif_guild_basicinfochanged(guild_id, type, data, len); - - return 0; +int mapif_parse_GuildBasicInfoChange (int fd, int guild_id, int type, + const char *data, int len) +{ + struct guild *g; + short dw = *((short *) data); + + g = numdb_search (guild_db, guild_id); + if (g == NULL) + return 0; + + switch (type) + { + case GBI_GUILDLV: + if (dw > 0 && g->guild_lv + dw <= 50) + { + g->guild_lv += dw; + g->skill_point += dw; + } + else if (dw < 0 && g->guild_lv + dw >= 1) + g->guild_lv += dw; + mapif_guild_info (-1, g); + return 0; + default: + printf ("int_guild: GuildBasicInfoChange: Unknown type %d\n", + type); + break; + } + mapif_guild_basicinfochanged (guild_id, type, data, len); + + return 0; } // ギルドメンバデータ変更要求 -int mapif_parse_GuildMemberInfoChange(int fd, int guild_id, int account_id, int char_id, int type, const char *data, int len) { - int i; - struct guild *g; - - g = numdb_search(guild_db, guild_id); - if(g == NULL) - return 0; - - for(i = 0; i < g->max_member; i++) - if (g->member[i].account_id == account_id && g->member[i].char_id == char_id) - break; - if (i == g->max_member) { - printf("int_guild: GuildMemberChange: Not found %d,%d in %d[%s]\n", account_id, char_id, guild_id, g->name); - return 0; - } - switch(type) { - case GMI_POSITION: // 役職 - g->member[i].position = *((int *)data); - break; - case GMI_EXP: // EXP - { - int exp, oldexp = g->member[i].exp; - exp = g->member[i].exp = *((unsigned int *)data); - g->exp += (exp - oldexp); - guild_calcinfo(g); // Lvアップ判断 - mapif_guild_basicinfochanged(guild_id, GBI_EXP, &g->exp, 4); - } - break; - default: - printf("int_guild: GuildMemberInfoChange: Unknown type %d\n", type); - break; - } - mapif_guild_memberinfochanged(guild_id, account_id, char_id, type, data, len); - - return 0; +int mapif_parse_GuildMemberInfoChange (int fd, int guild_id, int account_id, + int char_id, int type, + const char *data, int len) +{ + int i; + struct guild *g; + + g = numdb_search (guild_db, guild_id); + if (g == NULL) + return 0; + + for (i = 0; i < g->max_member; i++) + if (g->member[i].account_id == account_id + && g->member[i].char_id == char_id) + break; + if (i == g->max_member) + { + printf ("int_guild: GuildMemberChange: Not found %d,%d in %d[%s]\n", + account_id, char_id, guild_id, g->name); + return 0; + } + switch (type) + { + case GMI_POSITION: // 役職 + g->member[i].position = *((int *) data); + break; + case GMI_EXP: // EXP + { + int exp, oldexp = g->member[i].exp; + exp = g->member[i].exp = *((unsigned int *) data); + g->exp += (exp - oldexp); + guild_calcinfo (g); // Lvアップ判断 + mapif_guild_basicinfochanged (guild_id, GBI_EXP, &g->exp, 4); + } + break; + default: + printf ("int_guild: GuildMemberInfoChange: Unknown type %d\n", + type); + break; + } + mapif_guild_memberinfochanged (guild_id, account_id, char_id, type, data, + len); + + return 0; } // ギルド役職名変更要求 -int mapif_parse_GuildPosition(int fd, int guild_id, int idx, struct guild_position *p) { - struct guild *g = numdb_search(guild_db, guild_id); - - if (g == NULL || idx < 0 || idx >= MAX_GUILDPOSITION) { - return 0; - } - memcpy(&g->position[idx], p, sizeof(struct guild_position)); - mapif_guild_position(g, idx); - printf("int_guild: position changed %d\n", idx); - - return 0; +int mapif_parse_GuildPosition (int fd, int guild_id, int idx, + struct guild_position *p) +{ + struct guild *g = numdb_search (guild_db, guild_id); + + if (g == NULL || idx < 0 || idx >= MAX_GUILDPOSITION) + { + return 0; + } + memcpy (&g->position[idx], p, sizeof (struct guild_position)); + mapif_guild_position (g, idx); + printf ("int_guild: position changed %d\n", idx); + + return 0; } // ギルドスキルアップ要求 -int mapif_parse_GuildSkillUp(int fd, int guild_id, int skill_num, int account_id) { - struct guild *g = numdb_search(guild_db, guild_id); - int idx = skill_num - 10000; - - if (g == NULL || skill_num < 10000) - return 0; - - if (g->skill_point > 0 && g->skill[idx].id > 0 && g->skill[idx].lv < 10) { - g->skill[idx].lv++; - g->skill_point--; - if (guild_calcinfo(g) == 0) - mapif_guild_info(-1, g); - mapif_guild_skillupack(guild_id, skill_num, account_id); - printf("int_guild: skill %d up\n", skill_num); - } - - return 0; +int mapif_parse_GuildSkillUp (int fd, int guild_id, int skill_num, + int account_id) +{ + struct guild *g = numdb_search (guild_db, guild_id); + int idx = skill_num - 10000; + + if (g == NULL || skill_num < 10000) + return 0; + + if (g->skill_point > 0 && g->skill[idx].id > 0 && g->skill[idx].lv < 10) + { + g->skill[idx].lv++; + g->skill_point--; + if (guild_calcinfo (g) == 0) + mapif_guild_info (-1, g); + mapif_guild_skillupack (guild_id, skill_num, account_id); + printf ("int_guild: skill %d up\n", skill_num); + } + + return 0; } // ギルド同盟要求 -int mapif_parse_GuildAlliance(int fd, int guild_id1, int guild_id2, int account_id1, int account_id2, int flag) { - struct guild *g[2]; - int j, i; - - g[0] = numdb_search(guild_db, guild_id1); - g[1] = numdb_search(guild_db, guild_id2); - if (g[0] == NULL || g[1] == NULL) - return 0; - - if (!(flag & 0x8)) { - for(i = 0; i < 2 - (flag & 1); i++) { - for(j = 0; j < MAX_GUILDALLIANCE; j++) - if (g[i]->alliance[j].guild_id == 0) { - g[i]->alliance[j].guild_id = g[1-i]->guild_id; - memcpy(g[i]->alliance[j].name, g[1-i]->name, 24); - g[i]->alliance[j].opposition = flag & 1; - break; - } - } - } else { // 関係解消 - for(i = 0; i < 2 - (flag & 1); i++) { - for(j = 0; j < MAX_GUILDALLIANCE; j++) - if (g[i]->alliance[j].guild_id == g[1-i]->guild_id && g[i]->alliance[j].opposition == (flag & 1)) { - g[i]->alliance[j].guild_id = 0; - break; - } - } - } - mapif_guild_alliance(guild_id1, guild_id2, account_id1, account_id2, flag, g[0]->name, g[1]->name); - - return 0; +int mapif_parse_GuildAlliance (int fd, int guild_id1, int guild_id2, + int account_id1, int account_id2, int flag) +{ + struct guild *g[2]; + int j, i; + + g[0] = numdb_search (guild_db, guild_id1); + g[1] = numdb_search (guild_db, guild_id2); + if (g[0] == NULL || g[1] == NULL) + return 0; + + if (!(flag & 0x8)) + { + for (i = 0; i < 2 - (flag & 1); i++) + { + for (j = 0; j < MAX_GUILDALLIANCE; j++) + if (g[i]->alliance[j].guild_id == 0) + { + g[i]->alliance[j].guild_id = g[1 - i]->guild_id; + memcpy (g[i]->alliance[j].name, g[1 - i]->name, 24); + g[i]->alliance[j].opposition = flag & 1; + break; + } + } + } + else + { // 関係解消 + for (i = 0; i < 2 - (flag & 1); i++) + { + for (j = 0; j < MAX_GUILDALLIANCE; j++) + if (g[i]->alliance[j].guild_id == g[1 - i]->guild_id + && g[i]->alliance[j].opposition == (flag & 1)) + { + g[i]->alliance[j].guild_id = 0; + break; + } + } + } + mapif_guild_alliance (guild_id1, guild_id2, account_id1, account_id2, + flag, g[0]->name, g[1]->name); + + return 0; } // ギルド告知変更要求 -int mapif_parse_GuildNotice(int fd, int guild_id, const char *mes1, const char *mes2) { - struct guild *g; - - g = numdb_search(guild_db, guild_id); - if (g == NULL) - return 0; - memcpy(g->mes1, mes1, 60); - memcpy(g->mes2, mes2, 120); - - return mapif_guild_notice(g); +int mapif_parse_GuildNotice (int fd, int guild_id, const char *mes1, + const char *mes2) +{ + struct guild *g; + + g = numdb_search (guild_db, guild_id); + if (g == NULL) + return 0; + memcpy (g->mes1, mes1, 60); + memcpy (g->mes2, mes2, 120); + + return mapif_guild_notice (g); } // ギルドエンブレム変更要求 -int mapif_parse_GuildEmblem(int fd, int len, int guild_id, int dummy, const char *data) { - struct guild *g; - - g = numdb_search(guild_db, guild_id); - if (g == NULL) - return 0; - memcpy(g->emblem_data, data, len); - g->emblem_len = len; - g->emblem_id++; - - return mapif_guild_emblem(g); +int mapif_parse_GuildEmblem (int fd, int len, int guild_id, int dummy, + const char *data) +{ + struct guild *g; + + g = numdb_search (guild_db, guild_id); + if (g == NULL) + return 0; + memcpy (g->emblem_data, data, len); + g->emblem_len = len; + g->emblem_id++; + + return mapif_guild_emblem (g); } -int mapif_parse_GuildCastleDataLoad(int fd, int castle_id, int index) { - struct guild_castle *gc = numdb_search(castle_db, castle_id); - - if (gc == NULL) { - return mapif_guild_castle_dataload(castle_id, 0, 0); - } - switch(index) { - case 1: return mapif_guild_castle_dataload(gc->castle_id, index, gc->guild_id); - case 2: return mapif_guild_castle_dataload(gc->castle_id, index, gc->economy); - case 3: return mapif_guild_castle_dataload(gc->castle_id, index, gc->defense); - case 4: return mapif_guild_castle_dataload(gc->castle_id, index, gc->triggerE); - case 5: return mapif_guild_castle_dataload(gc->castle_id, index, gc->triggerD); - case 6: return mapif_guild_castle_dataload(gc->castle_id, index, gc->nextTime); - case 7: return mapif_guild_castle_dataload(gc->castle_id, index, gc->payTime); - case 8: return mapif_guild_castle_dataload(gc->castle_id, index, gc->createTime); - case 9: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleC); - case 10: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG0); - case 11: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG1); - case 12: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG2); - case 13: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG3); - case 14: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG4); - case 15: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG5); - case 16: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG6); - case 17: return mapif_guild_castle_dataload(gc->castle_id, index, gc->visibleG7); - case 18: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp0); // guardian HP [Valaris] - case 19: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp1); - case 20: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp2); - case 21: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp3); - case 22: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp4); - case 23: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp5); - case 24: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp6); - case 25: return mapif_guild_castle_dataload(gc->castle_id, index, gc->Ghp7); // end additions [Valaris] - - default: - printf("mapif_parse_GuildCastleDataLoad ERROR!! (Not found index=%d)\n", index); - return 0; - } - - return 0; +int mapif_parse_GuildCastleDataLoad (int fd, int castle_id, int index) +{ + struct guild_castle *gc = numdb_search (castle_db, castle_id); + + if (gc == NULL) + { + return mapif_guild_castle_dataload (castle_id, 0, 0); + } + switch (index) + { + case 1: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->guild_id); + case 2: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->economy); + case 3: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->defense); + case 4: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->triggerE); + case 5: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->triggerD); + case 6: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->nextTime); + case 7: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->payTime); + case 8: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->createTime); + case 9: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleC); + case 10: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG0); + case 11: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG1); + case 12: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG2); + case 13: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG3); + case 14: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG4); + case 15: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG5); + case 16: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG6); + case 17: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG7); + case 18: + return mapif_guild_castle_dataload (gc->castle_id, index, gc->Ghp0); // guardian HP [Valaris] + case 19: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->Ghp1); + case 20: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->Ghp2); + case 21: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->Ghp3); + case 22: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->Ghp4); + case 23: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->Ghp5); + case 24: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->Ghp6); + case 25: + return mapif_guild_castle_dataload (gc->castle_id, index, gc->Ghp7); // end additions [Valaris] + + default: + printf + ("mapif_parse_GuildCastleDataLoad ERROR!! (Not found index=%d)\n", + index); + return 0; + } + + return 0; } -int mapif_parse_GuildCastleDataSave(int fd, int castle_id, int index, int value) { - struct guild_castle *gc=numdb_search(castle_db, castle_id); - - if (gc == NULL) { - return mapif_guild_castle_datasave(castle_id, index, value); - } - switch(index) { - case 1: - if (gc->guild_id != value) { - int gid = (value) ? value : gc->guild_id; - struct guild *g = numdb_search(guild_db, gid); - inter_log("guild %s (id=%d) %s castle id=%d" RETCODE, - (g) ? g->name : "??", gid, (value) ? "occupy" : "abandon", index); - } - gc->guild_id = value; - break; - case 2: gc->economy = value; break; - case 3: gc->defense = value; break; - case 4: gc->triggerE = value; break; - case 5: gc->triggerD = value; break; - case 6: gc->nextTime = value; break; - case 7: gc->payTime = value; break; - case 8: gc->createTime = value; break; - case 9: gc->visibleC = value; break; - case 10: gc->visibleG0 = value; break; - case 11: gc->visibleG1 = value; break; - case 12: gc->visibleG2 = value; break; - case 13: gc->visibleG3 = value; break; - case 14: gc->visibleG4 = value; break; - case 15: gc->visibleG5 = value; break; - case 16: gc->visibleG6 = value; break; - case 17: gc->visibleG7 = value; break; - case 18: gc->Ghp0 = value; break; // guardian HP [Valaris] - case 19: gc->Ghp1 = value; break; - case 20: gc->Ghp2 = value; break; - case 21: gc->Ghp3 = value; break; - case 22: gc->Ghp4 = value; break; - case 23: gc->Ghp5 = value; break; - case 24: gc->Ghp6 = value; break; - case 25: gc->Ghp7 = value; break; // end additions [Valaris] - default: - printf("mapif_parse_GuildCastleDataSave ERROR!! (Not found index=%d)\n", index); - return 0; - } - - return mapif_guild_castle_datasave(gc->castle_id, index, value); +int mapif_parse_GuildCastleDataSave (int fd, int castle_id, int index, + int value) +{ + struct guild_castle *gc = numdb_search (castle_db, castle_id); + + if (gc == NULL) + { + return mapif_guild_castle_datasave (castle_id, index, value); + } + switch (index) + { + case 1: + if (gc->guild_id != value) + { + int gid = (value) ? value : gc->guild_id; + struct guild *g = numdb_search (guild_db, gid); + inter_log ("guild %s (id=%d) %s castle id=%d" RETCODE, + (g) ? g->name : "??", gid, + (value) ? "occupy" : "abandon", index); + } + gc->guild_id = value; + break; + case 2: + gc->economy = value; + break; + case 3: + gc->defense = value; + break; + case 4: + gc->triggerE = value; + break; + case 5: + gc->triggerD = value; + break; + case 6: + gc->nextTime = value; + break; + case 7: + gc->payTime = value; + break; + case 8: + gc->createTime = value; + break; + case 9: + gc->visibleC = value; + break; + case 10: + gc->visibleG0 = value; + break; + case 11: + gc->visibleG1 = value; + break; + case 12: + gc->visibleG2 = value; + break; + case 13: + gc->visibleG3 = value; + break; + case 14: + gc->visibleG4 = value; + break; + case 15: + gc->visibleG5 = value; + break; + case 16: + gc->visibleG6 = value; + break; + case 17: + gc->visibleG7 = value; + break; + case 18: + gc->Ghp0 = value; + break; // guardian HP [Valaris] + case 19: + gc->Ghp1 = value; + break; + case 20: + gc->Ghp2 = value; + break; + case 21: + gc->Ghp3 = value; + break; + case 22: + gc->Ghp4 = value; + break; + case 23: + gc->Ghp5 = value; + break; + case 24: + gc->Ghp6 = value; + break; + case 25: + gc->Ghp7 = value; + break; // end additions [Valaris] + default: + printf + ("mapif_parse_GuildCastleDataSave ERROR!! (Not found index=%d)\n", + index); + return 0; + } + + return mapif_guild_castle_datasave (gc->castle_id, index, value); } // ギルドチェック要求 -int mapif_parse_GuildCheck(int fd, int guild_id, int account_id, int char_id) { - return guild_check_conflict(guild_id, account_id, char_id); +int mapif_parse_GuildCheck (int fd, int guild_id, int account_id, int char_id) +{ + return guild_check_conflict (guild_id, account_id, char_id); } // map server からの通信 @@ -1403,39 +1712,106 @@ int mapif_parse_GuildCheck(int fd, int guild_id, int account_id, int char_id) { // ・パケット長データはinter.cにセットしておくこと // ・パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない // ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない -int inter_guild_parse_frommap(int fd) { - switch(RFIFOW(fd,0)) { - case 0x3030: mapif_parse_CreateGuild(fd, RFIFOL(fd,4), RFIFOP(fd,8), (struct guild_member *)RFIFOP(fd,32)); break; - case 0x3031: mapif_parse_GuildInfo(fd, RFIFOL(fd,2)); break; - case 0x3032: mapif_parse_GuildAddMember(fd, RFIFOL(fd,4), (struct guild_member *)RFIFOP(fd,8)); break; - case 0x3034: mapif_parse_GuildLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOB(fd,14), RFIFOP(fd,15)); break; - case 0x3035: mapif_parse_GuildChangeMemberInfoShort(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOB(fd,14), RFIFOW(fd,15), RFIFOW(fd,17)); break; - case 0x3036: mapif_parse_BreakGuild(fd, RFIFOL(fd,2)); break; - case 0x3037: mapif_parse_GuildMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOP(fd,12), RFIFOW(fd,2)-12); break; - case 0x3038: mapif_parse_GuildCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break; - case 0x3039: mapif_parse_GuildBasicInfoChange(fd, RFIFOL(fd,4), RFIFOW(fd,8), RFIFOP(fd,10), RFIFOW(fd,2)-10); break; - case 0x303A: mapif_parse_GuildMemberInfoChange(fd, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOL(fd,12), RFIFOW(fd,16), RFIFOP(fd,18), RFIFOW(fd,2)-18); break; - case 0x303B: mapif_parse_GuildPosition(fd, RFIFOL(fd,4), RFIFOL(fd,8), (struct guild_position *)RFIFOP(fd,12)); break; - case 0x303C: mapif_parse_GuildSkillUp(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break; - case 0x303D: mapif_parse_GuildAlliance(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14), RFIFOB(fd,18)); break; - case 0x303E: mapif_parse_GuildNotice(fd, RFIFOL(fd,2), RFIFOP(fd,6), RFIFOP(fd,66)); break; - case 0x303F: mapif_parse_GuildEmblem(fd, RFIFOW(fd,2)-12, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOP(fd,12)); break; - case 0x3040: mapif_parse_GuildCastleDataLoad(fd, RFIFOW(fd,2), RFIFOB(fd,4)); break; - case 0x3041: mapif_parse_GuildCastleDataSave(fd, RFIFOW(fd,2), RFIFOB(fd,4), RFIFOL(fd,5)); break; - - default: - return 0; - } - - return 1; +int inter_guild_parse_frommap (int fd) +{ + switch (RFIFOW (fd, 0)) + { + case 0x3030: + mapif_parse_CreateGuild (fd, RFIFOL (fd, 4), RFIFOP (fd, 8), + (struct guild_member *) RFIFOP (fd, 32)); + break; + case 0x3031: + mapif_parse_GuildInfo (fd, RFIFOL (fd, 2)); + break; + case 0x3032: + mapif_parse_GuildAddMember (fd, RFIFOL (fd, 4), + (struct guild_member *) RFIFOP (fd, + 8)); + break; + case 0x3034: + mapif_parse_GuildLeave (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOL (fd, 10), RFIFOB (fd, 14), + RFIFOP (fd, 15)); + break; + case 0x3035: + mapif_parse_GuildChangeMemberInfoShort (fd, RFIFOL (fd, 2), + RFIFOL (fd, 6), + RFIFOL (fd, 10), + RFIFOB (fd, 14), + RFIFOW (fd, 15), + RFIFOW (fd, 17)); + break; + case 0x3036: + mapif_parse_BreakGuild (fd, RFIFOL (fd, 2)); + break; + case 0x3037: + mapif_parse_GuildMessage (fd, RFIFOL (fd, 4), RFIFOL (fd, 8), + RFIFOP (fd, 12), RFIFOW (fd, 2) - 12); + break; + case 0x3038: + mapif_parse_GuildCheck (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOL (fd, 10)); + break; + case 0x3039: + mapif_parse_GuildBasicInfoChange (fd, RFIFOL (fd, 4), + RFIFOW (fd, 8), RFIFOP (fd, 10), + RFIFOW (fd, 2) - 10); + break; + case 0x303A: + mapif_parse_GuildMemberInfoChange (fd, RFIFOL (fd, 4), + RFIFOL (fd, 8), RFIFOL (fd, + 12), + RFIFOW (fd, 16), RFIFOP (fd, + 18), + RFIFOW (fd, 2) - 18); + break; + case 0x303B: + mapif_parse_GuildPosition (fd, RFIFOL (fd, 4), RFIFOL (fd, 8), + (struct guild_position *) RFIFOP (fd, + 12)); + break; + case 0x303C: + mapif_parse_GuildSkillUp (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOL (fd, 10)); + break; + case 0x303D: + mapif_parse_GuildAlliance (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOL (fd, 10), RFIFOL (fd, 14), + RFIFOB (fd, 18)); + break; + case 0x303E: + mapif_parse_GuildNotice (fd, RFIFOL (fd, 2), RFIFOP (fd, 6), + RFIFOP (fd, 66)); + break; + case 0x303F: + mapif_parse_GuildEmblem (fd, RFIFOW (fd, 2) - 12, RFIFOL (fd, 4), + RFIFOL (fd, 8), RFIFOP (fd, 12)); + break; + case 0x3040: + mapif_parse_GuildCastleDataLoad (fd, RFIFOW (fd, 2), + RFIFOB (fd, 4)); + break; + case 0x3041: + mapif_parse_GuildCastleDataSave (fd, RFIFOW (fd, 2), + RFIFOB (fd, 4), RFIFOL (fd, 5)); + break; + + default: + return 0; + } + + return 1; } // マップサーバーの接続時処理 -int inter_guild_mapif_init(int fd) { - return mapif_guild_castle_alldataload(fd); +int inter_guild_mapif_init (int fd) +{ + return mapif_guild_castle_alldataload (fd); } // サーバーから脱退要求(キャラ削除用) -int inter_guild_leave(int guild_id, int account_id, int char_id) { - return mapif_parse_GuildLeave(-1, guild_id, account_id, char_id, 0, "**サーバー命令**"); +int inter_guild_leave (int guild_id, int account_id, int char_id) +{ + return mapif_parse_GuildLeave (-1, guild_id, account_id, char_id, 0, + "**サーバー命令**"); } diff --git a/src/char/int_guild.h b/src/char/int_guild.h index 555f5e1..954addf 100644 --- a/src/char/int_guild.h +++ b/src/char/int_guild.h @@ -2,13 +2,13 @@ #ifndef _INT_GUILD_H_ #define _INT_GUILD_H_ -int inter_guild_init(); -int inter_guild_save(); -int inter_guild_parse_frommap(int fd); -struct guild *inter_guild_search(int guild_id); -int inter_guild_mapif_init(int fd); +int inter_guild_init (); +int inter_guild_save (); +int inter_guild_parse_frommap (int fd); +struct guild *inter_guild_search (int guild_id); +int inter_guild_mapif_init (int fd); -int inter_guild_leave(int guild_id,int account_id,int char_id); +int inter_guild_leave (int guild_id, int account_id, int char_id); extern char guild_txt[1024]; extern char castle_txt[1024]; diff --git a/src/char/int_party.c b/src/char/int_party.c index f0b06b6..fb9c3ca 100644 --- a/src/char/int_party.c +++ b/src/char/int_party.c @@ -15,554 +15,637 @@ char party_txt[1024] = "save/party.txt"; static struct dbt *party_db; static int party_newid = 100; -int mapif_party_broken(int party_id, int flag); -int party_check_empty(struct party *p); -int mapif_parse_PartyLeave(int fd, int party_id, int account_id); +int mapif_party_broken (int party_id, int flag); +int party_check_empty (struct party *p); +int mapif_parse_PartyLeave (int fd, int party_id, int account_id); // パーティデータの文字列への変換 -int inter_party_tostr(char *str, struct party *p) { - int i, len; - - len = sprintf(str, "%d\t%s\t%d,%d\t", p->party_id, p->name, p->exp, p->item); - for(i = 0; i < MAX_PARTY; i++) { - struct party_member *m = &p->member[i]; - len += sprintf(str + len, "%d,%d\t%s\t", m->account_id, m->leader, ((m->account_id > 0) ? m->name : "NoMember")); - } - - return 0; +int inter_party_tostr (char *str, struct party *p) +{ + int i, len; + + len = + sprintf (str, "%d\t%s\t%d,%d\t", p->party_id, p->name, p->exp, + p->item); + for (i = 0; i < MAX_PARTY; i++) + { + struct party_member *m = &p->member[i]; + len += + sprintf (str + len, "%d,%d\t%s\t", m->account_id, m->leader, + ((m->account_id > 0) ? m->name : "NoMember")); + } + + return 0; } // パーティデータの文字列からの変換 -int inter_party_fromstr(char *str, struct party *p) { - int i, j; - int tmp_int[16]; - char tmp_str[256]; - - memset(p, 0, sizeof(struct party)); - -// printf("sscanf party main info\n"); - if (sscanf(str, "%d\t%[^\t]\t%d,%d\t", &tmp_int[0], tmp_str, &tmp_int[1], &tmp_int[2]) != 4) - return 1; - - p->party_id = tmp_int[0]; - strcpy(p->name, tmp_str); - p->exp = tmp_int[1]; - p->item = tmp_int[2]; -// printf("%d [%s] %d %d\n", tmp_int[0], tmp_str[0], tmp_int[1], tmp_int[2]); - - for(j = 0; j < 3 && str != NULL; j++) - str = strchr(str + 1, '\t'); - - for(i = 0; i < MAX_PARTY; i++) { - struct party_member *m = &p->member[i]; - if (str == NULL) - return 1; -// printf("sscanf party member info %d\n", i); - - if (sscanf(str + 1, "%d,%d\t%[^\t]\t", &tmp_int[0], &tmp_int[1], tmp_str) != 3) - return 1; - - m->account_id = tmp_int[0]; - m->leader = tmp_int[1]; - strncpy(m->name, tmp_str, sizeof(m->name)); -// printf(" %d %d [%s]\n", tmp_int[0], tmp_int[1], tmp_str); - - for(j = 0; j < 2 && str != NULL; j++) - str = strchr(str + 1, '\t'); - } - - return 0; +int inter_party_fromstr (char *str, struct party *p) +{ + int i, j; + int tmp_int[16]; + char tmp_str[256]; + + memset (p, 0, sizeof (struct party)); + +// printf("sscanf party main info\n"); + if (sscanf + (str, "%d\t%[^\t]\t%d,%d\t", &tmp_int[0], tmp_str, &tmp_int[1], + &tmp_int[2]) != 4) + return 1; + + p->party_id = tmp_int[0]; + strcpy (p->name, tmp_str); + p->exp = tmp_int[1]; + p->item = tmp_int[2]; +// printf("%d [%s] %d %d\n", tmp_int[0], tmp_str[0], tmp_int[1], tmp_int[2]); + + for (j = 0; j < 3 && str != NULL; j++) + str = strchr (str + 1, '\t'); + + for (i = 0; i < MAX_PARTY; i++) + { + struct party_member *m = &p->member[i]; + if (str == NULL) + return 1; +// printf("sscanf party member info %d\n", i); + + if (sscanf + (str + 1, "%d,%d\t%[^\t]\t", &tmp_int[0], &tmp_int[1], + tmp_str) != 3) + return 1; + + m->account_id = tmp_int[0]; + m->leader = tmp_int[1]; + strncpy (m->name, tmp_str, sizeof (m->name)); +// printf(" %d %d [%s]\n", tmp_int[0], tmp_int[1], tmp_str); + + for (j = 0; j < 2 && str != NULL; j++) + str = strchr (str + 1, '\t'); + } + + return 0; } // パーティデータのロード -int inter_party_init() { - char line[8192]; - struct party *p; - FILE *fp; - int c = 0; - int i, j; - - party_db = numdb_init(); - - if ((fp = fopen_(party_txt, "r")) == NULL) - return 1; - - while(fgets(line, sizeof(line) - 1, fp)) { - j = 0; - if (sscanf(line, "%d\t%%newid%%\n%n", &i, &j) == 1 && j > 0 && party_newid <= i) { - party_newid = i; - continue; - } - - p = calloc(sizeof(struct party), 1); - if (p == NULL){ - printf("int_party: out of memory!\n"); - exit(0); - } - memset(p, 0, sizeof(struct party)); - if (inter_party_fromstr(line, p) == 0 && p->party_id > 0) { - if (p->party_id >= party_newid) - party_newid = p->party_id + 1; - numdb_insert(party_db, p->party_id, p); - party_check_empty(p); - } else { - printf("int_party: broken data [%s] line %d\n", party_txt, c + 1); - free(p); - } - c++; - } - fclose_(fp); -// printf("int_party: %s read done (%d parties)\n", party_txt, c); - - return 0; +int inter_party_init () +{ + char line[8192]; + struct party *p; + FILE *fp; + int c = 0; + int i, j; + + party_db = numdb_init (); + + if ((fp = fopen_ (party_txt, "r")) == NULL) + return 1; + + while (fgets (line, sizeof (line) - 1, fp)) + { + j = 0; + if (sscanf (line, "%d\t%%newid%%\n%n", &i, &j) == 1 && j > 0 + && party_newid <= i) + { + party_newid = i; + continue; + } + + p = calloc (sizeof (struct party), 1); + if (p == NULL) + { + printf ("int_party: out of memory!\n"); + exit (0); + } + memset (p, 0, sizeof (struct party)); + if (inter_party_fromstr (line, p) == 0 && p->party_id > 0) + { + if (p->party_id >= party_newid) + party_newid = p->party_id + 1; + numdb_insert (party_db, p->party_id, p); + party_check_empty (p); + } + else + { + printf ("int_party: broken data [%s] line %d\n", party_txt, + c + 1); + free (p); + } + c++; + } + fclose_ (fp); +// printf("int_party: %s read done (%d parties)\n", party_txt, c); + + return 0; } // パーティーデータのセーブ用 -int inter_party_save_sub(void *key, void *data, va_list ap) { - char line[8192]; - FILE *fp; +int inter_party_save_sub (void *key, void *data, va_list ap) +{ + char line[8192]; + FILE *fp; - inter_party_tostr(line, (struct party *)data); - fp = va_arg(ap, FILE *); - fprintf(fp, "%s" RETCODE, line); + inter_party_tostr (line, (struct party *) data); + fp = va_arg (ap, FILE *); + fprintf (fp, "%s" RETCODE, line); - return 0; + return 0; } // パーティーデータのセーブ -int inter_party_save() { - FILE *fp; - int lock; - - if ((fp = lock_fopen(party_txt, &lock)) == NULL) { - printf("int_party: cant write [%s] !!! data is lost !!!\n", party_txt); - return 1; - } - numdb_foreach(party_db, inter_party_save_sub, fp); -// fprintf(fp, "%d\t%%newid%%\n", party_newid); - lock_fclose(fp,party_txt, &lock); -// printf("int_party: %s saved.\n", party_txt); - - return 0; +int inter_party_save () +{ + FILE *fp; + int lock; + + if ((fp = lock_fopen (party_txt, &lock)) == NULL) + { + printf ("int_party: cant write [%s] !!! data is lost !!!\n", + party_txt); + return 1; + } + numdb_foreach (party_db, inter_party_save_sub, fp); +// fprintf(fp, "%d\t%%newid%%\n", party_newid); + lock_fclose (fp, party_txt, &lock); +// printf("int_party: %s saved.\n", party_txt); + + return 0; } // パーティ名検索用 -int search_partyname_sub(void *key,void *data,va_list ap) { - struct party *p = (struct party *)data,**dst; - char *str; +int search_partyname_sub (void *key, void *data, va_list ap) +{ + struct party *p = (struct party *) data, **dst; + char *str; - str = va_arg(ap, char *); - dst = va_arg(ap, struct party **); - if (strcmpi(p->name, str) == 0) - *dst = p; + str = va_arg (ap, char *); + dst = va_arg (ap, struct party **); + if (strcmpi (p->name, str) == 0) + *dst = p; - return 0; + return 0; } // パーティ名検索 -struct party* search_partyname(char *str) { - struct party *p = NULL; - numdb_foreach(party_db, search_partyname_sub, str, &p); +struct party *search_partyname (char *str) +{ + struct party *p = NULL; + numdb_foreach (party_db, search_partyname_sub, str, &p); - return p; + return p; } // EXP公平分配できるかチェック -int party_check_exp_share(struct party *p) { - int i; - int maxlv = 0, minlv = 0x7fffffff; - - for(i = 0; i < MAX_PARTY; i++) { - int lv = p->member[i].lv; - if (p->member[i].online) { - if (lv < minlv) - minlv = lv; - if (maxlv < lv) - maxlv = lv; - } - } - - return (maxlv == 0 || maxlv-minlv <= party_share_level); +int party_check_exp_share (struct party *p) +{ + int i; + int maxlv = 0, minlv = 0x7fffffff; + + for (i = 0; i < MAX_PARTY; i++) + { + int lv = p->member[i].lv; + if (p->member[i].online) + { + if (lv < minlv) + minlv = lv; + if (maxlv < lv) + maxlv = lv; + } + } + + return (maxlv == 0 || maxlv - minlv <= party_share_level); } // パーティが空かどうかチェック -int party_check_empty(struct party *p) { - int i; - -// printf("party check empty %08X\n", (int)p); - for(i = 0; i < MAX_PARTY; i++) { -// printf("%d acc=%d\n", i, p->member[i].account_id); - if (p->member[i].account_id > 0) { - return 0; - } - } - // 誰もいないので解散 - mapif_party_broken(p->party_id, 0); - numdb_erase(party_db, p->party_id); - free(p); - - return 1; +int party_check_empty (struct party *p) +{ + int i; + +// printf("party check empty %08X\n", (int)p); + for (i = 0; i < MAX_PARTY; i++) + { +// printf("%d acc=%d\n", i, p->member[i].account_id); + if (p->member[i].account_id > 0) + { + return 0; + } + } + // 誰もいないので解散 + mapif_party_broken (p->party_id, 0); + numdb_erase (party_db, p->party_id); + free (p); + + return 1; } // キャラの競合がないかチェック用 -int party_check_conflict_sub(void *key, void *data, va_list ap) { - struct party *p = (struct party *)data; - int party_id, account_id, i; - char *nick; - - party_id=va_arg(ap, int); - account_id=va_arg(ap, int); - nick=va_arg(ap, char *); - - if (p->party_id == party_id) // 本来の所属なので問題なし - return 0; - - for(i = 0; i < MAX_PARTY; i++) { - if (p->member[i].account_id == account_id && strcmp(p->member[i].name, nick) == 0) { - // 別のパーティに偽の所属データがあるので脱退 - printf("int_party: party conflict! %d %d %d\n", account_id, party_id, p->party_id); - mapif_parse_PartyLeave(-1, p->party_id, account_id); - } - } - - return 0; +int party_check_conflict_sub (void *key, void *data, va_list ap) +{ + struct party *p = (struct party *) data; + int party_id, account_id, i; + char *nick; + + party_id = va_arg (ap, int); + account_id = va_arg (ap, int); + nick = va_arg (ap, char *); + + if (p->party_id == party_id) // 本来の所属なので問題なし + return 0; + + for (i = 0; i < MAX_PARTY; i++) + { + if (p->member[i].account_id == account_id + && strcmp (p->member[i].name, nick) == 0) + { + // 別のパーティに偽の所属データがあるので脱退 + printf ("int_party: party conflict! %d %d %d\n", account_id, + party_id, p->party_id); + mapif_parse_PartyLeave (-1, p->party_id, account_id); + } + } + + return 0; } // キャラの競合がないかチェック -int party_check_conflict(int party_id, int account_id, char *nick) { - numdb_foreach(party_db, party_check_conflict_sub, party_id, account_id, nick); +int party_check_conflict (int party_id, int account_id, char *nick) +{ + numdb_foreach (party_db, party_check_conflict_sub, party_id, account_id, + nick); - return 0; + return 0; } //------------------------------------------------------------------- // map serverへの通信 // パーティ作成可否 -int mapif_party_created(int fd,int account_id, struct party *p) { - WFIFOW(fd,0) = 0x3820; - WFIFOL(fd,2) = account_id; - if (p != NULL) { - WFIFOB(fd,6) = 0; - WFIFOL(fd,7) = p->party_id; - memcpy(WFIFOP(fd,11), p->name, 24); - printf("int_party: created! %d %s\n", p->party_id, p->name); - } else { - WFIFOB(fd,6) = 1; - WFIFOL(fd,7) = 0; - memcpy(WFIFOP(fd,11), "error", 24); - } - WFIFOSET(fd,35); - - return 0; +int mapif_party_created (int fd, int account_id, struct party *p) +{ + WFIFOW (fd, 0) = 0x3820; + WFIFOL (fd, 2) = account_id; + if (p != NULL) + { + WFIFOB (fd, 6) = 0; + WFIFOL (fd, 7) = p->party_id; + memcpy (WFIFOP (fd, 11), p->name, 24); + printf ("int_party: created! %d %s\n", p->party_id, p->name); + } + else + { + WFIFOB (fd, 6) = 1; + WFIFOL (fd, 7) = 0; + memcpy (WFIFOP (fd, 11), "error", 24); + } + WFIFOSET (fd, 35); + + return 0; } // パーティ情報見つからず -int mapif_party_noinfo(int fd, int party_id) { - WFIFOW(fd,0) = 0x3821; - WFIFOW(fd,2) = 8; - WFIFOL(fd,4) = party_id; - WFIFOSET(fd,8); - printf("int_party: info not found %d\n", party_id); - - return 0; +int mapif_party_noinfo (int fd, int party_id) +{ + WFIFOW (fd, 0) = 0x3821; + WFIFOW (fd, 2) = 8; + WFIFOL (fd, 4) = party_id; + WFIFOSET (fd, 8); + printf ("int_party: info not found %d\n", party_id); + + return 0; } // パーティ情報まとめ送り -int mapif_party_info(int fd, struct party *p) { - unsigned char buf[4 + sizeof(struct party)]; - - WBUFW(buf,0) = 0x3821; - memcpy(buf + 4, p, sizeof(struct party)); - WBUFW(buf,2) = 4 + sizeof(struct party); - if (fd < 0) - mapif_sendall(buf, WBUFW(buf,2)); - else - mapif_send(fd, buf, WBUFW(buf,2)); -// printf("int_party: info %d %s\n", p->party_id, p->name); - - return 0; +int mapif_party_info (int fd, struct party *p) +{ + unsigned char buf[4 + sizeof (struct party)]; + + WBUFW (buf, 0) = 0x3821; + memcpy (buf + 4, p, sizeof (struct party)); + WBUFW (buf, 2) = 4 + sizeof (struct party); + if (fd < 0) + mapif_sendall (buf, WBUFW (buf, 2)); + else + mapif_send (fd, buf, WBUFW (buf, 2)); +// printf("int_party: info %d %s\n", p->party_id, p->name); + + return 0; } // パーティメンバ追加可否 -int mapif_party_memberadded(int fd, int party_id, int account_id, int flag) { - WFIFOW(fd,0) = 0x3822; - WFIFOL(fd,2) = party_id; - WFIFOL(fd,6) = account_id; - WFIFOB(fd,10) = flag; - WFIFOSET(fd,11); - - return 0; +int mapif_party_memberadded (int fd, int party_id, int account_id, int flag) +{ + WFIFOW (fd, 0) = 0x3822; + WFIFOL (fd, 2) = party_id; + WFIFOL (fd, 6) = account_id; + WFIFOB (fd, 10) = flag; + WFIFOSET (fd, 11); + + return 0; } // パーティ設定変更通知 -int mapif_party_optionchanged(int fd,struct party *p, int account_id, int flag) { - unsigned char buf[15]; - - WBUFW(buf,0) = 0x3823; - WBUFL(buf,2) = p->party_id; - WBUFL(buf,6) = account_id; - WBUFW(buf,10) = p->exp; - WBUFW(buf,12) = p->item; - WBUFB(buf,14) = flag; - if (flag == 0) - mapif_sendall(buf, 15); - else - mapif_send(fd, buf, 15); - printf("int_party: option changed %d %d %d %d %d\n", p->party_id, account_id, p->exp, p->item, flag); - - return 0; +int mapif_party_optionchanged (int fd, struct party *p, int account_id, + int flag) +{ + unsigned char buf[15]; + + WBUFW (buf, 0) = 0x3823; + WBUFL (buf, 2) = p->party_id; + WBUFL (buf, 6) = account_id; + WBUFW (buf, 10) = p->exp; + WBUFW (buf, 12) = p->item; + WBUFB (buf, 14) = flag; + if (flag == 0) + mapif_sendall (buf, 15); + else + mapif_send (fd, buf, 15); + printf ("int_party: option changed %d %d %d %d %d\n", p->party_id, + account_id, p->exp, p->item, flag); + + return 0; } // パーティ脱退通知 -int mapif_party_leaved(int party_id,int account_id, char *name) { - unsigned char buf[34]; - - WBUFW(buf,0) = 0x3824; - WBUFL(buf,2) = party_id; - WBUFL(buf,6) = account_id; - memcpy(WBUFP(buf,10), name, 24); - mapif_sendall(buf, 34); - printf("int_party: party leaved %d %d %s\n", party_id, account_id, name); - - return 0; +int mapif_party_leaved (int party_id, int account_id, char *name) +{ + unsigned char buf[34]; + + WBUFW (buf, 0) = 0x3824; + WBUFL (buf, 2) = party_id; + WBUFL (buf, 6) = account_id; + memcpy (WBUFP (buf, 10), name, 24); + mapif_sendall (buf, 34); + printf ("int_party: party leaved %d %d %s\n", party_id, account_id, name); + + return 0; } // パーティマップ更新通知 -int mapif_party_membermoved(struct party *p, int idx) { - unsigned char buf[29]; - - WBUFW(buf,0) = 0x3825; - WBUFL(buf,2) = p->party_id; - WBUFL(buf,6) = p->member[idx].account_id; - memcpy(WBUFP(buf,10), p->member[idx].map, 16); - WBUFB(buf,26) = p->member[idx].online; - WBUFW(buf,27) = p->member[idx].lv; - mapif_sendall(buf, 29); - - return 0; +int mapif_party_membermoved (struct party *p, int idx) +{ + unsigned char buf[29]; + + WBUFW (buf, 0) = 0x3825; + WBUFL (buf, 2) = p->party_id; + WBUFL (buf, 6) = p->member[idx].account_id; + memcpy (WBUFP (buf, 10), p->member[idx].map, 16); + WBUFB (buf, 26) = p->member[idx].online; + WBUFW (buf, 27) = p->member[idx].lv; + mapif_sendall (buf, 29); + + return 0; } // パーティ解散通知 -int mapif_party_broken(int party_id, int flag) { - unsigned char buf[7]; - WBUFW(buf,0) = 0x3826; - WBUFL(buf,2) = party_id; - WBUFB(buf,6) = flag; - mapif_sendall(buf, 7); - printf("int_party: broken %d\n", party_id); - - return 0; +int mapif_party_broken (int party_id, int flag) +{ + unsigned char buf[7]; + WBUFW (buf, 0) = 0x3826; + WBUFL (buf, 2) = party_id; + WBUFB (buf, 6) = flag; + mapif_sendall (buf, 7); + printf ("int_party: broken %d\n", party_id); + + return 0; } // パーティ内発言 -int mapif_party_message(int party_id, int account_id, char *mes, int len) { - unsigned char buf[len+12]; - - WBUFW(buf,0) = 0x3827; - WBUFW(buf,2) = len + 12; - WBUFL(buf,4) = party_id; - WBUFL(buf,8) = account_id; - memcpy(WBUFP(buf,12), mes, len); - mapif_sendall(buf,len + 12); - - return 0; +int mapif_party_message (int party_id, int account_id, char *mes, int len) +{ + unsigned char buf[len + 12]; + + WBUFW (buf, 0) = 0x3827; + WBUFW (buf, 2) = len + 12; + WBUFL (buf, 4) = party_id; + WBUFL (buf, 8) = account_id; + memcpy (WBUFP (buf, 12), mes, len); + mapif_sendall (buf, len + 12); + + return 0; } //------------------------------------------------------------------- // map serverからの通信 - // パーティ -int mapif_parse_CreateParty(int fd, int account_id, char *name, char *nick, char *map, int lv) { - struct party *p; - int i; - - for(i = 0; i < 24 && name[i]; i++) { - if (!(name[i] & 0xe0) || name[i] == 0x7f) { - printf("int_party: illegal party name [%s]\n", name); - mapif_party_created(fd, account_id, NULL); - return 0; - } - } - - if ((p = search_partyname(name)) != NULL) { - printf("int_party: same name party exists [%s]\n", name); - mapif_party_created(fd, account_id, NULL); - return 0; - } - p = calloc(sizeof(struct party), 1); - if (p == NULL) { - printf("int_party: out of memory !\n"); - mapif_party_created(fd,account_id,NULL); - return 0; - } - memset(p, 0, sizeof(struct party)); - p->party_id = party_newid++; - memcpy(p->name, name, 24); - p->exp = 0; - p->item = 0; - p->member[0].account_id = account_id; - memcpy(p->member[0].name, nick, 24); - memcpy(p->member[0].map, map, 16); - p->member[0].leader = 1; - p->member[0].online = 1; - p->member[0].lv = lv; - - numdb_insert(party_db, p->party_id, p); - - mapif_party_created(fd, account_id, p); - mapif_party_info(fd, p); - - return 0; +int mapif_parse_CreateParty (int fd, int account_id, char *name, char *nick, + char *map, int lv) +{ + struct party *p; + int i; + + for (i = 0; i < 24 && name[i]; i++) + { + if (!(name[i] & 0xe0) || name[i] == 0x7f) + { + printf ("int_party: illegal party name [%s]\n", name); + mapif_party_created (fd, account_id, NULL); + return 0; + } + } + + if ((p = search_partyname (name)) != NULL) + { + printf ("int_party: same name party exists [%s]\n", name); + mapif_party_created (fd, account_id, NULL); + return 0; + } + p = calloc (sizeof (struct party), 1); + if (p == NULL) + { + printf ("int_party: out of memory !\n"); + mapif_party_created (fd, account_id, NULL); + return 0; + } + memset (p, 0, sizeof (struct party)); + p->party_id = party_newid++; + memcpy (p->name, name, 24); + p->exp = 0; + p->item = 0; + p->member[0].account_id = account_id; + memcpy (p->member[0].name, nick, 24); + memcpy (p->member[0].map, map, 16); + p->member[0].leader = 1; + p->member[0].online = 1; + p->member[0].lv = lv; + + numdb_insert (party_db, p->party_id, p); + + mapif_party_created (fd, account_id, p); + mapif_party_info (fd, p); + + return 0; } // パーティ情報要求 -int mapif_parse_PartyInfo(int fd, int party_id) { - struct party *p; +int mapif_parse_PartyInfo (int fd, int party_id) +{ + struct party *p; - p = numdb_search(party_db, party_id); - if (p != NULL) - mapif_party_info(fd, p); - else - mapif_party_noinfo(fd, party_id); + p = numdb_search (party_db, party_id); + if (p != NULL) + mapif_party_info (fd, p); + else + mapif_party_noinfo (fd, party_id); - return 0; + return 0; } // パーティ追加要求 -int mapif_parse_PartyAddMember(int fd, int party_id, int account_id, char *nick, char *map, int lv) { - struct party *p; - int i; - - p = numdb_search(party_db, party_id); - if (p == NULL) { - mapif_party_memberadded(fd, party_id, account_id, 1); - return 0; - } - - for(i = 0; i < MAX_PARTY; i++) { - if (p->member[i].account_id == 0) { - int flag = 0; - - p->member[i].account_id = account_id; - memcpy(p->member[i].name, nick, 24); - memcpy(p->member[i].map, map, 16); - p->member[i].leader = 0; - p->member[i].online = 1; - p->member[i].lv = lv; - mapif_party_memberadded(fd, party_id, account_id, 0); - mapif_party_info(-1, p); - - if (p->exp > 0 && !party_check_exp_share(p)) { - p->exp = 0; - flag = 0x01; - } - if (flag) - mapif_party_optionchanged(fd, p, 0, 0); - return 0; - } - } - mapif_party_memberadded(fd, party_id, account_id, 1); - - return 0; +int mapif_parse_PartyAddMember (int fd, int party_id, int account_id, + char *nick, char *map, int lv) +{ + struct party *p; + int i; + + p = numdb_search (party_db, party_id); + if (p == NULL) + { + mapif_party_memberadded (fd, party_id, account_id, 1); + return 0; + } + + for (i = 0; i < MAX_PARTY; i++) + { + if (p->member[i].account_id == 0) + { + int flag = 0; + + p->member[i].account_id = account_id; + memcpy (p->member[i].name, nick, 24); + memcpy (p->member[i].map, map, 16); + p->member[i].leader = 0; + p->member[i].online = 1; + p->member[i].lv = lv; + mapif_party_memberadded (fd, party_id, account_id, 0); + mapif_party_info (-1, p); + + if (p->exp > 0 && !party_check_exp_share (p)) + { + p->exp = 0; + flag = 0x01; + } + if (flag) + mapif_party_optionchanged (fd, p, 0, 0); + return 0; + } + } + mapif_party_memberadded (fd, party_id, account_id, 1); + + return 0; } // パーティー設定変更要求 -int mapif_parse_PartyChangeOption(int fd, int party_id, int account_id, int exp, int item) { - struct party *p; - int flag = 0; - - p = numdb_search(party_db, party_id); - if (p == NULL) - return 0; - - p->exp = exp; - if (exp>0 && !party_check_exp_share(p)) { - flag |= 0x01; - p->exp = 0; - } - - p->item = item; - - mapif_party_optionchanged(fd, p, account_id, flag); - return 0; +int mapif_parse_PartyChangeOption (int fd, int party_id, int account_id, + int exp, int item) +{ + struct party *p; + int flag = 0; + + p = numdb_search (party_db, party_id); + if (p == NULL) + return 0; + + p->exp = exp; + if (exp > 0 && !party_check_exp_share (p)) + { + flag |= 0x01; + p->exp = 0; + } + + p->item = item; + + mapif_party_optionchanged (fd, p, account_id, flag); + return 0; } // パーティ脱退要求 -int mapif_parse_PartyLeave(int fd, int party_id, int account_id) { - struct party *p; - int i; - - p = numdb_search(party_db, party_id); - if (p != NULL) { - for(i = 0; i < MAX_PARTY; i++) { - if (p->member[i].account_id == account_id) { - mapif_party_leaved(party_id, account_id, p->member[i].name); - - memset(&p->member[i], 0, sizeof(struct party_member)); - if (party_check_empty(p) == 0) - mapif_party_info(-1, p);// まだ人がいるのでデータ送信 - return 0; - } - } - } - - return 0; +int mapif_parse_PartyLeave (int fd, int party_id, int account_id) +{ + struct party *p; + int i; + + p = numdb_search (party_db, party_id); + if (p != NULL) + { + for (i = 0; i < MAX_PARTY; i++) + { + if (p->member[i].account_id == account_id) + { + mapif_party_leaved (party_id, account_id, p->member[i].name); + + memset (&p->member[i], 0, sizeof (struct party_member)); + if (party_check_empty (p) == 0) + mapif_party_info (-1, p); // まだ人がいるのでデータ送信 + return 0; + } + } + } + + return 0; } // パーティマップ更新要求 -int mapif_parse_PartyChangeMap(int fd, int party_id, int account_id, char *map, int online, int lv) { - struct party *p; - int i; - - p = numdb_search(party_db, party_id); - if (p == NULL) - return 0; - - for(i = 0; i < MAX_PARTY; i++) { - if (p->member[i].account_id == account_id) { - int flag = 0; - - memcpy(p->member[i].map, map, 16); - p->member[i].online = online; - p->member[i].lv = lv; - mapif_party_membermoved(p, i); - - if (p->exp > 0 && !party_check_exp_share(p)) { - p->exp = 0; - flag = 1; - } - if (flag) - mapif_party_optionchanged(fd, p, 0, 0); - break; - } - } - - return 0; +int mapif_parse_PartyChangeMap (int fd, int party_id, int account_id, + char *map, int online, int lv) +{ + struct party *p; + int i; + + p = numdb_search (party_db, party_id); + if (p == NULL) + return 0; + + for (i = 0; i < MAX_PARTY; i++) + { + if (p->member[i].account_id == account_id) + { + int flag = 0; + + memcpy (p->member[i].map, map, 16); + p->member[i].online = online; + p->member[i].lv = lv; + mapif_party_membermoved (p, i); + + if (p->exp > 0 && !party_check_exp_share (p)) + { + p->exp = 0; + flag = 1; + } + if (flag) + mapif_party_optionchanged (fd, p, 0, 0); + break; + } + } + + return 0; } // パーティ解散要求 -int mapif_parse_BreakParty(int fd, int party_id) { - struct party *p; +int mapif_parse_BreakParty (int fd, int party_id) +{ + struct party *p; - p = numdb_search(party_db, party_id); - if (p == NULL) - return 0; + p = numdb_search (party_db, party_id); + if (p == NULL) + return 0; - numdb_erase(party_db, party_id); - mapif_party_broken(fd, party_id); + numdb_erase (party_db, party_id); + mapif_party_broken (fd, party_id); - return 0; + return 0; } // パーティメッセージ送信 -int mapif_parse_PartyMessage(int fd, int party_id, int account_id, char *mes, int len) { - return mapif_party_message(party_id, account_id, mes, len); +int mapif_parse_PartyMessage (int fd, int party_id, int account_id, char *mes, + int len) +{ + return mapif_party_message (party_id, account_id, mes, len); } + // パーティチェック要求 -int mapif_parse_PartyCheck(int fd, int party_id, int account_id, char *nick) { - return party_check_conflict(party_id, account_id, nick); +int mapif_parse_PartyCheck (int fd, int party_id, int account_id, char *nick) +{ + return party_check_conflict (party_id, account_id, nick); } // map server からの通信 @@ -570,26 +653,55 @@ int mapif_parse_PartyCheck(int fd, int party_id, int account_id, char *nick) { // ・パケット長データはinter.cにセットしておくこと // ・パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない // ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない -int inter_party_parse_frommap(int fd) { - switch(RFIFOW(fd,0)) { - case 0x3020: mapif_parse_CreateParty(fd, RFIFOL(fd,2), RFIFOP(fd,6), RFIFOP(fd,30), RFIFOP(fd,54), RFIFOW(fd,70)); break; - case 0x3021: mapif_parse_PartyInfo(fd, RFIFOL(fd,2)); break; - case 0x3022: mapif_parse_PartyAddMember(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10), RFIFOP(fd,34), RFIFOW(fd,50)); break; - case 0x3023: mapif_parse_PartyChangeOption(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOW(fd,10), RFIFOW(fd,12)); break; - case 0x3024: mapif_parse_PartyLeave(fd, RFIFOL(fd,2), RFIFOL(fd,6)); break; - case 0x3025: mapif_parse_PartyChangeMap(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10), RFIFOB(fd,26), RFIFOW(fd,27)); break; - case 0x3026: mapif_parse_BreakParty(fd, RFIFOL(fd,2)); break; - case 0x3027: mapif_parse_PartyMessage(fd, RFIFOL(fd,4), RFIFOL(fd,8), RFIFOP(fd,12), RFIFOW(fd,2)-12); break; - case 0x3028: mapif_parse_PartyCheck(fd, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOP(fd,10)); break; - default: - return 0; - } - - return 1; +int inter_party_parse_frommap (int fd) +{ + switch (RFIFOW (fd, 0)) + { + case 0x3020: + mapif_parse_CreateParty (fd, RFIFOL (fd, 2), RFIFOP (fd, 6), + RFIFOP (fd, 30), RFIFOP (fd, 54), + RFIFOW (fd, 70)); + break; + case 0x3021: + mapif_parse_PartyInfo (fd, RFIFOL (fd, 2)); + break; + case 0x3022: + mapif_parse_PartyAddMember (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOP (fd, 10), RFIFOP (fd, 34), + RFIFOW (fd, 50)); + break; + case 0x3023: + mapif_parse_PartyChangeOption (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOW (fd, 10), RFIFOW (fd, 12)); + break; + case 0x3024: + mapif_parse_PartyLeave (fd, RFIFOL (fd, 2), RFIFOL (fd, 6)); + break; + case 0x3025: + mapif_parse_PartyChangeMap (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOP (fd, 10), RFIFOB (fd, 26), + RFIFOW (fd, 27)); + break; + case 0x3026: + mapif_parse_BreakParty (fd, RFIFOL (fd, 2)); + break; + case 0x3027: + mapif_parse_PartyMessage (fd, RFIFOL (fd, 4), RFIFOL (fd, 8), + RFIFOP (fd, 12), RFIFOW (fd, 2) - 12); + break; + case 0x3028: + mapif_parse_PartyCheck (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOP (fd, 10)); + break; + default: + return 0; + } + + return 1; } // サーバーから脱退要求(キャラ削除用) -int inter_party_leave(int party_id, int account_id) { - return mapif_parse_PartyLeave(-1, party_id, account_id); +int inter_party_leave (int party_id, int account_id) +{ + return mapif_parse_PartyLeave (-1, party_id, account_id); } - diff --git a/src/char/int_party.h b/src/char/int_party.h index b265b4c..738b624 100644 --- a/src/char/int_party.h +++ b/src/char/int_party.h @@ -2,12 +2,12 @@ #ifndef _INT_PARTY_H_ #define _INT_PARTY_H_ -int inter_party_init(); -int inter_party_save(); +int inter_party_init (); +int inter_party_save (); -int inter_party_parse_frommap(int fd); +int inter_party_parse_frommap (int fd); -int inter_party_leave(int party_id,int account_id); +int inter_party_leave (int party_id, int account_id); extern char party_txt[1024]; diff --git a/src/char/int_storage.c b/src/char/int_storage.c index 0829384..47dff67 100644 --- a/src/char/int_storage.c +++ b/src/char/int_storage.c @@ -15,490 +15,567 @@ // ファイル名のデフォルト // inter_config_read()で再設定される -char storage_txt[1024]="save/storage.txt"; -char guild_storage_txt[1024]="save/g_storage.txt"; +char storage_txt[1024] = "save/storage.txt"; +char guild_storage_txt[1024] = "save/g_storage.txt"; static struct dbt *storage_db; static struct dbt *guild_storage_db; // 倉庫データを文字列に変換 -int storage_tostr(char *str,struct storage *p) +int storage_tostr (char *str, struct storage *p) { - int i,f=0; - char *str_p = str; - str_p += sprintf(str_p,"%d,%d\t",p->account_id,p->storage_amount); - - for(i=0;i<MAX_STORAGE;i++) - if( (p->storage_[i].nameid) && (p->storage_[i].amount) ){ - str_p += sprintf(str_p,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ", - p->storage_[i].id,p->storage_[i].nameid,p->storage_[i].amount,p->storage_[i].equip, - p->storage_[i].identify,p->storage_[i].refine,p->storage_[i].attribute, - p->storage_[i].card[0],p->storage_[i].card[1],p->storage_[i].card[2],p->storage_[i].card[3]); - f++; - } - - *(str_p++)='\t'; - - *str_p='\0'; - if(!f) - str[0]=0; - return 0; + int i, f = 0; + char *str_p = str; + str_p += sprintf (str_p, "%d,%d\t", p->account_id, p->storage_amount); + + for (i = 0; i < MAX_STORAGE; i++) + if ((p->storage_[i].nameid) && (p->storage_[i].amount)) + { + str_p += sprintf (str_p, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ", + p->storage_[i].id, p->storage_[i].nameid, + p->storage_[i].amount, p->storage_[i].equip, + p->storage_[i].identify, p->storage_[i].refine, + p->storage_[i].attribute, + p->storage_[i].card[0], p->storage_[i].card[1], + p->storage_[i].card[2], p->storage_[i].card[3]); + f++; + } + + *(str_p++) = '\t'; + + *str_p = '\0'; + if (!f) + str[0] = 0; + return 0; } // 文字列を倉庫データに変換 -int storage_fromstr(char *str,struct storage *p) +int storage_fromstr (char *str, struct storage *p) { - int tmp_int[256]; - int set,next,len,i; - - set=sscanf(str,"%d,%d%n",&tmp_int[0],&tmp_int[1],&next); - p->storage_amount=tmp_int[1]; - - if(set!=2) - return 1; - if(str[next]=='\n' || str[next]=='\r') - return 0; - next++; - for(i=0;str[next] && str[next]!='\t' && i < MAX_STORAGE;i++){ - if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[10], &len) == 12) { - p->storage_[i].id = tmp_int[0]; - p->storage_[i].nameid = tmp_int[1]; - p->storage_[i].amount = tmp_int[2]; - p->storage_[i].equip = tmp_int[3]; - p->storage_[i].identify = tmp_int[4]; - p->storage_[i].refine = tmp_int[5]; - p->storage_[i].attribute = tmp_int[6]; - p->storage_[i].card[0] = tmp_int[7]; - p->storage_[i].card[1] = tmp_int[8]; - p->storage_[i].card[2] = tmp_int[9]; - p->storage_[i].card[3] = tmp_int[10]; - next += len; - if (str[next] == ' ') - next++; - } - - else if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) { - p->storage_[i].id = tmp_int[0]; - p->storage_[i].nameid = tmp_int[1]; - p->storage_[i].amount = tmp_int[2]; - p->storage_[i].equip = tmp_int[3]; - p->storage_[i].identify = tmp_int[4]; - p->storage_[i].refine = tmp_int[5]; - p->storage_[i].attribute = tmp_int[6]; - p->storage_[i].card[0] = tmp_int[7]; - p->storage_[i].card[1] = tmp_int[8]; - p->storage_[i].card[2] = tmp_int[9]; - p->storage_[i].card[3] = tmp_int[10]; - next += len; - if (str[next] == ' ') - next++; - } - - else return 1; - } - if (i >= MAX_STORAGE && str[next] && str[next]!='\t') - printf("storage_fromstr: Found a storage line with more items than MAX_STORAGE (%d), remaining items have been discarded!\n", MAX_STORAGE); - return 0; + int tmp_int[256]; + int set, next, len, i; + + set = sscanf (str, "%d,%d%n", &tmp_int[0], &tmp_int[1], &next); + p->storage_amount = tmp_int[1]; + + if (set != 2) + return 1; + if (str[next] == '\n' || str[next] == '\r') + return 0; + next++; + for (i = 0; str[next] && str[next] != '\t' && i < MAX_STORAGE; i++) + { + if (sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &tmp_int[10], &len) == 12) + { + p->storage_[i].id = tmp_int[0]; + p->storage_[i].nameid = tmp_int[1]; + p->storage_[i].amount = tmp_int[2]; + p->storage_[i].equip = tmp_int[3]; + p->storage_[i].identify = tmp_int[4]; + p->storage_[i].refine = tmp_int[5]; + p->storage_[i].attribute = tmp_int[6]; + p->storage_[i].card[0] = tmp_int[7]; + p->storage_[i].card[1] = tmp_int[8]; + p->storage_[i].card[2] = tmp_int[9]; + p->storage_[i].card[3] = tmp_int[10]; + next += len; + if (str[next] == ' ') + next++; + } + + else if (sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &len) == 11) + { + p->storage_[i].id = tmp_int[0]; + p->storage_[i].nameid = tmp_int[1]; + p->storage_[i].amount = tmp_int[2]; + p->storage_[i].equip = tmp_int[3]; + p->storage_[i].identify = tmp_int[4]; + p->storage_[i].refine = tmp_int[5]; + p->storage_[i].attribute = tmp_int[6]; + p->storage_[i].card[0] = tmp_int[7]; + p->storage_[i].card[1] = tmp_int[8]; + p->storage_[i].card[2] = tmp_int[9]; + p->storage_[i].card[3] = tmp_int[10]; + next += len; + if (str[next] == ' ') + next++; + } + + else + return 1; + } + if (i >= MAX_STORAGE && str[next] && str[next] != '\t') + printf + ("storage_fromstr: Found a storage line with more items than MAX_STORAGE (%d), remaining items have been discarded!\n", + MAX_STORAGE); + return 0; } -int guild_storage_tostr(char *str,struct guild_storage *p) +int guild_storage_tostr (char *str, struct guild_storage *p) { - int i,f=0; - char *str_p = str; - str_p+=sprintf(str,"%d,%d\t",p->guild_id,p->storage_amount); - - for(i=0;i<MAX_GUILD_STORAGE;i++) - if( (p->storage_[i].nameid) && (p->storage_[i].amount) ){ - str_p += sprintf(str_p,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ", - p->storage_[i].id,p->storage_[i].nameid,p->storage_[i].amount,p->storage_[i].equip, - p->storage_[i].identify,p->storage_[i].refine,p->storage_[i].attribute, - p->storage_[i].card[0],p->storage_[i].card[1],p->storage_[i].card[2],p->storage_[i].card[3]); - f++; - } - - *(str_p++)='\t'; - - *str_p='\0'; - if(!f) - str[0]=0; - return 0; + int i, f = 0; + char *str_p = str; + str_p += sprintf (str, "%d,%d\t", p->guild_id, p->storage_amount); + + for (i = 0; i < MAX_GUILD_STORAGE; i++) + if ((p->storage_[i].nameid) && (p->storage_[i].amount)) + { + str_p += sprintf (str_p, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ", + p->storage_[i].id, p->storage_[i].nameid, + p->storage_[i].amount, p->storage_[i].equip, + p->storage_[i].identify, p->storage_[i].refine, + p->storage_[i].attribute, + p->storage_[i].card[0], p->storage_[i].card[1], + p->storage_[i].card[2], p->storage_[i].card[3]); + f++; + } + + *(str_p++) = '\t'; + + *str_p = '\0'; + if (!f) + str[0] = 0; + return 0; } -int guild_storage_fromstr(char *str,struct guild_storage *p) +int guild_storage_fromstr (char *str, struct guild_storage *p) { - int tmp_int[256]; - int set,next,len,i; - - set=sscanf(str,"%d,%d%n",&tmp_int[0],&tmp_int[1],&next); - p->storage_amount=tmp_int[1]; - - if(set!=2) - return 1; - if(str[next]=='\n' || str[next]=='\r') - return 0; - next++; - for(i=0;str[next] && str[next]!='\t' && i < MAX_GUILD_STORAGE;i++){ - if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[10], &len) == 12) { - p->storage_[i].id = tmp_int[0]; - p->storage_[i].nameid = tmp_int[1]; - p->storage_[i].amount = tmp_int[2]; - p->storage_[i].equip = tmp_int[3]; - p->storage_[i].identify = tmp_int[4]; - p->storage_[i].refine = tmp_int[5]; - p->storage_[i].attribute = tmp_int[6]; - p->storage_[i].card[0] = tmp_int[7]; - p->storage_[i].card[1] = tmp_int[8]; - p->storage_[i].card[2] = tmp_int[9]; - p->storage_[i].card[3] = tmp_int[10]; - next += len; - if (str[next] == ' ') - next++; - } - - else if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) { - p->storage_[i].id = tmp_int[0]; - p->storage_[i].nameid = tmp_int[1]; - p->storage_[i].amount = tmp_int[2]; - p->storage_[i].equip = tmp_int[3]; - p->storage_[i].identify = tmp_int[4]; - p->storage_[i].refine = tmp_int[5]; - p->storage_[i].attribute = tmp_int[6]; - p->storage_[i].card[0] = tmp_int[7]; - p->storage_[i].card[1] = tmp_int[8]; - p->storage_[i].card[2] = tmp_int[9]; - p->storage_[i].card[3] = tmp_int[10]; - next += len; - if (str[next] == ' ') - next++; - } - - else return 1; - } - if (i >= MAX_GUILD_STORAGE && str[next] && str[next]!='\t') - printf("guild_storage_fromstr: Found a storage line with more items than MAX_GUILD_STORAGE (%d), remaining items have been discarded!\n", MAX_GUILD_STORAGE); - return 0; + int tmp_int[256]; + int set, next, len, i; + + set = sscanf (str, "%d,%d%n", &tmp_int[0], &tmp_int[1], &next); + p->storage_amount = tmp_int[1]; + + if (set != 2) + return 1; + if (str[next] == '\n' || str[next] == '\r') + return 0; + next++; + for (i = 0; str[next] && str[next] != '\t' && i < MAX_GUILD_STORAGE; i++) + { + if (sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &tmp_int[10], &len) == 12) + { + p->storage_[i].id = tmp_int[0]; + p->storage_[i].nameid = tmp_int[1]; + p->storage_[i].amount = tmp_int[2]; + p->storage_[i].equip = tmp_int[3]; + p->storage_[i].identify = tmp_int[4]; + p->storage_[i].refine = tmp_int[5]; + p->storage_[i].attribute = tmp_int[6]; + p->storage_[i].card[0] = tmp_int[7]; + p->storage_[i].card[1] = tmp_int[8]; + p->storage_[i].card[2] = tmp_int[9]; + p->storage_[i].card[3] = tmp_int[10]; + next += len; + if (str[next] == ' ') + next++; + } + + else if (sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &len) == 11) + { + p->storage_[i].id = tmp_int[0]; + p->storage_[i].nameid = tmp_int[1]; + p->storage_[i].amount = tmp_int[2]; + p->storage_[i].equip = tmp_int[3]; + p->storage_[i].identify = tmp_int[4]; + p->storage_[i].refine = tmp_int[5]; + p->storage_[i].attribute = tmp_int[6]; + p->storage_[i].card[0] = tmp_int[7]; + p->storage_[i].card[1] = tmp_int[8]; + p->storage_[i].card[2] = tmp_int[9]; + p->storage_[i].card[3] = tmp_int[10]; + next += len; + if (str[next] == ' ') + next++; + } + + else + return 1; + } + if (i >= MAX_GUILD_STORAGE && str[next] && str[next] != '\t') + printf + ("guild_storage_fromstr: Found a storage line with more items than MAX_GUILD_STORAGE (%d), remaining items have been discarded!\n", + MAX_GUILD_STORAGE); + return 0; } // アカウントから倉庫データインデックスを得る(新規倉庫追加可能) -struct storage *account2storage(int account_id) +struct storage *account2storage (int account_id) { - struct storage *s; - s= (struct storage *) numdb_search(storage_db,account_id); - if(s == NULL) { - s = (struct storage *) aCalloc(sizeof(struct storage), 1); - if(s==NULL){ - printf("int_storage: out of memory!\n"); - exit(0); - } - memset(s,0,sizeof(struct storage)); - s->account_id=account_id; - numdb_insert(storage_db,s->account_id,s); - } - return s; + struct storage *s; + s = (struct storage *) numdb_search (storage_db, account_id); + if (s == NULL) + { + s = (struct storage *) aCalloc (sizeof (struct storage), 1); + if (s == NULL) + { + printf ("int_storage: out of memory!\n"); + exit (0); + } + memset (s, 0, sizeof (struct storage)); + s->account_id = account_id; + numdb_insert (storage_db, s->account_id, s); + } + return s; } -struct guild_storage *guild2storage(int guild_id) +struct guild_storage *guild2storage (int guild_id) { - struct guild_storage *gs = NULL; - if(inter_guild_search(guild_id) != NULL) { - gs= (struct guild_storage *) numdb_search(guild_storage_db,guild_id); - if(gs == NULL) { - gs = (struct guild_storage *) aCalloc(sizeof(struct guild_storage), 1); - if(gs==NULL){ - printf("int_storage: out of memory!\n"); - exit(0); - } -// memset(gs,0,sizeof(struct guild_storage)); aCalloc does this! [Skotlex] - gs->guild_id=guild_id; - numdb_insert(guild_storage_db,gs->guild_id,gs); - } - } - return gs; + struct guild_storage *gs = NULL; + if (inter_guild_search (guild_id) != NULL) + { + gs = (struct guild_storage *) numdb_search (guild_storage_db, + guild_id); + if (gs == NULL) + { + gs = (struct guild_storage *) + aCalloc (sizeof (struct guild_storage), 1); + if (gs == NULL) + { + printf ("int_storage: out of memory!\n"); + exit (0); + } +// memset(gs,0,sizeof(struct guild_storage)); aCalloc does this! [Skotlex] + gs->guild_id = guild_id; + numdb_insert (guild_storage_db, gs->guild_id, gs); + } + } + return gs; } //--------------------------------------------------------- // 倉庫データを読み込む -int inter_storage_init() +int inter_storage_init () { - char line[65536]; - int c=0,tmp_int; - struct storage *s; - struct guild_storage *gs; - FILE *fp; - - storage_db = numdb_init(); - - fp=fopen_(storage_txt,"r"); - if(fp==NULL){ - printf("cant't read : %s\n",storage_txt); - return 1; - } - while(fgets(line,65535,fp)){ - sscanf(line,"%d",&tmp_int); - s = (struct storage*)aCalloc(sizeof(struct storage), 1); - if(s==NULL){ - printf("int_storage: out of memory!\n"); - exit(0); - } -// memset(s,0,sizeof(struct storage)); aCalloc does this... - s->account_id=tmp_int; - if(s->account_id > 0 && storage_fromstr(line,s) == 0) { - numdb_insert(storage_db,s->account_id,s); - } - else{ - printf("int_storage: broken data [%s] line %d\n",storage_txt,c); - free(s); - } - c++; - } - fclose_(fp); - - c = 0; - guild_storage_db = numdb_init(); - - fp=fopen_(guild_storage_txt,"r"); - if(fp==NULL){ - printf("cant't read : %s\n",guild_storage_txt); - return 1; - } - while(fgets(line,65535,fp)){ - sscanf(line,"%d",&tmp_int); - gs = (struct guild_storage*)aCalloc(sizeof(struct guild_storage), 1); - if(gs==NULL){ - printf("int_storage: out of memory!\n"); - exit(0); - } -// memset(gs,0,sizeof(struct guild_storage)); aCalloc... - gs->guild_id=tmp_int; - if(gs->guild_id > 0 && guild_storage_fromstr(line,gs) == 0) { - numdb_insert(guild_storage_db,gs->guild_id,gs); - } - else{ - printf("int_storage: broken data [%s] line %d\n",guild_storage_txt,c); - free(gs); - } - c++; - } - fclose_(fp); - - return 0; + char line[65536]; + int c = 0, tmp_int; + struct storage *s; + struct guild_storage *gs; + FILE *fp; + + storage_db = numdb_init (); + + fp = fopen_ (storage_txt, "r"); + if (fp == NULL) + { + printf ("cant't read : %s\n", storage_txt); + return 1; + } + while (fgets (line, 65535, fp)) + { + sscanf (line, "%d", &tmp_int); + s = (struct storage *) aCalloc (sizeof (struct storage), 1); + if (s == NULL) + { + printf ("int_storage: out of memory!\n"); + exit (0); + } +// memset(s,0,sizeof(struct storage)); aCalloc does this... + s->account_id = tmp_int; + if (s->account_id > 0 && storage_fromstr (line, s) == 0) + { + numdb_insert (storage_db, s->account_id, s); + } + else + { + printf ("int_storage: broken data [%s] line %d\n", storage_txt, + c); + free (s); + } + c++; + } + fclose_ (fp); + + c = 0; + guild_storage_db = numdb_init (); + + fp = fopen_ (guild_storage_txt, "r"); + if (fp == NULL) + { + printf ("cant't read : %s\n", guild_storage_txt); + return 1; + } + while (fgets (line, 65535, fp)) + { + sscanf (line, "%d", &tmp_int); + gs = (struct guild_storage *) aCalloc (sizeof (struct guild_storage), + 1); + if (gs == NULL) + { + printf ("int_storage: out of memory!\n"); + exit (0); + } +// memset(gs,0,sizeof(struct guild_storage)); aCalloc... + gs->guild_id = tmp_int; + if (gs->guild_id > 0 && guild_storage_fromstr (line, gs) == 0) + { + numdb_insert (guild_storage_db, gs->guild_id, gs); + } + else + { + printf ("int_storage: broken data [%s] line %d\n", + guild_storage_txt, c); + free (gs); + } + c++; + } + fclose_ (fp); + + return 0; } -int storage_db_final (void *k, void *data, va_list ap) { - struct storage *p = (struct storage *) data; - if (p) free(p); - return 0; +int storage_db_final (void *k, void *data, va_list ap) +{ + struct storage *p = (struct storage *) data; + if (p) + free (p); + return 0; } -int guild_storage_db_final (void *k, void *data, va_list ap) { - struct guild_storage *p = (struct guild_storage *) data; - if (p) free(p); - return 0; + +int guild_storage_db_final (void *k, void *data, va_list ap) +{ + struct guild_storage *p = (struct guild_storage *) data; + if (p) + free (p); + return 0; } -void inter_storage_final() { - numdb_final(storage_db, storage_db_final); - numdb_final(guild_storage_db, guild_storage_db_final); - return; + +void inter_storage_final () +{ + numdb_final (storage_db, storage_db_final); + numdb_final (guild_storage_db, guild_storage_db_final); + return; } -int inter_storage_save_sub(void *key,void *data,va_list ap) +int inter_storage_save_sub (void *key, void *data, va_list ap) { - char line[65536]; - FILE *fp; - storage_tostr(line,(struct storage *)data); - fp=va_arg(ap,FILE *); - if(*line) - fprintf(fp,"%s" RETCODE,line); - return 0; + char line[65536]; + FILE *fp; + storage_tostr (line, (struct storage *) data); + fp = va_arg (ap, FILE *); + if (*line) + fprintf (fp, "%s" RETCODE, line); + return 0; } + //--------------------------------------------------------- // 倉庫データを書き込む -int inter_storage_save() +int inter_storage_save () { - FILE *fp; - int lock; - - if (!storage_db) - return 1; - - if( (fp=lock_fopen(storage_txt,&lock))==NULL ){ - printf("int_storage: cant write [%s] !!! data is lost !!!\n",storage_txt); - return 1; - } - numdb_foreach(storage_db,inter_storage_save_sub,fp); - lock_fclose(fp,storage_txt,&lock); -// printf("int_storage: %s saved.\n",storage_txt); - return 0; + FILE *fp; + int lock; + + if (!storage_db) + return 1; + + if ((fp = lock_fopen (storage_txt, &lock)) == NULL) + { + printf ("int_storage: cant write [%s] !!! data is lost !!!\n", + storage_txt); + return 1; + } + numdb_foreach (storage_db, inter_storage_save_sub, fp); + lock_fclose (fp, storage_txt, &lock); +// printf("int_storage: %s saved.\n",storage_txt); + return 0; } -int inter_guild_storage_save_sub(void *key,void *data,va_list ap) +int inter_guild_storage_save_sub (void *key, void *data, va_list ap) { - char line[65536]; - FILE *fp; - - if(inter_guild_search(((struct guild_storage *)data)->guild_id) != NULL) { - guild_storage_tostr(line,(struct guild_storage *)data); - fp=va_arg(ap,FILE *); - if(*line) - fprintf(fp,"%s" RETCODE,line); - } - return 0; + char line[65536]; + FILE *fp; + + if (inter_guild_search (((struct guild_storage *) data)->guild_id) != + NULL) + { + guild_storage_tostr (line, (struct guild_storage *) data); + fp = va_arg (ap, FILE *); + if (*line) + fprintf (fp, "%s" RETCODE, line); + } + return 0; } + //--------------------------------------------------------- // 倉庫データを書き込む -int inter_guild_storage_save() +int inter_guild_storage_save () { - FILE *fp; - int lock; - - if (!guild_storage_db) - return 1; - - if( (fp=lock_fopen(guild_storage_txt,&lock))==NULL ){ - printf("int_storage: cant write [%s] !!! data is lost !!!\n",guild_storage_txt); - return 1; - } - numdb_foreach(guild_storage_db,inter_guild_storage_save_sub,fp); - lock_fclose(fp,guild_storage_txt,&lock); -// printf("int_storage: %s saved.\n",guild_storage_txt); - return 0; + FILE *fp; + int lock; + + if (!guild_storage_db) + return 1; + + if ((fp = lock_fopen (guild_storage_txt, &lock)) == NULL) + { + printf ("int_storage: cant write [%s] !!! data is lost !!!\n", + guild_storage_txt); + return 1; + } + numdb_foreach (guild_storage_db, inter_guild_storage_save_sub, fp); + lock_fclose (fp, guild_storage_txt, &lock); +// printf("int_storage: %s saved.\n",guild_storage_txt); + return 0; } // 倉庫データ削除 -int inter_storage_delete(int account_id) +int inter_storage_delete (int account_id) { - struct storage *s = (struct storage *) numdb_search(storage_db,account_id); - if(s) { - numdb_erase(storage_db,account_id); - free(s); - } - return 0; + struct storage *s = + (struct storage *) numdb_search (storage_db, account_id); + if (s) + { + numdb_erase (storage_db, account_id); + free (s); + } + return 0; } // ギルド倉庫データ削除 -int inter_guild_storage_delete(int guild_id) +int inter_guild_storage_delete (int guild_id) { - struct guild_storage *gs = (struct guild_storage *) numdb_search(guild_storage_db,guild_id); - if(gs) { - numdb_erase(guild_storage_db,guild_id); - free(gs); - } - return 0; + struct guild_storage *gs = + (struct guild_storage *) numdb_search (guild_storage_db, guild_id); + if (gs) + { + numdb_erase (guild_storage_db, guild_id); + free (gs); + } + return 0; } //--------------------------------------------------------- // map serverへの通信 // 倉庫データの送信 -int mapif_load_storage(int fd,int account_id) +int mapif_load_storage (int fd, int account_id) { - struct storage *s=account2storage(account_id); - WFIFOW(fd,0)=0x3810; - WFIFOW(fd,2)=sizeof(struct storage)+8; - WFIFOL(fd,4)=account_id; - memcpy(WFIFOP(fd,8),s,sizeof(struct storage)); - WFIFOSET(fd,WFIFOW(fd,2)); - return 0; + struct storage *s = account2storage (account_id); + WFIFOW (fd, 0) = 0x3810; + WFIFOW (fd, 2) = sizeof (struct storage) + 8; + WFIFOL (fd, 4) = account_id; + memcpy (WFIFOP (fd, 8), s, sizeof (struct storage)); + WFIFOSET (fd, WFIFOW (fd, 2)); + return 0; } + // 倉庫データ保存完了送信 -int mapif_save_storage_ack(int fd,int account_id) +int mapif_save_storage_ack (int fd, int account_id) { - WFIFOW(fd,0)=0x3811; - WFIFOL(fd,2)=account_id; - WFIFOB(fd,6)=0; - WFIFOSET(fd,7); - return 0; + WFIFOW (fd, 0) = 0x3811; + WFIFOL (fd, 2) = account_id; + WFIFOB (fd, 6) = 0; + WFIFOSET (fd, 7); + return 0; } -int mapif_load_guild_storage(int fd,int account_id,int guild_id) +int mapif_load_guild_storage (int fd, int account_id, int guild_id) { - struct guild_storage *gs=guild2storage(guild_id); - WFIFOW(fd,0)=0x3818; - if(gs) { - WFIFOW(fd,2)=sizeof(struct guild_storage)+12; - WFIFOL(fd,4)=account_id; - WFIFOL(fd,8)=guild_id; - memcpy(WFIFOP(fd,12),gs,sizeof(struct guild_storage)); - } - else { - WFIFOW(fd,2)=12; - WFIFOL(fd,4)=account_id; - WFIFOL(fd,8)=0; - } - WFIFOSET(fd,WFIFOW(fd,2)); - - return 0; + struct guild_storage *gs = guild2storage (guild_id); + WFIFOW (fd, 0) = 0x3818; + if (gs) + { + WFIFOW (fd, 2) = sizeof (struct guild_storage) + 12; + WFIFOL (fd, 4) = account_id; + WFIFOL (fd, 8) = guild_id; + memcpy (WFIFOP (fd, 12), gs, sizeof (struct guild_storage)); + } + else + { + WFIFOW (fd, 2) = 12; + WFIFOL (fd, 4) = account_id; + WFIFOL (fd, 8) = 0; + } + WFIFOSET (fd, WFIFOW (fd, 2)); + + return 0; } -int mapif_save_guild_storage_ack(int fd,int account_id,int guild_id,int fail) + +int mapif_save_guild_storage_ack (int fd, int account_id, int guild_id, + int fail) { - WFIFOW(fd,0)=0x3819; - WFIFOL(fd,2)=account_id; - WFIFOL(fd,6)=guild_id; - WFIFOB(fd,10)=fail; - WFIFOSET(fd,11); - return 0; + WFIFOW (fd, 0) = 0x3819; + WFIFOL (fd, 2) = account_id; + WFIFOL (fd, 6) = guild_id; + WFIFOB (fd, 10) = fail; + WFIFOSET (fd, 11); + return 0; } //--------------------------------------------------------- // map serverからの通信 // 倉庫データ要求受信 -int mapif_parse_LoadStorage(int fd) +int mapif_parse_LoadStorage (int fd) { - mapif_load_storage(fd,RFIFOL(fd,2)); - return 0; + mapif_load_storage (fd, RFIFOL (fd, 2)); + return 0; } + // 倉庫データ受信&保存 -int mapif_parse_SaveStorage(int fd) +int mapif_parse_SaveStorage (int fd) { - struct storage *s; - int account_id=RFIFOL(fd,4); - int len=RFIFOW(fd,2); - if(sizeof(struct storage)!=len-8){ - printf("inter storage: data size error %d %d\n",sizeof(struct storage),len-8); - } - else { - s=account2storage(account_id); - memcpy(s,RFIFOP(fd,8),sizeof(struct storage)); - mapif_save_storage_ack(fd,account_id); - } - return 0; + struct storage *s; + int account_id = RFIFOL (fd, 4); + int len = RFIFOW (fd, 2); + if (sizeof (struct storage) != len - 8) + { + printf ("inter storage: data size error %d %d\n", + sizeof (struct storage), len - 8); + } + else + { + s = account2storage (account_id); + memcpy (s, RFIFOP (fd, 8), sizeof (struct storage)); + mapif_save_storage_ack (fd, account_id); + } + return 0; } -int mapif_parse_LoadGuildStorage(int fd) +int mapif_parse_LoadGuildStorage (int fd) { - mapif_load_guild_storage(fd,RFIFOL(fd,2),RFIFOL(fd,6)); - return 0; + mapif_load_guild_storage (fd, RFIFOL (fd, 2), RFIFOL (fd, 6)); + return 0; } -int mapif_parse_SaveGuildStorage(int fd) + +int mapif_parse_SaveGuildStorage (int fd) { - struct guild_storage *gs; - int guild_id=RFIFOL(fd,8); - int len=RFIFOW(fd,2); - if(sizeof(struct guild_storage)!=len-12){ - printf("inter storage: data size error %d %d\n",sizeof(struct guild_storage),len-12); - } - else { - gs=guild2storage(guild_id); - if(gs) { - memcpy(gs,RFIFOP(fd,12),sizeof(struct guild_storage)); - mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,0); - } - else - mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,1); - } - return 0; + struct guild_storage *gs; + int guild_id = RFIFOL (fd, 8); + int len = RFIFOW (fd, 2); + if (sizeof (struct guild_storage) != len - 12) + { + printf ("inter storage: data size error %d %d\n", + sizeof (struct guild_storage), len - 12); + } + else + { + gs = guild2storage (guild_id); + if (gs) + { + memcpy (gs, RFIFOP (fd, 12), sizeof (struct guild_storage)); + mapif_save_guild_storage_ack (fd, RFIFOL (fd, 4), guild_id, 0); + } + else + mapif_save_guild_storage_ack (fd, RFIFOL (fd, 4), guild_id, 1); + } + return 0; } // map server からの通信 @@ -506,15 +583,24 @@ int mapif_parse_SaveGuildStorage(int fd) // ・パケット長データはinter.cにセットしておくこと // ・パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない // ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない -int inter_storage_parse_frommap(int fd) +int inter_storage_parse_frommap (int fd) { - switch(RFIFOW(fd,0)){ - case 0x3010: mapif_parse_LoadStorage(fd); break; - case 0x3011: mapif_parse_SaveStorage(fd); break; - case 0x3018: mapif_parse_LoadGuildStorage(fd); break; - case 0x3019: mapif_parse_SaveGuildStorage(fd); break; - default: - return 0; - } - return 1; + switch (RFIFOW (fd, 0)) + { + case 0x3010: + mapif_parse_LoadStorage (fd); + break; + case 0x3011: + mapif_parse_SaveStorage (fd); + break; + case 0x3018: + mapif_parse_LoadGuildStorage (fd); + break; + case 0x3019: + mapif_parse_SaveGuildStorage (fd); + break; + default: + return 0; + } + return 1; } diff --git a/src/char/int_storage.h b/src/char/int_storage.h index ec23813..5036600 100644 --- a/src/char/int_storage.h +++ b/src/char/int_storage.h @@ -2,15 +2,15 @@ #ifndef _INT_STORAGE_H_ #define _INT_STORAGE_H_ -int inter_storage_init(); -void inter_storage_final(); -int inter_storage_save(); -int inter_guild_storage_save(); -int inter_storage_delete(int account_id); -int inter_guild_storage_delete(int guild_id); -struct storage *account2storage(int account_id); +int inter_storage_init (); +void inter_storage_final (); +int inter_storage_save (); +int inter_guild_storage_save (); +int inter_storage_delete (int account_id); +int inter_guild_storage_delete (int guild_id); +struct storage *account2storage (int account_id); -int inter_storage_parse_frommap(int fd); +int inter_storage_parse_frommap (int fd); extern char storage_txt[1024]; extern char guild_storage_txt[1024]; diff --git a/src/char/inter.c b/src/char/inter.c index 6e50432..19e1d83 100644 --- a/src/char/inter.c +++ b/src/char/inter.c @@ -13,154 +13,172 @@ #include "int_storage.h" #include "lock.h" -#define WISDATA_TTL (60*1000) // Existence time of Wisp/page data (60 seconds) - // that is the waiting time of answers of all map-servers -#define WISDELLIST_MAX 256 // Number of elements of Wisp/page data deletion list +#define WISDATA_TTL (60*1000) // Existence time of Wisp/page data (60 seconds) + // that is the waiting time of answers of all map-servers +#define WISDELLIST_MAX 256 // Number of elements of Wisp/page data deletion list char inter_log_filename[1024] = "log/inter.log"; char accreg_txt[1024] = "save/accreg.txt"; static struct dbt *accreg_db = NULL; -struct accreg { - int account_id, reg_num; - struct global_reg reg[ACCOUNT_REG_NUM]; +struct accreg +{ + int account_id, reg_num; + struct global_reg reg[ACCOUNT_REG_NUM]; }; -int party_share_level = 10; - +int party_share_level = 10; // 送信パケット長リスト -int inter_send_packet_length[] = { - -1,-1,27,-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0, - 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0, - 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1, - 9, 9,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +int inter_send_packet_length[] = { + -1, -1, 27, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -1, 7, 0, 0, 0, 0, 0, 0, -1, 11, 0, 0, 0, 0, 0, 0, + 35, -1, 11, 15, 34, 29, 7, -1, 0, 0, 0, 0, 0, 0, 0, 0, + 10, -1, 15, 0, 79, 19, 7, -1, 0, -1, -1, -1, 14, 67, 186, -1, + 9, 9, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, -1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; + // 受信パケット長リスト -int inter_recv_packet_length[] = { - -1,-1, 7,-1, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0, - 72, 6,52,14, 10,29, 6,-1, 34, 0, 0, 0, 0, 0, 0, 0, - -1, 6,-1, 0, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1, - 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 48,14,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +int inter_recv_packet_length[] = { + -1, -1, 7, -1, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, -1, 0, 0, 0, 0, 0, 0, 10, -1, 0, 0, 0, 0, 0, 0, + 72, 6, 52, 14, 10, 29, 6, -1, 34, 0, 0, 0, 0, 0, 0, 0, + -1, 6, -1, 0, 55, 19, 6, -1, 14, -1, -1, -1, 14, 19, 186, -1, + 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 14, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -struct WisData { - int id, fd, count, len; - unsigned long tick; - unsigned char src[24], dst[24], msg[1024]; +struct WisData +{ + int id, fd, count, len; + unsigned long tick; + unsigned char src[24], dst[24], msg[1024]; }; -static struct dbt * wis_db = NULL; +static struct dbt *wis_db = NULL; static int wis_dellist[WISDELLIST_MAX], wis_delnum; - //-------------------------------------------------------- // アカウント変数を文字列へ変換 -int inter_accreg_tostr(char *str, struct accreg *reg) { - int j; - char *p = str; - - p += sprintf(p, "%d\t", reg->account_id); - for(j = 0; j < reg->reg_num; j++) { - p += sprintf(p,"%s,%d ", reg->reg[j].str, reg->reg[j].value); - } - - return 0; +int inter_accreg_tostr (char *str, struct accreg *reg) +{ + int j; + char *p = str; + + p += sprintf (p, "%d\t", reg->account_id); + for (j = 0; j < reg->reg_num; j++) + { + p += sprintf (p, "%s,%d ", reg->reg[j].str, reg->reg[j].value); + } + + return 0; } // アカウント変数を文字列から変換 -int inter_accreg_fromstr(const char *str, struct accreg *reg) { - int j, v, n; - char buf[128]; - const char *p = str; - - if (sscanf(p, "%d\t%n", ®->account_id, &n ) != 1 || reg->account_id <= 0) - return 1; - - for(j = 0, p += n; j < ACCOUNT_REG_NUM; j++, p += n) { - if (sscanf(p, "%[^,],%d %n", buf, &v, &n) != 2) - break; - memcpy(reg->reg[j].str, buf, 32); - reg->reg[j].value = v; - } - reg->reg_num = j; - - return 0; +int inter_accreg_fromstr (const char *str, struct accreg *reg) +{ + int j, v, n; + char buf[128]; + const char *p = str; + + if (sscanf (p, "%d\t%n", ®->account_id, &n) != 1 + || reg->account_id <= 0) + return 1; + + for (j = 0, p += n; j < ACCOUNT_REG_NUM; j++, p += n) + { + if (sscanf (p, "%[^,],%d %n", buf, &v, &n) != 2) + break; + memcpy (reg->reg[j].str, buf, 32); + reg->reg[j].value = v; + } + reg->reg_num = j; + + return 0; } // アカウント変数の読み込み -int inter_accreg_init() { - char line[8192]; - FILE *fp; - int c = 0; - struct accreg *reg; - - accreg_db = numdb_init(); - - if( (fp = fopen_(accreg_txt, "r")) == NULL) - return 1; - while(fgets(line, sizeof(line)-1, fp)){ - line[sizeof(line)-1] = '\0'; - - reg = calloc(sizeof(struct accreg), 1); - if (reg == NULL) { - printf("inter: accreg: out of memory!\n"); - exit(0); - } - if (inter_accreg_fromstr(line, reg) == 0 && reg->account_id > 0) { - numdb_insert(accreg_db, reg->account_id, reg); - } else { - printf("inter: accreg: broken data [%s] line %d\n", accreg_txt, c); - free(reg); - } - c++; - } - fclose_(fp); -// printf("inter: %s read done (%d)\n", accreg_txt, c); - - return 0; +int inter_accreg_init () +{ + char line[8192]; + FILE *fp; + int c = 0; + struct accreg *reg; + + accreg_db = numdb_init (); + + if ((fp = fopen_ (accreg_txt, "r")) == NULL) + return 1; + while (fgets (line, sizeof (line) - 1, fp)) + { + line[sizeof (line) - 1] = '\0'; + + reg = calloc (sizeof (struct accreg), 1); + if (reg == NULL) + { + printf ("inter: accreg: out of memory!\n"); + exit (0); + } + if (inter_accreg_fromstr (line, reg) == 0 && reg->account_id > 0) + { + numdb_insert (accreg_db, reg->account_id, reg); + } + else + { + printf ("inter: accreg: broken data [%s] line %d\n", accreg_txt, + c); + free (reg); + } + c++; + } + fclose_ (fp); +// printf("inter: %s read done (%d)\n", accreg_txt, c); + + return 0; } // アカウント変数のセーブ用 -int inter_accreg_save_sub(void *key, void *data, va_list ap) { - char line[8192]; - FILE *fp; - struct accreg *reg = (struct accreg *)data; - - if (reg->reg_num > 0) { - inter_accreg_tostr(line,reg); - fp = va_arg(ap, FILE *); - fprintf(fp, "%s" RETCODE, line); - } - - return 0; +int inter_accreg_save_sub (void *key, void *data, va_list ap) +{ + char line[8192]; + FILE *fp; + struct accreg *reg = (struct accreg *) data; + + if (reg->reg_num > 0) + { + inter_accreg_tostr (line, reg); + fp = va_arg (ap, FILE *); + fprintf (fp, "%s" RETCODE, line); + } + + return 0; } // アカウント変数のセーブ -int inter_accreg_save() { - FILE *fp; - int lock; - - if ((fp = lock_fopen(accreg_txt,&lock)) == NULL) { - printf("int_accreg: cant write [%s] !!! data is lost !!!\n", accreg_txt); - return 1; - } - numdb_foreach(accreg_db, inter_accreg_save_sub,fp); - lock_fclose(fp, accreg_txt, &lock); -// printf("inter: %s saved.\n", accreg_txt); - - return 0; +int inter_accreg_save () +{ + FILE *fp; + int lock; + + if ((fp = lock_fopen (accreg_txt, &lock)) == NULL) + { + printf ("int_accreg: cant write [%s] !!! data is lost !!!\n", + accreg_txt); + return 1; + } + numdb_foreach (accreg_db, inter_accreg_save_sub, fp); + lock_fclose (fp, accreg_txt, &lock); +// printf("inter: %s saved.\n", accreg_txt); + + return 0; } //-------------------------------------------------------- @@ -169,334 +187,396 @@ int inter_accreg_save() { * 設定ファイルを読み込む *------------------------------------------ */ -int inter_config_read(const char *cfgName) { - char line[1024], w1[1024], w2[1024]; - FILE *fp; - - fp = fopen_(cfgName, "r"); - if (fp == NULL) { - printf("file not found: %s\n", cfgName); - return 1; - } - while(fgets(line, sizeof(line) - 1, fp)) { - if (line[0] == '/' && line[1] == '/') - continue; - line[sizeof(line)-1] = '\0'; - - if (sscanf(line,"%[^:]: %[^\r\n]", w1, w2) != 2) - continue; - - if (strcmpi(w1, "storage_txt") == 0) { - strncpy(storage_txt, w2, sizeof(storage_txt)); - } else if (strcmpi(w1, "party_txt") == 0) { - strncpy(party_txt, w2, sizeof(party_txt)); - } else if (strcmpi(w1, "guild_txt") == 0) { - strncpy(guild_txt, w2, sizeof(guild_txt)); - } else if (strcmpi(w1, "castle_txt") == 0) { - strncpy(castle_txt, w2, sizeof(castle_txt)); - } else if (strcmpi(w1, "accreg_txt") == 0) { - strncpy(accreg_txt, w2, sizeof(accreg_txt)); - } else if (strcmpi(w1, "guild_storage_txt") == 0) { - strncpy(guild_storage_txt, w2, sizeof(guild_storage_txt)); - } else if (strcmpi(w1, "party_share_level") == 0) { - party_share_level = atoi(w2); - if (party_share_level < 0) - party_share_level = 0; - } else if (strcmpi(w1, "inter_log_filename") == 0) { - strncpy(inter_log_filename, w2, sizeof(inter_log_filename)); - } else if (strcmpi(w1, "import") == 0) { - inter_config_read(w2); - } - } - fclose_(fp); - - return 0; +int inter_config_read (const char *cfgName) +{ + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + fp = fopen_ (cfgName, "r"); + if (fp == NULL) + { + printf ("file not found: %s\n", cfgName); + return 1; + } + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + line[sizeof (line) - 1] = '\0'; + + if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) != 2) + continue; + + if (strcmpi (w1, "storage_txt") == 0) + { + strncpy (storage_txt, w2, sizeof (storage_txt)); + } + else if (strcmpi (w1, "party_txt") == 0) + { + strncpy (party_txt, w2, sizeof (party_txt)); + } + else if (strcmpi (w1, "guild_txt") == 0) + { + strncpy (guild_txt, w2, sizeof (guild_txt)); + } + else if (strcmpi (w1, "castle_txt") == 0) + { + strncpy (castle_txt, w2, sizeof (castle_txt)); + } + else if (strcmpi (w1, "accreg_txt") == 0) + { + strncpy (accreg_txt, w2, sizeof (accreg_txt)); + } + else if (strcmpi (w1, "guild_storage_txt") == 0) + { + strncpy (guild_storage_txt, w2, sizeof (guild_storage_txt)); + } + else if (strcmpi (w1, "party_share_level") == 0) + { + party_share_level = atoi (w2); + if (party_share_level < 0) + party_share_level = 0; + } + else if (strcmpi (w1, "inter_log_filename") == 0) + { + strncpy (inter_log_filename, w2, sizeof (inter_log_filename)); + } + else if (strcmpi (w1, "import") == 0) + { + inter_config_read (w2); + } + } + fclose_ (fp); + + return 0; } // ログ書き出し -int inter_log(char *fmt,...) { - FILE *logfp; - va_list ap; - - va_start(ap,fmt); - logfp = fopen_(inter_log_filename, "a"); - if (logfp) { - vfprintf(logfp, fmt, ap); - fclose_(logfp); - } - va_end(ap); - - return 0; +int inter_log (char *fmt, ...) +{ + FILE *logfp; + va_list ap; + + va_start (ap, fmt); + logfp = fopen_ (inter_log_filename, "a"); + if (logfp) + { + vfprintf (logfp, fmt, ap); + fclose_ (logfp); + } + va_end (ap); + + return 0; } // セーブ -int inter_save() { - inter_party_save(); - inter_guild_save(); - inter_storage_save(); - inter_guild_storage_save(); - inter_accreg_save(); - - return 0; +int inter_save () +{ + inter_party_save (); + inter_guild_save (); + inter_storage_save (); + inter_guild_storage_save (); + inter_accreg_save (); + + return 0; } // 初期化 -int inter_init(const char *file) { - inter_config_read(file); +int inter_init (const char *file) +{ + inter_config_read (file); - wis_db = numdb_init(); + wis_db = numdb_init (); - inter_party_init(); - inter_guild_init(); - inter_storage_init(); - inter_accreg_init(); + inter_party_init (); + inter_guild_init (); + inter_storage_init (); + inter_accreg_init (); - return 0; + return 0; } // マップサーバー接続 -int inter_mapif_init(int fd) { - inter_guild_mapif_init(fd); +int inter_mapif_init (int fd) +{ + inter_guild_mapif_init (fd); - return 0; + return 0; } //-------------------------------------------------------- // sended packets to map-server // GMメッセージ送信 -int mapif_GMmessage(unsigned char *mes, int len) { - unsigned char buf[len]; +int mapif_GMmessage (unsigned char *mes, int len) +{ + unsigned char buf[len]; - WBUFW(buf,0) = 0x3800; - WBUFW(buf,2) = len; - memcpy(WBUFP(buf,4), mes, len - 4); - mapif_sendall(buf, len); -// printf("inter server: GM:%d %s\n", len, mes); + WBUFW (buf, 0) = 0x3800; + WBUFW (buf, 2) = len; + memcpy (WBUFP (buf, 4), mes, len - 4); + mapif_sendall (buf, len); +// printf("inter server: GM:%d %s\n", len, mes); - return 0; + return 0; } // Wisp/page transmission to all map-server -int mapif_wis_message(struct WisData *wd) { - unsigned char buf[56 + wd->len]; - - WBUFW(buf, 0) = 0x3801; - WBUFW(buf, 2) = 56 + wd->len; - WBUFL(buf, 4) = wd->id; - memcpy(WBUFP(buf, 8), wd->src, 24); - memcpy(WBUFP(buf,32), wd->dst, 24); - memcpy(WBUFP(buf,56), wd->msg, wd->len); - wd->count = mapif_sendall(buf, WBUFW(buf,2)); - - return 0; +int mapif_wis_message (struct WisData *wd) +{ + unsigned char buf[56 + wd->len]; + + WBUFW (buf, 0) = 0x3801; + WBUFW (buf, 2) = 56 + wd->len; + WBUFL (buf, 4) = wd->id; + memcpy (WBUFP (buf, 8), wd->src, 24); + memcpy (WBUFP (buf, 32), wd->dst, 24); + memcpy (WBUFP (buf, 56), wd->msg, wd->len); + wd->count = mapif_sendall (buf, WBUFW (buf, 2)); + + return 0; } // Wisp/page transmission result to map-server -int mapif_wis_end(struct WisData *wd, int flag) { - unsigned char buf[27]; +int mapif_wis_end (struct WisData *wd, int flag) +{ + unsigned char buf[27]; - WBUFW(buf, 0) = 0x3802; - memcpy(WBUFP(buf, 2), wd->src, 24); - WBUFB(buf,26) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - mapif_send(wd->fd, buf, 27); -// printf("inter server wis_end: flag: %d\n", flag); + WBUFW (buf, 0) = 0x3802; + memcpy (WBUFP (buf, 2), wd->src, 24); + WBUFB (buf, 26) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + mapif_send (wd->fd, buf, 27); +// printf("inter server wis_end: flag: %d\n", flag); - return 0; + return 0; } // アカウント変数送信 -int mapif_account_reg(int fd, unsigned char *src) { - unsigned char buf[WBUFW(src,2)]; +int mapif_account_reg (int fd, unsigned char *src) +{ + unsigned char buf[WBUFW (src, 2)]; - memcpy(WBUFP(buf,0),src,WBUFW(src,2)); - WBUFW(buf, 0) = 0x3804; - mapif_sendallwos(fd, buf, WBUFW(buf,2)); + memcpy (WBUFP (buf, 0), src, WBUFW (src, 2)); + WBUFW (buf, 0) = 0x3804; + mapif_sendallwos (fd, buf, WBUFW (buf, 2)); - return 0; + return 0; } // アカウント変数要求返信 -int mapif_account_reg_reply(int fd,int account_id) { - struct accreg *reg = numdb_search(accreg_db,account_id); - - WFIFOW(fd,0) = 0x3804; - WFIFOL(fd,4) = account_id; - if (reg == NULL) { - WFIFOW(fd,2) = 8; - } else { - int j, p; - for(j = 0, p = 8; j < reg->reg_num; j++, p += 36) { - memcpy(WFIFOP(fd,p), reg->reg[j].str, 32); - WFIFOL(fd,p+32) = reg->reg[j].value; - } - WFIFOW(fd,2) = p; - } - WFIFOSET(fd,WFIFOW(fd,2)); - - return 0; +int mapif_account_reg_reply (int fd, int account_id) +{ + struct accreg *reg = numdb_search (accreg_db, account_id); + + WFIFOW (fd, 0) = 0x3804; + WFIFOL (fd, 4) = account_id; + if (reg == NULL) + { + WFIFOW (fd, 2) = 8; + } + else + { + int j, p; + for (j = 0, p = 8; j < reg->reg_num; j++, p += 36) + { + memcpy (WFIFOP (fd, p), reg->reg[j].str, 32); + WFIFOL (fd, p + 32) = reg->reg[j].value; + } + WFIFOW (fd, 2) = p; + } + WFIFOSET (fd, WFIFOW (fd, 2)); + + return 0; } //-------------------------------------------------------- // Existence check of WISP data -int check_ttl_wisdata_sub(void *key, void *data, va_list ap) { - unsigned long tick; - struct WisData *wd = (struct WisData *)data; - tick = va_arg(ap, unsigned long); +int check_ttl_wisdata_sub (void *key, void *data, va_list ap) +{ + unsigned long tick; + struct WisData *wd = (struct WisData *) data; + tick = va_arg (ap, unsigned long); - if (DIFF_TICK(tick, wd->tick) > WISDATA_TTL && wis_delnum < WISDELLIST_MAX) - wis_dellist[wis_delnum++] = wd->id; + if (DIFF_TICK (tick, wd->tick) > WISDATA_TTL + && wis_delnum < WISDELLIST_MAX) + wis_dellist[wis_delnum++] = wd->id; - return 0; + return 0; } -int check_ttl_wisdata() { - unsigned long tick = gettick(); - int i; - - do { - wis_delnum = 0; - numdb_foreach(wis_db, check_ttl_wisdata_sub, tick); - for(i = 0; i < wis_delnum; i++) { - struct WisData *wd = numdb_search(wis_db, wis_dellist[i]); - printf("inter: wis data id=%d time out : from %s to %s\n", wd->id, wd->src, wd->dst); - // removed. not send information after a timeout. Just no answer for the player - //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - numdb_erase(wis_db, wd->id); - free(wd); - } - } while(wis_delnum >= WISDELLIST_MAX); - - return 0; +int check_ttl_wisdata () +{ + unsigned long tick = gettick (); + int i; + + do + { + wis_delnum = 0; + numdb_foreach (wis_db, check_ttl_wisdata_sub, tick); + for (i = 0; i < wis_delnum; i++) + { + struct WisData *wd = numdb_search (wis_db, wis_dellist[i]); + printf ("inter: wis data id=%d time out : from %s to %s\n", + wd->id, wd->src, wd->dst); + // removed. not send information after a timeout. Just no answer for the player + //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + numdb_erase (wis_db, wd->id); + free (wd); + } + } + while (wis_delnum >= WISDELLIST_MAX); + + return 0; } //-------------------------------------------------------- // received packets from map-server // GMメッセージ送信 -int mapif_parse_GMmessage(int fd) { - mapif_GMmessage(RFIFOP(fd,4), RFIFOW(fd,2)); +int mapif_parse_GMmessage (int fd) +{ + mapif_GMmessage (RFIFOP (fd, 4), RFIFOW (fd, 2)); - return 0; + return 0; } // Wisp/page request to send -int mapif_parse_WisRequest(int fd) { - struct WisData* wd; - static int wisid = 0; - int index; - - if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) { - printf("inter: Wis message size too long.\n"); - return 0; - } else if (RFIFOW(fd,2)-52 <= 0) { // normaly, impossible, but who knows... - printf("inter: Wis message doesn't exist.\n"); - return 0; - } - - // search if character exists before to ask all map-servers - if ((index = search_character_index(RFIFOP(fd,28))) == -1) { - unsigned char buf[27]; - WBUFW(buf, 0) = 0x3802; - memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24); - WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - mapif_send(fd, buf, 27); - // Character exists. So, ask all map-servers - } else { - // to be sure of the correct name, rewrite it - memset(RFIFOP(fd,28), 0, 24); - strncpy(RFIFOP(fd,28), search_character_name(index), 24); - // if source is destination, don't ask other servers. - if (strcmp(RFIFOP(fd,4),RFIFOP(fd,28)) == 0) { - unsigned char buf[27]; - WBUFW(buf, 0) = 0x3802; - memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24); - WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - mapif_send(fd, buf, 27); - } else { - - wd = (struct WisData *)calloc(sizeof(struct WisData), 1); - if (wd == NULL){ - printf("inter: WisRequest: out of memory !\n"); - return 0; - } - - // Whether the failure of previous wisp/page transmission (timeout) - check_ttl_wisdata(); - - wd->id = ++wisid; - wd->fd = fd; - wd->len= RFIFOW(fd,2)-52; - memcpy(wd->src, RFIFOP(fd, 4), 24); - memcpy(wd->dst, RFIFOP(fd,28), 24); - memcpy(wd->msg, RFIFOP(fd,52), wd->len); - wd->tick = gettick(); - numdb_insert(wis_db, wd->id, wd); - mapif_wis_message(wd); - } - } - - return 0; +int mapif_parse_WisRequest (int fd) +{ + struct WisData *wd; + static int wisid = 0; + int index; + + if (RFIFOW (fd, 2) - 52 >= sizeof (wd->msg)) + { + printf ("inter: Wis message size too long.\n"); + return 0; + } + else if (RFIFOW (fd, 2) - 52 <= 0) + { // normaly, impossible, but who knows... + printf ("inter: Wis message doesn't exist.\n"); + return 0; + } + + // search if character exists before to ask all map-servers + if ((index = search_character_index (RFIFOP (fd, 28))) == -1) + { + unsigned char buf[27]; + WBUFW (buf, 0) = 0x3802; + memcpy (WBUFP (buf, 2), RFIFOP (fd, 4), 24); + WBUFB (buf, 26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + mapif_send (fd, buf, 27); + // Character exists. So, ask all map-servers + } + else + { + // to be sure of the correct name, rewrite it + memset (RFIFOP (fd, 28), 0, 24); + strncpy (RFIFOP (fd, 28), search_character_name (index), 24); + // if source is destination, don't ask other servers. + if (strcmp (RFIFOP (fd, 4), RFIFOP (fd, 28)) == 0) + { + unsigned char buf[27]; + WBUFW (buf, 0) = 0x3802; + memcpy (WBUFP (buf, 2), RFIFOP (fd, 4), 24); + WBUFB (buf, 26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + mapif_send (fd, buf, 27); + } + else + { + + wd = (struct WisData *) calloc (sizeof (struct WisData), 1); + if (wd == NULL) + { + printf ("inter: WisRequest: out of memory !\n"); + return 0; + } + + // Whether the failure of previous wisp/page transmission (timeout) + check_ttl_wisdata (); + + wd->id = ++wisid; + wd->fd = fd; + wd->len = RFIFOW (fd, 2) - 52; + memcpy (wd->src, RFIFOP (fd, 4), 24); + memcpy (wd->dst, RFIFOP (fd, 28), 24); + memcpy (wd->msg, RFIFOP (fd, 52), wd->len); + wd->tick = gettick (); + numdb_insert (wis_db, wd->id, wd); + mapif_wis_message (wd); + } + } + + return 0; } // Wisp/page transmission result -int mapif_parse_WisReply(int fd) { - int id = RFIFOL(fd,2), flag = RFIFOB(fd,6); - struct WisData *wd = numdb_search(wis_db, id); - - if (wd == NULL) - return 0; // This wisp was probably suppress before, because it was timeout of because of target was found on another map-server - - if ((--wd->count) <= 0 || flag != 1) { - mapif_wis_end(wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - numdb_erase(wis_db, id); - free(wd); - } - - return 0; +int mapif_parse_WisReply (int fd) +{ + int id = RFIFOL (fd, 2), flag = RFIFOB (fd, 6); + struct WisData *wd = numdb_search (wis_db, id); + + if (wd == NULL) + return 0; // This wisp was probably suppress before, because it was timeout of because of target was found on another map-server + + if ((--wd->count) <= 0 || flag != 1) + { + mapif_wis_end (wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + numdb_erase (wis_db, id); + free (wd); + } + + return 0; } // Received wisp message from map-server for ALL gm (just copy the message and resends it to ALL map-servers) -int mapif_parse_WisToGM(int fd) { - unsigned char buf[RFIFOW(fd,2)]; // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B +int mapif_parse_WisToGM (int fd) +{ + unsigned char buf[RFIFOW (fd, 2)]; // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B - memcpy(WBUFP(buf,0), RFIFOP(fd,0), RFIFOW(fd,2)); - WBUFW(buf, 0) = 0x3803; - mapif_sendall(buf, RFIFOW(fd,2)); + memcpy (WBUFP (buf, 0), RFIFOP (fd, 0), RFIFOW (fd, 2)); + WBUFW (buf, 0) = 0x3803; + mapif_sendall (buf, RFIFOW (fd, 2)); - return 0; + return 0; } // アカウント変数保存要求 -int mapif_parse_AccReg(int fd) { - int j, p; - struct accreg *reg = numdb_search(accreg_db, RFIFOL(fd,4)); - - if (reg == NULL) { - if ((reg = calloc(sizeof(struct accreg), 1)) == NULL) { - printf("inter: accreg: out of memory !\n"); - exit(0); - } - reg->account_id = RFIFOL(fd,4); - numdb_insert(accreg_db, RFIFOL(fd,4), reg); - } - - for(j = 0, p = 8; j < ACCOUNT_REG_NUM && p < RFIFOW(fd,2); j++, p += 36) { - memcpy(reg->reg[j].str, RFIFOP(fd,p), 32); - reg->reg[j].value = RFIFOL(fd, p + 32); - } - reg->reg_num = j; - - mapif_account_reg(fd, RFIFOP(fd,0)); // 他のMAPサーバーに送信 - - return 0; +int mapif_parse_AccReg (int fd) +{ + int j, p; + struct accreg *reg = numdb_search (accreg_db, RFIFOL (fd, 4)); + + if (reg == NULL) + { + if ((reg = calloc (sizeof (struct accreg), 1)) == NULL) + { + printf ("inter: accreg: out of memory !\n"); + exit (0); + } + reg->account_id = RFIFOL (fd, 4); + numdb_insert (accreg_db, RFIFOL (fd, 4), reg); + } + + for (j = 0, p = 8; j < ACCOUNT_REG_NUM && p < RFIFOW (fd, 2); + j++, p += 36) + { + memcpy (reg->reg[j].str, RFIFOP (fd, p), 32); + reg->reg[j].value = RFIFOL (fd, p + 32); + } + reg->reg_num = j; + + mapif_account_reg (fd, RFIFOP (fd, 0)); // 他のMAPサーバーに送信 + + return 0; } // アカウント変数送信要求 -int mapif_parse_AccRegRequest(int fd) { -// printf("mapif: accreg request\n"); - return mapif_account_reg_reply(fd, RFIFOL(fd,2)); +int mapif_parse_AccRegRequest (int fd) +{ +// printf("mapif: accreg request\n"); + return mapif_account_reg_reply (fd, RFIFOL (fd, 2)); } //-------------------------------------------------------- @@ -504,51 +584,72 @@ int mapif_parse_AccRegRequest(int fd) { // map server からの通信(1パケットのみ解析すること) // エラーなら0(false)、処理できたなら1、 // パケット長が足りなければ2をかえさなければならない -int inter_parse_frommap(int fd) { - int cmd = RFIFOW(fd,0); - int len = 0; - - // inter鯖管轄かを調べる - if (cmd < 0x3000 || cmd >= 0x3000 + (sizeof(inter_recv_packet_length) / sizeof(inter_recv_packet_length[0]))) - return 0; - - // パケット長を調べる - if ((len = inter_check_length(fd, inter_recv_packet_length[cmd - 0x3000])) == 0) - return 2; - - switch(cmd) { - case 0x3000: mapif_parse_GMmessage(fd); break; - case 0x3001: mapif_parse_WisRequest(fd); break; - case 0x3002: mapif_parse_WisReply(fd); break; - case 0x3003: mapif_parse_WisToGM(fd); break; - case 0x3004: mapif_parse_AccReg(fd); break; - case 0x3005: mapif_parse_AccRegRequest(fd); break; - default: - if (inter_party_parse_frommap(fd)) - break; - if (inter_guild_parse_frommap(fd)) - break; - if (inter_storage_parse_frommap(fd)) - break; - return 0; - } - RFIFOSKIP(fd, len); - - return 1; +int inter_parse_frommap (int fd) +{ + int cmd = RFIFOW (fd, 0); + int len = 0; + + // inter鯖管轄かを調べる + if (cmd < 0x3000 + || cmd >= + 0x3000 + + (sizeof (inter_recv_packet_length) / + sizeof (inter_recv_packet_length[0]))) + return 0; + + // パケット長を調べる + if ((len = + inter_check_length (fd, + inter_recv_packet_length[cmd - 0x3000])) == 0) + return 2; + + switch (cmd) + { + case 0x3000: + mapif_parse_GMmessage (fd); + break; + case 0x3001: + mapif_parse_WisRequest (fd); + break; + case 0x3002: + mapif_parse_WisReply (fd); + break; + case 0x3003: + mapif_parse_WisToGM (fd); + break; + case 0x3004: + mapif_parse_AccReg (fd); + break; + case 0x3005: + mapif_parse_AccRegRequest (fd); + break; + default: + if (inter_party_parse_frommap (fd)) + break; + if (inter_guild_parse_frommap (fd)) + break; + if (inter_storage_parse_frommap (fd)) + break; + return 0; + } + RFIFOSKIP (fd, len); + + return 1; } // RFIFOのパケット長確認 // 必要パケット長があればパケット長、まだ足りなければ0 -int inter_check_length(int fd, int length) { - if (length == -1) { // 可変パケット長 - if (RFIFOREST(fd) < 4) // パケット長が未着 - return 0; - length = RFIFOW(fd,2); - } - - if (RFIFOREST(fd) < length) // パケットが未着 - return 0; - - return length; +int inter_check_length (int fd, int length) +{ + if (length == -1) + { // 可変パケット長 + if (RFIFOREST (fd) < 4) // パケット長が未着 + return 0; + length = RFIFOW (fd, 2); + } + + if (RFIFOREST (fd) < length) // パケットが未着 + return 0; + + return length; } - diff --git a/src/char/inter.h b/src/char/inter.h index b004c9b..7ad7d08 100644 --- a/src/char/inter.h +++ b/src/char/inter.h @@ -2,14 +2,14 @@ #ifndef _INTER_H_ #define _INTER_H_ -int inter_init(const char *file); -int inter_save(); -int inter_parse_frommap(int fd); -int inter_mapif_init(int fd); +int inter_init (const char *file); +int inter_save (); +int inter_parse_frommap (int fd); +int inter_mapif_init (int fd); -int inter_check_length(int fd,int length); +int inter_check_length (int fd, int length); -int inter_log(char *fmt,...); +int inter_log (char *fmt, ...); #define inter_cfgName "conf/inter_athena.conf" diff --git a/src/char_sql/char.c b/src/char_sql/char.c index 789a7c7..b9c8de3 100644 --- a/src/char_sql/char.c +++ b/src/char_sql/char.c @@ -66,62 +66,65 @@ char login_db[256] = "login"; char login_db_account_id[32] = "account_id"; char login_db_level[32] = "level"; -int lowest_gm_level = 1; +int lowest_gm_level = 1; unsigned char *SQL_CONF_NAME = "conf/inter_athena.conf"; struct mmo_map_server server[MAX_MAP_SERVERS]; -int server_fd[MAX_MAP_SERVERS]; -int server_freezeflag[MAX_MAP_SERVERS]; // Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed +int server_fd[MAX_MAP_SERVERS]; +int server_freezeflag[MAX_MAP_SERVERS]; // Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed -int anti_freeze_enable = 0; -int ANTI_FREEZE_INTERVAL = 6; +int anti_freeze_enable = 0; +int ANTI_FREEZE_INTERVAL = 6; -int login_fd, char_fd; +int login_fd, char_fd; char userid[24]; char passwd[24]; char server_name[20]; char wisp_server_name[24] = "Server"; char login_ip_str[128]; -int login_ip; -int login_port = 6900; +int login_ip; +int login_port = 6900; char char_ip_str[128]; -int char_ip; -int char_port = 6121; -int char_maintenance; -int char_new; -int name_ignoring_case = 0; // Allow or not identical name for characters but with a different case by [Yor] -int char_name_option = 0; // Option to know which letters/symbols are authorised in the name of a character (0: all, 1: only those in char_name_letters, 2: all EXCEPT those in char_name_letters) by [Yor] -char char_name_letters[1024] = ""; // list of letters/symbols used to authorise or not a name of a character. by [Yor] - -char lan_map_ip[128]; // Lan map ip added by kashy -int subnetmaski[4]; // Subnetmask added by kashy +int char_ip; +int char_port = 6121; +int char_maintenance; +int char_new; +int name_ignoring_case = 0; // Allow or not identical name for characters but with a different case by [Yor] +int char_name_option = 0; // Option to know which letters/symbols are authorised in the name of a character (0: all, 1: only those in char_name_letters, 2: all EXCEPT those in char_name_letters) by [Yor] +char char_name_letters[1024] = ""; // list of letters/symbols used to authorise or not a name of a character. by [Yor] + +char lan_map_ip[128]; // Lan map ip added by kashy +int subnetmaski[4]; // Subnetmask added by kashy char unknown_char_name[1024] = "Unknown"; -struct char_session_data{ - int account_id,login_id1,login_id2,sex; - int found_char[9]; - char email[40]; // e-mail (default: a@a.com) by [Yor] - time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) +struct char_session_data +{ + int account_id, login_id1, login_id2, sex; + int found_char[9]; + char email[40]; // e-mail (default: a@a.com) by [Yor] + time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) }; #define AUTH_FIFO_SIZE 256 -struct { - int account_id,char_id,login_id1,login_id2,ip,char_pos,delflag,sex; - time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) +struct +{ + int account_id, char_id, login_id1, login_id2, ip, char_pos, delflag, + sex; + time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) } auth_fifo[AUTH_FIFO_SIZE]; -int auth_fifo_pos = 0; +int auth_fifo_pos = 0; -int check_ip_flag = 1; // It's to check IP of a player between char-server and other servers (part of anti-hacking system) +int check_ip_flag = 1; // It's to check IP of a player between char-server and other servers (part of anti-hacking system) -int char_id_count = 150000; +int char_id_count = 150000; struct mmo_charstatus *char_dat; -int char_num,char_max; -int max_connect_user = 0; -int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; -int start_zeny = 500; -int start_weapon = 1201; -int start_armor = 2301; +int char_num, char_max; +int max_connect_user = 0; +int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; +int start_zeny = 500; +int start_weapon = 1201; +int start_armor = 2301; // check for exit signal // 0 is saving complete @@ -129,26 +132,29 @@ int start_armor = 2301; unsigned int save_flag = 0; // start point (you can reset point on conf file) -struct point start_point = {"new_1-1.gat", 53, 111}; +struct point start_point = { "new_1-1.gat", 53, 111 }; struct gm_account *gm_account = NULL; -int GM_num = 0; +int GM_num = 0; //----------------------------------------------------- // Function to suppress control characters in a string. //----------------------------------------------------- -int remove_control_chars(unsigned char *str) { - int i; - int change = 0; - - for(i = 0; i < strlen(str); i++) { - if (str[i] < 32) { - str[i] = '_'; - change = 1; - } - } - - return change; +int remove_control_chars (unsigned char *str) +{ + int i; + int change = 0; + + for (i = 0; i < strlen (str); i++) + { + if (str[i] < 32) + { + str[i] = '_'; + change = 1; + } + } + + return change; } //---------------------------------------------------------------------- @@ -156,720 +162,951 @@ int remove_control_chars(unsigned char *str) { // and returns its level (or 0 if it isn't a GM account or if not found) //---------------------------------------------------------------------- // Removed since nothing GM related goes on in the char server [CLOWNISIUS] -int isGM(int account_id) { - int i; - - for(i = 0; i < GM_num; i++) - if (gm_account[i].account_id == account_id) - return gm_account[i].level; - return 0; +int isGM (int account_id) +{ + int i; + + for (i = 0; i < GM_num; i++) + if (gm_account[i].account_id == account_id) + return gm_account[i].level; + return 0; } -void read_gm_account(void) { - if (gm_account != NULL) - free(gm_account); - GM_num = 0; - - sprintf(tmp_lsql, "SELECT `%s`,`%s` FROM `%s` WHERE `%s`>='%d'",login_db_account_id,login_db_level,login_db,login_db_level,lowest_gm_level); - if (mysql_query(&lmysql_handle, tmp_lsql)) { - printf("DB server Error (select %s to Memory)- %s\n",login_db,mysql_error(&lmysql_handle)); - } - lsql_res = mysql_store_result(&lmysql_handle); - if (lsql_res) { - gm_account = calloc(sizeof(struct gm_account) * mysql_num_rows(lsql_res), 1); - while ((lsql_row = mysql_fetch_row(lsql_res))) { - gm_account[GM_num].account_id = atoi(lsql_row[0]); - gm_account[GM_num].level = atoi(lsql_row[1]); - GM_num++; - } - } - - mysql_free_result(lsql_res); +void read_gm_account (void) +{ + if (gm_account != NULL) + free (gm_account); + GM_num = 0; + + sprintf (tmp_lsql, "SELECT `%s`,`%s` FROM `%s` WHERE `%s`>='%d'", + login_db_account_id, login_db_level, login_db, login_db_level, + lowest_gm_level); + if (mysql_query (&lmysql_handle, tmp_lsql)) + { + printf ("DB server Error (select %s to Memory)- %s\n", login_db, + mysql_error (&lmysql_handle)); + } + lsql_res = mysql_store_result (&lmysql_handle); + if (lsql_res) + { + gm_account = + calloc (sizeof (struct gm_account) * mysql_num_rows (lsql_res), + 1); + while ((lsql_row = mysql_fetch_row (lsql_res))) + { + gm_account[GM_num].account_id = atoi (lsql_row[0]); + gm_account[GM_num].level = atoi (lsql_row[1]); + GM_num++; + } + } + + mysql_free_result (lsql_res); } //===================================================================================================== -int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ - int i=0,party_exist,guild_exist; - int eqcount=1; - int noteqcount=1; - char temp_str[32]; - - struct itemtemp mapitem; - if (char_id!=p->char_id) return 0; - - save_flag = p->char_id; - printf("(\033[1;32m%d\033[0m) %s \trequest save char data - ",char_id,char_dat[0].name); +int mmo_char_tosql (int char_id, struct mmo_charstatus *p) +{ + int i = 0, party_exist, guild_exist; + int eqcount = 1; + int noteqcount = 1; + char temp_str[32]; + struct itemtemp mapitem; + if (char_id != p->char_id) + return 0; + save_flag = p->char_id; + printf ("(\033[1;32m%d\033[0m) %s \trequest save char data - ", char_id, + char_dat[0].name); //for(testcount=1;testcount<50;testcount++){//---------------------------test count-------------------- -// printf("test count : %d\n", testcount); -// eqcount=1; -// noteqcount=1; -// dbeqcount=1; -// dbnoteqcount=1; +// printf("test count : %d\n", testcount); +// eqcount=1; +// noteqcount=1; +// dbeqcount=1; +// dbnoteqcount=1; //----------------------------------------------------------------------------------------------------- //=========================================map inventory data > memory =============================== - //map inventory data - for(i=0;i<MAX_INVENTORY;i++){ - if(p->inventory[i].nameid>0){ - if(itemdb_isequip(p->inventory[i].nameid)==1){ - mapitem.equip[eqcount].flag=0; - mapitem.equip[eqcount].id = p->inventory[i].id; - mapitem.equip[eqcount].nameid=p->inventory[i].nameid; - mapitem.equip[eqcount].amount = p->inventory[i].amount; - mapitem.equip[eqcount].equip = p->inventory[i].equip; - mapitem.equip[eqcount].identify = p->inventory[i].identify; - mapitem.equip[eqcount].refine = p->inventory[i].refine; - mapitem.equip[eqcount].attribute = p->inventory[i].attribute; - mapitem.equip[eqcount].card[0] = p->inventory[i].card[0]; - mapitem.equip[eqcount].card[1] = p->inventory[i].card[1]; - mapitem.equip[eqcount].card[2] = p->inventory[i].card[2]; - mapitem.equip[eqcount].card[3] = p->inventory[i].card[3]; + //map inventory data + for (i = 0; i < MAX_INVENTORY; i++) + { + if (p->inventory[i].nameid > 0) + { + if (itemdb_isequip (p->inventory[i].nameid) == 1) + { + mapitem.equip[eqcount].flag = 0; + mapitem.equip[eqcount].id = p->inventory[i].id; + mapitem.equip[eqcount].nameid = p->inventory[i].nameid; + mapitem.equip[eqcount].amount = p->inventory[i].amount; + mapitem.equip[eqcount].equip = p->inventory[i].equip; + mapitem.equip[eqcount].identify = p->inventory[i].identify; + mapitem.equip[eqcount].refine = p->inventory[i].refine; + mapitem.equip[eqcount].attribute = p->inventory[i].attribute; + mapitem.equip[eqcount].card[0] = p->inventory[i].card[0]; + mapitem.equip[eqcount].card[1] = p->inventory[i].card[1]; + mapitem.equip[eqcount].card[2] = p->inventory[i].card[2]; + mapitem.equip[eqcount].card[3] = p->inventory[i].card[3]; mapitem.equip[eqcount].broken = p->inventory[i].broken; - eqcount++; - } - else if(itemdb_isequip(p->inventory[i].nameid)==0){ - mapitem.notequip[noteqcount].flag=0; - mapitem.notequip[noteqcount].id = p->inventory[i].id; - mapitem.notequip[noteqcount].nameid=p->inventory[i].nameid; - mapitem.notequip[noteqcount].amount = p->inventory[i].amount; - mapitem.notequip[noteqcount].equip = p->inventory[i].equip; - mapitem.notequip[noteqcount].identify = p->inventory[i].identify; - mapitem.notequip[noteqcount].refine = p->inventory[i].refine; - mapitem.notequip[noteqcount].attribute = p->inventory[i].attribute; - mapitem.notequip[noteqcount].card[0] = p->inventory[i].card[0]; - mapitem.notequip[noteqcount].card[1] = p->inventory[i].card[1]; - mapitem.notequip[noteqcount].card[2] = p->inventory[i].card[2]; - mapitem.notequip[noteqcount].card[3] = p->inventory[i].card[3]; - mapitem.notequip[noteqcount].broken = p->inventory[i].broken; - noteqcount++; - } - } - } - //printf("- Save item data to MySQL!\n"); - memitemdata_to_sql(mapitem, eqcount, noteqcount, p->char_id,TABLE_INVENTORY); + eqcount++; + } + else if (itemdb_isequip (p->inventory[i].nameid) == 0) + { + mapitem.notequip[noteqcount].flag = 0; + mapitem.notequip[noteqcount].id = p->inventory[i].id; + mapitem.notequip[noteqcount].nameid = p->inventory[i].nameid; + mapitem.notequip[noteqcount].amount = p->inventory[i].amount; + mapitem.notequip[noteqcount].equip = p->inventory[i].equip; + mapitem.notequip[noteqcount].identify = + p->inventory[i].identify; + mapitem.notequip[noteqcount].refine = p->inventory[i].refine; + mapitem.notequip[noteqcount].attribute = + p->inventory[i].attribute; + mapitem.notequip[noteqcount].card[0] = + p->inventory[i].card[0]; + mapitem.notequip[noteqcount].card[1] = + p->inventory[i].card[1]; + mapitem.notequip[noteqcount].card[2] = + p->inventory[i].card[2]; + mapitem.notequip[noteqcount].card[3] = + p->inventory[i].card[3]; + mapitem.notequip[noteqcount].broken = p->inventory[i].broken; + noteqcount++; + } + } + } + //printf("- Save item data to MySQL!\n"); + memitemdata_to_sql (mapitem, eqcount, noteqcount, p->char_id, + TABLE_INVENTORY); //=========================================map cart data > memory ==================================== - eqcount=1; - noteqcount=1; - - //map cart data - for(i=0;i<MAX_CART;i++){ - if(p->cart[i].nameid>0){ - if(itemdb_isequip(p->cart[i].nameid)==1){ - mapitem.equip[eqcount].flag=0; - mapitem.equip[eqcount].id = p->cart[i].id; - mapitem.equip[eqcount].nameid=p->cart[i].nameid; - mapitem.equip[eqcount].amount = p->cart[i].amount; - mapitem.equip[eqcount].equip = p->cart[i].equip; - mapitem.equip[eqcount].identify = p->cart[i].identify; - mapitem.equip[eqcount].refine = p->cart[i].refine; - mapitem.equip[eqcount].attribute = p->cart[i].attribute; - mapitem.equip[eqcount].card[0] = p->cart[i].card[0]; - mapitem.equip[eqcount].card[1] = p->cart[i].card[1]; - mapitem.equip[eqcount].card[2] = p->cart[i].card[2]; - mapitem.equip[eqcount].card[3] = p->cart[i].card[3]; - mapitem.equip[eqcount].broken = p->cart[i].broken; - eqcount++; - } - else if(itemdb_isequip(p->cart[i].nameid)==0){ - mapitem.notequip[noteqcount].flag=0; - mapitem.notequip[noteqcount].id = p->cart[i].id; - mapitem.notequip[noteqcount].nameid=p->cart[i].nameid; - mapitem.notequip[noteqcount].amount = p->cart[i].amount; - mapitem.notequip[noteqcount].equip = p->cart[i].equip; - mapitem.notequip[noteqcount].identify = p->cart[i].identify; - mapitem.notequip[noteqcount].refine = p->cart[i].refine; - mapitem.notequip[noteqcount].attribute = p->cart[i].attribute; - mapitem.notequip[noteqcount].card[0] = p->cart[i].card[0]; - mapitem.notequip[noteqcount].card[1] = p->cart[i].card[1]; - mapitem.notequip[noteqcount].card[2] = p->cart[i].card[2]; - mapitem.notequip[noteqcount].card[3] = p->cart[i].card[3]; - mapitem.notequip[noteqcount].broken = p->cart[i].broken; - noteqcount++; - } - } - } - - //printf("- Save cart data to MySQL!\n"); - memitemdata_to_sql(mapitem, eqcount, noteqcount, p->char_id,TABLE_CART); + eqcount = 1; + noteqcount = 1; + + //map cart data + for (i = 0; i < MAX_CART; i++) + { + if (p->cart[i].nameid > 0) + { + if (itemdb_isequip (p->cart[i].nameid) == 1) + { + mapitem.equip[eqcount].flag = 0; + mapitem.equip[eqcount].id = p->cart[i].id; + mapitem.equip[eqcount].nameid = p->cart[i].nameid; + mapitem.equip[eqcount].amount = p->cart[i].amount; + mapitem.equip[eqcount].equip = p->cart[i].equip; + mapitem.equip[eqcount].identify = p->cart[i].identify; + mapitem.equip[eqcount].refine = p->cart[i].refine; + mapitem.equip[eqcount].attribute = p->cart[i].attribute; + mapitem.equip[eqcount].card[0] = p->cart[i].card[0]; + mapitem.equip[eqcount].card[1] = p->cart[i].card[1]; + mapitem.equip[eqcount].card[2] = p->cart[i].card[2]; + mapitem.equip[eqcount].card[3] = p->cart[i].card[3]; + mapitem.equip[eqcount].broken = p->cart[i].broken; + eqcount++; + } + else if (itemdb_isequip (p->cart[i].nameid) == 0) + { + mapitem.notequip[noteqcount].flag = 0; + mapitem.notequip[noteqcount].id = p->cart[i].id; + mapitem.notequip[noteqcount].nameid = p->cart[i].nameid; + mapitem.notequip[noteqcount].amount = p->cart[i].amount; + mapitem.notequip[noteqcount].equip = p->cart[i].equip; + mapitem.notequip[noteqcount].identify = p->cart[i].identify; + mapitem.notequip[noteqcount].refine = p->cart[i].refine; + mapitem.notequip[noteqcount].attribute = p->cart[i].attribute; + mapitem.notequip[noteqcount].card[0] = p->cart[i].card[0]; + mapitem.notequip[noteqcount].card[1] = p->cart[i].card[1]; + mapitem.notequip[noteqcount].card[2] = p->cart[i].card[2]; + mapitem.notequip[noteqcount].card[3] = p->cart[i].card[3]; + mapitem.notequip[noteqcount].broken = p->cart[i].broken; + noteqcount++; + } + } + } + + //printf("- Save cart data to MySQL!\n"); + memitemdata_to_sql (mapitem, eqcount, noteqcount, p->char_id, TABLE_CART); //===================================================================================================== //}//---------------------------test count------------------------------ - //check party_exist - party_exist=0; - sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `party_id` = '%d'",party_db, p->party_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - sql_row = mysql_fetch_row(sql_res); - if (sql_row) party_exist = atoi(sql_row[0]); - mysql_free_result(sql_res); - - //check guild_exist - guild_exist=0; - sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id` = '%d'",guild_db, p->guild_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - sql_row = mysql_fetch_row(sql_res); - if (sql_row) guild_exist = atoi(sql_row[0]); - mysql_free_result(sql_res); - - if (guild_exist==0) p->guild_id=0; - if (party_exist==0) p->party_id=0; - - //sql query - //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9 - //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15 - //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21 - //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27 - //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35 - //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`) - //printf("- Save char data to MySQL!\n"); - sprintf(tmp_sql ,"UPDATE `%s` SET `class`='%d', `base_level`='%d', `job_level`='%d'," - "`base_exp`='%d', `job_exp`='%d', `zeny`='%d'," - "`max_hp`='%d',`hp`='%d',`max_sp`='%d',`sp`='%d',`status_point`='%d',`skill_point`='%d'," - "`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d'," - "`option`='%d',`karma`='%d',`manner`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d'," - "`hair`='%d',`hair_color`='%d',`clothes_color`='%d',`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d'," - "`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d',`partner_id`='%d' WHERE `account_id`='%d' AND `char_id` = '%d'", - char_db, p->class, p->base_level, p->job_level, - p->base_exp, p->job_exp, p->zeny, - p->max_hp, p->hp, p->max_sp, p->sp, p->status_point, p->skill_point, - p->str, p->agi, p->vit, p->int_, p->dex, p->luk, - p->option, p->karma, p->manner, p->party_id, p->guild_id, p->pet_id, - p->hair, p->hair_color, p->clothes_color, - p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom, - p->last_point.map, p->last_point.x, p->last_point.y, - p->save_point.map, p->save_point.x, p->save_point.y, p->partner_id, p->account_id, p->char_id - ); - - if(mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle)); - } - - //printf("- Save memo data to MySQL!\n"); - //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`) - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",memo_db, p->char_id); - if(mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (delete `memo`)- %s\n", mysql_error(&mysql_handle)); - } - - //insert here. - for(i=0;i<10;i++){ - if(p->memo_point[i].map[0]){ - sprintf(tmp_sql,"INSERT INTO `%s`(`char_id`,`map`,`x`,`y`) VALUES ('%d', '%s', '%d', '%d')", - memo_db, char_id, p->memo_point[i].map, p->memo_point[i].x, p->memo_point[i].y); - if(mysql_query(&mysql_handle, tmp_sql)) - printf("DB server Error (insert `memo`)- %s\n", mysql_error(&mysql_handle)); - } - } - - //printf("- Save skill data to MySQL!\n"); - //`skill` (`char_id`, `id`, `lv`) - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",skill_db, p->char_id); - if(mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (delete `skill`)- %s\n", mysql_error(&mysql_handle)); - } - //printf("- Insert skill \n"); - //insert here. - for(i=0;i<MAX_SKILL;i++){ - if(p->skill[i].id){ - if (p->skill[i].id && p->skill[i].flag!=1) { - sprintf(tmp_sql,"INSERT delayed INTO `%s`(`char_id`, `id`, `lv`) VALUES ('%d', '%d','%d')", - skill_db, char_id, p->skill[i].id, (p->skill[i].flag==0)?p->skill[i].lv:p->skill[i].flag-2); - if(mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (insert `skill`)- %s\n", mysql_error(&mysql_handle)); - } - } - } - } - - - //printf("- Save global_reg_value data to MySQL!\n"); - //`global_reg_value` (`char_id`, `str`, `value`) - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, p->char_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle)); - } - - //insert here. - for(i=0;i<p->global_reg_num;i++){ - if (p->global_reg[i].str) { - if(p->global_reg[i].value !=0){ - sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`, `str`, `value`) VALUES ('%d', '%s','%d')", - reg_db, char_id, jstrescapecpy(temp_str,(unsigned char*)p->global_reg[i].str), p->global_reg[i].value); - if(mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (insert `global_reg_value`)- %s\n", mysql_error(&mysql_handle)); - } - } - } - } - printf("saving char is done.\n"); - save_flag = 0; - - return 0; + //check party_exist + party_exist = 0; + sprintf (tmp_sql, "SELECT count(*) FROM `%s` WHERE `party_id` = '%d'", + party_db, p->party_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + sql_row = mysql_fetch_row (sql_res); + if (sql_row) + party_exist = atoi (sql_row[0]); + mysql_free_result (sql_res); + + //check guild_exist + guild_exist = 0; + sprintf (tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id` = '%d'", + guild_db, p->guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + sql_row = mysql_fetch_row (sql_res); + if (sql_row) + guild_exist = atoi (sql_row[0]); + mysql_free_result (sql_res); + + if (guild_exist == 0) + p->guild_id = 0; + if (party_exist == 0) + p->party_id = 0; + + //sql query + //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9 + //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15 + //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21 + //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27 + //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35 + //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`) + //printf("- Save char data to MySQL!\n"); + sprintf (tmp_sql, + "UPDATE `%s` SET `class`='%d', `base_level`='%d', `job_level`='%d'," + "`base_exp`='%d', `job_exp`='%d', `zeny`='%d'," + "`max_hp`='%d',`hp`='%d',`max_sp`='%d',`sp`='%d',`status_point`='%d',`skill_point`='%d'," + "`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d'," + "`option`='%d',`karma`='%d',`manner`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d'," + "`hair`='%d',`hair_color`='%d',`clothes_color`='%d',`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d'," + "`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d',`partner_id`='%d' WHERE `account_id`='%d' AND `char_id` = '%d'", + char_db, p->class, p->base_level, p->job_level, p->base_exp, + p->job_exp, p->zeny, p->max_hp, p->hp, p->max_sp, p->sp, + p->status_point, p->skill_point, p->str, p->agi, p->vit, p->int_, + p->dex, p->luk, p->option, p->karma, p->manner, p->party_id, + p->guild_id, p->pet_id, p->hair, p->hair_color, p->clothes_color, + p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom, + p->last_point.map, p->last_point.x, p->last_point.y, + p->save_point.map, p->save_point.x, p->save_point.y, + p->partner_id, p->account_id, p->char_id); + + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (update `char`)- %s\n", + mysql_error (&mysql_handle)); + } + + //printf("- Save memo data to MySQL!\n"); + //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`) + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'", memo_db, + p->char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `memo`)- %s\n", + mysql_error (&mysql_handle)); + } + + //insert here. + for (i = 0; i < 10; i++) + { + if (p->memo_point[i].map[0]) + { + sprintf (tmp_sql, + "INSERT INTO `%s`(`char_id`,`map`,`x`,`y`) VALUES ('%d', '%s', '%d', '%d')", + memo_db, char_id, p->memo_point[i].map, + p->memo_point[i].x, p->memo_point[i].y); + if (mysql_query (&mysql_handle, tmp_sql)) + printf ("DB server Error (insert `memo`)- %s\n", + mysql_error (&mysql_handle)); + } + } + + //printf("- Save skill data to MySQL!\n"); + //`skill` (`char_id`, `id`, `lv`) + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'", skill_db, + p->char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `skill`)- %s\n", + mysql_error (&mysql_handle)); + } + //printf("- Insert skill \n"); + //insert here. + for (i = 0; i < MAX_SKILL; i++) + { + if (p->skill[i].id) + { + if (p->skill[i].id && p->skill[i].flag != 1) + { + sprintf (tmp_sql, + "INSERT delayed INTO `%s`(`char_id`, `id`, `lv`) VALUES ('%d', '%d','%d')", + skill_db, char_id, p->skill[i].id, + (p->skill[i].flag == + 0) ? p->skill[i].lv : p->skill[i].flag - 2); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `skill`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + } + + //printf("- Save global_reg_value data to MySQL!\n"); + //`global_reg_value` (`char_id`, `str`, `value`) + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `type`=3 AND `char_id`='%d'", + reg_db, p->char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `global_reg_value`)- %s\n", + mysql_error (&mysql_handle)); + } + + //insert here. + for (i = 0; i < p->global_reg_num; i++) + { + if (p->global_reg[i].str) + { + if (p->global_reg[i].value != 0) + { + sprintf (tmp_sql, + "INSERT INTO `%s` (`char_id`, `str`, `value`) VALUES ('%d', '%s','%d')", + reg_db, char_id, jstrescapecpy (temp_str, + (unsigned char *) + p->global_reg[i]. + str), + p->global_reg[i].value); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf + ("DB server Error (insert `global_reg_value`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + } + printf ("saving char is done.\n"); + save_flag = 0; + + return 0; } -int memitemdata_to_sql(struct itemtemp mapitem, int eqcount, int noteqcount, int char_id, int tableswitch){ - //equ - int i, j; - int dbeqcount = 1; - int dbnoteqcount = 1; - struct itemtemp dbitem; - char tablename[16]; - char selectoption[16]; - - switch (tableswitch){ - case TABLE_INVENTORY: - sprintf(tablename,"%s",inventory_db); - sprintf(selectoption,"char_id"); - break; - case TABLE_CART: - sprintf(tablename,"%s",cart_db); - sprintf(selectoption,"char_id"); - break; - case TABLE_STORAGE: - sprintf(tablename,"%s",storage_db); - sprintf(selectoption,"account_id"); - break; - case TABLE_GUILD_STORAGE: - sprintf(tablename,"%s",guild_storage_db); - sprintf(selectoption,"guild_id"); - break; - } - //printf("Working Table : %s \n",tablename); - - //=======================================mysql database data > memory=============================================== - - sprintf(tmp_sql, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` , `broken` " - "FROM `%s` WHERE `%s`='%d'",tablename ,selectoption ,char_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (select `%s` to Memory)- %s\n",tablename ,mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - if (sql_res) { - for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){ - if (itemdb_isequip(atoi(sql_row[1]))==1){ - dbitem.equip[dbeqcount].flag=0; - dbitem.equip[dbeqcount].id = atoi(sql_row[0]); - dbitem.equip[dbeqcount].nameid = atoi(sql_row[1]); - dbitem.equip[dbeqcount].amount = atoi(sql_row[2]); - dbitem.equip[dbeqcount].equip = atoi(sql_row[3]); - dbitem.equip[dbeqcount].identify = atoi(sql_row[4]); - dbitem.equip[dbeqcount].refine = atoi(sql_row[5]); - dbitem.equip[dbeqcount].attribute = atoi(sql_row[6]); - dbitem.equip[dbeqcount].card[0] = atoi(sql_row[7]); - dbitem.equip[dbeqcount].card[1] = atoi(sql_row[8]); - dbitem.equip[dbeqcount].card[2] = atoi(sql_row[9]); - dbitem.equip[dbeqcount].card[3] = atoi(sql_row[10]); - dbitem.equip[dbeqcount].broken = atoi(sql_row[11]); - dbeqcount++; - }else { - dbitem.notequip[dbnoteqcount].flag=0; - dbitem.notequip[dbnoteqcount].id = atoi(sql_row[0]); - dbitem.notequip[dbnoteqcount].nameid = atoi(sql_row[1]); - dbitem.notequip[dbnoteqcount].amount = atoi(sql_row[2]); - dbitem.notequip[dbnoteqcount].equip = atoi(sql_row[3]); - dbitem.notequip[dbnoteqcount].identify = atoi(sql_row[4]); - dbitem.notequip[dbnoteqcount].refine = atoi(sql_row[5]); - dbitem.notequip[dbnoteqcount].attribute = atoi(sql_row[6]); - dbitem.notequip[dbnoteqcount].card[0] = atoi(sql_row[7]); - dbitem.notequip[dbnoteqcount].card[1] = atoi(sql_row[8]); - dbitem.notequip[dbnoteqcount].card[2] = atoi(sql_row[9]); - dbitem.notequip[dbnoteqcount].card[3] = atoi(sql_row[10]); - dbitem.notequip[dbnoteqcount].broken = atoi(sql_row[11]); - dbnoteqcount++; - } - } - mysql_free_result(sql_res); - } - - //==============================================Memory data > SQL =============================== - //======================================Equip ITEM======================================= - if((eqcount==1) && (dbeqcount==1)){//printf("%s Equip Empty\n",tablename); - //item empty - } else { - - for(i=1;i<eqcount;i++){ - for(j=1;j<dbeqcount;j++){ - if(mapitem.equip[i].flag==1) break; - if(!(dbitem.equip[j].flag==1)){ - if(mapitem.equip[i].nameid==dbitem.equip[j].nameid){ - if ((mapitem.equip[i].equip==dbitem.equip[j].equip) && (mapitem.equip[i].identify==dbitem.equip[j].identify) && (mapitem.equip[i].amount==dbitem.equip[j].amount) && - - (mapitem.equip[i].refine==dbitem.equip[j].refine) && (mapitem.equip[i].attribute==dbitem.equip[j].attribute) && (mapitem.equip[i].card[0]==dbitem.equip[j].card[0]) && - (mapitem.equip[i].card[1]==dbitem.equip[j].card[1]) && (mapitem.equip[i].card[2]==dbitem.equip[j].card[2]) && (mapitem.equip[i].card[3]==dbitem.equip[j].card[3]) && - (mapitem.equip[i].broken == dbitem.equip[j].broken)) { - mapitem.equip[i].flag = 1; - dbitem.equip[j].flag = 1; - //printf("the same item : %d , equip : %d , i : %d , flag : %d\n", mapitem.equip[i].nameid,mapitem.equip[i].equip , i, mapitem.equip[i].flag); //DEBUG-STRING - } else { - sprintf(tmp_sql,"UPDATE `%s` SET `equip`='%d', `identify`='%d', `refine`='%d'," - "`attribute`='%d', `card0`='%d', `card1`='%d', `card2`='%d', `card3`='%d', `broken`='%d', `amount`='%d' WHERE `id`='%d' LIMIT 1", - tablename, mapitem.equip[i].equip, mapitem.equip[i].identify, mapitem.equip[i].refine,mapitem.equip[i].attribute, mapitem.equip[i].card[0], - mapitem.equip[i].card[1], mapitem.equip[i].card[2], mapitem.equip[i].card[3], mapitem.equip[i].broken, mapitem.equip[i].amount, dbitem.equip[j].id); - //printf("%s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql)) - printf("DB server Error (UPdate `equ %s`)- %s\n", tablename, mysql_error(&mysql_handle)); - mapitem.equip[i].flag=1; - dbitem.equip[j].flag=1; - //printf("not the same item : %d ; i : %d ; flag : %d\n", mapitem.equip[i].nameid, i, mapitem.equip[i].flag); - } - } - } - } - } - - //printf("dbeqcount = %d\n",dbeqcount); - - for(i=1;i<dbeqcount;i++){ - //printf("dbitem.equip[i].flag = %d , dbitem.equip[i].id = %d\n",dbitem.equip[i].flag,dbitem.equip[i].id); - if (!(dbitem.equip[i].flag == 1)) { - sprintf(tmp_sql,"DELETE from `%s` where `id`='%d'",tablename , dbitem.equip[i].id); - //printf("%s", tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql)) - printf("DB server Error (DELETE `equ %s`)- %s\n", tablename ,mysql_error(&mysql_handle)); - } - } - for(i=1;i<eqcount;i++){ - if(!(mapitem.equip[i].flag==1)){ - sprintf(tmp_sql,"INSERT INTO `%s`(`%s`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)" - " VALUES ( '%d','%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", - tablename, selectoption, char_id, mapitem.equip[i].nameid, mapitem.equip[i].amount, mapitem.equip[i].equip, mapitem.equip[i].identify, mapitem.equip[i].refine, - mapitem.equip[i].attribute, mapitem.equip[i].card[0], mapitem.equip[i].card[1], mapitem.equip[i].card[2], mapitem.equip[i].card[3], mapitem.equip[i].broken); - //printf("%s", tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql)) - printf("DB server Error (INSERT `equ %s`)- %s\n",tablename ,mysql_error(&mysql_handle)); - } - } - - //======================================DEBUG================================================= - -// gettimeofday(&tv,NULL); -// strftime(tmpstr,24,"%Y-%m-%d %H:%M:%S",localtime(&(tv.tv_sec))); -// printf("\n\n"); -// printf("Working Table Name : EQU %s, Count : map %3d | db %3d \n",tablename ,eqcount ,dbeqcount); -// printf("*********************************************************************************\n"); -// printf("======================================MAP===================Char ID %10d===\n",char_id); -// printf("==flag ===name ===equip===ident===amoun===attri===card0===card1===card2===card3==\n"); -// for(j=1;j<eqcount;j++) -// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", mapitem.equip[j].flag,mapitem.equip[j].nameid, mapitem.equip[j].equip, mapitem.equip[j].identify, mapitem.equip[j].refine,mapitem.equip[j].attribute, mapitem.equip[j].card[0], mapitem.equip[j].card[1], mapitem.equip[j].card[2], mapitem.equip[j].card[3]); -// printf("======================================DB=========================================\n"); -// printf("==flag ===name ===equip===ident===refin===attri===card0===card1===card2===card3==\n"); -// for(j=1;j<dbeqcount;j++) -// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", dbitem.equip[j].flag ,dbitem.equip[j].nameid, dbitem.equip[j].equip, dbitem.equip[j].identify, dbitem.equip[j].amount,dbitem.equip[j].attribute, dbitem.equip[j].card[0], dbitem.equip[j].card[1], dbitem.equip[j].card[2], dbitem.equip[j].card[3]); -// printf("=================================================================================\n"); -// printf("=================================================Data Time %s===\n", tmpstr); -// printf("=================================================================================\n"); - - } - - //======================================DEBUG================================================== - - //=============================Not Equip ITEM========================================== - if((noteqcount==1) && (dbnoteqcount==1)){ - //printf("%s Not Equip Empty\n",tablename); - //item empty - } else { - - for(i=1;i<noteqcount;i++){ - for(j=1;j<dbnoteqcount;j++){ - if(mapitem.notequip[i].flag==1) break; - if(!(dbitem.notequip[j].flag==1)){ - if(mapitem.notequip[i].nameid==dbitem.notequip[j].nameid){ - if ((mapitem.notequip[i].amount==dbitem.notequip[j].amount) && (mapitem.notequip[i].equip==dbitem.notequip[j].equip) && (mapitem.notequip[i].identify==dbitem.notequip[j].identify) - && (mapitem.notequip[i].attribute==dbitem.notequip[j].attribute)) - { mapitem.notequip[i].flag=1; - dbitem.notequip[j].flag=1; - //printf("the same item : %d ; i : %d ; flag : %d\n", mapitem.notequip[i].nameid, i, mapitem.notequip[i].flag); //DEBUG-STRING - } - else{ - sprintf(tmp_sql,"UPDATE `%s` SET `amount`='%d', `equip`='%d', `identify`='%d'," - "`attribute`='%d' WHERE `%s`='%d' AND `nameid`='%d'", - tablename, mapitem.notequip[i].amount, mapitem.notequip[i].equip, mapitem.notequip[i].identify, mapitem.notequip[i].attribute, - selectoption, char_id, mapitem.notequip[i].nameid); - //printf("%s",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql)) - printf("DB server Error (UPdate `notequ %s`)- %s\n",tablename ,mysql_error(&mysql_handle)); - - mapitem.notequip[i].flag=1; - dbitem.notequip[j].flag=1; - } - } - } - } - } - - //printf("dbnoteqcount = %d\n",dbnoteqcount); - - for(i=1;i<dbnoteqcount;i++){ - //printf("dbitem.notequip[i].flag = %d , dbitem.notequip[i].id = %d\n",dbitem.notequip[i].flag,dbitem.notequip[i].id); - if(!(dbitem.notequip[i].flag==1)){ - sprintf(tmp_sql,"DELETE from `%s` where `id`='%d'", tablename, dbitem.notequip[i].id); - //printf("%s", tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql)) - printf("DB server Error (DELETE `notequ %s`)- %s\n", tablename ,mysql_error(&mysql_handle)); - } - } - for(i=1;i<noteqcount;i++){ - if(!(mapitem.notequip[i].flag==1)){ - sprintf(tmp_sql,"INSERT INTO `%s`( `%s`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)" - " VALUES ('%d','%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", - tablename ,selectoption , char_id, mapitem.notequip[i].nameid, mapitem.notequip[i].amount, mapitem.notequip[i].equip, mapitem.notequip[i].identify, mapitem.notequip[i].refine, - mapitem.notequip[i].attribute, mapitem.notequip[i].card[0], mapitem.notequip[i].card[1], mapitem.notequip[i].card[2], mapitem.notequip[i].card[3], mapitem.equip[i].broken); - //printf("%s", tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql)) - printf("DB server Error (INSERT `notequ %s`)- %s\n", tablename, mysql_error(&mysql_handle)); - } - } - - //======================================DEBUG================================================= - -// gettimeofday(&tv,NULL); -// strftime(tmpstr,24,"%Y-%m-%d %H:%M:%S",localtime(&(tv.tv_sec))); -// printf("\n\n"); -// printf("Working Table Name : Not EQU %s, Count : map %3d | db %3d \n",tablename ,noteqcount ,dbnoteqcount); -// printf("*********************************************************************************\n"); -// printf("======================================MAP===================Char ID %10d===\n",char_id); -// printf("==flag ===name ===equip===ident===refin===attri===card0===card1===card2===card3==\n"); -// for(j=1;j<noteqcount;j++) -// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", mapitem.notequip[j].flag,mapitem.notequip[j].nameid, mapitem.notequip[j].equip, mapitem.notequip[j].identify, mapitem.notequip[j].refine,mapitem.notequip[j].attribute, mapitem.notequip[j].card[0], mapitem.notequip[j].card[1], mapitem.notequip[j].card[2], mapitem.notequip[j].card[3]); -// printf("======================================DB=========================================\n"); -// printf("==flag ===name ===equip===ident===refin===attri===card0===card1===card2===card3==\n"); -// for(j=1;j<dbnoteqcount;j++) -// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", dbitem.notequip[j].flag ,dbitem.notequip[j].nameid, dbitem.notequip[j].equip, dbitem.notequip[j].identify, dbitem.notequip[j].refine,dbitem.notequip[j].attribute, dbitem.notequip[j].card[0], dbitem.notequip[j].card[1], dbitem.notequip[j].card[2], dbitem.notequip[j].card[3]); -// printf("=================================================================================\n"); -// printf("=================================================Data Time %s===\n", tmpstr); -// printf("=================================================================================\n"); +int memitemdata_to_sql (struct itemtemp mapitem, int eqcount, int noteqcount, + int char_id, int tableswitch) +{ + //equ + int i, j; + int dbeqcount = 1; + int dbnoteqcount = 1; + struct itemtemp dbitem; + char tablename[16]; + char selectoption[16]; + + switch (tableswitch) + { + case TABLE_INVENTORY: + sprintf (tablename, "%s", inventory_db); + sprintf (selectoption, "char_id"); + break; + case TABLE_CART: + sprintf (tablename, "%s", cart_db); + sprintf (selectoption, "char_id"); + break; + case TABLE_STORAGE: + sprintf (tablename, "%s", storage_db); + sprintf (selectoption, "account_id"); + break; + case TABLE_GUILD_STORAGE: + sprintf (tablename, "%s", guild_storage_db); + sprintf (selectoption, "guild_id"); + break; + } + //printf("Working Table : %s \n",tablename); + + //=======================================mysql database data > memory=============================================== + + sprintf (tmp_sql, + "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3` , `broken` " + "FROM `%s` WHERE `%s`='%d'", tablename, selectoption, char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `%s` to Memory)- %s\n", tablename, + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + for (i = 0; (sql_row = mysql_fetch_row (sql_res)); i++) + { + if (itemdb_isequip (atoi (sql_row[1])) == 1) + { + dbitem.equip[dbeqcount].flag = 0; + dbitem.equip[dbeqcount].id = atoi (sql_row[0]); + dbitem.equip[dbeqcount].nameid = atoi (sql_row[1]); + dbitem.equip[dbeqcount].amount = atoi (sql_row[2]); + dbitem.equip[dbeqcount].equip = atoi (sql_row[3]); + dbitem.equip[dbeqcount].identify = atoi (sql_row[4]); + dbitem.equip[dbeqcount].refine = atoi (sql_row[5]); + dbitem.equip[dbeqcount].attribute = atoi (sql_row[6]); + dbitem.equip[dbeqcount].card[0] = atoi (sql_row[7]); + dbitem.equip[dbeqcount].card[1] = atoi (sql_row[8]); + dbitem.equip[dbeqcount].card[2] = atoi (sql_row[9]); + dbitem.equip[dbeqcount].card[3] = atoi (sql_row[10]); + dbitem.equip[dbeqcount].broken = atoi (sql_row[11]); + dbeqcount++; + } + else + { + dbitem.notequip[dbnoteqcount].flag = 0; + dbitem.notequip[dbnoteqcount].id = atoi (sql_row[0]); + dbitem.notequip[dbnoteqcount].nameid = atoi (sql_row[1]); + dbitem.notequip[dbnoteqcount].amount = atoi (sql_row[2]); + dbitem.notequip[dbnoteqcount].equip = atoi (sql_row[3]); + dbitem.notequip[dbnoteqcount].identify = atoi (sql_row[4]); + dbitem.notequip[dbnoteqcount].refine = atoi (sql_row[5]); + dbitem.notequip[dbnoteqcount].attribute = atoi (sql_row[6]); + dbitem.notequip[dbnoteqcount].card[0] = atoi (sql_row[7]); + dbitem.notequip[dbnoteqcount].card[1] = atoi (sql_row[8]); + dbitem.notequip[dbnoteqcount].card[2] = atoi (sql_row[9]); + dbitem.notequip[dbnoteqcount].card[3] = atoi (sql_row[10]); + dbitem.notequip[dbnoteqcount].broken = atoi (sql_row[11]); + dbnoteqcount++; + } + } + mysql_free_result (sql_res); + } + + //==============================================Memory data > SQL =============================== + //======================================Equip ITEM======================================= + if ((eqcount == 1) && (dbeqcount == 1)) + { //printf("%s Equip Empty\n",tablename); + //item empty + } + else + { + + for (i = 1; i < eqcount; i++) + { + for (j = 1; j < dbeqcount; j++) + { + if (mapitem.equip[i].flag == 1) + break; + if (!(dbitem.equip[j].flag == 1)) + { + if (mapitem.equip[i].nameid == dbitem.equip[j].nameid) + { + if ((mapitem.equip[i].equip == dbitem.equip[j].equip) + && (mapitem.equip[i].identify == + dbitem.equip[j].identify) + && (mapitem.equip[i].amount == + dbitem.equip[j].amount) + && (mapitem.equip[i].refine == + dbitem.equip[j].refine) + && (mapitem.equip[i].attribute == + dbitem.equip[j].attribute) + && (mapitem.equip[i].card[0] == + dbitem.equip[j].card[0]) + && (mapitem.equip[i].card[1] == + dbitem.equip[j].card[1]) + && (mapitem.equip[i].card[2] == + dbitem.equip[j].card[2]) + && (mapitem.equip[i].card[3] == + dbitem.equip[j].card[3]) + && (mapitem.equip[i].broken == + dbitem.equip[j].broken)) + { + mapitem.equip[i].flag = 1; + dbitem.equip[j].flag = 1; + //printf("the same item : %d , equip : %d , i : %d , flag : %d\n", mapitem.equip[i].nameid,mapitem.equip[i].equip , i, mapitem.equip[i].flag); //DEBUG-STRING + } + else + { + sprintf (tmp_sql, + "UPDATE `%s` SET `equip`='%d', `identify`='%d', `refine`='%d'," + "`attribute`='%d', `card0`='%d', `card1`='%d', `card2`='%d', `card3`='%d', `broken`='%d', `amount`='%d' WHERE `id`='%d' LIMIT 1", + tablename, mapitem.equip[i].equip, + mapitem.equip[i].identify, + mapitem.equip[i].refine, + mapitem.equip[i].attribute, + mapitem.equip[i].card[0], + mapitem.equip[i].card[1], + mapitem.equip[i].card[2], + mapitem.equip[i].card[3], + mapitem.equip[i].broken, + mapitem.equip[i].amount, + dbitem.equip[j].id); + //printf("%s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + printf + ("DB server Error (UPdate `equ %s`)- %s\n", + tablename, mysql_error (&mysql_handle)); + mapitem.equip[i].flag = 1; + dbitem.equip[j].flag = 1; + //printf("not the same item : %d ; i : %d ; flag : %d\n", mapitem.equip[i].nameid, i, mapitem.equip[i].flag); + } + } + } + } + } + + //printf("dbeqcount = %d\n",dbeqcount); + + for (i = 1; i < dbeqcount; i++) + { + //printf("dbitem.equip[i].flag = %d , dbitem.equip[i].id = %d\n",dbitem.equip[i].flag,dbitem.equip[i].id); + if (!(dbitem.equip[i].flag == 1)) + { + sprintf (tmp_sql, "DELETE from `%s` where `id`='%d'", + tablename, dbitem.equip[i].id); + //printf("%s", tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + printf ("DB server Error (DELETE `equ %s`)- %s\n", + tablename, mysql_error (&mysql_handle)); + } + } + for (i = 1; i < eqcount; i++) + { + if (!(mapitem.equip[i].flag == 1)) + { + sprintf (tmp_sql, + "INSERT INTO `%s`(`%s`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)" + " VALUES ( '%d','%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", + tablename, selectoption, char_id, + mapitem.equip[i].nameid, mapitem.equip[i].amount, + mapitem.equip[i].equip, mapitem.equip[i].identify, + mapitem.equip[i].refine, mapitem.equip[i].attribute, + mapitem.equip[i].card[0], mapitem.equip[i].card[1], + mapitem.equip[i].card[2], mapitem.equip[i].card[3], + mapitem.equip[i].broken); + //printf("%s", tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + printf ("DB server Error (INSERT `equ %s`)- %s\n", + tablename, mysql_error (&mysql_handle)); + } + } + + //======================================DEBUG================================================= + +// gettimeofday(&tv,NULL); +// strftime(tmpstr,24,"%Y-%m-%d %H:%M:%S",localtime(&(tv.tv_sec))); +// printf("\n\n"); +// printf("Working Table Name : EQU %s, Count : map %3d | db %3d \n",tablename ,eqcount ,dbeqcount); +// printf("*********************************************************************************\n"); +// printf("======================================MAP===================Char ID %10d===\n",char_id); +// printf("==flag ===name ===equip===ident===amoun===attri===card0===card1===card2===card3==\n"); +// for(j=1;j<eqcount;j++) +// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", mapitem.equip[j].flag,mapitem.equip[j].nameid, mapitem.equip[j].equip, mapitem.equip[j].identify, mapitem.equip[j].refine,mapitem.equip[j].attribute, mapitem.equip[j].card[0], mapitem.equip[j].card[1], mapitem.equip[j].card[2], mapitem.equip[j].card[3]); +// printf("======================================DB=========================================\n"); +// printf("==flag ===name ===equip===ident===refin===attri===card0===card1===card2===card3==\n"); +// for(j=1;j<dbeqcount;j++) +// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", dbitem.equip[j].flag ,dbitem.equip[j].nameid, dbitem.equip[j].equip, dbitem.equip[j].identify, dbitem.equip[j].amount,dbitem.equip[j].attribute, dbitem.equip[j].card[0], dbitem.equip[j].card[1], dbitem.equip[j].card[2], dbitem.equip[j].card[3]); +// printf("=================================================================================\n"); +// printf("=================================================Data Time %s===\n", tmpstr); +// printf("=================================================================================\n"); + + } + + //======================================DEBUG================================================== + + //=============================Not Equip ITEM========================================== + if ((noteqcount == 1) && (dbnoteqcount == 1)) + { + //printf("%s Not Equip Empty\n",tablename); + //item empty + } + else + { + + for (i = 1; i < noteqcount; i++) + { + for (j = 1; j < dbnoteqcount; j++) + { + if (mapitem.notequip[i].flag == 1) + break; + if (!(dbitem.notequip[j].flag == 1)) + { + if (mapitem.notequip[i].nameid == + dbitem.notequip[j].nameid) + { + if ((mapitem.notequip[i].amount == + dbitem.notequip[j].amount) + && (mapitem.notequip[i].equip == + dbitem.notequip[j].equip) + && (mapitem.notequip[i].identify == + dbitem.notequip[j].identify) + && (mapitem.notequip[i].attribute == + dbitem.notequip[j].attribute)) + { + mapitem.notequip[i].flag = 1; + dbitem.notequip[j].flag = 1; + //printf("the same item : %d ; i : %d ; flag : %d\n", mapitem.notequip[i].nameid, i, mapitem.notequip[i].flag); //DEBUG-STRING + } + else + { + sprintf (tmp_sql, + "UPDATE `%s` SET `amount`='%d', `equip`='%d', `identify`='%d'," + "`attribute`='%d' WHERE `%s`='%d' AND `nameid`='%d'", + tablename, mapitem.notequip[i].amount, + mapitem.notequip[i].equip, + mapitem.notequip[i].identify, + mapitem.notequip[i].attribute, + selectoption, char_id, + mapitem.notequip[i].nameid); + //printf("%s",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + printf + ("DB server Error (UPdate `notequ %s`)- %s\n", + tablename, mysql_error (&mysql_handle)); + + mapitem.notequip[i].flag = 1; + dbitem.notequip[j].flag = 1; + } + } + } + } + } + + //printf("dbnoteqcount = %d\n",dbnoteqcount); + + for (i = 1; i < dbnoteqcount; i++) + { + //printf("dbitem.notequip[i].flag = %d , dbitem.notequip[i].id = %d\n",dbitem.notequip[i].flag,dbitem.notequip[i].id); + if (!(dbitem.notequip[i].flag == 1)) + { + sprintf (tmp_sql, "DELETE from `%s` where `id`='%d'", + tablename, dbitem.notequip[i].id); + //printf("%s", tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + printf ("DB server Error (DELETE `notequ %s`)- %s\n", + tablename, mysql_error (&mysql_handle)); + } + } + for (i = 1; i < noteqcount; i++) + { + if (!(mapitem.notequip[i].flag == 1)) + { + sprintf (tmp_sql, + "INSERT INTO `%s`( `%s`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)" + " VALUES ('%d','%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", + tablename, selectoption, char_id, + mapitem.notequip[i].nameid, + mapitem.notequip[i].amount, + mapitem.notequip[i].equip, + mapitem.notequip[i].identify, + mapitem.notequip[i].refine, + mapitem.notequip[i].attribute, + mapitem.notequip[i].card[0], + mapitem.notequip[i].card[1], + mapitem.notequip[i].card[2], + mapitem.notequip[i].card[3], + mapitem.equip[i].broken); + //printf("%s", tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + printf ("DB server Error (INSERT `notequ %s`)- %s\n", + tablename, mysql_error (&mysql_handle)); + } + } + + //======================================DEBUG================================================= + +// gettimeofday(&tv,NULL); +// strftime(tmpstr,24,"%Y-%m-%d %H:%M:%S",localtime(&(tv.tv_sec))); +// printf("\n\n"); +// printf("Working Table Name : Not EQU %s, Count : map %3d | db %3d \n",tablename ,noteqcount ,dbnoteqcount); +// printf("*********************************************************************************\n"); +// printf("======================================MAP===================Char ID %10d===\n",char_id); +// printf("==flag ===name ===equip===ident===refin===attri===card0===card1===card2===card3==\n"); +// for(j=1;j<noteqcount;j++) +// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", mapitem.notequip[j].flag,mapitem.notequip[j].nameid, mapitem.notequip[j].equip, mapitem.notequip[j].identify, mapitem.notequip[j].refine,mapitem.notequip[j].attribute, mapitem.notequip[j].card[0], mapitem.notequip[j].card[1], mapitem.notequip[j].card[2], mapitem.notequip[j].card[3]); +// printf("======================================DB=========================================\n"); +// printf("==flag ===name ===equip===ident===refin===attri===card0===card1===card2===card3==\n"); +// for(j=1;j<dbnoteqcount;j++) +// printf("| %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d | %5d |\n", dbitem.notequip[j].flag ,dbitem.notequip[j].nameid, dbitem.notequip[j].equip, dbitem.notequip[j].identify, dbitem.notequip[j].refine,dbitem.notequip[j].attribute, dbitem.notequip[j].card[0], dbitem.notequip[j].card[1], dbitem.notequip[j].card[2], dbitem.notequip[j].card[3]); +// printf("=================================================================================\n"); +// printf("=================================================Data Time %s===\n", tmpstr); +// printf("=================================================================================\n"); // - } - return 0; + } + return 0; } -//===================================================================================================== -int mmo_char_fromsql(int char_id, struct mmo_charstatus *p, int online){ - int i, n; - - memset(p, 0, sizeof(struct mmo_charstatus)); - - p->char_id = char_id; - printf("Loaded: "); - //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9 - //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15 - //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21 - //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27 - //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35 - //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`) - //splite 2 parts. cause veeeery long SQL syntax - - sprintf(tmp_sql, "SELECT `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`," - "`str`,`agi`,`vit`,`int`,`dex`,`luk`, `max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point` FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); - - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle)); - } - - sql_res = mysql_store_result(&mysql_handle); - - if (sql_res) { - sql_row = mysql_fetch_row(sql_res); - - p->char_id = char_id; - p->account_id = atoi(sql_row[1]); - p->char_num = atoi(sql_row[2]); - strcpy(p->name, sql_row[3]); - p->class = atoi(sql_row[4]); - p->base_level = atoi(sql_row[5]); - p->job_level = atoi(sql_row[6]); - p->base_exp = atoi(sql_row[7]); - p->job_exp = atoi(sql_row[8]); - p->zeny = atoi(sql_row[9]); - p->str = atoi(sql_row[10]); - p->agi = atoi(sql_row[11]); - p->vit = atoi(sql_row[12]); - p->int_ = atoi(sql_row[13]); - p->dex = atoi(sql_row[14]); - p->luk = atoi(sql_row[15]); - p->max_hp = atoi(sql_row[16]); - p->hp = atoi(sql_row[17]); - p->max_sp = atoi(sql_row[18]); - p->sp = atoi(sql_row[19]); - p->status_point = atoi(sql_row[20]); - p->skill_point = atoi(sql_row[21]); - //free mysql result. - mysql_free_result(sql_res); - } else - printf("char1 - failed\n"); //Error?! ERRRRRR WHAT THAT SAY!? - printf("(\033[1;32m%d\033[0m)\033[1;32m%s\033[0m\t[",p->char_id,p->name); - printf("char1 "); - - sprintf(tmp_sql, "SELECT `option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`hair`,`hair_color`," - "`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`," - "`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`, `partner_id` FROM `%s` WHERE `char_id` = '%d'",char_db, char_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (select `char2`)- %s\n", mysql_error(&mysql_handle)); - } - - sql_res = mysql_store_result(&mysql_handle); - if (sql_res) { - sql_row = mysql_fetch_row(sql_res); - - - p->option = atoi(sql_row[0]); p->karma = atoi(sql_row[1]); p->manner = atoi(sql_row[2]); - p->party_id = atoi(sql_row[3]); p->guild_id = atoi(sql_row[4]); p->pet_id = atoi(sql_row[5]); - - p->hair = atoi(sql_row[6]); p->hair_color = atoi(sql_row[7]); p->clothes_color = atoi(sql_row[8]); - p->weapon = atoi(sql_row[9]); p->shield = atoi(sql_row[10]); - p->head_top = atoi(sql_row[11]); p->head_mid = atoi(sql_row[12]); p->head_bottom = atoi(sql_row[13]); - strcpy(p->last_point.map,sql_row[14]); p->last_point.x = atoi(sql_row[15]); p->last_point.y = atoi(sql_row[16]); - strcpy(p->save_point.map,sql_row[17]); p->save_point.x = atoi(sql_row[18]); p->save_point.y = atoi(sql_row[19]); - p->partner_id = atoi(sql_row[20]); - - //free mysql result. - mysql_free_result(sql_res); - } else - printf("char2 - failed\n"); //Error?! ERRRRRR WHAT THAT SAY!? - - printf("char2 "); - //read memo data - //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`) - sprintf(tmp_sql, "SELECT `map`,`x`,`y` FROM `%s` WHERE `char_id`='%d'",memo_db, char_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (select `memo`)- %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - - if (sql_res) { - for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){ - strcpy (p->memo_point[i].map,sql_row[0]); - p->memo_point[i].x=atoi(sql_row[1]); - p->memo_point[i].y=atoi(sql_row[2]); - //i ++; - } - mysql_free_result(sql_res); - } - printf("memo "); - - //read inventory - //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`) - sprintf(tmp_sql, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken` " - "FROM `%s` WHERE `char_id`='%d'",inventory_db, char_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (select `inventory`)- %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - if (sql_res) { - for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){ - p->inventory[i].id = atoi(sql_row[0]); - p->inventory[i].nameid = atoi(sql_row[1]); - p->inventory[i].amount = atoi(sql_row[2]); - p->inventory[i].equip = atoi(sql_row[3]); - p->inventory[i].identify = atoi(sql_row[4]); - p->inventory[i].refine = atoi(sql_row[5]); - p->inventory[i].attribute = atoi(sql_row[6]); - p->inventory[i].card[0] = atoi(sql_row[7]); - p->inventory[i].card[1] = atoi(sql_row[8]); - p->inventory[i].card[2] = atoi(sql_row[9]); - p->inventory[i].card[3] = atoi(sql_row[10]); - p->inventory[i].broken = atoi(sql_row[11]); - } - mysql_free_result(sql_res); - } - printf("inventory "); - - - //read cart. - //`cart_inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`) - sprintf(tmp_sql, "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken` " - "FROM `%s` WHERE `char_id`='%d'",cart_db, char_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (select `cart_inventory`)- %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - if (sql_res) { - for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){ - p->cart[i].id = atoi(sql_row[0]); - p->cart[i].nameid = atoi(sql_row[1]); - p->cart[i].amount = atoi(sql_row[2]); - p->cart[i].equip = atoi(sql_row[3]); - p->cart[i].identify = atoi(sql_row[4]); - p->cart[i].refine = atoi(sql_row[5]); - p->cart[i].attribute = atoi(sql_row[6]); - p->cart[i].card[0] = atoi(sql_row[7]); - p->cart[i].card[1] = atoi(sql_row[8]); - p->cart[i].card[2] = atoi(sql_row[9]); - p->cart[i].card[3] = atoi(sql_row[10]); - p->cart[i].broken = atoi(sql_row[11]); - } - mysql_free_result(sql_res); - } - printf("cart "); - - //read skill - //`skill` (`char_id`, `id`, `lv`) - sprintf(tmp_sql, "SELECT `id`, `lv` FROM `%s` WHERE `char_id`='%d'",skill_db, char_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (select `skill`)- %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - if (sql_res) { - for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){ - n = atoi(sql_row[0]); - p->skill[n].id = n; //memory!? shit!. - p->skill[n].lv = atoi(sql_row[1]); - } - mysql_free_result(sql_res); - } - printf("skill "); - - //global_reg - //`global_reg_value` (`char_id`, `str`, `value`) - sprintf(tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=3 AND `char_id`='%d'",reg_db, char_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (select `global_reg_value`)- %s\n", mysql_error(&mysql_handle)); - } - i = 0; - sql_res = mysql_store_result(&mysql_handle); - if (sql_res) { - for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){ - strcpy (p->global_reg[i].str, sql_row[0]); - p->global_reg[i].value = atoi (sql_row[1]); - } - mysql_free_result(sql_res); - } - p->global_reg_num=i; - - if (online) { - sprintf(tmp_sql, "UPDATE `%s` SET `online`='%d' WHERE `char_id`='%d'",char_db,online,char_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (set char online)- %s\n", mysql_error(&mysql_handle)); - } - } - - printf("global_reg]\n"); //ok. all data load successfuly! - - //printf("char cloade"); - - return 1; +//===================================================================================================== +int mmo_char_fromsql (int char_id, struct mmo_charstatus *p, int online) +{ + int i, n; + + memset (p, 0, sizeof (struct mmo_charstatus)); + + p->char_id = char_id; + printf ("Loaded: "); + //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9 + //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15 + //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21 + //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27 + //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35 + //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`) + //splite 2 parts. cause veeeery long SQL syntax + + sprintf (tmp_sql, + "SELECT `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`," + "`str`,`agi`,`vit`,`int`,`dex`,`luk`, `max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point` FROM `%s` WHERE `char_id` = '%d'", + char_db, char_id); + + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `char`)- %s\n", + mysql_error (&mysql_handle)); + } + + sql_res = mysql_store_result (&mysql_handle); + + if (sql_res) + { + sql_row = mysql_fetch_row (sql_res); + + p->char_id = char_id; + p->account_id = atoi (sql_row[1]); + p->char_num = atoi (sql_row[2]); + strcpy (p->name, sql_row[3]); + p->class = atoi (sql_row[4]); + p->base_level = atoi (sql_row[5]); + p->job_level = atoi (sql_row[6]); + p->base_exp = atoi (sql_row[7]); + p->job_exp = atoi (sql_row[8]); + p->zeny = atoi (sql_row[9]); + p->str = atoi (sql_row[10]); + p->agi = atoi (sql_row[11]); + p->vit = atoi (sql_row[12]); + p->int_ = atoi (sql_row[13]); + p->dex = atoi (sql_row[14]); + p->luk = atoi (sql_row[15]); + p->max_hp = atoi (sql_row[16]); + p->hp = atoi (sql_row[17]); + p->max_sp = atoi (sql_row[18]); + p->sp = atoi (sql_row[19]); + p->status_point = atoi (sql_row[20]); + p->skill_point = atoi (sql_row[21]); + //free mysql result. + mysql_free_result (sql_res); + } + else + printf ("char1 - failed\n"); //Error?! ERRRRRR WHAT THAT SAY!? + printf ("(\033[1;32m%d\033[0m)\033[1;32m%s\033[0m\t[", p->char_id, + p->name); + printf ("char1 "); + + sprintf (tmp_sql, + "SELECT `option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`,`hair`,`hair_color`," + "`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`," + "`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`, `partner_id` FROM `%s` WHERE `char_id` = '%d'", + char_db, char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `char2`)- %s\n", + mysql_error (&mysql_handle)); + } + + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + sql_row = mysql_fetch_row (sql_res); + + p->option = atoi (sql_row[0]); + p->karma = atoi (sql_row[1]); + p->manner = atoi (sql_row[2]); + p->party_id = atoi (sql_row[3]); + p->guild_id = atoi (sql_row[4]); + p->pet_id = atoi (sql_row[5]); + + p->hair = atoi (sql_row[6]); + p->hair_color = atoi (sql_row[7]); + p->clothes_color = atoi (sql_row[8]); + p->weapon = atoi (sql_row[9]); + p->shield = atoi (sql_row[10]); + p->head_top = atoi (sql_row[11]); + p->head_mid = atoi (sql_row[12]); + p->head_bottom = atoi (sql_row[13]); + strcpy (p->last_point.map, sql_row[14]); + p->last_point.x = atoi (sql_row[15]); + p->last_point.y = atoi (sql_row[16]); + strcpy (p->save_point.map, sql_row[17]); + p->save_point.x = atoi (sql_row[18]); + p->save_point.y = atoi (sql_row[19]); + p->partner_id = atoi (sql_row[20]); + + //free mysql result. + mysql_free_result (sql_res); + } + else + printf ("char2 - failed\n"); //Error?! ERRRRRR WHAT THAT SAY!? + + printf ("char2 "); + + //read memo data + //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`) + sprintf (tmp_sql, "SELECT `map`,`x`,`y` FROM `%s` WHERE `char_id`='%d'", + memo_db, char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `memo`)- %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + + if (sql_res) + { + for (i = 0; (sql_row = mysql_fetch_row (sql_res)); i++) + { + strcpy (p->memo_point[i].map, sql_row[0]); + p->memo_point[i].x = atoi (sql_row[1]); + p->memo_point[i].y = atoi (sql_row[2]); + //i ++; + } + mysql_free_result (sql_res); + } + printf ("memo "); + + //read inventory + //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`) + sprintf (tmp_sql, + "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken` " + "FROM `%s` WHERE `char_id`='%d'", inventory_db, char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `inventory`)- %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + for (i = 0; (sql_row = mysql_fetch_row (sql_res)); i++) + { + p->inventory[i].id = atoi (sql_row[0]); + p->inventory[i].nameid = atoi (sql_row[1]); + p->inventory[i].amount = atoi (sql_row[2]); + p->inventory[i].equip = atoi (sql_row[3]); + p->inventory[i].identify = atoi (sql_row[4]); + p->inventory[i].refine = atoi (sql_row[5]); + p->inventory[i].attribute = atoi (sql_row[6]); + p->inventory[i].card[0] = atoi (sql_row[7]); + p->inventory[i].card[1] = atoi (sql_row[8]); + p->inventory[i].card[2] = atoi (sql_row[9]); + p->inventory[i].card[3] = atoi (sql_row[10]); + p->inventory[i].broken = atoi (sql_row[11]); + } + mysql_free_result (sql_res); + } + printf ("inventory "); + + //read cart. + //`cart_inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`) + sprintf (tmp_sql, + "SELECT `id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken` " + "FROM `%s` WHERE `char_id`='%d'", cart_db, char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `cart_inventory`)- %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + for (i = 0; (sql_row = mysql_fetch_row (sql_res)); i++) + { + p->cart[i].id = atoi (sql_row[0]); + p->cart[i].nameid = atoi (sql_row[1]); + p->cart[i].amount = atoi (sql_row[2]); + p->cart[i].equip = atoi (sql_row[3]); + p->cart[i].identify = atoi (sql_row[4]); + p->cart[i].refine = atoi (sql_row[5]); + p->cart[i].attribute = atoi (sql_row[6]); + p->cart[i].card[0] = atoi (sql_row[7]); + p->cart[i].card[1] = atoi (sql_row[8]); + p->cart[i].card[2] = atoi (sql_row[9]); + p->cart[i].card[3] = atoi (sql_row[10]); + p->cart[i].broken = atoi (sql_row[11]); + } + mysql_free_result (sql_res); + } + printf ("cart "); + + //read skill + //`skill` (`char_id`, `id`, `lv`) + sprintf (tmp_sql, "SELECT `id`, `lv` FROM `%s` WHERE `char_id`='%d'", + skill_db, char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `skill`)- %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + for (i = 0; (sql_row = mysql_fetch_row (sql_res)); i++) + { + n = atoi (sql_row[0]); + p->skill[n].id = n; //memory!? shit!. + p->skill[n].lv = atoi (sql_row[1]); + } + mysql_free_result (sql_res); + } + printf ("skill "); + + //global_reg + //`global_reg_value` (`char_id`, `str`, `value`) + sprintf (tmp_sql, + "SELECT `str`, `value` FROM `%s` WHERE `type`=3 AND `char_id`='%d'", + reg_db, char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `global_reg_value`)- %s\n", + mysql_error (&mysql_handle)); + } + i = 0; + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + for (i = 0; (sql_row = mysql_fetch_row (sql_res)); i++) + { + strcpy (p->global_reg[i].str, sql_row[0]); + p->global_reg[i].value = atoi (sql_row[1]); + } + mysql_free_result (sql_res); + } + p->global_reg_num = i; + + if (online) + { + sprintf (tmp_sql, + "UPDATE `%s` SET `online`='%d' WHERE `char_id`='%d'", + char_db, online, char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (set char online)- %s\n", + mysql_error (&mysql_handle)); + } + } + + printf ("global_reg]\n"); //ok. all data load successfuly! + + //printf("char cloade"); + + return 1; } -//========================================================================================================== -int mmo_char_sql_init(void) { - int i; - printf("init start.......\n"); - // memory initialize - // no need to set twice size in this routine. but some cause segmentation error. :P - printf("initializing char memory...(%d byte)\n",sizeof(struct mmo_charstatus)*2); - CREATE(char_dat, struct mmo_charstatus, 2); - - memset(char_dat, 0, sizeof(struct mmo_charstatus)*2); +//========================================================================================================== +int mmo_char_sql_init (void) +{ + int i; + + printf ("init start.......\n"); + // memory initialize + // no need to set twice size in this routine. but some cause segmentation error. :P + printf ("initializing char memory...(%d byte)\n", + sizeof (struct mmo_charstatus) * 2); + CREATE (char_dat, struct mmo_charstatus, 2); + + memset (char_dat, 0, sizeof (struct mmo_charstatus) * 2); /* Initialized in inter.c already [Wizputer] // DB connection initialized // for char-server session only @@ -883,375 +1120,459 @@ int mmo_char_sql_init(void) { printf("connect success! (char server)\n"); } */ - sprintf(tmp_sql , "SELECT count(*) FROM `%s`", char_db); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle) ; - sql_row = mysql_fetch_row(sql_res); - printf("total char data -> '%s'.......\n",sql_row[0]); - i = atoi (sql_row[0]); - mysql_free_result(sql_res); - - if (i !=0) { - sprintf(tmp_sql , "SELECT max(`char_id`) FROM `%s`", char_db); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle) ; - sql_row = mysql_fetch_row(sql_res); - char_id_count = atoi (sql_row[0]); - - mysql_free_result(sql_res); - } else - printf("set char_id_count: %d.......\n",char_id_count); - - sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `online`='1'", char_db); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (reset_online `%s`)- %s\n", char_db, mysql_error(&mysql_handle)); - } - printf("init end.......\n"); - - return 0; + sprintf (tmp_sql, "SELECT count(*) FROM `%s`", char_db); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + sql_row = mysql_fetch_row (sql_res); + printf ("total char data -> '%s'.......\n", sql_row[0]); + i = atoi (sql_row[0]); + mysql_free_result (sql_res); + + if (i != 0) + { + sprintf (tmp_sql, "SELECT max(`char_id`) FROM `%s`", char_db); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + sql_row = mysql_fetch_row (sql_res); + char_id_count = atoi (sql_row[0]); + + mysql_free_result (sql_res); + } + else + printf ("set char_id_count: %d.......\n", char_id_count); + + sprintf (tmp_sql, "UPDATE `%s` SET `online`='0' WHERE `online`='1'", + char_db); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (reset_online `%s`)- %s\n", char_db, + mysql_error (&mysql_handle)); + } + printf ("init end.......\n"); + + return 0; } //========================================================================================================== -int make_new_char_sql(int fd, unsigned char *dat) { - struct char_session_data *sd; - char t_name[100]; - int i; - //aphostropy error check! - fixed! - jstrescapecpy(t_name, dat); - printf("making new char -"); - - sd = session[fd]->session_data; - - // Check Authorised letters/symbols in the name of the character - if (char_name_option == 1) { // only letters/symbols in char_name_letters are authorised - for (i = 0; i < strlen(dat); i++) - if (strchr(char_name_letters, dat[i]) == NULL) - return -1; - } else if (char_name_option == 2) { // letters/symbols in char_name_letters are forbidden - for (i = 0; i < strlen(dat); i++) - if (strchr(char_name_letters, dat[i]) != NULL) - return -1; - } // else, all letters/symbols are authorised (except control char removed before) - - //check stat error - if ((dat[24]+dat[25]+dat[26]+dat[27]+dat[28]+dat[29]!=5*6 ) || - (dat[30] >= 9) || - (dat[33] <= 0) || (dat[33] >= 20) || - (dat[31] >= 9)) { - - // check individual stat value - for(i = 24; i <= 29; i++) { - if (dat[i] < 1 || dat[i] > 9) { - return -1; - } - } - - // char.log to charlog - sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)" - "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", - charlog_db,"make new char error", sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]); - //query - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - printf("make new char error %d-%d %s %d, %d, %d, %d, %d, %d %d, %d" RETCODE, - fd, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]); - return -1; - } - - // char.log to charlog - sprintf(tmp_sql,"INSERT INTO `%s`(`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)" - "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", - charlog_db,"make new char", sd->account_id, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]); - //query - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - printf("make new char %d-%d %s %d, %d, %d, %d, %d, %d - %d, %d" RETCODE, - fd, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], dat[31]); - - sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `name` = '%s'",char_db, t_name); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - return -1; - } - sql_res = mysql_store_result(&mysql_handle); - sql_row = mysql_fetch_row(sql_res); - printf("\033[1;32m name check result : %s -\033[0m ",sql_row[0]); - if (atoi(sql_row[0]) > 0) { - mysql_free_result(sql_res); - return -1; - } else - mysql_free_result(sql_res); - - // check char slot. - sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d'",char_db, sd->account_id, dat[30]); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - sql_row = mysql_fetch_row(sql_res); - - //printf("slot check result : %s\n",sql_row[0]); - if (atoi(sql_row[0]) > 0) { - mysql_free_result(sql_res); - return -1; - } else - mysql_free_result(sql_res); - - char_id_count++; - - // make new char. - sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`account_id`,`char_num`,`name`,`zeny`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`max_hp`,`hp`,`max_sp`,`sp`,`hair`,`hair_color`)" - " VALUES ('%d', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d')", - char_db, char_id_count, sd->account_id , dat[30] , t_name, start_zeny, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], - (40 * (100 + dat[26])/100) , (40 * (100 + dat[26])/100 ), (11 * (100 + dat[27])/100), (11 * (100 + dat[27])/100), dat[33], dat[31]); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (insert `char`)- %s\n", mysql_error(&mysql_handle)); - } - - //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`) - sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')", - inventory_db, char_id_count, 1201,1,0x02,1); //add Knife - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (insert `inventory`)- %s\n", mysql_error(&mysql_handle)); - } - - sprintf(tmp_sql,"INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')", - inventory_db, char_id_count, 2301,1,0x10,1); //add Cotton Shirt - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (insert `inventory`)- %s\n", mysql_error(&mysql_handle)); - } - // respawn map and start point set - sprintf(tmp_sql,"UPDATE `%s` SET `last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d' WHERE `char_id` = '%d'", - char_db, start_point.map,start_point.x,start_point.y, start_point.map,start_point.x,start_point.y, char_id_count); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle)); - } - printf("making new char success - id:(\033[1;32m%d\033[0m\tname:\033[1;32%s\033[0m\n", char_id_count, t_name); - return char_id_count; +int make_new_char_sql (int fd, unsigned char *dat) +{ + struct char_session_data *sd; + char t_name[100]; + int i; + //aphostropy error check! - fixed! + jstrescapecpy (t_name, dat); + printf ("making new char -"); + + sd = session[fd]->session_data; + + // Check Authorised letters/symbols in the name of the character + if (char_name_option == 1) + { // only letters/symbols in char_name_letters are authorised + for (i = 0; i < strlen (dat); i++) + if (strchr (char_name_letters, dat[i]) == NULL) + return -1; + } + else if (char_name_option == 2) + { // letters/symbols in char_name_letters are forbidden + for (i = 0; i < strlen (dat); i++) + if (strchr (char_name_letters, dat[i]) != NULL) + return -1; + } // else, all letters/symbols are authorised (except control char removed before) + + //check stat error + if ((dat[24] + dat[25] + dat[26] + dat[27] + dat[28] + dat[29] != 5 * 6) + || (dat[30] >= 9) || (dat[33] <= 0) || (dat[33] >= 20) + || (dat[31] >= 9)) + { + + // check individual stat value + for (i = 24; i <= 29; i++) + { + if (dat[i] < 1 || dat[i] > 9) + { + return -1; + } + } + + // char.log to charlog + sprintf (tmp_sql, + "INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)" + "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", + charlog_db, "make new char error", sd->account_id, dat[30], + dat, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], + dat[33], dat[31]); + //query + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + printf ("make new char error %d-%d %s %d, %d, %d, %d, %d, %d %d, %d" + RETCODE, fd, dat[30], dat, dat[24], dat[25], dat[26], dat[27], + dat[28], dat[29], dat[33], dat[31]); + return -1; + } + + // char.log to charlog + sprintf (tmp_sql, + "INSERT INTO `%s`(`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)" + "VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", + charlog_db, "make new char", sd->account_id, dat[30], dat, + dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], dat[33], + dat[31]); + //query + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + printf ("make new char %d-%d %s %d, %d, %d, %d, %d, %d - %d, %d" RETCODE, + fd, dat[30], dat, dat[24], dat[25], dat[26], dat[27], dat[28], + dat[29], dat[33], dat[31]); + + sprintf (tmp_sql, "SELECT count(*) FROM `%s` WHERE `name` = '%s'", + char_db, t_name); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + return -1; + } + sql_res = mysql_store_result (&mysql_handle); + sql_row = mysql_fetch_row (sql_res); + printf ("\033[1;32m name check result : %s -\033[0m ", sql_row[0]); + if (atoi (sql_row[0]) > 0) + { + mysql_free_result (sql_res); + return -1; + } + else + mysql_free_result (sql_res); + + // check char slot. + sprintf (tmp_sql, + "SELECT count(*) FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d'", + char_db, sd->account_id, dat[30]); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + sql_row = mysql_fetch_row (sql_res); + + //printf("slot check result : %s\n",sql_row[0]); + if (atoi (sql_row[0]) > 0) + { + mysql_free_result (sql_res); + return -1; + } + else + mysql_free_result (sql_res); + + char_id_count++; + + // make new char. + sprintf (tmp_sql, + "INSERT INTO `%s` (`char_id`,`account_id`,`char_num`,`name`,`zeny`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`max_hp`,`hp`,`max_sp`,`sp`,`hair`,`hair_color`)" + " VALUES ('%d', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d')", + char_db, char_id_count, sd->account_id, dat[30], t_name, + start_zeny, dat[24], dat[25], dat[26], dat[27], dat[28], dat[29], + (40 * (100 + dat[26]) / 100), (40 * (100 + dat[26]) / 100), + (11 * (100 + dat[27]) / 100), (11 * (100 + dat[27]) / 100), + dat[33], dat[31]); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `char`)- %s\n", + mysql_error (&mysql_handle)); + } + + //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`) + sprintf (tmp_sql, "INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')", inventory_db, char_id_count, 1201, 1, 0x02, 1); //add Knife + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `inventory`)- %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, "INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `equip`, `identify`) VALUES ('%d', '%d', '%d', '%d', '%d')", inventory_db, char_id_count, 2301, 1, 0x10, 1); //add Cotton Shirt + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `inventory`)- %s\n", + mysql_error (&mysql_handle)); + } + // respawn map and start point set + sprintf (tmp_sql, + "UPDATE `%s` SET `last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d' WHERE `char_id` = '%d'", + char_db, start_point.map, start_point.x, start_point.y, + start_point.map, start_point.x, start_point.y, char_id_count); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (update `char`)- %s\n", + mysql_error (&mysql_handle)); + } + printf + ("making new char success - id:(\033[1;32m%d\033[0m\tname:\033[1;32%s\033[0m\n", + char_id_count, t_name); + return char_id_count; } //========================================================================================================== -void mmo_char_sync(void){ - printf("mmo_char_sync() - nothing to do\n"); +void mmo_char_sync (void) +{ + printf ("mmo_char_sync() - nothing to do\n"); } // to do /////////////////////////// -int mmo_char_sync_timer(int tid, unsigned int tick, int id, int data) { - printf("mmo_char_sync_timer() tic - no works to do\n"); - return 0; +int mmo_char_sync_timer (int tid, unsigned int tick, int id, int data) +{ + printf ("mmo_char_sync_timer() tic - no works to do\n"); + return 0; } -int count_users(void) { - int i, users; - - if (login_fd > 0 && session[login_fd]){ - users = 0; - for(i = 0; i < MAX_MAP_SERVERS; i++) { - if (server_fd[i] >= 0) { - users += server[i].users; - } - } - return users; - } - return 0; +int count_users (void) +{ + int i, users; + + if (login_fd > 0 && session[login_fd]) + { + users = 0; + for (i = 0; i < MAX_MAP_SERVERS; i++) + { + if (server_fd[i] >= 0) + { + users += server[i].users; + } + } + return users; + } + return 0; } -int mmo_char_send006b(int fd, struct char_session_data *sd) { - int i, j, found_num = 0; - struct mmo_charstatus *p = NULL; +int mmo_char_send006b (int fd, struct char_session_data *sd) +{ + int i, j, found_num = 0; + struct mmo_charstatus *p = NULL; // hehe. commented other. anyway there's no need to use older version. // if use older packet version just uncomment that! //#ifdef NEW_006b - const int offset = 24; + const int offset = 24; //#else -// int offset = 4; +// int offset = 4; //#endif - printf("mmo_char_send006b start.. (account:%d)\n",sd->account_id); -// printf("offset -> %d...\n",offset); - - //search char. - sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id` = '%d'",char_db, sd->account_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - if (sql_res) { - found_num = mysql_num_rows(sql_res); - printf("number of chars: %d\n", found_num); - i = 0; - while((sql_row = mysql_fetch_row(sql_res))) { - sd->found_char[i] = atoi(sql_row[0]); - i++; - } - mysql_free_result(sql_res); - } - -// printf("char fetching end (total: %d)....\n", found_num); - - for(i = found_num; i < 9; i++) - sd->found_char[i] = -1; - - memset(WFIFOP(fd, 0), 0, offset + found_num * 106); - WFIFOW(fd, 0) = 0x6b; - WFIFOW(fd, 2) = offset + found_num * 106; - - printf("(\033[1;13m%d\033[0m) Request Char Data:\n",sd->account_id); - - for(i = 0; i < found_num; i++) { - mmo_char_fromsql(sd->found_char[i], char_dat, 0); - - p = &char_dat[0]; - - j = offset + (i * 106); // increase speed of code - - WFIFOL(fd,j) = p->char_id; - WFIFOL(fd,j+4) = p->base_exp; - WFIFOL(fd,j+8) = p->zeny; - WFIFOL(fd,j+12) = p->job_exp; - WFIFOL(fd,j+16) = p->job_level; - - WFIFOL(fd,j+20) = 0; - WFIFOL(fd,j+24) = 0; - WFIFOL(fd,j+28) = p->option; - - WFIFOL(fd,j+32) = p->karma; - WFIFOL(fd,j+36) = p->manner; - - WFIFOW(fd,j+40) = p->status_point; - WFIFOW(fd,j+42) = (p->hp > 0x7fff) ? 0x7fff : p->hp; - WFIFOW(fd,j+44) = (p->max_hp > 0x7fff) ? 0x7fff : p->max_hp; - WFIFOW(fd,j+46) = (p->sp > 0x7fff) ? 0x7fff : p->sp; - WFIFOW(fd,j+48) = (p->max_sp > 0x7fff) ? 0x7fff : p->max_sp; - WFIFOW(fd,j+50) = DEFAULT_WALK_SPEED; // p->speed; - WFIFOW(fd,j+52) = p->class; - WFIFOW(fd,j+54) = p->hair; - WFIFOW(fd,j+56) = p->weapon; - WFIFOW(fd,j+58) = p->base_level; - WFIFOW(fd,j+60) = p->skill_point; - WFIFOW(fd,j+62) = p->head_bottom; - WFIFOW(fd,j+64) = p->shield; - WFIFOW(fd,j+66) = p->head_top; - WFIFOW(fd,j+68) = p->head_mid; - WFIFOW(fd,j+70) = p->hair_color; - WFIFOW(fd,j+72) = p->clothes_color; - - memcpy(WFIFOP(fd,j+74), p->name, 24); - - WFIFOB(fd,j+98) = (p->str > 255) ? 255 : p->str; - WFIFOB(fd,j+99) = (p->agi > 255) ? 255 : p->agi; - WFIFOB(fd,j+100) = (p->vit > 255) ? 255 : p->vit; - WFIFOB(fd,j+101) = (p->int_ > 255) ? 255 : p->int_; - WFIFOB(fd,j+102) = (p->dex > 255) ? 255 : p->dex; - WFIFOB(fd,j+103) = (p->luk > 255) ? 255 : p->luk; - WFIFOB(fd,j+104) = p->char_num; - } - - WFIFOSET(fd,WFIFOW(fd,2)); -// printf("mmo_char_send006b end..\n"); - return 0; + printf ("mmo_char_send006b start.. (account:%d)\n", sd->account_id); +// printf("offset -> %d...\n",offset); + + //search char. + sprintf (tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id` = '%d'", + char_db, sd->account_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + found_num = mysql_num_rows (sql_res); + printf ("number of chars: %d\n", found_num); + i = 0; + while ((sql_row = mysql_fetch_row (sql_res))) + { + sd->found_char[i] = atoi (sql_row[0]); + i++; + } + mysql_free_result (sql_res); + } + +// printf("char fetching end (total: %d)....\n", found_num); + + for (i = found_num; i < 9; i++) + sd->found_char[i] = -1; + + memset (WFIFOP (fd, 0), 0, offset + found_num * 106); + WFIFOW (fd, 0) = 0x6b; + WFIFOW (fd, 2) = offset + found_num * 106; + + printf ("(\033[1;13m%d\033[0m) Request Char Data:\n", sd->account_id); + + for (i = 0; i < found_num; i++) + { + mmo_char_fromsql (sd->found_char[i], char_dat, 0); + + p = &char_dat[0]; + + j = offset + (i * 106); // increase speed of code + + WFIFOL (fd, j) = p->char_id; + WFIFOL (fd, j + 4) = p->base_exp; + WFIFOL (fd, j + 8) = p->zeny; + WFIFOL (fd, j + 12) = p->job_exp; + WFIFOL (fd, j + 16) = p->job_level; + + WFIFOL (fd, j + 20) = 0; + WFIFOL (fd, j + 24) = 0; + WFIFOL (fd, j + 28) = p->option; + + WFIFOL (fd, j + 32) = p->karma; + WFIFOL (fd, j + 36) = p->manner; + + WFIFOW (fd, j + 40) = p->status_point; + WFIFOW (fd, j + 42) = (p->hp > 0x7fff) ? 0x7fff : p->hp; + WFIFOW (fd, j + 44) = (p->max_hp > 0x7fff) ? 0x7fff : p->max_hp; + WFIFOW (fd, j + 46) = (p->sp > 0x7fff) ? 0x7fff : p->sp; + WFIFOW (fd, j + 48) = (p->max_sp > 0x7fff) ? 0x7fff : p->max_sp; + WFIFOW (fd, j + 50) = DEFAULT_WALK_SPEED; // p->speed; + WFIFOW (fd, j + 52) = p->class; + WFIFOW (fd, j + 54) = p->hair; + WFIFOW (fd, j + 56) = p->weapon; + WFIFOW (fd, j + 58) = p->base_level; + WFIFOW (fd, j + 60) = p->skill_point; + WFIFOW (fd, j + 62) = p->head_bottom; + WFIFOW (fd, j + 64) = p->shield; + WFIFOW (fd, j + 66) = p->head_top; + WFIFOW (fd, j + 68) = p->head_mid; + WFIFOW (fd, j + 70) = p->hair_color; + WFIFOW (fd, j + 72) = p->clothes_color; + + memcpy (WFIFOP (fd, j + 74), p->name, 24); + + WFIFOB (fd, j + 98) = (p->str > 255) ? 255 : p->str; + WFIFOB (fd, j + 99) = (p->agi > 255) ? 255 : p->agi; + WFIFOB (fd, j + 100) = (p->vit > 255) ? 255 : p->vit; + WFIFOB (fd, j + 101) = (p->int_ > 255) ? 255 : p->int_; + WFIFOB (fd, j + 102) = (p->dex > 255) ? 255 : p->dex; + WFIFOB (fd, j + 103) = (p->luk > 255) ? 255 : p->luk; + WFIFOB (fd, j + 104) = p->char_num; + } + + WFIFOSET (fd, WFIFOW (fd, 2)); +// printf("mmo_char_send006b end..\n"); + return 0; } -int parse_tologin(int fd) { - int i; - struct char_session_data *sd; - - // only login-server can have an access to here. - // so, if it isn't the login-server, we disconnect the session. - //session eof check! - if (fd != login_fd || session[fd]->eof) { - if (fd == login_fd) { - printf("Char-server can't connect to login-server (connection #%d).\n", fd); - login_fd = -1; - } - close(fd); - delete_session(fd); - return 0; - } - - sd = session[fd]->session_data; - - // hehe. no need to set user limite on SQL version. :P - // but char limitation is good way to maintain server. :D - while(RFIFOREST(fd) >= 2) { -// printf("parse_tologin : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0)); - - switch(RFIFOW(fd, 0)){ - case 0x2711: - if (RFIFOREST(fd) < 3) - return 0; - if (RFIFOB(fd, 2)) { - //printf("connect login server error : %d\n", RFIFOB(fd, 2)); - printf("Can not connect to login-server.\n"); - printf("The server communication passwords (default s1/p1) is probably invalid.\n"); - printf("Also, please make sure your login db has the username/password present and the sex of the account is S.\n"); - printf("If you changed the communication passwords, change them back at map_athena.conf and char_athena.conf\n"); - return 0; - //exit(1); //fixed for server shutdown. - }else { - printf("Connected to login-server (connection #%d).\n", fd); - // if no map-server already connected, display a message... - for(i = 0; i < MAX_MAP_SERVERS; i++) - if (server_fd[i] >= 0 && server[i].map[0][0]) // if map-server online and at least 1 map - break; - if (i == MAX_MAP_SERVERS) - printf("Awaiting maps from map-server.\n"); - } - RFIFOSKIP(fd, 3); - break; - - case 0x2713: - if(RFIFOREST(fd)<51) - return 0; - for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) && sd->account_id == RFIFOL(fd,2)) { - if (RFIFOB(fd,6) != 0) { - WFIFOW(i,0) = 0x6c; - WFIFOB(i,2) = 0x42; - WFIFOSET(i,3); - } else if (max_connect_user == 0 || count_users() < max_connect_user) { -// if (max_connect_user == 0) -// printf("max_connect_user (unlimited) -> accepted.\n"); -// else -// printf("count_users(): %d < max_connect_user (%d) -> accepted.\n", count_users(), max_connect_user); - sd->connect_until_time = (time_t)RFIFOL(fd,47); - // send characters to player - mmo_char_send006b(i, sd); - } else { - // refuse connection: too much online players -// printf("count_users(): %d < max_connect_use (%d) -> fail...\n", count_users(), max_connect_user); - WFIFOW(i,0) = 0x6c; - WFIFOW(i,2) = 0; - WFIFOSET(i,3); - } - } - } - RFIFOSKIP(fd,51); - break; - - case 0x2717: - if (RFIFOREST(fd) < 50) - return 0; - for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data)) { - if (sd->account_id == RFIFOL(fd,2)) { - sd->connect_until_time = (time_t)RFIFOL(fd,46); - break; - } - } - } - RFIFOSKIP(fd,50); - break; +int parse_tologin (int fd) +{ + int i; + struct char_session_data *sd; + + // only login-server can have an access to here. + // so, if it isn't the login-server, we disconnect the session. + //session eof check! + if (fd != login_fd || session[fd]->eof) + { + if (fd == login_fd) + { + printf + ("Char-server can't connect to login-server (connection #%d).\n", + fd); + login_fd = -1; + } + close (fd); + delete_session (fd); + return 0; + } + + sd = session[fd]->session_data; + + // hehe. no need to set user limite on SQL version. :P + // but char limitation is good way to maintain server. :D + while (RFIFOREST (fd) >= 2) + { +// printf("parse_tologin : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0)); + + switch (RFIFOW (fd, 0)) + { + case 0x2711: + if (RFIFOREST (fd) < 3) + return 0; + if (RFIFOB (fd, 2)) + { + //printf("connect login server error : %d\n", RFIFOB(fd, 2)); + printf ("Can not connect to login-server.\n"); + printf + ("The server communication passwords (default s1/p1) is probably invalid.\n"); + printf + ("Also, please make sure your login db has the username/password present and the sex of the account is S.\n"); + printf + ("If you changed the communication passwords, change them back at map_athena.conf and char_athena.conf\n"); + return 0; + //exit(1); //fixed for server shutdown. + } + else + { + printf ("Connected to login-server (connection #%d).\n", + fd); + // if no map-server already connected, display a message... + for (i = 0; i < MAX_MAP_SERVERS; i++) + if (server_fd[i] >= 0 && server[i].map[0][0]) // if map-server online and at least 1 map + break; + if (i == MAX_MAP_SERVERS) + printf ("Awaiting maps from map-server.\n"); + } + RFIFOSKIP (fd, 3); + break; + + case 0x2713: + if (RFIFOREST (fd) < 51) + return 0; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data) + && sd->account_id == RFIFOL (fd, 2)) + { + if (RFIFOB (fd, 6) != 0) + { + WFIFOW (i, 0) = 0x6c; + WFIFOB (i, 2) = 0x42; + WFIFOSET (i, 3); + } + else if (max_connect_user == 0 + || count_users () < max_connect_user) + { +// if (max_connect_user == 0) +// printf("max_connect_user (unlimited) -> accepted.\n"); +// else +// printf("count_users(): %d < max_connect_user (%d) -> accepted.\n", count_users(), max_connect_user); + sd->connect_until_time = (time_t) RFIFOL (fd, 47); + // send characters to player + mmo_char_send006b (i, sd); + } + else + { + // refuse connection: too much online players +// printf("count_users(): %d < max_connect_use (%d) -> fail...\n", count_users(), max_connect_user); + WFIFOW (i, 0) = 0x6c; + WFIFOW (i, 2) = 0; + WFIFOSET (i, 3); + } + } + } + RFIFOSKIP (fd, 51); + break; + + case 0x2717: + if (RFIFOREST (fd) < 50) + return 0; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data)) + { + if (sd->account_id == RFIFOL (fd, 2)) + { + sd->connect_until_time = (time_t) RFIFOL (fd, 46); + break; + } + } + } + RFIFOSKIP (fd, 50); + break; /* case 0x2721: // gm reply. I don't want to support this function. printf("0x2721:GM reply\n"); @@ -1277,432 +1598,528 @@ int parse_tologin(int fd) { } break; */ - case 0x2723: // changesex reply (modified by [Yor]) - if (RFIFOREST(fd) < 7) - return 0; - { - int acc, sex; - unsigned char buf[16]; - - acc = RFIFOL(fd,2); - sex = RFIFOB(fd,6); - RFIFOSKIP(fd, 7); - if (acc > 0) { - sprintf(tmp_sql, "SELECT `char_id`,`class`,`skill_point` FROM `%s` WHERE `account_id` = '%d'",char_db, acc); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - - if (sql_res) { - sql_row = mysql_fetch_row(sql_res); - int char_id = atoi(sql_row[0]); - int jobclass = atoi(sql_row[1]); - int skill_point = atoi(sql_row[2]); - int class = jobclass; - if (jobclass == 19 || jobclass == 20 || - jobclass == 4020 || jobclass == 4021 || - jobclass == 4042 || jobclass == 4043) { - // job modification - if (jobclass == 19 || jobclass == 20) { - class = (sex) ? 19 : 20; - } else if (jobclass == 4020 || jobclass == 4021) { - class = (sex) ? 4020 : 4021; - } else if (jobclass == 4042 || jobclass == 4043) { - class = (sex) ? 4042 : 4043; - } - // remove specifical skills of classes 19,20 4020,4021 and 4042,4043 - sprintf(tmp_sql, "SELECT `lv` FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330'",skill_db, char_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - if (sql_res) { - while(( sql_row = mysql_fetch_row(sql_res))) { - skill_point += atoi(sql_row[0]); - } - } - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330'",skill_db, char_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle)); - } - } - // to avoid any problem with equipment and invalid sex, equipment is unequiped. - sprintf(tmp_sql, "UPDATE `%s` SET `equip` = '0' WHERE `char_id` = '%d'",inventory_db, char_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle)); - } - sprintf(tmp_sql, "UPDATE `%s` SET `class`='%d' , `skill_point`='%d' , `weapon`='0' , `shield='0' , `head_top`='0' , `head_mid`='0' , `head_bottom`='0' WHERE `char_id` = '%d'",char_db, class, skill_point, char_id); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle)); - } - } - } - // disconnect player if online on char-server - for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data)) { - if (sd->account_id == acc) { - session[i]->eof = 1; - break; - } - } - } - - WBUFW(buf,0) = 0x2b0d; - WBUFL(buf,2) = acc; - WBUFB(buf,6) = sex; - - mapif_sendall(buf, 7); - } - break; - - // account_reg2変更通知 - case 0x2729: - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - { - struct global_reg reg[ACCOUNT_REG2_NUM]; - unsigned char buf[4096]; - int j, p, acc; - acc = RFIFOL(fd,4); - for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) { - memcpy(reg[j].str, RFIFOP(fd,p), 32); - reg[j].value = RFIFOL(fd,p+32); - } - // set_account_reg2(acc,j,reg); - // 同垢ログインを禁止していれば送る必要は無い - memcpy(buf,RFIFOP(fd,0), RFIFOW(fd,2)); - WBUFW(buf,0) = 0x2b11; - mapif_sendall(buf, WBUFW(buf,2)); - RFIFOSKIP(fd, RFIFOW(fd,2)); -// printf("char: save_account_reg_reply\n"); - } - break; - - // State change of account/ban notification (from login-server) by [Yor] - case 0x2731: - if (RFIFOREST(fd) < 11) - return 0; - // send to all map-servers to disconnect the player - { - unsigned char buf[16]; - WBUFW(buf,0) = 0x2b14; - WBUFL(buf,2) = RFIFOL(fd,2); - WBUFB(buf,6) = RFIFOB(fd,6); // 0: change of statut, 1: ban - WBUFL(buf,7) = RFIFOL(fd,7); // status or final date of a banishment - mapif_sendall(buf, 11); - } - // disconnect player if online on char-server - for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data)) { - if (sd->account_id == RFIFOL(fd,2)) { - session[i]->eof = 1; - break; - } - } - } - RFIFOSKIP(fd,11); - break; - - default: - printf("set eof.\n"); - session[fd]->eof = 1; - return 0; - } - } - - RFIFOFLUSH(fd); - - return 0; + case 0x2723: // changesex reply (modified by [Yor]) + if (RFIFOREST (fd) < 7) + return 0; + { + int acc, sex; + unsigned char buf[16]; + + acc = RFIFOL (fd, 2); + sex = RFIFOB (fd, 6); + RFIFOSKIP (fd, 7); + if (acc > 0) + { + sprintf (tmp_sql, + "SELECT `char_id`,`class`,`skill_point` FROM `%s` WHERE `account_id` = '%d'", + char_db, acc); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `char`)- %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + + if (sql_res) + { + sql_row = mysql_fetch_row (sql_res); + int char_id = atoi (sql_row[0]); + int jobclass = atoi (sql_row[1]); + int skill_point = atoi (sql_row[2]); + int class = jobclass; + if (jobclass == 19 || jobclass == 20 || + jobclass == 4020 || jobclass == 4021 || + jobclass == 4042 || jobclass == 4043) + { + // job modification + if (jobclass == 19 || jobclass == 20) + { + class = (sex) ? 19 : 20; + } + else if (jobclass == 4020 || jobclass == 4021) + { + class = (sex) ? 4020 : 4021; + } + else if (jobclass == 4042 || jobclass == 4043) + { + class = (sex) ? 4042 : 4043; + } + // remove specifical skills of classes 19,20 4020,4021 and 4042,4043 + sprintf (tmp_sql, + "SELECT `lv` FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330'", + skill_db, char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf + ("DB server Error (select `char`)- %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + while ((sql_row = + mysql_fetch_row (sql_res))) + { + skill_point += atoi (sql_row[0]); + } + } + sprintf (tmp_sql, + "DELETE FROM `%s` WHERE `char_id` = '%d' AND `id` >= '315' AND `id` <= '330'", + skill_db, char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf + ("DB server Error (select `char`)- %s\n", + mysql_error (&mysql_handle)); + } + } + // to avoid any problem with equipment and invalid sex, equipment is unequiped. + sprintf (tmp_sql, + "UPDATE `%s` SET `equip` = '0' WHERE `char_id` = '%d'", + inventory_db, char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf + ("DB server Error (select `char`)- %s\n", + mysql_error (&mysql_handle)); + } + sprintf (tmp_sql, + "UPDATE `%s` SET `class`='%d' , `skill_point`='%d' , `weapon`='0' , `shield='0' , `head_top`='0' , `head_mid`='0' , `head_bottom`='0' WHERE `char_id` = '%d'", + char_db, class, skill_point, char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf + ("DB server Error (select `char`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + // disconnect player if online on char-server + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data)) + { + if (sd->account_id == acc) + { + session[i]->eof = 1; + break; + } + } + } + + WBUFW (buf, 0) = 0x2b0d; + WBUFL (buf, 2) = acc; + WBUFB (buf, 6) = sex; + + mapif_sendall (buf, 7); + } + break; + + // account_reg2変更通知 + case 0x2729: + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + { + struct global_reg reg[ACCOUNT_REG2_NUM]; + unsigned char buf[4096]; + int j, p, acc; + acc = RFIFOL (fd, 4); + for (p = 8, j = 0; + p < RFIFOW (fd, 2) && j < ACCOUNT_REG2_NUM; + p += 36, j++) + { + memcpy (reg[j].str, RFIFOP (fd, p), 32); + reg[j].value = RFIFOL (fd, p + 32); + } + // set_account_reg2(acc,j,reg); + // 同垢ログインを禁止していれば送る必要は無い + memcpy (buf, RFIFOP (fd, 0), RFIFOW (fd, 2)); + WBUFW (buf, 0) = 0x2b11; + mapif_sendall (buf, WBUFW (buf, 2)); + RFIFOSKIP (fd, RFIFOW (fd, 2)); +// printf("char: save_account_reg_reply\n"); + } + break; + + // State change of account/ban notification (from login-server) by [Yor] + case 0x2731: + if (RFIFOREST (fd) < 11) + return 0; + // send to all map-servers to disconnect the player + { + unsigned char buf[16]; + WBUFW (buf, 0) = 0x2b14; + WBUFL (buf, 2) = RFIFOL (fd, 2); + WBUFB (buf, 6) = RFIFOB (fd, 6); // 0: change of statut, 1: ban + WBUFL (buf, 7) = RFIFOL (fd, 7); // status or final date of a banishment + mapif_sendall (buf, 11); + } + // disconnect player if online on char-server + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data)) + { + if (sd->account_id == RFIFOL (fd, 2)) + { + session[i]->eof = 1; + break; + } + } + } + RFIFOSKIP (fd, 11); + break; + + default: + printf ("set eof.\n"); + session[fd]->eof = 1; + return 0; + } + } + + RFIFOFLUSH (fd); + + return 0; } //-------------------------------- // Map-server anti-freeze system //-------------------------------- -int map_anti_freeze_system(int tid, unsigned int tick, int id, int data) { - int i; - - for(i = 0; i < MAX_MAP_SERVERS; i++) { - if (server_fd[i] >= 0) {// if map-server is online - printf("map_anti_freeze_system: server #%d, flag: %d.\n", i, server_freezeflag[i]); - if (server_freezeflag[i]-- < 1) {// Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed - printf("Map-server anti-freeze system: char-server #%d is frozen -> disconnection.\n", i); - session[server_fd[i]]->eof = 1; - sprintf(tmp_sql, "DELETE FROM `ragsrvinfo` WHERE `index`='%d'", server_fd[i]); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - } - } - } - - return 0; +int map_anti_freeze_system (int tid, unsigned int tick, int id, int data) +{ + int i; + + for (i = 0; i < MAX_MAP_SERVERS; i++) + { + if (server_fd[i] >= 0) + { // if map-server is online + printf ("map_anti_freeze_system: server #%d, flag: %d.\n", i, + server_freezeflag[i]); + if (server_freezeflag[i]-- < 1) + { // Map-server anti-freeze system. Counter. 5 ok, 4...0 freezed + printf + ("Map-server anti-freeze system: char-server #%d is frozen -> disconnection.\n", + i); + session[server_fd[i]]->eof = 1; + sprintf (tmp_sql, + "DELETE FROM `ragsrvinfo` WHERE `index`='%d'", + server_fd[i]); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + } + } + } + + return 0; } -int parse_frommap(int fd) { - int i = 0, j = 0; - int id; - - // Sometimes fd=0, and it will cause server crash. Don't know why. :( - if (fd <= 0) { - printf("parse_frommap error fd=0\n"); - return 0; - } - - for(id = 0; id < MAX_MAP_SERVERS; id++) - if (server_fd[id] == fd) - break; - if(id == MAX_MAP_SERVERS || session[fd]->eof) { - if (id < MAX_MAP_SERVERS) { - memset(&server[id], 0, sizeof(struct mmo_map_server)); - printf("Map-server %d (session #%d) has disconnected.\n", id, fd); - sprintf(tmp_sql, "DELETE FROM `ragsrvinfo` WHERE `index`='%d'", server_fd[id]); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - server_fd[id] = -1; - } - close(fd); - delete_session(fd); - return 0; - } - - while(RFIFOREST(fd) >= 2) { -// printf("parse_frommap : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd,0)); - - switch(RFIFOW(fd, 0)) { - case 0x2af7: - RFIFOSKIP(fd,2); - read_gm_account(); - break; - - // mapserver -> map names recv. - case 0x2afa: - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - memset(server[id].map, 0, sizeof(server[id].map)); - j = 0; - for(i = 4; i < RFIFOW(fd,2); i += 16) { - memcpy(server[id].map[j], RFIFOP(fd,i), 16); -// printf("set map %d.%d : %s\n", id, j, server[id].map[j]); - j++; - } - i = server[id].ip; - { - unsigned char *p = (unsigned char *)&server[id].ip; - printf("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d.\n", - id, j, p[0], p[1], p[2], p[3], server[id].port); - printf("Map-server %d loading complete.\n", id); - } - WFIFOW(fd,0) = 0x2afb; - WFIFOB(fd,2) = 0; - memcpy(WFIFOP(fd,3), wisp_server_name, 24); // name for wisp to player - WFIFOSET(fd,27); - { - unsigned char buf[16384]; - int x; - if (j == 0) { - printf("WARNING: Map-Server %d have NO maps.\n", id); - // Transmitting maps information to the other map-servers - } else { - WBUFW(buf,0) = 0x2b04; - WBUFW(buf,2) = j * 16 + 10; - WBUFL(buf,4) = server[id].ip; - WBUFW(buf,8) = server[id].port; - memcpy(WBUFP(buf,10), RFIFOP(fd,4), j * 16); - mapif_sendallwos(fd, buf, WBUFW(buf,2)); - } - // Transmitting the maps of the other map-servers to the new map-server - for(x = 0; x < MAX_MAP_SERVERS; x++) { - if (server_fd[x] >= 0 && x != id) { - WFIFOW(fd,0) = 0x2b04; - WFIFOL(fd,4) = server[x].ip; - WFIFOW(fd,8) = server[x].port; - j = 0; - for(i = 0; i < MAX_MAP_PER_SERVER; i++) - if (server[x].map[i][0]) - memcpy(WFIFOP(fd,10+(j++)*16), server[x].map[i], 16); - if (j > 0) { - WFIFOW(fd,2) = j * 16 + 10; - WFIFOSET(fd,WFIFOW(fd,2)); - } - } - } - } - RFIFOSKIP(fd,RFIFOW(fd,2)); - break; - - // auth request - case 0x2afc: - if (RFIFOREST(fd) < 22) - return 0; -// printf("(AUTH request) auth_fifo search %d %d %d\n", RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10)); - for(i = 0; i < AUTH_FIFO_SIZE; i++) { - if (auth_fifo[i].account_id == RFIFOL(fd,2) && - auth_fifo[i].char_id == RFIFOL(fd,6) && - auth_fifo[i].login_id1 == RFIFOL(fd,10) && +int parse_frommap (int fd) +{ + int i = 0, j = 0; + int id; + + // Sometimes fd=0, and it will cause server crash. Don't know why. :( + if (fd <= 0) + { + printf ("parse_frommap error fd=0\n"); + return 0; + } + + for (id = 0; id < MAX_MAP_SERVERS; id++) + if (server_fd[id] == fd) + break; + if (id == MAX_MAP_SERVERS || session[fd]->eof) + { + if (id < MAX_MAP_SERVERS) + { + memset (&server[id], 0, sizeof (struct mmo_map_server)); + printf ("Map-server %d (session #%d) has disconnected.\n", id, + fd); + sprintf (tmp_sql, "DELETE FROM `ragsrvinfo` WHERE `index`='%d'", + server_fd[id]); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + server_fd[id] = -1; + } + close (fd); + delete_session (fd); + return 0; + } + + while (RFIFOREST (fd) >= 2) + { +// printf("parse_frommap : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd,0)); + + switch (RFIFOW (fd, 0)) + { + case 0x2af7: + RFIFOSKIP (fd, 2); + read_gm_account (); + break; + + // mapserver -> map names recv. + case 0x2afa: + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + memset (server[id].map, 0, sizeof (server[id].map)); + j = 0; + for (i = 4; i < RFIFOW (fd, 2); i += 16) + { + memcpy (server[id].map[j], RFIFOP (fd, i), 16); +// printf("set map %d.%d : %s\n", id, j, server[id].map[j]); + j++; + } + i = server[id].ip; + { + unsigned char *p = (unsigned char *) &server[id].ip; + printf + ("Map-Server %d connected: %d maps, from IP %d.%d.%d.%d port %d.\n", + id, j, p[0], p[1], p[2], p[3], server[id].port); + printf ("Map-server %d loading complete.\n", id); + } + WFIFOW (fd, 0) = 0x2afb; + WFIFOB (fd, 2) = 0; + memcpy (WFIFOP (fd, 3), wisp_server_name, 24); // name for wisp to player + WFIFOSET (fd, 27); + { + unsigned char buf[16384]; + int x; + if (j == 0) + { + printf ("WARNING: Map-Server %d have NO maps.\n", id); + // Transmitting maps information to the other map-servers + } + else + { + WBUFW (buf, 0) = 0x2b04; + WBUFW (buf, 2) = j * 16 + 10; + WBUFL (buf, 4) = server[id].ip; + WBUFW (buf, 8) = server[id].port; + memcpy (WBUFP (buf, 10), RFIFOP (fd, 4), j * 16); + mapif_sendallwos (fd, buf, WBUFW (buf, 2)); + } + // Transmitting the maps of the other map-servers to the new map-server + for (x = 0; x < MAX_MAP_SERVERS; x++) + { + if (server_fd[x] >= 0 && x != id) + { + WFIFOW (fd, 0) = 0x2b04; + WFIFOL (fd, 4) = server[x].ip; + WFIFOW (fd, 8) = server[x].port; + j = 0; + for (i = 0; i < MAX_MAP_PER_SERVER; i++) + if (server[x].map[i][0]) + memcpy (WFIFOP (fd, 10 + (j++) * 16), + server[x].map[i], 16); + if (j > 0) + { + WFIFOW (fd, 2) = j * 16 + 10; + WFIFOSET (fd, WFIFOW (fd, 2)); + } + } + } + } + RFIFOSKIP (fd, RFIFOW (fd, 2)); + break; + + // auth request + case 0x2afc: + if (RFIFOREST (fd) < 22) + return 0; +// printf("(AUTH request) auth_fifo search %d %d %d\n", RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10)); + for (i = 0; i < AUTH_FIFO_SIZE; i++) + { + if (auth_fifo[i].account_id == RFIFOL (fd, 2) && + auth_fifo[i].char_id == RFIFOL (fd, 6) && + auth_fifo[i].login_id1 == RFIFOL (fd, 10) && #if CMP_AUTHFIFO_LOGIN2 != 0 - // here, it's the only area where it's possible that we doesn't know login_id2 (map-server asks just after 0x72 packet, that doesn't given the value) - (auth_fifo[i].login_id2 == RFIFOL(fd,14) || RFIFOL(fd,14) == 0) && // relate to the versions higher than 18 + // here, it's the only area where it's possible that we doesn't know login_id2 (map-server asks just after 0x72 packet, that doesn't given the value) + (auth_fifo[i].login_id2 == RFIFOL (fd, 14) || RFIFOL (fd, 14) == 0) && // relate to the versions higher than 18 #endif - (!check_ip_flag || auth_fifo[i].ip == RFIFOL(fd,18)) && - !auth_fifo[i].delflag) { - auth_fifo[i].delflag = 1; - WFIFOW(fd,0) = 0x2afd; - WFIFOW(fd,2) = 16 + sizeof(struct mmo_charstatus); - WFIFOL(fd,4) = RFIFOL(fd,2); - WFIFOL(fd,8) = auth_fifo[i].login_id2; - WFIFOL(fd,12) = (unsigned long)auth_fifo[i].connect_until_time; - mmo_char_fromsql(auth_fifo[i].char_id, char_dat, 1); - char_dat[0].sex = auth_fifo[i].sex; - memcpy(WFIFOP(fd,16), &char_dat[0], sizeof(struct mmo_charstatus)); - WFIFOSET(fd, WFIFOW(fd,2)); - //printf("auth_fifo search success (auth #%d, account %d, character: %d).\n", i, RFIFOL(fd,2), RFIFOL(fd,6)); - break; - } - } - if (i == AUTH_FIFO_SIZE) { - WFIFOW(fd,0) = 0x2afe; - WFIFOL(fd,2) = RFIFOL(fd,2); - WFIFOSET(fd,6); -// printf("(AUTH request) auth_fifo search error!\n"); - } - RFIFOSKIP(fd,22); - break; - - // set MAP user - case 0x2aff: - if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - if (RFIFOW(fd,4) != server[id].users) - printf("map user: %d\n", RFIFOW(fd,4)); - server[id].users = RFIFOW(fd,4); - if(anti_freeze_enable) - server_freezeflag[id] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed - RFIFOSKIP(fd,RFIFOW(fd,2)); - break; - - // char saving - case 0x2b01: - i = 0; - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - //check account - sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'",char_db, RFIFOL(fd,4),RFIFOL(fd,8)); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - if (sql_res) { - sql_row = mysql_fetch_row(sql_res); - if (sql_row) - i = atoi(sql_row[0]); - } - mysql_free_result(sql_res); - - if (i == 1) { - memcpy(&char_dat[0], RFIFOP(fd,12), sizeof(struct mmo_charstatus)); - mmo_char_tosql(RFIFOL(fd,8), char_dat); - //save to DB - } - RFIFOSKIP(fd,RFIFOW(fd,2)); - break; - - // req char selection - case 0x2b02: - if (RFIFOREST(fd) < 18) - return 0; - - if (auth_fifo_pos >= AUTH_FIFO_SIZE) - auth_fifo_pos = 0; - -// printf("(charselect) auth_fifo set %d - account_id:%08x login_id1:%08x\n", auth_fifo_pos, RFIFOL(fd, 2), RFIFOL(fd, 6)); - auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd, 2); - auth_fifo[auth_fifo_pos].char_id = 0; - auth_fifo[auth_fifo_pos].login_id1 = RFIFOL(fd, 6); - auth_fifo[auth_fifo_pos].login_id2 = RFIFOL(fd,10); - auth_fifo[auth_fifo_pos].delflag = 2; - auth_fifo[auth_fifo_pos].char_pos = 0; - auth_fifo[auth_fifo_pos].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server) - auth_fifo[auth_fifo_pos].ip = RFIFOL(fd,14); - auth_fifo_pos++; - - WFIFOW(fd, 0) = 0x2b03; - WFIFOL(fd, 2) = RFIFOL(fd, 2); - WFIFOB(fd, 6) = 0; - WFIFOSET(fd, 7); - - RFIFOSKIP(fd, 18); - break; - - // request "change map server" - case 0x2b05: - if (RFIFOREST(fd) < 49) - return 0; - - if (auth_fifo_pos >= AUTH_FIFO_SIZE) - auth_fifo_pos = 0; - - WFIFOW(fd, 0) = 0x2b06; - memcpy(WFIFOP(fd,2), RFIFOP(fd,2), 42); -// printf("(map change) auth_fifo set %d - account_id:%08x login_id1:%08x\n", auth_fifo_pos, RFIFOL(fd, 2), RFIFOL(fd, 6)); - auth_fifo[auth_fifo_pos].account_id = RFIFOL(fd, 2); - auth_fifo[auth_fifo_pos].login_id1 = RFIFOL(fd, 6); - auth_fifo[auth_fifo_pos].login_id2 = RFIFOL(fd,10); - auth_fifo[auth_fifo_pos].char_id = RFIFOL(fd,14); - auth_fifo[auth_fifo_pos].delflag = 0; - auth_fifo[auth_fifo_pos].sex = RFIFOB(fd,44); - auth_fifo[auth_fifo_pos].ip = RFIFOL(fd,45); - - sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'", char_db, RFIFOL(fd,2), RFIFOL(fd,14)); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - - if (( sql_row = mysql_fetch_row(sql_res))) { - i = atoi(sql_row[0]); - mysql_free_result(sql_res); - - auth_fifo[auth_fifo_pos].char_pos = auth_fifo[auth_fifo_pos].char_id; - auth_fifo_pos++; - - WFIFOL(fd,6) = 0; - break; - } - if (i == 0) - WFIFOW(fd,6) = 1; - - WFIFOSET(fd,44); - RFIFOSKIP(fd,49); - break; - - // char name check - case 0x2b08: - if (RFIFOREST(fd) < 6) - return 0; - - sprintf(tmp_sql, "SELECT `name` FROM `%s` WHERE `char_id`='%d'", char_db, RFIFOL(fd,2)); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - - sql_row = mysql_fetch_row(sql_res); - - WFIFOW(fd,0) = 0x2b09; - WFIFOL(fd,2) = RFIFOL(fd,2); - - if (sql_row) - memcpy(WFIFOP(fd,6), sql_row[0], 24); - else - memcpy(WFIFOP(fd,6), unknown_char_name, 24); - mysql_free_result(sql_res); - - WFIFOSET(fd,30); - - RFIFOSKIP(fd,6); - break; + (!check_ip_flag || auth_fifo[i].ip == RFIFOL (fd, 18)) + && !auth_fifo[i].delflag) + { + auth_fifo[i].delflag = 1; + WFIFOW (fd, 0) = 0x2afd; + WFIFOW (fd, 2) = 16 + sizeof (struct mmo_charstatus); + WFIFOL (fd, 4) = RFIFOL (fd, 2); + WFIFOL (fd, 8) = auth_fifo[i].login_id2; + WFIFOL (fd, 12) = + (unsigned long) auth_fifo[i].connect_until_time; + mmo_char_fromsql (auth_fifo[i].char_id, char_dat, 1); + char_dat[0].sex = auth_fifo[i].sex; + memcpy (WFIFOP (fd, 16), &char_dat[0], + sizeof (struct mmo_charstatus)); + WFIFOSET (fd, WFIFOW (fd, 2)); + //printf("auth_fifo search success (auth #%d, account %d, character: %d).\n", i, RFIFOL(fd,2), RFIFOL(fd,6)); + break; + } + } + if (i == AUTH_FIFO_SIZE) + { + WFIFOW (fd, 0) = 0x2afe; + WFIFOL (fd, 2) = RFIFOL (fd, 2); + WFIFOSET (fd, 6); +// printf("(AUTH request) auth_fifo search error!\n"); + } + RFIFOSKIP (fd, 22); + break; + + // set MAP user + case 0x2aff: + if (RFIFOREST (fd) < 6 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + if (RFIFOW (fd, 4) != server[id].users) + printf ("map user: %d\n", RFIFOW (fd, 4)); + server[id].users = RFIFOW (fd, 4); + if (anti_freeze_enable) + server_freezeflag[id] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed + RFIFOSKIP (fd, RFIFOW (fd, 2)); + break; + + // char saving + case 0x2b01: + i = 0; + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + //check account + sprintf (tmp_sql, + "SELECT count(*) FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'", + char_db, RFIFOL (fd, 4), RFIFOL (fd, 8)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + sql_row = mysql_fetch_row (sql_res); + if (sql_row) + i = atoi (sql_row[0]); + } + mysql_free_result (sql_res); + + if (i == 1) + { + memcpy (&char_dat[0], RFIFOP (fd, 12), + sizeof (struct mmo_charstatus)); + mmo_char_tosql (RFIFOL (fd, 8), char_dat); + //save to DB + } + RFIFOSKIP (fd, RFIFOW (fd, 2)); + break; + + // req char selection + case 0x2b02: + if (RFIFOREST (fd) < 18) + return 0; + + if (auth_fifo_pos >= AUTH_FIFO_SIZE) + auth_fifo_pos = 0; + +// printf("(charselect) auth_fifo set %d - account_id:%08x login_id1:%08x\n", auth_fifo_pos, RFIFOL(fd, 2), RFIFOL(fd, 6)); + auth_fifo[auth_fifo_pos].account_id = RFIFOL (fd, 2); + auth_fifo[auth_fifo_pos].char_id = 0; + auth_fifo[auth_fifo_pos].login_id1 = RFIFOL (fd, 6); + auth_fifo[auth_fifo_pos].login_id2 = RFIFOL (fd, 10); + auth_fifo[auth_fifo_pos].delflag = 2; + auth_fifo[auth_fifo_pos].char_pos = 0; + auth_fifo[auth_fifo_pos].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server) + auth_fifo[auth_fifo_pos].ip = RFIFOL (fd, 14); + auth_fifo_pos++; + + WFIFOW (fd, 0) = 0x2b03; + WFIFOL (fd, 2) = RFIFOL (fd, 2); + WFIFOB (fd, 6) = 0; + WFIFOSET (fd, 7); + + RFIFOSKIP (fd, 18); + break; + + // request "change map server" + case 0x2b05: + if (RFIFOREST (fd) < 49) + return 0; + + if (auth_fifo_pos >= AUTH_FIFO_SIZE) + auth_fifo_pos = 0; + + WFIFOW (fd, 0) = 0x2b06; + memcpy (WFIFOP (fd, 2), RFIFOP (fd, 2), 42); +// printf("(map change) auth_fifo set %d - account_id:%08x login_id1:%08x\n", auth_fifo_pos, RFIFOL(fd, 2), RFIFOL(fd, 6)); + auth_fifo[auth_fifo_pos].account_id = RFIFOL (fd, 2); + auth_fifo[auth_fifo_pos].login_id1 = RFIFOL (fd, 6); + auth_fifo[auth_fifo_pos].login_id2 = RFIFOL (fd, 10); + auth_fifo[auth_fifo_pos].char_id = RFIFOL (fd, 14); + auth_fifo[auth_fifo_pos].delflag = 0; + auth_fifo[auth_fifo_pos].sex = RFIFOB (fd, 44); + auth_fifo[auth_fifo_pos].ip = RFIFOL (fd, 45); + + sprintf (tmp_sql, + "SELECT count(*) FROM `%s` WHERE `account_id` = '%d' AND `char_id`='%d'", + char_db, RFIFOL (fd, 2), RFIFOL (fd, 14)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + + if ((sql_row = mysql_fetch_row (sql_res))) + { + i = atoi (sql_row[0]); + mysql_free_result (sql_res); + + auth_fifo[auth_fifo_pos].char_pos = + auth_fifo[auth_fifo_pos].char_id; + auth_fifo_pos++; + + WFIFOL (fd, 6) = 0; + break; + } + if (i == 0) + WFIFOW (fd, 6) = 1; + + WFIFOSET (fd, 44); + RFIFOSKIP (fd, 49); + break; + + // char name check + case 0x2b08: + if (RFIFOREST (fd) < 6) + return 0; + + sprintf (tmp_sql, + "SELECT `name` FROM `%s` WHERE `char_id`='%d'", + char_db, RFIFOL (fd, 2)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + + sql_row = mysql_fetch_row (sql_res); + + WFIFOW (fd, 0) = 0x2b09; + WFIFOL (fd, 2) = RFIFOL (fd, 2); + + if (sql_row) + memcpy (WFIFOP (fd, 6), sql_row[0], 24); + else + memcpy (WFIFOP (fd, 6), unknown_char_name, 24); + mysql_free_result (sql_res); + + WFIFOSET (fd, 30); + + RFIFOSKIP (fd, 6); + break; /* // I want become GM - fuck! case 0x2b0a: @@ -1718,719 +2135,957 @@ int parse_frommap(int fd) { break; */ - // account_reg保存要求 - case 0x2b10: - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - { - struct global_reg reg[ACCOUNT_REG2_NUM]; - int j,p,acc; - acc=RFIFOL(fd,4); - for(p=8,j=0;p<RFIFOW(fd,2) && j<ACCOUNT_REG2_NUM;p+=36,j++){ - memcpy(reg[j].str,RFIFOP(fd,p),32); - reg[j].value=RFIFOL(fd,p+32); - } - // set_account_reg2(acc,j,reg); - // loginサーバーへ送る - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd, 0) = 0x2728; - memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), RFIFOW(fd,2)); - WFIFOSET(login_fd, WFIFOW(login_fd,2)); - } - // ワールドへの同垢ログインがなければmapサーバーに送る必要はない - //memcpy(buf,RFIFOP(fd,0),RFIFOW(fd,2)); - //WBUFW(buf,0)=0x2b11; - //mapif_sendall(buf,WBUFW(buf,2)); - RFIFOSKIP(fd,RFIFOW(fd,2)); -// printf("char: save_account_reg (from map)\n"); - } - break; - - // Map server send information to change an email of an account -> login-server - case 0x2b0c: - if (RFIFOREST(fd) < 86) - return 0; - if (login_fd > 0) { // don't send request if no login-server - memcpy(WFIFOP(login_fd,0), RFIFOP(fd,0), 86); // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B - WFIFOW(login_fd,0) = 0x2722; - WFIFOSET(login_fd, 86); - } - RFIFOSKIP(fd, 86); - break; - - // Receiving from map-server a status change resquest. Transmission to login-server (by Yor) - case 0x2b0e: - if (RFIFOREST(fd) < 44) - return 0; - { - char character_name[24]; - int acc = RFIFOL(fd,2); // account_id of who ask (-1 if nobody) - memcpy(character_name, RFIFOP(fd,6), 24); - character_name[sizeof(character_name) -1] = '\0'; - // prepare answer - WFIFOW(fd,0) = 0x2b0f; // answer - WFIFOL(fd,2) = acc; // who want do operation - WFIFOW(fd,30) = RFIFOW(fd, 30); // type of operation: 1-block, 2-ban, 3-unblock, 4-unban - sprintf(tmp_sql, "SELECT `account_id`,`name` FROM `%s` WHERE `name` = '%s'",char_db, character_name); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (select `char`)- %s\n", mysql_error(&mysql_handle)); - } - - sql_res = mysql_store_result(&mysql_handle); - - if (sql_res) { - if (mysql_num_rows(sql_res)) { - sql_row = mysql_fetch_row(sql_res); - memcpy(WFIFOP(fd,6), sql_row[1], 24); // put correct name if found - WFIFOW(fd,32) = 0; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - switch(RFIFOW(fd, 30)) { - case 1: // block - if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) { - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd,0) = 0x2724; - WFIFOL(login_fd,2) = atoi(sql_row[0]); // account value - WFIFOL(login_fd,6) = 5; // status of the account - WFIFOSET(login_fd, 10); -// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 5); - } else - WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - } else - WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - break; - case 2: // ban - if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) { - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd, 0) = 0x2725; - WFIFOL(login_fd, 2) = atoi(sql_row[0]); // account value - WFIFOW(login_fd, 6) = RFIFOW(fd,32); // year - WFIFOW(login_fd, 8) = RFIFOW(fd,34); // month - WFIFOW(login_fd,10) = RFIFOW(fd,36); // day - WFIFOW(login_fd,12) = RFIFOW(fd,38); // hour - WFIFOW(login_fd,14) = RFIFOW(fd,40); // minute - WFIFOW(login_fd,16) = RFIFOW(fd,42); // second - WFIFOSET(login_fd,18); -// printf("char : status -> login: account %d, ban: %dy %dm %dd %dh %dmn %ds\n", -// char_dat[i].account_id, (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), (short)RFIFOW(fd,38), (short)RFIFOW(fd,40), (short)RFIFOW(fd,42)); - } else - WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - } else - WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - break; - case 3: // unblock - if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) { - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd,0) = 0x2724; - WFIFOL(login_fd,2) = atoi(sql_row[0]); // account value - WFIFOL(login_fd,6) = 0; // status of the account - WFIFOSET(login_fd, 10); -// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 0); - } else - WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - } else - WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - break; - case 4: // unban - if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) { - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd, 0) = 0x272a; - WFIFOL(login_fd, 2) = atoi(sql_row[0]); // account value - WFIFOSET(login_fd, 6); -// printf("char : status -> login: account %d, unban request\n", char_dat[i].account_id); - } else - WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - } else - WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - break; - case 5: // changesex - if (acc == -1 || isGM(acc) >= isGM(atoi(sql_row[0]))) { - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd, 0) = 0x2727; - WFIFOL(login_fd, 2) = atoi(sql_row[0]); // account value - WFIFOSET(login_fd, 6); -// printf("char : status -> login: account %d, change sex request\n", char_dat[i].account_id); - } else - WFIFOW(fd,32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - } else - WFIFOW(fd,32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - break; - } - } else { - // character name not found - memcpy(WFIFOP(fd,6), character_name, 24); - WFIFOW(fd,32) = 1; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline - } - // send answer if a player ask, not if the server ask - if (acc != -1) { - WFIFOSET(fd, 34); - } - } - } - RFIFOSKIP(fd, 44); - break; - - // Recieve rates [Wizputer] - case 0x2b16: - if (RFIFOREST(fd) < 6 || RFIFOREST(fd) < RFIFOW(fd,8)) - return 0; - sprintf(tmp_sql, "INSERT INTO `ragsrvinfo` SET `index`='%d',`name`='%s',`exp`='%d',`jexp`='%d',`drop`='%d',`motd`='%s'", - fd, server_name, RFIFOW(fd,2), RFIFOW(fd,4), RFIFOW(fd,6), RFIFOP(fd,10)); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - RFIFOSKIP(fd,RFIFOW(fd,8)); - break; - - // Character disconnected set online 0 [Wizputer] - case 0x2b17: - if (RFIFOREST(fd) < 6 ) - return 0; - //printf("Setting %d char offline\n",RFIFOL(fd,2)); - sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", char_db, RFIFOL(fd,2)); - if (mysql_query(&mysql_handle, tmp_sql)) - printf("DB server Error (update online `%s`)- %s\n", char_db, mysql_error(&mysql_handle)); - RFIFOSKIP(fd,6); - break; - - default: - // inter server - packet - { - int r = inter_parse_frommap(fd); - if (r == 1) break; // processed - if (r == 2) return 0; // need more packet - } - - // no inter server packet. no char server packet -> disconnect - printf("parse_frommap: unknown packet %x! \n", RFIFOW(fd,0)); - session[fd]->eof = 1; - return 0; - } - } - return 0; + // account_reg保存要求 + case 0x2b10: + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + { + struct global_reg reg[ACCOUNT_REG2_NUM]; + int j, p, acc; + acc = RFIFOL (fd, 4); + for (p = 8, j = 0; + p < RFIFOW (fd, 2) && j < ACCOUNT_REG2_NUM; + p += 36, j++) + { + memcpy (reg[j].str, RFIFOP (fd, p), 32); + reg[j].value = RFIFOL (fd, p + 32); + } + // set_account_reg2(acc,j,reg); + // loginサーバーへ送る + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x2728; + memcpy (WFIFOP (login_fd, 0), RFIFOP (fd, 0), + RFIFOW (fd, 2)); + WFIFOSET (login_fd, WFIFOW (login_fd, 2)); + } + // ワールドへの同垢ログインがなければmapサーバーに送る必要はない + //memcpy(buf,RFIFOP(fd,0),RFIFOW(fd,2)); + //WBUFW(buf,0)=0x2b11; + //mapif_sendall(buf,WBUFW(buf,2)); + RFIFOSKIP (fd, RFIFOW (fd, 2)); +// printf("char: save_account_reg (from map)\n"); + } + break; + + // Map server send information to change an email of an account -> login-server + case 0x2b0c: + if (RFIFOREST (fd) < 86) + return 0; + if (login_fd > 0) + { // don't send request if no login-server + memcpy (WFIFOP (login_fd, 0), RFIFOP (fd, 0), 86); // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B + WFIFOW (login_fd, 0) = 0x2722; + WFIFOSET (login_fd, 86); + } + RFIFOSKIP (fd, 86); + break; + + // Receiving from map-server a status change resquest. Transmission to login-server (by Yor) + case 0x2b0e: + if (RFIFOREST (fd) < 44) + return 0; + { + char character_name[24]; + int acc = RFIFOL (fd, 2); // account_id of who ask (-1 if nobody) + memcpy (character_name, RFIFOP (fd, 6), 24); + character_name[sizeof (character_name) - 1] = '\0'; + // prepare answer + WFIFOW (fd, 0) = 0x2b0f; // answer + WFIFOL (fd, 2) = acc; // who want do operation + WFIFOW (fd, 30) = RFIFOW (fd, 30); // type of operation: 1-block, 2-ban, 3-unblock, 4-unban + sprintf (tmp_sql, + "SELECT `account_id`,`name` FROM `%s` WHERE `name` = '%s'", + char_db, character_name); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `char`)- %s\n", + mysql_error (&mysql_handle)); + } + + sql_res = mysql_store_result (&mysql_handle); + + if (sql_res) + { + if (mysql_num_rows (sql_res)) + { + sql_row = mysql_fetch_row (sql_res); + memcpy (WFIFOP (fd, 6), sql_row[1], 24); // put correct name if found + WFIFOW (fd, 32) = 0; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + switch (RFIFOW (fd, 30)) + { + case 1: // block + if (acc == -1 + || isGM (acc) >= + isGM (atoi (sql_row[0]))) + { + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x2724; + WFIFOL (login_fd, 2) = atoi (sql_row[0]); // account value + WFIFOL (login_fd, 6) = 5; // status of the account + WFIFOSET (login_fd, 10); +// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 5); + } + else + WFIFOW (fd, 32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + } + else + WFIFOW (fd, 32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + break; + case 2: // ban + if (acc == -1 + || isGM (acc) >= + isGM (atoi (sql_row[0]))) + { + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x2725; + WFIFOL (login_fd, 2) = atoi (sql_row[0]); // account value + WFIFOW (login_fd, 6) = RFIFOW (fd, 32); // year + WFIFOW (login_fd, 8) = RFIFOW (fd, 34); // month + WFIFOW (login_fd, 10) = RFIFOW (fd, 36); // day + WFIFOW (login_fd, 12) = RFIFOW (fd, 38); // hour + WFIFOW (login_fd, 14) = RFIFOW (fd, 40); // minute + WFIFOW (login_fd, 16) = RFIFOW (fd, 42); // second + WFIFOSET (login_fd, 18); +// printf("char : status -> login: account %d, ban: %dy %dm %dd %dh %dmn %ds\n", +// char_dat[i].account_id, (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), (short)RFIFOW(fd,38), (short)RFIFOW(fd,40), (short)RFIFOW(fd,42)); + } + else + WFIFOW (fd, 32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + } + else + WFIFOW (fd, 32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + break; + case 3: // unblock + if (acc == -1 + || isGM (acc) >= + isGM (atoi (sql_row[0]))) + { + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x2724; + WFIFOL (login_fd, 2) = atoi (sql_row[0]); // account value + WFIFOL (login_fd, 6) = 0; // status of the account + WFIFOSET (login_fd, 10); +// printf("char : status -> login: account %d, status: %d \n", char_dat[i].account_id, 0); + } + else + WFIFOW (fd, 32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + } + else + WFIFOW (fd, 32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + break; + case 4: // unban + if (acc == -1 + || isGM (acc) >= + isGM (atoi (sql_row[0]))) + { + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x272a; + WFIFOL (login_fd, 2) = atoi (sql_row[0]); // account value + WFIFOSET (login_fd, 6); +// printf("char : status -> login: account %d, unban request\n", char_dat[i].account_id); + } + else + WFIFOW (fd, 32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + } + else + WFIFOW (fd, 32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + break; + case 5: // changesex + if (acc == -1 + || isGM (acc) >= + isGM (atoi (sql_row[0]))) + { + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x2727; + WFIFOL (login_fd, 2) = atoi (sql_row[0]); // account value + WFIFOSET (login_fd, 6); +// printf("char : status -> login: account %d, change sex request\n", char_dat[i].account_id); + } + else + WFIFOW (fd, 32) = 3; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + } + else + WFIFOW (fd, 32) = 2; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + break; + } + } + else + { + // character name not found + memcpy (WFIFOP (fd, 6), character_name, 24); + WFIFOW (fd, 32) = 1; // answer: 0-login-server resquest done, 1-player not found, 2-gm level too low, 3-login-server offline + } + // send answer if a player ask, not if the server ask + if (acc != -1) + { + WFIFOSET (fd, 34); + } + } + } + RFIFOSKIP (fd, 44); + break; + + // Recieve rates [Wizputer] + case 0x2b16: + if (RFIFOREST (fd) < 6 || RFIFOREST (fd) < RFIFOW (fd, 8)) + return 0; + sprintf (tmp_sql, + "INSERT INTO `ragsrvinfo` SET `index`='%d',`name`='%s',`exp`='%d',`jexp`='%d',`drop`='%d',`motd`='%s'", + fd, server_name, RFIFOW (fd, 2), RFIFOW (fd, 4), + RFIFOW (fd, 6), RFIFOP (fd, 10)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + RFIFOSKIP (fd, RFIFOW (fd, 8)); + break; + + // Character disconnected set online 0 [Wizputer] + case 0x2b17: + if (RFIFOREST (fd) < 6) + return 0; + //printf("Setting %d char offline\n",RFIFOL(fd,2)); + sprintf (tmp_sql, + "UPDATE `%s` SET `online`='0' WHERE `char_id`='%d'", + char_db, RFIFOL (fd, 2)); + if (mysql_query (&mysql_handle, tmp_sql)) + printf ("DB server Error (update online `%s`)- %s\n", + char_db, mysql_error (&mysql_handle)); + RFIFOSKIP (fd, 6); + break; + + default: + // inter server - packet + { + int r = inter_parse_frommap (fd); + if (r == 1) + break; // processed + if (r == 2) + return 0; // need more packet + } + + // no inter server packet. no char server packet -> disconnect + printf ("parse_frommap: unknown packet %x! \n", + RFIFOW (fd, 0)); + session[fd]->eof = 1; + return 0; + } + } + return 0; } -int search_mapserver(char *map) { - int i, j; - char temp_map[16]; - int temp_map_len; - -// printf("Searching the map-server for map '%s'... ", map); - strncpy(temp_map, map, sizeof(temp_map)); - temp_map[sizeof(temp_map)-1] = '\0'; - if (strchr(temp_map, '.') != NULL) - temp_map[strchr(temp_map, '.') - temp_map + 1] = '\0'; // suppress the '.gat', but conserve the '.' to be sure of the name of the map - - temp_map_len = strlen(temp_map); - for(i = 0; i < MAX_MAP_SERVERS; i++) - if (server_fd[i] >= 0) - for (j = 0; server[i].map[j][0]; j++) - //printf("%s : %s = %d\n", server[i].map[j], map, strncmp(server[i].map[j], temp_map, temp_map_len)); - if (strncmp(server[i].map[j], temp_map, temp_map_len) == 0) { -// printf("found -> server #%d.\n", i); - return i; - } - -// printf("not found.\n"); - return -1; +int search_mapserver (char *map) +{ + int i, j; + char temp_map[16]; + int temp_map_len; + +// printf("Searching the map-server for map '%s'... ", map); + strncpy (temp_map, map, sizeof (temp_map)); + temp_map[sizeof (temp_map) - 1] = '\0'; + if (strchr (temp_map, '.') != NULL) + temp_map[strchr (temp_map, '.') - temp_map + 1] = '\0'; // suppress the '.gat', but conserve the '.' to be sure of the name of the map + + temp_map_len = strlen (temp_map); + for (i = 0; i < MAX_MAP_SERVERS; i++) + if (server_fd[i] >= 0) + for (j = 0; server[i].map[j][0]; j++) + //printf("%s : %s = %d\n", server[i].map[j], map, strncmp(server[i].map[j], temp_map, temp_map_len)); + if (strncmp (server[i].map[j], temp_map, temp_map_len) == 0) + { +// printf("found -> server #%d.\n", i); + return i; + } + +// printf("not found.\n"); + return -1; } -int char_mapif_init(int fd) { - return inter_mapif_init(fd); +int char_mapif_init (int fd) +{ + return inter_mapif_init (fd); } //----------------------------------------------------- // Test to know if an IP come from LAN or WAN. by [Yor] //----------------------------------------------------- -int lan_ip_check(unsigned char *p){ - int i; - int lancheck = 1; - int subneti[4]; - unsigned int k0, k1, k2, k3; - - sscanf(lan_map_ip, "%d.%d.%d.%d", &k0, &k1, &k2, &k3); - subneti[0] = k0; subneti[1] = k1; subneti[2] = k2; subneti[3] = k3; - -// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n", -// p[0], p[1], p[2], p[3], -// subneti[0], subneti[1], subneti[2], subneti[3], -// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]); - for(i = 0; i < 4; i++) { - if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) { - lancheck = 0; - break; - } - } -// printf("LAN test (result): %s source\033[0m.\n", (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN"); - return lancheck; +int lan_ip_check (unsigned char *p) +{ + int i; + int lancheck = 1; + int subneti[4]; + unsigned int k0, k1, k2, k3; + + sscanf (lan_map_ip, "%d.%d.%d.%d", &k0, &k1, &k2, &k3); + subneti[0] = k0; + subneti[1] = k1; + subneti[2] = k2; + subneti[3] = k3; + +// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n", +// p[0], p[1], p[2], p[3], +// subneti[0], subneti[1], subneti[2], subneti[3], +// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]); + for (i = 0; i < 4; i++) + { + if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) + { + lancheck = 0; + break; + } + } +// printf("LAN test (result): %s source\033[0m.\n", (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN"); + return lancheck; } -int parse_char(int fd) { - int i, ch = 0; - char email[40]; - struct char_session_data *sd; - unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; - - if(login_fd < 0 || session[fd]->eof) { - if (fd == login_fd) - login_fd = -1; - close(fd); - delete_session(fd); - return 0; - } - - sd = session[fd]->session_data; - - while(RFIFOREST(fd) >= 2) { -// if (RFIFOW(fd, 0) < 30000) -// printf("parse_char : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0)); - - switch(RFIFOW(fd, 0)) { - case 0x20b: //20040622 encryption ragexe correspondence - if (RFIFOREST(fd) < 19) - return 0; - RFIFOSKIP(fd,19); - break; - - case 0x65: // request to connect - printf("request connect - account_id:%d/login_id1:%d/login_id2:%d\n", RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10)); - if (RFIFOREST(fd) < 17) - return 0; - { +int parse_char (int fd) +{ + int i, ch = 0; + char email[40]; + struct char_session_data *sd; + unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; + + if (login_fd < 0 || session[fd]->eof) + { + if (fd == login_fd) + login_fd = -1; + close (fd); + delete_session (fd); + return 0; + } + + sd = session[fd]->session_data; + + while (RFIFOREST (fd) >= 2) + { +// if (RFIFOW(fd, 0) < 30000) +// printf("parse_char : %d %d %x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0)); + + switch (RFIFOW (fd, 0)) + { + case 0x20b: //20040622 encryption ragexe correspondence + if (RFIFOREST (fd) < 19) + return 0; + RFIFOSKIP (fd, 19); + break; + + case 0x65: // request to connect + printf + ("request connect - account_id:%d/login_id1:%d/login_id2:%d\n", + RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10)); + if (RFIFOREST (fd) < 17) + return 0; + { /*removed from isGM setup if (isGM(RFIFOL(fd,2))) printf("Account Logged On; Account ID: %d (GM level %d).\n", RFIFOL(fd,2), isGM(RFIFOL(fd,2))); else printf("Account Logged On; Account ID: %d.\n", RFIFOL(fd,2)); */ - if (sd == NULL) { - CREATE(session[fd]->session_data, struct char_session_data, 1); - sd = session[fd]->session_data; - sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server) - } - sd->account_id = RFIFOL(fd, 2); - sd->login_id1 = RFIFOL(fd, 6); - sd->login_id2 = RFIFOL(fd, 10); - sd->sex = RFIFOB(fd, 16); - - WFIFOL(fd, 0) = RFIFOL(fd, 2); - WFIFOSET(fd, 4); - - for(i = 0; i < AUTH_FIFO_SIZE; i++) { - if (auth_fifo[i].account_id == sd->account_id && - auth_fifo[i].login_id1 == sd->login_id1 && + if (sd == NULL) + { + CREATE (session[fd]->session_data, + struct char_session_data, 1); + sd = session[fd]->session_data; + sd->connect_until_time = 0; // unknow or illimited (not displaying on map-server) + } + sd->account_id = RFIFOL (fd, 2); + sd->login_id1 = RFIFOL (fd, 6); + sd->login_id2 = RFIFOL (fd, 10); + sd->sex = RFIFOB (fd, 16); + + WFIFOL (fd, 0) = RFIFOL (fd, 2); + WFIFOSET (fd, 4); + + for (i = 0; i < AUTH_FIFO_SIZE; i++) + { + if (auth_fifo[i].account_id == sd->account_id && + auth_fifo[i].login_id1 == sd->login_id1 && #if CMP_AUTHFIFO_LOGIN2 != 0 - auth_fifo[i].login_id2 == sd->login_id2 && // relate to the versions higher than 18 + auth_fifo[i].login_id2 == sd->login_id2 && // relate to the versions higher than 18 #endif - (!check_ip_flag || auth_fifo[i].ip == session[fd]->client_addr.sin_addr.s_addr) && - auth_fifo[i].delflag == 2) { - auth_fifo[i].delflag = 1; - - if (max_connect_user == 0 || count_users() < max_connect_user) { - if (login_fd > 0) { // don't send request if no login-server - // request to login-server to obtain e-mail/time limit - WFIFOW(login_fd,0) = 0x2716; - WFIFOL(login_fd,2) = sd->account_id; - WFIFOSET(login_fd,6); - } - // send characters to player - mmo_char_send006b(fd, sd); - } else { - // refuse connection (over populated) - WFIFOW(fd,0) = 0x6c; - WFIFOW(fd,2) = 0; - WFIFOSET(fd,3); - } -// printf("connection request> set delflag 1(o:2)- account_id:%d/login_id1:%d(fifo_id:%d)\n", sd->account_id, sd->login_id1, i); - break; - } - } - if (i == AUTH_FIFO_SIZE) { - if (login_fd > 0) { // don't send request if no login-server - WFIFOW(login_fd,0) = 0x2712; // ask login-server to authentify an account - WFIFOL(login_fd,2) = sd->account_id; - WFIFOL(login_fd,6) = sd->login_id1; - WFIFOL(login_fd,10) = sd->login_id2; - WFIFOB(login_fd,14) = sd->sex; - WFIFOL(login_fd,15) = session[fd]->client_addr.sin_addr.s_addr; - WFIFOSET(login_fd,19); - } else { // if no login-server, we must refuse connection - WFIFOW(fd,0) = 0x6c; - WFIFOW(fd,2) = 0; - WFIFOSET(fd,3); - } - } - } - RFIFOSKIP(fd, 17); - break; - - case 0x66: // char select -// printf("0x66> request connect - account_id:%d/char_num:%d\n",sd->account_id,RFIFOB(fd, 2)); - if (RFIFOREST(fd) < 3) - return 0; - - sprintf(tmp_sql, "SELECT `char_id` FROM `%s` WHERE `account_id`='%d' AND `char_num`='%d'",char_db, sd->account_id, RFIFOB(fd, 2)); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - - sql_row = mysql_fetch_row(sql_res); - - if (sql_row) - mmo_char_fromsql(atoi(sql_row[0]), char_dat, 0); - else { - mysql_free_result(sql_res); - RFIFOSKIP(fd, 3); - break; - } - - sprintf(tmp_sql,"INSERT INTO `%s`(`time`, `account_id`,`char_num`,`name`) VALUES (NOW(), '%d', '%d', '%s')", - charlog_db, sd->account_id, RFIFOB(fd, 2), char_dat[0].name); - //query - if(mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - printf("(\033[1;64m%d\033[0m) char selected (\033[1;32m%d\033[0m) \033[1;32m%s\033[0m" RETCODE, sd->account_id, RFIFOB(fd, 2), char_dat[0].name); - - i = search_mapserver(char_dat[0].last_point.map); - - // if map is not found, we check major cities - if (i < 0) { - if ((i = search_mapserver("prontera.gat")) >= 0) { // check is done without 'gat'. - memcpy(char_dat[0].last_point.map, "prontera.gat", 16); - char_dat[0].last_point.x = 273; // savepoint coordonates - char_dat[0].last_point.y = 354; - } else if ((i = search_mapserver("geffen.gat")) >= 0) { // check is done without 'gat'. - memcpy(char_dat[0].last_point.map, "geffen.gat", 16); - char_dat[0].last_point.x = 120; // savepoint coordonates - char_dat[0].last_point.y = 100; - } else if ((i = search_mapserver("morocc.gat")) >= 0) { // check is done without 'gat'. - memcpy(char_dat[0].last_point.map, "morocc.gat", 16); - char_dat[0].last_point.x = 160; // savepoint coordonates - char_dat[0].last_point.y = 94; - } else if ((i = search_mapserver("alberta.gat")) >= 0) { // check is done without 'gat'. - memcpy(char_dat[0].last_point.map, "alberta.gat", 16); - char_dat[0].last_point.x = 116; // savepoint coordonates - char_dat[0].last_point.y = 57; - } else if ((i = search_mapserver("payon.gat")) >= 0) { // check is done without 'gat'. - memcpy(char_dat[0].last_point.map, "payon.gat", 16); - char_dat[0].last_point.x = 87; // savepoint coordonates - char_dat[0].last_point.y = 117; - } else if ((i = search_mapserver("izlude.gat")) >= 0) { // check is done without 'gat'. - memcpy(char_dat[0].last_point.map, "izlude.gat", 16); - char_dat[0].last_point.x = 94; // savepoint coordonates - char_dat[0].last_point.y = 103; - } else { - int j; - // get first online server - i = 0; - for(j = 0; j < MAX_MAP_SERVERS; j++) - if (server_fd[j] >= 0 && server[j].map[0][0]) { - i = j; - printf("Map-server #%d found with a map: '%s'.\n", j, server[j].map[0]); - break; - } - // if no map-servers are connected, we send: server closed - if (j == MAX_MAP_SERVERS) { - WFIFOW(fd,0) = 0x81; - WFIFOL(fd,2) = 1; // 01 = Server closed - WFIFOSET(fd,3); - RFIFOSKIP(fd,3); - break; - } - } - } - WFIFOW(fd, 0) =0x71; - WFIFOL(fd, 2) =char_dat[0].char_id; - memcpy(WFIFOP(fd, 6), char_dat[0].last_point.map, 16); - //Lan check added by Kashy - if (lan_ip_check(p)) - WFIFOL(fd, 22) = inet_addr(lan_map_ip); - else - WFIFOL(fd, 22) = server[i].ip; - WFIFOW(fd, 26) = server[i].port; - WFIFOSET(fd, 28); - - if (auth_fifo_pos >= AUTH_FIFO_SIZE) { - auth_fifo_pos = 0; - } -// printf("auth_fifo set (auth_fifo_pos:%d) - account_id:%d char_id:%d login_id1:%d\n", auth_fifo_pos, sd->account_id, char_dat[0].char_id, sd->login_id1); - auth_fifo[auth_fifo_pos].account_id = sd->account_id; - auth_fifo[auth_fifo_pos].char_id = char_dat[0].char_id; - auth_fifo[auth_fifo_pos].login_id1 = sd->login_id1; - auth_fifo[auth_fifo_pos].login_id2 = sd->login_id2; - auth_fifo[auth_fifo_pos].delflag = 0; - //auth_fifo[auth_fifo_pos].char_pos = sd->found_char[ch]; - auth_fifo[auth_fifo_pos].char_pos = 0; - auth_fifo[auth_fifo_pos].sex = sd->sex; - auth_fifo[auth_fifo_pos].connect_until_time = sd->connect_until_time; - auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr; - auth_fifo_pos++; -// printf("0x66> end\n"); - RFIFOSKIP(fd, 3); - break; - - case 0x67: // make new -// printf("0x67>request make new char\n"); - if (RFIFOREST(fd) < 37) - return 0; - i = make_new_char_sql(fd, RFIFOP(fd, 2)); - if (i < 0) { - WFIFOW(fd, 0) = 0x6e; - WFIFOB(fd, 2) = 0x00; - WFIFOSET(fd, 3); - RFIFOSKIP(fd, 37); - break; - } - - WFIFOW(fd, 0) = 0x6d; - memset(WFIFOP(fd, 2), 0x00, 106); - - mmo_char_fromsql(i, char_dat, 0); - i = 0; - WFIFOL(fd, 2) = char_dat[i].char_id; - WFIFOL(fd,2+4) = char_dat[i].base_exp; - WFIFOL(fd,2+8) = char_dat[i].zeny; - WFIFOL(fd,2+12) = char_dat[i].job_exp; - WFIFOL(fd,2+16) = char_dat[i].job_level; - - WFIFOL(fd,2+28) = char_dat[i].karma; - WFIFOL(fd,2+32) = char_dat[i].manner; - - WFIFOW(fd,2+40) = 0x30; - WFIFOW(fd,2+42) = (char_dat[i].hp > 0x7fff) ? 0x7fff : char_dat[i].hp; - WFIFOW(fd,2+44) = (char_dat[i].max_hp > 0x7fff) ? 0x7fff : char_dat[i].max_hp; - WFIFOW(fd,2+46) = (char_dat[i].sp > 0x7fff) ? 0x7fff : char_dat[i].sp; - WFIFOW(fd,2+48) = (char_dat[i].max_sp > 0x7fff) ? 0x7fff : char_dat[i].max_sp; - WFIFOW(fd,2+50) = DEFAULT_WALK_SPEED; // char_dat[i].speed; - WFIFOW(fd,2+52) = char_dat[i].class; - WFIFOW(fd,2+54) = char_dat[i].hair; - - WFIFOW(fd,2+58) = char_dat[i].base_level; - WFIFOW(fd,2+60) = char_dat[i].skill_point; - - WFIFOW(fd,2+64) = char_dat[i].shield; - WFIFOW(fd,2+66) = char_dat[i].head_top; - WFIFOW(fd,2+68) = char_dat[i].head_mid; - WFIFOW(fd,2+70) = char_dat[i].hair_color; - - memcpy(WFIFOP(fd,2+74), char_dat[i].name, 24); - - WFIFOB(fd,2+98) = char_dat[i].str; - WFIFOB(fd,2+99) = char_dat[i].agi; - WFIFOB(fd,2+100) = char_dat[i].vit; - WFIFOB(fd,2+101) = char_dat[i].int_; - WFIFOB(fd,2+102) = char_dat[i].dex; - WFIFOB(fd,2+103) = char_dat[i].luk; - WFIFOB(fd,2+104) = char_dat[i].char_num; - - WFIFOSET(fd, 108); - RFIFOSKIP(fd, 37); - //to do - for(ch = 0; ch < 9; ch++) { - if (sd->found_char[ch] == -1) { - sd->found_char[ch] = char_dat[i].char_id; - break; - } - } - - case 0x68: // delete - if (RFIFOREST(fd) < 46) - return 0; - printf("\033[1;31m Request Char Del:\033[0m \033[1;32m%d\033[0m(\033[1;32m%d\033[0m)\n", sd->account_id, RFIFOL(fd, 2)); - memcpy(email, RFIFOP(fd,6), 40); - sprintf(tmp_sql, "SELECT `email` FROM `%s` WHERE `%s`='%d'",login_db, login_db_account_id, sd->account_id); - if (mysql_query(&lmysql_handle, tmp_sql)) { - printf("\033[1;31m DB server Error Delete Char data - %s \033[0m \n", mysql_error(&lmysql_handle)); - } - sql_res = mysql_store_result(&lmysql_handle); - if (sql_res) { - sql_row = mysql_fetch_row(sql_res); - if (strcmp(email,sql_row[0]) == 0) { - mysql_free_result(sql_res); - } else { - WFIFOW(fd, 0) = 0x70; - WFIFOB(fd, 2) = 0; - WFIFOSET(fd, 3); - RFIFOSKIP(fd, 46); - mysql_free_result(sql_res); - break; - } - } else { - WFIFOW(fd, 0) = 0x70; - WFIFOB(fd, 2) = 0; - WFIFOSET(fd, 3); - RFIFOSKIP(fd, 46); - mysql_free_result(sql_res); - break; - } - sprintf(tmp_sql, "SELECT `name`,`partner_id` FROM `%s` WHERE `char_id`='%d'",char_db, RFIFOL(fd,2)); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - if(sql_res) - sql_row = mysql_fetch_row(sql_res); - - if (sql_res && sql_row[0]) { - //delete char from SQL - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",pet_db, RFIFOL(fd, 2)); - if(mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",inventory_db, RFIFOL(fd, 2)); - if(mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",cart_db, RFIFOL(fd, 2)); - if(mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",memo_db, RFIFOL(fd, 2)); - if(mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",skill_db, RFIFOL(fd, 2)); - if(mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",char_db, RFIFOL(fd, 2)); - if(mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - //Divorce [Wizputer] - if (sql_row[1] != 0) { - char buf[64]; - sprintf(tmp_sql,"UPDATE `%s` SET `partner_id`='0' WHERE `char_id`='%d'",char_db,atoi(sql_row[1])); - if(mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sprintf(tmp_sql,"DELETE FROM `%s` WHERE (`nameid`='%d' OR `nameid`='%d') AND `char_id`='%d'",inventory_db,WEDDING_RING_M,WEDDING_RING_F,atoi(sql_row[1])); - if(mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - WBUFW(buf,0) = 0x2b12; - WBUFL(buf,2) = atoi(sql_row[0]); - WBUFL(buf,6) = atoi(sql_row[1]); - mapif_sendall(buf,10); - } - // Also delete info from guildtables. - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",guild_member_db, RFIFOL(fd,2)); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - sprintf(tmp_sql, "SELECT `guild_id` FROM `%s` WHERE `master` = '%s'", guild_db, sql_row[0]); - - if (mysql_query(&mysql_handle, tmp_sql) == 0) { - sql_res = mysql_store_result(&mysql_handle); - - if (sql_res != NULL) { - if (mysql_num_rows(sql_res) != 0) { - sql_row = mysql_fetch_row(sql_res); - - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_db, atoi(sql_row[0])); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_member_db, atoi(sql_row[0])); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_castle_db, atoi(sql_row[0])); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_storage_db, atoi(sql_row[0])); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d' OR `alliance_id` = '%d'", guild_alliance_db, atoi(sql_row[0]), atoi(sql_row[0])); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_position_db, atoi(sql_row[0])); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_skill_db, atoi(sql_row[0])); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `guild_id` = '%d'", guild_expulsion_db, atoi(sql_row[0])); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - mysql_free_result(sql_res); - } - } else { - if (mysql_errno(&mysql_handle) != 0) { - printf("Database server error: %s\n", mysql_error(&mysql_handle)); - } - } - } else { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - } - - for(i = 0; i < 9; i++) { - printf("char comp: %d - %d (%d)\n", sd->found_char[i], RFIFOL(fd, 2), sd->account_id); - if (sd->found_char[i] == RFIFOL(fd, 2)) { - for(ch = i; ch < 9-1; ch++) - sd->found_char[ch] = sd->found_char[ch+1]; - sd->found_char[8] = -1; - break; - } - } - if (i == 9) { // reject - WFIFOW(fd, 0) = 0x70; - WFIFOB(fd, 2) = 0; - WFIFOSET(fd, 3); - } else { // deleted! - WFIFOW(fd, 0) = 0x6f; - WFIFOSET(fd, 2); - } - RFIFOSKIP(fd, 46); - break; - - case 0x2af8: // login as map-server - if (RFIFOREST(fd) < 60) - return 0; - WFIFOW(fd, 0) = 0x2af9; - for(i = 0; i < MAX_MAP_SERVERS; i++) { - if (server_fd[i] < 0) - break; - } - if (i == MAX_MAP_SERVERS || strcmp(RFIFOP(fd,2), userid) || strcmp(RFIFOP(fd,26), passwd)) { - WFIFOB(fd,2) = 3; - WFIFOSET(fd, 3); - } else { -// int len; - WFIFOB(fd,2) = 0; - WFIFOSET(fd, 3); - session[fd]->func_parse = parse_frommap; - server_fd[i] = fd; - if(anti_freeze_enable) - server_freezeflag[i] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed - server[i].ip = RFIFOL(fd, 54); - server[i].port = RFIFOW(fd, 58); - server[i].users = 0; - memset(server[i].map, 0, sizeof(server[i].map)); - realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); - char_mapif_init(fd); - // send gm acccounts level to map-servers + (!check_ip_flag + || auth_fifo[i].ip == + session[fd]->client_addr.sin_addr.s_addr) + && auth_fifo[i].delflag == 2) + { + auth_fifo[i].delflag = 1; + + if (max_connect_user == 0 + || count_users () < max_connect_user) + { + if (login_fd > 0) + { // don't send request if no login-server + // request to login-server to obtain e-mail/time limit + WFIFOW (login_fd, 0) = 0x2716; + WFIFOL (login_fd, 2) = sd->account_id; + WFIFOSET (login_fd, 6); + } + // send characters to player + mmo_char_send006b (fd, sd); + } + else + { + // refuse connection (over populated) + WFIFOW (fd, 0) = 0x6c; + WFIFOW (fd, 2) = 0; + WFIFOSET (fd, 3); + } +// printf("connection request> set delflag 1(o:2)- account_id:%d/login_id1:%d(fifo_id:%d)\n", sd->account_id, sd->login_id1, i); + break; + } + } + if (i == AUTH_FIFO_SIZE) + { + if (login_fd > 0) + { // don't send request if no login-server + WFIFOW (login_fd, 0) = 0x2712; // ask login-server to authentify an account + WFIFOL (login_fd, 2) = sd->account_id; + WFIFOL (login_fd, 6) = sd->login_id1; + WFIFOL (login_fd, 10) = sd->login_id2; + WFIFOB (login_fd, 14) = sd->sex; + WFIFOL (login_fd, 15) = + session[fd]->client_addr.sin_addr.s_addr; + WFIFOSET (login_fd, 19); + } + else + { // if no login-server, we must refuse connection + WFIFOW (fd, 0) = 0x6c; + WFIFOW (fd, 2) = 0; + WFIFOSET (fd, 3); + } + } + } + RFIFOSKIP (fd, 17); + break; + + case 0x66: // char select +// printf("0x66> request connect - account_id:%d/char_num:%d\n",sd->account_id,RFIFOB(fd, 2)); + if (RFIFOREST (fd) < 3) + return 0; + + sprintf (tmp_sql, + "SELECT `char_id` FROM `%s` WHERE `account_id`='%d' AND `char_num`='%d'", + char_db, sd->account_id, RFIFOB (fd, 2)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + + sql_row = mysql_fetch_row (sql_res); + + if (sql_row) + mmo_char_fromsql (atoi (sql_row[0]), char_dat, 0); + else + { + mysql_free_result (sql_res); + RFIFOSKIP (fd, 3); + break; + } + + sprintf (tmp_sql, + "INSERT INTO `%s`(`time`, `account_id`,`char_num`,`name`) VALUES (NOW(), '%d', '%d', '%s')", + charlog_db, sd->account_id, RFIFOB (fd, 2), + char_dat[0].name); + //query + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + printf + ("(\033[1;64m%d\033[0m) char selected (\033[1;32m%d\033[0m) \033[1;32m%s\033[0m" + RETCODE, sd->account_id, RFIFOB (fd, 2), + char_dat[0].name); + + i = search_mapserver (char_dat[0].last_point.map); + + // if map is not found, we check major cities + if (i < 0) + { + if ((i = search_mapserver ("prontera.gat")) >= 0) + { // check is done without 'gat'. + memcpy (char_dat[0].last_point.map, "prontera.gat", + 16); + char_dat[0].last_point.x = 273; // savepoint coordonates + char_dat[0].last_point.y = 354; + } + else if ((i = search_mapserver ("geffen.gat")) >= 0) + { // check is done without 'gat'. + memcpy (char_dat[0].last_point.map, "geffen.gat", 16); + char_dat[0].last_point.x = 120; // savepoint coordonates + char_dat[0].last_point.y = 100; + } + else if ((i = search_mapserver ("morocc.gat")) >= 0) + { // check is done without 'gat'. + memcpy (char_dat[0].last_point.map, "morocc.gat", 16); + char_dat[0].last_point.x = 160; // savepoint coordonates + char_dat[0].last_point.y = 94; + } + else if ((i = search_mapserver ("alberta.gat")) >= 0) + { // check is done without 'gat'. + memcpy (char_dat[0].last_point.map, "alberta.gat", + 16); + char_dat[0].last_point.x = 116; // savepoint coordonates + char_dat[0].last_point.y = 57; + } + else if ((i = search_mapserver ("payon.gat")) >= 0) + { // check is done without 'gat'. + memcpy (char_dat[0].last_point.map, "payon.gat", 16); + char_dat[0].last_point.x = 87; // savepoint coordonates + char_dat[0].last_point.y = 117; + } + else if ((i = search_mapserver ("izlude.gat")) >= 0) + { // check is done without 'gat'. + memcpy (char_dat[0].last_point.map, "izlude.gat", 16); + char_dat[0].last_point.x = 94; // savepoint coordonates + char_dat[0].last_point.y = 103; + } + else + { + int j; + // get first online server + i = 0; + for (j = 0; j < MAX_MAP_SERVERS; j++) + if (server_fd[j] >= 0 && server[j].map[0][0]) + { + i = j; + printf + ("Map-server #%d found with a map: '%s'.\n", + j, server[j].map[0]); + break; + } + // if no map-servers are connected, we send: server closed + if (j == MAX_MAP_SERVERS) + { + WFIFOW (fd, 0) = 0x81; + WFIFOL (fd, 2) = 1; // 01 = Server closed + WFIFOSET (fd, 3); + RFIFOSKIP (fd, 3); + break; + } + } + } + WFIFOW (fd, 0) = 0x71; + WFIFOL (fd, 2) = char_dat[0].char_id; + memcpy (WFIFOP (fd, 6), char_dat[0].last_point.map, 16); + //Lan check added by Kashy + if (lan_ip_check (p)) + WFIFOL (fd, 22) = inet_addr (lan_map_ip); + else + WFIFOL (fd, 22) = server[i].ip; + WFIFOW (fd, 26) = server[i].port; + WFIFOSET (fd, 28); + + if (auth_fifo_pos >= AUTH_FIFO_SIZE) + { + auth_fifo_pos = 0; + } +// printf("auth_fifo set (auth_fifo_pos:%d) - account_id:%d char_id:%d login_id1:%d\n", auth_fifo_pos, sd->account_id, char_dat[0].char_id, sd->login_id1); + auth_fifo[auth_fifo_pos].account_id = sd->account_id; + auth_fifo[auth_fifo_pos].char_id = char_dat[0].char_id; + auth_fifo[auth_fifo_pos].login_id1 = sd->login_id1; + auth_fifo[auth_fifo_pos].login_id2 = sd->login_id2; + auth_fifo[auth_fifo_pos].delflag = 0; + //auth_fifo[auth_fifo_pos].char_pos = sd->found_char[ch]; + auth_fifo[auth_fifo_pos].char_pos = 0; + auth_fifo[auth_fifo_pos].sex = sd->sex; + auth_fifo[auth_fifo_pos].connect_until_time = + sd->connect_until_time; + auth_fifo[auth_fifo_pos].ip = + session[fd]->client_addr.sin_addr.s_addr; + auth_fifo_pos++; +// printf("0x66> end\n"); + RFIFOSKIP (fd, 3); + break; + + case 0x67: // make new +// printf("0x67>request make new char\n"); + if (RFIFOREST (fd) < 37) + return 0; + i = make_new_char_sql (fd, RFIFOP (fd, 2)); + if (i < 0) + { + WFIFOW (fd, 0) = 0x6e; + WFIFOB (fd, 2) = 0x00; + WFIFOSET (fd, 3); + RFIFOSKIP (fd, 37); + break; + } + + WFIFOW (fd, 0) = 0x6d; + memset (WFIFOP (fd, 2), 0x00, 106); + + mmo_char_fromsql (i, char_dat, 0); + i = 0; + WFIFOL (fd, 2) = char_dat[i].char_id; + WFIFOL (fd, 2 + 4) = char_dat[i].base_exp; + WFIFOL (fd, 2 + 8) = char_dat[i].zeny; + WFIFOL (fd, 2 + 12) = char_dat[i].job_exp; + WFIFOL (fd, 2 + 16) = char_dat[i].job_level; + + WFIFOL (fd, 2 + 28) = char_dat[i].karma; + WFIFOL (fd, 2 + 32) = char_dat[i].manner; + + WFIFOW (fd, 2 + 40) = 0x30; + WFIFOW (fd, 2 + 42) = + (char_dat[i].hp > 0x7fff) ? 0x7fff : char_dat[i].hp; + WFIFOW (fd, 2 + 44) = + (char_dat[i].max_hp > + 0x7fff) ? 0x7fff : char_dat[i].max_hp; + WFIFOW (fd, 2 + 46) = + (char_dat[i].sp > 0x7fff) ? 0x7fff : char_dat[i].sp; + WFIFOW (fd, 2 + 48) = + (char_dat[i].max_sp > + 0x7fff) ? 0x7fff : char_dat[i].max_sp; + WFIFOW (fd, 2 + 50) = DEFAULT_WALK_SPEED; // char_dat[i].speed; + WFIFOW (fd, 2 + 52) = char_dat[i].class; + WFIFOW (fd, 2 + 54) = char_dat[i].hair; + + WFIFOW (fd, 2 + 58) = char_dat[i].base_level; + WFIFOW (fd, 2 + 60) = char_dat[i].skill_point; + + WFIFOW (fd, 2 + 64) = char_dat[i].shield; + WFIFOW (fd, 2 + 66) = char_dat[i].head_top; + WFIFOW (fd, 2 + 68) = char_dat[i].head_mid; + WFIFOW (fd, 2 + 70) = char_dat[i].hair_color; + + memcpy (WFIFOP (fd, 2 + 74), char_dat[i].name, 24); + + WFIFOB (fd, 2 + 98) = char_dat[i].str; + WFIFOB (fd, 2 + 99) = char_dat[i].agi; + WFIFOB (fd, 2 + 100) = char_dat[i].vit; + WFIFOB (fd, 2 + 101) = char_dat[i].int_; + WFIFOB (fd, 2 + 102) = char_dat[i].dex; + WFIFOB (fd, 2 + 103) = char_dat[i].luk; + WFIFOB (fd, 2 + 104) = char_dat[i].char_num; + + WFIFOSET (fd, 108); + RFIFOSKIP (fd, 37); + //to do + for (ch = 0; ch < 9; ch++) + { + if (sd->found_char[ch] == -1) + { + sd->found_char[ch] = char_dat[i].char_id; + break; + } + } + + case 0x68: // delete + if (RFIFOREST (fd) < 46) + return 0; + printf + ("\033[1;31m Request Char Del:\033[0m \033[1;32m%d\033[0m(\033[1;32m%d\033[0m)\n", + sd->account_id, RFIFOL (fd, 2)); + memcpy (email, RFIFOP (fd, 6), 40); + sprintf (tmp_sql, "SELECT `email` FROM `%s` WHERE `%s`='%d'", + login_db, login_db_account_id, sd->account_id); + if (mysql_query (&lmysql_handle, tmp_sql)) + { + printf + ("\033[1;31m DB server Error Delete Char data - %s \033[0m \n", + mysql_error (&lmysql_handle)); + } + sql_res = mysql_store_result (&lmysql_handle); + if (sql_res) + { + sql_row = mysql_fetch_row (sql_res); + if (strcmp (email, sql_row[0]) == 0) + { + mysql_free_result (sql_res); + } + else + { + WFIFOW (fd, 0) = 0x70; + WFIFOB (fd, 2) = 0; + WFIFOSET (fd, 3); + RFIFOSKIP (fd, 46); + mysql_free_result (sql_res); + break; + } + } + else + { + WFIFOW (fd, 0) = 0x70; + WFIFOB (fd, 2) = 0; + WFIFOSET (fd, 3); + RFIFOSKIP (fd, 46); + mysql_free_result (sql_res); + break; + } + sprintf (tmp_sql, + "SELECT `name`,`partner_id` FROM `%s` WHERE `char_id`='%d'", + char_db, RFIFOL (fd, 2)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + sql_row = mysql_fetch_row (sql_res); + + if (sql_res && sql_row[0]) + { + //delete char from SQL + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'", + pet_db, RFIFOL (fd, 2)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'", + inventory_db, RFIFOL (fd, 2)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'", + cart_db, RFIFOL (fd, 2)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'", + memo_db, RFIFOL (fd, 2)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'", + skill_db, RFIFOL (fd, 2)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'", + char_db, RFIFOL (fd, 2)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + //Divorce [Wizputer] + if (sql_row[1] != 0) + { + char buf[64]; + sprintf (tmp_sql, + "UPDATE `%s` SET `partner_id`='0' WHERE `char_id`='%d'", + char_db, atoi (sql_row[1])); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sprintf (tmp_sql, + "DELETE FROM `%s` WHERE (`nameid`='%d' OR `nameid`='%d') AND `char_id`='%d'", + inventory_db, WEDDING_RING_M, WEDDING_RING_F, + atoi (sql_row[1])); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + WBUFW (buf, 0) = 0x2b12; + WBUFL (buf, 2) = atoi (sql_row[0]); + WBUFL (buf, 6) = atoi (sql_row[1]); + mapif_sendall (buf, 10); + } + // Also delete info from guildtables. + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'", + guild_member_db, RFIFOL (fd, 2)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, + "SELECT `guild_id` FROM `%s` WHERE `master` = '%s'", + guild_db, sql_row[0]); + + if (mysql_query (&mysql_handle, tmp_sql) == 0) + { + sql_res = mysql_store_result (&mysql_handle); + + if (sql_res != NULL) + { + if (mysql_num_rows (sql_res) != 0) + { + sql_row = mysql_fetch_row (sql_res); + + sprintf (tmp_sql, + "DELETE FROM `%s` WHERE `guild_id` = '%d'", + guild_db, atoi (sql_row[0])); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, + "DELETE FROM `%s` WHERE `guild_id` = '%d'", + guild_member_db, atoi (sql_row[0])); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, + "DELETE FROM `%s` WHERE `guild_id` = '%d'", + guild_castle_db, atoi (sql_row[0])); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, + "DELETE FROM `%s` WHERE `guild_id` = '%d'", + guild_storage_db, atoi (sql_row[0])); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, + "DELETE FROM `%s` WHERE `guild_id` = '%d' OR `alliance_id` = '%d'", + guild_alliance_db, atoi (sql_row[0]), + atoi (sql_row[0])); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, + "DELETE FROM `%s` WHERE `guild_id` = '%d'", + guild_position_db, + atoi (sql_row[0])); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, + "DELETE FROM `%s` WHERE `guild_id` = '%d'", + guild_skill_db, atoi (sql_row[0])); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, + "DELETE FROM `%s` WHERE `guild_id` = '%d'", + guild_expulsion_db, + atoi (sql_row[0])); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + mysql_free_result (sql_res); + } + } + else + { + if (mysql_errno (&mysql_handle) != 0) + { + printf ("Database server error: %s\n", + mysql_error (&mysql_handle)); + } + } + } + else + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + } + + for (i = 0; i < 9; i++) + { + printf ("char comp: %d - %d (%d)\n", sd->found_char[i], + RFIFOL (fd, 2), sd->account_id); + if (sd->found_char[i] == RFIFOL (fd, 2)) + { + for (ch = i; ch < 9 - 1; ch++) + sd->found_char[ch] = sd->found_char[ch + 1]; + sd->found_char[8] = -1; + break; + } + } + if (i == 9) + { // reject + WFIFOW (fd, 0) = 0x70; + WFIFOB (fd, 2) = 0; + WFIFOSET (fd, 3); + } + else + { // deleted! + WFIFOW (fd, 0) = 0x6f; + WFIFOSET (fd, 2); + } + RFIFOSKIP (fd, 46); + break; + + case 0x2af8: // login as map-server + if (RFIFOREST (fd) < 60) + return 0; + WFIFOW (fd, 0) = 0x2af9; + for (i = 0; i < MAX_MAP_SERVERS; i++) + { + if (server_fd[i] < 0) + break; + } + if (i == MAX_MAP_SERVERS || strcmp (RFIFOP (fd, 2), userid) + || strcmp (RFIFOP (fd, 26), passwd)) + { + WFIFOB (fd, 2) = 3; + WFIFOSET (fd, 3); + } + else + { +// int len; + WFIFOB (fd, 2) = 0; + WFIFOSET (fd, 3); + session[fd]->func_parse = parse_frommap; + server_fd[i] = fd; + if (anti_freeze_enable) + server_freezeflag[i] = 5; // Map anti-freeze system. Counter. 5 ok, 4...0 freezed + server[i].ip = RFIFOL (fd, 54); + server[i].port = RFIFOW (fd, 58); + server[i].users = 0; + memset (server[i].map, 0, sizeof (server[i].map)); + realloc_fifo (fd, FIFOSIZE_SERVERLINK, + FIFOSIZE_SERVERLINK); + char_mapif_init (fd); + // send gm acccounts level to map-servers /* removed by CLOWNISIUS due to isGM len = 4; WFIFOW(fd,0) = 0x2b15; @@ -2441,477 +3096,655 @@ int parse_char(int fd) { } WFIFOW(fd,2) = len; WFIFOSET(fd,len);*/ - } - RFIFOSKIP(fd,60); - break; - - case 0x187: // Alive? - if (RFIFOREST(fd) < 6) { - return 0; - } - RFIFOSKIP(fd, 6); - break; - - case 0x7530: // Athena info get - WFIFOW(fd, 0) = 0x7531; - WFIFOB(fd, 2) = ATHENA_MAJOR_VERSION; - WFIFOB(fd, 3) = ATHENA_MINOR_VERSION; - WFIFOB(fd, 4) = ATHENA_REVISION; - WFIFOB(fd, 5) = ATHENA_RELEASE_FLAG; - WFIFOB(fd, 6) = ATHENA_OFFICIAL_FLAG; - WFIFOB(fd, 7) = ATHENA_SERVER_INTER | ATHENA_SERVER_CHAR; - WFIFOW(fd, 8) = ATHENA_MOD_VERSION; - WFIFOSET(fd, 10); - RFIFOSKIP(fd, 2); - return 0; - - case 0x7532: // disconnect(default also disconnect) - default: - session[fd]->eof = 1; - return 0; - } - } - RFIFOFLUSH(fd); - - return 0; + } + RFIFOSKIP (fd, 60); + break; + + case 0x187: // Alive? + if (RFIFOREST (fd) < 6) + { + return 0; + } + RFIFOSKIP (fd, 6); + break; + + case 0x7530: // Athena info get + WFIFOW (fd, 0) = 0x7531; + WFIFOB (fd, 2) = ATHENA_MAJOR_VERSION; + WFIFOB (fd, 3) = ATHENA_MINOR_VERSION; + WFIFOB (fd, 4) = ATHENA_REVISION; + WFIFOB (fd, 5) = ATHENA_RELEASE_FLAG; + WFIFOB (fd, 6) = ATHENA_OFFICIAL_FLAG; + WFIFOB (fd, 7) = ATHENA_SERVER_INTER | ATHENA_SERVER_CHAR; + WFIFOW (fd, 8) = ATHENA_MOD_VERSION; + WFIFOSET (fd, 10); + RFIFOSKIP (fd, 2); + return 0; + + case 0x7532: // disconnect(default also disconnect) + default: + session[fd]->eof = 1; + return 0; + } + } + RFIFOFLUSH (fd); + + return 0; } // MAP send all -int mapif_sendall(unsigned char *buf, unsigned int len) { - int i, c; - int fd; - - c = 0; - for(i = 0; i < MAX_MAP_SERVERS; i++) { - if ((fd = server_fd[i]) >= 0) { - memcpy(WFIFOP(fd,0), buf, len); - WFIFOSET(fd,len); - c++; - } - } - - return c; +int mapif_sendall (unsigned char *buf, unsigned int len) +{ + int i, c; + int fd; + + c = 0; + for (i = 0; i < MAX_MAP_SERVERS; i++) + { + if ((fd = server_fd[i]) >= 0) + { + memcpy (WFIFOP (fd, 0), buf, len); + WFIFOSET (fd, len); + c++; + } + } + + return c; } -int mapif_sendallwos(int sfd, unsigned char *buf, unsigned int len) { - int i, c; - int fd; - - c = 0; - for(i=0, c=0;i<MAX_MAP_SERVERS;i++){ - if ((fd = server_fd[i]) >= 0 && fd != sfd) { - memcpy(WFIFOP(fd,0), buf, len); - WFIFOSET(fd, len); - c++; - } - } - - return c; +int mapif_sendallwos (int sfd, unsigned char *buf, unsigned int len) +{ + int i, c; + int fd; + + c = 0; + for (i = 0, c = 0; i < MAX_MAP_SERVERS; i++) + { + if ((fd = server_fd[i]) >= 0 && fd != sfd) + { + memcpy (WFIFOP (fd, 0), buf, len); + WFIFOSET (fd, len); + c++; + } + } + + return c; } -int mapif_send(int fd, unsigned char *buf, unsigned int len) { - int i; - - if (fd >= 0) { - for(i = 0; i < MAX_MAP_SERVERS; i++) { - if (fd == server_fd[i]) { - memcpy(WFIFOP(fd,0), buf, len); - WFIFOSET(fd,len); - return 1; - } - } - } - return 0; +int mapif_send (int fd, unsigned char *buf, unsigned int len) +{ + int i; + + if (fd >= 0) + { + for (i = 0; i < MAX_MAP_SERVERS; i++) + { + if (fd == server_fd[i]) + { + memcpy (WFIFOP (fd, 0), buf, len); + WFIFOSET (fd, len); + return 1; + } + } + } + return 0; } -int send_users_tologin(int tid, unsigned int tick, int id, int data) { - int users = count_users(); - char buf[16]; - - if (login_fd > 0 && session[login_fd]) { - // send number of user to login server - WFIFOW(login_fd,0) = 0x2714; - WFIFOL(login_fd,2) = users; - WFIFOSET(login_fd,6); - } - // send number of players to all map-servers - WBUFW(buf,0) = 0x2b00; - WBUFL(buf,2) = users; - mapif_sendall(buf, 6); - - return 0; +int send_users_tologin (int tid, unsigned int tick, int id, int data) +{ + int users = count_users (); + char buf[16]; + + if (login_fd > 0 && session[login_fd]) + { + // send number of user to login server + WFIFOW (login_fd, 0) = 0x2714; + WFIFOL (login_fd, 2) = users; + WFIFOSET (login_fd, 6); + } + // send number of players to all map-servers + WBUFW (buf, 0) = 0x2b00; + WBUFL (buf, 2) = users; + mapif_sendall (buf, 6); + + return 0; } -int check_connect_login_server(int tid, unsigned int tick, int id, int data) { - if (login_fd <= 0 || session[login_fd] == NULL) { - printf("Attempt to connect to login-server...\n"); - login_fd = make_connection(login_ip, login_port); - session[login_fd]->func_parse = parse_tologin; - realloc_fifo(login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); - WFIFOW(login_fd,0) = 0x2710; - memset(WFIFOP(login_fd,2), 0, 24); - memcpy(WFIFOP(login_fd,2), userid, strlen(userid) < 24 ? strlen(userid) : 24); - memset(WFIFOP(login_fd,26), 0, 24); - memcpy(WFIFOP(login_fd,26), passwd, strlen(passwd) < 24 ? strlen(passwd) : 24); - WFIFOL(login_fd,50) = 0; - WFIFOL(login_fd,54) = char_ip; - WFIFOL(login_fd,58) = char_port; - memset(WFIFOP(login_fd,60), 0, 20); - memcpy(WFIFOP(login_fd,60), server_name, strlen(server_name) < 20 ? strlen(server_name) : 20); - WFIFOW(login_fd,80) = 0; - WFIFOW(login_fd,82) = char_maintenance; - WFIFOW(login_fd,84) = char_new; - WFIFOSET(login_fd,86); - } - return 0; +int check_connect_login_server (int tid, unsigned int tick, int id, int data) +{ + if (login_fd <= 0 || session[login_fd] == NULL) + { + printf ("Attempt to connect to login-server...\n"); + login_fd = make_connection (login_ip, login_port); + session[login_fd]->func_parse = parse_tologin; + realloc_fifo (login_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); + WFIFOW (login_fd, 0) = 0x2710; + memset (WFIFOP (login_fd, 2), 0, 24); + memcpy (WFIFOP (login_fd, 2), userid, + strlen (userid) < 24 ? strlen (userid) : 24); + memset (WFIFOP (login_fd, 26), 0, 24); + memcpy (WFIFOP (login_fd, 26), passwd, + strlen (passwd) < 24 ? strlen (passwd) : 24); + WFIFOL (login_fd, 50) = 0; + WFIFOL (login_fd, 54) = char_ip; + WFIFOL (login_fd, 58) = char_port; + memset (WFIFOP (login_fd, 60), 0, 20); + memcpy (WFIFOP (login_fd, 60), server_name, + strlen (server_name) < 20 ? strlen (server_name) : 20); + WFIFOW (login_fd, 80) = 0; + WFIFOW (login_fd, 82) = char_maintenance; + WFIFOW (login_fd, 84) = char_new; + WFIFOSET (login_fd, 86); + } + return 0; } //---------------------------------------------------------- // Return numerical value of a switch configuration by [Yor] // on/off, english, fran軋is, deutsch, espaol //---------------------------------------------------------- -int config_switch(const char *str) { - if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0) - return 1; - if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0) - return 0; - - return atoi(str); +int config_switch (const char *str) +{ + if (strcmpi (str, "on") == 0 || strcmpi (str, "yes") == 0 + || strcmpi (str, "oui") == 0 || strcmpi (str, "ja") == 0 + || strcmpi (str, "si") == 0) + return 1; + if (strcmpi (str, "off") == 0 || strcmpi (str, "no") == 0 + || strcmpi (str, "non") == 0 || strcmpi (str, "nein") == 0) + return 0; + + return atoi (str); } // Lan Support conf reading added by Kashy -int char_lan_config_read(const char *lancfgName){ - char subnetmask[128]; - char line[1024], w1[1024], w2[1024]; - FILE *fp; - struct hostent * h = NULL; - - if ((fp = fopen_(lancfgName, "r")) == NULL) { - printf("file not found: %s\n", lancfgName); - return 1; - } - - printf("Start reading of Lan Support configuration file\n"); - - while(fgets(line, sizeof(line)-1, fp)){ - if (line[0] == '/' && line[1] == '/') - continue; - - if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2) - continue; - - else if (strcmpi(w1, "lan_map_ip") == 0) { - h = gethostbyname(w2); - if (h != NULL) { - sprintf(lan_map_ip, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - } else { - strncpy(lan_map_ip, w2, sizeof(lan_map_ip)); - lan_map_ip[sizeof(lan_map_ip)-1] = 0; - } - printf("set Lan_map_IP : %s\n", lan_map_ip); - } - - else if (strcmpi(w1, "subnetmask") == 0) { - unsigned int k0, k1, k2, k3; - strcpy(subnetmask, w2); - sscanf(subnetmask, "%d.%d.%d.%d", &k0, &k1, &k2, &k3); - subnetmaski[0] = k0; subnetmaski[1] = k1; subnetmaski[2] = k2; subnetmaski[3] = k3; - printf("set subnetmask : %s\n", w2); - } - } - fclose_(fp); - - printf("End reading of Lan Support configuration file\n"); - return 0; +int char_lan_config_read (const char *lancfgName) +{ + char subnetmask[128]; + char line[1024], w1[1024], w2[1024]; + FILE *fp; + struct hostent *h = NULL; + + if ((fp = fopen_ (lancfgName, "r")) == NULL) + { + printf ("file not found: %s\n", lancfgName); + return 1; + } + + printf ("Start reading of Lan Support configuration file\n"); + + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + + if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) != 2) + continue; + + else if (strcmpi (w1, "lan_map_ip") == 0) + { + h = gethostbyname (w2); + if (h != NULL) + { + sprintf (lan_map_ip, "%d.%d.%d.%d", + (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + } + else + { + strncpy (lan_map_ip, w2, sizeof (lan_map_ip)); + lan_map_ip[sizeof (lan_map_ip) - 1] = 0; + } + printf ("set Lan_map_IP : %s\n", lan_map_ip); + } + + else if (strcmpi (w1, "subnetmask") == 0) + { + unsigned int k0, k1, k2, k3; + strcpy (subnetmask, w2); + sscanf (subnetmask, "%d.%d.%d.%d", &k0, &k1, &k2, &k3); + subnetmaski[0] = k0; + subnetmaski[1] = k1; + subnetmaski[2] = k2; + subnetmaski[3] = k3; + printf ("set subnetmask : %s\n", w2); + } + } + fclose_ (fp); + + printf ("End reading of Lan Support configuration file\n"); + return 0; } -void do_final(void) { - printf("Doing final stage...\n"); - //mmo_char_sync(); - //inter_save(); - do_final_itemdb(); - //check SQL save progress. - //wait until save char complete - printf("waiting until char saving complete...\n"); - do { - sleep (0); - }while (save_flag != 0); - - sprintf(tmp_sql,"UPDATE `%s` SET `online`='0' WHERE `online`='1'", char_db); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (insert `char`)- %s\n", mysql_error(&mysql_handle)); - } - - sprintf(tmp_sql,"DELETE FROM `ragsrvinfo"); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error (insert `char`)- %s\n", mysql_error(&mysql_handle)); - } - - if (gm_account != NULL) - free(gm_account); - - free(char_dat); - free(gm_account); - delete_session(login_fd); - delete_session(char_fd); - - mysql_close(&mysql_handle); - mysql_close(&lmysql_handle); - - printf("ok! all done...\n"); +void do_final (void) +{ + printf ("Doing final stage...\n"); + //mmo_char_sync(); + //inter_save(); + do_final_itemdb (); + //check SQL save progress. + //wait until save char complete + printf ("waiting until char saving complete...\n"); + do + { + sleep (0); + } + while (save_flag != 0); + + sprintf (tmp_sql, "UPDATE `%s` SET `online`='0' WHERE `online`='1'", + char_db); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `char`)- %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, "DELETE FROM `ragsrvinfo"); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `char`)- %s\n", + mysql_error (&mysql_handle)); + } + + if (gm_account != NULL) + free (gm_account); + + free (char_dat); + free (gm_account); + delete_session (login_fd); + delete_session (char_fd); + + mysql_close (&mysql_handle); + mysql_close (&lmysql_handle); + + printf ("ok! all done...\n"); } -void sql_config_read(const char *cfgName){ /* Kalaspuff, to get login_db */ - char line[1024], w1[1024], w2[1024]; - FILE *fp; - - printf("reading configure: %s\n", cfgName); - - if ((fp = fopen_(cfgName, "r")) == NULL) { - printf("file not found: %s\n", cfgName); - exit(1); - } - - while(fgets(line, sizeof(line)-1, fp)){ - if(line[0] == '/' && line[1] == '/') - continue; - - if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2) - continue; - - if(strcmpi(w1, "login_db") == 0) { - strcpy(login_db, w2); - }else if(strcmpi(w1,"char_db")==0){ - strcpy(char_db,w2); - }else if(strcmpi(w1,"cart_db")==0){ - strcpy(cart_db,w2); - }else if(strcmpi(w1,"inventory_db")==0){ - strcpy(inventory_db,w2); - }else if(strcmpi(w1,"charlog_db")==0){ - strcpy(charlog_db,w2); - }else if(strcmpi(w1,"storage_db")==0){ - strcpy(storage_db,w2); - }else if(strcmpi(w1,"reg_db")==0){ - strcpy(reg_db,w2); - }else if(strcmpi(w1,"skill_db")==0){ - strcpy(skill_db,w2); - }else if(strcmpi(w1,"interlog_db")==0){ - strcpy(interlog_db,w2); - }else if(strcmpi(w1,"memo_db")==0){ - strcpy(memo_db,w2); - }else if(strcmpi(w1,"guild_db")==0){ - strcpy(guild_db,w2); - }else if(strcmpi(w1,"guild_alliance_db")==0){ - strcpy(guild_alliance_db,w2); - }else if(strcmpi(w1,"guild_castle_db")==0){ - strcpy(guild_castle_db,w2); - }else if(strcmpi(w1,"guild_expulsion_db")==0){ - strcpy(guild_expulsion_db,w2); - }else if(strcmpi(w1,"guild_member_db")==0){ - strcpy(guild_member_db,w2); - }else if(strcmpi(w1,"guild_skill_db")==0){ - strcpy(guild_skill_db,w2); - }else if(strcmpi(w1,"guild_position_db")==0){ - strcpy(guild_position_db,w2); - }else if(strcmpi(w1,"guild_storage_db")==0){ - strcpy(guild_storage_db,w2); - }else if(strcmpi(w1,"party_db")==0){ - strcpy(party_db,w2); - }else if(strcmpi(w1,"pet_db")==0){ - strcpy(pet_db,w2); - //Map server option to use SQL db or not - }else if(strcmpi(w1,"use_sql_db")==0){ // added for sql item_db read for char server [Valaris] - if (strcmpi(w2, "yes")) { - db_use_sqldbs = 1; - } else if (strcmpi(w2, "no")) { - db_use_sqldbs = 0; - } - printf("Using SQL dbs: %s\n",w2); - //custom columns for login database - }else if(strcmpi(w1,"login_db_level")==0){ - strcpy(login_db_level,w2); - }else if(strcmpi(w1,"login_db_account_id")==0){ - strcpy(login_db_account_id,w2); - }else if(strcmpi(w1,"lowest_gm_level")==0){ - lowest_gm_level = atoi(w2); - printf("set lowest_gm_level : %s\n",w2); - } - } - fclose_(fp); - printf("reading configure done.....\n"); +void sql_config_read (const char *cfgName) +{ /* Kalaspuff, to get login_db */ + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + printf ("reading configure: %s\n", cfgName); + + if ((fp = fopen_ (cfgName, "r")) == NULL) + { + printf ("file not found: %s\n", cfgName); + exit (1); + } + + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + + if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) != 2) + continue; + + if (strcmpi (w1, "login_db") == 0) + { + strcpy (login_db, w2); + } + else if (strcmpi (w1, "char_db") == 0) + { + strcpy (char_db, w2); + } + else if (strcmpi (w1, "cart_db") == 0) + { + strcpy (cart_db, w2); + } + else if (strcmpi (w1, "inventory_db") == 0) + { + strcpy (inventory_db, w2); + } + else if (strcmpi (w1, "charlog_db") == 0) + { + strcpy (charlog_db, w2); + } + else if (strcmpi (w1, "storage_db") == 0) + { + strcpy (storage_db, w2); + } + else if (strcmpi (w1, "reg_db") == 0) + { + strcpy (reg_db, w2); + } + else if (strcmpi (w1, "skill_db") == 0) + { + strcpy (skill_db, w2); + } + else if (strcmpi (w1, "interlog_db") == 0) + { + strcpy (interlog_db, w2); + } + else if (strcmpi (w1, "memo_db") == 0) + { + strcpy (memo_db, w2); + } + else if (strcmpi (w1, "guild_db") == 0) + { + strcpy (guild_db, w2); + } + else if (strcmpi (w1, "guild_alliance_db") == 0) + { + strcpy (guild_alliance_db, w2); + } + else if (strcmpi (w1, "guild_castle_db") == 0) + { + strcpy (guild_castle_db, w2); + } + else if (strcmpi (w1, "guild_expulsion_db") == 0) + { + strcpy (guild_expulsion_db, w2); + } + else if (strcmpi (w1, "guild_member_db") == 0) + { + strcpy (guild_member_db, w2); + } + else if (strcmpi (w1, "guild_skill_db") == 0) + { + strcpy (guild_skill_db, w2); + } + else if (strcmpi (w1, "guild_position_db") == 0) + { + strcpy (guild_position_db, w2); + } + else if (strcmpi (w1, "guild_storage_db") == 0) + { + strcpy (guild_storage_db, w2); + } + else if (strcmpi (w1, "party_db") == 0) + { + strcpy (party_db, w2); + } + else if (strcmpi (w1, "pet_db") == 0) + { + strcpy (pet_db, w2); + //Map server option to use SQL db or not + } + else if (strcmpi (w1, "use_sql_db") == 0) + { // added for sql item_db read for char server [Valaris] + if (strcmpi (w2, "yes")) + { + db_use_sqldbs = 1; + } + else if (strcmpi (w2, "no")) + { + db_use_sqldbs = 0; + } + printf ("Using SQL dbs: %s\n", w2); + //custom columns for login database + } + else if (strcmpi (w1, "login_db_level") == 0) + { + strcpy (login_db_level, w2); + } + else if (strcmpi (w1, "login_db_account_id") == 0) + { + strcpy (login_db_account_id, w2); + } + else if (strcmpi (w1, "lowest_gm_level") == 0) + { + lowest_gm_level = atoi (w2); + printf ("set lowest_gm_level : %s\n", w2); + } + } + fclose_ (fp); + printf ("reading configure done.....\n"); } -int char_config_read(const char *cfgName) { - struct hostent *h = NULL; - char line[1024], w1[1024], w2[1024]; - FILE *fp; - - if ((fp = fopen_(cfgName, "r")) == NULL) { - printf("Configuration file not found: %s.\n", cfgName); - exit(1); - } - - while(fgets(line, sizeof(line)-1, fp)) { - if (line[0] == '/' && line[1] == '/') - continue; - - line[sizeof(line)-1] = '\0'; - if (sscanf(line,"%[^:]: %[^\r\n]", w1, w2) != 2) - continue; - - remove_control_chars(w1); - remove_control_chars(w2); - if (strcmpi(w1, "userid") == 0) { - memcpy(userid, w2, 24); - } else if (strcmpi(w1, "passwd") == 0) { - memcpy(passwd, w2, 24); - } else if (strcmpi(w1, "server_name") == 0) { - memcpy(server_name, w2, 16); - printf("%s server has been intialized\n", w2); - } else if (strcmpi(w1, "wisp_server_name") == 0) { - if (strlen(w2) >= 4) { - memcpy(wisp_server_name, w2, sizeof(wisp_server_name)); - wisp_server_name[sizeof(wisp_server_name) - 1] = '\0'; - } - } else if (strcmpi(w1, "login_ip") == 0) { - h = gethostbyname (w2); - if (h != NULL) { - printf("Login server IP address : %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - sprintf(login_ip_str, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - } else - memcpy(login_ip_str,w2,16); - } else if (strcmpi(w1, "login_port") == 0) { - login_port=atoi(w2); - } else if (strcmpi(w1, "char_ip") == 0) { - h = gethostbyname (w2); - if(h != NULL) { - printf("Character server IP address : %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - sprintf(char_ip_str, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - } else - memcpy(char_ip_str, w2, 16); - } else if (strcmpi(w1, "char_port") == 0) { - char_port = atoi(w2); - } else if (strcmpi(w1, "char_maintenance") == 0) { - char_maintenance = atoi(w2); - } else if (strcmpi(w1, "char_new")==0){ - char_new = atoi(w2); - } else if (strcmpi(w1, "max_connect_user") == 0) { - max_connect_user = atoi(w2); - if (max_connect_user < 0) - max_connect_user = 0; // unlimited online players - } else if (strcmpi(w1, "check_ip_flag") == 0) { - check_ip_flag = config_switch(w2); - } else if (strcmpi(w1, "autosave_time") == 0) { - autosave_interval = atoi(w2)*1000; - if (autosave_interval <= 0) - autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; - } else if (strcmpi(w1, "start_point") == 0) { - char map[32]; - int x, y; - if (sscanf(w2,"%[^,],%d,%d", map, &x, &y) < 3) - continue; - if (strstr(map, ".gat") != NULL) { // Verify at least if '.gat' is in the map name - memcpy(start_point.map, map, 16); - start_point.x = x; - start_point.y = y; - } - } else if (strcmpi(w1, "start_zeny") == 0) { - start_zeny = atoi(w2); - if (start_zeny < 0) - start_zeny = 0; - } else if (strcmpi(w1, "start_weapon") == 0) { - start_zeny = atoi(w2); - if (start_weapon < 0) - start_weapon = 0; - } else if (strcmpi(w1, "start_armor") == 0) { - start_zeny = atoi(w2); - if (start_armor < 0) - start_armor = 0; - } else if (strcmpi(w1, "unknown_char_name") == 0) { - strcpy(unknown_char_name, w2); - unknown_char_name[24] = 0; - } else if (strcmpi(w1, "name_ignoring_case") == 0) { - name_ignoring_case = config_switch(w2); - } else if (strcmpi(w1, "char_name_option") == 0) { - char_name_option = atoi(w2); - } else if (strcmpi(w1, "char_name_letters") == 0) { - strcpy(char_name_letters, w2); - } else if (strcmpi(w1, "check_ip_flag") == 0) { - check_ip_flag = config_switch(w2); - // anti-freeze options [Valaris] - } else if(strcmpi(w1,"anti_freeze_enable")==0){ - anti_freeze_enable = config_switch(w2); - } else if (strcmpi(w1, "anti_freeze_interval") == 0) { - ANTI_FREEZE_INTERVAL = atoi(w2); - if (ANTI_FREEZE_INTERVAL < 5) - ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds - } else if (strcmpi(w1, "import") == 0) { - char_config_read(w2); - } - } - fclose_(fp); +int char_config_read (const char *cfgName) +{ + struct hostent *h = NULL; + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + if ((fp = fopen_ (cfgName, "r")) == NULL) + { + printf ("Configuration file not found: %s.\n", cfgName); + exit (1); + } + + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + + line[sizeof (line) - 1] = '\0'; + if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) != 2) + continue; + + remove_control_chars (w1); + remove_control_chars (w2); + if (strcmpi (w1, "userid") == 0) + { + memcpy (userid, w2, 24); + } + else if (strcmpi (w1, "passwd") == 0) + { + memcpy (passwd, w2, 24); + } + else if (strcmpi (w1, "server_name") == 0) + { + memcpy (server_name, w2, 16); + printf ("%s server has been intialized\n", w2); + } + else if (strcmpi (w1, "wisp_server_name") == 0) + { + if (strlen (w2) >= 4) + { + memcpy (wisp_server_name, w2, sizeof (wisp_server_name)); + wisp_server_name[sizeof (wisp_server_name) - 1] = '\0'; + } + } + else if (strcmpi (w1, "login_ip") == 0) + { + h = gethostbyname (w2); + if (h != NULL) + { + printf ("Login server IP address : %s -> %d.%d.%d.%d\n", w2, + (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + sprintf (login_ip_str, "%d.%d.%d.%d", + (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + } + else + memcpy (login_ip_str, w2, 16); + } + else if (strcmpi (w1, "login_port") == 0) + { + login_port = atoi (w2); + } + else if (strcmpi (w1, "char_ip") == 0) + { + h = gethostbyname (w2); + if (h != NULL) + { + printf ("Character server IP address : %s -> %d.%d.%d.%d\n", + w2, (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + sprintf (char_ip_str, "%d.%d.%d.%d", + (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + } + else + memcpy (char_ip_str, w2, 16); + } + else if (strcmpi (w1, "char_port") == 0) + { + char_port = atoi (w2); + } + else if (strcmpi (w1, "char_maintenance") == 0) + { + char_maintenance = atoi (w2); + } + else if (strcmpi (w1, "char_new") == 0) + { + char_new = atoi (w2); + } + else if (strcmpi (w1, "max_connect_user") == 0) + { + max_connect_user = atoi (w2); + if (max_connect_user < 0) + max_connect_user = 0; // unlimited online players + } + else if (strcmpi (w1, "check_ip_flag") == 0) + { + check_ip_flag = config_switch (w2); + } + else if (strcmpi (w1, "autosave_time") == 0) + { + autosave_interval = atoi (w2) * 1000; + if (autosave_interval <= 0) + autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; + } + else if (strcmpi (w1, "start_point") == 0) + { + char map[32]; + int x, y; + if (sscanf (w2, "%[^,],%d,%d", map, &x, &y) < 3) + continue; + if (strstr (map, ".gat") != NULL) + { // Verify at least if '.gat' is in the map name + memcpy (start_point.map, map, 16); + start_point.x = x; + start_point.y = y; + } + } + else if (strcmpi (w1, "start_zeny") == 0) + { + start_zeny = atoi (w2); + if (start_zeny < 0) + start_zeny = 0; + } + else if (strcmpi (w1, "start_weapon") == 0) + { + start_zeny = atoi (w2); + if (start_weapon < 0) + start_weapon = 0; + } + else if (strcmpi (w1, "start_armor") == 0) + { + start_zeny = atoi (w2); + if (start_armor < 0) + start_armor = 0; + } + else if (strcmpi (w1, "unknown_char_name") == 0) + { + strcpy (unknown_char_name, w2); + unknown_char_name[24] = 0; + } + else if (strcmpi (w1, "name_ignoring_case") == 0) + { + name_ignoring_case = config_switch (w2); + } + else if (strcmpi (w1, "char_name_option") == 0) + { + char_name_option = atoi (w2); + } + else if (strcmpi (w1, "char_name_letters") == 0) + { + strcpy (char_name_letters, w2); + } + else if (strcmpi (w1, "check_ip_flag") == 0) + { + check_ip_flag = config_switch (w2); + // anti-freeze options [Valaris] + } + else if (strcmpi (w1, "anti_freeze_enable") == 0) + { + anti_freeze_enable = config_switch (w2); + } + else if (strcmpi (w1, "anti_freeze_interval") == 0) + { + ANTI_FREEZE_INTERVAL = atoi (w2); + if (ANTI_FREEZE_INTERVAL < 5) + ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds + } + else if (strcmpi (w1, "import") == 0) + { + char_config_read (w2); + } + } + fclose_ (fp); //Read ItemDB - do_init_itemdb(); + do_init_itemdb (); - return 0; + return 0; } -int do_init(int argc, char **argv){ - int i; +int do_init (int argc, char **argv) +{ + int i; - for(i = 0; i < MAX_MAP_SERVERS; i++) { - memset(&server[i], 0, sizeof(struct mmo_map_server)); - server_fd[i] = -1; - } + for (i = 0; i < MAX_MAP_SERVERS; i++) + { + memset (&server[i], 0, sizeof (struct mmo_map_server)); + server_fd[i] = -1; + } - char_config_read((argc < 2) ? CHAR_CONF_NAME : argv[1]); - char_lan_config_read((argc > 1) ? argv[1] : LAN_CONF_NAME); - sql_config_read(SQL_CONF_NAME); + char_config_read ((argc < 2) ? CHAR_CONF_NAME : argv[1]); + char_lan_config_read ((argc > 1) ? argv[1] : LAN_CONF_NAME); + sql_config_read (SQL_CONF_NAME); - printf("charserver configuration reading done.....\n"); + printf ("charserver configuration reading done.....\n"); - inter_init((argc > 2) ? argv[2] : inter_cfgName); // inter server テハア篳ュ - printf("interserver configuration reading done.....\n"); + inter_init ((argc > 2) ? argv[2] : inter_cfgName); // inter server テハア篳ュ + printf ("interserver configuration reading done.....\n"); - printf("start char server initializing.....\n"); - mmo_char_sql_init(); - printf("char server initializing done.....\n"); + printf ("start char server initializing.....\n"); + mmo_char_sql_init (); + printf ("char server initializing done.....\n"); - printf("set parser -> parse_char().....\n"); - set_defaultparse(parse_char); + printf ("set parser -> parse_char().....\n"); + set_defaultparse (parse_char); - printf("set terminate function -> do_final().....\n"); - set_termfunc(do_final); + printf ("set terminate function -> do_final().....\n"); + set_termfunc (do_final); - printf("open port %d.....\n",char_port); - char_fd = make_listen_port(char_port); + printf ("open port %d.....\n", char_port); + char_fd = make_listen_port (char_port); - login_ip = inet_addr(login_ip_str); - char_ip = inet_addr(char_ip_str); + login_ip = inet_addr (login_ip_str); + char_ip = inet_addr (char_ip_str); - // send ALIVE PING to login server. - printf("add interval tic (check_connect_login_server)....\n"); - i = add_timer_interval(gettick() + 10, check_connect_login_server, 0, 0, 10 * 1000); + // send ALIVE PING to login server. + printf ("add interval tic (check_connect_login_server)....\n"); + i = add_timer_interval (gettick () + 10, check_connect_login_server, 0, 0, + 10 * 1000); - // send USER COUNT PING to login server. - printf("add interval tic (send_users_tologin)....\n"); - i = add_timer_interval(gettick() + 10, send_users_tologin, 0, 0, 5 * 1000); + // send USER COUNT PING to login server. + printf ("add interval tic (send_users_tologin)....\n"); + i = add_timer_interval (gettick () + 10, send_users_tologin, 0, 0, + 5 * 1000); - //no need to set sync timer on SQL version. - //printf("add interval tic (mmo_char_sync_timer)....\n"); - //i = add_timer_interval(gettick() + 10, mmo_char_sync_timer, 0, 0, autosave_interval); + //no need to set sync timer on SQL version. + //printf("add interval tic (mmo_char_sync_timer)....\n"); + //i = add_timer_interval(gettick() + 10, mmo_char_sync_timer, 0, 0, autosave_interval); - if(anti_freeze_enable > 0) { - add_timer_func_list(map_anti_freeze_system, "map_anti_freeze_system"); - i = add_timer_interval(gettick() + 1000, map_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000); // checks every X seconds user specifies - } + if (anti_freeze_enable > 0) + { + add_timer_func_list (map_anti_freeze_system, + "map_anti_freeze_system"); + i = add_timer_interval (gettick () + 1000, map_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000); // checks every X seconds user specifies + } - read_gm_account(); + read_gm_account (); - printf("char server init func end (now unlimited loop start!)....\n"); - printf("The char-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", char_port); - return 0; + printf ("char server init func end (now unlimited loop start!)....\n"); + printf + ("The char-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", + char_port); + return 0; } - - diff --git a/src/char_sql/char.h b/src/char_sql/char.h index 116a301..b0b2770 100644 --- a/src/char_sql/char.h +++ b/src/char_sql/char.h @@ -14,37 +14,42 @@ #define DEFAULT_AUTOSAVE_INTERVAL 300*1000 -struct mmo_map_server{ - long ip; - short port; - int users; - char map[MAX_MAP_PER_SERVER][16]; +struct mmo_map_server +{ + long ip; + short port; + int users; + char map[MAX_MAP_PER_SERVER][16]; }; -struct itemtmp { - int flag;//checked = 1 else 0 - int id; - short nameid; - short amount; - unsigned short equip; - char identify; - char refine; - char attribute; - short card[4]; - short broken; +struct itemtmp +{ + int flag; //checked = 1 else 0 + int id; + short nameid; + short amount; + unsigned short equip; + char identify; + char refine; + char attribute; + short card[4]; + short broken; }; -enum { - TABLE_INVENTORY, - TABLE_CART, - TABLE_STORAGE, - TABLE_GUILD_STORAGE, +enum +{ + TABLE_INVENTORY, + TABLE_CART, + TABLE_STORAGE, + TABLE_GUILD_STORAGE, }; -struct itemtemp{ - struct itemtmp equip[MAX_GUILD_STORAGE],notequip[MAX_GUILD_STORAGE]; +struct itemtemp +{ + struct itemtmp equip[MAX_GUILD_STORAGE], notequip[MAX_GUILD_STORAGE]; }; -int memitemdata_to_sql(struct itemtemp mapitem, int eqcount, int noteqcount, int char_id,int tableswitch); -int mapif_sendall(unsigned char *buf,unsigned int len); -int mapif_sendallwos(int fd,unsigned char *buf,unsigned int len); -int mapif_send(int fd,unsigned char *buf,unsigned int len); +int memitemdata_to_sql (struct itemtemp mapitem, int eqcount, int noteqcount, + int char_id, int tableswitch); +int mapif_sendall (unsigned char *buf, unsigned int len); +int mapif_sendallwos (int fd, unsigned char *buf, unsigned int len); +int mapif_send (int fd, unsigned char *buf, unsigned int len); extern int autosave_interval; extern char char_db[256]; @@ -67,7 +72,7 @@ extern char guild_storage_db[256]; extern char party_db[256]; extern char pet_db[256]; -int db_use_sqldbs; // added for sql item_db read for char server [Valaris] +int db_use_sqldbs; // added for sql item_db read for char server [Valaris] extern char login_db_level[32]; extern char login_db_account_id[32]; diff --git a/src/char_sql/int_guild.c b/src/char_sql/int_guild.c index b9a6e3b..d5b9b86 100644 --- a/src/char_sql/int_guild.c +++ b/src/char_sql/int_guild.c @@ -18,1546 +18,1989 @@ static struct guild *guild_pt; static struct guild *guild_pt2; -static struct guild_castle * guildcastle_pt; -static int guild_newid=10000; +static struct guild_castle *guildcastle_pt; +static int guild_newid = 10000; static int guild_exp[100]; -int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int flag,const char *mes); -int mapif_guild_broken(int guild_id,int flag); -int guild_check_empty(struct guild *g); -int guild_calcinfo(struct guild *g); -int mapif_guild_basicinfochanged(int guild_id,int type,const void *data,int len); -int mapif_guild_info(int fd,struct guild *g); -int guild_break_sub(void *key,void *data,va_list ap); - +int mapif_parse_GuildLeave (int fd, int guild_id, int account_id, + int char_id, int flag, const char *mes); +int mapif_guild_broken (int guild_id, int flag); +int guild_check_empty (struct guild *g); +int guild_calcinfo (struct guild *g); +int mapif_guild_basicinfochanged (int guild_id, int type, const void *data, + int len); +int mapif_guild_info (int fd, struct guild *g); +int guild_break_sub (void *key, void *data, va_list ap); // Save guild into sql -int inter_guild_tosql(struct guild *g,int flag) +int inter_guild_tosql (struct guild *g, int flag) { - // 1 `guild` (`guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data`) - // 2 `guild_member` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`) - // 4 `guild_position` (`guild_id`,`position`,`name`,`mode`,`exp_mode`) - // 8 `guild_alliance` (`guild_id`,`opposition`,`alliance_id`,`name`) - // 16 `guild_expulsion` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`) - // 32 `guild_skill` (`guild_id`,`id`,`lv`) - - char t_name[100],t_master[24],t_mes1[60],t_mes2[120],t_member[24],t_position[24],t_alliance[24]; // temporay storage for str convertion; - char t_ename[24],t_emes[40]; - char emblem_data[4096]; - int i=0; - int guild_exist=0,guild_member=0,guild_online_member=0; - - if (g->guild_id<=0) return -1; - - printf("(\033[1;35m%d\033[0m) Request save guild - ",g->guild_id); - - jstrescapecpy(t_name, g->name); - - //printf("- Check if guild %d exists\n",g->guild_id); - sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db,g->guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - sql_row = mysql_fetch_row(sql_res); - guild_exist = atoi (sql_row[0]); - //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes")); - } - mysql_free_result(sql_res) ; //resource free - - if (guild_exist >0){ - // Check members in party - sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_member_db, g->guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - return -1; - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - sql_row = mysql_fetch_row(sql_res); - - guild_member = atoi (sql_row[0]); - // printf("- Check members in guild %d : %d \n",g->guild_id,guild_member); - - } - mysql_free_result(sql_res) ; //resource free - - // Delete old guild from sql - if (flag&1||guild_member==0){ - // printf("- Delete guild %d from guild\n",g->guild_id); - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_db, g->guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) ); - } - } - if (flag&2||guild_member==0){ - // printf("- Delete guild %d from guild_member\n",g->guild_id); - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_member_db, g->guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_member`)- %s\n", mysql_error(&mysql_handle) ); - } - sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, g->guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); - } - } - if (flag&32||guild_member==0){ - // printf("- Delete guild %d from guild_skill\n",g->guild_id); - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_skill_db, g->guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_skill`)- %s\n", mysql_error(&mysql_handle) ); - } - } - if (flag&4||guild_member==0){ - // printf("- Delete guild %d from guild_position\n",g->guild_id); - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_position_db, g->guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) ); - } - } - if (flag&16||guild_member==0){ - // printf("- Delete guild %d from guild_expulsion\n",g->guild_id); - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, g->guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) ); - } - } - if (flag&8||guild_member==0){ - // printf("- Delete guild %d from guild_alliance\n",g->guild_id); - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'",guild_alliance_db, g->guild_id,g->guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_alliance`)- %s\n", mysql_error(&mysql_handle) ); - } - } - if (flag&2||guild_member==0){ - // printf("- Delete guild %d from char\n",g->guild_id); - sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, g->guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_alliance`)- %s\n", mysql_error(&mysql_handle) ); - } - } - if (guild_member==0){ - // printf("- Delete guild %d from guild_castle\n",g->guild_id); - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_castle_db, g->guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_castle`)- %s\n", mysql_error(&mysql_handle) ); - } - } - } - - guild_online_member = 0; - i=0; - while (i<g->max_member) { - if (g->member[i].account_id>0) guild_online_member++; - i++; - } - - // No member in guild , no need to create it in sql - if (guild_member <= 0 && guild_online_member <=0) { - inter_guild_storage_delete(g->guild_id); - printf("No member in guild %d , break it! \n",g->guild_id); - return -2; - } - - // Insert new guild to sqlserver - if (flag&1||guild_member==0){ - int len=0; - //printf("- Insert guild %d to guild\n",g->guild_id); - for(i=0;i<g->emblem_len;i++){ - len+=sprintf(emblem_data+len,"%02x",(unsigned char)(g->emblem_data[i])); - //printf("%02x",(unsigned char)(g->emblem_data[i])); - } - emblem_data[len] = '\0'; - //printf("- emblem_len = %d \n",g->emblem_len); - sprintf(tmp_sql,"INSERT INTO `%s` " - "(`guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data`) " - "VALUES ('%d', '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%s', '%d', '%d', '%s')", - guild_db, g->guild_id,t_name,jstrescapecpy(t_master,g->master), - g->guild_lv,g->connect_member,g->max_member,g->average_lv,g->exp,g->next_exp,g->skill_point,g->castle_id, - jstrescapecpy(t_mes1,g->mes1),jstrescapecpy(t_mes2,g->mes2),g->emblem_len,g->emblem_id,emblem_data); - //printf(" %s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (insert `guild`)- %s\n", mysql_error(&mysql_handle) ); - } - } - - if (flag&2||guild_member==0){ - //printf("- Insert guild %d to guild_member\n",g->guild_id); - for(i=0;i<g->max_member;i++){ - if (g->member[i].account_id>0){ - struct guild_member *m = &g->member[i]; - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `char_id`='%d'",guild_member_db, m->char_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_member`)- %s\n", mysql_error(&mysql_handle) ); - } - sprintf(tmp_sql,"INSERT INTO `%s` " - "(`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`) " - "VALUES ('%d','%d','%d','%d','%d', '%d','%d','%d','%d','%d','%d','%d','%d','%d','%s')", - guild_member_db, g->guild_id, - m->account_id,m->char_id, - m->hair,m->hair_color,m->gender, - m->class,m->lv,m->exp,m->exp_payper,m->online,m->position, - 0,0, - jstrescapecpy(t_member,m->name)); - //printf(" %s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (insert `guild_member`)- %s\n", mysql_error(&mysql_handle) ); - } - sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='%d' WHERE `account_id`='%d' AND `char_id`='%d'",char_db, g->guild_id,m->account_id,m->char_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); - } - } - } - } - - if (flag&4||guild_member==0){ - //printf("- Insert guild %d to guild_position\n",g->guild_id); - for(i=0;i<MAX_GUILDPOSITION;i++){ - struct guild_position *p = &g->position[i]; - sprintf(tmp_sql,"INSERT INTO `%s` (`guild_id`,`position`,`name`,`mode`,`exp_mode`) VALUES ('%d','%d', '%s','%d','%d')", - guild_position_db, g->guild_id, i, jstrescapecpy(t_position,p->name),p->mode,p->exp_mode); - //printf(" %s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (insert `guild_position`)- %s\n", mysql_error(&mysql_handle) ); - } - } - } - - if (flag&8||guild_member==0){ - //printf("- Insert guild %d to guild_alliance\n",g->guild_id); - for(i=0;i<MAX_GUILDALLIANCE;i++){ - struct guild_alliance *a=&g->alliance[i]; - if(a->guild_id>0){ - sprintf(tmp_sql,"INSERT INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) " - "VALUES ('%d','%d','%d','%s')", - guild_alliance_db, g->guild_id,a->opposition,a->guild_id,jstrescapecpy(t_alliance,a->name)); - //printf(" %s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (insert `guild_alliance`)- %s\n", mysql_error(&mysql_handle) ); - } - sprintf(tmp_sql,"INSERT INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) " - "VALUES ('%d','%d','%d','%s')", - guild_alliance_db, a->guild_id,a->opposition,g->guild_id,t_name); - //printf(" %s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (insert `guild_alliance`)- %s\n", mysql_error(&mysql_handle) ); - } - } - } - } - - if (flag&16||guild_member==0){ - //printf("- Insert guild %d to guild_expulsion\n",g->guild_id); - for(i=0;i<MAX_GUILDEXPLUSION;i++){ - struct guild_explusion *e=&g->explusion[i]; - if(e->account_id>0){ - sprintf(tmp_sql,"INSERT INTO `%s` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`) " - "VALUES ('%d','%s','%s','%s','%d','%d','%d','%d')", - guild_expulsion_db, g->guild_id, - jstrescapecpy(t_ename,e->name),jstrescapecpy(t_emes,e->mes),e->acc,e->account_id,e->rsv1,e->rsv2,e->rsv3 ); - //printf(" %s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (insert `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) ); - } - } - } - } - - if (flag&32||guild_member==0){ - //printf("- Insert guild %d to guild_skill\n",g->guild_id); - for(i=0;i<MAX_GUILDSKILL;i++){ - if (g->skill[i].id>0){ - sprintf(tmp_sql,"INSERT INTO `%s` (`guild_id`,`id`,`lv`) VALUES ('%d','%d','%d')", - guild_skill_db, g->guild_id,g->skill[i].id,g->skill[i].lv); - //printf("%s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (insert `guild_skill`)- %s\n", mysql_error(&mysql_handle) ); - } - } - } - } - - printf("Save guild done\n"); - return 0; + // 1 `guild` (`guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data`) + // 2 `guild_member` (`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`) + // 4 `guild_position` (`guild_id`,`position`,`name`,`mode`,`exp_mode`) + // 8 `guild_alliance` (`guild_id`,`opposition`,`alliance_id`,`name`) + // 16 `guild_expulsion` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`) + // 32 `guild_skill` (`guild_id`,`id`,`lv`) + + char t_name[100], t_master[24], t_mes1[60], t_mes2[120], t_member[24], t_position[24], t_alliance[24]; // temporay storage for str convertion; + char t_ename[24], t_emes[40]; + char emblem_data[4096]; + int i = 0; + int guild_exist = 0, guild_member = 0, guild_online_member = 0; + + if (g->guild_id <= 0) + return -1; + + printf ("(\033[1;35m%d\033[0m) Request save guild - ", g->guild_id); + + jstrescapecpy (t_name, g->name); + + //printf("- Check if guild %d exists\n",g->guild_id); + sprintf (tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'", + guild_db, g->guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild`)- %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + sql_row = mysql_fetch_row (sql_res); + guild_exist = atoi (sql_row[0]); + //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes")); + } + mysql_free_result (sql_res); //resource free + + if (guild_exist > 0) + { + // Check members in party + sprintf (tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'", + guild_member_db, g->guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + return -1; + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + sql_row = mysql_fetch_row (sql_res); + + guild_member = atoi (sql_row[0]); + // printf("- Check members in guild %d : %d \n",g->guild_id,guild_member); + + } + mysql_free_result (sql_res); //resource free + + // Delete old guild from sql + if (flag & 1 || guild_member == 0) + { + // printf("- Delete guild %d from guild\n",g->guild_id); + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'", + guild_db, g->guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild`)- %s\n", + mysql_error (&mysql_handle)); + } + } + if (flag & 2 || guild_member == 0) + { + // printf("- Delete guild %d from guild_member\n",g->guild_id); + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'", + guild_member_db, g->guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_member`)- %s\n", + mysql_error (&mysql_handle)); + } + sprintf (tmp_sql, + "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'", + char_db, g->guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (update `char`)- %s\n", + mysql_error (&mysql_handle)); + } + } + if (flag & 32 || guild_member == 0) + { + // printf("- Delete guild %d from guild_skill\n",g->guild_id); + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'", + guild_skill_db, g->guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_skill`)- %s\n", + mysql_error (&mysql_handle)); + } + } + if (flag & 4 || guild_member == 0) + { + // printf("- Delete guild %d from guild_position\n",g->guild_id); + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'", + guild_position_db, g->guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_position`)- %s\n", + mysql_error (&mysql_handle)); + } + } + if (flag & 16 || guild_member == 0) + { + // printf("- Delete guild %d from guild_expulsion\n",g->guild_id); + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'", + guild_expulsion_db, g->guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_expulsion`)- %s\n", + mysql_error (&mysql_handle)); + } + } + if (flag & 8 || guild_member == 0) + { + // printf("- Delete guild %d from guild_alliance\n",g->guild_id); + sprintf (tmp_sql, + "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'", + guild_alliance_db, g->guild_id, g->guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_alliance`)- %s\n", + mysql_error (&mysql_handle)); + } + } + if (flag & 2 || guild_member == 0) + { + // printf("- Delete guild %d from char\n",g->guild_id); + sprintf (tmp_sql, + "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'", + char_db, g->guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_alliance`)- %s\n", + mysql_error (&mysql_handle)); + } + } + if (guild_member == 0) + { + // printf("- Delete guild %d from guild_castle\n",g->guild_id); + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'", + guild_castle_db, g->guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_castle`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + + guild_online_member = 0; + i = 0; + while (i < g->max_member) + { + if (g->member[i].account_id > 0) + guild_online_member++; + i++; + } + + // No member in guild , no need to create it in sql + if (guild_member <= 0 && guild_online_member <= 0) + { + inter_guild_storage_delete (g->guild_id); + printf ("No member in guild %d , break it! \n", g->guild_id); + return -2; + } + + // Insert new guild to sqlserver + if (flag & 1 || guild_member == 0) + { + int len = 0; + //printf("- Insert guild %d to guild\n",g->guild_id); + for (i = 0; i < g->emblem_len; i++) + { + len += + sprintf (emblem_data + len, "%02x", + (unsigned char) (g->emblem_data[i])); + //printf("%02x",(unsigned char)(g->emblem_data[i])); + } + emblem_data[len] = '\0'; + //printf("- emblem_len = %d \n",g->emblem_len); + sprintf (tmp_sql, "INSERT INTO `%s` " + "(`guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data`) " + "VALUES ('%d', '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%s', '%s', '%d', '%d', '%s')", + guild_db, g->guild_id, t_name, jstrescapecpy (t_master, + g->master), + g->guild_lv, g->connect_member, g->max_member, g->average_lv, + g->exp, g->next_exp, g->skill_point, g->castle_id, + jstrescapecpy (t_mes1, g->mes1), jstrescapecpy (t_mes2, + g->mes2), + g->emblem_len, g->emblem_id, emblem_data); + //printf(" %s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `guild`)- %s\n", + mysql_error (&mysql_handle)); + } + } + + if (flag & 2 || guild_member == 0) + { + //printf("- Insert guild %d to guild_member\n",g->guild_id); + for (i = 0; i < g->max_member; i++) + { + if (g->member[i].account_id > 0) + { + struct guild_member *m = &g->member[i]; + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `char_id`='%d'", + guild_member_db, m->char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_member`)- %s\n", + mysql_error (&mysql_handle)); + } + sprintf (tmp_sql, "INSERT INTO `%s` " + "(`guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name`) " + "VALUES ('%d','%d','%d','%d','%d', '%d','%d','%d','%d','%d','%d','%d','%d','%d','%s')", + guild_member_db, g->guild_id, + m->account_id, m->char_id, + m->hair, m->hair_color, m->gender, + m->class, m->lv, m->exp, m->exp_payper, m->online, + m->position, 0, 0, jstrescapecpy (t_member, + m->name)); + //printf(" %s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `guild_member`)- %s\n", + mysql_error (&mysql_handle)); + } + sprintf (tmp_sql, + "UPDATE `%s` SET `guild_id`='%d' WHERE `account_id`='%d' AND `char_id`='%d'", + char_db, g->guild_id, m->account_id, m->char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (update `char`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + } + + if (flag & 4 || guild_member == 0) + { + //printf("- Insert guild %d to guild_position\n",g->guild_id); + for (i = 0; i < MAX_GUILDPOSITION; i++) + { + struct guild_position *p = &g->position[i]; + sprintf (tmp_sql, + "INSERT INTO `%s` (`guild_id`,`position`,`name`,`mode`,`exp_mode`) VALUES ('%d','%d', '%s','%d','%d')", + guild_position_db, g->guild_id, i, + jstrescapecpy (t_position, p->name), p->mode, + p->exp_mode); + //printf(" %s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `guild_position`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + + if (flag & 8 || guild_member == 0) + { + //printf("- Insert guild %d to guild_alliance\n",g->guild_id); + for (i = 0; i < MAX_GUILDALLIANCE; i++) + { + struct guild_alliance *a = &g->alliance[i]; + if (a->guild_id > 0) + { + sprintf (tmp_sql, + "INSERT INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) " + "VALUES ('%d','%d','%d','%s')", guild_alliance_db, + g->guild_id, a->opposition, a->guild_id, + jstrescapecpy (t_alliance, a->name)); + //printf(" %s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `guild_alliance`)- %s\n", + mysql_error (&mysql_handle)); + } + sprintf (tmp_sql, + "INSERT INTO `%s` (`guild_id`,`opposition`,`alliance_id`,`name`) " + "VALUES ('%d','%d','%d','%s')", guild_alliance_db, + a->guild_id, a->opposition, g->guild_id, t_name); + //printf(" %s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `guild_alliance`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + } + + if (flag & 16 || guild_member == 0) + { + //printf("- Insert guild %d to guild_expulsion\n",g->guild_id); + for (i = 0; i < MAX_GUILDEXPLUSION; i++) + { + struct guild_explusion *e = &g->explusion[i]; + if (e->account_id > 0) + { + sprintf (tmp_sql, + "INSERT INTO `%s` (`guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3`) " + "VALUES ('%d','%s','%s','%s','%d','%d','%d','%d')", + guild_expulsion_db, g->guild_id, + jstrescapecpy (t_ename, e->name), + jstrescapecpy (t_emes, e->mes), e->acc, + e->account_id, e->rsv1, e->rsv2, e->rsv3); + //printf(" %s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf + ("DB server Error (insert `guild_expulsion`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + } + + if (flag & 32 || guild_member == 0) + { + //printf("- Insert guild %d to guild_skill\n",g->guild_id); + for (i = 0; i < MAX_GUILDSKILL; i++) + { + if (g->skill[i].id > 0) + { + sprintf (tmp_sql, + "INSERT INTO `%s` (`guild_id`,`id`,`lv`) VALUES ('%d','%d','%d')", + guild_skill_db, g->guild_id, g->skill[i].id, + g->skill[i].lv); + //printf("%s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `guild_skill`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + } + + printf ("Save guild done\n"); + return 0; } // Read guild from sql -int inter_guild_fromsql(int guild_id,struct guild *g) +int inter_guild_fromsql (int guild_id, struct guild *g) { - int i; - char emblem_data[4096]; - char *pstr; - - if (g==NULL) return 0; - memset(g,0,sizeof(struct guild)); - if (guild_id==0) return 0; - -// printf("Retrieve guild information from sql ......\n"); -// printf("- Read guild %d from sql \n",guild_id); - - sprintf(tmp_sql,"SELECT `guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data` " - "FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id); - //printf(" %s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (select `guild`)- %s\n", mysql_error(&mysql_handle) ); - return 0; - } - - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - sql_row = mysql_fetch_row(sql_res); - if (sql_row==NULL) { - mysql_free_result(sql_res); - return 0; - } - - g->guild_id=atoi(sql_row[0]); - strncpy(g->name,sql_row[1],24); - strncpy(g->master,sql_row[2],24); - g->guild_lv=atoi(sql_row[3]); - g->connect_member=atoi(sql_row[4]); - g->max_member=atoi(sql_row[5]); - g->average_lv=atoi(sql_row[6]); - g->exp=atoi(sql_row[7]); - g->next_exp=atoi(sql_row[8]); - g->skill_point=atoi(sql_row[9]); - g->castle_id=atoi(sql_row[10]); - strncpy(g->mes1,sql_row[11],60); - strncpy(g->mes2,sql_row[12],120); - g->emblem_len=atoi(sql_row[13]); - g->emblem_id=atoi(sql_row[14]); - strncpy(emblem_data,sql_row[15],4096); - for(i=0,pstr=emblem_data;i<g->emblem_len;i++,pstr+=2){ - int c1=pstr[0],c2=pstr[1],x1=0,x2=0; - if(c1>='0' && c1<='9')x1=c1-'0'; - if(c1>='a' && c1<='f')x1=c1-'a'+10; - if(c1>='A' && c1<='F')x1=c1-'A'+10; - if(c2>='0' && c2<='9')x2=c2-'0'; - if(c2>='a' && c2<='f')x2=c2-'a'+10; - if(c2>='A' && c2<='F')x2=c2-'A'+10; - g->emblem_data[i]=(x1<<4)|x2; - } - } - mysql_free_result(sql_res); - - //printf("- Read guild_member %d from sql \n",guild_id); - sprintf(tmp_sql,"SELECT `guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name` " - "FROM `%s` WHERE `guild_id`='%d' ORDER BY `position`", guild_member_db, guild_id); - //printf(" %s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (select `guild_member`)- %s\n", mysql_error(&mysql_handle) ); - return 0; - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - int i; - for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<g->max_member);i++){ - struct guild_member *m = &g->member[i]; - m->account_id=atoi(sql_row[1]); - m->char_id=atoi(sql_row[2]); - m->hair=atoi(sql_row[3]); - m->hair_color=atoi(sql_row[4]); - m->gender=atoi(sql_row[5]); - m->class=atoi(sql_row[6]); - m->lv=atoi(sql_row[7]); - m->exp=atoi(sql_row[8]); - m->exp_payper=atoi(sql_row[9]); - m->online=atoi(sql_row[10]); - m->position=atoi(sql_row[11]); - strncpy(m->name,sql_row[14],24); - } - } - mysql_free_result(sql_res); - - //printf("- Read guild_position %d from sql \n",guild_id); - sprintf(tmp_sql,"SELECT `guild_id`,`position`,`name`,`mode`,`exp_mode` FROM `%s` WHERE `guild_id`='%d'",guild_position_db, guild_id); - //printf(" %s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (select `guild_position`)- %s\n", mysql_error(&mysql_handle) ); - return 0; - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - int i; - for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDPOSITION);i++){ - int position = atoi(sql_row[1]); - struct guild_position *p = &g->position[position]; - strncpy(p->name,sql_row[2],24); - p->mode=atoi(sql_row[3]); - p->exp_mode=atoi(sql_row[4]); - } - } - mysql_free_result(sql_res); - - //printf("- Read guild_alliance %d from sql \n",guild_id); - sprintf(tmp_sql,"SELECT `guild_id`,`opposition`,`alliance_id`,`name` FROM `%s` WHERE `guild_id`='%d'",guild_alliance_db, guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (select `guild_alliance`)- %s\n", mysql_error(&mysql_handle) ); - return 0; - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - int i; - for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDALLIANCE);i++){ - struct guild_alliance *a = &g->alliance[i]; - a->opposition=atoi(sql_row[1]); - a->guild_id=atoi(sql_row[2]); - strncpy(a->name,sql_row[3],24); - } - } - mysql_free_result(sql_res); - - //printf("- Read guild_expulsion %d from sql \n",guild_id); - sprintf(tmp_sql,"SELECT `guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3` FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (select `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) ); - return 0; - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - int i; - for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDEXPLUSION);i++){ - struct guild_explusion *e = &g->explusion[i]; - - strncpy(e->name,sql_row[1],24); - strncpy(e->mes,sql_row[2],40); - strncpy(e->acc,sql_row[3],24); - e->account_id=atoi(sql_row[4]); - e->rsv1=atoi(sql_row[5]); - e->rsv2=atoi(sql_row[6]); - e->rsv3=atoi(sql_row[7]); - - } - } - mysql_free_result(sql_res); - - //printf("- Read guild_skill %d from sql \n",guild_id); - sprintf(tmp_sql,"SELECT `guild_id`,`id`,`lv` FROM `%s` WHERE `guild_id`='%d' ORDER BY `id`",guild_skill_db, guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (select `guild_skill`)- %s\n", mysql_error(&mysql_handle) ); - return 0; - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - int i; - for(i=0;((sql_row = mysql_fetch_row(sql_res))&&i<MAX_GUILDSKILL);i++){ - g->skill[i].id=atoi(sql_row[1]); - g->skill[i].lv=atoi(sql_row[2]); - } - } - mysql_free_result(sql_res); - -// printf("Successfully retrieve guild information from sql!\n"); - - return 0; - + int i; + char emblem_data[4096]; + char *pstr; + + if (g == NULL) + return 0; + memset (g, 0, sizeof (struct guild)); + if (guild_id == 0) + return 0; + +// printf("Retrieve guild information from sql ......\n"); +// printf("- Read guild %d from sql \n",guild_id); + + sprintf (tmp_sql, + "SELECT `guild_id`, `name`,`master`,`guild_lv`,`connect_member`,`max_member`,`average_lv`,`exp`,`next_exp`,`skill_point`,`castle_id`,`mes1`,`mes2`,`emblem_len`,`emblem_id`,`emblem_data` " + "FROM `%s` WHERE `guild_id`='%d'", guild_db, guild_id); + //printf(" %s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `guild`)- %s\n", + mysql_error (&mysql_handle)); + return 0; + } + + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + sql_row = mysql_fetch_row (sql_res); + if (sql_row == NULL) + { + mysql_free_result (sql_res); + return 0; + } + + g->guild_id = atoi (sql_row[0]); + strncpy (g->name, sql_row[1], 24); + strncpy (g->master, sql_row[2], 24); + g->guild_lv = atoi (sql_row[3]); + g->connect_member = atoi (sql_row[4]); + g->max_member = atoi (sql_row[5]); + g->average_lv = atoi (sql_row[6]); + g->exp = atoi (sql_row[7]); + g->next_exp = atoi (sql_row[8]); + g->skill_point = atoi (sql_row[9]); + g->castle_id = atoi (sql_row[10]); + strncpy (g->mes1, sql_row[11], 60); + strncpy (g->mes2, sql_row[12], 120); + g->emblem_len = atoi (sql_row[13]); + g->emblem_id = atoi (sql_row[14]); + strncpy (emblem_data, sql_row[15], 4096); + for (i = 0, pstr = emblem_data; i < g->emblem_len; i++, pstr += 2) + { + int c1 = pstr[0], c2 = pstr[1], x1 = 0, x2 = 0; + if (c1 >= '0' && c1 <= '9') + x1 = c1 - '0'; + if (c1 >= 'a' && c1 <= 'f') + x1 = c1 - 'a' + 10; + if (c1 >= 'A' && c1 <= 'F') + x1 = c1 - 'A' + 10; + if (c2 >= '0' && c2 <= '9') + x2 = c2 - '0'; + if (c2 >= 'a' && c2 <= 'f') + x2 = c2 - 'a' + 10; + if (c2 >= 'A' && c2 <= 'F') + x2 = c2 - 'A' + 10; + g->emblem_data[i] = (x1 << 4) | x2; + } + } + mysql_free_result (sql_res); + + //printf("- Read guild_member %d from sql \n",guild_id); + sprintf (tmp_sql, + "SELECT `guild_id`,`account_id`,`char_id`,`hair`,`hair_color`,`gender`,`class`,`lv`,`exp`,`exp_payper`,`online`,`position`,`rsv1`,`rsv2`,`name` " + "FROM `%s` WHERE `guild_id`='%d' ORDER BY `position`", + guild_member_db, guild_id); + //printf(" %s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `guild_member`)- %s\n", + mysql_error (&mysql_handle)); + return 0; + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + int i; + for (i = 0; + ((sql_row = mysql_fetch_row (sql_res)) && i < g->max_member); + i++) + { + struct guild_member *m = &g->member[i]; + m->account_id = atoi (sql_row[1]); + m->char_id = atoi (sql_row[2]); + m->hair = atoi (sql_row[3]); + m->hair_color = atoi (sql_row[4]); + m->gender = atoi (sql_row[5]); + m->class = atoi (sql_row[6]); + m->lv = atoi (sql_row[7]); + m->exp = atoi (sql_row[8]); + m->exp_payper = atoi (sql_row[9]); + m->online = atoi (sql_row[10]); + m->position = atoi (sql_row[11]); + strncpy (m->name, sql_row[14], 24); + } + } + mysql_free_result (sql_res); + + //printf("- Read guild_position %d from sql \n",guild_id); + sprintf (tmp_sql, + "SELECT `guild_id`,`position`,`name`,`mode`,`exp_mode` FROM `%s` WHERE `guild_id`='%d'", + guild_position_db, guild_id); + //printf(" %s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `guild_position`)- %s\n", + mysql_error (&mysql_handle)); + return 0; + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + int i; + for (i = 0; + ((sql_row = mysql_fetch_row (sql_res)) && i < MAX_GUILDPOSITION); + i++) + { + int position = atoi (sql_row[1]); + struct guild_position *p = &g->position[position]; + strncpy (p->name, sql_row[2], 24); + p->mode = atoi (sql_row[3]); + p->exp_mode = atoi (sql_row[4]); + } + } + mysql_free_result (sql_res); + + //printf("- Read guild_alliance %d from sql \n",guild_id); + sprintf (tmp_sql, + "SELECT `guild_id`,`opposition`,`alliance_id`,`name` FROM `%s` WHERE `guild_id`='%d'", + guild_alliance_db, guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `guild_alliance`)- %s\n", + mysql_error (&mysql_handle)); + return 0; + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + int i; + for (i = 0; + ((sql_row = mysql_fetch_row (sql_res)) && i < MAX_GUILDALLIANCE); + i++) + { + struct guild_alliance *a = &g->alliance[i]; + a->opposition = atoi (sql_row[1]); + a->guild_id = atoi (sql_row[2]); + strncpy (a->name, sql_row[3], 24); + } + } + mysql_free_result (sql_res); + + //printf("- Read guild_expulsion %d from sql \n",guild_id); + sprintf (tmp_sql, + "SELECT `guild_id`,`name`,`mes`,`acc`,`account_id`,`rsv1`,`rsv2`,`rsv3` FROM `%s` WHERE `guild_id`='%d'", + guild_expulsion_db, guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `guild_expulsion`)- %s\n", + mysql_error (&mysql_handle)); + return 0; + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + int i; + for (i = 0; + ((sql_row = mysql_fetch_row (sql_res)) + && i < MAX_GUILDEXPLUSION); i++) + { + struct guild_explusion *e = &g->explusion[i]; + + strncpy (e->name, sql_row[1], 24); + strncpy (e->mes, sql_row[2], 40); + strncpy (e->acc, sql_row[3], 24); + e->account_id = atoi (sql_row[4]); + e->rsv1 = atoi (sql_row[5]); + e->rsv2 = atoi (sql_row[6]); + e->rsv3 = atoi (sql_row[7]); + + } + } + mysql_free_result (sql_res); + + //printf("- Read guild_skill %d from sql \n",guild_id); + sprintf (tmp_sql, + "SELECT `guild_id`,`id`,`lv` FROM `%s` WHERE `guild_id`='%d' ORDER BY `id`", + guild_skill_db, guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `guild_skill`)- %s\n", + mysql_error (&mysql_handle)); + return 0; + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + int i; + for (i = 0; + ((sql_row = mysql_fetch_row (sql_res)) && i < MAX_GUILDSKILL); + i++) + { + g->skill[i].id = atoi (sql_row[1]); + g->skill[i].lv = atoi (sql_row[2]); + } + } + mysql_free_result (sql_res); + +// printf("Successfully retrieve guild information from sql!\n"); + + return 0; + } // Save guild_castle to sql -int inter_guildcastle_tosql(struct guild_castle *gc) +int inter_guildcastle_tosql (struct guild_castle *gc) { - // `guild_castle` (`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, `visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`) - - if (gc==NULL) return 0; - //printf("Save to guild_castle\n"); - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `castle_id`='%d'",guild_castle_db, gc->castle_id); - //printf(" %s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - return 0; - } - - sprintf(tmp_sql,"INSERT INTO `%s` " - "(`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`," - "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`," - "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`)" - "VALUES ('%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d')", - guild_castle_db, gc->castle_id, gc->guild_id, gc->economy, gc->defense, gc->triggerE, gc->triggerD, gc->nextTime, gc->payTime, - gc->createTime, gc->visibleC, gc->visibleG0, gc->visibleG1, gc->visibleG2, gc->visibleG3, gc->visibleG4, gc->visibleG5, - gc->visibleG6, gc->visibleG7, gc->Ghp0, gc->Ghp1, gc->Ghp2, gc->Ghp3, gc->Ghp4, gc->Ghp5, gc->Ghp6, gc->Ghp7); - //printf(" %s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - return 0; - } - - sprintf(tmp_sql,"UPDATE `%s` SET `castle_id`='-1' WHERE `castle_id`='%d'",guild_db, gc->castle_id); - //printf(" %s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - return 0; - } - - sprintf(tmp_sql,"UPDATE `%s` SET `castle_id`='%d' WHERE `guild_id`='%d'",guild_db, gc->castle_id,gc->guild_id); - //printf(" %s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - return 0; - } - - return 0; + // `guild_castle` (`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, `visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`) + + if (gc == NULL) + return 0; + //printf("Save to guild_castle\n"); + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `castle_id`='%d'", + guild_castle_db, gc->castle_id); + //printf(" %s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + return 0; + } + + sprintf (tmp_sql, "INSERT INTO `%s` " + "(`castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`," + "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`," + "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`)" + "VALUES ('%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d','%d')", + guild_castle_db, gc->castle_id, gc->guild_id, gc->economy, + gc->defense, gc->triggerE, gc->triggerD, gc->nextTime, + gc->payTime, gc->createTime, gc->visibleC, gc->visibleG0, + gc->visibleG1, gc->visibleG2, gc->visibleG3, gc->visibleG4, + gc->visibleG5, gc->visibleG6, gc->visibleG7, gc->Ghp0, gc->Ghp1, + gc->Ghp2, gc->Ghp3, gc->Ghp4, gc->Ghp5, gc->Ghp6, gc->Ghp7); + //printf(" %s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + return 0; + } + + sprintf (tmp_sql, + "UPDATE `%s` SET `castle_id`='-1' WHERE `castle_id`='%d'", + guild_db, gc->castle_id); + //printf(" %s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + return 0; + } + + sprintf (tmp_sql, + "UPDATE `%s` SET `castle_id`='%d' WHERE `guild_id`='%d'", + guild_db, gc->castle_id, gc->guild_id); + //printf(" %s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + return 0; + } + + return 0; } + // Read guild_castle from sql -int inter_guildcastle_fromsql(int castle_id,struct guild_castle *gc) +int inter_guildcastle_fromsql (int castle_id, struct guild_castle *gc) { - - if (gc==NULL) return 0; - //printf("Read from guild_castle\n"); - memset(gc,0,sizeof(struct guild_castle)); - gc->castle_id=castle_id; - if (castle_id==-1) return 0; - sprintf(tmp_sql,"SELECT `castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, " - "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`," - "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`" - " FROM `%s` WHERE `castle_id`='%d'",guild_castle_db, castle_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - return 0; - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - sql_row = mysql_fetch_row(sql_res); - if (sql_row==NULL){ - mysql_free_result(sql_res); - return 0; - } - - gc->guild_id = atoi (sql_row[1]); - gc->economy = atoi (sql_row[2]); - gc->defense = atoi (sql_row[3]); - gc->triggerE = atoi (sql_row[4]); - gc->triggerD = atoi (sql_row[5]); - gc->nextTime = atoi (sql_row[6]); - gc->payTime = atoi (sql_row[7]); - gc->createTime = atoi (sql_row[8]); - gc->visibleC = atoi (sql_row[9]); - gc->visibleG0 = atoi (sql_row[10]); - gc->visibleG1 = atoi (sql_row[11]); - gc->visibleG2 = atoi (sql_row[12]); - gc->visibleG3 = atoi (sql_row[13]); - gc->visibleG4 = atoi (sql_row[14]); - gc->visibleG5 = atoi (sql_row[15]); - gc->visibleG6 = atoi (sql_row[16]); - gc->visibleG7 = atoi (sql_row[17]); - gc->Ghp0 = atoi (sql_row[18]); - gc->Ghp1 = atoi (sql_row[19]); - gc->Ghp2 = atoi (sql_row[20]); - gc->Ghp3 = atoi (sql_row[21]); - gc->Ghp4 = atoi (sql_row[22]); - gc->Ghp5 = atoi (sql_row[23]); - gc->Ghp6 = atoi (sql_row[24]); - gc->Ghp7 = atoi (sql_row[25]); - - //printf("Read Castle %d of guild %d from sql \n",castle_id,gc->guild_id); - - } - mysql_free_result(sql_res) ; //resource free - return 0; + + if (gc == NULL) + return 0; + //printf("Read from guild_castle\n"); + memset (gc, 0, sizeof (struct guild_castle)); + gc->castle_id = castle_id; + if (castle_id == -1) + return 0; + sprintf (tmp_sql, + "SELECT `castle_id`, `guild_id`, `economy`, `defense`, `triggerE`, `triggerD`, `nextTime`, `payTime`, `createTime`, " + "`visibleC`, `visibleG0`, `visibleG1`, `visibleG2`, `visibleG3`, `visibleG4`, `visibleG5`, `visibleG6`, `visibleG7`," + "`Ghp0`, `Ghp1`, `Ghp2`, `Ghp3`, `Ghp4`, `Ghp5`, `Ghp6`, `Ghp7`" + " FROM `%s` WHERE `castle_id`='%d'", guild_castle_db, castle_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + return 0; + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + sql_row = mysql_fetch_row (sql_res); + if (sql_row == NULL) + { + mysql_free_result (sql_res); + return 0; + } + + gc->guild_id = atoi (sql_row[1]); + gc->economy = atoi (sql_row[2]); + gc->defense = atoi (sql_row[3]); + gc->triggerE = atoi (sql_row[4]); + gc->triggerD = atoi (sql_row[5]); + gc->nextTime = atoi (sql_row[6]); + gc->payTime = atoi (sql_row[7]); + gc->createTime = atoi (sql_row[8]); + gc->visibleC = atoi (sql_row[9]); + gc->visibleG0 = atoi (sql_row[10]); + gc->visibleG1 = atoi (sql_row[11]); + gc->visibleG2 = atoi (sql_row[12]); + gc->visibleG3 = atoi (sql_row[13]); + gc->visibleG4 = atoi (sql_row[14]); + gc->visibleG5 = atoi (sql_row[15]); + gc->visibleG6 = atoi (sql_row[16]); + gc->visibleG7 = atoi (sql_row[17]); + gc->Ghp0 = atoi (sql_row[18]); + gc->Ghp1 = atoi (sql_row[19]); + gc->Ghp2 = atoi (sql_row[20]); + gc->Ghp3 = atoi (sql_row[21]); + gc->Ghp4 = atoi (sql_row[22]); + gc->Ghp5 = atoi (sql_row[23]); + gc->Ghp6 = atoi (sql_row[24]); + gc->Ghp7 = atoi (sql_row[25]); + + //printf("Read Castle %d of guild %d from sql \n",castle_id,gc->guild_id); + + } + mysql_free_result (sql_res); //resource free + return 0; } // Read exp_guild.txt -int inter_guild_readdb() +int inter_guild_readdb () { - int i; - FILE *fp; - char line[1024]; - for (i=0;i<100;i++) guild_exp[i]=0; - - fp=fopen_("db/exp_guild.txt","r"); - if(fp==NULL){ - printf("can't read db/exp_guild.txt\n"); - return 1; - } - i=0; - while(fgets(line,256,fp) && i<100){ - if(line[0]=='/' && line[1]=='/') - continue; - guild_exp[i]=atoi(line); - i++; - } - fclose_(fp); - - return 0; + int i; + FILE *fp; + char line[1024]; + for (i = 0; i < 100; i++) + guild_exp[i] = 0; + + fp = fopen_ ("db/exp_guild.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/exp_guild.txt\n"); + return 1; + } + i = 0; + while (fgets (line, 256, fp) && i < 100) + { + if (line[0] == '/' && line[1] == '/') + continue; + guild_exp[i] = atoi (line); + i++; + } + fclose_ (fp); + + return 0; } - // Initialize guild sql -int inter_guild_sql_init() +int inter_guild_sql_init () { - int i; - - printf("interserver guild memory initialize.... (%d byte)\n",sizeof(struct guild)); - guild_pt = calloc(sizeof(struct guild), 1); - guild_pt2= calloc(sizeof(struct guild), 1); - guildcastle_pt=calloc(sizeof(struct guild_castle), 1); - - inter_guild_readdb(); // Read exp - - sprintf(tmp_sql,"UPDATE `%s` SET `online`='0'",guild_member_db); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); - exit(0); - } - - sprintf (tmp_sql , "SELECT count(*) FROM `%s`",guild_db); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - exit(0); - } - sql_res = mysql_store_result(&mysql_handle) ; - sql_row = mysql_fetch_row(sql_res); - printf("total guild data -> '%s'.......\n",sql_row[0]); - i = atoi (sql_row[0]); - mysql_free_result(sql_res); - - if (i > 0) { - //set party_newid - sprintf (tmp_sql , "SELECT max(`guild_id`) FROM `%s`",guild_db); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - exit(0); - } - - sql_res = mysql_store_result(&mysql_handle) ; - sql_row = mysql_fetch_row(sql_res); - guild_newid = atoi(sql_row[0])+1; - mysql_free_result(sql_res); - } - - printf("set guild_newid: %d.......\n",guild_newid); - - return 0; + int i; + + printf ("interserver guild memory initialize.... (%d byte)\n", + sizeof (struct guild)); + guild_pt = calloc (sizeof (struct guild), 1); + guild_pt2 = calloc (sizeof (struct guild), 1); + guildcastle_pt = calloc (sizeof (struct guild_castle), 1); + + inter_guild_readdb (); // Read exp + + sprintf (tmp_sql, "UPDATE `%s` SET `online`='0'", guild_member_db); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (update `char`)- %s\n", + mysql_error (&mysql_handle)); + exit (0); + } + + sprintf (tmp_sql, "SELECT count(*) FROM `%s`", guild_db); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + exit (0); + } + sql_res = mysql_store_result (&mysql_handle); + sql_row = mysql_fetch_row (sql_res); + printf ("total guild data -> '%s'.......\n", sql_row[0]); + i = atoi (sql_row[0]); + mysql_free_result (sql_res); + + if (i > 0) + { + //set party_newid + sprintf (tmp_sql, "SELECT max(`guild_id`) FROM `%s`", guild_db); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + exit (0); + } + + sql_res = mysql_store_result (&mysql_handle); + sql_row = mysql_fetch_row (sql_res); + guild_newid = atoi (sql_row[0]) + 1; + mysql_free_result (sql_res); + } + + printf ("set guild_newid: %d.......\n", guild_newid); + + return 0; } - // Get guild by its name -struct guild* search_guildname(char *str) +struct guild *search_guildname (char *str) { - struct guild *g=guild_pt; - char t_name[24]; - int guild_id=0; - printf("search_guildname\n"); - sprintf (tmp_sql , "SELECT `guild_id` FROM `%s` WHERE `name`='%s'",guild_db, jstrescapecpy(t_name,str)); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - sql_row = mysql_fetch_row(sql_res); - guild_id = atoi (sql_row[0]); - } - mysql_free_result(sql_res); - inter_guild_fromsql(guild_id,g); - return g; + struct guild *g = guild_pt; + char t_name[24]; + int guild_id = 0; + printf ("search_guildname\n"); + sprintf (tmp_sql, "SELECT `guild_id` FROM `%s` WHERE `name`='%s'", + guild_db, jstrescapecpy (t_name, str)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + sql_row = mysql_fetch_row (sql_res); + guild_id = atoi (sql_row[0]); + } + mysql_free_result (sql_res); + inter_guild_fromsql (guild_id, g); + return g; } // Check if guild is empty -int guild_check_empty(struct guild *g) +int guild_check_empty (struct guild *g) { - int i; - for(i=0;i<g->max_member;i++){ - if(g->member[i].account_id>0){ - return 0; - } - } - - // 誰もいないので解散 - mapif_guild_broken(g->guild_id,0); - inter_guild_storage_delete(g->guild_id); - inter_guild_tosql(g,255); - memset(g,0,sizeof(struct guild)); - return 1; + int i; + for (i = 0; i < g->max_member; i++) + { + if (g->member[i].account_id > 0) + { + return 0; + } + } + + // 誰もいないので解散 + mapif_guild_broken (g->guild_id, 0); + inter_guild_storage_delete (g->guild_id); + inter_guild_tosql (g, 255); + memset (g, 0, sizeof (struct guild)); + return 1; } -int guild_nextexp(int level) +int guild_nextexp (int level) { - if(level < 100 && level >0) // Change by hack - return guild_exp[level-1]; + if (level < 100 && level > 0) // Change by hack + return guild_exp[level - 1]; - return 0; + return 0; } // ギルドスキルがあるか確認 -int guild_checkskill(struct guild *g,int id){ return g->skill[id-10000].lv; } +int guild_checkskill (struct guild *g, int id) +{ + return g->skill[id - 10000].lv; +} // ギルドの情報の再計算 -int guild_calcinfo(struct guild *g) +int guild_calcinfo (struct guild *g) { - int i,c,nextexp; - struct guild before=*g; - - // スキルIDの設定 - for(i=0;i<5;i++) - g->skill[i].id=i+10000; - - // ギルドレベル - if(g->guild_lv<=0) g->guild_lv=1; - nextexp = guild_nextexp(g->guild_lv); - if(nextexp > 0) { - while(g->exp >= nextexp && nextexp>0){ // Change by hack - g->exp-=nextexp; - g->guild_lv++; - g->skill_point++; - nextexp = guild_nextexp(g->guild_lv); - } - } - - // ギルドの次の経験値 - g->next_exp = guild_nextexp(g->guild_lv); - - // メンバ上限(ギルド拡張適用) - g->max_member=16+guild_checkskill(g,10004)*2; // Updated max_members [PoW] - - // 平均レベルとオンライン人数 - g->average_lv=0; - g->connect_member=0; - for(i=c=0;i<g->max_member;i++){ - if(g->member[i].account_id>0){ - g->average_lv+=g->member[i].lv; - c++; - - if(g->member[i].online>0) - g->connect_member++; - } - } - g->average_lv/=c; - - // 全データを送る必要がありそう - if( g->max_member!=before.max_member || - g->guild_lv!=before.guild_lv || - g->skill_point!=before.skill_point ){ - mapif_guild_info(-1,g); - return 1; - } - - return 0; + int i, c, nextexp; + struct guild before = *g; + + // スキルIDの設定 + for (i = 0; i < 5; i++) + g->skill[i].id = i + 10000; + + // ギルドレベル + if (g->guild_lv <= 0) + g->guild_lv = 1; + nextexp = guild_nextexp (g->guild_lv); + if (nextexp > 0) + { + while (g->exp >= nextexp && nextexp > 0) + { // Change by hack + g->exp -= nextexp; + g->guild_lv++; + g->skill_point++; + nextexp = guild_nextexp (g->guild_lv); + } + } + + // ギルドの次の経験値 + g->next_exp = guild_nextexp (g->guild_lv); + + // メンバ上限(ギルド拡張適用) + g->max_member = 16 + guild_checkskill (g, 10004) * 2; // Updated max_members [PoW] + + // 平均レベルとオンライン人数 + g->average_lv = 0; + g->connect_member = 0; + for (i = c = 0; i < g->max_member; i++) + { + if (g->member[i].account_id > 0) + { + g->average_lv += g->member[i].lv; + c++; + + if (g->member[i].online > 0) + g->connect_member++; + } + } + g->average_lv /= c; + + // 全データを送る必要がありそう + if (g->max_member != before.max_member || + g->guild_lv != before.guild_lv || + g->skill_point != before.skill_point) + { + mapif_guild_info (-1, g); + return 1; + } + + return 0; } //------------------------------------------------------------------- // map serverへの通信 // ギルド作成可否 -int mapif_guild_created(int fd,int account_id,struct guild *g) +int mapif_guild_created (int fd, int account_id, struct guild *g) { - WFIFOW(fd,0)=0x3830; - WFIFOL(fd,2)=account_id; - if(g!=NULL){ - WFIFOL(fd,6)=g->guild_id; - printf("int_guild: created! %d %s\n",g->guild_id,g->name); - }else{ - WFIFOL(fd,6)=0; - } - WFIFOSET(fd,10); - return 0; + WFIFOW (fd, 0) = 0x3830; + WFIFOL (fd, 2) = account_id; + if (g != NULL) + { + WFIFOL (fd, 6) = g->guild_id; + printf ("int_guild: created! %d %s\n", g->guild_id, g->name); + } + else + { + WFIFOL (fd, 6) = 0; + } + WFIFOSET (fd, 10); + return 0; } + // ギルド情報見つからず -int mapif_guild_noinfo(int fd,int guild_id) +int mapif_guild_noinfo (int fd, int guild_id) { - WFIFOW(fd,0)=0x3831; - WFIFOW(fd,2)=8; - WFIFOL(fd,4)=guild_id; - WFIFOSET(fd,8); - printf("int_guild: info not found %d\n",guild_id); - return 0; + WFIFOW (fd, 0) = 0x3831; + WFIFOW (fd, 2) = 8; + WFIFOL (fd, 4) = guild_id; + WFIFOSET (fd, 8); + printf ("int_guild: info not found %d\n", guild_id); + return 0; } + // ギルド情報まとめ送り -int mapif_guild_info(int fd,struct guild *g) +int mapif_guild_info (int fd, struct guild *g) { - unsigned char buf[16384]; - WBUFW(buf,0)=0x3831; - memcpy(buf+4,g,sizeof(struct guild)); - WBUFW(buf,2)=4+sizeof(struct guild); -// printf("int_guild: sizeof(guild)=%d\n",sizeof(struct guild)); - if(fd<0) - mapif_sendall(buf,WBUFW(buf,2)); - else - mapif_send(fd,buf,WBUFW(buf,2)); -// printf("int_guild: info %d %s\n",p->guild_id,p->name); - return 0; + unsigned char buf[16384]; + WBUFW (buf, 0) = 0x3831; + memcpy (buf + 4, g, sizeof (struct guild)); + WBUFW (buf, 2) = 4 + sizeof (struct guild); +// printf("int_guild: sizeof(guild)=%d\n",sizeof(struct guild)); + if (fd < 0) + mapif_sendall (buf, WBUFW (buf, 2)); + else + mapif_send (fd, buf, WBUFW (buf, 2)); +// printf("int_guild: info %d %s\n",p->guild_id,p->name); + return 0; } // メンバ追加可否 -int mapif_guild_memberadded(int fd,int guild_id,int account_id,int char_id,int flag) +int mapif_guild_memberadded (int fd, int guild_id, int account_id, + int char_id, int flag) { - WFIFOW(fd,0)=0x3832; - WFIFOL(fd,2)=guild_id; - WFIFOL(fd,6)=account_id; - WFIFOL(fd,10)=char_id; - WFIFOB(fd,14)=flag; - WFIFOSET(fd,15); - return 0; + WFIFOW (fd, 0) = 0x3832; + WFIFOL (fd, 2) = guild_id; + WFIFOL (fd, 6) = account_id; + WFIFOL (fd, 10) = char_id; + WFIFOB (fd, 14) = flag; + WFIFOSET (fd, 15); + return 0; } + // 脱退/追放通知 -int mapif_guild_leaved(int guild_id,int account_id,int char_id,int flag, - const char *name,const char *mes) +int mapif_guild_leaved (int guild_id, int account_id, int char_id, int flag, + const char *name, const char *mes) { - unsigned char buf[128]; - WBUFW(buf, 0)=0x3834; - WBUFL(buf, 2)=guild_id; - WBUFL(buf, 6)=account_id; - WBUFL(buf,10)=char_id; - WBUFB(buf,14)=flag; - memcpy(WBUFP(buf,15),mes,40); - memcpy(WBUFP(buf,55),name,24); - mapif_sendall(buf,79); - printf("int_guild: guild leaved %d %d %s %s\n",guild_id,account_id,name,mes); - return 0; + unsigned char buf[128]; + WBUFW (buf, 0) = 0x3834; + WBUFL (buf, 2) = guild_id; + WBUFL (buf, 6) = account_id; + WBUFL (buf, 10) = char_id; + WBUFB (buf, 14) = flag; + memcpy (WBUFP (buf, 15), mes, 40); + memcpy (WBUFP (buf, 55), name, 24); + mapif_sendall (buf, 79); + printf ("int_guild: guild leaved %d %d %s %s\n", guild_id, account_id, + name, mes); + return 0; } // オンライン状態とLv更新通知 -int mapif_guild_memberinfoshort(struct guild *g,int idx) +int mapif_guild_memberinfoshort (struct guild *g, int idx) { - unsigned char buf[32]; - WBUFW(buf, 0)=0x3835; - WBUFL(buf, 2)=g->guild_id; - WBUFL(buf, 6)=g->member[idx].account_id; - WBUFL(buf,10)=g->member[idx].char_id; - WBUFB(buf,14)=g->member[idx].online; - WBUFW(buf,15)=g->member[idx].lv; - WBUFW(buf,17)=g->member[idx].class; - mapif_sendall(buf,19); - return 0; + unsigned char buf[32]; + WBUFW (buf, 0) = 0x3835; + WBUFL (buf, 2) = g->guild_id; + WBUFL (buf, 6) = g->member[idx].account_id; + WBUFL (buf, 10) = g->member[idx].char_id; + WBUFB (buf, 14) = g->member[idx].online; + WBUFW (buf, 15) = g->member[idx].lv; + WBUFW (buf, 17) = g->member[idx].class; + mapif_sendall (buf, 19); + return 0; } // 解散通知 -int mapif_guild_broken(int guild_id,int flag) +int mapif_guild_broken (int guild_id, int flag) { - unsigned char buf[16]; - WBUFW(buf,0)=0x3836; - WBUFL(buf,2)=guild_id; - WBUFB(buf,6)=flag; - mapif_sendall(buf,7); - printf("int_guild: broken %d\n",guild_id); - return 0; + unsigned char buf[16]; + WBUFW (buf, 0) = 0x3836; + WBUFL (buf, 2) = guild_id; + WBUFB (buf, 6) = flag; + mapif_sendall (buf, 7); + printf ("int_guild: broken %d\n", guild_id); + return 0; } // ギルド内発言 -int mapif_guild_message(int guild_id,int account_id,char *mes,int len) +int mapif_guild_message (int guild_id, int account_id, char *mes, int len) { - unsigned char buf[512]; - WBUFW(buf,0)=0x3837; - WBUFW(buf,2)=len+12; - WBUFL(buf,4)=guild_id; - WBUFL(buf,8)=account_id; - memcpy(WBUFP(buf,12),mes,len); - mapif_sendall(buf,len+12); - return 0; + unsigned char buf[512]; + WBUFW (buf, 0) = 0x3837; + WBUFW (buf, 2) = len + 12; + WBUFL (buf, 4) = guild_id; + WBUFL (buf, 8) = account_id; + memcpy (WBUFP (buf, 12), mes, len); + mapif_sendall (buf, len + 12); + return 0; } // ギルド基本情報変更通知 -int mapif_guild_basicinfochanged(int guild_id,int type,const void *data,int len) +int mapif_guild_basicinfochanged (int guild_id, int type, const void *data, + int len) { - unsigned char buf[2048]; - WBUFW(buf, 0)=0x3839; - WBUFW(buf, 2)=len+10; - WBUFL(buf, 4)=guild_id; - WBUFW(buf, 8)=type; - memcpy(WBUFP(buf,10),data,len); - mapif_sendall(buf,len+10); - return 0; + unsigned char buf[2048]; + WBUFW (buf, 0) = 0x3839; + WBUFW (buf, 2) = len + 10; + WBUFL (buf, 4) = guild_id; + WBUFW (buf, 8) = type; + memcpy (WBUFP (buf, 10), data, len); + mapif_sendall (buf, len + 10); + return 0; } + // ギルドメンバ情報変更通知 -int mapif_guild_memberinfochanged(int guild_id,int account_id,int char_id, - int type,const void *data,int len) +int mapif_guild_memberinfochanged (int guild_id, int account_id, int char_id, + int type, const void *data, int len) { - unsigned char buf[2048]; - WBUFW(buf, 0)=0x383a; - WBUFW(buf, 2)=len+18; - WBUFL(buf, 4)=guild_id; - WBUFL(buf, 8)=account_id; - WBUFL(buf,12)=char_id; - WBUFW(buf,16)=type; - memcpy(WBUFP(buf,18),data,len); - mapif_sendall(buf,len+18); - return 0; + unsigned char buf[2048]; + WBUFW (buf, 0) = 0x383a; + WBUFW (buf, 2) = len + 18; + WBUFL (buf, 4) = guild_id; + WBUFL (buf, 8) = account_id; + WBUFL (buf, 12) = char_id; + WBUFW (buf, 16) = type; + memcpy (WBUFP (buf, 18), data, len); + mapif_sendall (buf, len + 18); + return 0; } + // ギルドスキルアップ通知 -int mapif_guild_skillupack(int guild_id,int skill_num,int account_id) +int mapif_guild_skillupack (int guild_id, int skill_num, int account_id) { - unsigned char buf[16]; - WBUFW(buf, 0)=0x383c; - WBUFL(buf, 2)=guild_id; - WBUFL(buf, 6)=skill_num; - WBUFL(buf,10)=account_id; - mapif_sendall(buf,14); - return 0; + unsigned char buf[16]; + WBUFW (buf, 0) = 0x383c; + WBUFL (buf, 2) = guild_id; + WBUFL (buf, 6) = skill_num; + WBUFL (buf, 10) = account_id; + mapif_sendall (buf, 14); + return 0; } + // ギルド同盟/敵対通知 -int mapif_guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2, - int flag,const char *name1,const char *name2) +int mapif_guild_alliance (int guild_id1, int guild_id2, int account_id1, + int account_id2, int flag, const char *name1, + const char *name2) { - unsigned char buf[128]; - WBUFW(buf, 0)=0x383d; - WBUFL(buf, 2)=guild_id1; - WBUFL(buf, 6)=guild_id2; - WBUFL(buf,10)=account_id1; - WBUFL(buf,14)=account_id2; - WBUFB(buf,18)=flag; - memcpy(WBUFP(buf,19),name1,24); - memcpy(WBUFP(buf,43),name2,24); - mapif_sendall(buf,67); - return 0; + unsigned char buf[128]; + WBUFW (buf, 0) = 0x383d; + WBUFL (buf, 2) = guild_id1; + WBUFL (buf, 6) = guild_id2; + WBUFL (buf, 10) = account_id1; + WBUFL (buf, 14) = account_id2; + WBUFB (buf, 18) = flag; + memcpy (WBUFP (buf, 19), name1, 24); + memcpy (WBUFP (buf, 43), name2, 24); + mapif_sendall (buf, 67); + return 0; } // ギルド役職変更通知 -int mapif_guild_position(struct guild *g,int idx) +int mapif_guild_position (struct guild *g, int idx) { - unsigned char buf[128]; - WBUFW(buf,0)=0x383b; - WBUFW(buf,2)=sizeof(struct guild_position)+12; - WBUFL(buf,4)=g->guild_id; - WBUFL(buf,8)=idx; - memcpy(WBUFP(buf,12),&g->position[idx],sizeof(struct guild_position)); - mapif_sendall(buf,WBUFW(buf,2)); - return 0; + unsigned char buf[128]; + WBUFW (buf, 0) = 0x383b; + WBUFW (buf, 2) = sizeof (struct guild_position) + 12; + WBUFL (buf, 4) = g->guild_id; + WBUFL (buf, 8) = idx; + memcpy (WBUFP (buf, 12), &g->position[idx], + sizeof (struct guild_position)); + mapif_sendall (buf, WBUFW (buf, 2)); + return 0; } // ギルド告知変更通知 -int mapif_guild_notice(struct guild *g) +int mapif_guild_notice (struct guild *g) { - unsigned char buf[256]; - WBUFW(buf,0)=0x383e; - WBUFL(buf,2)=g->guild_id; - memcpy(WBUFP(buf,6),g->mes1,60); - memcpy(WBUFP(buf,66),g->mes2,120); - mapif_sendall(buf,186); - return 0; + unsigned char buf[256]; + WBUFW (buf, 0) = 0x383e; + WBUFL (buf, 2) = g->guild_id; + memcpy (WBUFP (buf, 6), g->mes1, 60); + memcpy (WBUFP (buf, 66), g->mes2, 120); + mapif_sendall (buf, 186); + return 0; } + // ギルドエンブレム変更通知 -int mapif_guild_emblem(struct guild *g) +int mapif_guild_emblem (struct guild *g) { - unsigned char buf[2048]; - WBUFW(buf,0)=0x383f; - WBUFW(buf,2)=g->emblem_len+12; - WBUFL(buf,4)=g->guild_id; - WBUFL(buf,8)=g->emblem_id; - memcpy(WBUFP(buf,12),g->emblem_data,g->emblem_len); - mapif_sendall(buf,WBUFW(buf,2)); - return 0; + unsigned char buf[2048]; + WBUFW (buf, 0) = 0x383f; + WBUFW (buf, 2) = g->emblem_len + 12; + WBUFL (buf, 4) = g->guild_id; + WBUFL (buf, 8) = g->emblem_id; + memcpy (WBUFP (buf, 12), g->emblem_data, g->emblem_len); + mapif_sendall (buf, WBUFW (buf, 2)); + return 0; } -int mapif_guild_castle_dataload(int castle_id,int index,int value) // <Agit> +int mapif_guild_castle_dataload (int castle_id, int index, int value) // <Agit> { - unsigned char buf[16]; - WBUFW(buf, 0)=0x3840; - WBUFW(buf, 2)=castle_id; - WBUFB(buf, 4)=index; - WBUFL(buf, 5)=value; - mapif_sendall(buf,9); - return 0; + unsigned char buf[16]; + WBUFW (buf, 0) = 0x3840; + WBUFW (buf, 2) = castle_id; + WBUFB (buf, 4) = index; + WBUFL (buf, 5) = value; + mapif_sendall (buf, 9); + return 0; } -int mapif_guild_castle_datasave(int castle_id,int index,int value) // <Agit> +int mapif_guild_castle_datasave (int castle_id, int index, int value) // <Agit> { - unsigned char buf[16]; - WBUFW(buf, 0)=0x3841; - WBUFW(buf, 2)=castle_id; - WBUFB(buf, 4)=index; - WBUFL(buf, 5)=value; - mapif_sendall(buf,9); - return 0; + unsigned char buf[16]; + WBUFW (buf, 0) = 0x3841; + WBUFW (buf, 2) = castle_id; + WBUFB (buf, 4) = index; + WBUFL (buf, 5) = value; + mapif_sendall (buf, 9); + return 0; } -int mapif_guild_castle_alldataload(int fd) { - struct guild_castle* gc = guildcastle_pt; - int i, len = 4; - - WFIFOW(fd,0) = 0x3842; - sprintf(tmp_sql, "SELECT * FROM `%s` ORDER BY `castle_id`", guild_castle_db); - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle); - if (sql_res != NULL && mysql_num_rows(sql_res) > 0) { - for(i = 0; ((sql_row = mysql_fetch_row(sql_res)) && i < MAX_GUILDCASTLE); i++) { - memset(gc, 0, sizeof(struct guild_castle)); - gc->castle_id = atoi(sql_row[0]); - gc->guild_id = atoi(sql_row[1]); - gc->economy = atoi(sql_row[2]); - gc->defense = atoi(sql_row[3]); - gc->triggerE = atoi(sql_row[4]); - gc->triggerD = atoi(sql_row[5]); - gc->nextTime = atoi(sql_row[6]); - gc->payTime = atoi(sql_row[7]); - gc->createTime = atoi(sql_row[8]); - gc->visibleC = atoi(sql_row[9]); - gc->visibleG0 = atoi(sql_row[10]); - gc->visibleG1 = atoi(sql_row[11]); - gc->visibleG2 = atoi(sql_row[12]); - gc->visibleG3 = atoi(sql_row[13]); - gc->visibleG4 = atoi(sql_row[14]); - gc->visibleG5 = atoi(sql_row[15]); - gc->visibleG6 = atoi(sql_row[16]); - gc->visibleG7 = atoi(sql_row[17]); - gc->Ghp0 = atoi(sql_row[18]); - gc->Ghp1 = atoi(sql_row[19]); - gc->Ghp2 = atoi(sql_row[20]); - gc->Ghp3 = atoi(sql_row[21]); - gc->Ghp4 = atoi(sql_row[22]); - gc->Ghp5 = atoi(sql_row[23]); - gc->Ghp6 = atoi(sql_row[24]); - gc->Ghp7 = atoi(sql_row[25]); - memcpy(WFIFOP(fd,len), gc, sizeof(struct guild_castle)); - len += sizeof(struct guild_castle); - } - } - mysql_free_result(sql_res); - WFIFOW(fd,2) = len; - WFIFOSET(fd,len); - - return 0; +int mapif_guild_castle_alldataload (int fd) +{ + struct guild_castle *gc = guildcastle_pt; + int i, len = 4; + + WFIFOW (fd, 0) = 0x3842; + sprintf (tmp_sql, "SELECT * FROM `%s` ORDER BY `castle_id`", + guild_castle_db); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + for (i = 0; + ((sql_row = mysql_fetch_row (sql_res)) && i < MAX_GUILDCASTLE); + i++) + { + memset (gc, 0, sizeof (struct guild_castle)); + gc->castle_id = atoi (sql_row[0]); + gc->guild_id = atoi (sql_row[1]); + gc->economy = atoi (sql_row[2]); + gc->defense = atoi (sql_row[3]); + gc->triggerE = atoi (sql_row[4]); + gc->triggerD = atoi (sql_row[5]); + gc->nextTime = atoi (sql_row[6]); + gc->payTime = atoi (sql_row[7]); + gc->createTime = atoi (sql_row[8]); + gc->visibleC = atoi (sql_row[9]); + gc->visibleG0 = atoi (sql_row[10]); + gc->visibleG1 = atoi (sql_row[11]); + gc->visibleG2 = atoi (sql_row[12]); + gc->visibleG3 = atoi (sql_row[13]); + gc->visibleG4 = atoi (sql_row[14]); + gc->visibleG5 = atoi (sql_row[15]); + gc->visibleG6 = atoi (sql_row[16]); + gc->visibleG7 = atoi (sql_row[17]); + gc->Ghp0 = atoi (sql_row[18]); + gc->Ghp1 = atoi (sql_row[19]); + gc->Ghp2 = atoi (sql_row[20]); + gc->Ghp3 = atoi (sql_row[21]); + gc->Ghp4 = atoi (sql_row[22]); + gc->Ghp5 = atoi (sql_row[23]); + gc->Ghp6 = atoi (sql_row[24]); + gc->Ghp7 = atoi (sql_row[25]); + memcpy (WFIFOP (fd, len), gc, sizeof (struct guild_castle)); + len += sizeof (struct guild_castle); + } + } + mysql_free_result (sql_res); + WFIFOW (fd, 2) = len; + WFIFOSET (fd, len); + + return 0; } - //------------------------------------------------------------------- // map serverからの通信 - // ギルド作成要求 -int mapif_parse_CreateGuild(int fd,int account_id,char *name,struct guild_member *master) +int mapif_parse_CreateGuild (int fd, int account_id, char *name, + struct guild_member *master) { - struct guild *g; - int i; - - printf("CreateGuild\n"); - g=search_guildname(name); - if(g!=NULL&&g->guild_id>0){ - printf("int_guild: same name guild exists [%s]\n",name); - mapif_guild_created(fd,account_id,NULL); - return 0; - } - g=guild_pt; - memset(g,0,sizeof(struct guild)); - g->guild_id=guild_newid++; - memcpy(g->name,name,24); - memcpy(g->master,master->name,24); - memcpy(&g->member[0],master,sizeof(struct guild_member)); - - g->position[0].mode=0x11; - strcpy(g->position[ 0].name,"GuildMaster"); - strcpy(g->position[MAX_GUILDPOSITION-1].name,"Newbie"); - for(i=1;i<MAX_GUILDPOSITION-1;i++) - sprintf(g->position[i].name,"Position %d",i+1); - - // Initialize guild property - g->max_member=16; - g->average_lv=master->lv; - g->castle_id=-1; - for(i=0;i<5;i++) - g->skill[i].id=i+10000; - - // Save to sql - printf("Create initialize OK!\n"); - i=inter_guild_tosql(g,255); - - if (i<0) { - mapif_guild_created(fd,account_id,NULL); - return 0; - } - - // Report to client - mapif_guild_created(fd,account_id,g); - mapif_guild_info(fd,g); - - inter_log("guild %s (id=%d) created by master %s (id=%d)" RETCODE, - name, g->guild_id, master->name, master->account_id ); - - - return 0; + struct guild *g; + int i; + + printf ("CreateGuild\n"); + g = search_guildname (name); + if (g != NULL && g->guild_id > 0) + { + printf ("int_guild: same name guild exists [%s]\n", name); + mapif_guild_created (fd, account_id, NULL); + return 0; + } + g = guild_pt; + memset (g, 0, sizeof (struct guild)); + g->guild_id = guild_newid++; + memcpy (g->name, name, 24); + memcpy (g->master, master->name, 24); + memcpy (&g->member[0], master, sizeof (struct guild_member)); + + g->position[0].mode = 0x11; + strcpy (g->position[0].name, "GuildMaster"); + strcpy (g->position[MAX_GUILDPOSITION - 1].name, "Newbie"); + for (i = 1; i < MAX_GUILDPOSITION - 1; i++) + sprintf (g->position[i].name, "Position %d", i + 1); + + // Initialize guild property + g->max_member = 16; + g->average_lv = master->lv; + g->castle_id = -1; + for (i = 0; i < 5; i++) + g->skill[i].id = i + 10000; + + // Save to sql + printf ("Create initialize OK!\n"); + i = inter_guild_tosql (g, 255); + + if (i < 0) + { + mapif_guild_created (fd, account_id, NULL); + return 0; + } + + // Report to client + mapif_guild_created (fd, account_id, g); + mapif_guild_info (fd, g); + + inter_log ("guild %s (id=%d) created by master %s (id=%d)" RETCODE, + name, g->guild_id, master->name, master->account_id); + + return 0; } + // Return guild info to client -int mapif_parse_GuildInfo(int fd,int guild_id) +int mapif_parse_GuildInfo (int fd, int guild_id) { - struct guild *g; - g=guild_pt; - inter_guild_fromsql(guild_id,g); - if(g!=NULL&&g->guild_id>0){ - guild_calcinfo(g); - mapif_guild_info(fd,g); - //inter_guild_tosql(g,1); // Change guild - }else - mapif_guild_noinfo(fd,guild_id); - return 0; + struct guild *g; + g = guild_pt; + inter_guild_fromsql (guild_id, g); + if (g != NULL && g->guild_id > 0) + { + guild_calcinfo (g); + mapif_guild_info (fd, g); + //inter_guild_tosql(g,1); // Change guild + } + else + mapif_guild_noinfo (fd, guild_id); + return 0; } + // Add member to guild -int mapif_parse_GuildAddMember(int fd,int guild_id,struct guild_member *m) +int mapif_parse_GuildAddMember (int fd, int guild_id, struct guild_member *m) { - struct guild *g; - int i; - g=guild_pt; - inter_guild_fromsql(guild_id,g); - - if(g==NULL||g->guild_id<=0){ - mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,1); - return 0; - } - - for(i=0;i<g->max_member;i++){ - if(g->member[i].account_id==0){ - - memcpy(&g->member[i],m,sizeof(struct guild_member)); - mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,0); - guild_calcinfo(g); - mapif_guild_info(-1,g); - inter_guild_tosql(g,3); // Change guild & guild_member - return 0; - } - } - mapif_guild_memberadded(fd,guild_id,m->account_id,m->char_id,1); - //inter_guild_tosql(g,3); // Change guild & guild_member - return 0; + struct guild *g; + int i; + g = guild_pt; + inter_guild_fromsql (guild_id, g); + + if (g == NULL || g->guild_id <= 0) + { + mapif_guild_memberadded (fd, guild_id, m->account_id, m->char_id, 1); + return 0; + } + + for (i = 0; i < g->max_member; i++) + { + if (g->member[i].account_id == 0) + { + + memcpy (&g->member[i], m, sizeof (struct guild_member)); + mapif_guild_memberadded (fd, guild_id, m->account_id, m->char_id, + 0); + guild_calcinfo (g); + mapif_guild_info (-1, g); + inter_guild_tosql (g, 3); // Change guild & guild_member + return 0; + } + } + mapif_guild_memberadded (fd, guild_id, m->account_id, m->char_id, 1); + //inter_guild_tosql(g,3); // Change guild & guild_member + return 0; } + // Delete member from guild -int mapif_parse_GuildLeave(int fd,int guild_id,int account_id,int char_id,int flag,const char *mes) +int mapif_parse_GuildLeave (int fd, int guild_id, int account_id, int char_id, + int flag, const char *mes) { - struct guild *g=NULL; - g=guild_pt; - inter_guild_fromsql(guild_id,g); - - if(g!=NULL&&g->guild_id>0){ - int i; - for(i=0;i<g->max_member;i++){ - if( g->member[i].account_id==account_id && - g->member[i].char_id==char_id){ - printf("%d %d\n",i, (int)(&g->member[i])); - printf("%d %s\n",i, g->member[i].name); - - if(flag){ // 追放の場合追放リストに入れる - int j; - for(j=0;j<MAX_GUILDEXPLUSION;j++){ - if(g->explusion[j].account_id==0) - break; - } - if(j==MAX_GUILDEXPLUSION){ // 一杯なので古いのを消す - for(j=0;j<MAX_GUILDEXPLUSION-1;j++) - g->explusion[j]=g->explusion[j+1]; - j=MAX_GUILDEXPLUSION-1; - } - g->explusion[j].account_id=account_id; - memcpy(g->explusion[j].acc,"dummy",24); - memcpy(g->explusion[j].name,g->member[i].name,24); - memcpy(g->explusion[j].mes,mes,40); - } - - mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes); - printf("%d %d\n",i, (int)(&g->member[i])); - printf("%d %s\n",i, (&g->member[i])->name); - memset(&g->member[i],0,sizeof(struct guild_member)); - - if( guild_check_empty(g)==0 ) - mapif_guild_info(-1,g);// まだ人がいるのでデータ送信 - /* - else - inter_guild_save(); // 解散したので一応セーブ - return 0;*/ - } - } - guild_calcinfo(g); - inter_guild_tosql(g,19); // Change guild & guild_member & guild_expulsion - }else{ - sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `account_id`='%d' AND `char_id`='%d'",char_db, account_id,char_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); - } - /* mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes); */ - } - - - return 0; + struct guild *g = NULL; + g = guild_pt; + inter_guild_fromsql (guild_id, g); + + if (g != NULL && g->guild_id > 0) + { + int i; + for (i = 0; i < g->max_member; i++) + { + if (g->member[i].account_id == account_id && + g->member[i].char_id == char_id) + { + printf ("%d %d\n", i, (int) (&g->member[i])); + printf ("%d %s\n", i, g->member[i].name); + + if (flag) + { // 追放の場合追放リストに入れる + int j; + for (j = 0; j < MAX_GUILDEXPLUSION; j++) + { + if (g->explusion[j].account_id == 0) + break; + } + if (j == MAX_GUILDEXPLUSION) + { // 一杯なので古いのを消す + for (j = 0; j < MAX_GUILDEXPLUSION - 1; j++) + g->explusion[j] = g->explusion[j + 1]; + j = MAX_GUILDEXPLUSION - 1; + } + g->explusion[j].account_id = account_id; + memcpy (g->explusion[j].acc, "dummy", 24); + memcpy (g->explusion[j].name, g->member[i].name, 24); + memcpy (g->explusion[j].mes, mes, 40); + } + + mapif_guild_leaved (guild_id, account_id, char_id, flag, + g->member[i].name, mes); + printf ("%d %d\n", i, (int) (&g->member[i])); + printf ("%d %s\n", i, (&g->member[i])->name); + memset (&g->member[i], 0, sizeof (struct guild_member)); + + if (guild_check_empty (g) == 0) + mapif_guild_info (-1, g); // まだ人がいるのでデータ送信 + /* + * else + * inter_guild_save(); // 解散したので一応セーブ + * return 0; */ + } + } + guild_calcinfo (g); + inter_guild_tosql (g, 19); // Change guild & guild_member & guild_expulsion + } + else + { + sprintf (tmp_sql, + "UPDATE `%s` SET `guild_id`='0' WHERE `account_id`='%d' AND `char_id`='%d'", + char_db, account_id, char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (update `char`)- %s\n", + mysql_error (&mysql_handle)); + } + /* mapif_guild_leaved(guild_id,account_id,char_id,flag,g->member[i].name,mes); */ + } + + return 0; } + // Change member info -int mapif_parse_GuildChangeMemberInfoShort(int fd,int guild_id, - int account_id,int char_id,int online,int lv,int class) +int mapif_parse_GuildChangeMemberInfoShort (int fd, int guild_id, + int account_id, int char_id, + int online, int lv, int class) { - // Could speed up by manipulating only guild_member - struct guild *g; - int i,alv,c; - g=guild_pt; - inter_guild_fromsql(guild_id,g); - - if(g==NULL||g->guild_id<=0){ - return 0; - } - - g->connect_member=0; - - for(i=0,alv=0,c=0;i<g->max_member;i++){ - if( g->member[i].account_id==account_id && - g->member[i].char_id==char_id){ - - g->member[i].online=online; - g->member[i].lv=lv; - g->member[i].class=class; - mapif_guild_memberinfoshort(g,i); - } - if( g->member[i].account_id>0 ){ - alv+=g->member[i].lv; - c++; - } - if( g->member[i].online ) - g->connect_member++; - } - // 平均レベル - g->average_lv=alv/c; - - inter_guild_tosql(g,3); // Change guild & guild_member - - return 0; + // Could speed up by manipulating only guild_member + struct guild *g; + int i, alv, c; + g = guild_pt; + inter_guild_fromsql (guild_id, g); + + if (g == NULL || g->guild_id <= 0) + { + return 0; + } + + g->connect_member = 0; + + for (i = 0, alv = 0, c = 0; i < g->max_member; i++) + { + if (g->member[i].account_id == account_id && + g->member[i].char_id == char_id) + { + + g->member[i].online = online; + g->member[i].lv = lv; + g->member[i].class = class; + mapif_guild_memberinfoshort (g, i); + } + if (g->member[i].account_id > 0) + { + alv += g->member[i].lv; + c++; + } + if (g->member[i].online) + g->connect_member++; + } + // 平均レベル + g->average_lv = alv / c; + + inter_guild_tosql (g, 3); // Change guild & guild_member + + return 0; } // BreakGuild -int mapif_parse_BreakGuild(int fd,int guild_id) +int mapif_parse_BreakGuild (int fd, int guild_id) { - struct guild *g; - g=guild_pt; - inter_guild_fromsql(guild_id,g); - if(g==NULL){ - return 0; - } - - // Delete guild from sql - //printf("- Delete guild %d from guild\n",guild_id); - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) ); - } - //printf("- Delete guild %d from guild_member\n",guild_id); - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_member_db, guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_member`)- %s\n", mysql_error(&mysql_handle) ); - } - //printf("- Delete guild %d from guild_skill\n",guild_id); - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_skill_db, guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_skill`)- %s\n", mysql_error(&mysql_handle) ); - } - //printf("- Delete guild %d from guild_position\n",guild_id); - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_position_db, guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) ); - } - //printf("- Delete guild %d from guild_expulsion\n",guild_id); - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_expulsion_db, guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_expulsion`)- %s\n", mysql_error(&mysql_handle) ); - } - //printf("- Delete guild %d from guild_alliance\n",guild_id); - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'",guild_alliance_db, guild_id,guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) ); - } - - //printf("- Delete guild %d from guild_castle\n",guild_id); - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_castle_db, guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) ); - } - - //printf("- Update guild %d of char\n",guild_id); - sprintf(tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'",char_db, guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_position`)- %s\n", mysql_error(&mysql_handle) ); - } - - inter_guild_storage_delete(guild_id); - mapif_guild_broken(guild_id,0); - - inter_log("guild %s (id=%d) broken" RETCODE,g->name,guild_id); - - return 0; + struct guild *g; + g = guild_pt; + inter_guild_fromsql (guild_id, g); + if (g == NULL) + { + return 0; + } + + // Delete guild from sql + //printf("- Delete guild %d from guild\n",guild_id); + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'", guild_db, + guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild`)- %s\n", + mysql_error (&mysql_handle)); + } + //printf("- Delete guild %d from guild_member\n",guild_id); + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'", + guild_member_db, guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_member`)- %s\n", + mysql_error (&mysql_handle)); + } + //printf("- Delete guild %d from guild_skill\n",guild_id); + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'", + guild_skill_db, guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_skill`)- %s\n", + mysql_error (&mysql_handle)); + } + //printf("- Delete guild %d from guild_position\n",guild_id); + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'", + guild_position_db, guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_position`)- %s\n", + mysql_error (&mysql_handle)); + } + //printf("- Delete guild %d from guild_expulsion\n",guild_id); + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'", + guild_expulsion_db, guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_expulsion`)- %s\n", + mysql_error (&mysql_handle)); + } + //printf("- Delete guild %d from guild_alliance\n",guild_id); + sprintf (tmp_sql, + "DELETE FROM `%s` WHERE `guild_id`='%d' OR `alliance_id`='%d'", + guild_alliance_db, guild_id, guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_position`)- %s\n", + mysql_error (&mysql_handle)); + } + + //printf("- Delete guild %d from guild_castle\n",guild_id); + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'", + guild_castle_db, guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_position`)- %s\n", + mysql_error (&mysql_handle)); + } + + //printf("- Update guild %d of char\n",guild_id); + sprintf (tmp_sql, "UPDATE `%s` SET `guild_id`='0' WHERE `guild_id`='%d'", + char_db, guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_position`)- %s\n", + mysql_error (&mysql_handle)); + } + + inter_guild_storage_delete (guild_id); + mapif_guild_broken (guild_id, 0); + + inter_log ("guild %s (id=%d) broken" RETCODE, g->name, guild_id); + + return 0; } // ギルドメッセージ送信 -int mapif_parse_GuildMessage(int fd,int guild_id,int account_id,char *mes,int len) +int mapif_parse_GuildMessage (int fd, int guild_id, int account_id, char *mes, + int len) { - return mapif_guild_message(guild_id,account_id,mes,len); + return mapif_guild_message (guild_id, account_id, mes, len); } + // ギルド基本データ変更要求 -int mapif_parse_GuildBasicInfoChange(int fd,int guild_id, - int type,const char *data,int len) +int mapif_parse_GuildBasicInfoChange (int fd, int guild_id, + int type, const char *data, int len) { - struct guild *g; -// int dd=*((int *)data); - short dw=*((short *)data); - g=guild_pt; - inter_guild_fromsql(guild_id,g); - - if(g==NULL||g->guild_id<=0){ - return 0; - } - switch(type){ - case GBI_GUILDLV: { - printf("GBI_GUILDLV\n"); - if(dw>0 && g->guild_lv+dw<=50){ - g->guild_lv+=dw; - g->skill_point+=dw; - }else if(dw<0 && g->guild_lv+dw>=1) - g->guild_lv+=dw; - mapif_guild_info(-1,g); - inter_guild_tosql(g,1); - } return 0; - default: - printf("int_guild: GuildBasicInfoChange: Unknown type %d\n",type); - break; - } - mapif_guild_basicinfochanged(guild_id,type,data,len); - //inter_guild_tosql(g,1); // Change guild - return 0; + struct guild *g; +// int dd=*((int *)data); + short dw = *((short *) data); + g = guild_pt; + inter_guild_fromsql (guild_id, g); + + if (g == NULL || g->guild_id <= 0) + { + return 0; + } + switch (type) + { + case GBI_GUILDLV: + { + printf ("GBI_GUILDLV\n"); + if (dw > 0 && g->guild_lv + dw <= 50) + { + g->guild_lv += dw; + g->skill_point += dw; + } + else if (dw < 0 && g->guild_lv + dw >= 1) + g->guild_lv += dw; + mapif_guild_info (-1, g); + inter_guild_tosql (g, 1); + } + return 0; + default: + printf ("int_guild: GuildBasicInfoChange: Unknown type %d\n", + type); + break; + } + mapif_guild_basicinfochanged (guild_id, type, data, len); + //inter_guild_tosql(g,1); // Change guild + return 0; } // ギルドメンバデータ変更要求 -int mapif_parse_GuildMemberInfoChange(int fd,int guild_id,int account_id,int char_id, - int type,const char *data,int len) +int mapif_parse_GuildMemberInfoChange (int fd, int guild_id, int account_id, + int char_id, int type, + const char *data, int len) { - // Could make some improvement in speed, because only change guild_member - int i; - struct guild *g; - g=guild_pt; - inter_guild_fromsql(guild_id,g); - //printf("GuildMemberInfoChange %s \n",(type==GMI_EXP)?"GMI_EXP":"OTHER"); - - if(g==NULL){ - return 0; - } - for(i=0;i<g->max_member;i++) - if( g->member[i].account_id==account_id && - g->member[i].char_id==char_id ) - break; - if(i==g->max_member){ - printf("int_guild: GuildMemberChange: Not found %d,%d in %d[%s]\n", - account_id,char_id,guild_id,g->name); - return 0; - } - switch(type){ - case GMI_POSITION: // 役職 - g->member[i].position=*((int *)data); - break; - case GMI_EXP: { // EXP - int exp,oldexp=g->member[i].exp; - exp=g->member[i].exp=*((unsigned int *)data); - g->exp+=(exp-oldexp); - guild_calcinfo(g); // Lvアップ判断 - mapif_guild_basicinfochanged(guild_id,GBI_EXP,&g->exp,4); - }break; - default: - printf("int_guild: GuildMemberInfoChange: Unknown type %d\n",type); - break; - } - mapif_guild_memberinfochanged(guild_id,account_id,char_id,type,data,len); - inter_guild_tosql(g,3); // Change guild & guild_member - return 0; + // Could make some improvement in speed, because only change guild_member + int i; + struct guild *g; + g = guild_pt; + inter_guild_fromsql (guild_id, g); + //printf("GuildMemberInfoChange %s \n",(type==GMI_EXP)?"GMI_EXP":"OTHER"); + + if (g == NULL) + { + return 0; + } + for (i = 0; i < g->max_member; i++) + if (g->member[i].account_id == account_id && + g->member[i].char_id == char_id) + break; + if (i == g->max_member) + { + printf ("int_guild: GuildMemberChange: Not found %d,%d in %d[%s]\n", + account_id, char_id, guild_id, g->name); + return 0; + } + switch (type) + { + case GMI_POSITION: // 役職 + g->member[i].position = *((int *) data); + break; + case GMI_EXP: + { // EXP + int exp, oldexp = g->member[i].exp; + exp = g->member[i].exp = *((unsigned int *) data); + g->exp += (exp - oldexp); + guild_calcinfo (g); // Lvアップ判断 + mapif_guild_basicinfochanged (guild_id, GBI_EXP, &g->exp, 4); + } break; + default: + printf ("int_guild: GuildMemberInfoChange: Unknown type %d\n", + type); + break; + } + mapif_guild_memberinfochanged (guild_id, account_id, char_id, type, data, + len); + inter_guild_tosql (g, 3); // Change guild & guild_member + return 0; } // ギルド役職名変更要求 -int mapif_parse_GuildPosition(int fd,int guild_id,int idx,struct guild_position *p) +int mapif_parse_GuildPosition (int fd, int guild_id, int idx, + struct guild_position *p) { - // Could make some improvement in speed, because only change guild_position - struct guild *g; - g=guild_pt; - inter_guild_fromsql(guild_id,g); - - if(g==NULL || idx<0 || idx>=MAX_GUILDPOSITION){ - return 0; - } - memcpy(&g->position[idx],p,sizeof(struct guild_position)); - mapif_guild_position(g,idx); - printf("int_guild: position changed %d\n",idx); - inter_guild_tosql(g,4); // Change guild_position - return 0; + // Could make some improvement in speed, because only change guild_position + struct guild *g; + g = guild_pt; + inter_guild_fromsql (guild_id, g); + + if (g == NULL || idx < 0 || idx >= MAX_GUILDPOSITION) + { + return 0; + } + memcpy (&g->position[idx], p, sizeof (struct guild_position)); + mapif_guild_position (g, idx); + printf ("int_guild: position changed %d\n", idx); + inter_guild_tosql (g, 4); // Change guild_position + return 0; } + // ギルドスキルアップ要求 -int mapif_parse_GuildSkillUp(int fd,int guild_id,int skill_num,int account_id) +int mapif_parse_GuildSkillUp (int fd, int guild_id, int skill_num, + int account_id) { - // Could make some improvement in speed, because only change guild_position - struct guild *g; - g=guild_pt; - inter_guild_fromsql(guild_id,g); - int idx=skill_num-10000; - if(g==NULL || skill_num<10000) - return 0; - //printf("GuildSkillUp\n"); - - if( g->skill_point>0 && g->skill[idx].id>0 && - g->skill[idx].lv<10 ){ - g->skill[idx].lv++; - g->skill_point--; - if(guild_calcinfo(g)==0) - mapif_guild_info(-1,g); - mapif_guild_skillupack(guild_id,skill_num,account_id); - printf("int_guild: skill %d up\n",skill_num); - inter_guild_tosql(g,33); // Change guild & guild_skill - } - - return 0; + // Could make some improvement in speed, because only change guild_position + struct guild *g; + g = guild_pt; + inter_guild_fromsql (guild_id, g); + int idx = skill_num - 10000; + if (g == NULL || skill_num < 10000) + return 0; + //printf("GuildSkillUp\n"); + + if (g->skill_point > 0 && g->skill[idx].id > 0 && g->skill[idx].lv < 10) + { + g->skill[idx].lv++; + g->skill_point--; + if (guild_calcinfo (g) == 0) + mapif_guild_info (-1, g); + mapif_guild_skillupack (guild_id, skill_num, account_id); + printf ("int_guild: skill %d up\n", skill_num); + inter_guild_tosql (g, 33); // Change guild & guild_skill + } + + return 0; } + // ギルド同盟要求 -int mapif_parse_GuildAlliance(int fd,int guild_id1,int guild_id2, - int account_id1,int account_id2,int flag) +int mapif_parse_GuildAlliance (int fd, int guild_id1, int guild_id2, + int account_id1, int account_id2, int flag) { - // Could speed up - struct guild *g[2]; - int j,i; - g[0]=guild_pt; - g[1]=guild_pt2; - inter_guild_fromsql(guild_id1,g[0]); - inter_guild_fromsql(guild_id2,g[1]); - - if(g[0]==NULL || g[1]==NULL || g[0]->guild_id ==0 || g[1]->guild_id==0) - return 0; - - if(!(flag&0x8)){ - for(i=0;i<2-(flag&1);i++){ - for(j=0;j<MAX_GUILDALLIANCE;j++) - if(g[i]->alliance[j].guild_id==0){ - g[i]->alliance[j].guild_id=g[1-i]->guild_id; - memcpy(g[i]->alliance[j].name,g[1-i]->name,24); - g[i]->alliance[j].opposition=flag&1; - break; - } - } - }else{ // 関係解消 - for(i=0;i<2-(flag&1);i++){ - for(j=0;j<MAX_GUILDALLIANCE;j++) - if( g[i]->alliance[j].guild_id==g[1-i]->guild_id && - g[i]->alliance[j].opposition==(flag&1)){ - g[i]->alliance[j].guild_id=0; - break; - } - } - } - mapif_guild_alliance(guild_id1,guild_id2,account_id1,account_id2,flag, - g[0]->name,g[1]->name); - inter_guild_tosql(g[0],8); // Change guild_alliance - inter_guild_tosql(g[1],8); // Change guild_alliance - return 0; + // Could speed up + struct guild *g[2]; + int j, i; + g[0] = guild_pt; + g[1] = guild_pt2; + inter_guild_fromsql (guild_id1, g[0]); + inter_guild_fromsql (guild_id2, g[1]); + + if (g[0] == NULL || g[1] == NULL || g[0]->guild_id == 0 + || g[1]->guild_id == 0) + return 0; + + if (!(flag & 0x8)) + { + for (i = 0; i < 2 - (flag & 1); i++) + { + for (j = 0; j < MAX_GUILDALLIANCE; j++) + if (g[i]->alliance[j].guild_id == 0) + { + g[i]->alliance[j].guild_id = g[1 - i]->guild_id; + memcpy (g[i]->alliance[j].name, g[1 - i]->name, 24); + g[i]->alliance[j].opposition = flag & 1; + break; + } + } + } + else + { // 関係解消 + for (i = 0; i < 2 - (flag & 1); i++) + { + for (j = 0; j < MAX_GUILDALLIANCE; j++) + if (g[i]->alliance[j].guild_id == g[1 - i]->guild_id && + g[i]->alliance[j].opposition == (flag & 1)) + { + g[i]->alliance[j].guild_id = 0; + break; + } + } + } + mapif_guild_alliance (guild_id1, guild_id2, account_id1, account_id2, + flag, g[0]->name, g[1]->name); + inter_guild_tosql (g[0], 8); // Change guild_alliance + inter_guild_tosql (g[1], 8); // Change guild_alliance + return 0; } + // ギルド告知変更要求 -int mapif_parse_GuildNotice(int fd,int guild_id,const char *mes1,const char *mes2) +int mapif_parse_GuildNotice (int fd, int guild_id, const char *mes1, + const char *mes2) { - struct guild *g; - g=guild_pt; - inter_guild_fromsql(guild_id,g); - - if(g==NULL||g->guild_id<=0) - return 0; - memcpy(g->mes1,mes1,60); - memcpy(g->mes2,mes2,120); - inter_guild_tosql(g,1); // Change mes of guild - return mapif_guild_notice(g); + struct guild *g; + g = guild_pt; + inter_guild_fromsql (guild_id, g); + + if (g == NULL || g->guild_id <= 0) + return 0; + memcpy (g->mes1, mes1, 60); + memcpy (g->mes2, mes2, 120); + inter_guild_tosql (g, 1); // Change mes of guild + return mapif_guild_notice (g); } + // ギルドエンブレム変更要求 -int mapif_parse_GuildEmblem(int fd,int len,int guild_id,int dummy,const char *data) +int mapif_parse_GuildEmblem (int fd, int len, int guild_id, int dummy, + const char *data) { - struct guild *g; - g=guild_pt; - inter_guild_fromsql(guild_id,g); - - if(g==NULL||g->guild_id<=0) - return 0; - memcpy(g->emblem_data,data,len); - g->emblem_len=len; - g->emblem_id++; - inter_guild_tosql(g,1); // Change guild - return mapif_guild_emblem(g); + struct guild *g; + g = guild_pt; + inter_guild_fromsql (guild_id, g); + + if (g == NULL || g->guild_id <= 0) + return 0; + memcpy (g->emblem_data, data, len); + g->emblem_len = len; + g->emblem_id++; + inter_guild_tosql (g, 1); // Change guild + return mapif_guild_emblem (g); } -int mapif_parse_GuildCastleDataLoad(int fd,int castle_id,int index) // <Agit> +int mapif_parse_GuildCastleDataLoad (int fd, int castle_id, int index) // <Agit> { - struct guild_castle *gc=guildcastle_pt; - inter_guildcastle_fromsql(castle_id, gc); - if(gc==NULL||gc->castle_id==-1){ - return mapif_guild_castle_dataload(castle_id,0,0); - } - switch(index){ - case 1: return mapif_guild_castle_dataload(gc->castle_id,index,gc->guild_id); break; - case 2: return mapif_guild_castle_dataload(gc->castle_id,index,gc->economy); break; - case 3: return mapif_guild_castle_dataload(gc->castle_id,index,gc->defense); break; - case 4: return mapif_guild_castle_dataload(gc->castle_id,index,gc->triggerE); break; - case 5: return mapif_guild_castle_dataload(gc->castle_id,index,gc->triggerD); break; - case 6: return mapif_guild_castle_dataload(gc->castle_id,index,gc->nextTime); break; - case 7: return mapif_guild_castle_dataload(gc->castle_id,index,gc->payTime); break; - case 8: return mapif_guild_castle_dataload(gc->castle_id,index,gc->createTime); break; - case 9: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleC); break; - case 10: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG0); break; - case 11: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG1); break; - case 12: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG2); break; - case 13: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG3); break; - case 14: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG4); break; - case 15: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG5); break; - case 16: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG6); break; - case 17: return mapif_guild_castle_dataload(gc->castle_id,index,gc->visibleG7); break; - case 18: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp0); break; // guardian HP [Valaris] - case 19: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp1); break; - case 20: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp2); break; - case 21: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp3); break; - case 22: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp4); break; - case 23: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp5); break; - case 24: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp6); break; - case 25: return mapif_guild_castle_dataload(gc->castle_id,index,gc->Ghp7); break; // end additions [Valaris] - default: - printf("mapif_parse_GuildCastleDataLoad ERROR!! (Not found index=%d)\n", index); - return 0; - } + struct guild_castle *gc = guildcastle_pt; + inter_guildcastle_fromsql (castle_id, gc); + if (gc == NULL || gc->castle_id == -1) + { + return mapif_guild_castle_dataload (castle_id, 0, 0); + } + switch (index) + { + case 1: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->guild_id); + break; + case 2: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->economy); + break; + case 3: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->defense); + break; + case 4: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->triggerE); + break; + case 5: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->triggerD); + break; + case 6: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->nextTime); + break; + case 7: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->payTime); + break; + case 8: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->createTime); + break; + case 9: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleC); + break; + case 10: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG0); + break; + case 11: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG1); + break; + case 12: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG2); + break; + case 13: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG3); + break; + case 14: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG4); + break; + case 15: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG5); + break; + case 16: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG6); + break; + case 17: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->visibleG7); + break; + case 18: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->Ghp0); + break; // guardian HP [Valaris] + case 19: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->Ghp1); + break; + case 20: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->Ghp2); + break; + case 21: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->Ghp3); + break; + case 22: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->Ghp4); + break; + case 23: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->Ghp5); + break; + case 24: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->Ghp6); + break; + case 25: + return mapif_guild_castle_dataload (gc->castle_id, index, + gc->Ghp7); + break; // end additions [Valaris] + default: + printf + ("mapif_parse_GuildCastleDataLoad ERROR!! (Not found index=%d)\n", + index); + return 0; + } } -int mapif_parse_GuildCastleDataSave(int fd,int castle_id,int index,int value) // <Agit> +int mapif_parse_GuildCastleDataSave (int fd, int castle_id, int index, int value) // <Agit> { - struct guild_castle *gc=guildcastle_pt; - inter_guildcastle_fromsql(castle_id, gc); - if(gc==NULL||gc->castle_id==-1){ - return mapif_guild_castle_datasave(castle_id,index,value); - } - switch(index){ - case 1: - if( gc->guild_id!=value ){ - int gid=(value)?value:gc->guild_id; - struct guild *g=guild_pt; - inter_guild_fromsql(gid, g); - inter_log("guild %s (id=%d) %s castle id=%d" RETCODE, - (g)?g->name:"??" ,gid, (value)?"occupy":"abandon", index); - } - gc->guild_id = value; - break; - case 2: gc->economy = value; break; - case 3: gc->defense = value; break; - case 4: gc->triggerE = value; break; - case 5: gc->triggerD = value; break; - case 6: gc->nextTime = value; break; - case 7: gc->payTime = value; break; - case 8: gc->createTime = value; break; - case 9: gc->visibleC = value; break; - case 10: gc->visibleG0 = value; break; - case 11: gc->visibleG1 = value; break; - case 12: gc->visibleG2 = value; break; - case 13: gc->visibleG3 = value; break; - case 14: gc->visibleG4 = value; break; - case 15: gc->visibleG5 = value; break; - case 16: gc->visibleG6 = value; break; - case 17: gc->visibleG7 = value; break; - case 18: gc->Ghp0 = value; break; // guardian HP [Valaris] - case 19: gc->Ghp1 = value; break; - case 20: gc->Ghp2 = value; break; - case 21: gc->Ghp3 = value; break; - case 22: gc->Ghp4 = value; break; - case 23: gc->Ghp5 = value; break; - case 24: gc->Ghp6 = value; break; - case 25: gc->Ghp7 = value; break; // end additions [Valaris] - default: - printf("mapif_parse_GuildCastleDataSave ERROR!! (Not found index=%d)\n", index); - return 0; - } - inter_guildcastle_tosql(gc); - return mapif_guild_castle_datasave(gc->castle_id,index,value); + struct guild_castle *gc = guildcastle_pt; + inter_guildcastle_fromsql (castle_id, gc); + if (gc == NULL || gc->castle_id == -1) + { + return mapif_guild_castle_datasave (castle_id, index, value); + } + switch (index) + { + case 1: + if (gc->guild_id != value) + { + int gid = (value) ? value : gc->guild_id; + struct guild *g = guild_pt; + inter_guild_fromsql (gid, g); + inter_log ("guild %s (id=%d) %s castle id=%d" RETCODE, + (g) ? g->name : "??", gid, + (value) ? "occupy" : "abandon", index); + } + gc->guild_id = value; + break; + case 2: + gc->economy = value; + break; + case 3: + gc->defense = value; + break; + case 4: + gc->triggerE = value; + break; + case 5: + gc->triggerD = value; + break; + case 6: + gc->nextTime = value; + break; + case 7: + gc->payTime = value; + break; + case 8: + gc->createTime = value; + break; + case 9: + gc->visibleC = value; + break; + case 10: + gc->visibleG0 = value; + break; + case 11: + gc->visibleG1 = value; + break; + case 12: + gc->visibleG2 = value; + break; + case 13: + gc->visibleG3 = value; + break; + case 14: + gc->visibleG4 = value; + break; + case 15: + gc->visibleG5 = value; + break; + case 16: + gc->visibleG6 = value; + break; + case 17: + gc->visibleG7 = value; + break; + case 18: + gc->Ghp0 = value; + break; // guardian HP [Valaris] + case 19: + gc->Ghp1 = value; + break; + case 20: + gc->Ghp2 = value; + break; + case 21: + gc->Ghp3 = value; + break; + case 22: + gc->Ghp4 = value; + break; + case 23: + gc->Ghp5 = value; + break; + case 24: + gc->Ghp6 = value; + break; + case 25: + gc->Ghp7 = value; + break; // end additions [Valaris] + default: + printf + ("mapif_parse_GuildCastleDataSave ERROR!! (Not found index=%d)\n", + index); + return 0; + } + inter_guildcastle_tosql (gc); + return mapif_guild_castle_datasave (gc->castle_id, index, value); } // ギルドチェック要求 -int mapif_parse_GuildCheck(int fd,int guild_id,int account_id,int char_id) +int mapif_parse_GuildCheck (int fd, int guild_id, int account_id, int char_id) { - // What does this mean? Check if belong to another guild? - return 0; + // What does this mean? Check if belong to another guild? + return 0; } // map server からの通信 @@ -1565,40 +2008,104 @@ int mapif_parse_GuildCheck(int fd,int guild_id,int account_id,int char_id) // ・パケット長データはinter.cにセットしておくこと // ・パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない // ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない -int inter_guild_parse_frommap(int fd) +int inter_guild_parse_frommap (int fd) { - switch(RFIFOW(fd,0)){ - case 0x3030: mapif_parse_CreateGuild(fd,RFIFOL(fd,4),RFIFOP(fd,8),(struct guild_member *)RFIFOP(fd,32)); break; - case 0x3031: mapif_parse_GuildInfo(fd,RFIFOL(fd,2)); break; - case 0x3032: mapif_parse_GuildAddMember(fd,RFIFOL(fd,4),(struct guild_member *)RFIFOP(fd,8)); break; - case 0x3034: mapif_parse_GuildLeave(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOP(fd,15)); break; - case 0x3035: mapif_parse_GuildChangeMemberInfoShort(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOW(fd,15),RFIFOW(fd,17)); break; - case 0x3036: mapif_parse_BreakGuild(fd,RFIFOL(fd,2)); break; - case 0x3037: mapif_parse_GuildMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12); break; - case 0x3038: mapif_parse_GuildCheck(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10)); break; - case 0x3039: mapif_parse_GuildBasicInfoChange(fd,RFIFOL(fd,4),RFIFOW(fd,8),RFIFOP(fd,10),RFIFOW(fd,2)-10); break; - case 0x303A: mapif_parse_GuildMemberInfoChange(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOL(fd,12),RFIFOW(fd,16),RFIFOP(fd,18),RFIFOW(fd,2)-18); break; - case 0x303B: mapif_parse_GuildPosition(fd,RFIFOL(fd,4),RFIFOL(fd,8),(struct guild_position *)RFIFOP(fd,12)); break; - case 0x303C: mapif_parse_GuildSkillUp(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10)); break; - case 0x303D: mapif_parse_GuildAlliance(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOL(fd,14),RFIFOB(fd,18)); break; - case 0x303E: mapif_parse_GuildNotice(fd,RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,66)); break; - case 0x303F: mapif_parse_GuildEmblem(fd,RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12)); break; - case 0x3040: mapif_parse_GuildCastleDataLoad(fd,RFIFOW(fd,2),RFIFOB(fd,4)); break; - case 0x3041: mapif_parse_GuildCastleDataSave(fd,RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5)); break; - - default: - return 0; - } - return 1; + switch (RFIFOW (fd, 0)) + { + case 0x3030: + mapif_parse_CreateGuild (fd, RFIFOL (fd, 4), RFIFOP (fd, 8), + (struct guild_member *) RFIFOP (fd, 32)); + break; + case 0x3031: + mapif_parse_GuildInfo (fd, RFIFOL (fd, 2)); + break; + case 0x3032: + mapif_parse_GuildAddMember (fd, RFIFOL (fd, 4), + (struct guild_member *) RFIFOP (fd, + 8)); + break; + case 0x3034: + mapif_parse_GuildLeave (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOL (fd, 10), RFIFOB (fd, 14), + RFIFOP (fd, 15)); + break; + case 0x3035: + mapif_parse_GuildChangeMemberInfoShort (fd, RFIFOL (fd, 2), + RFIFOL (fd, 6), + RFIFOL (fd, 10), + RFIFOB (fd, 14), + RFIFOW (fd, 15), + RFIFOW (fd, 17)); + break; + case 0x3036: + mapif_parse_BreakGuild (fd, RFIFOL (fd, 2)); + break; + case 0x3037: + mapif_parse_GuildMessage (fd, RFIFOL (fd, 4), RFIFOL (fd, 8), + RFIFOP (fd, 12), RFIFOW (fd, 2) - 12); + break; + case 0x3038: + mapif_parse_GuildCheck (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOL (fd, 10)); + break; + case 0x3039: + mapif_parse_GuildBasicInfoChange (fd, RFIFOL (fd, 4), + RFIFOW (fd, 8), RFIFOP (fd, 10), + RFIFOW (fd, 2) - 10); + break; + case 0x303A: + mapif_parse_GuildMemberInfoChange (fd, RFIFOL (fd, 4), + RFIFOL (fd, 8), RFIFOL (fd, + 12), + RFIFOW (fd, 16), RFIFOP (fd, + 18), + RFIFOW (fd, 2) - 18); + break; + case 0x303B: + mapif_parse_GuildPosition (fd, RFIFOL (fd, 4), RFIFOL (fd, 8), + (struct guild_position *) RFIFOP (fd, + 12)); + break; + case 0x303C: + mapif_parse_GuildSkillUp (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOL (fd, 10)); + break; + case 0x303D: + mapif_parse_GuildAlliance (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOL (fd, 10), RFIFOL (fd, 14), + RFIFOB (fd, 18)); + break; + case 0x303E: + mapif_parse_GuildNotice (fd, RFIFOL (fd, 2), RFIFOP (fd, 6), + RFIFOP (fd, 66)); + break; + case 0x303F: + mapif_parse_GuildEmblem (fd, RFIFOW (fd, 2) - 12, RFIFOL (fd, 4), + RFIFOL (fd, 8), RFIFOP (fd, 12)); + break; + case 0x3040: + mapif_parse_GuildCastleDataLoad (fd, RFIFOW (fd, 2), + RFIFOB (fd, 4)); + break; + case 0x3041: + mapif_parse_GuildCastleDataSave (fd, RFIFOW (fd, 2), + RFIFOB (fd, 4), RFIFOL (fd, 5)); + break; + + default: + return 0; + } + return 1; } -int inter_guild_mapif_init(int fd) +int inter_guild_mapif_init (int fd) { - return mapif_guild_castle_alldataload(fd); + return mapif_guild_castle_alldataload (fd); } // サーバーから脱退要求(キャラ削除用) -int inter_guild_leave(int guild_id,int account_id,int char_id) +int inter_guild_leave (int guild_id, int account_id, int char_id) { - return mapif_parse_GuildLeave(-1,guild_id,account_id,char_id,0,"**サーバー命令**"); + return mapif_parse_GuildLeave (-1, guild_id, account_id, char_id, 0, + "**サーバー命令**"); } diff --git a/src/char_sql/int_guild.h b/src/char_sql/int_guild.h index 8f4203d..9fa439c 100644 --- a/src/char_sql/int_guild.h +++ b/src/char_sql/int_guild.h @@ -1,10 +1,10 @@ #ifndef _INT_GUILD_H_ #define _INT_GUILD_H_ -int inter_guild_parse_frommap(int fd); -int inter_guild_sql_init(); -int inter_guild_mapif_init(int fd); +int inter_guild_parse_frommap (int fd); +int inter_guild_sql_init (); +int inter_guild_mapif_init (int fd); -int inter_guild_leave(int guild_id,int account_id,int char_id); +int inter_guild_leave (int guild_id, int account_id, int char_id); #endif diff --git a/src/char_sql/int_party.c b/src/char_sql/int_party.c index 84de078..0eccb83 100644 --- a/src/char_sql/int_party.c +++ b/src/char_sql/int_party.c @@ -5,721 +5,876 @@ #include "char.h" #include "strlib.h" -#include "socket.h" +#include "socket.h" #include <stdio.h> #include <stdlib.h> #include <string.h> static struct party *party_pt; -static int party_newid=100; +static int party_newid = 100; -int mapif_party_broken(int party_id,int flag); -int party_check_empty(struct party *p); -int mapif_parse_PartyLeave(int fd,int party_id,int account_id); +int mapif_party_broken (int party_id, int flag); +int party_check_empty (struct party *p); +int mapif_parse_PartyLeave (int fd, int party_id, int account_id); // Save party to mysql -int inter_party_tosql(int party_id,struct party *p) +int inter_party_tosql (int party_id, struct party *p) { - // 'party' ('party_id','name','exp','item','leader') - - char t_name[100]; - char t_member[24]; - int party_member = 0, party_online_member = 0; - int party_exist = 0; - int leader_id = 0; - int i = 0; - - printf("(\033[1;64m%d\033[0m) Request save party - ",party_id); - - jstrescapecpy(t_name, p->name); - - if (p==NULL || party_id==0 || p->party_id ==0 || party_id!=p->party_id) { - printf("- Party pointer or party_id error \n"); - return 0; - } - - // Check if party exists - sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `party_id`='%d'",party_db, party_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - return 0; - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - sql_row = mysql_fetch_row(sql_res); - party_exist = atoi (sql_row[0]); - //printf("- Check if party %d exists : %s\n",party_id,party_exist==0?"No":"Yes"); - } - mysql_free_result(sql_res) ; //resource free - - if (party_exist >0){ - // Check members in party - sprintf(tmp_sql,"SELECT count(*) FROM `%s` WHERE `party_id`='%d'",char_db, party_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - return 0; - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - sql_row = mysql_fetch_row(sql_res); - - party_member = atoi (sql_row[0]); - // printf("- Check members in party %d : %d \n",party_id,party_member); - - } - mysql_free_result(sql_res) ; //resource free - - party_online_member = 0; - i=0; - while (i<MAX_PARTY){ - if (p->member[i].account_id>0) party_online_member++; - i++; - } - - //if (party_online_member==0) printf("- No member online \n"); else printf("- Some member %d online \n", party_online_member); - - if (party_member <= 0 && party_online_member == 0) { - - // Delete the party, if has no member. - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `party_id`='%d'",party_db, party_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - // printf("No member in party %d, break it \n",party_id); - memset(p, 0, sizeof(struct party)); - return 0; - } else { - // Update party information, if exists - - int i=0; - - for (i=0;i<MAX_PARTY;i++){ - - if (p->member[i].account_id>0){ - sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='%d', `online`='%d' WHERE `account_id`='%d' AND `name`='%s'", - char_db, party_id, p->member[i].online, p->member[i].account_id,jstrescapecpy(t_member,p->member[i].name)); - //printf("%s",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); - } - } - } - - - sprintf(tmp_sql,"UPDATE `%s` SET `name`='%s', `exp`='%d', `item`='%d', `leader_id`=`leader_id` WHERE `party_id`='%d'", - party_db, t_name,p->exp,p->item,party_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) ); - } - - - // printf("- Update party %d information \n",party_id); - } - } else { - // Add new party, if not exist - int i = 0; - while (i<MAX_PARTY&&((p->member[i].account_id>0&&p->member[i].leader==0)||(p->member[i].account_id<0))) i++; - if (i<MAX_PARTY) leader_id = p->member[i].account_id; - sprintf(tmp_sql,"INSERT INTO `%s` (`party_id`, `name`, `exp`, `item`, `leader_id`) VALUES ('%d', '%s', '%d', '%d', '%d')", - party_db, party_id, t_name, p->exp, p->item,leader_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) ); - return 0; - } - - sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='%d', `online`='1' WHERE `account_id`='%d' AND `name`='%s'", - char_db, party_id,leader_id, jstrescapecpy(t_member,p->member[i].name)); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (inset/update `party`)- %s\n", mysql_error(&mysql_handle) ); - } - - //printf("- Insert new party %d \n",party_id); - } - - printf("Party save success\n"); - return 0; + // 'party' ('party_id','name','exp','item','leader') + + char t_name[100]; + char t_member[24]; + int party_member = 0, party_online_member = 0; + int party_exist = 0; + int leader_id = 0; + int i = 0; + + printf ("(\033[1;64m%d\033[0m) Request save party - ", party_id); + + jstrescapecpy (t_name, p->name); + + if (p == NULL || party_id == 0 || p->party_id == 0 + || party_id != p->party_id) + { + printf ("- Party pointer or party_id error \n"); + return 0; + } + + // Check if party exists + sprintf (tmp_sql, "SELECT count(*) FROM `%s` WHERE `party_id`='%d'", + party_db, party_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + return 0; + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + sql_row = mysql_fetch_row (sql_res); + party_exist = atoi (sql_row[0]); + //printf("- Check if party %d exists : %s\n",party_id,party_exist==0?"No":"Yes"); + } + mysql_free_result (sql_res); //resource free + + if (party_exist > 0) + { + // Check members in party + sprintf (tmp_sql, "SELECT count(*) FROM `%s` WHERE `party_id`='%d'", + char_db, party_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + return 0; + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + sql_row = mysql_fetch_row (sql_res); + + party_member = atoi (sql_row[0]); + // printf("- Check members in party %d : %d \n",party_id,party_member); + + } + mysql_free_result (sql_res); //resource free + + party_online_member = 0; + i = 0; + while (i < MAX_PARTY) + { + if (p->member[i].account_id > 0) + party_online_member++; + i++; + } + + //if (party_online_member==0) printf("- No member online \n"); else printf("- Some member %d online \n", party_online_member); + + if (party_member <= 0 && party_online_member == 0) + { + + // Delete the party, if has no member. + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `party_id`='%d'", + party_db, party_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + // printf("No member in party %d, break it \n",party_id); + memset (p, 0, sizeof (struct party)); + return 0; + } + else + { + // Update party information, if exists + + int i = 0; + + for (i = 0; i < MAX_PARTY; i++) + { + + if (p->member[i].account_id > 0) + { + sprintf (tmp_sql, + "UPDATE `%s` SET `party_id`='%d', `online`='%d' WHERE `account_id`='%d' AND `name`='%s'", + char_db, party_id, p->member[i].online, + p->member[i].account_id, jstrescapecpy (t_member, + p->member + [i].name)); + //printf("%s",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (update `char`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + + sprintf (tmp_sql, + "UPDATE `%s` SET `name`='%s', `exp`='%d', `item`='%d', `leader_id`=`leader_id` WHERE `party_id`='%d'", + party_db, t_name, p->exp, p->item, party_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (inset/update `party`)- %s\n", + mysql_error (&mysql_handle)); + } + + // printf("- Update party %d information \n",party_id); + } + } + else + { + // Add new party, if not exist + int i = 0; + while (i < MAX_PARTY + && ((p->member[i].account_id > 0 && p->member[i].leader == 0) + || (p->member[i].account_id < 0))) + i++; + if (i < MAX_PARTY) + leader_id = p->member[i].account_id; + sprintf (tmp_sql, + "INSERT INTO `%s` (`party_id`, `name`, `exp`, `item`, `leader_id`) VALUES ('%d', '%s', '%d', '%d', '%d')", + party_db, party_id, t_name, p->exp, p->item, leader_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (inset/update `party`)- %s\n", + mysql_error (&mysql_handle)); + return 0; + } + + sprintf (tmp_sql, + "UPDATE `%s` SET `party_id`='%d', `online`='1' WHERE `account_id`='%d' AND `name`='%s'", + char_db, party_id, leader_id, jstrescapecpy (t_member, + p-> + member + [i].name)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (inset/update `party`)- %s\n", + mysql_error (&mysql_handle)); + } + + //printf("- Insert new party %d \n",party_id); + } + + printf ("Party save success\n"); + return 0; } // Read party from mysql -int inter_party_fromsql(int party_id,struct party *p) +int inter_party_fromsql (int party_id, struct party *p) { - int leader_id=0; - printf("(\033[1;64m%d\033[0m) Request load party - ",party_id); - - memset(p, 0, sizeof(struct party)); - - sprintf(tmp_sql,"SELECT `party_id`, `name`,`exp`,`item`, `leader_id` FROM `%s` WHERE `party_id`='%d'",party_db, party_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) ); - return 0; - } - - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - sql_row = mysql_fetch_row(sql_res); - // printf("- Read party %d from MySQL\n",party_id); - p->party_id = party_id; - strcpy(p->name, sql_row[1]); - p->exp = atoi(sql_row[2]); - p->item = atoi(sql_row[3]); - leader_id = atoi(sql_row[4]); - } else { - mysql_free_result(sql_res); - // printf("- Cannot find party %d \n",party_id); - return 0; - } - - mysql_free_result(sql_res); - - // Load members - sprintf(tmp_sql,"SELECT `account_id`, `name`,`base_level`,`last_map`,`online` FROM `%s` WHERE `party_id`='%d'",char_db, party_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) ); - return 0; - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - int i; - for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){ - struct party_member *m = &p->member[i]; - m->account_id = atoi(sql_row[0]); - if (m->account_id == leader_id) m->leader = 1; else m->leader = 0; - strncpy(m->name,sql_row[1],sizeof(m->name)); - m->lv = atoi(sql_row[2]); - strncpy(m->map,sql_row[3],sizeof(m->map)); - m->online = atoi(sql_row[4]); - } - // printf("- %d members found in party %d \n",i,party_id); - } - mysql_free_result(sql_res); - - - printf("Party load success\n"); - return 0; - -} + int leader_id = 0; + printf ("(\033[1;64m%d\033[0m) Request load party - ", party_id); + + memset (p, 0, sizeof (struct party)); + + sprintf (tmp_sql, + "SELECT `party_id`, `name`,`exp`,`item`, `leader_id` FROM `%s` WHERE `party_id`='%d'", + party_db, party_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `party`)- %s\n", + mysql_error (&mysql_handle)); + return 0; + } + + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + sql_row = mysql_fetch_row (sql_res); + // printf("- Read party %d from MySQL\n",party_id); + p->party_id = party_id; + strcpy (p->name, sql_row[1]); + p->exp = atoi (sql_row[2]); + p->item = atoi (sql_row[3]); + leader_id = atoi (sql_row[4]); + } + else + { + mysql_free_result (sql_res); + // printf("- Cannot find party %d \n",party_id); + return 0; + } + + mysql_free_result (sql_res); + + // Load members + sprintf (tmp_sql, + "SELECT `account_id`, `name`,`base_level`,`last_map`,`online` FROM `%s` WHERE `party_id`='%d'", + char_db, party_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `party`)- %s\n", + mysql_error (&mysql_handle)); + return 0; + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + int i; + for (i = 0; (sql_row = mysql_fetch_row (sql_res)); i++) + { + struct party_member *m = &p->member[i]; + m->account_id = atoi (sql_row[0]); + if (m->account_id == leader_id) + m->leader = 1; + else + m->leader = 0; + strncpy (m->name, sql_row[1], sizeof (m->name)); + m->lv = atoi (sql_row[2]); + strncpy (m->map, sql_row[3], sizeof (m->map)); + m->online = atoi (sql_row[4]); + } + // printf("- %d members found in party %d \n",i,party_id); + } + mysql_free_result (sql_res); + + printf ("Party load success\n"); + return 0; -int inter_party_sql_init(){ - int i; - - //memory alloc - printf("interserver party memory initialize.... (%d byte)\n",sizeof(struct party)); - party_pt = calloc(sizeof(struct party), 1); - - sprintf(tmp_sql,"UPDATE `%s` SET `online`='0'", char_db); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); - } - - sprintf (tmp_sql , "SELECT count(*) FROM `%s`",party_db); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle) ; - sql_row = mysql_fetch_row(sql_res); - printf("total party data -> '%s'.......\n",sql_row[0]); - i = atoi (sql_row[0]); - mysql_free_result(sql_res); - - if (i > 0) { - //set party_newid - sprintf (tmp_sql , "SELECT max(`party_id`) FROM `%s`", party_db); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - - sql_res = mysql_store_result(&mysql_handle) ; - - sql_row = mysql_fetch_row(sql_res); - party_newid = atoi (sql_row[0])+1; - mysql_free_result(sql_res); - } - - printf("set party_newid: %d.......\n",party_newid); - - return 0; } +int inter_party_sql_init () +{ + int i; + + //memory alloc + printf ("interserver party memory initialize.... (%d byte)\n", + sizeof (struct party)); + party_pt = calloc (sizeof (struct party), 1); + + sprintf (tmp_sql, "UPDATE `%s` SET `online`='0'", char_db); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (update `char`)- %s\n", + mysql_error (&mysql_handle)); + } + + sprintf (tmp_sql, "SELECT count(*) FROM `%s`", party_db); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + sql_row = mysql_fetch_row (sql_res); + printf ("total party data -> '%s'.......\n", sql_row[0]); + i = atoi (sql_row[0]); + mysql_free_result (sql_res); + + if (i > 0) + { + //set party_newid + sprintf (tmp_sql, "SELECT max(`party_id`) FROM `%s`", party_db); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + + sql_res = mysql_store_result (&mysql_handle); + + sql_row = mysql_fetch_row (sql_res); + party_newid = atoi (sql_row[0]) + 1; + mysql_free_result (sql_res); + } + + printf ("set party_newid: %d.......\n", party_newid); + + return 0; +} // Search for the party according to its name -struct party* search_partyname(char *str) +struct party *search_partyname (char *str) { - struct party *p=NULL; - int leader_id = 0; - char t_name[24]; - - sprintf(tmp_sql,"SELECT `party_id`, `name`,`exp`,`item`,`leader_id` FROM `%s` WHERE `name`='%s'",party_db, jstrescapecpy(t_name,str)); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res==NULL || mysql_num_rows(sql_res)<=0) { mysql_free_result(sql_res); return p; } - sql_row = mysql_fetch_row(sql_res); - p = party_pt; - p->party_id = atoi(sql_row[0]); - strcpy(p->name, sql_row[1]); - p->exp = atoi(sql_row[2]); - p->item = atoi(sql_row[3]); - leader_id = atoi(sql_row[4]); - mysql_free_result(sql_res); - - // Load members - sprintf(tmp_sql,"SELECT `account_id`, `name`,`base_level`,`last_map`,`online` FROM `%s` WHERE `party_id`='%d'",char_db, p->party_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (select `party`)- %s\n", mysql_error(&mysql_handle) ); - return 0; - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - int i; - for(i=0;(sql_row = mysql_fetch_row(sql_res));i++){ - struct party_member *m = &p->member[i]; - m->account_id = atoi(sql_row[0]); - if (m->account_id == leader_id) m->leader = 1; else m->leader = 0; - strncpy(m->name,sql_row[1],sizeof(m->name)); - m->lv = atoi(sql_row[2]); - strncpy(m->map,sql_row[3],sizeof(m->map)); - m->online = atoi(sql_row[4]); - } - printf("- %d members found in party %d \n",i,p->party_id); - } - mysql_free_result(sql_res); - - return p; + struct party *p = NULL; + int leader_id = 0; + char t_name[24]; + + sprintf (tmp_sql, + "SELECT `party_id`, `name`,`exp`,`item`,`leader_id` FROM `%s` WHERE `name`='%s'", + party_db, jstrescapecpy (t_name, str)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `party`)- %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res == NULL || mysql_num_rows (sql_res) <= 0) + { + mysql_free_result (sql_res); + return p; + } + sql_row = mysql_fetch_row (sql_res); + p = party_pt; + p->party_id = atoi (sql_row[0]); + strcpy (p->name, sql_row[1]); + p->exp = atoi (sql_row[2]); + p->item = atoi (sql_row[3]); + leader_id = atoi (sql_row[4]); + mysql_free_result (sql_res); + + // Load members + sprintf (tmp_sql, + "SELECT `account_id`, `name`,`base_level`,`last_map`,`online` FROM `%s` WHERE `party_id`='%d'", + char_db, p->party_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `party`)- %s\n", + mysql_error (&mysql_handle)); + return 0; + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + int i; + for (i = 0; (sql_row = mysql_fetch_row (sql_res)); i++) + { + struct party_member *m = &p->member[i]; + m->account_id = atoi (sql_row[0]); + if (m->account_id == leader_id) + m->leader = 1; + else + m->leader = 0; + strncpy (m->name, sql_row[1], sizeof (m->name)); + m->lv = atoi (sql_row[2]); + strncpy (m->map, sql_row[3], sizeof (m->map)); + m->online = atoi (sql_row[4]); + } + printf ("- %d members found in party %d \n", i, p->party_id); + } + mysql_free_result (sql_res); + + return p; } // EXP公平分配できるかチェック -int party_check_exp_share(struct party *p) +int party_check_exp_share (struct party *p) { - int i; - int maxlv=0,minlv=0x7fffffff; - for(i=0;i<MAX_PARTY;i++){ - int lv=p->member[i].lv; - if( p->member[i].online ){ - if( lv < minlv ) minlv=lv; - if( maxlv < lv ) maxlv=lv; - } - } - return (maxlv==0 || maxlv-minlv<=party_share_level); + int i; + int maxlv = 0, minlv = 0x7fffffff; + for (i = 0; i < MAX_PARTY; i++) + { + int lv = p->member[i].lv; + if (p->member[i].online) + { + if (lv < minlv) + minlv = lv; + if (maxlv < lv) + maxlv = lv; + } + } + return (maxlv == 0 || maxlv - minlv <= party_share_level); } + // Is there any member in the party? -int party_check_empty(struct party *p) +int party_check_empty (struct party *p) { - int i; - if (p==NULL||p->party_id==0) return 1; -// printf("party check empty %08X\n",(int)p); - for(i=0;i<MAX_PARTY;i++){ -// printf("%d acc=%d\n",i,p->member[i].account_id); - if(p->member[i].account_id>0){ - return 0; - } - } - // If there is no member, then break the party - mapif_party_broken(p->party_id,0); - inter_party_tosql(p->party_id,p); - return 1; + int i; + if (p == NULL || p->party_id == 0) + return 1; +// printf("party check empty %08X\n",(int)p); + for (i = 0; i < MAX_PARTY; i++) + { +// printf("%d acc=%d\n",i,p->member[i].account_id); + if (p->member[i].account_id > 0) + { + return 0; + } + } + // If there is no member, then break the party + mapif_party_broken (p->party_id, 0); + inter_party_tosql (p->party_id, p); + return 1; } - // Check if a member is in two party, not necessary :) -int party_check_conflict(int party_id,int account_id,char *nick) +int party_check_conflict (int party_id, int account_id, char *nick) { - return 0; + return 0; } //------------------------------------------------------------------- // map serverへの通信 // パーティ作成可否 -int mapif_party_created(int fd,int account_id,struct party *p) +int mapif_party_created (int fd, int account_id, struct party *p) { - WFIFOW(fd,0)=0x3820; - WFIFOL(fd,2)=account_id; - if(p!=NULL){ - WFIFOB(fd,6)=0; - WFIFOL(fd,7)=p->party_id; - memcpy(WFIFOP(fd,11),p->name,24); - printf("int_party: created! %d %s\n",p->party_id,p->name); - }else{ - WFIFOB(fd,6)=1; - WFIFOL(fd,7)=0; - memcpy(WFIFOP(fd,11),"error",24); - } - WFIFOSET(fd,35); - return 0; + WFIFOW (fd, 0) = 0x3820; + WFIFOL (fd, 2) = account_id; + if (p != NULL) + { + WFIFOB (fd, 6) = 0; + WFIFOL (fd, 7) = p->party_id; + memcpy (WFIFOP (fd, 11), p->name, 24); + printf ("int_party: created! %d %s\n", p->party_id, p->name); + } + else + { + WFIFOB (fd, 6) = 1; + WFIFOL (fd, 7) = 0; + memcpy (WFIFOP (fd, 11), "error", 24); + } + WFIFOSET (fd, 35); + return 0; } // パーティ情報見つからず -int mapif_party_noinfo(int fd,int party_id) +int mapif_party_noinfo (int fd, int party_id) { - WFIFOW(fd,0)=0x3821; - WFIFOW(fd,2)=8; - WFIFOL(fd,4)=party_id; - WFIFOSET(fd,8); - printf("int_party: info not found %d\n",party_id); - return 0; + WFIFOW (fd, 0) = 0x3821; + WFIFOW (fd, 2) = 8; + WFIFOL (fd, 4) = party_id; + WFIFOSET (fd, 8); + printf ("int_party: info not found %d\n", party_id); + return 0; } + // パーティ情報まとめ送り -int mapif_party_info(int fd,struct party *p) +int mapif_party_info (int fd, struct party *p) { - unsigned char buf[1024]; - WBUFW(buf,0)=0x3821; - memcpy(buf+4,p,sizeof(struct party)); - WBUFW(buf,2)=4+sizeof(struct party); - if(fd<0) - mapif_sendall(buf,WBUFW(buf,2)); - else - mapif_send(fd,buf,WBUFW(buf,2)); -// printf("int_party: info %d %s\n",p->party_id,p->name); - return 0; + unsigned char buf[1024]; + WBUFW (buf, 0) = 0x3821; + memcpy (buf + 4, p, sizeof (struct party)); + WBUFW (buf, 2) = 4 + sizeof (struct party); + if (fd < 0) + mapif_sendall (buf, WBUFW (buf, 2)); + else + mapif_send (fd, buf, WBUFW (buf, 2)); +// printf("int_party: info %d %s\n",p->party_id,p->name); + return 0; } + // パーティメンバ追加可否 -int mapif_party_memberadded(int fd,int party_id,int account_id,int flag) +int mapif_party_memberadded (int fd, int party_id, int account_id, int flag) { - WFIFOW(fd,0)=0x3822; - WFIFOL(fd,2)=party_id; - WFIFOL(fd,6)=account_id; - WFIFOB(fd,10)=flag; - WFIFOSET(fd,11); - return 0; + WFIFOW (fd, 0) = 0x3822; + WFIFOL (fd, 2) = party_id; + WFIFOL (fd, 6) = account_id; + WFIFOB (fd, 10) = flag; + WFIFOSET (fd, 11); + return 0; } + // パーティ設定変更通知 -int mapif_party_optionchanged(int fd,struct party *p,int account_id,int flag) +int mapif_party_optionchanged (int fd, struct party *p, int account_id, + int flag) { - unsigned char buf[16]; - WBUFW(buf,0)=0x3823; - WBUFL(buf,2)=p->party_id; - WBUFL(buf,6)=account_id; - WBUFW(buf,10)=p->exp; - WBUFW(buf,12)=p->item; - WBUFB(buf,14)=flag; - if(flag==0) - mapif_sendall(buf,15); - else - mapif_send(fd,buf,15); - //printf("int_party: option changed %d %d %d %d %d\n",p->party_id,account_id,p->exp,p->item,flag); - return 0; + unsigned char buf[16]; + WBUFW (buf, 0) = 0x3823; + WBUFL (buf, 2) = p->party_id; + WBUFL (buf, 6) = account_id; + WBUFW (buf, 10) = p->exp; + WBUFW (buf, 12) = p->item; + WBUFB (buf, 14) = flag; + if (flag == 0) + mapif_sendall (buf, 15); + else + mapif_send (fd, buf, 15); + //printf("int_party: option changed %d %d %d %d %d\n",p->party_id,account_id,p->exp,p->item,flag); + return 0; } + // パーティ脱退通知 -int mapif_party_leaved(int party_id,int account_id,char *name) +int mapif_party_leaved (int party_id, int account_id, char *name) { - unsigned char buf[64]; - WBUFW(buf,0)=0x3824; - WBUFL(buf,2)=party_id; - WBUFL(buf,6)=account_id; - memcpy(WBUFP(buf,10),name,24); - mapif_sendall(buf,34); - //printf("int_party: party leaved %d %d %s\n",party_id,account_id,name); - return 0; + unsigned char buf[64]; + WBUFW (buf, 0) = 0x3824; + WBUFL (buf, 2) = party_id; + WBUFL (buf, 6) = account_id; + memcpy (WBUFP (buf, 10), name, 24); + mapif_sendall (buf, 34); + //printf("int_party: party leaved %d %d %s\n",party_id,account_id,name); + return 0; } + // パーティマップ更新通知 -int mapif_party_membermoved(struct party *p,int idx) +int mapif_party_membermoved (struct party *p, int idx) { - unsigned char buf[32]; - WBUFW(buf,0)=0x3825; - WBUFL(buf,2)=p->party_id; - WBUFL(buf,6)=p->member[idx].account_id; - memcpy(WBUFP(buf,10),p->member[idx].map,16); - WBUFB(buf,26)=p->member[idx].online; - WBUFW(buf,27)=p->member[idx].lv; - mapif_sendall(buf,29); - return 0; + unsigned char buf[32]; + WBUFW (buf, 0) = 0x3825; + WBUFL (buf, 2) = p->party_id; + WBUFL (buf, 6) = p->member[idx].account_id; + memcpy (WBUFP (buf, 10), p->member[idx].map, 16); + WBUFB (buf, 26) = p->member[idx].online; + WBUFW (buf, 27) = p->member[idx].lv; + mapif_sendall (buf, 29); + return 0; } + // パーティ解散通知 -int mapif_party_broken(int party_id,int flag) +int mapif_party_broken (int party_id, int flag) { - unsigned char buf[16]; - WBUFW(buf,0)=0x3826; - WBUFL(buf,2)=party_id; - WBUFB(buf,6)=flag; - mapif_sendall(buf,7); - //printf("int_party: broken %d\n",party_id); - return 0; + unsigned char buf[16]; + WBUFW (buf, 0) = 0x3826; + WBUFL (buf, 2) = party_id; + WBUFB (buf, 6) = flag; + mapif_sendall (buf, 7); + //printf("int_party: broken %d\n",party_id); + return 0; } + // パーティ内発言 -int mapif_party_message(int party_id,int account_id,char *mes,int len) +int mapif_party_message (int party_id, int account_id, char *mes, int len) { - unsigned char buf[512]; - WBUFW(buf,0)=0x3827; - WBUFW(buf,2)=len+12; - WBUFL(buf,4)=party_id; - WBUFL(buf,8)=account_id; - memcpy(WBUFP(buf,12),mes,len); - mapif_sendall(buf,len+12); - return 0; + unsigned char buf[512]; + WBUFW (buf, 0) = 0x3827; + WBUFW (buf, 2) = len + 12; + WBUFL (buf, 4) = party_id; + WBUFL (buf, 8) = account_id; + memcpy (WBUFP (buf, 12), mes, len); + mapif_sendall (buf, len + 12); + return 0; } //------------------------------------------------------------------- // map serverからの通信 - // Create Party -int mapif_parse_CreateParty(int fd,int account_id,char *name,char *nick,char *map,int lv) +int mapif_parse_CreateParty (int fd, int account_id, char *name, char *nick, + char *map, int lv) { - struct party *p; - if( (p=search_partyname(name))!=NULL){ -// printf("int_party: same name party exists [%s]\n",name); - mapif_party_created(fd,account_id,NULL); - return 0; - } - p=party_pt; - if(p==NULL){ - printf("int_party: out of memory !\n"); - mapif_party_created(fd,account_id,NULL); - return 0; - } - memset(p,0,sizeof(struct party)); - p->party_id=party_newid++; - memcpy(p->name,name,24); - p->exp=0; - p->item=0; - p->member[0].account_id=account_id; - memcpy(p->member[0].name,nick,24); - memcpy(p->member[0].map,map,16); - p->member[0].leader=1; - p->member[0].online=1; - p->member[0].lv=lv; - - inter_party_tosql(p->party_id,p); - - mapif_party_created(fd,account_id,p); - mapif_party_info(fd,p); - - return 0; + struct party *p; + if ((p = search_partyname (name)) != NULL) + { +// printf("int_party: same name party exists [%s]\n",name); + mapif_party_created (fd, account_id, NULL); + return 0; + } + p = party_pt; + if (p == NULL) + { + printf ("int_party: out of memory !\n"); + mapif_party_created (fd, account_id, NULL); + return 0; + } + memset (p, 0, sizeof (struct party)); + p->party_id = party_newid++; + memcpy (p->name, name, 24); + p->exp = 0; + p->item = 0; + p->member[0].account_id = account_id; + memcpy (p->member[0].name, nick, 24); + memcpy (p->member[0].map, map, 16); + p->member[0].leader = 1; + p->member[0].online = 1; + p->member[0].lv = lv; + + inter_party_tosql (p->party_id, p); + + mapif_party_created (fd, account_id, p); + mapif_party_info (fd, p); + + return 0; } + // パーティ情報要求 -int mapif_parse_PartyInfo(int fd,int party_id) +int mapif_parse_PartyInfo (int fd, int party_id) { - struct party *p = party_pt; - if(p==NULL){ - printf("int_party: out of memory !\n"); - return 0; - } - inter_party_fromsql(party_id, p); - - if(p->party_id >= 0) - mapif_party_info(fd,p); - else - mapif_party_noinfo(fd,party_id); - return 0; + struct party *p = party_pt; + if (p == NULL) + { + printf ("int_party: out of memory !\n"); + return 0; + } + inter_party_fromsql (party_id, p); + + if (p->party_id >= 0) + mapif_party_info (fd, p); + else + mapif_party_noinfo (fd, party_id); + return 0; } + // パーティ追加要求 -int mapif_parse_PartyAddMember(int fd,int party_id,int account_id,char *nick,char *map,int lv) +int mapif_parse_PartyAddMember (int fd, int party_id, int account_id, + char *nick, char *map, int lv) { - struct party *p; - int i; - - p = party_pt; - if(p==NULL){ - printf("int_party: out of memory !\n"); - return 0; - } - inter_party_fromsql(party_id, p); - - if(p->party_id <= 0){ - mapif_party_memberadded(fd,party_id,account_id,1); - return 0; - } - - for(i=0;i<MAX_PARTY;i++){ - if(p->member[i].account_id==0){ - int flag=0; - - p->member[i].account_id=account_id; - memcpy(p->member[i].name,nick,24); - memcpy(p->member[i].map,map,16); - p->member[i].leader=0; - p->member[i].online=1; - p->member[i].lv=lv; - mapif_party_memberadded(fd,party_id,account_id,0); - mapif_party_info(-1,p); - - if( p->exp>0 && !party_check_exp_share(p) ){ - p->exp=0; - flag=0x01; - } - if(flag) - mapif_party_optionchanged(fd,p,0,0); - - inter_party_tosql(party_id, p); - return 0; - } - } - mapif_party_memberadded(fd,party_id,account_id,1); - //inter_party_tosql(party_id, p); - return 0; + struct party *p; + int i; + + p = party_pt; + if (p == NULL) + { + printf ("int_party: out of memory !\n"); + return 0; + } + inter_party_fromsql (party_id, p); + + if (p->party_id <= 0) + { + mapif_party_memberadded (fd, party_id, account_id, 1); + return 0; + } + + for (i = 0; i < MAX_PARTY; i++) + { + if (p->member[i].account_id == 0) + { + int flag = 0; + + p->member[i].account_id = account_id; + memcpy (p->member[i].name, nick, 24); + memcpy (p->member[i].map, map, 16); + p->member[i].leader = 0; + p->member[i].online = 1; + p->member[i].lv = lv; + mapif_party_memberadded (fd, party_id, account_id, 0); + mapif_party_info (-1, p); + + if (p->exp > 0 && !party_check_exp_share (p)) + { + p->exp = 0; + flag = 0x01; + } + if (flag) + mapif_party_optionchanged (fd, p, 0, 0); + + inter_party_tosql (party_id, p); + return 0; + } + } + mapif_party_memberadded (fd, party_id, account_id, 1); + //inter_party_tosql(party_id, p); + return 0; } + // パーティー設定変更要求 -int mapif_parse_PartyChangeOption(int fd,int party_id,int account_id,int exp,int item) +int mapif_parse_PartyChangeOption (int fd, int party_id, int account_id, + int exp, int item) { - struct party *p; - int flag=0; - - p = party_pt; - if(p==NULL){ - printf("int_party: out of memory !\n"); - return 0; - } - - inter_party_fromsql(party_id, p); - - if(p->party_id <= 0){ - return 0; - } - - p->exp=exp; - if( exp>0 && !party_check_exp_share(p) ){ - flag|=0x01; - p->exp=0; - } - - p->item=item; - - mapif_party_optionchanged(fd,p,account_id,flag); - inter_party_tosql(party_id, p); - return 0; + struct party *p; + int flag = 0; + + p = party_pt; + if (p == NULL) + { + printf ("int_party: out of memory !\n"); + return 0; + } + + inter_party_fromsql (party_id, p); + + if (p->party_id <= 0) + { + return 0; + } + + p->exp = exp; + if (exp > 0 && !party_check_exp_share (p)) + { + flag |= 0x01; + p->exp = 0; + } + + p->item = item; + + mapif_party_optionchanged (fd, p, account_id, flag); + inter_party_tosql (party_id, p); + return 0; } + // パーティ脱退要求 -int mapif_parse_PartyLeave(int fd,int party_id,int account_id) +int mapif_parse_PartyLeave (int fd, int party_id, int account_id) { - char t_member[24]; - struct party *p = party_pt; - if(p==NULL){ - printf("int_party: out of memory !\n"); - return 0; - } - - inter_party_fromsql(party_id, p); - - if(p->party_id >= 0){ - int i,j; - for(i=0;i<MAX_PARTY;i++){ - - if(p->member[i].account_id==account_id){ - //printf("p->member[i].account_id = %d , account_id = %d \n",p->member[i].account_id,account_id); - mapif_party_leaved(party_id,account_id,p->member[i].name); - - - - // Update char information, does the name need encoding? - sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0', `online`='1' WHERE `party_id`='%d' AND `name`='%s'", - char_db, party_id, jstrescapecpy(t_member,p->member[i].name)); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); - } -// printf("Delete member %s from MySQL \n", p->member[i].name); - - if (p->member[i].leader==1){ - for(j=0;j<MAX_PARTY;j++) - { - //printf("j = %d , p->member[j].account_id = %d , p->member[j].account_id = %d \n",j,p->member[j].account_id,p->member[j].account_id); - if(p->member[j].account_id>0&&j!=i){ - mapif_party_leaved(party_id,p->member[j].account_id,p->member[j].name); - // Update char information, does the name need encoding? - sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0', `online`='1' WHERE `party_id`='%d' AND `name`='%s'", - char_db, party_id, jstrescapecpy(t_member,p->member[i].name)); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); - } -// printf("Delete member %s from MySQL \n", p->member[j].name); - } - } - // Delete the party, if has no member. - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `party_id`='%d'",party_db, party_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } -// printf("Leader breaks party %d \n",party_id); - memset(p, 0, sizeof(struct party)); - }else memset(&p->member[i],0,sizeof(struct party_member)); - - break; - - } - } - if( party_check_empty(p)==0 ) - mapif_party_info(-1,p);// まだ人がいるのでデータ送信 - /* - else - inter_party_tosql(party_id,p); // Break the party if no member - */ - }else{ - sprintf(tmp_sql,"UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `account_id`='%d' AND `online`='1'", - char_db, party_id, account_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); - } - } - return 0; + char t_member[24]; + struct party *p = party_pt; + if (p == NULL) + { + printf ("int_party: out of memory !\n"); + return 0; + } + + inter_party_fromsql (party_id, p); + + if (p->party_id >= 0) + { + int i, j; + for (i = 0; i < MAX_PARTY; i++) + { + + if (p->member[i].account_id == account_id) + { + //printf("p->member[i].account_id = %d , account_id = %d \n",p->member[i].account_id,account_id); + mapif_party_leaved (party_id, account_id, p->member[i].name); + + // Update char information, does the name need encoding? + sprintf (tmp_sql, + "UPDATE `%s` SET `party_id`='0', `online`='1' WHERE `party_id`='%d' AND `name`='%s'", + char_db, party_id, jstrescapecpy (t_member, + p-> + member[i].name)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (update `char`)- %s\n", + mysql_error (&mysql_handle)); + } +// printf("Delete member %s from MySQL \n", p->member[i].name); + + if (p->member[i].leader == 1) + { + for (j = 0; j < MAX_PARTY; j++) + { + //printf("j = %d , p->member[j].account_id = %d , p->member[j].account_id = %d \n",j,p->member[j].account_id,p->member[j].account_id); + if (p->member[j].account_id > 0 && j != i) + { + mapif_party_leaved (party_id, + p->member[j].account_id, + p->member[j].name); + // Update char information, does the name need encoding? + sprintf (tmp_sql, + "UPDATE `%s` SET `party_id`='0', `online`='1' WHERE `party_id`='%d' AND `name`='%s'", + char_db, party_id, + jstrescapecpy (t_member, + p->member[i].name)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf + ("DB server Error (update `char`)- %s\n", + mysql_error (&mysql_handle)); + } +// printf("Delete member %s from MySQL \n", p->member[j].name); + } + } + // Delete the party, if has no member. + sprintf (tmp_sql, + "DELETE FROM `%s` WHERE `party_id`='%d'", + party_db, party_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } +// printf("Leader breaks party %d \n",party_id); + memset (p, 0, sizeof (struct party)); + } + else + memset (&p->member[i], 0, sizeof (struct party_member)); + + break; + + } + } + if (party_check_empty (p) == 0) + mapif_party_info (-1, p); // まだ人がいるのでデータ送信 + /* + * else + * inter_party_tosql(party_id,p); // Break the party if no member + */ + } + else + { + sprintf (tmp_sql, + "UPDATE `%s` SET `party_id`='0' WHERE `party_id`='%d' AND `account_id`='%d' AND `online`='1'", + char_db, party_id, account_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (update `char`)- %s\n", + mysql_error (&mysql_handle)); + } + } + return 0; } + // When member goes to other map -int mapif_parse_PartyChangeMap(int fd,int party_id,int account_id,char *map,int online,int lv) +int mapif_parse_PartyChangeMap (int fd, int party_id, int account_id, + char *map, int online, int lv) { - struct party *p; - int i; - - p = party_pt; - if(p==NULL){ - printf("int_party: out of memory !\n"); - return 0; - } - inter_party_fromsql(party_id, p); - - if(p->party_id <= 0){ - return 0; - } - for(i=0;i<MAX_PARTY;i++){ - if(p->member[i].account_id==account_id){ - int flag=0; - - memcpy(p->member[i].map,map,16); - p->member[i].online=online; - p->member[i].lv=lv; - mapif_party_membermoved(p,i); - - if( p->exp>0 && !party_check_exp_share(p) ){ - p->exp=0; - flag=1; - } - if(flag) - mapif_party_optionchanged(fd,p,0,0); - break; - } - } - inter_party_tosql(party_id, p); - return 0; + struct party *p; + int i; + + p = party_pt; + if (p == NULL) + { + printf ("int_party: out of memory !\n"); + return 0; + } + inter_party_fromsql (party_id, p); + + if (p->party_id <= 0) + { + return 0; + } + for (i = 0; i < MAX_PARTY; i++) + { + if (p->member[i].account_id == account_id) + { + int flag = 0; + + memcpy (p->member[i].map, map, 16); + p->member[i].online = online; + p->member[i].lv = lv; + mapif_party_membermoved (p, i); + + if (p->exp > 0 && !party_check_exp_share (p)) + { + p->exp = 0; + flag = 1; + } + if (flag) + mapif_party_optionchanged (fd, p, 0, 0); + break; + } + } + inter_party_tosql (party_id, p); + return 0; } + // パーティ解散要求 -int mapif_parse_BreakParty(int fd,int party_id) +int mapif_parse_BreakParty (int fd, int party_id) { - struct party *p; - - p = party_pt; - if(p==NULL){ - printf("int_party: out of memory !\n"); - return 0; - } - - inter_party_fromsql(party_id, p); - - if(p->party_id <= 0){ - return 0; - } - inter_party_tosql(party_id,p); - - mapif_party_broken(fd,party_id); - return 0; + struct party *p; + + p = party_pt; + if (p == NULL) + { + printf ("int_party: out of memory !\n"); + return 0; + } + + inter_party_fromsql (party_id, p); + + if (p->party_id <= 0) + { + return 0; + } + inter_party_tosql (party_id, p); + + mapif_party_broken (fd, party_id); + return 0; } + // パーティメッセージ送信 -int mapif_parse_PartyMessage(int fd,int party_id,int account_id,char *mes,int len) +int mapif_parse_PartyMessage (int fd, int party_id, int account_id, char *mes, + int len) { - return mapif_party_message(party_id,account_id,mes,len); + return mapif_party_message (party_id, account_id, mes, len); } + // パーティチェック要求 -int mapif_parse_PartyCheck(int fd,int party_id,int account_id,char *nick) +int mapif_parse_PartyCheck (int fd, int party_id, int account_id, char *nick) { - return party_check_conflict(party_id,account_id,nick); + return party_check_conflict (party_id, account_id, nick); } // map server からの通信 @@ -727,29 +882,54 @@ int mapif_parse_PartyCheck(int fd,int party_id,int account_id,char *nick) // ・パケット長データはinter.cにセットしておくこと // ・パケット長チェックや、RFIFOSKIPは呼び出し元で行われるので行ってはならない // ・エラーなら0(false)、そうでないなら1(true)をかえさなければならない -int inter_party_parse_frommap(int fd) +int inter_party_parse_frommap (int fd) { - switch(RFIFOW(fd,0)){ - case 0x3020: mapif_parse_CreateParty(fd,RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,30),RFIFOP(fd,54),RFIFOW(fd,70)); break; - case 0x3021: mapif_parse_PartyInfo(fd,RFIFOL(fd,2)); break; - case 0x3022: mapif_parse_PartyAddMember(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOP(fd,34),RFIFOW(fd,50)); break; - case 0x3023: mapif_parse_PartyChangeOption(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12)); break; - case 0x3024: mapif_parse_PartyLeave(fd,RFIFOL(fd,2),RFIFOL(fd,6)); break; - case 0x3025: mapif_parse_PartyChangeMap(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27)); break; - case 0x3026: mapif_parse_BreakParty(fd,RFIFOL(fd,2)); break; - case 0x3027: mapif_parse_PartyMessage(fd,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12); break; - case 0x3028: mapif_parse_PartyCheck(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10)); break; - default: - return 0; - } - return 1; + switch (RFIFOW (fd, 0)) + { + case 0x3020: + mapif_parse_CreateParty (fd, RFIFOL (fd, 2), RFIFOP (fd, 6), + RFIFOP (fd, 30), RFIFOP (fd, 54), + RFIFOW (fd, 70)); + break; + case 0x3021: + mapif_parse_PartyInfo (fd, RFIFOL (fd, 2)); + break; + case 0x3022: + mapif_parse_PartyAddMember (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOP (fd, 10), RFIFOP (fd, 34), + RFIFOW (fd, 50)); + break; + case 0x3023: + mapif_parse_PartyChangeOption (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOW (fd, 10), RFIFOW (fd, 12)); + break; + case 0x3024: + mapif_parse_PartyLeave (fd, RFIFOL (fd, 2), RFIFOL (fd, 6)); + break; + case 0x3025: + mapif_parse_PartyChangeMap (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOP (fd, 10), RFIFOB (fd, 26), + RFIFOW (fd, 27)); + break; + case 0x3026: + mapif_parse_BreakParty (fd, RFIFOL (fd, 2)); + break; + case 0x3027: + mapif_parse_PartyMessage (fd, RFIFOL (fd, 4), RFIFOL (fd, 8), + RFIFOP (fd, 12), RFIFOW (fd, 2) - 12); + break; + case 0x3028: + mapif_parse_PartyCheck (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOP (fd, 10)); + break; + default: + return 0; + } + return 1; } // サーバーから脱退要求(キャラ削除用) -int inter_party_leave(int party_id,int account_id) +int inter_party_leave (int party_id, int account_id) { - return mapif_parse_PartyLeave(-1,party_id,account_id); + return mapif_parse_PartyLeave (-1, party_id, account_id); } - - - diff --git a/src/char_sql/int_party.h b/src/char_sql/int_party.h index 04f71c8..264ef8b 100644 --- a/src/char_sql/int_party.h +++ b/src/char_sql/int_party.h @@ -1,8 +1,8 @@ #ifndef _INT_PARTY_H_ #define _INT_PARTY_H_ -int inter_party_parse_frommap(int fd); -int inter_party_sql_init(); -int inter_party_leave(int party_id,int account_id); +int inter_party_parse_frommap (int fd); +int inter_party_sql_init (); +int inter_party_leave (int party_id, int account_id); #endif diff --git a/src/char_sql/int_pet.c b/src/char_sql/int_pet.c index 9b5566d..78e499d 100644 --- a/src/char_sql/int_pet.c +++ b/src/char_sql/int_pet.c @@ -12,313 +12,372 @@ struct s_pet *pet_pt; static int pet_newid = 100; - //--------------------------------------------------------- -int inter_pet_tosql(int pet_id, struct s_pet *p) { - //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) - char t_name[100]; - - printf("request save pet: %d.......\n",pet_id); - - jstrescapecpy(t_name, p->name); - - if(p->hungry < 0) - p->hungry = 0; - else if(p->hungry > 100) - p->hungry = 100; - if(p->intimate < 0) - p->intimate = 0; - else if(p->intimate > 1000) - p->intimate = 1000; - sprintf(tmp_sql,"SELECT * FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) - //row reside -> updating - sprintf(tmp_sql, "UPDATE `%s` SET `class`='%d',`name`='%s',`account_id`='%d',`char_id`='%d',`level`='%d',`egg_id`='%d',`equip`='%d',`intimate`='%d',`hungry`='%d',`rename_flag`='%d',`incuvate`='%d' WHERE `pet_id`='%d'", - pet_db, p->class, t_name, p->account_id, p->char_id, p->level, p->egg_id, - p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate, p->pet_id); - else //no row -> insert - sprintf(tmp_sql,"INSERT INTO `%s` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) VALUES ('%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", - pet_db, pet_id, p->class, t_name, p->account_id, p->char_id, p->level, p->egg_id, - p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate); - mysql_free_result(sql_res) ; //resource free - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (inset/update `pet`)- %s\n", mysql_error(&mysql_handle) ); - } - - printf("pet save success.......\n"); - return 0; +int inter_pet_tosql (int pet_id, struct s_pet *p) +{ + //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) + char t_name[100]; + + printf ("request save pet: %d.......\n", pet_id); + + jstrescapecpy (t_name, p->name); + + if (p->hungry < 0) + p->hungry = 0; + else if (p->hungry > 100) + p->hungry = 100; + if (p->intimate < 0) + p->intimate = 0; + else if (p->intimate > 1000) + p->intimate = 1000; + sprintf (tmp_sql, "SELECT * FROM `%s` WHERE `pet_id`='%d'", pet_db, + pet_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + //row reside -> updating + sprintf (tmp_sql, + "UPDATE `%s` SET `class`='%d',`name`='%s',`account_id`='%d',`char_id`='%d',`level`='%d',`egg_id`='%d',`equip`='%d',`intimate`='%d',`hungry`='%d',`rename_flag`='%d',`incuvate`='%d' WHERE `pet_id`='%d'", + pet_db, p->class, t_name, p->account_id, p->char_id, + p->level, p->egg_id, p->equip, p->intimate, p->hungry, + p->rename_flag, p->incuvate, p->pet_id); + else //no row -> insert + sprintf (tmp_sql, + "INSERT INTO `%s` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) VALUES ('%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", + pet_db, pet_id, p->class, t_name, p->account_id, p->char_id, + p->level, p->egg_id, p->equip, p->intimate, p->hungry, + p->rename_flag, p->incuvate); + mysql_free_result (sql_res); //resource free + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (inset/update `pet`)- %s\n", + mysql_error (&mysql_handle)); + } + + printf ("pet save success.......\n"); + return 0; } -int inter_pet_fromsql(int pet_id, struct s_pet *p){ - - printf("request load pet: %d.......\n",pet_id); - - memset(p, 0, sizeof(struct s_pet)); - - //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) - - sprintf(tmp_sql,"SELECT `pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate` FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (select `pet`)- %s\n", mysql_error(&mysql_handle) ); - return 0; - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - sql_row = mysql_fetch_row(sql_res); - - p->pet_id = pet_id; - p->class = atoi(sql_row[1]); - memcpy(p->name, sql_row[2],24); - p->account_id = atoi(sql_row[3]); - p->char_id = atoi(sql_row[4]); - p->level = atoi(sql_row[5]); - p->egg_id = atoi(sql_row[6]); - p->equip = atoi(sql_row[7]); - p->intimate = atoi(sql_row[8]); - p->hungry = atoi(sql_row[9]); - p->rename_flag = atoi(sql_row[10]); - p->incuvate = atoi(sql_row[11]); - } - if(p->hungry < 0) - p->hungry = 0; - else if(p->hungry > 100) - p->hungry = 100; - if(p->intimate < 0) - p->intimate = 0; - else if(p->intimate > 1000) - p->intimate = 1000; - - mysql_free_result(sql_res); - - printf("pet load success.......\n"); - return 0; +int inter_pet_fromsql (int pet_id, struct s_pet *p) +{ + + printf ("request load pet: %d.......\n", pet_id); + + memset (p, 0, sizeof (struct s_pet)); + + //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) + + sprintf (tmp_sql, + "SELECT `pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate` FROM `%s` WHERE `pet_id`='%d'", + pet_db, pet_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `pet`)- %s\n", + mysql_error (&mysql_handle)); + return 0; + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + sql_row = mysql_fetch_row (sql_res); + + p->pet_id = pet_id; + p->class = atoi (sql_row[1]); + memcpy (p->name, sql_row[2], 24); + p->account_id = atoi (sql_row[3]); + p->char_id = atoi (sql_row[4]); + p->level = atoi (sql_row[5]); + p->egg_id = atoi (sql_row[6]); + p->equip = atoi (sql_row[7]); + p->intimate = atoi (sql_row[8]); + p->hungry = atoi (sql_row[9]); + p->rename_flag = atoi (sql_row[10]); + p->incuvate = atoi (sql_row[11]); + } + if (p->hungry < 0) + p->hungry = 0; + else if (p->hungry > 100) + p->hungry = 100; + if (p->intimate < 0) + p->intimate = 0; + else if (p->intimate > 1000) + p->intimate = 1000; + + mysql_free_result (sql_res); + + printf ("pet load success.......\n"); + return 0; } + //---------------------------------------------- - -int inter_pet_sql_init(){ - int i; - - //memory alloc - printf("interserver pet memory initialize.... (%d byte)\n",sizeof(struct s_pet)); - pet_pt = calloc(sizeof(struct s_pet), 1); - - sprintf (tmp_sql , "SELECT count(*) FROM `%s`", pet_db); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - exit(0); - } - sql_res = mysql_store_result(&mysql_handle) ; - sql_row = mysql_fetch_row(sql_res); - printf("total pet data -> '%s'.......\n",sql_row[0]); - i = atoi (sql_row[0]); - mysql_free_result(sql_res); - - if (i > 0) { - //set pet_newid - sprintf (tmp_sql , "SELECT max(`pet_id`) FROM `%s`",pet_db ); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - - sql_res = mysql_store_result(&mysql_handle) ; - - sql_row = mysql_fetch_row(sql_res); - pet_newid = atoi (sql_row[0]); - mysql_free_result(sql_res); - } - - printf("set pet_newid: %d.......\n",pet_newid); - - return 0; + +int inter_pet_sql_init () +{ + int i; + + //memory alloc + printf ("interserver pet memory initialize.... (%d byte)\n", + sizeof (struct s_pet)); + pet_pt = calloc (sizeof (struct s_pet), 1); + + sprintf (tmp_sql, "SELECT count(*) FROM `%s`", pet_db); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + exit (0); + } + sql_res = mysql_store_result (&mysql_handle); + sql_row = mysql_fetch_row (sql_res); + printf ("total pet data -> '%s'.......\n", sql_row[0]); + i = atoi (sql_row[0]); + mysql_free_result (sql_res); + + if (i > 0) + { + //set pet_newid + sprintf (tmp_sql, "SELECT max(`pet_id`) FROM `%s`", pet_db); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + + sql_res = mysql_store_result (&mysql_handle); + + sql_row = mysql_fetch_row (sql_res); + pet_newid = atoi (sql_row[0]); + mysql_free_result (sql_res); + } + + printf ("set pet_newid: %d.......\n", pet_newid); + + return 0; } + //---------------------------------- -int inter_pet_delete(int pet_id){ - printf("request delete pet: %d.......\n",pet_id); - - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `pet_id`='%d'",pet_db, pet_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - return 0; +int inter_pet_delete (int pet_id) +{ + printf ("request delete pet: %d.......\n", pet_id); + + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `pet_id`='%d'", pet_db, pet_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + return 0; } + //------------------------------------------------------ -int mapif_pet_created(int fd, int account_id, struct s_pet *p) +int mapif_pet_created (int fd, int account_id, struct s_pet *p) { - WFIFOW(fd, 0) =0x3880; - WFIFOL(fd, 2) =account_id; - if(p!=NULL){ - WFIFOB(fd, 6)=0; - WFIFOL(fd, 7) =p->pet_id; - printf("int_pet: created! %d %s\n", p->pet_id, p->name); - }else{ - WFIFOB(fd, 6)=1; - WFIFOL(fd, 7)=0; - } - WFIFOSET(fd, 11); - - return 0; + WFIFOW (fd, 0) = 0x3880; + WFIFOL (fd, 2) = account_id; + if (p != NULL) + { + WFIFOB (fd, 6) = 0; + WFIFOL (fd, 7) = p->pet_id; + printf ("int_pet: created! %d %s\n", p->pet_id, p->name); + } + else + { + WFIFOB (fd, 6) = 1; + WFIFOL (fd, 7) = 0; + } + WFIFOSET (fd, 11); + + return 0; } -int mapif_pet_info(int fd, int account_id, struct s_pet *p){ - WFIFOW(fd, 0) =0x3881; - WFIFOW(fd, 2) =sizeof(struct s_pet) + 9; - WFIFOL(fd, 4) =account_id; - WFIFOB(fd, 8)=0; - memcpy(WFIFOP(fd, 9), p, sizeof(struct s_pet)); - WFIFOSET(fd, WFIFOW(fd, 2)); +int mapif_pet_info (int fd, int account_id, struct s_pet *p) +{ + WFIFOW (fd, 0) = 0x3881; + WFIFOW (fd, 2) = sizeof (struct s_pet) + 9; + WFIFOL (fd, 4) = account_id; + WFIFOB (fd, 8) = 0; + memcpy (WFIFOP (fd, 9), p, sizeof (struct s_pet)); + WFIFOSET (fd, WFIFOW (fd, 2)); - return 0; + return 0; } -int mapif_pet_noinfo(int fd, int account_id){ - WFIFOW(fd, 0) =0x3881; - WFIFOW(fd, 2) =sizeof(struct s_pet) + 9; - WFIFOL(fd, 4) =account_id; - WFIFOB(fd, 8)=1; - memset(WFIFOP(fd, 9), 0, sizeof(struct s_pet)); - WFIFOSET(fd, WFIFOW(fd, 2)); +int mapif_pet_noinfo (int fd, int account_id) +{ + WFIFOW (fd, 0) = 0x3881; + WFIFOW (fd, 2) = sizeof (struct s_pet) + 9; + WFIFOL (fd, 4) = account_id; + WFIFOB (fd, 8) = 1; + memset (WFIFOP (fd, 9), 0, sizeof (struct s_pet)); + WFIFOSET (fd, WFIFOW (fd, 2)); - return 0; + return 0; } -int mapif_save_pet_ack(int fd, int account_id, int flag){ - WFIFOW(fd, 0) =0x3882; - WFIFOL(fd, 2) =account_id; - WFIFOB(fd, 6) =flag; - WFIFOSET(fd, 7); +int mapif_save_pet_ack (int fd, int account_id, int flag) +{ + WFIFOW (fd, 0) = 0x3882; + WFIFOL (fd, 2) = account_id; + WFIFOB (fd, 6) = flag; + WFIFOSET (fd, 7); - return 0; + return 0; } -int mapif_delete_pet_ack(int fd, int flag){ - WFIFOW(fd, 0) =0x3883; - WFIFOB(fd, 2) =flag; - WFIFOSET(fd, 3); +int mapif_delete_pet_ack (int fd, int flag) +{ + WFIFOW (fd, 0) = 0x3883; + WFIFOB (fd, 2) = flag; + WFIFOSET (fd, 3); - return 0; + return 0; } -int mapif_create_pet(int fd, int account_id, int char_id, short pet_class, short pet_lv, short pet_egg_id, - short pet_equip, short intimate, short hungry, char rename_flag, char incuvate, char *pet_name){ - - memset(pet_pt, 0, sizeof(struct s_pet)); - pet_pt->pet_id = pet_newid++; - memcpy(pet_pt->name, pet_name, 24); - if(incuvate == 1) - pet_pt->account_id = pet_pt->char_id = 0; - else { - pet_pt->account_id = account_id; - pet_pt->char_id = char_id; - } - pet_pt->class = pet_class; - pet_pt->level = pet_lv; - pet_pt->egg_id = pet_egg_id; - pet_pt->equip = pet_equip; - pet_pt->intimate = intimate; - pet_pt->hungry = hungry; - pet_pt->rename_flag = rename_flag; - pet_pt->incuvate = incuvate; - - if(pet_pt->hungry < 0) - pet_pt->hungry = 0; - else if(pet_pt->hungry > 100) - pet_pt->hungry = 100; - if(pet_pt->intimate < 0) - pet_pt->intimate = 0; - else if(pet_pt->intimate > 1000) - pet_pt->intimate = 1000; - - inter_pet_tosql(pet_pt->pet_id,pet_pt); - - mapif_pet_created(fd, account_id, pet_pt); - - return 0; -} +int mapif_create_pet (int fd, int account_id, int char_id, short pet_class, + short pet_lv, short pet_egg_id, short pet_equip, + short intimate, short hungry, char rename_flag, + char incuvate, char *pet_name) +{ + + memset (pet_pt, 0, sizeof (struct s_pet)); + pet_pt->pet_id = pet_newid++; + memcpy (pet_pt->name, pet_name, 24); + if (incuvate == 1) + pet_pt->account_id = pet_pt->char_id = 0; + else + { + pet_pt->account_id = account_id; + pet_pt->char_id = char_id; + } + pet_pt->class = pet_class; + pet_pt->level = pet_lv; + pet_pt->egg_id = pet_egg_id; + pet_pt->equip = pet_equip; + pet_pt->intimate = intimate; + pet_pt->hungry = hungry; + pet_pt->rename_flag = rename_flag; + pet_pt->incuvate = incuvate; + + if (pet_pt->hungry < 0) + pet_pt->hungry = 0; + else if (pet_pt->hungry > 100) + pet_pt->hungry = 100; + if (pet_pt->intimate < 0) + pet_pt->intimate = 0; + else if (pet_pt->intimate > 1000) + pet_pt->intimate = 1000; -int mapif_load_pet(int fd, int account_id, int char_id, int pet_id){ - memset(pet_pt, 0, sizeof(struct s_pet)); - - inter_pet_fromsql(pet_id, pet_pt); - - if(pet_pt!=NULL) { - if(pet_pt->incuvate == 1) { - pet_pt->account_id = pet_pt->char_id = 0; - mapif_pet_info(fd, account_id, pet_pt); - } - else if(account_id == pet_pt->account_id && char_id == pet_pt->char_id) - mapif_pet_info(fd, account_id, pet_pt); - else - mapif_pet_noinfo(fd, account_id); - } - else - mapif_pet_noinfo(fd, account_id); - - return 0; + inter_pet_tosql (pet_pt->pet_id, pet_pt); + + mapif_pet_created (fd, account_id, pet_pt); + + return 0; } -int mapif_save_pet(int fd, int account_id, struct s_pet *data) { - //here process pet save request. - int len=RFIFOW(fd, 2); - if(sizeof(struct s_pet)!=len-8) { - printf("inter pet: data size error %d %d\n", sizeof(struct s_pet), len-8); - } - - else{ - if(data->hungry < 0) - data->hungry = 0; - else if(data->hungry > 100) - data->hungry = 100; - if(data->intimate < 0) - data->intimate = 0; - else if(data->intimate > 1000) - data->intimate = 1000; - inter_pet_tosql(data->pet_id,data); - mapif_save_pet_ack(fd, account_id, 0); - } - - return 0; +int mapif_load_pet (int fd, int account_id, int char_id, int pet_id) +{ + memset (pet_pt, 0, sizeof (struct s_pet)); + + inter_pet_fromsql (pet_id, pet_pt); + + if (pet_pt != NULL) + { + if (pet_pt->incuvate == 1) + { + pet_pt->account_id = pet_pt->char_id = 0; + mapif_pet_info (fd, account_id, pet_pt); + } + else if (account_id == pet_pt->account_id + && char_id == pet_pt->char_id) + mapif_pet_info (fd, account_id, pet_pt); + else + mapif_pet_noinfo (fd, account_id); + } + else + mapif_pet_noinfo (fd, account_id); + + return 0; } -int mapif_delete_pet(int fd, int pet_id){ - mapif_delete_pet_ack(fd, inter_pet_delete(pet_id)); +int mapif_save_pet (int fd, int account_id, struct s_pet *data) +{ + //here process pet save request. + int len = RFIFOW (fd, 2); + if (sizeof (struct s_pet) != len - 8) + { + printf ("inter pet: data size error %d %d\n", sizeof (struct s_pet), + len - 8); + } - return 0; + else + { + if (data->hungry < 0) + data->hungry = 0; + else if (data->hungry > 100) + data->hungry = 100; + if (data->intimate < 0) + data->intimate = 0; + else if (data->intimate > 1000) + data->intimate = 1000; + inter_pet_tosql (data->pet_id, data); + mapif_save_pet_ack (fd, account_id, 0); + } + + return 0; } -int mapif_parse_CreatePet(int fd){ - mapif_create_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOW(fd, 10), RFIFOW(fd, 12), RFIFOW(fd, 14), RFIFOW(fd, 16), RFIFOL(fd, 18), - RFIFOL(fd, 20), RFIFOB(fd, 22), RFIFOB(fd, 23), RFIFOP(fd, 24)); - return 0; +int mapif_delete_pet (int fd, int pet_id) +{ + mapif_delete_pet_ack (fd, inter_pet_delete (pet_id)); + + return 0; } -int mapif_parse_LoadPet(int fd){ - mapif_load_pet(fd, RFIFOL(fd, 2), RFIFOL(fd, 6), RFIFOL(fd, 10)); - return 0; +int mapif_parse_CreatePet (int fd) +{ + mapif_create_pet (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOW (fd, 10), + RFIFOW (fd, 12), RFIFOW (fd, 14), RFIFOW (fd, 16), + RFIFOL (fd, 18), RFIFOL (fd, 20), RFIFOB (fd, 22), + RFIFOB (fd, 23), RFIFOP (fd, 24)); + return 0; } -int mapif_parse_SavePet(int fd){ - mapif_save_pet(fd, RFIFOL(fd, 4), (struct s_pet *) RFIFOP(fd, 8)); - return 0; +int mapif_parse_LoadPet (int fd) +{ + mapif_load_pet (fd, RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10)); + return 0; } -int mapif_parse_DeletePet(int fd){ - mapif_delete_pet(fd, RFIFOL(fd, 2)); - return 0; +int mapif_parse_SavePet (int fd) +{ + mapif_save_pet (fd, RFIFOL (fd, 4), (struct s_pet *) RFIFOP (fd, 8)); + return 0; } -int inter_pet_parse_frommap(int fd){ - switch(RFIFOW(fd, 0)){ - case 0x3080: mapif_parse_CreatePet(fd); break; - case 0x3081: mapif_parse_LoadPet(fd); break; - case 0x3082: mapif_parse_SavePet(fd); break; - case 0x3083: mapif_parse_DeletePet(fd); break; - default: - return 0; - } - return 1; +int mapif_parse_DeletePet (int fd) +{ + mapif_delete_pet (fd, RFIFOL (fd, 2)); + return 0; } +int inter_pet_parse_frommap (int fd) +{ + switch (RFIFOW (fd, 0)) + { + case 0x3080: + mapif_parse_CreatePet (fd); + break; + case 0x3081: + mapif_parse_LoadPet (fd); + break; + case 0x3082: + mapif_parse_SavePet (fd); + break; + case 0x3083: + mapif_parse_DeletePet (fd); + break; + default: + return 0; + } + return 1; +} diff --git a/src/char_sql/int_pet.h b/src/char_sql/int_pet.h index b6e3f1b..0941dbc 100644 --- a/src/char_sql/int_pet.h +++ b/src/char_sql/int_pet.h @@ -1,12 +1,12 @@ #ifndef _INT_PET_H_ #define _INT_PET_H_ -int inter_pet_init(); -int inter_pet_save(); -int inter_pet_delete(int pet_id); +int inter_pet_init (); +int inter_pet_save (); +int inter_pet_delete (int pet_id); -int inter_pet_parse_frommap(int fd); -int inter_pet_sql_init(); +int inter_pet_parse_frommap (int fd); +int inter_pet_sql_init (); //extern char pet_txt[256]; #endif diff --git a/src/char_sql/int_storage.c b/src/char_sql/int_storage.c index fdf85ae..3dd0685 100644 --- a/src/char_sql/int_storage.c +++ b/src/char_sql/int_storage.c @@ -10,357 +10,432 @@ #define STORAGE_MEMINC 16 // reset by inter_config_read() -struct storage *storage_pt=NULL; -struct guild_storage *guild_storage_pt=NULL; - +struct storage *storage_pt = NULL; +struct guild_storage *guild_storage_pt = NULL; // storage data -> DB conversion -int storage_tosql(int account_id,struct storage *p){ - int i; - int eqcount=1; - int noteqcount=1; - struct itemtemp mapitem; - for(i=0;i<MAX_STORAGE;i++){ - if(p->storage[i].nameid>0){ - if(itemdb_isequip(p->storage[i].nameid)==1){ - mapitem.equip[eqcount].flag=0; - mapitem.equip[eqcount].id = p->storage[i].id; - mapitem.equip[eqcount].nameid=p->storage[i].nameid; - mapitem.equip[eqcount].amount = p->storage[i].amount; - mapitem.equip[eqcount].equip = p->storage[i].equip; - mapitem.equip[eqcount].identify = p->storage[i].identify; - mapitem.equip[eqcount].refine = p->storage[i].refine; - mapitem.equip[eqcount].attribute = p->storage[i].attribute; - mapitem.equip[eqcount].card[0] = p->storage[i].card[0]; - mapitem.equip[eqcount].card[1] = p->storage[i].card[1]; - mapitem.equip[eqcount].card[2] = p->storage[i].card[2]; - mapitem.equip[eqcount].card[3] = p->storage[i].card[3]; - mapitem.equip[eqcount].broken = p->storage[i].broken; - eqcount++; - } - else if(itemdb_isequip(p->storage[i].nameid)==0){ - mapitem.notequip[noteqcount].flag=0; - mapitem.notequip[noteqcount].id = p->storage[i].id; - mapitem.notequip[noteqcount].nameid=p->storage[i].nameid; - mapitem.notequip[noteqcount].amount = p->storage[i].amount; - mapitem.notequip[noteqcount].equip = p->storage[i].equip; - mapitem.notequip[noteqcount].identify = p->storage[i].identify; - mapitem.notequip[noteqcount].refine = p->storage[i].refine; - mapitem.notequip[noteqcount].attribute = p->storage[i].attribute; - mapitem.notequip[noteqcount].card[0] = p->storage[i].card[0]; - mapitem.notequip[noteqcount].card[1] = p->storage[i].card[1]; - mapitem.notequip[noteqcount].card[2] = p->storage[i].card[2]; - mapitem.notequip[noteqcount].card[3] = p->storage[i].card[3]; - mapitem.notequip[noteqcount].broken = p->storage[i].broken; - noteqcount++; - } - } - } - - memitemdata_to_sql(mapitem, eqcount, noteqcount, account_id,TABLE_STORAGE); - - //printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j); - return 0; +int storage_tosql (int account_id, struct storage *p) +{ + int i; + int eqcount = 1; + int noteqcount = 1; + struct itemtemp mapitem; + for (i = 0; i < MAX_STORAGE; i++) + { + if (p->storage[i].nameid > 0) + { + if (itemdb_isequip (p->storage[i].nameid) == 1) + { + mapitem.equip[eqcount].flag = 0; + mapitem.equip[eqcount].id = p->storage[i].id; + mapitem.equip[eqcount].nameid = p->storage[i].nameid; + mapitem.equip[eqcount].amount = p->storage[i].amount; + mapitem.equip[eqcount].equip = p->storage[i].equip; + mapitem.equip[eqcount].identify = p->storage[i].identify; + mapitem.equip[eqcount].refine = p->storage[i].refine; + mapitem.equip[eqcount].attribute = p->storage[i].attribute; + mapitem.equip[eqcount].card[0] = p->storage[i].card[0]; + mapitem.equip[eqcount].card[1] = p->storage[i].card[1]; + mapitem.equip[eqcount].card[2] = p->storage[i].card[2]; + mapitem.equip[eqcount].card[3] = p->storage[i].card[3]; + mapitem.equip[eqcount].broken = p->storage[i].broken; + eqcount++; + } + else if (itemdb_isequip (p->storage[i].nameid) == 0) + { + mapitem.notequip[noteqcount].flag = 0; + mapitem.notequip[noteqcount].id = p->storage[i].id; + mapitem.notequip[noteqcount].nameid = p->storage[i].nameid; + mapitem.notequip[noteqcount].amount = p->storage[i].amount; + mapitem.notequip[noteqcount].equip = p->storage[i].equip; + mapitem.notequip[noteqcount].identify = + p->storage[i].identify; + mapitem.notequip[noteqcount].refine = p->storage[i].refine; + mapitem.notequip[noteqcount].attribute = + p->storage[i].attribute; + mapitem.notequip[noteqcount].card[0] = p->storage[i].card[0]; + mapitem.notequip[noteqcount].card[1] = p->storage[i].card[1]; + mapitem.notequip[noteqcount].card[2] = p->storage[i].card[2]; + mapitem.notequip[noteqcount].card[3] = p->storage[i].card[3]; + mapitem.notequip[noteqcount].broken = p->storage[i].broken; + noteqcount++; + } + } + } + + memitemdata_to_sql (mapitem, eqcount, noteqcount, account_id, + TABLE_STORAGE); + + //printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j); + return 0; } // DB -> storage data conversion -int storage_fromsql(int account_id, struct storage *p){ - int i=0; - - memset(p,0,sizeof(struct storage)); //clean up memory - p->storage_amount = 0; - p->account_id = account_id; - - // storage {`account_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`} - sprintf(tmp_sql,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3`,`broken` FROM `%s` WHERE `account_id`='%d'",storage_db, account_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle) ; - - if (sql_res) { - while((sql_row = mysql_fetch_row(sql_res))) { //start to fetch - p->storage[i].id= atoi(sql_row[0]); - p->storage[i].nameid= atoi(sql_row[1]); - p->storage[i].amount= atoi(sql_row[2]); - p->storage[i].equip= atoi(sql_row[3]); - p->storage[i].identify= atoi(sql_row[4]); - p->storage[i].refine= atoi(sql_row[5]); - p->storage[i].attribute= atoi(sql_row[6]); - p->storage[i].card[0]= atoi(sql_row[7]); - p->storage[i].card[1]= atoi(sql_row[8]); - p->storage[i].card[2]= atoi(sql_row[9]); - p->storage[i].card[3]= atoi(sql_row[10]); - p->storage[i].broken = atoi(sql_row[11]); - p->storage_amount = ++i; - } - mysql_free_result(sql_res); - } - - printf ("storage load complete from DB - id: %d (total: %d)\n", account_id, p->storage_amount); - return 1; +int storage_fromsql (int account_id, struct storage *p) +{ + int i = 0; + + memset (p, 0, sizeof (struct storage)); //clean up memory + p->storage_amount = 0; + p->account_id = account_id; + + // storage {`account_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`} + sprintf (tmp_sql, + "SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3`,`broken` FROM `%s` WHERE `account_id`='%d'", + storage_db, account_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + + if (sql_res) + { + while ((sql_row = mysql_fetch_row (sql_res))) + { //start to fetch + p->storage[i].id = atoi (sql_row[0]); + p->storage[i].nameid = atoi (sql_row[1]); + p->storage[i].amount = atoi (sql_row[2]); + p->storage[i].equip = atoi (sql_row[3]); + p->storage[i].identify = atoi (sql_row[4]); + p->storage[i].refine = atoi (sql_row[5]); + p->storage[i].attribute = atoi (sql_row[6]); + p->storage[i].card[0] = atoi (sql_row[7]); + p->storage[i].card[1] = atoi (sql_row[8]); + p->storage[i].card[2] = atoi (sql_row[9]); + p->storage[i].card[3] = atoi (sql_row[10]); + p->storage[i].broken = atoi (sql_row[11]); + p->storage_amount = ++i; + } + mysql_free_result (sql_res); + } + + printf ("storage load complete from DB - id: %d (total: %d)\n", + account_id, p->storage_amount); + return 1; } // Save guild_storage data to sql -int guild_storage_tosql(int guild_id, struct guild_storage *p){ - int i; - int eqcount=1; - int noteqcount=1; - struct itemtemp mapitem; - for(i=0;i<MAX_GUILD_STORAGE;i++){ - if(p->storage[i].nameid>0){ - if(itemdb_isequip(p->storage[i].nameid)==1){ - mapitem.equip[eqcount].flag=0; - mapitem.equip[eqcount].id = p->storage[i].id; - mapitem.equip[eqcount].nameid=p->storage[i].nameid; - mapitem.equip[eqcount].amount = p->storage[i].amount; - mapitem.equip[eqcount].equip = p->storage[i].equip; - mapitem.equip[eqcount].identify = p->storage[i].identify; - mapitem.equip[eqcount].refine = p->storage[i].refine; - mapitem.equip[eqcount].attribute = p->storage[i].attribute; - mapitem.equip[eqcount].card[0] = p->storage[i].card[0]; - mapitem.equip[eqcount].card[1] = p->storage[i].card[1]; - mapitem.equip[eqcount].card[2] = p->storage[i].card[2]; - mapitem.equip[eqcount].card[3] = p->storage[i].card[3]; - mapitem.equip[eqcount].broken = p->storage[i].broken; - eqcount++; - } - else if(itemdb_isequip(p->storage[i].nameid)==0){ - mapitem.notequip[noteqcount].flag=0; - mapitem.notequip[noteqcount].id = p->storage[i].id; - mapitem.notequip[noteqcount].nameid=p->storage[i].nameid; - mapitem.notequip[noteqcount].amount = p->storage[i].amount; - mapitem.notequip[noteqcount].equip = p->storage[i].equip; - mapitem.notequip[noteqcount].identify = p->storage[i].identify; - mapitem.notequip[noteqcount].refine = p->storage[i].refine; - mapitem.notequip[noteqcount].attribute = p->storage[i].attribute; - mapitem.notequip[noteqcount].card[0] = p->storage[i].card[0]; - mapitem.notequip[noteqcount].card[1] = p->storage[i].card[1]; - mapitem.notequip[noteqcount].card[2] = p->storage[i].card[2]; - mapitem.notequip[noteqcount].card[3] = p->storage[i].card[3]; - mapitem.notequip[noteqcount].broken = p->storage[i].broken; - noteqcount++; - } - } - } - - memitemdata_to_sql(mapitem, eqcount, noteqcount, guild_id,TABLE_GUILD_STORAGE); - - printf ("guild storage save to DB - id: %d (total: %d)\n", guild_id,i); - return 0; +int guild_storage_tosql (int guild_id, struct guild_storage *p) +{ + int i; + int eqcount = 1; + int noteqcount = 1; + struct itemtemp mapitem; + for (i = 0; i < MAX_GUILD_STORAGE; i++) + { + if (p->storage[i].nameid > 0) + { + if (itemdb_isequip (p->storage[i].nameid) == 1) + { + mapitem.equip[eqcount].flag = 0; + mapitem.equip[eqcount].id = p->storage[i].id; + mapitem.equip[eqcount].nameid = p->storage[i].nameid; + mapitem.equip[eqcount].amount = p->storage[i].amount; + mapitem.equip[eqcount].equip = p->storage[i].equip; + mapitem.equip[eqcount].identify = p->storage[i].identify; + mapitem.equip[eqcount].refine = p->storage[i].refine; + mapitem.equip[eqcount].attribute = p->storage[i].attribute; + mapitem.equip[eqcount].card[0] = p->storage[i].card[0]; + mapitem.equip[eqcount].card[1] = p->storage[i].card[1]; + mapitem.equip[eqcount].card[2] = p->storage[i].card[2]; + mapitem.equip[eqcount].card[3] = p->storage[i].card[3]; + mapitem.equip[eqcount].broken = p->storage[i].broken; + eqcount++; + } + else if (itemdb_isequip (p->storage[i].nameid) == 0) + { + mapitem.notequip[noteqcount].flag = 0; + mapitem.notequip[noteqcount].id = p->storage[i].id; + mapitem.notequip[noteqcount].nameid = p->storage[i].nameid; + mapitem.notequip[noteqcount].amount = p->storage[i].amount; + mapitem.notequip[noteqcount].equip = p->storage[i].equip; + mapitem.notequip[noteqcount].identify = + p->storage[i].identify; + mapitem.notequip[noteqcount].refine = p->storage[i].refine; + mapitem.notequip[noteqcount].attribute = + p->storage[i].attribute; + mapitem.notequip[noteqcount].card[0] = p->storage[i].card[0]; + mapitem.notequip[noteqcount].card[1] = p->storage[i].card[1]; + mapitem.notequip[noteqcount].card[2] = p->storage[i].card[2]; + mapitem.notequip[noteqcount].card[3] = p->storage[i].card[3]; + mapitem.notequip[noteqcount].broken = p->storage[i].broken; + noteqcount++; + } + } + } + + memitemdata_to_sql (mapitem, eqcount, noteqcount, guild_id, + TABLE_GUILD_STORAGE); + + printf ("guild storage save to DB - id: %d (total: %d)\n", guild_id, i); + return 0; } // Load guild_storage data to mem -int guild_storage_fromsql(int guild_id, struct guild_storage *p){ - int i=0; - struct guild_storage *gs=guild_storage_pt; - p=gs; - - memset(p,0,sizeof(struct guild_storage)); //clean up memory - p->storage_amount = 0; - p->guild_id = guild_id; - - // storage {`guild_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`} - sprintf(tmp_sql,"SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3`,`broken` FROM `%s` WHERE `guild_id`='%d'",guild_storage_db, guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle) ; - - if (sql_res) { - while((sql_row = mysql_fetch_row(sql_res))) { //start to fetch - p->storage[i].id= atoi(sql_row[0]); - p->storage[i].nameid= atoi(sql_row[1]); - p->storage[i].amount= atoi(sql_row[2]); - p->storage[i].equip= atoi(sql_row[3]); - p->storage[i].identify= atoi(sql_row[4]); - p->storage[i].refine= atoi(sql_row[5]); - p->storage[i].attribute= atoi(sql_row[6]); - p->storage[i].card[0]= atoi(sql_row[7]); - p->storage[i].card[1]= atoi(sql_row[8]); - p->storage[i].card[2]= atoi(sql_row[9]); - p->storage[i].card[3]= atoi(sql_row[10]); - p->storage[i].broken = atoi(sql_row[11]); - p->storage_amount = ++i; - } - mysql_free_result(sql_res); - } - printf ("guild storage load complete from DB - id: %d (total: %d)\n", guild_id, p->storage_amount); - return 0; +int guild_storage_fromsql (int guild_id, struct guild_storage *p) +{ + int i = 0; + struct guild_storage *gs = guild_storage_pt; + p = gs; + + memset (p, 0, sizeof (struct guild_storage)); //clean up memory + p->storage_amount = 0; + p->guild_id = guild_id; + + // storage {`guild_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`} + sprintf (tmp_sql, + "SELECT `id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3`,`broken` FROM `%s` WHERE `guild_id`='%d'", + guild_storage_db, guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + + if (sql_res) + { + while ((sql_row = mysql_fetch_row (sql_res))) + { //start to fetch + p->storage[i].id = atoi (sql_row[0]); + p->storage[i].nameid = atoi (sql_row[1]); + p->storage[i].amount = atoi (sql_row[2]); + p->storage[i].equip = atoi (sql_row[3]); + p->storage[i].identify = atoi (sql_row[4]); + p->storage[i].refine = atoi (sql_row[5]); + p->storage[i].attribute = atoi (sql_row[6]); + p->storage[i].card[0] = atoi (sql_row[7]); + p->storage[i].card[1] = atoi (sql_row[8]); + p->storage[i].card[2] = atoi (sql_row[9]); + p->storage[i].card[3] = atoi (sql_row[10]); + p->storage[i].broken = atoi (sql_row[11]); + p->storage_amount = ++i; + } + mysql_free_result (sql_res); + } + printf ("guild storage load complete from DB - id: %d (total: %d)\n", + guild_id, p->storage_amount); + return 0; } //--------------------------------------------------------- // storage data initialize -int inter_storage_sql_init(){ - - //memory alloc - printf("interserver storage memory initialize....(%d byte)\n",sizeof(struct storage)); - storage_pt=calloc(sizeof(struct storage), 1); - guild_storage_pt=calloc(sizeof(struct guild_storage), 1); - memset(storage_pt,0,sizeof(struct storage)); - memset(guild_storage_pt,0,sizeof(struct guild_storage)); - - return 1; +int inter_storage_sql_init () +{ + + //memory alloc + printf ("interserver storage memory initialize....(%d byte)\n", + sizeof (struct storage)); + storage_pt = calloc (sizeof (struct storage), 1); + guild_storage_pt = calloc (sizeof (struct guild_storage), 1); + memset (storage_pt, 0, sizeof (struct storage)); + memset (guild_storage_pt, 0, sizeof (struct guild_storage)); + + return 1; } + // 倉庫データ削除 -int inter_storage_delete(int account_id) +int inter_storage_delete (int account_id) { - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `account_id`='%d'",storage_db, account_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `storage`)- %s\n", mysql_error(&mysql_handle) ); - } - return 0; + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `account_id`='%d'", storage_db, + account_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `storage`)- %s\n", + mysql_error (&mysql_handle)); + } + return 0; } -int inter_guild_storage_delete(int guild_id) + +int inter_guild_storage_delete (int guild_id) { - sprintf(tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'",guild_storage_db, guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild_storage`)- %s\n", mysql_error(&mysql_handle) ); - } - return 0; + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `guild_id`='%d'", + guild_storage_db, guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild_storage`)- %s\n", + mysql_error (&mysql_handle)); + } + return 0; } //--------------------------------------------------------- // packet from map server // recive packet about storage data -int mapif_load_storage(int fd,int account_id){ - //load from DB - storage_fromsql(account_id, storage_pt); - WFIFOW(fd,0)=0x3810; - WFIFOW(fd,2)=sizeof(struct storage)+8; - WFIFOL(fd,4)=account_id; - memcpy(WFIFOP(fd,8),storage_pt,sizeof(struct storage)); - WFIFOSET(fd,WFIFOW(fd,2)); - return 0; +int mapif_load_storage (int fd, int account_id) +{ + //load from DB + storage_fromsql (account_id, storage_pt); + WFIFOW (fd, 0) = 0x3810; + WFIFOW (fd, 2) = sizeof (struct storage) + 8; + WFIFOL (fd, 4) = account_id; + memcpy (WFIFOP (fd, 8), storage_pt, sizeof (struct storage)); + WFIFOSET (fd, WFIFOW (fd, 2)); + return 0; } + // send ack to map server which is "storage data save ok." -int mapif_save_storage_ack(int fd,int account_id){ - WFIFOW(fd,0)=0x3811; - WFIFOL(fd,2)=account_id; - WFIFOB(fd,6)=0; - WFIFOSET(fd,7); - return 0; +int mapif_save_storage_ack (int fd, int account_id) +{ + WFIFOW (fd, 0) = 0x3811; + WFIFOL (fd, 2) = account_id; + WFIFOB (fd, 6) = 0; + WFIFOSET (fd, 7); + return 0; } -int mapif_load_guild_storage(int fd,int account_id,int guild_id) +int mapif_load_guild_storage (int fd, int account_id, int guild_id) { - int guild_exist=0; - WFIFOW(fd,0)=0x3818; - - // Check if guild exists, I may write a function for this later, coz I use it several times. - //printf("- Check if guild %d exists\n",g->guild_id); - sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - sql_row = mysql_fetch_row(sql_res); - guild_exist = atoi (sql_row[0]); - //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes")); - } - mysql_free_result(sql_res) ; //resource free - - if(guild_exist==1) { - guild_storage_fromsql(guild_id,guild_storage_pt); - WFIFOW(fd,2)=sizeof(struct guild_storage)+12; - WFIFOL(fd,4)=account_id; - WFIFOL(fd,8)=guild_id; - memcpy(WFIFOP(fd,12),guild_storage_pt,sizeof(struct guild_storage)); - } - else { - WFIFOW(fd,2)=12; - WFIFOL(fd,4)=account_id; - WFIFOL(fd,8)=0; - } - WFIFOSET(fd,WFIFOW(fd,2)); - - return 0; + int guild_exist = 0; + WFIFOW (fd, 0) = 0x3818; + + // Check if guild exists, I may write a function for this later, coz I use it several times. + //printf("- Check if guild %d exists\n",g->guild_id); + sprintf (tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'", + guild_db, guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild`)- %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + sql_row = mysql_fetch_row (sql_res); + guild_exist = atoi (sql_row[0]); + //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes")); + } + mysql_free_result (sql_res); //resource free + + if (guild_exist == 1) + { + guild_storage_fromsql (guild_id, guild_storage_pt); + WFIFOW (fd, 2) = sizeof (struct guild_storage) + 12; + WFIFOL (fd, 4) = account_id; + WFIFOL (fd, 8) = guild_id; + memcpy (WFIFOP (fd, 12), guild_storage_pt, + sizeof (struct guild_storage)); + } + else + { + WFIFOW (fd, 2) = 12; + WFIFOL (fd, 4) = account_id; + WFIFOL (fd, 8) = 0; + } + WFIFOSET (fd, WFIFOW (fd, 2)); + + return 0; } -int mapif_save_guild_storage_ack(int fd,int account_id,int guild_id,int fail) + +int mapif_save_guild_storage_ack (int fd, int account_id, int guild_id, + int fail) { - WFIFOW(fd,0)=0x3819; - WFIFOL(fd,2)=account_id; - WFIFOL(fd,6)=guild_id; - WFIFOB(fd,10)=fail; - WFIFOSET(fd,11); - return 0; + WFIFOW (fd, 0) = 0x3819; + WFIFOL (fd, 2) = account_id; + WFIFOL (fd, 6) = guild_id; + WFIFOB (fd, 10) = fail; + WFIFOSET (fd, 11); + return 0; } //--------------------------------------------------------- // packet from map server // recive request about storage data -int mapif_parse_LoadStorage(int fd){ - mapif_load_storage(fd,RFIFOL(fd,2)); - return 0; -} -// storage data recive and save -int mapif_parse_SaveStorage(int fd){ - int account_id=RFIFOL(fd,4); - int len=RFIFOW(fd,2); - - if(sizeof(struct storage)!=len-8){ - printf("inter storage: data size error %d %d\n",sizeof(struct storage),len-8); - }else{ - memcpy(&storage_pt[0],RFIFOP(fd,8),sizeof(struct storage)); - storage_tosql(account_id, storage_pt); - mapif_save_storage_ack(fd,account_id); - } - return 0; +int mapif_parse_LoadStorage (int fd) +{ + mapif_load_storage (fd, RFIFOL (fd, 2)); + return 0; } -int mapif_parse_LoadGuildStorage(int fd) +// storage data recive and save +int mapif_parse_SaveStorage (int fd) { - mapif_load_guild_storage(fd,RFIFOL(fd,2),RFIFOL(fd,6)); - return 0; + int account_id = RFIFOL (fd, 4); + int len = RFIFOW (fd, 2); + + if (sizeof (struct storage) != len - 8) + { + printf ("inter storage: data size error %d %d\n", + sizeof (struct storage), len - 8); + } + else + { + memcpy (&storage_pt[0], RFIFOP (fd, 8), sizeof (struct storage)); + storage_tosql (account_id, storage_pt); + mapif_save_storage_ack (fd, account_id); + } + return 0; } -int mapif_parse_SaveGuildStorage(int fd) +int mapif_parse_LoadGuildStorage (int fd) { - int guild_exist=0; - int guild_id=RFIFOL(fd,8); - int len=RFIFOW(fd,2); - if(sizeof(struct guild_storage)!=len-12){ - printf("inter storage: data size error %d %d\n",sizeof(struct guild_storage),len-12); - } - else { - // Check if guild exists, I may write a function for this later, coz I use it several times. - //printf("- Check if guild %d exists\n",g->guild_id); - sprintf(tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'",guild_db, guild_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `guild`)- %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res!=NULL && mysql_num_rows(sql_res)>0) { - sql_row = mysql_fetch_row(sql_res); - guild_exist = atoi (sql_row[0]); - //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes")); - } - mysql_free_result(sql_res) ; //resource free - - if(guild_exist==1) { - memcpy(guild_storage_pt,RFIFOP(fd,12),sizeof(struct guild_storage)); - guild_storage_tosql(guild_id,guild_storage_pt); - mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,0); - } - else - mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,1); - } - return 0; + mapif_load_guild_storage (fd, RFIFOL (fd, 2), RFIFOL (fd, 6)); + return 0; } +int mapif_parse_SaveGuildStorage (int fd) +{ + int guild_exist = 0; + int guild_id = RFIFOL (fd, 8); + int len = RFIFOW (fd, 2); + if (sizeof (struct guild_storage) != len - 12) + { + printf ("inter storage: data size error %d %d\n", + sizeof (struct guild_storage), len - 12); + } + else + { + // Check if guild exists, I may write a function for this later, coz I use it several times. + //printf("- Check if guild %d exists\n",g->guild_id); + sprintf (tmp_sql, "SELECT count(*) FROM `%s` WHERE `guild_id`='%d'", + guild_db, guild_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `guild`)- %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res != NULL && mysql_num_rows (sql_res) > 0) + { + sql_row = mysql_fetch_row (sql_res); + guild_exist = atoi (sql_row[0]); + //printf("- Check if guild %d exists : %s\n",g->guild_id,((guild_exist==0)?"No":"Yes")); + } + mysql_free_result (sql_res); //resource free -int inter_storage_parse_frommap(int fd){ - switch(RFIFOW(fd,0)){ - case 0x3010: mapif_parse_LoadStorage(fd); break; - case 0x3011: mapif_parse_SaveStorage(fd); break; - case 0x3018: mapif_parse_LoadGuildStorage(fd); break; - case 0x3019: mapif_parse_SaveGuildStorage(fd); break; - default: - return 0; - } - return 1; + if (guild_exist == 1) + { + memcpy (guild_storage_pt, RFIFOP (fd, 12), + sizeof (struct guild_storage)); + guild_storage_tosql (guild_id, guild_storage_pt); + mapif_save_guild_storage_ack (fd, RFIFOL (fd, 4), guild_id, 0); + } + else + mapif_save_guild_storage_ack (fd, RFIFOL (fd, 4), guild_id, 1); + } + return 0; } +int inter_storage_parse_frommap (int fd) +{ + switch (RFIFOW (fd, 0)) + { + case 0x3010: + mapif_parse_LoadStorage (fd); + break; + case 0x3011: + mapif_parse_SaveStorage (fd); + break; + case 0x3018: + mapif_parse_LoadGuildStorage (fd); + break; + case 0x3019: + mapif_parse_SaveGuildStorage (fd); + break; + default: + return 0; + } + return 1; +} diff --git a/src/char_sql/int_storage.h b/src/char_sql/int_storage.h index f9f37db..2a7efee 100644 --- a/src/char_sql/int_storage.h +++ b/src/char_sql/int_storage.h @@ -1,12 +1,11 @@ #ifndef _INT_STORAGE_H_ #define _INT_STORAGE_H_ -int inter_storage_sql_init(); -int inter_storage_delete(int account_id); -int inter_guild_storage_delete(int guild_id); - -int inter_storage_parse_frommap(int fd); +int inter_storage_sql_init (); +int inter_storage_delete (int account_id); +int inter_guild_storage_delete (int guild_id); +int inter_storage_parse_frommap (int fd); //extern char storage_txt[256]; diff --git a/src/char_sql/inter.c b/src/char_sql/inter.c index d1ee194..048d466 100644 --- a/src/char_sql/inter.c +++ b/src/char_sql/inter.c @@ -15,559 +15,648 @@ #include "int_pet.h" #include "lock.h" -#define WISDATA_TTL (60*1000) // Wisデータの生存時間(60秒) -#define WISDELLIST_MAX 256 // Wisデータ削除リストの要素数 +#define WISDATA_TTL (60*1000) // Wisデータの生存時間(60秒) +#define WISDELLIST_MAX 256 // Wisデータ削除リストの要素数 - -struct accreg { - int account_id,reg_num; - struct global_reg reg[ACCOUNT_REG_NUM]; +struct accreg +{ + int account_id, reg_num; + struct global_reg reg[ACCOUNT_REG_NUM]; }; static struct accreg *accreg_pt; - -int party_share_level = 10; +int party_share_level = 10; MYSQL mysql_handle; -MYSQL_RES* sql_res ; -MYSQL_ROW sql_row ; -int sql_fields, sql_cnt; +MYSQL_RES *sql_res; +MYSQL_ROW sql_row; +int sql_fields, sql_cnt; char tmp_sql[65535]; MYSQL lmysql_handle; char tmp_lsql[65535]; -MYSQL_RES* lsql_res ; -MYSQL_ROW lsql_row ; +MYSQL_RES *lsql_res; +MYSQL_ROW lsql_row; -int char_server_port = 3306; +int char_server_port = 3306; char char_server_ip[32] = "127.0.0.1"; char char_server_id[32] = "ragnarok"; char char_server_pw[32] = "ragnarok"; char char_server_db[32] = "ragnarok"; -int login_server_port = 3306; +int login_server_port = 3306; char login_server_ip[32] = "127.0.0.1"; char login_server_id[32] = "ragnarok"; char login_server_pw[32] = "ragnarok"; char login_server_db[32] = "ragnarok"; // sending packet list -int inter_send_packet_length[]={ - -1,-1,27, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0, - 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0, - 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1, - 9, 9,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +int inter_send_packet_length[] = { + -1, -1, 27, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -1, 7, 0, 0, 0, 0, 0, 0, -1, 11, 0, 0, 0, 0, 0, 0, + 35, -1, 11, 15, 34, 29, 7, -1, 0, 0, 0, 0, 0, 0, 0, 0, + 10, -1, 15, 0, 79, 19, 7, -1, 0, -1, -1, -1, 14, 67, 186, -1, + 9, 9, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, -1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; + // recv. packet list -int inter_recv_packet_length[]={ - -1,-1, 7, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 6,-1, 0, 0, 0, 0, 0, 0, 10,-1, 0, 0, 0, 0, 0, 0, - 72, 6,52,14, 10,29, 6,-1, 34, 0, 0, 0, 0, 0, 0, 0, - -1, 6,-1, 0, 55,19, 6,-1, 14,-1,-1,-1, 14,19,186,-1, - 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 48,14,-1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +int inter_recv_packet_length[] = { + -1, -1, 7, 0, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, -1, 0, 0, 0, 0, 0, 0, 10, -1, 0, 0, 0, 0, 0, 0, + 72, 6, 52, 14, 10, 29, 6, -1, 34, 0, 0, 0, 0, 0, 0, 0, + -1, 6, -1, 0, 55, 19, 6, -1, 14, -1, -1, -1, 14, 19, 186, -1, + 5, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 14, -1, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -struct WisData { - int id,fd,count,len; - unsigned long tick; - unsigned char src[24],dst[24],msg[512]; +struct WisData +{ + int id, fd, count, len; + unsigned long tick; + unsigned char src[24], dst[24], msg[512]; }; -static struct dbt * wis_db = NULL; +static struct dbt *wis_db = NULL; static int wis_dellist[WISDELLIST_MAX], wis_delnum; //-------------------------------------------------------- // Save account_reg to sql (type=2) -int inter_accreg_tosql(int account_id,struct accreg *reg){ - - int j; - char temp_str[32]; - if (account_id<=0) return 0; - reg->account_id=account_id; - - //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`) - sprintf(tmp_sql,"DELETE FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, account_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle) ); - } - - if (reg->reg_num<=0) return 0; - - for(j=0;j<reg->reg_num;j++){ - if(reg->reg[j].str != NULL){ - sprintf(tmp_sql,"INSERT INTO `%s` (`type`, `account_id`, `str`, `value`) VALUES (2,'%d', '%s','%d')", - reg_db, reg->account_id, jstrescapecpy(temp_str,reg->reg[j].str), reg->reg[j].value); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (insert `global_reg_value`)- %s\n", mysql_error(&mysql_handle) ); - } - } - } - return 0; +int inter_accreg_tosql (int account_id, struct accreg *reg) +{ + + int j; + char temp_str[32]; + if (account_id <= 0) + return 0; + reg->account_id = account_id; + + //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`) + sprintf (tmp_sql, "DELETE FROM `%s` WHERE `type`=2 AND `account_id`='%d'", + reg_db, account_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `global_reg_value`)- %s\n", + mysql_error (&mysql_handle)); + } + + if (reg->reg_num <= 0) + return 0; + + for (j = 0; j < reg->reg_num; j++) + { + if (reg->reg[j].str != NULL) + { + sprintf (tmp_sql, + "INSERT INTO `%s` (`type`, `account_id`, `str`, `value`) VALUES (2,'%d', '%s','%d')", + reg_db, reg->account_id, jstrescapecpy (temp_str, + reg->reg[j].str), + reg->reg[j].value); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `global_reg_value`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + return 0; } // Load account_reg from sql (type=2) -int inter_accreg_fromsql(int account_id,struct accreg *reg) +int inter_accreg_fromsql (int account_id, struct accreg *reg) { - int j=0; - if (reg==NULL) return 0; - memset(reg, 0, sizeof(struct accreg)); - reg->account_id=account_id; - - //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`) - sprintf (tmp_sql, "SELECT `str`, `value` FROM `%s` WHERE `type`=2 AND `account_id`='%d'",reg_db, reg->account_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (select `global_reg_value`)- %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle); - - if (sql_res) { - for(j=0;(sql_row = mysql_fetch_row(sql_res));j++){ - memcpy(reg->reg[j].str, sql_row[0],32); - reg->reg[j].value = atoi(sql_row[1]); - } - mysql_free_result(sql_res); - } - reg->reg_num=j; - return 0; + int j = 0; + if (reg == NULL) + return 0; + memset (reg, 0, sizeof (struct accreg)); + reg->account_id = account_id; + + //`global_reg_value` (`type`, `account_id`, `char_id`, `str`, `value`) + sprintf (tmp_sql, + "SELECT `str`, `value` FROM `%s` WHERE `type`=2 AND `account_id`='%d'", + reg_db, reg->account_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (select `global_reg_value`)- %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + + if (sql_res) + { + for (j = 0; (sql_row = mysql_fetch_row (sql_res)); j++) + { + memcpy (reg->reg[j].str, sql_row[0], 32); + reg->reg[j].value = atoi (sql_row[1]); + } + mysql_free_result (sql_res); + } + reg->reg_num = j; + return 0; } // Initialize -int inter_accreg_sql_init() +int inter_accreg_sql_init () { - CREATE(accreg_pt, struct accreg, 1); - return 0; - + CREATE (accreg_pt, struct accreg, 1); + return 0; + } /*========================================== * read config file *------------------------------------------ */ -int inter_config_read(const char *cfgName) { - printf ("start reading interserver configuration: %s\n",cfgName); - int i; - char line[1024], w1[1024], w2[1024]; - FILE *fp; - - fp=fopen_(cfgName,"r"); - if(fp==NULL){ - printf("file not found: %s\n", cfgName); - return 1; - } - while(fgets(line, 1020, fp)){ - i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2); - if(i!=2) - continue; - - if(strcmpi(w1,"char_server_ip")==0){ - strcpy(char_server_ip, w2); - printf ("set char_server_ip : %s\n",w2); - } - else if(strcmpi(w1,"char_server_port")==0){ - char_server_port=atoi(w2); - printf ("set char_server_port : %s\n",w2); - } - else if(strcmpi(w1,"char_server_id")==0){ - strcpy(char_server_id, w2); - printf ("set char_server_id : %s\n",w2); - } - else if(strcmpi(w1,"char_server_pw")==0){ - strcpy(char_server_pw, w2); - printf ("set char_server_pw : %s\n",w2); - } - else if(strcmpi(w1,"char_server_db")==0){ - strcpy(char_server_db, w2); - printf ("set char_server_db : %s\n",w2); - } - //Logins information to be read from the inter_athena.conf - //for character deletion (checks email in the loginDB) - - else if(strcmpi(w1,"login_server_ip")==0){ - strcpy(login_server_ip, w2); - printf ("set login_server_ip : %s\n",w2); - } - else if(strcmpi(w1,"login_server_port")==0){ - login_server_port=atoi(w2); - printf ("set login_server_port : %s\n",w2); - } - else if(strcmpi(w1,"login_server_id")==0){ - strcpy(login_server_id, w2); - printf ("set login_server_id : %s\n",w2); - } - else if(strcmpi(w1,"login_server_pw")==0){ - strcpy(login_server_pw, w2); - printf ("set login_server_pw : %s\n",w2); - } - else if(strcmpi(w1,"login_server_db")==0){ - strcpy(login_server_db, w2); - printf ("set login_server_db : %s\n",w2); - } - else if(strcmpi(w1,"party_share_level")==0){ - party_share_level=atoi(w2); - if(party_share_level < 0) party_share_level = 0; - }else if(strcmpi(w1,"import")==0){ - inter_config_read(w2); - } - else if(strcmpi(w1,"login_server_db")==0){ - strcpy(login_server_db, w2); - printf ("set login_server_db : %s\n",w2); - } - } - fclose_(fp); - - printf ("success reading interserver configuration\n"); - - return 0; +int inter_config_read (const char *cfgName) +{ + printf ("start reading interserver configuration: %s\n", cfgName); + int i; + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + fp = fopen_ (cfgName, "r"); + if (fp == NULL) + { + printf ("file not found: %s\n", cfgName); + return 1; + } + while (fgets (line, 1020, fp)) + { + i = sscanf (line, "%[^:]: %[^\r\n]", w1, w2); + if (i != 2) + continue; + + if (strcmpi (w1, "char_server_ip") == 0) + { + strcpy (char_server_ip, w2); + printf ("set char_server_ip : %s\n", w2); + } + else if (strcmpi (w1, "char_server_port") == 0) + { + char_server_port = atoi (w2); + printf ("set char_server_port : %s\n", w2); + } + else if (strcmpi (w1, "char_server_id") == 0) + { + strcpy (char_server_id, w2); + printf ("set char_server_id : %s\n", w2); + } + else if (strcmpi (w1, "char_server_pw") == 0) + { + strcpy (char_server_pw, w2); + printf ("set char_server_pw : %s\n", w2); + } + else if (strcmpi (w1, "char_server_db") == 0) + { + strcpy (char_server_db, w2); + printf ("set char_server_db : %s\n", w2); + } + //Logins information to be read from the inter_athena.conf + //for character deletion (checks email in the loginDB) + + else if (strcmpi (w1, "login_server_ip") == 0) + { + strcpy (login_server_ip, w2); + printf ("set login_server_ip : %s\n", w2); + } + else if (strcmpi (w1, "login_server_port") == 0) + { + login_server_port = atoi (w2); + printf ("set login_server_port : %s\n", w2); + } + else if (strcmpi (w1, "login_server_id") == 0) + { + strcpy (login_server_id, w2); + printf ("set login_server_id : %s\n", w2); + } + else if (strcmpi (w1, "login_server_pw") == 0) + { + strcpy (login_server_pw, w2); + printf ("set login_server_pw : %s\n", w2); + } + else if (strcmpi (w1, "login_server_db") == 0) + { + strcpy (login_server_db, w2); + printf ("set login_server_db : %s\n", w2); + } + else if (strcmpi (w1, "party_share_level") == 0) + { + party_share_level = atoi (w2); + if (party_share_level < 0) + party_share_level = 0; + } + else if (strcmpi (w1, "import") == 0) + { + inter_config_read (w2); + } + else if (strcmpi (w1, "login_server_db") == 0) + { + strcpy (login_server_db, w2); + printf ("set login_server_db : %s\n", w2); + } + } + fclose_ (fp); + + printf ("success reading interserver configuration\n"); + + return 0; } // Save interlog into sql -int inter_log(char *fmt,...) +int inter_log (char *fmt, ...) { - char str[255]; - char temp_str[255]; - va_list ap; - va_start(ap,fmt); - - vsprintf(str,fmt,ap); - sprintf(tmp_sql,"INSERT INTO `%s` (`time`, `log`) VALUES (NOW(), '%s')",interlog_db, jstrescapecpy(temp_str,str)); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (insert `interlog`)- %s\n", mysql_error(&mysql_handle) ); - } - - va_end(ap); - return 0; + char str[255]; + char temp_str[255]; + va_list ap; + va_start (ap, fmt); + + vsprintf (str, fmt, ap); + sprintf (tmp_sql, + "INSERT INTO `%s` (`time`, `log`) VALUES (NOW(), '%s')", + interlog_db, jstrescapecpy (temp_str, str)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `interlog`)- %s\n", + mysql_error (&mysql_handle)); + } + + va_end (ap); + return 0; } - // initialize -int inter_init(const char *file) +int inter_init (const char *file) { - //int i; - - printf ("interserver initialize...\n"); - inter_config_read(file); - - //DB connection initialized - mysql_init(&mysql_handle); - printf("Connect Character DB server.... (Character Server)\n"); - if(!mysql_real_connect(&mysql_handle, char_server_ip, char_server_id, char_server_pw, - char_server_db ,char_server_port, (char *)NULL, 0)) { - //pointer check - printf("%s\n",mysql_error(&mysql_handle)); - exit(1); - } - else { - printf ("Connect Success! (Character Server)\n"); - } - - mysql_init(&lmysql_handle); - printf("Connect Character DB server.... (login server)\n"); - if(!mysql_real_connect(&lmysql_handle, login_server_ip, login_server_id, login_server_pw, - login_server_db ,login_server_port, (char *)NULL, 0)) { - //pointer check - printf("%s\n",mysql_error(&lmysql_handle)); - exit(1); - }else { - printf ("Connect Success! (Login Server)"); - } - wis_db = numdb_init(); - inter_guild_sql_init(); - inter_storage_sql_init(); - inter_party_sql_init(); - - inter_pet_sql_init(); - inter_accreg_sql_init(); - - //printf ("interserver timer initializing : %d sec...\n",autosave_interval); - //i=add_timer_interval(gettick()+autosave_interval,inter_save_timer,0,0,autosave_interval); - - return 0; + //int i; + + printf ("interserver initialize...\n"); + inter_config_read (file); + + //DB connection initialized + mysql_init (&mysql_handle); + printf ("Connect Character DB server.... (Character Server)\n"); + if (!mysql_real_connect + (&mysql_handle, char_server_ip, char_server_id, char_server_pw, + char_server_db, char_server_port, (char *) NULL, 0)) + { + //pointer check + printf ("%s\n", mysql_error (&mysql_handle)); + exit (1); + } + else + { + printf ("Connect Success! (Character Server)\n"); + } + + mysql_init (&lmysql_handle); + printf ("Connect Character DB server.... (login server)\n"); + if (!mysql_real_connect + (&lmysql_handle, login_server_ip, login_server_id, login_server_pw, + login_server_db, login_server_port, (char *) NULL, 0)) + { + //pointer check + printf ("%s\n", mysql_error (&lmysql_handle)); + exit (1); + } + else + { + printf ("Connect Success! (Login Server)"); + } + wis_db = numdb_init (); + inter_guild_sql_init (); + inter_storage_sql_init (); + inter_party_sql_init (); + + inter_pet_sql_init (); + inter_accreg_sql_init (); + + //printf ("interserver timer initializing : %d sec...\n",autosave_interval); + //i=add_timer_interval(gettick()+autosave_interval,inter_save_timer,0,0,autosave_interval); + + return 0; } -int inter_mapif_init(int fd) { - inter_guild_mapif_init(fd); +int inter_mapif_init (int fd) +{ + inter_guild_mapif_init (fd); - return 0; + return 0; } - //-------------------------------------------------------- // GM message sending -int mapif_GMmessage(unsigned char *mes, int len) { - unsigned char buf[len]; - - WBUFW(buf, 0) = 0x3800; - WBUFW(buf, 2) = len; - memcpy(WBUFP(buf, 4), mes, len-4); - mapif_sendall(buf, len); - printf("\033[1;34m inter server: GM[len:%d] - '%s' \033[0m\n", len, mes); - return 0; +int mapif_GMmessage (unsigned char *mes, int len) +{ + unsigned char buf[len]; + + WBUFW (buf, 0) = 0x3800; + WBUFW (buf, 2) = len; + memcpy (WBUFP (buf, 4), mes, len - 4); + mapif_sendall (buf, len); + printf ("\033[1;34m inter server: GM[len:%d] - '%s' \033[0m\n", len, mes); + return 0; } // Wis sending -int mapif_wis_message(struct WisData *wd) { - unsigned char buf[56 + wd->len]; - - WBUFW(buf, 0) = 0x3801; - WBUFW(buf, 2) = 56 +wd->len; - WBUFL(buf, 4) = wd->id; - memcpy(WBUFP(buf, 8), wd->src, 24); - memcpy(WBUFP(buf,32), wd->dst, 24); - memcpy(WBUFP(buf,56), wd->msg, wd->len); - wd->count = mapif_sendall(buf,WBUFW(buf,2)); - - return 0; +int mapif_wis_message (struct WisData *wd) +{ + unsigned char buf[56 + wd->len]; + + WBUFW (buf, 0) = 0x3801; + WBUFW (buf, 2) = 56 + wd->len; + WBUFL (buf, 4) = wd->id; + memcpy (WBUFP (buf, 8), wd->src, 24); + memcpy (WBUFP (buf, 32), wd->dst, 24); + memcpy (WBUFP (buf, 56), wd->msg, wd->len); + wd->count = mapif_sendall (buf, WBUFW (buf, 2)); + + return 0; } + // Wis sending result -int mapif_wis_end(struct WisData *wd,int flag) +int mapif_wis_end (struct WisData *wd, int flag) { - unsigned char buf[27]; - - WBUFW(buf, 0)=0x3802; - memcpy(WBUFP(buf, 2),wd->src,24); - WBUFB(buf,26)=flag; - mapif_send(wd->fd,buf,27); -// printf("inter server wis_end %d\n",flag); - return 0; + unsigned char buf[27]; + + WBUFW (buf, 0) = 0x3802; + memcpy (WBUFP (buf, 2), wd->src, 24); + WBUFB (buf, 26) = flag; + mapif_send (wd->fd, buf, 27); +// printf("inter server wis_end %d\n",flag); + return 0; } -int mapif_account_reg(int fd,unsigned char *src) +int mapif_account_reg (int fd, unsigned char *src) { - unsigned char buf[WBUFW(src,2)]; - memcpy(WBUFP(buf,0),src,WBUFW(src,2)); - WBUFW(buf, 0)=0x3804; - mapif_sendallwos(fd,buf,WBUFW(buf,2)); - return 0; + unsigned char buf[WBUFW (src, 2)]; + memcpy (WBUFP (buf, 0), src, WBUFW (src, 2)); + WBUFW (buf, 0) = 0x3804; + mapif_sendallwos (fd, buf, WBUFW (buf, 2)); + return 0; } // Send the requested account_reg -int mapif_account_reg_reply(int fd,int account_id) +int mapif_account_reg_reply (int fd, int account_id) { - struct accreg *reg=accreg_pt; - inter_accreg_fromsql(account_id,reg); - - WFIFOW(fd,0)=0x3804; - WFIFOL(fd,4)=account_id; - if(reg->reg_num==0){ - WFIFOW(fd,2)=8; - }else{ - int j,p; - for(j=0,p=8;j<reg->reg_num;j++,p+=36){ - memcpy(WFIFOP(fd,p),reg->reg[j].str,32); - WFIFOL(fd,p+32)=reg->reg[j].value; - } - WFIFOW(fd,2)=p; - } - WFIFOSET(fd,WFIFOW(fd,2)); - return 0; + struct accreg *reg = accreg_pt; + inter_accreg_fromsql (account_id, reg); + + WFIFOW (fd, 0) = 0x3804; + WFIFOL (fd, 4) = account_id; + if (reg->reg_num == 0) + { + WFIFOW (fd, 2) = 8; + } + else + { + int j, p; + for (j = 0, p = 8; j < reg->reg_num; j++, p += 36) + { + memcpy (WFIFOP (fd, p), reg->reg[j].str, 32); + WFIFOL (fd, p + 32) = reg->reg[j].value; + } + WFIFOW (fd, 2) = p; + } + WFIFOSET (fd, WFIFOW (fd, 2)); + return 0; } //-------------------------------------------------------- // Existence check of WISP data -int check_ttl_wisdata_sub(void *key, void *data, va_list ap) { - unsigned long tick; - struct WisData *wd = (struct WisData *)data; - tick = va_arg(ap, unsigned long); +int check_ttl_wisdata_sub (void *key, void *data, va_list ap) +{ + unsigned long tick; + struct WisData *wd = (struct WisData *) data; + tick = va_arg (ap, unsigned long); - if (DIFF_TICK(tick, wd->tick) > WISDATA_TTL && wis_delnum < WISDELLIST_MAX) - wis_dellist[wis_delnum++] = wd->id; + if (DIFF_TICK (tick, wd->tick) > WISDATA_TTL + && wis_delnum < WISDELLIST_MAX) + wis_dellist[wis_delnum++] = wd->id; - return 0; + return 0; } -int check_ttl_wisdata() { - unsigned long tick = gettick(); - int i; - - do { - wis_delnum = 0; - numdb_foreach(wis_db, check_ttl_wisdata_sub, tick); - for(i = 0; i < wis_delnum; i++) { - struct WisData *wd = numdb_search(wis_db, wis_dellist[i]); - printf("inter: wis data id=%d time out : from %s to %s\n", wd->id, wd->src, wd->dst); - // removed. not send information after a timeout. Just no answer for the player - //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - numdb_erase(wis_db, wd->id); - free(wd); - } - } while(wis_delnum >= WISDELLIST_MAX); - - return 0; +int check_ttl_wisdata () +{ + unsigned long tick = gettick (); + int i; + + do + { + wis_delnum = 0; + numdb_foreach (wis_db, check_ttl_wisdata_sub, tick); + for (i = 0; i < wis_delnum; i++) + { + struct WisData *wd = numdb_search (wis_db, wis_dellist[i]); + printf ("inter: wis data id=%d time out : from %s to %s\n", + wd->id, wd->src, wd->dst); + // removed. not send information after a timeout. Just no answer for the player + //mapif_wis_end(wd, 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + numdb_erase (wis_db, wd->id); + free (wd); + } + } + while (wis_delnum >= WISDELLIST_MAX); + + return 0; } //-------------------------------------------------------- // GM message sending -int mapif_parse_GMmessage(int fd) +int mapif_parse_GMmessage (int fd) { - mapif_GMmessage(RFIFOP(fd, 4), RFIFOW(fd, 2)); - return 0; + mapif_GMmessage (RFIFOP (fd, 4), RFIFOW (fd, 2)); + return 0; } - // Wisp/page request to send -int mapif_parse_WisRequest(int fd) { - struct WisData* wd; - static int wisid = 0; - - if (RFIFOW(fd,2)-52 >= sizeof(wd->msg)) { - printf("inter: Wis message size too long.\n"); - return 0; - } else if (RFIFOW(fd,2)-52 <= 0) { // normaly, impossible, but who knows... - printf("inter: Wis message doesn't exist.\n"); - return 0; - } - sprintf (tmp_sql, "SELECT `name` FROM `%s` WHERE `char_id`='%d'",char_db, (int) RFIFOP(fd,28)); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle); - - // search if character exists before to ask all map-servers - if (!(sql_row = mysql_fetch_row(sql_res))) { - unsigned char buf[27]; - WBUFW(buf, 0) = 0x3802; - memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24); - WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - mapif_send(fd, buf, 27); - // Character exists. So, ask all map-servers - } else { - // to be sure of the correct name, rewrite it - memset(RFIFOP(fd,28), 0, 24); - strncpy(RFIFOP(fd,28), sql_row[0], 24); - // if source is destination, don't ask other servers. - if (strcmp(RFIFOP(fd,4),RFIFOP(fd,28)) == 0) { - unsigned char buf[27]; - WBUFW(buf, 0) = 0x3802; - memcpy(WBUFP(buf, 2), RFIFOP(fd, 4), 24); - WBUFB(buf,26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - mapif_send(fd, buf, 27); - } else { - - CREATE(wd, struct WisData, 1); - - // Whether the failure of previous wisp/page transmission (timeout) - check_ttl_wisdata(); - - wd->id = ++wisid; - wd->fd = fd; - wd->len= RFIFOW(fd,2)-52; - memcpy(wd->src, RFIFOP(fd, 4), 24); - memcpy(wd->dst, RFIFOP(fd,28), 24); - memcpy(wd->msg, RFIFOP(fd,52), wd->len); - wd->tick = gettick(); - numdb_insert(wis_db, wd->id, wd); - mapif_wis_message(wd); - } - } - - return 0; +int mapif_parse_WisRequest (int fd) +{ + struct WisData *wd; + static int wisid = 0; + + if (RFIFOW (fd, 2) - 52 >= sizeof (wd->msg)) + { + printf ("inter: Wis message size too long.\n"); + return 0; + } + else if (RFIFOW (fd, 2) - 52 <= 0) + { // normaly, impossible, but who knows... + printf ("inter: Wis message doesn't exist.\n"); + return 0; + } + sprintf (tmp_sql, "SELECT `name` FROM `%s` WHERE `char_id`='%d'", char_db, + (int) RFIFOP (fd, 28)); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + + // search if character exists before to ask all map-servers + if (!(sql_row = mysql_fetch_row (sql_res))) + { + unsigned char buf[27]; + WBUFW (buf, 0) = 0x3802; + memcpy (WBUFP (buf, 2), RFIFOP (fd, 4), 24); + WBUFB (buf, 26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + mapif_send (fd, buf, 27); + // Character exists. So, ask all map-servers + } + else + { + // to be sure of the correct name, rewrite it + memset (RFIFOP (fd, 28), 0, 24); + strncpy (RFIFOP (fd, 28), sql_row[0], 24); + // if source is destination, don't ask other servers. + if (strcmp (RFIFOP (fd, 4), RFIFOP (fd, 28)) == 0) + { + unsigned char buf[27]; + WBUFW (buf, 0) = 0x3802; + memcpy (WBUFP (buf, 2), RFIFOP (fd, 4), 24); + WBUFB (buf, 26) = 1; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + mapif_send (fd, buf, 27); + } + else + { + + CREATE (wd, struct WisData, 1); + + // Whether the failure of previous wisp/page transmission (timeout) + check_ttl_wisdata (); + + wd->id = ++wisid; + wd->fd = fd; + wd->len = RFIFOW (fd, 2) - 52; + memcpy (wd->src, RFIFOP (fd, 4), 24); + memcpy (wd->dst, RFIFOP (fd, 28), 24); + memcpy (wd->msg, RFIFOP (fd, 52), wd->len); + wd->tick = gettick (); + numdb_insert (wis_db, wd->id, wd); + mapif_wis_message (wd); + } + } + + return 0; } - // Wisp/page transmission result -int mapif_parse_WisReply(int fd) { - int id = RFIFOL(fd,2), flag = RFIFOB(fd,6); - struct WisData *wd = numdb_search(wis_db, id); +int mapif_parse_WisReply (int fd) +{ + int id = RFIFOL (fd, 2), flag = RFIFOB (fd, 6); + struct WisData *wd = numdb_search (wis_db, id); - if (wd == NULL) - return 0; // This wisp was probably suppress before, because it was timeout of because of target was found on another map-server + if (wd == NULL) + return 0; // This wisp was probably suppress before, because it was timeout of because of target was found on another map-server - if ((--wd->count) <= 0 || flag != 1) { - mapif_wis_end(wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - numdb_erase(wis_db, id); - free(wd); - } + if ((--wd->count) <= 0 || flag != 1) + { + mapif_wis_end (wd, flag); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + numdb_erase (wis_db, id); + free (wd); + } - return 0; + return 0; } - // Save account_reg into sql (type=2) -int mapif_parse_AccReg(int fd) +int mapif_parse_AccReg (int fd) { - int j,p; - struct accreg *reg=accreg_pt; - int account_id = RFIFOL(fd,4); - memset(accreg_pt,0,sizeof(struct accreg)); - - for(j=0,p=8;j<ACCOUNT_REG_NUM && p<RFIFOW(fd,2);j++,p+=36){ - memcpy(reg->reg[j].str,RFIFOP(fd,p),32); - reg->reg[j].value=RFIFOL(fd,p+32); - } - reg->reg_num=j; - - inter_accreg_tosql(account_id,reg); - mapif_account_reg(fd,RFIFOP(fd,0)); // Send confirm message to map - return 0; + int j, p; + struct accreg *reg = accreg_pt; + int account_id = RFIFOL (fd, 4); + memset (accreg_pt, 0, sizeof (struct accreg)); + + for (j = 0, p = 8; j < ACCOUNT_REG_NUM && p < RFIFOW (fd, 2); + j++, p += 36) + { + memcpy (reg->reg[j].str, RFIFOP (fd, p), 32); + reg->reg[j].value = RFIFOL (fd, p + 32); + } + reg->reg_num = j; + + inter_accreg_tosql (account_id, reg); + mapif_account_reg (fd, RFIFOP (fd, 0)); // Send confirm message to map + return 0; } // Request the value of account_reg -int mapif_parse_AccRegRequest(int fd) +int mapif_parse_AccRegRequest (int fd) { -// printf("mapif: accreg request\n"); - return mapif_account_reg_reply(fd,RFIFOL(fd,2)); +// printf("mapif: accreg request\n"); + return mapif_account_reg_reply (fd, RFIFOL (fd, 2)); } - - //-------------------------------------------------------- -int inter_parse_frommap(int fd) +int inter_parse_frommap (int fd) { - int cmd=RFIFOW(fd,0); - int len=0; - - // inter鯖管轄かを調べる - if(cmd<0x3000 || cmd>=0x3000+( sizeof(inter_recv_packet_length)/ - sizeof(inter_recv_packet_length[0]) ) ) - return 0; - - // パケット長を調べる - if( (len=inter_check_length(fd,inter_recv_packet_length[cmd-0x3000]))==0 ) - return 2; - - switch(cmd){ - case 0x3000: mapif_parse_GMmessage(fd); break; - case 0x3001: mapif_parse_WisRequest(fd); break; - case 0x3002: mapif_parse_WisReply(fd); break; - case 0x3004: mapif_parse_AccReg(fd); break; - case 0x3005: mapif_parse_AccRegRequest(fd); break; - default: - if( inter_party_parse_frommap(fd) ) - break; - if( inter_guild_parse_frommap(fd) ) - break; - if( inter_storage_parse_frommap(fd) ) - break; - if( inter_pet_parse_frommap(fd) ) - break; - return 0; - } - RFIFOSKIP(fd, len ); - return 1; + int cmd = RFIFOW (fd, 0); + int len = 0; + + // inter鯖管轄かを調べる + if (cmd < 0x3000 || cmd >= 0x3000 + (sizeof (inter_recv_packet_length) / + sizeof (inter_recv_packet_length + [0]))) + return 0; + + // パケット長を調べる + if ((len = + inter_check_length (fd, + inter_recv_packet_length[cmd - 0x3000])) == 0) + return 2; + + switch (cmd) + { + case 0x3000: + mapif_parse_GMmessage (fd); + break; + case 0x3001: + mapif_parse_WisRequest (fd); + break; + case 0x3002: + mapif_parse_WisReply (fd); + break; + case 0x3004: + mapif_parse_AccReg (fd); + break; + case 0x3005: + mapif_parse_AccRegRequest (fd); + break; + default: + if (inter_party_parse_frommap (fd)) + break; + if (inter_guild_parse_frommap (fd)) + break; + if (inter_storage_parse_frommap (fd)) + break; + if (inter_pet_parse_frommap (fd)) + break; + return 0; + } + RFIFOSKIP (fd, len); + return 1; } // RFIFO check -int inter_check_length(int fd, int length) +int inter_check_length (int fd, int length) { - if(length==-1){ // v-len packet - if(RFIFOREST(fd)<4) // packet not yet - return 0; - length = RFIFOW(fd, 2); - } - - if(RFIFOREST(fd)<length) // packet not yet - return 0; - - return length; + if (length == -1) + { // v-len packet + if (RFIFOREST (fd) < 4) // packet not yet + return 0; + length = RFIFOW (fd, 2); + } + + if (RFIFOREST (fd) < length) // packet not yet + return 0; + + return length; } diff --git a/src/char_sql/inter.h b/src/char_sql/inter.h index 841d534..3a31f4b 100644 --- a/src/char_sql/inter.h +++ b/src/char_sql/inter.h @@ -1,14 +1,13 @@ #ifndef _INTER_H_ #define _INTER_H_ -int inter_init(const char *file); -int inter_parse_frommap(int fd); -int inter_mapif_init(int fd); +int inter_init (const char *file); +int inter_parse_frommap (int fd); +int inter_mapif_init (int fd); +int inter_check_length (int fd, int length); -int inter_check_length(int fd,int length); - -int inter_log(char *fmt,...); +int inter_log (char *fmt, ...); #define inter_cfgName "conf/inter_athena.conf" @@ -20,14 +19,14 @@ extern char inter_log_filename[1024]; extern MYSQL mysql_handle; extern char tmp_sql[65535]; -extern MYSQL_RES* sql_res ; -extern MYSQL_ROW sql_row ; -extern int sql_cnt; +extern MYSQL_RES *sql_res; +extern MYSQL_ROW sql_row; +extern int sql_cnt; extern MYSQL lmysql_handle; extern char tmp_lsql[65535]; -extern MYSQL_RES* lsql_res ; -extern MYSQL_ROW lsql_row ; +extern MYSQL_RES *lsql_res; +extern MYSQL_ROW lsql_row; extern int char_server_port; extern char char_server_ip[32]; diff --git a/src/char_sql/itemdb.c b/src/char_sql/itemdb.c index 85c4929..3e1c22d 100644 --- a/src/char_sql/itemdb.c +++ b/src/char_sql/itemdb.c @@ -17,160 +17,172 @@ // ** ITEMDB_OVERRIDE_NAME_VERBOSE ** // 定義すると、itemdb.txtとgrfで名前が異なる場合、表示します. -//#define ITEMDB_OVERRIDE_NAME_VERBOSE 1 +//#define ITEMDB_OVERRIDE_NAME_VERBOSE 1 -char item_db_db[256]="item_db"; // added to specify item_db sql table [Valaris] +char item_db_db[256] = "item_db"; // added to specify item_db sql table [Valaris] -static struct dbt* item_db; +static struct dbt *item_db; /*========================================== * DBの検索 *------------------------------------------ */ -struct item_data* itemdb_search(int nameid) +struct item_data *itemdb_search (int nameid) { - struct item_data *id; - - id=numdb_search(item_db,nameid); - if(id) return id; - - CREATE(id, struct item_data, 1); - - numdb_insert(item_db,nameid,id); - - - if(nameid>500 && nameid<600) - id->type=0; //heal item - else if(nameid>600 && nameid<700) - id->type=2; //use item - else if((nameid>700 && nameid<1100) || - (nameid>7000 && nameid<8000)) - id->type=3; //correction - else if(nameid>=1750 && nameid<1771) - id->type=10; //arrow - else if(nameid>1100 && nameid<2000) - id->type=4; //weapon - else if((nameid>2100 && nameid<3000) || - (nameid>5000 && nameid<6000)) - id->type=5; //armor - else if(nameid>4000 && nameid<5000) - id->type=6; //card - else if(nameid>9000 && nameid<10000) - id->type=7; //egg - else if(nameid>10000) - id->type=8; //petequip - - return id; + struct item_data *id; + + id = numdb_search (item_db, nameid); + if (id) + return id; + + CREATE (id, struct item_data, 1); + + numdb_insert (item_db, nameid, id); + + if (nameid > 500 && nameid < 600) + id->type = 0; //heal item + else if (nameid > 600 && nameid < 700) + id->type = 2; //use item + else if ((nameid > 700 && nameid < 1100) || + (nameid > 7000 && nameid < 8000)) + id->type = 3; //correction + else if (nameid >= 1750 && nameid < 1771) + id->type = 10; //arrow + else if (nameid > 1100 && nameid < 2000) + id->type = 4; //weapon + else if ((nameid > 2100 && nameid < 3000) || + (nameid > 5000 && nameid < 6000)) + id->type = 5; //armor + else if (nameid > 4000 && nameid < 5000) + id->type = 6; //card + else if (nameid > 9000 && nameid < 10000) + id->type = 7; //egg + else if (nameid > 10000) + id->type = 8; //petequip + + return id; } /*========================================== * *------------------------------------------ */ -int itemdb_isequip(int nameid) +int itemdb_isequip (int nameid) { - int type=itemdb_type(nameid); - if(type==0 || type==2 || type==3 || type==6 || type==10) - return 0; - return 1; + int type = itemdb_type (nameid); + if (type == 0 || type == 2 || type == 3 || type == 6 || type == 10) + return 0; + return 1; } + /*========================================== * *------------------------------------------ */ -int itemdb_isequip2(struct item_data *data) +int itemdb_isequip2 (struct item_data *data) { - if(data) { - int type=data->type; - if(type==0 || type==2 || type==3 || type==6 || type==10) - return 0; - else - return 1; - } - return 0; + if (data) + { + int type = data->type; + if (type == 0 || type == 2 || type == 3 || type == 6 || type == 10) + return 0; + else + return 1; + } + return 0; } - - /*========================================== * アイテムデータベースの読み込み *------------------------------------------ */ -static int itemdb_readdb(void) +static int itemdb_readdb (void) { - FILE *fp; - char line[1024]; - int ln=0; - int nameid,j; - char *str[32],*p,*np; - struct item_data *id; - - fp=fopen_("db/item_db.txt","r"); - if(fp==NULL){ - printf("can't read db/item_db.txt\n"); - exit(1); - } - while(fgets(line,1020,fp)){ - if(line[0]=='/' && line[1]=='/') - continue; - memset(str,0,sizeof(str)); - for(j=0,np=p=line;j<17 && p;j++){ - str[j]=p; - p=strchr(p,','); - if(p){ *p++=0; np=p; } - } - if(str[0]==NULL) - continue; - - nameid=atoi(str[0]); - if(nameid<=0 || nameid>=20000) - continue; - ln++; - - //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Gender,Loc,wLV,eLV,View - id=itemdb_search(nameid); - memcpy(id->name,str[1],24); - memcpy(id->jname,str[2],24); - id->type=atoi(str[3]); - - } - fclose_(fp); - printf("read db/item_db.txt done (count=%d)\n",ln); - return 0; + FILE *fp; + char line[1024]; + int ln = 0; + int nameid, j; + char *str[32], *p, *np; + struct item_data *id; + + fp = fopen_ ("db/item_db.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/item_db.txt\n"); + exit (1); + } + while (fgets (line, 1020, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + memset (str, 0, sizeof (str)); + for (j = 0, np = p = line; j < 17 && p; j++) + { + str[j] = p; + p = strchr (p, ','); + if (p) + { + *p++ = 0; + np = p; + } + } + if (str[0] == NULL) + continue; + + nameid = atoi (str[0]); + if (nameid <= 0 || nameid >= 20000) + continue; + ln++; + + //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Gender,Loc,wLV,eLV,View + id = itemdb_search (nameid); + memcpy (id->name, str[1], 24); + memcpy (id->jname, str[2], 24); + id->type = atoi (str[3]); + + } + fclose_ (fp); + printf ("read db/item_db.txt done (count=%d)\n", ln); + return 0; } -static int itemdb_read_sqldb(void) // sql item_db read, shortened version of map-server item_db read [Valaris] +static int itemdb_read_sqldb (void) // sql item_db read, shortened version of map-server item_db read [Valaris] { - unsigned int nameid; // Type should be "unsigned short int", but currently isn't for compatibility with numdb_insert() - struct item_data *id; + unsigned int nameid; // Type should be "unsigned short int", but currently isn't for compatibility with numdb_insert() + struct item_data *id; - // ---------- + // ---------- - // Output query to retrieve all rows from the item database table - sprintf(tmp_sql, "SELECT * FROM `%s`", item_db_db); + // Output query to retrieve all rows from the item database table + sprintf (tmp_sql, "SELECT * FROM `%s`", item_db_db); - // Execute the query; if the query execution fails, output an error - if (mysql_query(&mysql_handle, tmp_sql)) { - printf("Database server error (executing query for %s): %s\n", item_db_db, mysql_error(&mysql_handle)); - } + // Execute the query; if the query execution fails, output an error + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("Database server error (executing query for %s): %s\n", + item_db_db, mysql_error (&mysql_handle)); + } - // Store the query result - sql_res = mysql_store_result(&mysql_handle); + // Store the query result + sql_res = mysql_store_result (&mysql_handle); - // If the storage of the query result succeeded - if (sql_res) { - // Parse each row in the query result into sql_row - while ((sql_row = mysql_fetch_row(sql_res))) { - nameid = atoi(sql_row[0]); + // If the storage of the query result succeeded + if (sql_res) + { + // Parse each row in the query result into sql_row + while ((sql_row = mysql_fetch_row (sql_res))) + { + nameid = atoi (sql_row[0]); - // If the identifier is not within the valid range, process the next row - if (nameid == 0 || nameid >= 20000) { // Should ">= 20000" be "> 20000"? - continue; - } + // If the identifier is not within the valid range, process the next row + if (nameid == 0 || nameid >= 20000) + { // Should ">= 20000" be "> 20000"? + continue; + } - // ---------- + // ---------- - // Insert a new row into the item database + // Insert a new row into the item database /* id = calloc(sizeof(struct item_data), 1); @@ -184,64 +196,70 @@ static int itemdb_read_sqldb(void) // sql item_db read, shortened version of map // ---------- */ - id=itemdb_search(nameid); - - memcpy(id->name, sql_row[1], 24); - memcpy(id->jname, sql_row[2], 24); - - id->type = atoi(sql_row[3]); - } - - // If the retrieval failed, output an error - if (mysql_errno(&mysql_handle)) { - printf("Database server error (retrieving rows from %s): %s\n", item_db_db, mysql_error(&mysql_handle)); - } - - printf("read %s done (count = %lu)\n", item_db_db, (unsigned long) mysql_num_rows(sql_res)); - - // Free the query result - mysql_free_result(sql_res); - } else { - printf("MySQL error (storing query result for %s): %s\n", item_db_db, mysql_error(&mysql_handle)); - } - - return 0; + id = itemdb_search (nameid); + + memcpy (id->name, sql_row[1], 24); + memcpy (id->jname, sql_row[2], 24); + + id->type = atoi (sql_row[3]); + } + + // If the retrieval failed, output an error + if (mysql_errno (&mysql_handle)) + { + printf ("Database server error (retrieving rows from %s): %s\n", + item_db_db, mysql_error (&mysql_handle)); + } + + printf ("read %s done (count = %lu)\n", item_db_db, + (unsigned long) mysql_num_rows (sql_res)); + + // Free the query result + mysql_free_result (sql_res); + } + else + { + printf ("MySQL error (storing query result for %s): %s\n", item_db_db, + mysql_error (&mysql_handle)); + } + + return 0; } -static int itemdb_final(void *key,void *data,va_list ap) +static int itemdb_final (void *key, void *data, va_list ap) { - struct item_data *id; + struct item_data *id; - id=data; - if(id->use_script) - free(id->use_script); - if(id->equip_script) - free(id->equip_script); - free(id); + id = data; + if (id->use_script) + free (id->use_script); + if (id->equip_script) + free (id->equip_script); + free (id); - return 0; + return 0; } - /*========================================== * *------------------------------------------ */ -void do_final_itemdb(void) +void do_final_itemdb (void) { - if(item_db){ - numdb_final(item_db,itemdb_final); - item_db=NULL; - } + if (item_db) + { + numdb_final (item_db, itemdb_final); + item_db = NULL; + } } -int do_init_itemdb(void) + +int do_init_itemdb (void) { - item_db = numdb_init(); + item_db = numdb_init (); - if (db_use_sqldbs) // it db_use_sqldbs in inter config are yes, will read from item_db for char server display [Valaris] - itemdb_read_sqldb(); - else - itemdb_readdb(); - return 0; + if (db_use_sqldbs) // it db_use_sqldbs in inter config are yes, will read from item_db for char server display [Valaris] + itemdb_read_sqldb (); + else + itemdb_readdb (); + return 0; } - diff --git a/src/char_sql/itemdb.h b/src/char_sql/itemdb.h index dea835e..9f4274e 100644 --- a/src/char_sql/itemdb.h +++ b/src/char_sql/itemdb.h @@ -1,34 +1,35 @@ #ifndef _ITEMDB_H_ #define _ITEMDB_H_ -struct item_data { - int nameid; - char name[24],jname[24]; - int value_buy,value_sell,value_notdc,value_notoc; - int type; - int class; - int sex; - int equip; - int weight; - int atk; - int def; - int range; - int slot; - int look; - int elv; - int wlv; - char *use_script; // 回復とかも全部この中でやろうかなと - char *equip_script; // 攻撃,防御の属性設定もこの中で可能かな? - char available; +struct item_data +{ + int nameid; + char name[24], jname[24]; + int value_buy, value_sell, value_notdc, value_notoc; + int type; + int class; + int sex; + int equip; + int weight; + int atk; + int def; + int range; + int slot; + int look; + int elv; + int wlv; + char *use_script; // 回復とかも全部この中でやろうかなと + char *equip_script; // 攻撃,防御の属性設定もこの中で可能かな? + char available; }; -struct item_data* itemdb_search(int nameid); +struct item_data *itemdb_search (int nameid); #define itemdb_type(n) itemdb_search(n)->type -int itemdb_isequip(int); -int itemdb_isequip2(struct item_data *); +int itemdb_isequip (int); +int itemdb_isequip2 (struct item_data *); -void do_final_itemdb(void); -int do_init_itemdb(void); +void do_final_itemdb (void); +int do_init_itemdb (void); #endif diff --git a/src/char_sql/strlib.c b/src/char_sql/strlib.c index b113d96..02911d1 100644 --- a/src/char_sql/strlib.c +++ b/src/char_sql/strlib.c @@ -7,73 +7,83 @@ //----------------------------------------------- // string lib. -unsigned char* jstrescape (unsigned char* pt) { - //copy from here - unsigned char * ptr; - int i =0, j=0; - - //copy string to temporary - CREATE(ptr, char, J_MAX_MALLOC_SIZE); - strcpy (ptr,pt); - - while (ptr[i] != '\0') { - switch (ptr[i]) { - case '\'': - pt[j++] = '\\'; - pt[j++] = ptr[i++]; - break; - case '\\': - pt[j++] = '\\'; - pt[j++] = ptr[i++]; - break; - default: - pt[j++] = ptr[i++]; - } - } - pt[j++] = '\0'; - free (ptr); - return (unsigned char*) &pt[0]; +unsigned char *jstrescape (unsigned char *pt) +{ + //copy from here + unsigned char *ptr; + int i = 0, j = 0; + + //copy string to temporary + CREATE (ptr, char, J_MAX_MALLOC_SIZE); + strcpy (ptr, pt); + + while (ptr[i] != '\0') + { + switch (ptr[i]) + { + case '\'': + pt[j++] = '\\'; + pt[j++] = ptr[i++]; + break; + case '\\': + pt[j++] = '\\'; + pt[j++] = ptr[i++]; + break; + default: + pt[j++] = ptr[i++]; + } + } + pt[j++] = '\0'; + free (ptr); + return (unsigned char *) &pt[0]; } -unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt) { - //copy from here - int i =0, j=0; - - while (spt[i] != '\0') { - switch (spt[i]) { - case '\'': - pt[j++] = '\\'; - pt[j++] = spt[i++]; - break; - case '\\': - pt[j++] = '\\'; - pt[j++] = spt[i++]; - break; - default: - pt[j++] = spt[i++]; - } - } - pt[j++] = '\0'; - return (unsigned char*) &pt[0]; +unsigned char *jstrescapecpy (unsigned char *pt, unsigned char *spt) +{ + //copy from here + int i = 0, j = 0; + + while (spt[i] != '\0') + { + switch (spt[i]) + { + case '\'': + pt[j++] = '\\'; + pt[j++] = spt[i++]; + break; + case '\\': + pt[j++] = '\\'; + pt[j++] = spt[i++]; + break; + default: + pt[j++] = spt[i++]; + } + } + pt[j++] = '\0'; + return (unsigned char *) &pt[0]; } -int jmemescapecpy (unsigned char* pt,unsigned char* spt, int size) { - //copy from here - int i =0, j=0; - - while (i < size) { - switch (spt[i]) { - case '\'': - pt[j++] = '\\'; - pt[j++] = spt[i++]; - break; - case '\\': - pt[j++] = '\\'; - pt[j++] = spt[i++]; - break; - default: - pt[j++] = spt[i++]; - } - } - // copy size is 0 ~ (j-1) - return j; + +int jmemescapecpy (unsigned char *pt, unsigned char *spt, int size) +{ + //copy from here + int i = 0, j = 0; + + while (i < size) + { + switch (spt[i]) + { + case '\'': + pt[j++] = '\\'; + pt[j++] = spt[i++]; + break; + case '\\': + pt[j++] = '\\'; + pt[j++] = spt[i++]; + break; + default: + pt[j++] = spt[i++]; + } + } + // copy size is 0 ~ (j-1) + return j; } diff --git a/src/char_sql/strlib.h b/src/char_sql/strlib.h index 6b61690..f8da756 100644 --- a/src/char_sql/strlib.h +++ b/src/char_sql/strlib.h @@ -4,7 +4,7 @@ // String function library. // code by Jioh L. Jung (ziozzang@4wish.net) // This code is under license "BSD" -unsigned char* jstrescape (unsigned char* pt); -unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt); -int jmemescapecpy (unsigned char* pt,unsigned char* spt, int size); +unsigned char *jstrescape (unsigned char *pt); +unsigned char *jstrescapecpy (unsigned char *pt, unsigned char *spt); +int jmemescapecpy (unsigned char *pt, unsigned char *spt, int size); #endif diff --git a/src/common/core.c b/src/common/core.c index 94a754b..5956e7a 100644 --- a/src/common/core.c +++ b/src/common/core.c @@ -19,15 +19,15 @@ #include "memwatch.h" #endif -static void (*term_func)(void)=NULL; +static void (*term_func) (void) = NULL; /*====================================== * CORE : Set function *-------------------------------------- */ -void set_termfunc(void (*termfunc)(void)) +void set_termfunc (void (*termfunc) (void)) { - term_func = termfunc; + term_func = termfunc; } /*====================================== @@ -35,60 +35,63 @@ void set_termfunc(void (*termfunc)(void)) *-------------------------------------- */ -static void sig_proc(int sn) +static void sig_proc (int sn) { - int i; - switch(sn){ - case SIGINT: - case SIGTERM: - if(term_func) - term_func(); - for(i=0;i<fd_max;i++){ - if(!session[i]) - continue; - close(i); - } - exit(0); - break; - case SIGCHLD: - wait(&i); - break; - } + int i; + switch (sn) + { + case SIGINT: + case SIGTERM: + if (term_func) + term_func (); + for (i = 0; i < fd_max; i++) + { + if (!session[i]) + continue; + close (i); + } + exit (0); + break; + case SIGCHLD: + wait (&i); + break; + } } -int eathena_interactive_session = 1; // [fate] interactive session: print pretty graphics +int eathena_interactive_session = 1; // [fate] interactive session: print pretty graphics /*====================================== * CORE : Display title *-------------------------------------- */ -static void display_title(void) +static void display_title (void) { - // for help with the console colors look here: - // http://www.edoceo.com/liberum/?doc=printf-with-color - // some code explanation (used here): - // \033[2J : clear screen and go up/left (0, 0 position) - // \033[K : clear line from actual position to end of the line - // \033[0m : reset color parameter - // \033[1m : use bold for font - if (eathena_interactive_session) { - printf("\033[2J"); // clear screen and go up/left (0, 0 position in text) - printf("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n"); // white writing (37) on blue background (44), \033[K clean until end of file - printf("\033[0;44m (\033[1;33m (c)2004 eAthena Development Team presents \033[0;44m)\033[K\033[0m\n"); // yellow writing (33) - printf("\033[0;44m (\033[1m ______ __ __ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf("\033[0;44m (\033[1m /\\ _ \\/\\ \\__/\\ \\ v%2d.%02d.%02d \033[0;44m)\033[K\033[0m\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION); // 1: bold char, 0: normal char - printf("\033[0;44m (\033[1m __\\ \\ \\_\\ \\ \\ ,_\\ \\ \\___ __ ___ __ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf("\033[0;44m (\033[1m /'__`\\ \\ __ \\ \\ \\/\\ \\ _ `\\ /'__`\\/' _ `\\ /'__`\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf("\033[0;44m (\033[1m /\\ __/\\ \\ \\/\\ \\ \\ \\_\\ \\ \\ \\ \\/\\ __//\\ \\/\\ \\/\\ \\_\\.\\_ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf("\033[0;44m (\033[1m \\ \\____\\\\ \\_\\ \\_\\ \\__\\\\ \\_\\ \\_\\ \\____\\ \\_\\ \\_\\ \\__/.\\_\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf("\033[0;44m (\033[1m \\/____/ \\/_/\\/_/\\/__/ \\/_/\\/_/\\/____/\\/_/\\/_/\\/__/\\/_/ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf("\033[0;44m (\033[1m _ _ _ _ _ _ _ _ _ _ _ _ _ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf("\033[0;44m (\033[1m / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf("\033[0;44m (\033[1m ( e | n | g | l | i | s | h ) ( A | t | h | e | n | a ) \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf("\033[0;44m (\033[1m \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char - printf("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n\n"); // reset color - } + // for help with the console colors look here: + // http://www.edoceo.com/liberum/?doc=printf-with-color + // some code explanation (used here): + // \033[2J : clear screen and go up/left (0, 0 position) + // \033[K : clear line from actual position to end of the line + // \033[0m : reset color parameter + // \033[1m : use bold for font + if (eathena_interactive_session) + { + printf ("\033[2J"); // clear screen and go up/left (0, 0 position in text) + printf ("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n"); // white writing (37) on blue background (44), \033[K clean until end of file + printf ("\033[0;44m (\033[1;33m (c)2004 eAthena Development Team presents \033[0;44m)\033[K\033[0m\n"); // yellow writing (33) + printf ("\033[0;44m (\033[1m ______ __ __ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char + printf ("\033[0;44m (\033[1m /\\ _ \\/\\ \\__/\\ \\ v%2d.%02d.%02d \033[0;44m)\033[K\033[0m\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION); // 1: bold char, 0: normal char + printf ("\033[0;44m (\033[1m __\\ \\ \\_\\ \\ \\ ,_\\ \\ \\___ __ ___ __ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char + printf ("\033[0;44m (\033[1m /'__`\\ \\ __ \\ \\ \\/\\ \\ _ `\\ /'__`\\/' _ `\\ /'__`\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char + printf ("\033[0;44m (\033[1m /\\ __/\\ \\ \\/\\ \\ \\ \\_\\ \\ \\ \\ \\/\\ __//\\ \\/\\ \\/\\ \\_\\.\\_ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char + printf ("\033[0;44m (\033[1m \\ \\____\\\\ \\_\\ \\_\\ \\__\\\\ \\_\\ \\_\\ \\____\\ \\_\\ \\_\\ \\__/.\\_\\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char + printf ("\033[0;44m (\033[1m \\/____/ \\/_/\\/_/\\/__/ \\/_/\\/_/\\/____/\\/_/\\/_/\\/__/\\/_/ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char + printf ("\033[0;44m (\033[1m _ _ _ _ _ _ _ _ _ _ _ _ _ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char + printf ("\033[0;44m (\033[1m / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ / \\ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char + printf ("\033[0;44m (\033[1m ( e | n | g | l | i | s | h ) ( A | t | h | e | n | a ) \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char + printf ("\033[0;44m (\033[1m \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \\_/ \033[0;44m)\033[K\033[0m\n"); // 1: bold char, 0: normal char + printf ("\033[37;44m (=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=)\033[K\033[0m\n\n"); // reset color + } } // Added by Gabuzomeu @@ -104,62 +107,62 @@ static void display_title(void) #ifndef POSIX #define compat_signal(signo, func) signal(signo, func) #else -sigfunc *compat_signal(int signo, sigfunc *func) +sigfunc *compat_signal (int signo, sigfunc * func) { - struct sigaction sact, oact; + struct sigaction sact, oact; - sact.sa_handler = func; - sigemptyset(&sact.sa_mask); - sact.sa_flags = 0; + sact.sa_handler = func; + sigemptyset (&sact.sa_mask); + sact.sa_flags = 0; #ifdef SA_INTERRUPT - sact.sa_flags |= SA_INTERRUPT; /* SunOS */ + sact.sa_flags |= SA_INTERRUPT; /* SunOS */ #endif - if (sigaction(signo, &sact, &oact) < 0) - return (SIG_ERR); + if (sigaction (signo, &sact, &oact) < 0) + return (SIG_ERR); - return (oact.sa_handler); + return (oact.sa_handler); } #endif - /*====================================== * CORE : MAINROUTINE *-------------------------------------- */ -int runflag = 1; +int runflag = 1; -int main(int argc,char **argv) +int main (int argc, char **argv) { - int next; + int next; - mt_seed(time(NULL) ^ getpid() ^ getppid()); + mt_seed (time (NULL) ^ getpid () ^ getppid ()); - Net_Init(); - do_socket(); + Net_Init (); + do_socket (); - compat_signal(SIGPIPE,SIG_IGN); - compat_signal(SIGTERM,sig_proc); - compat_signal(SIGINT,sig_proc); - compat_signal(SIGCHLD,sig_proc); + compat_signal (SIGPIPE, SIG_IGN); + compat_signal (SIGTERM, sig_proc); + compat_signal (SIGINT, sig_proc); + compat_signal (SIGCHLD, sig_proc); - // Signal to create coredumps by system when necessary (crash) - compat_signal(SIGSEGV, SIG_DFL); + // Signal to create coredumps by system when necessary (crash) + compat_signal (SIGSEGV, SIG_DFL); #ifndef LCCWIN32 - compat_signal(SIGBUS, SIG_DFL); - compat_signal(SIGTRAP, SIG_DFL); + compat_signal (SIGBUS, SIG_DFL); + compat_signal (SIGTRAP, SIG_DFL); #endif - compat_signal(SIGILL, SIG_DFL); - // [fate] detect interactive session - eathena_interactive_session = isatty(0); - display_title(); - - do_init(argc,argv); - while(runflag){ - next=do_timer(gettick_nocache()); - do_sendrecv(next); - do_parsepacket(); - } - return 0; + compat_signal (SIGILL, SIG_DFL); + // [fate] detect interactive session + eathena_interactive_session = isatty (0); + display_title (); + + do_init (argc, argv); + while (runflag) + { + next = do_timer (gettick_nocache ()); + do_sendrecv (next); + do_parsepacket (); + } + return 0; } diff --git a/src/common/core.h b/src/common/core.h index bc2be02..90d8303 100644 --- a/src/common/core.h +++ b/src/common/core.h @@ -5,8 +5,8 @@ extern int runflag; -int do_init(int,char**); +int do_init (int, char **); -void set_termfunc(void (*termfunc)(void)); +void set_termfunc (void (*termfunc) (void)); -#endif // _CORE_H_ +#endif // _CORE_H_ diff --git a/src/common/db.c b/src/common/db.c index a2dc695..7a4fa70 100644 --- a/src/common/db.c +++ b/src/common/db.c @@ -13,488 +13,574 @@ #define ROOT_SIZE 4096 #ifdef MALLOC_DBN static struct dbn *dbn_root[512], *dbn_free; -static int dbn_root_rest=0,dbn_root_num=0; +static int dbn_root_rest = 0, dbn_root_num = 0; -static void * malloc_dbn(void) +static void *malloc_dbn (void) { - struct dbn* ret; - - if(dbn_free==NULL){ - if(dbn_root_rest<=0){ - CREATE(dbn_root[dbn_root_num], struct dbn, ROOT_SIZE); - - dbn_root_rest=ROOT_SIZE; - dbn_root_num++; - } - return &(dbn_root[dbn_root_num-1][--dbn_root_rest]); - } - ret=dbn_free; - dbn_free = dbn_free->parent; - return ret; + struct dbn *ret; + + if (dbn_free == NULL) + { + if (dbn_root_rest <= 0) + { + CREATE (dbn_root[dbn_root_num], struct dbn, ROOT_SIZE); + + dbn_root_rest = ROOT_SIZE; + dbn_root_num++; + } + return &(dbn_root[dbn_root_num - 1][--dbn_root_rest]); + } + ret = dbn_free; + dbn_free = dbn_free->parent; + return ret; } -static void free_dbn(struct dbn* add_dbn) +static void free_dbn (struct dbn *add_dbn) { - add_dbn->parent = dbn_free; - dbn_free = add_dbn; + add_dbn->parent = dbn_free; + dbn_free = add_dbn; } #endif -static int strdb_cmp(struct dbt* table,void* a,void* b) +static int strdb_cmp (struct dbt *table, void *a, void *b) { - if(table->maxlen) - return strncmp(a,b,table->maxlen); - return strcmp(a,b); + if (table->maxlen) + return strncmp (a, b, table->maxlen); + return strcmp (a, b); } -static unsigned int strdb_hash(struct dbt* table,void* a) +static unsigned int strdb_hash (struct dbt *table, void *a) { - int i; - unsigned int h; - unsigned char *p=a; - - i=table->maxlen; - if(i==0) i=0x7fffffff; - for(h=0;*p && --i>=0;){ - h=(h*33 + *p++) ^ (h>>24); - } - return h; + int i; + unsigned int h; + unsigned char *p = a; + + i = table->maxlen; + if (i == 0) + i = 0x7fffffff; + for (h = 0; *p && --i >= 0;) + { + h = (h * 33 + *p++) ^ (h >> 24); + } + return h; } -struct dbt* strdb_init(int maxlen) +struct dbt *strdb_init (int maxlen) { - int i; - struct dbt* table; + int i; + struct dbt *table; - CREATE(table, struct dbt, 1); + CREATE (table, struct dbt, 1); - table->cmp=strdb_cmp; - table->hash=strdb_hash; - table->maxlen=maxlen; - for(i=0;i<HASH_SIZE;i++) - table->ht[i]=NULL; - return table; + table->cmp = strdb_cmp; + table->hash = strdb_hash; + table->maxlen = maxlen; + for (i = 0; i < HASH_SIZE; i++) + table->ht[i] = NULL; + return table; } -static int numdb_cmp(struct dbt* table,void* a,void* b) +static int numdb_cmp (struct dbt *table, void *a, void *b) { - int ia,ib; + int ia, ib; - ia=(int)a; - ib=(int)b; + ia = (int) a; + ib = (int) b; - if((ia^ib) & 0x80000000) - return ia<0 ? -1 : 1; + if ((ia ^ ib) & 0x80000000) + return ia < 0 ? -1 : 1; - return ia-ib; + return ia - ib; } -static unsigned int numdb_hash(struct dbt* table,void* a) +static unsigned int numdb_hash (struct dbt *table, void *a) { - return (unsigned int)a; + return (unsigned int) a; } -struct dbt* numdb_init(void) +struct dbt *numdb_init (void) { - int i; - struct dbt* table; + int i; + struct dbt *table; - CREATE(table, struct dbt, 1); + CREATE (table, struct dbt, 1); - table->cmp=numdb_cmp; - table->hash=numdb_hash; - table->maxlen=sizeof(int); - for(i=0;i<HASH_SIZE;i++) - table->ht[i]=NULL; - return table; + table->cmp = numdb_cmp; + table->hash = numdb_hash; + table->maxlen = sizeof (int); + for (i = 0; i < HASH_SIZE; i++) + table->ht[i] = NULL; + return table; } -void* db_search(struct dbt *table,void* key) +void *db_search (struct dbt *table, void *key) { - struct dbn *p; - - for(p=table->ht[table->hash(table,key) % HASH_SIZE];p;){ - int c=table->cmp(table,key,p->key); - if(c==0) - return p->data; - if(c<0) - p=p->left; - else - p=p->right; - } - return NULL; + struct dbn *p; + + for (p = table->ht[table->hash (table, key) % HASH_SIZE]; p;) + { + int c = table->cmp (table, key, p->key); + if (c == 0) + return p->data; + if (c < 0) + p = p->left; + else + p = p->right; + } + return NULL; } -void * db_search2(struct dbt *table, const char *key) +void *db_search2 (struct dbt *table, const char *key) { - int i,sp; - struct dbn *p,*pn,*stack[64]; - int slen = strlen(key); - - for(i=0;i<HASH_SIZE;i++){ - if((p=table->ht[i])==NULL) - continue; - sp=0; - while(1){ - if (strncasecmp(key, p->key, slen) == 0) - return p->data; - if((pn=p->left)!=NULL){ - if(p->right){ - stack[sp++]=p->right; - } - p=pn; - } else { - if(p->right){ - p=p->right; - } else { - if(sp==0) - break; - p=stack[--sp]; - } - } - } - } - return 0; + int i, sp; + struct dbn *p, *pn, *stack[64]; + int slen = strlen (key); + + for (i = 0; i < HASH_SIZE; i++) + { + if ((p = table->ht[i]) == NULL) + continue; + sp = 0; + while (1) + { + if (strncasecmp (key, p->key, slen) == 0) + return p->data; + if ((pn = p->left) != NULL) + { + if (p->right) + { + stack[sp++] = p->right; + } + p = pn; + } + else + { + if (p->right) + { + p = p->right; + } + else + { + if (sp == 0) + break; + p = stack[--sp]; + } + } + } + } + return 0; } -static void db_rotate_left(struct dbn *p,struct dbn **root) +static void db_rotate_left (struct dbn *p, struct dbn **root) { - struct dbn * y = p->right; - p->right = y->left; - if (y->left !=0) - y->left->parent = p; - y->parent = p->parent; - - if (p == *root) - *root = y; - else if (p == p->parent->left) - p->parent->left = y; - else - p->parent->right = y; - y->left = p; - p->parent = y; + struct dbn *y = p->right; + p->right = y->left; + if (y->left != 0) + y->left->parent = p; + y->parent = p->parent; + + if (p == *root) + *root = y; + else if (p == p->parent->left) + p->parent->left = y; + else + p->parent->right = y; + y->left = p; + p->parent = y; } -static void db_rotate_right(struct dbn *p,struct dbn **root) +static void db_rotate_right (struct dbn *p, struct dbn **root) { - struct dbn * y = p->left; - p->left = y->right; - if (y->right != 0) - y->right->parent = p; - y->parent = p->parent; - - if (p == *root) - *root = y; - else if (p == p->parent->right) - p->parent->right = y; - else - p->parent->left = y; - y->right = p; - p->parent = y; + struct dbn *y = p->left; + p->left = y->right; + if (y->right != 0) + y->right->parent = p; + y->parent = p->parent; + + if (p == *root) + *root = y; + else if (p == p->parent->right) + p->parent->right = y; + else + p->parent->left = y; + y->right = p; + p->parent = y; } -static void db_rebalance(struct dbn *p,struct dbn **root) +static void db_rebalance (struct dbn *p, struct dbn **root) { - p->color = RED; - while(p!=*root && p->parent->color==RED){ // rootは必ず黒で親は赤いので親の親は必ず存在する - if (p->parent == p->parent->parent->left) { - struct dbn *y = p->parent->parent->right; - if (y && y->color == RED) { - p->parent->color = BLACK; - y->color = BLACK; - p->parent->parent->color = RED; - p = p->parent->parent; - } else { - if (p == p->parent->right) { - p = p->parent; - db_rotate_left(p, root); - } - p->parent->color = BLACK; - p->parent->parent->color = RED; - db_rotate_right(p->parent->parent, root); - } - } else { - struct dbn* y = p->parent->parent->left; - if (y && y->color == RED) { - p->parent->color = BLACK; - y->color = BLACK; - p->parent->parent->color = RED; - p = p->parent->parent; - } else { - if (p == p->parent->left) { - p = p->parent; - db_rotate_right(p, root); - } - p->parent->color = BLACK; - p->parent->parent->color = RED; - db_rotate_left(p->parent->parent, root); - } - } - } - (*root)->color=BLACK; + p->color = RED; + while (p != *root && p->parent->color == RED) + { // rootは必ず黒で親は赤いので親の親は必ず存在する + if (p->parent == p->parent->parent->left) + { + struct dbn *y = p->parent->parent->right; + if (y && y->color == RED) + { + p->parent->color = BLACK; + y->color = BLACK; + p->parent->parent->color = RED; + p = p->parent->parent; + } + else + { + if (p == p->parent->right) + { + p = p->parent; + db_rotate_left (p, root); + } + p->parent->color = BLACK; + p->parent->parent->color = RED; + db_rotate_right (p->parent->parent, root); + } + } + else + { + struct dbn *y = p->parent->parent->left; + if (y && y->color == RED) + { + p->parent->color = BLACK; + y->color = BLACK; + p->parent->parent->color = RED; + p = p->parent->parent; + } + else + { + if (p == p->parent->left) + { + p = p->parent; + db_rotate_right (p, root); + } + p->parent->color = BLACK; + p->parent->parent->color = RED; + db_rotate_left (p->parent->parent, root); + } + } + } + (*root)->color = BLACK; } -static void db_rebalance_erase(struct dbn *z,struct dbn **root) +static void db_rebalance_erase (struct dbn *z, struct dbn **root) { - struct dbn *y = z, *x = NULL, *x_parent = NULL; - - if (y->left == NULL) - x = y->right; - else if (y->right == NULL) - x = y->left; - else { - y = y->right; - while (y->left != NULL) - y = y->left; - x = y->right; - } - if (y != z) { // 左右が両方埋まっていた時 yをzの位置に持ってきてzを浮かせる - z->left->parent = y; - y->left = z->left; - if (y != z->right) { - x_parent = y->parent; - if (x) x->parent = y->parent; - y->parent->left = x; - y->right = z->right; - z->right->parent = y; - } else - x_parent = y; - if (*root == z) - *root = y; - else if (z->parent->left == z) - z->parent->left = y; - else - z->parent->right = y; - y->parent = z->parent; - { int tmp=y->color; y->color=z->color; z->color=tmp; } - y = z; - } else { // どちらか空いていた場合 xをzの位置に持ってきてzを浮かせる - x_parent = y->parent; - if (x) x->parent = y->parent; - if (*root == z) - *root = x; - else if (z->parent->left == z) - z->parent->left = x; - else - z->parent->right = x; - } - // ここまで色の移動の除いて通常の2分木と同じ - if (y->color != RED) { // 赤が消える分には影響無し - while (x != *root && (x == NULL || x->color == BLACK)) - if (x == x_parent->left) { - struct dbn* w = x_parent->right; - if (w->color == RED) { - w->color = BLACK; - x_parent->color = RED; - db_rotate_left(x_parent, root); - w = x_parent->right; - } - if ((w->left == NULL || - w->left->color == BLACK) && - (w->right == NULL || - w->right->color == BLACK)) { - w->color = RED; - x = x_parent; - x_parent = x_parent->parent; - } else { - if (w->right == NULL || - w->right->color == BLACK) { - if (w->left) w->left->color = BLACK; - w->color = RED; - db_rotate_right(w, root); - w = x_parent->right; - } - w->color = x_parent->color; - x_parent->color = BLACK; - if (w->right) w->right->color = BLACK; - db_rotate_left(x_parent, root); - break; - } - } else { // same as above, with right <-> left. - struct dbn* w = x_parent->left; - if (w->color == RED) { - w->color = BLACK; - x_parent->color = RED; - db_rotate_right(x_parent, root); - w = x_parent->left; - } - if ((w->right == NULL || - w->right->color == BLACK) && - (w->left == NULL || - w->left->color == BLACK)) { - w->color = RED; - x = x_parent; - x_parent = x_parent->parent; - } else { - if (w->left == NULL || - w->left->color == BLACK) { - if (w->right) w->right->color = BLACK; - w->color = RED; - db_rotate_left(w, root); - w = x_parent->left; - } - w->color = x_parent->color; - x_parent->color = BLACK; - if (w->left) w->left->color = BLACK; - db_rotate_right(x_parent, root); - break; - } - } - if (x) x->color = BLACK; - } + struct dbn *y = z, *x = NULL, *x_parent = NULL; + + if (y->left == NULL) + x = y->right; + else if (y->right == NULL) + x = y->left; + else + { + y = y->right; + while (y->left != NULL) + y = y->left; + x = y->right; + } + if (y != z) + { // 左右が両方埋まっていた時 yをzの位置に持ってきてzを浮かせる + z->left->parent = y; + y->left = z->left; + if (y != z->right) + { + x_parent = y->parent; + if (x) + x->parent = y->parent; + y->parent->left = x; + y->right = z->right; + z->right->parent = y; + } + else + x_parent = y; + if (*root == z) + *root = y; + else if (z->parent->left == z) + z->parent->left = y; + else + z->parent->right = y; + y->parent = z->parent; + { + int tmp = y->color; + y->color = z->color; + z->color = tmp; + } + y = z; + } + else + { // どちらか空いていた場合 xをzの位置に持ってきてzを浮かせる + x_parent = y->parent; + if (x) + x->parent = y->parent; + if (*root == z) + *root = x; + else if (z->parent->left == z) + z->parent->left = x; + else + z->parent->right = x; + } + // ここまで色の移動の除いて通常の2分木と同じ + if (y->color != RED) + { // 赤が消える分には影響無し + while (x != *root && (x == NULL || x->color == BLACK)) + if (x == x_parent->left) + { + struct dbn *w = x_parent->right; + if (w->color == RED) + { + w->color = BLACK; + x_parent->color = RED; + db_rotate_left (x_parent, root); + w = x_parent->right; + } + if ((w->left == NULL || + w->left->color == BLACK) && + (w->right == NULL || w->right->color == BLACK)) + { + w->color = RED; + x = x_parent; + x_parent = x_parent->parent; + } + else + { + if (w->right == NULL || w->right->color == BLACK) + { + if (w->left) + w->left->color = BLACK; + w->color = RED; + db_rotate_right (w, root); + w = x_parent->right; + } + w->color = x_parent->color; + x_parent->color = BLACK; + if (w->right) + w->right->color = BLACK; + db_rotate_left (x_parent, root); + break; + } + } + else + { // same as above, with right <-> left. + struct dbn *w = x_parent->left; + if (w->color == RED) + { + w->color = BLACK; + x_parent->color = RED; + db_rotate_right (x_parent, root); + w = x_parent->left; + } + if ((w->right == NULL || + w->right->color == BLACK) && + (w->left == NULL || w->left->color == BLACK)) + { + w->color = RED; + x = x_parent; + x_parent = x_parent->parent; + } + else + { + if (w->left == NULL || w->left->color == BLACK) + { + if (w->right) + w->right->color = BLACK; + w->color = RED; + db_rotate_left (w, root); + w = x_parent->left; + } + w->color = x_parent->color; + x_parent->color = BLACK; + if (w->left) + w->left->color = BLACK; + db_rotate_right (x_parent, root); + break; + } + } + if (x) + x->color = BLACK; + } } -struct dbn* db_insert(struct dbt *table,void* key,void* data) +struct dbn *db_insert (struct dbt *table, void *key, void *data) { - struct dbn *p,*priv; - int c,hash; - - hash = table->hash(table,key) % HASH_SIZE; - for(c=0,priv=NULL ,p = table->ht[hash];p;){ - c=table->cmp(table,key,p->key); - if(c==0){ // replace - if (table->release) - table->release(p, 3); - p->data=data; - p->key=key; - return p; - } - priv=p; - if(c<0){ - p=p->left; - } else { - p=p->right; - } - } + struct dbn *p, *priv; + int c, hash; + + hash = table->hash (table, key) % HASH_SIZE; + for (c = 0, priv = NULL, p = table->ht[hash]; p;) + { + c = table->cmp (table, key, p->key); + if (c == 0) + { // replace + if (table->release) + table->release (p, 3); + p->data = data; + p->key = key; + return p; + } + priv = p; + if (c < 0) + { + p = p->left; + } + else + { + p = p->right; + } + } #ifdef MALLOC_DBN - p=malloc_dbn(); + p = malloc_dbn (); #else - CREATE(p, struct dbn, 1); + CREATE (p, struct dbn, 1); #endif - if(p==NULL){ - printf("out of memory : db_insert\n"); - return NULL; - } - p->parent= NULL; - p->left = NULL; - p->right = NULL; - p->key = key; - p->data = data; - p->color = RED; - if(c==0){ // hash entry is empty - table->ht[hash] = p; - p->color = BLACK; - } else { - if(c<0){ // left node - priv->left = p; - p->parent=priv; - } else { // right node - priv->right = p; - p->parent=priv; - } - if(priv->color==RED){ // must rebalance - db_rebalance(p,&table->ht[hash]); - } - } - return p; + if (p == NULL) + { + printf ("out of memory : db_insert\n"); + return NULL; + } + p->parent = NULL; + p->left = NULL; + p->right = NULL; + p->key = key; + p->data = data; + p->color = RED; + if (c == 0) + { // hash entry is empty + table->ht[hash] = p; + p->color = BLACK; + } + else + { + if (c < 0) + { // left node + priv->left = p; + p->parent = priv; + } + else + { // right node + priv->right = p; + p->parent = priv; + } + if (priv->color == RED) + { // must rebalance + db_rebalance (p, &table->ht[hash]); + } + } + return p; } -void* db_erase(struct dbt *table,void* key) +void *db_erase (struct dbt *table, void *key) { - void *data; - struct dbn *p; - int c,hash; - - hash = table->hash(table,key) % HASH_SIZE; - for(c=0,p = table->ht[hash];p;){ - c=table->cmp(table,key,p->key); - if(c==0) - break; - if(c<0) - p=p->left; - else - p=p->right; - } - if(!p) - return NULL; - data=p->data; - db_rebalance_erase(p,&table->ht[hash]); + void *data; + struct dbn *p; + int c, hash; + + hash = table->hash (table, key) % HASH_SIZE; + for (c = 0, p = table->ht[hash]; p;) + { + c = table->cmp (table, key, p->key); + if (c == 0) + break; + if (c < 0) + p = p->left; + else + p = p->right; + } + if (!p) + return NULL; + data = p->data; + db_rebalance_erase (p, &table->ht[hash]); #ifdef MALLOC_DBN - free_dbn(p); + free_dbn (p); #else - free(p); + free (p); #endif - return data; + return data; } -void db_foreach(struct dbt *table,int (*func)(void*,void*,va_list),...) +void db_foreach (struct dbt *table, int (*func) (void *, void *, va_list), + ...) { - int i,sp; - // red-black treeなので64個stackがあれば2^32個ノードまで大丈夫 - struct dbn *p,*pn,*stack[64]; - va_list ap; - - va_start(ap,func); - for(i=0;i<HASH_SIZE;i++){ - if((p=table->ht[i])==NULL) - continue; - sp=0; - while(1){ - func(p->key,p->data,ap); - if((pn=p->left)!=NULL){ - if(p->right){ - stack[sp++]=p->right; - } - p=pn; - } else { - if(p->right){ - p=p->right; - } else { - if(sp==0) - break; - p=stack[--sp]; - } - } - } - } - va_end(ap); + int i, sp; + // red-black treeなので64個stackがあれば2^32個ノードまで大丈夫 + struct dbn *p, *pn, *stack[64]; + va_list ap; + + va_start (ap, func); + for (i = 0; i < HASH_SIZE; i++) + { + if ((p = table->ht[i]) == NULL) + continue; + sp = 0; + while (1) + { + func (p->key, p->data, ap); + if ((pn = p->left) != NULL) + { + if (p->right) + { + stack[sp++] = p->right; + } + p = pn; + } + else + { + if (p->right) + { + p = p->right; + } + else + { + if (sp == 0) + break; + p = stack[--sp]; + } + } + } + } + va_end (ap); } -void db_final(struct dbt *table,int (*func)(void*,void*,va_list),...) +void db_final (struct dbt *table, int (*func) (void *, void *, va_list), ...) { - int i,sp; - struct dbn *p,*pn,*stack[64]; - va_list ap; - - va_start(ap,func); - for(i=0;i<HASH_SIZE;i++){ - if((p=table->ht[i])==NULL) - continue; - sp=0; - while(1){ - if(func) - func(p->key,p->data,ap); - if((pn=p->left)!=NULL){ - if(p->right){ - stack[sp++]=p->right; - } - } else { - if(p->right){ - pn=p->right; - } else { - if(sp==0) - break; - pn=stack[--sp]; - } - } + int i, sp; + struct dbn *p, *pn, *stack[64]; + va_list ap; + + va_start (ap, func); + for (i = 0; i < HASH_SIZE; i++) + { + if ((p = table->ht[i]) == NULL) + continue; + sp = 0; + while (1) + { + if (func) + func (p->key, p->data, ap); + if ((pn = p->left) != NULL) + { + if (p->right) + { + stack[sp++] = p->right; + } + } + else + { + if (p->right) + { + pn = p->right; + } + else + { + if (sp == 0) + break; + pn = stack[--sp]; + } + } #ifdef MALLOC_DBN - free_dbn(p); + free_dbn (p); #else - free(p); + free (p); #endif - p=pn; - } - } - free(table); - va_end(ap); + p = pn; + } + } + free (table); + va_end (ap); } diff --git a/src/common/db.h b/src/common/db.h index ea9acea..8de32d5 100644 --- a/src/common/db.h +++ b/src/common/db.h @@ -8,20 +8,22 @@ #define RED 0 #define BLACK 1 -struct dbn { - struct dbn *parent,*left,*right; - int color; - void *key; - void *data; +struct dbn +{ + struct dbn *parent, *left, *right; + int color; + void *key; + void *data; }; -struct dbt { - int (*cmp)(struct dbt*,void*,void*); - unsigned int (*hash)(struct dbt*,void*); +struct dbt +{ + int (*cmp) (struct dbt *, void *, void *); + unsigned int (*hash) (struct dbt *, void *); // which 1 - key, 2 - data, 3 - both - void (*release)(struct dbn*,int which); - int maxlen; - struct dbn *ht[HASH_SIZE]; + void (*release) (struct dbn *, int which); + int maxlen; + struct dbn *ht[HASH_SIZE]; }; #define strdb_search(t,k) db_search((t),(void*)(k)) @@ -35,13 +37,13 @@ struct dbt { #define numdb_foreach db_foreach #define numdb_final db_final -struct dbt* strdb_init(int maxlen); -struct dbt* numdb_init(void); -void* db_search(struct dbt *table,void* key); -void* db_search2(struct dbt *table, const char *key); // [MouseJstr] -struct dbn* db_insert(struct dbt *table,void* key,void* data); -void* db_erase(struct dbt *table,void* key); -void db_foreach(struct dbt*,int(*)(void*,void*,va_list),...); -void db_final(struct dbt*,int(*)(void*,void*,va_list),...); +struct dbt *strdb_init (int maxlen); +struct dbt *numdb_init (void); +void *db_search (struct dbt *table, void *key); +void *db_search2 (struct dbt *table, const char *key); // [MouseJstr] +struct dbn *db_insert (struct dbt *table, void *key, void *data); +void *db_erase (struct dbt *table, void *key); +void db_foreach (struct dbt *, int (*)(void *, void *, va_list), ...); +void db_final (struct dbt *, int (*)(void *, void *, va_list), ...); #endif diff --git a/src/common/grfio.c b/src/common/grfio.c index b5f380c..4795d5b 100644 --- a/src/common/grfio.c +++ b/src/common/grfio.c @@ -36,33 +36,48 @@ #include "memwatch.h" #endif -typedef unsigned char BYTE; -typedef unsigned short WORD; -typedef unsigned long DWORD; +typedef unsigned char BYTE; +typedef unsigned short WORD; +typedef unsigned long DWORD; -static char data_file[1024] = ""; // "data.grf"; -static char sdata_file[1024] = ""; // "sdata.grf"; -static char adata_file[1024] = ""; // "adata.grf"; -static char data_dir[1024] = ""; // "../"; +static char data_file[1024] = ""; // "data.grf"; +static char sdata_file[1024] = ""; // "sdata.grf"; +static char adata_file[1024] = ""; // "adata.grf"; +static char data_dir[1024] = ""; // "../"; // accessor to data_file,adata_file,sdata_file -char *grfio_setdatafile(const char *str){ strcpy(data_file,str); return data_file; } -char *grfio_setadatafile(const char *str){ strcpy(adata_file,str); return adata_file; } -char *grfio_setsdatafile(const char *str){ strcpy(sdata_file,str); return sdata_file; } +char *grfio_setdatafile (const char *str) +{ + strcpy (data_file, str); + return data_file; +} + +char *grfio_setadatafile (const char *str) +{ + strcpy (adata_file, str); + return adata_file; +} + +char *grfio_setsdatafile (const char *str) +{ + strcpy (sdata_file, str); + return sdata_file; +} //---------------------------- -// file entry table struct +// file entry table struct //---------------------------- -typedef struct { - int srclen; // compressed size - int srclen_aligned; // - int declen; // original size - int srcpos; - short next; - char cycle; - char type; - char fn[128-4*5]; // file name - char gentry; // read grf file select +typedef struct +{ + int srclen; // compressed size + int srclen_aligned; // + int declen; // original size + int srcpos; + short next; + char cycle; + char type; + char fn[128 - 4 * 5]; // file name + char gentry; // read grf file select } FILELIST; //gentry ... 0 : It acquires from a local file. // It acquires from the resource file of 1>=:gentry_table[gentry-1]. @@ -73,212 +88,267 @@ typedef struct { //Since char defines *FILELIST.gentry, the maximum which can be added by grfio_add becomes by 127 pieces. #define GENTRY_LIMIT 127 -#define FILELIST_LIMIT 32768 // temporary maximum, and a theory top maximum are 2G. +#define FILELIST_LIMIT 32768 // temporary maximum, and a theory top maximum are 2G. static FILELIST *filelist; -static int filelist_entrys; -static int filelist_maxentry; +static int filelist_entrys; +static int filelist_maxentry; static char **gentry_table; static int gentry_entrys; static int gentry_maxentry; //---------------------------- -// file list hash table +// file list hash table //---------------------------- static int filelist_hash[256]; //---------------------------- -// grf decode data table +// grf decode data table //---------------------------- static unsigned char BitMaskTable[8] = { - 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 + 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; -static char BitSwapTable1[64] = { - 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, - 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, - 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, - 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 +static char BitSwapTable1[64] = { + 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, + 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, + 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, + 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7 }; -static char BitSwapTable2[64] = { - 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, - 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, - 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, - 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 + +static char BitSwapTable2[64] = { + 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, + 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, + 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, + 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25 }; -static char BitSwapTable3[32] = { - 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, - 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 + +static char BitSwapTable3[32] = { + 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, + 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25 }; -static unsigned char NibbleData[4][64]={ - { - 0xef, 0x03, 0x41, 0xfd, 0xd8, 0x74, 0x1e, 0x47, 0x26, 0xef, 0xfb, 0x22, 0xb3, 0xd8, 0x84, 0x1e, - 0x39, 0xac, 0xa7, 0x60, 0x62, 0xc1, 0xcd, 0xba, 0x5c, 0x96, 0x90, 0x59, 0x05, 0x3b, 0x7a, 0x85, - 0x40, 0xfd, 0x1e, 0xc8, 0xe7, 0x8a, 0x8b, 0x21, 0xda, 0x43, 0x64, 0x9f, 0x2d, 0x14, 0xb1, 0x72, - 0xf5, 0x5b, 0xc8, 0xb6, 0x9c, 0x37, 0x76, 0xec, 0x39, 0xa0, 0xa3, 0x05, 0x52, 0x6e, 0x0f, 0xd9, - }, { - 0xa7, 0xdd, 0x0d, 0x78, 0x9e, 0x0b, 0xe3, 0x95, 0x60, 0x36, 0x36, 0x4f, 0xf9, 0x60, 0x5a, 0xa3, - 0x11, 0x24, 0xd2, 0x87, 0xc8, 0x52, 0x75, 0xec, 0xbb, 0xc1, 0x4c, 0xba, 0x24, 0xfe, 0x8f, 0x19, - 0xda, 0x13, 0x66, 0xaf, 0x49, 0xd0, 0x90, 0x06, 0x8c, 0x6a, 0xfb, 0x91, 0x37, 0x8d, 0x0d, 0x78, - 0xbf, 0x49, 0x11, 0xf4, 0x23, 0xe5, 0xce, 0x3b, 0x55, 0xbc, 0xa2, 0x57, 0xe8, 0x22, 0x74, 0xce, - }, { - 0x2c, 0xea, 0xc1, 0xbf, 0x4a, 0x24, 0x1f, 0xc2, 0x79, 0x47, 0xa2, 0x7c, 0xb6, 0xd9, 0x68, 0x15, - 0x80, 0x56, 0x5d, 0x01, 0x33, 0xfd, 0xf4, 0xae, 0xde, 0x30, 0x07, 0x9b, 0xe5, 0x83, 0x9b, 0x68, - 0x49, 0xb4, 0x2e, 0x83, 0x1f, 0xc2, 0xb5, 0x7c, 0xa2, 0x19, 0xd8, 0xe5, 0x7c, 0x2f, 0x83, 0xda, - 0xf7, 0x6b, 0x90, 0xfe, 0xc4, 0x01, 0x5a, 0x97, 0x61, 0xa6, 0x3d, 0x40, 0x0b, 0x58, 0xe6, 0x3d, - }, { - 0x4d, 0xd1, 0xb2, 0x0f, 0x28, 0xbd, 0xe4, 0x78, 0xf6, 0x4a, 0x0f, 0x93, 0x8b, 0x17, 0xd1, 0xa4, - 0x3a, 0xec, 0xc9, 0x35, 0x93, 0x56, 0x7e, 0xcb, 0x55, 0x20, 0xa0, 0xfe, 0x6c, 0x89, 0x17, 0x62, - 0x17, 0x62, 0x4b, 0xb1, 0xb4, 0xde, 0xd1, 0x87, 0xc9, 0x14, 0x3c, 0x4a, 0x7e, 0xa8, 0xe2, 0x7d, - 0xa0, 0x9f, 0xf6, 0x5c, 0x6a, 0x09, 0x8d, 0xf0, 0x0f, 0xe3, 0x53, 0x25, 0x95, 0x36, 0x28, 0xcb, - } +static unsigned char NibbleData[4][64] = { + { + 0xef, 0x03, 0x41, 0xfd, 0xd8, 0x74, 0x1e, 0x47, 0x26, 0xef, 0xfb, 0x22, + 0xb3, 0xd8, 0x84, 0x1e, + 0x39, 0xac, 0xa7, 0x60, 0x62, 0xc1, 0xcd, 0xba, 0x5c, 0x96, 0x90, 0x59, + 0x05, 0x3b, 0x7a, 0x85, + 0x40, 0xfd, 0x1e, 0xc8, 0xe7, 0x8a, 0x8b, 0x21, 0xda, 0x43, 0x64, 0x9f, + 0x2d, 0x14, 0xb1, 0x72, + 0xf5, 0x5b, 0xc8, 0xb6, 0x9c, 0x37, 0x76, 0xec, 0x39, 0xa0, 0xa3, 0x05, + 0x52, 0x6e, 0x0f, 0xd9, + }, { + 0xa7, 0xdd, 0x0d, 0x78, 0x9e, 0x0b, 0xe3, 0x95, 0x60, 0x36, 0x36, + 0x4f, 0xf9, 0x60, 0x5a, 0xa3, + 0x11, 0x24, 0xd2, 0x87, 0xc8, 0x52, 0x75, 0xec, 0xbb, 0xc1, 0x4c, + 0xba, 0x24, 0xfe, 0x8f, 0x19, + 0xda, 0x13, 0x66, 0xaf, 0x49, 0xd0, 0x90, 0x06, 0x8c, 0x6a, 0xfb, + 0x91, 0x37, 0x8d, 0x0d, 0x78, + 0xbf, 0x49, 0x11, 0xf4, 0x23, 0xe5, 0xce, 0x3b, 0x55, 0xbc, 0xa2, + 0x57, 0xe8, 0x22, 0x74, 0xce, + }, { + 0x2c, 0xea, 0xc1, 0xbf, 0x4a, 0x24, 0x1f, 0xc2, 0x79, 0x47, 0xa2, + 0x7c, 0xb6, 0xd9, 0x68, 0x15, + 0x80, 0x56, 0x5d, 0x01, 0x33, 0xfd, 0xf4, 0xae, 0xde, 0x30, 0x07, + 0x9b, 0xe5, 0x83, 0x9b, 0x68, + 0x49, 0xb4, 0x2e, 0x83, 0x1f, 0xc2, 0xb5, 0x7c, 0xa2, 0x19, 0xd8, + 0xe5, 0x7c, 0x2f, 0x83, 0xda, + 0xf7, 0x6b, 0x90, 0xfe, 0xc4, 0x01, 0x5a, 0x97, 0x61, 0xa6, 0x3d, + 0x40, 0x0b, 0x58, 0xe6, 0x3d, + }, { + 0x4d, 0xd1, 0xb2, 0x0f, 0x28, 0xbd, 0xe4, 0x78, 0xf6, 0x4a, + 0x0f, 0x93, 0x8b, 0x17, 0xd1, 0xa4, + 0x3a, 0xec, 0xc9, 0x35, 0x93, 0x56, 0x7e, 0xcb, 0x55, 0x20, + 0xa0, 0xfe, 0x6c, 0x89, 0x17, 0x62, + 0x17, 0x62, 0x4b, 0xb1, 0xb4, 0xde, 0xd1, 0x87, 0xc9, 0x14, + 0x3c, 0x4a, 0x7e, 0xa8, 0xe2, 0x7d, + 0xa0, 0x9f, 0xf6, 0x5c, 0x6a, 0x09, 0x8d, 0xf0, 0x0f, 0xe3, + 0x53, 0x25, 0x95, 0x36, 0x28, 0xcb, + } }; + /*----------------- * long data get */ -static unsigned int getlong(unsigned char *p) +static unsigned int getlong (unsigned char *p) { - return *p+p[1]*256+(p[2]+p[3]*256)*65536; + return *p + p[1] * 256 + (p[2] + p[3] * 256) * 65536; } /*========================================== * Grf data decode : Subs *------------------------------------------ */ -static void NibbleSwap(BYTE *Src, int len) +static void NibbleSwap (BYTE * Src, int len) { - for(;0<len;len--,Src++) { - *Src = (*Src>>4) | (*Src<<4); - } + for (; 0 < len; len--, Src++) + { + *Src = (*Src >> 4) | (*Src << 4); + } } -static void BitConvert(BYTE *Src,char *BitSwapTable) +static void BitConvert (BYTE * Src, char *BitSwapTable) { - int lop,prm; - BYTE tmp[8]; - *(DWORD*)tmp=*(DWORD*)(tmp+4)=0; - for(lop=0;lop!=64;lop++) { - prm = BitSwapTable[lop]-1; - if (Src[(prm >> 3) & 7] & BitMaskTable[prm & 7]) { - tmp[(lop >> 3) & 7] |= BitMaskTable[lop & 7]; - } - } - *(DWORD*)Src = *(DWORD*)tmp; - *(DWORD*)(Src+4) = *(DWORD*)(tmp+4); + int lop, prm; + BYTE tmp[8]; + *(DWORD *) tmp = *(DWORD *) (tmp + 4) = 0; + for (lop = 0; lop != 64; lop++) + { + prm = BitSwapTable[lop] - 1; + if (Src[(prm >> 3) & 7] & BitMaskTable[prm & 7]) + { + tmp[(lop >> 3) & 7] |= BitMaskTable[lop & 7]; + } + } + *(DWORD *) Src = *(DWORD *) tmp; + *(DWORD *) (Src + 4) = *(DWORD *) (tmp + 4); } -static void BitConvert4(BYTE *Src) +static void BitConvert4 (BYTE * Src) { - int lop,prm; - BYTE tmp[8]; - tmp[0] = ((Src[7]<<5) | (Src[4]>>3)) & 0x3f; // ..0 vutsr - tmp[1] = ((Src[4]<<1) | (Src[5]>>7)) & 0x3f; // ..srqpo n - tmp[2] = ((Src[4]<<5) | (Src[5]>>3)) & 0x3f; // ..o nmlkj - tmp[3] = ((Src[5]<<1) | (Src[6]>>7)) & 0x3f; // ..kjihg f - tmp[4] = ((Src[5]<<5) | (Src[6]>>3)) & 0x3f; // ..g fedcb - tmp[5] = ((Src[6]<<1) | (Src[7]>>7)) & 0x3f; // ..cba98 7 - tmp[6] = ((Src[6]<<5) | (Src[7]>>3)) & 0x3f; // ..8 76543 - tmp[7] = ((Src[7]<<1) | (Src[4]>>7)) & 0x3f; // ..43210 v - - for(lop=0;lop!=4;lop++) { - tmp[lop] = (NibbleData[lop][tmp[lop*2]] & 0xf0) - | (NibbleData[lop][tmp[lop*2+1]] & 0x0f); - } - - *(DWORD*)(tmp+4)=0; - for(lop=0;lop!=32;lop++) { - prm = BitSwapTable3[lop]-1; - if (tmp[prm >> 3] & BitMaskTable[prm & 7]) { - tmp[(lop >> 3) + 4] |= BitMaskTable[lop & 7]; - } - } - *(DWORD*)Src ^= *(DWORD*)(tmp+4); + int lop, prm; + BYTE tmp[8]; + tmp[0] = ((Src[7] << 5) | (Src[4] >> 3)) & 0x3f; // ..0 vutsr + tmp[1] = ((Src[4] << 1) | (Src[5] >> 7)) & 0x3f; // ..srqpo n + tmp[2] = ((Src[4] << 5) | (Src[5] >> 3)) & 0x3f; // ..o nmlkj + tmp[3] = ((Src[5] << 1) | (Src[6] >> 7)) & 0x3f; // ..kjihg f + tmp[4] = ((Src[5] << 5) | (Src[6] >> 3)) & 0x3f; // ..g fedcb + tmp[5] = ((Src[6] << 1) | (Src[7] >> 7)) & 0x3f; // ..cba98 7 + tmp[6] = ((Src[6] << 5) | (Src[7] >> 3)) & 0x3f; // ..8 76543 + tmp[7] = ((Src[7] << 1) | (Src[4] >> 7)) & 0x3f; // ..43210 v + + for (lop = 0; lop != 4; lop++) + { + tmp[lop] = (NibbleData[lop][tmp[lop * 2]] & 0xf0) + | (NibbleData[lop][tmp[lop * 2 + 1]] & 0x0f); + } + + *(DWORD *) (tmp + 4) = 0; + for (lop = 0; lop != 32; lop++) + { + prm = BitSwapTable3[lop] - 1; + if (tmp[prm >> 3] & BitMaskTable[prm & 7]) + { + tmp[(lop >> 3) + 4] |= BitMaskTable[lop & 7]; + } + } + *(DWORD *) Src ^= *(DWORD *) (tmp + 4); } -static void decode_des_etc(BYTE *buf,int len,int type,int cycle) +static void decode_des_etc (BYTE * buf, int len, int type, int cycle) { - int lop,cnt=0; - if(cycle<3) cycle=3; - else if(cycle<5) cycle++; - else if(cycle<7) cycle+=9; - else cycle+=15; - - for(lop=0;lop*8<len;lop++,buf+=8) { - if(lop<20 || (type==0 && lop%cycle==0)){ // des - BitConvert(buf,BitSwapTable1); - BitConvert4(buf); - BitConvert(buf,BitSwapTable2); - } else { - if(cnt==7 && type==0){ - int a; - BYTE tmp[8]; - *(DWORD*)tmp = *(DWORD*)buf; - *(DWORD*)(tmp+4) = *(DWORD*)(buf+4); - cnt=0; - buf[0]=tmp[3]; - buf[1]=tmp[4]; - buf[2]=tmp[6]; - buf[3]=tmp[0]; - buf[4]=tmp[1]; - buf[5]=tmp[2]; - buf[6]=tmp[5]; - a=tmp[7]; - if(a==0x00) a=0x2b; - else if(a==0x2b) a=0x00; - else if(a==0x01) a=0x68; - else if(a==0x68) a=0x01; - else if(a==0x48) a=0x77; - else if(a==0x77) a=0x48; - else if(a==0x60) a=0xff; - else if(a==0xff) a=0x60; - else if(a==0x6c) a=0x80; - else if(a==0x80) a=0x6c; - else if(a==0xb9) a=0xc0; - else if(a==0xc0) a=0xb9; - else if(a==0xeb) a=0xfe; - else if(a==0xfe) a=0xeb; - buf[7]=a; - } - cnt++; - } - } + int lop, cnt = 0; + if (cycle < 3) + cycle = 3; + else if (cycle < 5) + cycle++; + else if (cycle < 7) + cycle += 9; + else + cycle += 15; + + for (lop = 0; lop * 8 < len; lop++, buf += 8) + { + if (lop < 20 || (type == 0 && lop % cycle == 0)) + { // des + BitConvert (buf, BitSwapTable1); + BitConvert4 (buf); + BitConvert (buf, BitSwapTable2); + } + else + { + if (cnt == 7 && type == 0) + { + int a; + BYTE tmp[8]; + *(DWORD *) tmp = *(DWORD *) buf; + *(DWORD *) (tmp + 4) = *(DWORD *) (buf + 4); + cnt = 0; + buf[0] = tmp[3]; + buf[1] = tmp[4]; + buf[2] = tmp[6]; + buf[3] = tmp[0]; + buf[4] = tmp[1]; + buf[5] = tmp[2]; + buf[6] = tmp[5]; + a = tmp[7]; + if (a == 0x00) + a = 0x2b; + else if (a == 0x2b) + a = 0x00; + else if (a == 0x01) + a = 0x68; + else if (a == 0x68) + a = 0x01; + else if (a == 0x48) + a = 0x77; + else if (a == 0x77) + a = 0x48; + else if (a == 0x60) + a = 0xff; + else if (a == 0xff) + a = 0x60; + else if (a == 0x6c) + a = 0x80; + else if (a == 0x80) + a = 0x6c; + else if (a == 0xb9) + a = 0xc0; + else if (a == 0xc0) + a = 0xb9; + else if (a == 0xeb) + a = 0xfe; + else if (a == 0xfe) + a = 0xeb; + buf[7] = a; + } + cnt++; + } + } } + /*========================================== * Grf data decode sub : zip *------------------------------------------ */ -static int decode_zip(Bytef* dest, uLongf* destLen, const Bytef* source, uLong sourceLen) +static int decode_zip (Bytef * dest, uLongf * destLen, const Bytef * source, + uLong sourceLen) { - z_stream stream; - int err; - - stream.next_in = (Bytef*)source; - stream.avail_in = (uInt)sourceLen; - /* Check for source > 64K on 16-bit machine: */ - if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; - - stream.next_out = dest; - stream.avail_out = (uInt)*destLen; - if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; - - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - - err = inflateInit(&stream); - if (err != Z_OK) return err; - - err = inflate(&stream, Z_FINISH); - if (err != Z_STREAM_END) { - inflateEnd(&stream); - return err == Z_OK ? Z_BUF_ERROR : err; - } - *destLen = stream.total_out; + z_stream stream; + int err; + + stream.next_in = (Bytef *) source; + stream.avail_in = (uInt) sourceLen; + /* Check for source > 64K on 16-bit machine: */ + if ((uLong) stream.avail_in != sourceLen) + return Z_BUF_ERROR; + + stream.next_out = dest; + stream.avail_out = (uInt) * destLen; + if ((uLong) stream.avail_out != *destLen) + return Z_BUF_ERROR; + + stream.zalloc = (alloc_func) 0; + stream.zfree = (free_func) 0; + + err = inflateInit (&stream); + if (err != Z_OK) + return err; + + err = inflate (&stream, Z_FINISH); + if (err != Z_STREAM_END) + { + inflateEnd (&stream); + return err == Z_OK ? Z_BUF_ERROR : err; + } + *destLen = stream.total_out; - err = inflateEnd(&stream); - return err; + err = inflateEnd (&stream); + return err; } + /*********************************************************** *** File List Sobroutines *** ***********************************************************/ @@ -287,115 +357,134 @@ static int decode_zip(Bytef* dest, uLongf* destLen, const Bytef* source, uLong s * File List : Hash make *------------------------------------------ */ -static int filehash(unsigned char *fname) +static int filehash (unsigned char *fname) { - unsigned int hash=0; - while(*fname) { - hash = ((hash<<1)+(hash>>7)*9+tolower(*fname)); - fname++; - } - return hash & 255; + unsigned int hash = 0; + while (*fname) + { + hash = ((hash << 1) + (hash >> 7) * 9 + tolower (*fname)); + fname++; + } + return hash & 255; } /*========================================== * File List : Hash initalize *------------------------------------------ */ -static void hashinit(void) +static void hashinit (void) { - int lop; - for(lop=0;lop<256;lop++) - filelist_hash[lop]=-1; + int lop; + for (lop = 0; lop < 256; lop++) + filelist_hash[lop] = -1; } /*========================================== * File List : File find *------------------------------------------ */ -FILELIST *filelist_find(char *fname) +FILELIST *filelist_find (char *fname) { - int hash; + int hash; - for(hash=filelist_hash[filehash(fname)];hash>=0;hash=filelist[hash].next) { - if(strcasecmp(filelist[hash].fn,fname)==0) - break; - } + for (hash = filelist_hash[filehash (fname)]; hash >= 0; + hash = filelist[hash].next) + { + if (strcasecmp (filelist[hash].fn, fname) == 0) + break; + } - return (hash>=0)? &filelist[hash] : NULL; + return (hash >= 0) ? &filelist[hash] : NULL; } /*========================================== * File List : Filelist add *------------------------------------------ */ -#define FILELIST_ADDS 1024 // number increment of file lists ` +#define FILELIST_ADDS 1024 // number increment of file lists ` -static FILELIST* filelist_add(FILELIST *entry) +static FILELIST *filelist_add (FILELIST * entry) { - int hash; - - if (filelist_entrys>=FILELIST_LIMIT) { - printf("filelist limit : filelist_add\n"); - exit(1); - } - - if (filelist_entrys>=filelist_maxentry) { - FILELIST *new_filelist = (FILELIST*)realloc( - (void*)filelist, (filelist_maxentry+FILELIST_ADDS)*sizeof(FILELIST) ); - if (new_filelist != NULL) { - filelist = new_filelist; - memset(filelist + filelist_maxentry, '\0', - FILELIST_ADDS * sizeof(FILELIST)); - filelist_maxentry += FILELIST_ADDS; - } else { - printf("out of memory : filelist_add\n"); - exit(1); - } - } - - memcpy( &filelist[filelist_entrys], entry, sizeof(FILELIST) ); - - hash = filehash(entry->fn); - filelist[filelist_entrys].next = filelist_hash[hash]; - filelist_hash[hash] = filelist_entrys; - - filelist_entrys++; - - return &filelist[filelist_entrys-1]; + int hash; + + if (filelist_entrys >= FILELIST_LIMIT) + { + printf ("filelist limit : filelist_add\n"); + exit (1); + } + + if (filelist_entrys >= filelist_maxentry) + { + FILELIST *new_filelist = (FILELIST *) realloc ((void *) filelist, + (filelist_maxentry + + FILELIST_ADDS) * + sizeof (FILELIST)); + if (new_filelist != NULL) + { + filelist = new_filelist; + memset (filelist + filelist_maxentry, '\0', + FILELIST_ADDS * sizeof (FILELIST)); + filelist_maxentry += FILELIST_ADDS; + } + else + { + printf ("out of memory : filelist_add\n"); + exit (1); + } + } + + memcpy (&filelist[filelist_entrys], entry, sizeof (FILELIST)); + + hash = filehash (entry->fn); + filelist[filelist_entrys].next = filelist_hash[hash]; + filelist_hash[hash] = filelist_entrys; + + filelist_entrys++; + + return &filelist[filelist_entrys - 1]; } -static FILELIST* filelist_modify(FILELIST *entry) +static FILELIST *filelist_modify (FILELIST * entry) { - FILELIST *fentry; - if ((fentry=filelist_find(entry->fn))!=NULL) { - int tmp = fentry->next; - memcpy( fentry, entry, sizeof(FILELIST) ); - fentry->next = tmp; - } else { - fentry = filelist_add(entry); - } - return fentry; + FILELIST *fentry; + if ((fentry = filelist_find (entry->fn)) != NULL) + { + int tmp = fentry->next; + memcpy (fentry, entry, sizeof (FILELIST)); + fentry->next = tmp; + } + else + { + fentry = filelist_add (entry); + } + return fentry; } /*========================================== * File List : filelist size adjust *------------------------------------------ */ -static void filelist_adjust(void) +static void filelist_adjust (void) { - if (filelist!=NULL) { - if (filelist_maxentry>filelist_entrys) { - FILELIST *new_filelist = (FILELIST*)realloc( - (void*)filelist,filelist_entrys*sizeof(FILELIST) ); - if (new_filelist != NULL) { - filelist = new_filelist; - filelist_maxentry = filelist_entrys; - } else { - printf("out of memory : filelist\n"); - exit(1); - } - } - } + if (filelist != NULL) + { + if (filelist_maxentry > filelist_entrys) + { + FILELIST *new_filelist = (FILELIST *) realloc ((void *) filelist, + filelist_entrys * + sizeof (FILELIST)); + if (new_filelist != NULL) + { + filelist = new_filelist; + filelist_maxentry = filelist_entrys; + } + else + { + printf ("out of memory : filelist\n"); + exit (1); + } + } + } } /*********************************************************** @@ -405,30 +494,37 @@ static void filelist_adjust(void) * Grfio : Resnametable replace *------------------------------------------ */ -char* grfio_resnametable(char* fname, char *lfname) +char *grfio_resnametable (char *fname, char *lfname) { - FILE *fp; - char *p; - char w1[256],w2[256],restable[256],line[512]; + FILE *fp; + char *p; + char w1[256], w2[256], restable[256], line[512]; - sprintf(restable,"%sdata\\resnametable.txt",data_dir); + sprintf (restable, "%sdata\\resnametable.txt", data_dir); - for(p=&restable[0];*p!=0;p++) if (*p=='\\') *p = '/'; + for (p = &restable[0]; *p != 0; p++) + if (*p == '\\') + *p = '/'; - fp = fopen_(restable,"rb"); - if(fp==NULL) { - printf("%s not found\n",restable); - exit(1); // 1:not found error - } + fp = fopen_ (restable, "rb"); + if (fp == NULL) + { + printf ("%s not found\n", restable); + exit (1); // 1:not found error + } - while(fgets(line,508,fp)){ - if((sscanf(line,"%[^#]#%[^#]#",w1,w2)==2) && (sscanf(fname,"%*5s%s",lfname)==1) && (!strcmpi(w1,lfname))){ - sprintf(lfname,"data\\%s",w2); - fclose_(fp); - return lfname; + while (fgets (line, 508, fp)) + { + if ((sscanf (line, "%[^#]#%[^#]#", w1, w2) == 2) + && (sscanf (fname, "%*5s%s", lfname) == 1) + && (!strcmpi (w1, lfname))) + { + sprintf (lfname, "data\\%s", w2); + fclose_ (fp); + return lfname; } } - fclose_(fp); + fclose_ (fp); return fname; } @@ -437,513 +533,617 @@ char* grfio_resnametable(char* fname, char *lfname) * Grfio : Resource file size get *------------------------------------------ */ -int grfio_size(char *fname) +int grfio_size (char *fname) { - FILELIST *entry; - - entry = filelist_find(fname); - - if (entry==NULL || entry->gentry<0) { // LocalFileCheck - char lfname[256],rname[256],*p; - FILELIST lentry; - struct stat st; - - //printf("%s\t",fname); - sprintf(rname,"%s",grfio_resnametable(fname,lfname)); - //printf("%s\n",rname); - sprintf(lfname,"%s%s",data_dir,rname); - //printf("%s\n",lfname); - - for(p=&lfname[0];*p!=0;p++) if (*p=='\\') *p = '/'; // * At the time of Unix - - if (stat(lfname,&st)==0) { - strncpy(lentry.fn, fname, sizeof(lentry.fn)-1 ); - lentry.declen = st.st_size; - lentry.gentry = 0; // 0:LocalFile - entry = filelist_modify(&lentry); - } else if (entry==NULL) { - printf("%s not found\n", fname); - //exit(1); - return -1; - } - } - return entry->declen; + FILELIST *entry; + + entry = filelist_find (fname); + + if (entry == NULL || entry->gentry < 0) + { // LocalFileCheck + char lfname[256], rname[256], *p; + FILELIST lentry; + struct stat st; + + //printf("%s\t",fname); + sprintf (rname, "%s", grfio_resnametable (fname, lfname)); + //printf("%s\n",rname); + sprintf (lfname, "%s%s", data_dir, rname); + //printf("%s\n",lfname); + + for (p = &lfname[0]; *p != 0; p++) + if (*p == '\\') + *p = '/'; // * At the time of Unix + + if (stat (lfname, &st) == 0) + { + strncpy (lentry.fn, fname, sizeof (lentry.fn) - 1); + lentry.declen = st.st_size; + lentry.gentry = 0; // 0:LocalFile + entry = filelist_modify (&lentry); + } + else if (entry == NULL) + { + printf ("%s not found\n", fname); + //exit(1); + return -1; + } + } + return entry->declen; } /*========================================== * Grfio : Resource file read & size get *------------------------------------------ */ -void* grfio_reads(char *fname, int *size) +void *grfio_reads (char *fname, int *size) { - FILE *in = NULL; - unsigned char *buf=NULL,*buf2=NULL; - char *gfname; - FILELIST *entry; - - entry = filelist_find(fname); - - if (entry==NULL || entry->gentry<=0) { // LocalFileCheck - char lfname[256],rname[256],*p; - FILELIST lentry; - - strncpy(lfname,fname,255); - sprintf(rname,"%s",grfio_resnametable(fname,lfname)); - sprintf(lfname,"%s%s",data_dir,rname); - //printf("%s\n",lfname); - - for(p=&lfname[0];*p!=0;p++) if (*p=='\\') *p = '/'; // * At the time of Unix - - in = fopen_(lfname,"rb"); - if(in!=NULL) { - if (entry!=NULL && entry->gentry==0) { - lentry.declen=entry->declen; - } else { - fseek(in,0,2); // SEEK_END - lentry.declen = ftell(in); - } - fseek(in,0,0); // SEEK_SET - buf2 = calloc(lentry.declen+1024, 1); - if (buf2==NULL) { - printf("file read memory allocate error : declen\n"); - goto errret; - } - fread(buf2,1,lentry.declen,in); - fclose_(in); in = NULL; - strncpy( lentry.fn, fname, sizeof(lentry.fn)-1 ); - lentry.gentry = 0; // 0:LocalFile - entry = filelist_modify(&lentry); - } else { - if (entry!=NULL && entry->gentry<0) { - entry->gentry = -entry->gentry; // local file checked - } else { - printf("%s not found\n", fname); - //goto errret; - free(buf2); - return NULL; - } - } - } - if (entry!=NULL && entry->gentry>0) { // Archive[GRF] File Read - buf = calloc(entry->srclen_aligned+1024, 1); - if (buf==NULL) { - printf("file read memory allocate error : srclen_aligned\n"); - goto errret; - } - gfname = gentry_table[entry->gentry-1]; - in = fopen_(gfname,"rb"); - if(in==NULL) { - printf("%s not found\n",gfname); - //goto errret; - free(buf); - return NULL; - } - fseek(in,entry->srcpos,0); - fread(buf,1,entry->srclen_aligned,in); - fclose_(in); - buf2=calloc(entry->declen+1024, 1); - if (buf2==NULL) { - printf("file decode memory allocate error\n"); - goto errret; - } - if(entry->type==1 || entry->type==3 || entry->type==5) { - uLongf len; - if (entry->cycle>=0) { - decode_des_etc(buf,entry->srclen_aligned,entry->cycle==0,entry->cycle); - } - len=entry->declen; - decode_zip(buf2,&len,buf,entry->srclen); - if(len!=entry->declen) { - printf("decode_zip size miss match err: %d != %d\n",(int)len,entry->declen); - goto errret; - } - } else { - memcpy(buf2,buf,entry->declen); - } - free(buf); - } - if (size!=NULL && entry!=NULL) - *size = entry->declen; - return buf2; -errret: - if (buf!=NULL) free(buf); - if (buf2!=NULL) free(buf2); - if (in!=NULL) fclose_(in); - exit(1); //return NULL; + FILE *in = NULL; + unsigned char *buf = NULL, *buf2 = NULL; + char *gfname; + FILELIST *entry; + + entry = filelist_find (fname); + + if (entry == NULL || entry->gentry <= 0) + { // LocalFileCheck + char lfname[256], rname[256], *p; + FILELIST lentry; + + strncpy (lfname, fname, 255); + sprintf (rname, "%s", grfio_resnametable (fname, lfname)); + sprintf (lfname, "%s%s", data_dir, rname); + //printf("%s\n",lfname); + + for (p = &lfname[0]; *p != 0; p++) + if (*p == '\\') + *p = '/'; // * At the time of Unix + + in = fopen_ (lfname, "rb"); + if (in != NULL) + { + if (entry != NULL && entry->gentry == 0) + { + lentry.declen = entry->declen; + } + else + { + fseek (in, 0, 2); // SEEK_END + lentry.declen = ftell (in); + } + fseek (in, 0, 0); // SEEK_SET + buf2 = calloc (lentry.declen + 1024, 1); + if (buf2 == NULL) + { + printf ("file read memory allocate error : declen\n"); + goto errret; + } + fread (buf2, 1, lentry.declen, in); + fclose_ (in); + in = NULL; + strncpy (lentry.fn, fname, sizeof (lentry.fn) - 1); + lentry.gentry = 0; // 0:LocalFile + entry = filelist_modify (&lentry); + } + else + { + if (entry != NULL && entry->gentry < 0) + { + entry->gentry = -entry->gentry; // local file checked + } + else + { + printf ("%s not found\n", fname); + //goto errret; + free (buf2); + return NULL; + } + } + } + if (entry != NULL && entry->gentry > 0) + { // Archive[GRF] File Read + buf = calloc (entry->srclen_aligned + 1024, 1); + if (buf == NULL) + { + printf ("file read memory allocate error : srclen_aligned\n"); + goto errret; + } + gfname = gentry_table[entry->gentry - 1]; + in = fopen_ (gfname, "rb"); + if (in == NULL) + { + printf ("%s not found\n", gfname); + //goto errret; + free (buf); + return NULL; + } + fseek (in, entry->srcpos, 0); + fread (buf, 1, entry->srclen_aligned, in); + fclose_ (in); + buf2 = calloc (entry->declen + 1024, 1); + if (buf2 == NULL) + { + printf ("file decode memory allocate error\n"); + goto errret; + } + if (entry->type == 1 || entry->type == 3 || entry->type == 5) + { + uLongf len; + if (entry->cycle >= 0) + { + decode_des_etc (buf, entry->srclen_aligned, entry->cycle == 0, + entry->cycle); + } + len = entry->declen; + decode_zip (buf2, &len, buf, entry->srclen); + if (len != entry->declen) + { + printf ("decode_zip size miss match err: %d != %d\n", + (int) len, entry->declen); + goto errret; + } + } + else + { + memcpy (buf2, buf, entry->declen); + } + free (buf); + } + if (size != NULL && entry != NULL) + *size = entry->declen; + return buf2; + errret: + if (buf != NULL) + free (buf); + if (buf2 != NULL) + free (buf2); + if (in != NULL) + fclose_ (in); + exit (1); //return NULL; } /*========================================== * Grfio : Resource file read *------------------------------------------ */ -void* grfio_read(char *fname) +void *grfio_read (char *fname) { - return grfio_reads(fname,NULL); + return grfio_reads (fname, NULL); } /*========================================== * Resource filename decode *------------------------------------------ */ -static unsigned char * decode_filename(unsigned char *buf,int len) +static unsigned char *decode_filename (unsigned char *buf, int len) { - int lop; - for(lop=0;lop<len;lop+=8) { - NibbleSwap(&buf[lop],8); - BitConvert(&buf[lop],BitSwapTable1); - BitConvert4(&buf[lop]); - BitConvert(&buf[lop],BitSwapTable2); - } - return buf; + int lop; + for (lop = 0; lop < len; lop += 8) + { + NibbleSwap (&buf[lop], 8); + BitConvert (&buf[lop], BitSwapTable1); + BitConvert4 (&buf[lop]); + BitConvert (&buf[lop], BitSwapTable2); + } + return buf; } /*========================================== * Grfio : Entry table read *------------------------------------------ */ -static int grfio_entryread(char *gfname,int gentry) +static int grfio_entryread (char *gfname, int gentry) { - FILE *fp; - int grf_size,list_size; - unsigned char grf_header[0x2e]; - int lop,entry,entrys,ofs,grf_version; - unsigned char *fname; - unsigned char *grf_filelist; - - fp = fopen_(gfname,"rb"); - if(fp==NULL) { - printf("%s not found\n",gfname); - return 1; // 1:not found error - } - - fseek(fp,0,2); // SEEK_END - grf_size = ftell(fp); - fseek(fp,0,0); // SEEK_SET - fread(grf_header,1,0x2e,fp); - if(strcmp(grf_header,"Master of Magic") || fseek(fp,getlong(grf_header+0x1e),1)){ // SEEK_CUR - fclose_(fp); - printf("%s read error\n",gfname); - return 2; // 2:file format error - } - - grf_version = getlong(grf_header+0x2a) >> 8; - - if (grf_version==0x01) { //****** Grf version 01xx ****** - list_size = grf_size-ftell(fp); - grf_filelist = calloc(list_size, 1); - if(grf_filelist==NULL){ - fclose_(fp); - printf("out of memory : grf_filelist\n"); - return 3; // 3:memory alloc error - } - fread(grf_filelist,1,list_size,fp); - fclose_(fp); - - entrys = getlong(grf_header+0x26) - getlong(grf_header+0x22) - 7; - - // Get an entry - for(entry=0,ofs=0;entry<entrys;entry++){ - int ofs2,srclen,srccount,type; - char *period_ptr; - FILELIST aentry; - - ofs2 = ofs+getlong(grf_filelist+ofs)+4; - type = grf_filelist[ofs2+12]; - if( type!=0 ){ // Directory Index ... skip - fname = decode_filename(grf_filelist+ofs+6,grf_filelist[ofs]-6); - if(strlen(fname)>sizeof(aentry.fn)-1){ - printf("file name too long : %s\n",fname); - free(grf_filelist); - exit(1); - } - srclen=0; - if((period_ptr=rindex(fname,'.'))!=NULL){ - for(lop=0;lop<4;lop++) { - if(strcasecmp(period_ptr,".gnd\0.gat\0.act\0.str"+lop*5)==0) - break; - } - srclen=getlong(grf_filelist+ofs2)-getlong(grf_filelist+ofs2+8)-715; - if(lop==4) { - for(lop=10,srccount=1;srclen>=lop;lop=lop*10,srccount++); - } else { - srccount=0; - } - } else { - srccount=0; - } - - aentry.srclen = srclen; - aentry.srclen_aligned = getlong(grf_filelist+ofs2+4)-37579; - aentry.declen = getlong(grf_filelist+ofs2+8); - aentry.srcpos = getlong(grf_filelist+ofs2+13)+0x2e; - aentry.cycle = srccount; - aentry.type = type; - strncpy(aentry.fn,fname,sizeof(aentry.fn)-1); + FILE *fp; + int grf_size, list_size; + unsigned char grf_header[0x2e]; + int lop, entry, entrys, ofs, grf_version; + unsigned char *fname; + unsigned char *grf_filelist; + + fp = fopen_ (gfname, "rb"); + if (fp == NULL) + { + printf ("%s not found\n", gfname); + return 1; // 1:not found error + } + + fseek (fp, 0, 2); // SEEK_END + grf_size = ftell (fp); + fseek (fp, 0, 0); // SEEK_SET + fread (grf_header, 1, 0x2e, fp); + if (strcmp (grf_header, "Master of Magic") + || fseek (fp, getlong (grf_header + 0x1e), 1)) + { // SEEK_CUR + fclose_ (fp); + printf ("%s read error\n", gfname); + return 2; // 2:file format error + } + + grf_version = getlong (grf_header + 0x2a) >> 8; + + if (grf_version == 0x01) + { //****** Grf version 01xx ****** + list_size = grf_size - ftell (fp); + grf_filelist = calloc (list_size, 1); + if (grf_filelist == NULL) + { + fclose_ (fp); + printf ("out of memory : grf_filelist\n"); + return 3; // 3:memory alloc error + } + fread (grf_filelist, 1, list_size, fp); + fclose_ (fp); + + entrys = + getlong (grf_header + 0x26) - getlong (grf_header + 0x22) - 7; + + // Get an entry + for (entry = 0, ofs = 0; entry < entrys; entry++) + { + int ofs2, srclen, srccount, type; + char *period_ptr; + FILELIST aentry; + + ofs2 = ofs + getlong (grf_filelist + ofs) + 4; + type = grf_filelist[ofs2 + 12]; + if (type != 0) + { // Directory Index ... skip + fname = + decode_filename (grf_filelist + ofs + 6, + grf_filelist[ofs] - 6); + if (strlen (fname) > sizeof (aentry.fn) - 1) + { + printf ("file name too long : %s\n", fname); + free (grf_filelist); + exit (1); + } + srclen = 0; + if ((period_ptr = rindex (fname, '.')) != NULL) + { + for (lop = 0; lop < 4; lop++) + { + if (strcasecmp + (period_ptr, + ".gnd\0.gat\0.act\0.str" + lop * 5) == 0) + break; + } + srclen = + getlong (grf_filelist + ofs2) - + getlong (grf_filelist + ofs2 + 8) - 715; + if (lop == 4) + { + for (lop = 10, srccount = 1; srclen >= lop; + lop = lop * 10, srccount++); + } + else + { + srccount = 0; + } + } + else + { + srccount = 0; + } + + aentry.srclen = srclen; + aentry.srclen_aligned = + getlong (grf_filelist + ofs2 + 4) - 37579; + aentry.declen = getlong (grf_filelist + ofs2 + 8); + aentry.srcpos = getlong (grf_filelist + ofs2 + 13) + 0x2e; + aentry.cycle = srccount; + aentry.type = type; + strncpy (aentry.fn, fname, sizeof (aentry.fn) - 1); #ifdef GRFIO_LOCAL - aentry.gentry = -(gentry+1); // As Flag for making it a negative number carrying out the first time LocalFileCheck + aentry.gentry = -(gentry + 1); // As Flag for making it a negative number carrying out the first time LocalFileCheck #else - aentry.gentry = gentry+1; // With no first time LocalFileCheck + aentry.gentry = gentry + 1; // With no first time LocalFileCheck #endif - filelist_modify(&aentry); - } - ofs = ofs2 + 17; - } - free(grf_filelist); - - } else if (grf_version==0x02) { //****** Grf version 02xx ****** - unsigned char eheader[8]; - unsigned char *rBuf; - uLongf rSize,eSize; - - fread(eheader,1,8,fp); - rSize = getlong(eheader); // Read Size - eSize = getlong(eheader+4); // Extend Size - - if (rSize > grf_size-ftell(fp)) { - fclose_(fp); - printf("Illegal data format : grf compress entry size\n"); - return 4; - } - - rBuf = calloc( rSize , 1); // Get a Read Size - if (rBuf==NULL) { - fclose_(fp); - printf("out of memory : grf compress entry table buffer\n"); - return 3; - } - grf_filelist = calloc( eSize , 1); // Get a Extend Size - if (grf_filelist==NULL) { - free(rBuf); - fclose_(fp); - printf("out of memory : grf extract entry table buffer\n"); - return 3; - } - fread(rBuf,1,rSize,fp); - fclose_(fp); - decode_zip(grf_filelist,&eSize,rBuf,rSize); // Decode function - list_size = eSize; - free(rBuf); - - entrys = getlong(grf_header+0x26) - 7; - - // Get an entry - for(entry=0,ofs=0;entry<entrys;entry++){ - int ofs2,srclen,srccount,type; - FILELIST aentry; - - fname = grf_filelist+ofs; - if (strlen(fname)>sizeof(aentry.fn)-1) { - printf("grf : file name too long : %s\n",fname); - free(grf_filelist); - exit(1); - } - ofs2 = ofs+strlen(grf_filelist+ofs)+1; - type = grf_filelist[ofs2+12]; - if(type==1 || type==3 || type==5) { - srclen=getlong(grf_filelist+ofs2); - if (grf_filelist[ofs2+12]==3) { - for(lop=10,srccount=1;srclen>=lop;lop=lop*10,srccount++); - } else if (grf_filelist[ofs2+12]==5) { - srccount = 0; - } else { // if (grf_filelist[ofs2+12]==1) { - srccount = -1; - } - - aentry.srclen = srclen; - aentry.srclen_aligned = getlong(grf_filelist+ofs2+4); - aentry.declen = getlong(grf_filelist+ofs2+8); - aentry.srcpos = getlong(grf_filelist+ofs2+13)+0x2e; - aentry.cycle = srccount; - aentry.type = type; - strncpy(aentry.fn,fname,sizeof(aentry.fn)-1); + filelist_modify (&aentry); + } + ofs = ofs2 + 17; + } + free (grf_filelist); + + } + else if (grf_version == 0x02) + { //****** Grf version 02xx ****** + unsigned char eheader[8]; + unsigned char *rBuf; + uLongf rSize, eSize; + + fread (eheader, 1, 8, fp); + rSize = getlong (eheader); // Read Size + eSize = getlong (eheader + 4); // Extend Size + + if (rSize > grf_size - ftell (fp)) + { + fclose_ (fp); + printf ("Illegal data format : grf compress entry size\n"); + return 4; + } + + rBuf = calloc (rSize, 1); // Get a Read Size + if (rBuf == NULL) + { + fclose_ (fp); + printf ("out of memory : grf compress entry table buffer\n"); + return 3; + } + grf_filelist = calloc (eSize, 1); // Get a Extend Size + if (grf_filelist == NULL) + { + free (rBuf); + fclose_ (fp); + printf ("out of memory : grf extract entry table buffer\n"); + return 3; + } + fread (rBuf, 1, rSize, fp); + fclose_ (fp); + decode_zip (grf_filelist, &eSize, rBuf, rSize); // Decode function + list_size = eSize; + free (rBuf); + + entrys = getlong (grf_header + 0x26) - 7; + + // Get an entry + for (entry = 0, ofs = 0; entry < entrys; entry++) + { + int ofs2, srclen, srccount, type; + FILELIST aentry; + + fname = grf_filelist + ofs; + if (strlen (fname) > sizeof (aentry.fn) - 1) + { + printf ("grf : file name too long : %s\n", fname); + free (grf_filelist); + exit (1); + } + ofs2 = ofs + strlen (grf_filelist + ofs) + 1; + type = grf_filelist[ofs2 + 12]; + if (type == 1 || type == 3 || type == 5) + { + srclen = getlong (grf_filelist + ofs2); + if (grf_filelist[ofs2 + 12] == 3) + { + for (lop = 10, srccount = 1; srclen >= lop; + lop = lop * 10, srccount++); + } + else if (grf_filelist[ofs2 + 12] == 5) + { + srccount = 0; + } + else + { // if (grf_filelist[ofs2+12]==1) { + srccount = -1; + } + + aentry.srclen = srclen; + aentry.srclen_aligned = getlong (grf_filelist + ofs2 + 4); + aentry.declen = getlong (grf_filelist + ofs2 + 8); + aentry.srcpos = getlong (grf_filelist + ofs2 + 13) + 0x2e; + aentry.cycle = srccount; + aentry.type = type; + strncpy (aentry.fn, fname, sizeof (aentry.fn) - 1); #ifdef GRFIO_LOCAL - aentry.gentry = -(gentry+1); // As Flag for making it a negative number carrying out the first time LocalFileCheck + aentry.gentry = -(gentry + 1); // As Flag for making it a negative number carrying out the first time LocalFileCheck #else - aentry.gentry = gentry+1; // With no first time LocalFileCheck + aentry.gentry = gentry + 1; // With no first time LocalFileCheck #endif - filelist_modify(&aentry); - } - ofs = ofs2 + 17; - } - free(grf_filelist); + filelist_modify (&aentry); + } + ofs = ofs2 + 17; + } + free (grf_filelist); - } else { //****** Grf Other version ****** - fclose_(fp); - printf("not support grf versions : %04x\n",getlong(grf_header+0x2a)); - return 4; - } + } + else + { //****** Grf Other version ****** + fclose_ (fp); + printf ("not support grf versions : %04x\n", + getlong (grf_header + 0x2a)); + return 4; + } - filelist_adjust(); // Unnecessary area release of filelist + filelist_adjust (); // Unnecessary area release of filelist - return 0; // 0:no error + return 0; // 0:no error } /*========================================== * Grfio : Resource file check *------------------------------------------ */ -static void grfio_resourcecheck() +static void grfio_resourcecheck () { - int size; - unsigned char *buf,*ptr; - char w1[256],w2[256],src[256],dst[256]; - FILELIST *entry; - - buf=grfio_reads("data\\resnametable.txt",&size); - buf[size] = 0; - - for(ptr=buf;ptr-buf<size;) { - if(sscanf(ptr,"%[^#]#%[^#]#",w1,w2)==2){ - if(strstr(w2,"bmp")){ - sprintf(src,"data\\texture\\%s",w1); - sprintf(dst,"data\\texture\\%s",w2); - } else { - sprintf(src,"data\\%s",w1); - sprintf(dst,"data\\%s",w2); - } - entry = filelist_find(dst); - if (entry!=NULL) { - FILELIST fentry; - memcpy( &fentry, entry, sizeof(FILELIST) ); - strncpy( fentry.fn ,src, sizeof(fentry.fn)-1 ); - filelist_modify(&fentry); - } else { - //printf("file not found in data.grf : %s < %s\n",dst,src); - } - } - ptr = strchr(ptr,'\n'); // Next line - if (!ptr) break; - ptr++; - } - free(buf); - filelist_adjust(); // Unnecessary area release of filelist + int size; + unsigned char *buf, *ptr; + char w1[256], w2[256], src[256], dst[256]; + FILELIST *entry; + + buf = grfio_reads ("data\\resnametable.txt", &size); + buf[size] = 0; + + for (ptr = buf; ptr - buf < size;) + { + if (sscanf (ptr, "%[^#]#%[^#]#", w1, w2) == 2) + { + if (strstr (w2, "bmp")) + { + sprintf (src, "data\\texture\\%s", w1); + sprintf (dst, "data\\texture\\%s", w2); + } + else + { + sprintf (src, "data\\%s", w1); + sprintf (dst, "data\\%s", w2); + } + entry = filelist_find (dst); + if (entry != NULL) + { + FILELIST fentry; + memcpy (&fentry, entry, sizeof (FILELIST)); + strncpy (fentry.fn, src, sizeof (fentry.fn) - 1); + filelist_modify (&fentry); + } + else + { + //printf("file not found in data.grf : %s < %s\n",dst,src); + } + } + ptr = strchr (ptr, '\n'); // Next line + if (!ptr) + break; + ptr++; + } + free (buf); + filelist_adjust (); // Unnecessary area release of filelist } /*========================================== * Grfio : Resource add *------------------------------------------ */ -#define GENTRY_ADDS 16 // The number increment of gentry_table entries +#define GENTRY_ADDS 16 // The number increment of gentry_table entries -int grfio_add(char *fname) +int grfio_add (char *fname) { - int len,result; - char *buf; - - if (gentry_entrys>=GENTRY_LIMIT) { - printf("gentrys limit : grfio_add\n"); - exit(1); - } - - printf("%s file reading...\n",fname); - - if (gentry_entrys>=gentry_maxentry) { - char **new_gentry = (char**)realloc( - (void*)gentry_table,(gentry_maxentry+GENTRY_ADDS)*sizeof(char*) ); - if (new_gentry!=NULL) { - int lop; - gentry_table = new_gentry; - gentry_maxentry += GENTRY_ADDS; - for(lop=gentry_entrys;lop<gentry_maxentry;lop++) - gentry_table[lop] = NULL; - } else { - printf("out of memory : grfio_add\n"); - exit(1); - } - } - len = strlen( fname ); - buf = calloc(len+1, 1); - if (buf==NULL) { - printf("out of memory : gentry\n"); - exit(1); - } - strcpy( buf, fname ); - gentry_table[gentry_entrys++] = buf; - - result = grfio_entryread(fname,gentry_entrys-1); - - if (result==0) { - // Resource check - grfio_resourcecheck(); - } - - return result; + int len, result; + char *buf; + + if (gentry_entrys >= GENTRY_LIMIT) + { + printf ("gentrys limit : grfio_add\n"); + exit (1); + } + + printf ("%s file reading...\n", fname); + + if (gentry_entrys >= gentry_maxentry) + { + char **new_gentry = (char **) realloc ((void *) gentry_table, + (gentry_maxentry + + GENTRY_ADDS) * + sizeof (char *)); + if (new_gentry != NULL) + { + int lop; + gentry_table = new_gentry; + gentry_maxentry += GENTRY_ADDS; + for (lop = gentry_entrys; lop < gentry_maxentry; lop++) + gentry_table[lop] = NULL; + } + else + { + printf ("out of memory : grfio_add\n"); + exit (1); + } + } + len = strlen (fname); + buf = calloc (len + 1, 1); + if (buf == NULL) + { + printf ("out of memory : gentry\n"); + exit (1); + } + strcpy (buf, fname); + gentry_table[gentry_entrys++] = buf; + + result = grfio_entryread (fname, gentry_entrys - 1); + + if (result == 0) + { + // Resource check + grfio_resourcecheck (); + } + + return result; } /*========================================== * Grfio : Finalize *------------------------------------------ */ -void grfio_final(void) +void grfio_final (void) { - int lop; - - if (filelist!=NULL) free(filelist); - filelist = NULL; - filelist_entrys = filelist_maxentry = 0; - - if (gentry_table!=NULL) { - for(lop=0;lop<gentry_entrys;lop++) { - if (gentry_table[lop]!=NULL) { - free(gentry_table[lop]); - } - } - free(gentry_table); - } - gentry_table = NULL; - gentry_entrys = gentry_maxentry = 0; + int lop; + + if (filelist != NULL) + free (filelist); + filelist = NULL; + filelist_entrys = filelist_maxentry = 0; + + if (gentry_table != NULL) + { + for (lop = 0; lop < gentry_entrys; lop++) + { + if (gentry_table[lop] != NULL) + { + free (gentry_table[lop]); + } + } + free (gentry_table); + } + gentry_table = NULL; + gentry_entrys = gentry_maxentry = 0; } /*========================================== * Grfio : Initialize *------------------------------------------ */ -void grfio_init(char *fname) +void grfio_init (char *fname) { - FILE *data_conf; - char line[1024], w1[1024], w2[1024]; - int result = 0, result2 = 0, result3 = 0; - - data_conf = fopen_(fname, "r"); - - // It will read, if there is grf-files.txt. - if (data_conf) { - while(fgets(line, 1020, data_conf)) { - if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) { - if(strcmp(w1, "data") == 0) - strcpy(data_file, w2); - else if(strcmp(w1, "sdata") == 0) - strcpy(sdata_file, w2); - else if(strcmp(w1, "adata") == 0) - strcpy(adata_file, w2); - else if(strcmp(w1,"data_dir") == 0) - strcpy(data_dir, w2); - } - } - - fclose_(data_conf); - printf("read %s done\n",fname); - } // end of reading grf-files.txt - - hashinit(); // hash table initialization - - filelist = NULL; filelist_entrys = filelist_maxentry = 0; - gentry_table = NULL; gentry_entrys = gentry_maxentry = 0; - atexit(grfio_final); // End processing definition - - // Entry table reading - - if (strcmp(data_file, "") != 0) // If data directive exists in grf-files.txt (i.e. data_file is not equal to "") - result = grfio_add(data_file); // Primary data file - - if (strcmp(sdata_file, "") != 0) // If sdata directive exists in grf-files.txt (i.e. sdata_file is not equal to "") - result2 = grfio_add(sdata_file); // Sakray data file - - if (strcmp(adata_file, "") != 0) // If data directive exists in grf-files.txt (i.e. adata_file is not equal to "") - result3 = grfio_add(adata_file); // Alpha version data file - - if (result != 0 && result2 != 0 && result3 != 0) { - printf("not grf file readed exit!!\n"); - exit(1); // It ends, if a resource cannot read one. - } + FILE *data_conf; + char line[1024], w1[1024], w2[1024]; + int result = 0, result2 = 0, result3 = 0; + + data_conf = fopen_ (fname, "r"); + + // It will read, if there is grf-files.txt. + if (data_conf) + { + while (fgets (line, 1020, data_conf)) + { + if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) == 2) + { + if (strcmp (w1, "data") == 0) + strcpy (data_file, w2); + else if (strcmp (w1, "sdata") == 0) + strcpy (sdata_file, w2); + else if (strcmp (w1, "adata") == 0) + strcpy (adata_file, w2); + else if (strcmp (w1, "data_dir") == 0) + strcpy (data_dir, w2); + } + } + + fclose_ (data_conf); + printf ("read %s done\n", fname); + } // end of reading grf-files.txt + + hashinit (); // hash table initialization + + filelist = NULL; + filelist_entrys = filelist_maxentry = 0; + gentry_table = NULL; + gentry_entrys = gentry_maxentry = 0; + atexit (grfio_final); // End processing definition + + // Entry table reading + + if (strcmp (data_file, "") != 0) // If data directive exists in grf-files.txt (i.e. data_file is not equal to "") + result = grfio_add (data_file); // Primary data file + + if (strcmp (sdata_file, "") != 0) // If sdata directive exists in grf-files.txt (i.e. sdata_file is not equal to "") + result2 = grfio_add (sdata_file); // Sakray data file + + if (strcmp (adata_file, "") != 0) // If data directive exists in grf-files.txt (i.e. adata_file is not equal to "") + result3 = grfio_add (adata_file); // Alpha version data file + + if (result != 0 && result2 != 0 && result3 != 0) + { + printf ("not grf file readed exit!!\n"); + exit (1); // It ends, if a resource cannot read one. + } } diff --git a/src/common/grfio.h b/src/common/grfio.h index 53b9da8..5d3f69c 100644 --- a/src/common/grfio.h +++ b/src/common/grfio.h @@ -2,15 +2,15 @@ #ifndef _GRFIO_H_ #define _GRFIO_H_ -void grfio_init(char*); // GRFIO Initialize -int grfio_add(char*); // GRFIO Resource file add -void* grfio_read(char*); // GRFIO data file read -void* grfio_reads(char*,int*); // GRFIO data file read & size get -int grfio_size(char*); // GRFIO data file size get +void grfio_init (char *); // GRFIO Initialize +int grfio_add (char *); // GRFIO Resource file add +void *grfio_read (char *); // GRFIO data file read +void *grfio_reads (char *, int *); // GRFIO data file read & size get +int grfio_size (char *); // GRFIO data file size get // Accessor to GRF filenames -char *grfio_setdatafile(const char *str); -char *grfio_setadatafile(const char *str); -char *grfio_setsdatafile(const char *str); +char *grfio_setdatafile (const char *str); +char *grfio_setadatafile (const char *str); +char *grfio_setsdatafile (const char *str); -#endif // _GRFIO_H_ +#endif // _GRFIO_H_ diff --git a/src/common/lock.c b/src/common/lock.c index 42bbff0..7409baf 100644 --- a/src/common/lock.c +++ b/src/common/lock.c @@ -8,32 +8,38 @@ // (書き込みが終わるまで、旧ファイルを保管しておく) // 新しいファイルの書き込み開始 -FILE* lock_fopen(const char* filename,int *info) { - char newfile[512]; - FILE *fp; - int no = getpid(); +FILE *lock_fopen (const char *filename, int *info) +{ + char newfile[512]; + FILE *fp; + int no = getpid (); - // 安全なファイル名を得る(手抜き) - do { - sprintf(newfile,"%s_%d.tmp",filename,no++); - } while((fp = fopen_(newfile,"r")) && fclose_(fp)); - *info = --no; - return fopen_(newfile,"w"); + // 安全なファイル名を得る(手抜き) + do + { + sprintf (newfile, "%s_%d.tmp", filename, no++); + } + while ((fp = fopen_ (newfile, "r")) && fclose_ (fp)); + *info = --no; + return fopen_ (newfile, "w"); } // 旧ファイルを削除&新ファイルをリネーム -int lock_fclose(FILE *fp,const char* filename,int *info) { - int ret = 0; - char newfile[512]; - if(fp != NULL) { - ret = fclose_(fp); - sprintf(newfile,"%s_%d.tmp",filename,*info); - remove(filename); - // このタイミングで落ちると最悪。 - rename(newfile,filename); - return ret; - } else { - return 1; - } +int lock_fclose (FILE * fp, const char *filename, int *info) +{ + int ret = 0; + char newfile[512]; + if (fp != NULL) + { + ret = fclose_ (fp); + sprintf (newfile, "%s_%d.tmp", filename, *info); + remove (filename); + // このタイミングで落ちると最悪。 + rename (newfile, filename); + return ret; + } + else + { + return 1; + } } - diff --git a/src/common/lock.h b/src/common/lock.h index 795bf88..6175241 100644 --- a/src/common/lock.h +++ b/src/common/lock.h @@ -1,8 +1,7 @@ #ifndef _LOCK_H_ #define _LOCK_H_ -FILE* lock_fopen(const char* filename,int *info); -int lock_fclose(FILE *fp,const char* filename,int *info); +FILE *lock_fopen (const char *filename, int *info); +int lock_fclose (FILE * fp, const char *filename, int *info); #endif - diff --git a/src/common/malloc.c b/src/common/malloc.c index eda9bc2..3b302b7 100644 --- a/src/common/malloc.c +++ b/src/common/malloc.c @@ -2,43 +2,52 @@ #include <stdlib.h> #include "malloc.h" -void* aMalloc_( size_t size, const char *file, int line, const char *func ) +void *aMalloc_ (size_t size, const char *file, int line, const char *func) { - void *ret; - -// printf("%s:%d: in func %s: malloc %d\n",file,line,func,size); - ret=malloc(size); - if(ret==NULL){ - printf("%s:%d: in func %s: malloc error out of memory!\n",file,line,func); - exit(1); - - } - return ret; + void *ret; + +// printf("%s:%d: in func %s: malloc %d\n",file,line,func,size); + ret = malloc (size); + if (ret == NULL) + { + printf ("%s:%d: in func %s: malloc error out of memory!\n", file, + line, func); + exit (1); + + } + return ret; } -void* aCalloc_( size_t num, size_t size, const char *file, int line, const char *func ) + +void *aCalloc_ (size_t num, size_t size, const char *file, int line, + const char *func) { - void *ret; - -// printf("%s:%d: in func %s: calloc %d %d\n",file,line,func,num,size); - ret=calloc(num,size); - if(ret==NULL){ - printf("%s:%d: in func %s: calloc error out of memory!\n",file,line,func); - exit(1); - - } - return ret; + void *ret; + +// printf("%s:%d: in func %s: calloc %d %d\n",file,line,func,num,size); + ret = calloc (num, size); + if (ret == NULL) + { + printf ("%s:%d: in func %s: calloc error out of memory!\n", file, + line, func); + exit (1); + + } + return ret; } -void* aRealloc_( void *p, size_t size, const char *file, int line, const char *func ) +void *aRealloc_ (void *p, size_t size, const char *file, int line, + const char *func) { - void *ret; - -// printf("%s:%d: in func %s: realloc %p %d\n",file,line,func,p,size); - ret=realloc(p,size); - if(ret==NULL){ - printf("%s:%d: in func %s: realloc error out of memory!\n",file,line,func); - exit(1); - - } - return ret; + void *ret; + +// printf("%s:%d: in func %s: realloc %p %d\n",file,line,func,p,size); + ret = realloc (p, size); + if (ret == NULL) + { + printf ("%s:%d: in func %s: realloc error out of memory!\n", file, + line, func); + exit (1); + + } + return ret; } diff --git a/src/common/malloc.h b/src/common/malloc.h index da16f06..3195773 100644 --- a/src/common/malloc.h +++ b/src/common/malloc.h @@ -13,9 +13,9 @@ #define ALC_MARK __FILE__, __LINE__, __func__ -void* aMalloc_ (size_t, const char *, int, const char *); -void* aCalloc_ (size_t, size_t, const char *, int, const char *); -void* aRealloc_ (void *, size_t, const char *, int, const char *); +void *aMalloc_ (size_t, const char *, int, const char *); +void *aCalloc_ (size_t, size_t, const char *, int, const char *); +void *aRealloc_ (void *, size_t, const char *, int, const char *); #define aMalloc(n) aMalloc_(n,ALC_MARK) #define aMallocA(n) aMalloc_(n,ALC_MARK) @@ -25,5 +25,4 @@ void* aRealloc_ (void *, size_t, const char *, int, const char *); #define aStrdup(p) aStrdup_(p,ALC_MARK) #define aFree(p) aFree_(p,ALC_MARK) - #endif diff --git a/src/common/mmo.h b/src/common/mmo.h index 1ba3ee4..0e70852 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -5,12 +5,12 @@ #define _MMO_H_ #include <time.h> -#include "utils.h" // LCCWIN32 +#include "utils.h" // LCCWIN32 #ifdef CYGWIN -#define RETCODE "\r\n" // (CR/LF:Windows系) +#define RETCODE "\r\n" // (CR/LF:Windows系) #else -#define RETCODE "\n" // (LF:Unix系) +#define RETCODE "\n" // (LF:Unix系) #endif #define FIFOSIZE_SERVERLINK 256*1024 @@ -24,7 +24,7 @@ #define MAX_MAP_PER_SERVER 512 #define MAX_INVENTORY 100 #define MAX_AMOUNT 30000 -#define MAX_ZENY 1000000000 // 1G zeny +#define MAX_ZENY 1000000000 // 1G zeny #define MAX_CART 100 #define MAX_SKILL 450 #define GLOBAL_REG_NUM 96 @@ -36,12 +36,12 @@ #define MAX_STORAGE 300 #define MAX_GUILD_STORAGE 1000 #define MAX_PARTY 12 -#define MAX_GUILD 36 // increased max guild members to accomodate for +2 increase for extension levels [Valaris] (removed) [PoW] -#define MAX_GUILDPOSITION 20 // increased max guild positions to accomodate for all members [Valaris] (removed) [PoW] +#define MAX_GUILD 36 // increased max guild members to accomodate for +2 increase for extension levels [Valaris] (removed) [PoW] +#define MAX_GUILDPOSITION 20 // increased max guild positions to accomodate for all members [Valaris] (removed) [PoW] #define MAX_GUILDEXPLUSION 32 #define MAX_GUILDALLIANCE 16 #define MAX_GUILDSKILL 8 -#define MAX_GUILDCASTLE 24 // increased to include novice castles [Valaris] +#define MAX_GUILDCASTLE 24 // increased to include novice castles [Valaris] #define MAX_GUILDLEVEL 50 #define MIN_HAIR_STYLE battle_config.min_hair_style @@ -65,207 +65,226 @@ #define CHAR_CONF_NAME "conf/char_athena.conf" -struct item { - int id; - short nameid; - short amount; - unsigned short equip; - char identify; - char refine; - char attribute; - short card[4]; - short broken; +struct item +{ + int id; + short nameid; + short amount; + unsigned short equip; + char identify; + char refine; + char attribute; + short card[4]; + short broken; }; -struct point{ - char map[24]; - short x,y; +struct point +{ + char map[24]; + short x, y; }; -struct skill { - unsigned short id,lv,flags; +struct skill +{ + unsigned short id, lv, flags; }; -struct global_reg { - char str[32]; - int value; +struct global_reg +{ + char str[32]; + int value; }; -struct mmo_charstatus { - int char_id; - int account_id; - int partner_id; - - int base_exp,job_exp,zeny; - - short class; - short status_point,skill_point; - int hp,max_hp,sp,max_sp; - short option,karma,manner; - short hair,hair_color,clothes_color; - int party_id,guild_id; - - short weapon,shield; - short head_top,head_mid,head_bottom; - - char name[24]; - unsigned char base_level,job_level; - short str,agi,vit,int_,dex,luk; - unsigned char char_num,sex; - - unsigned long mapip; - unsigned int mapport; - - struct point last_point,save_point,memo_point[10]; - struct item inventory[MAX_INVENTORY],cart[MAX_CART]; - struct skill skill[MAX_SKILL]; - int global_reg_num; - struct global_reg global_reg[GLOBAL_REG_NUM]; - int account_reg_num; - struct global_reg account_reg[ACCOUNT_REG_NUM]; - int account_reg2_num; - struct global_reg account_reg2[ACCOUNT_REG2_NUM]; +struct mmo_charstatus +{ + int char_id; + int account_id; + int partner_id; + + int base_exp, job_exp, zeny; + + short class; + short status_point, skill_point; + int hp, max_hp, sp, max_sp; + short option, karma, manner; + short hair, hair_color, clothes_color; + int party_id, guild_id; + + short weapon, shield; + short head_top, head_mid, head_bottom; + + char name[24]; + unsigned char base_level, job_level; + short str, agi, vit, int_, dex, luk; + unsigned char char_num, sex; + + unsigned long mapip; + unsigned int mapport; + + struct point last_point, save_point, memo_point[10]; + struct item inventory[MAX_INVENTORY], cart[MAX_CART]; + struct skill skill[MAX_SKILL]; + int global_reg_num; + struct global_reg global_reg[GLOBAL_REG_NUM]; + int account_reg_num; + struct global_reg account_reg[ACCOUNT_REG_NUM]; + int account_reg2_num; + struct global_reg account_reg2[ACCOUNT_REG2_NUM]; }; -struct storage { - int dirty; - int account_id; - short storage_status; - short storage_amount; - struct item storage_[MAX_STORAGE]; +struct storage +{ + int dirty; + int account_id; + short storage_status; + short storage_amount; + struct item storage_[MAX_STORAGE]; }; -struct guild_storage { - int dirty; - int guild_id; - short storage_status; - short storage_amount; - struct item storage_[MAX_GUILD_STORAGE]; +struct guild_storage +{ + int dirty; + int guild_id; + short storage_status; + short storage_amount; + struct item storage_[MAX_GUILD_STORAGE]; }; struct map_session_data; -struct gm_account { - int account_id; - int level; +struct gm_account +{ + int account_id; + int level; }; -struct party_member { - int account_id; - char name[24],map[24]; - int leader,online,lv; - struct map_session_data *sd; +struct party_member +{ + int account_id; + char name[24], map[24]; + int leader, online, lv; + struct map_session_data *sd; }; -struct party { - int party_id; - char name[24]; - int exp; - int item; - struct party_member member[MAX_PARTY]; +struct party +{ + int party_id; + char name[24]; + int exp; + int item; + struct party_member member[MAX_PARTY]; }; -struct guild_member { - int account_id, char_id; - short hair,hair_color,gender,class,lv; - int exp,exp_payper; - short online,position; - int rsv1,rsv2; - char name[24]; - struct map_session_data *sd; +struct guild_member +{ + int account_id, char_id; + short hair, hair_color, gender, class, lv; + int exp, exp_payper; + short online, position; + int rsv1, rsv2; + char name[24]; + struct map_session_data *sd; }; -struct guild_position { - char name[24]; - int mode; - int exp_mode; +struct guild_position +{ + char name[24]; + int mode; + int exp_mode; }; -struct guild_alliance { - int opposition; - int guild_id; - char name[24]; +struct guild_alliance +{ + int opposition; + int guild_id; + char name[24]; }; -struct guild_explusion { - char name[24]; - char mes[40]; - char acc[40]; - int account_id; - int rsv1,rsv2,rsv3; +struct guild_explusion +{ + char name[24]; + char mes[40]; + char acc[40]; + int account_id; + int rsv1, rsv2, rsv3; }; -struct guild_skill { - int id,lv; +struct guild_skill +{ + int id, lv; }; -struct guild { - int guild_id; - short guild_lv, connect_member, max_member, average_lv; - int exp,next_exp,skill_point,castle_id; - char name[24],master[24]; - struct guild_member member[MAX_GUILD]; - struct guild_position position[MAX_GUILDPOSITION]; - char mes1[60],mes2[120]; - int emblem_len,emblem_id; - char emblem_data[2048]; - struct guild_alliance alliance[MAX_GUILDALLIANCE]; - struct guild_explusion explusion[MAX_GUILDEXPLUSION]; - struct guild_skill skill[MAX_GUILDSKILL]; +struct guild +{ + int guild_id; + short guild_lv, connect_member, max_member, average_lv; + int exp, next_exp, skill_point, castle_id; + char name[24], master[24]; + struct guild_member member[MAX_GUILD]; + struct guild_position position[MAX_GUILDPOSITION]; + char mes1[60], mes2[120]; + int emblem_len, emblem_id; + char emblem_data[2048]; + struct guild_alliance alliance[MAX_GUILDALLIANCE]; + struct guild_explusion explusion[MAX_GUILDEXPLUSION]; + struct guild_skill skill[MAX_GUILDSKILL]; }; -struct guild_castle { - int castle_id; - char map_name[24]; - char castle_name[24]; - char castle_event[24]; - int guild_id; - int economy; - int defense; - int triggerE; - int triggerD; - int nextTime; - int payTime; - int createTime; - int visibleC; - int visibleG0; - int visibleG1; - int visibleG2; - int visibleG3; - int visibleG4; - int visibleG5; - int visibleG6; - int visibleG7; - int Ghp0; // added Guardian HP [Valaris] - int Ghp1; - int Ghp2; - int Ghp3; - int Ghp4; - int Ghp5; - int Ghp6; - int Ghp7; - int GID0; - int GID1; - int GID2; - int GID3; - int GID4; - int GID5; - int GID6; - int GID7; // end addition [Valaris] +struct guild_castle +{ + int castle_id; + char map_name[24]; + char castle_name[24]; + char castle_event[24]; + int guild_id; + int economy; + int defense; + int triggerE; + int triggerD; + int nextTime; + int payTime; + int createTime; + int visibleC; + int visibleG0; + int visibleG1; + int visibleG2; + int visibleG3; + int visibleG4; + int visibleG5; + int visibleG6; + int visibleG7; + int Ghp0; // added Guardian HP [Valaris] + int Ghp1; + int Ghp2; + int Ghp3; + int Ghp4; + int Ghp5; + int Ghp6; + int Ghp7; + int GID0; + int GID1; + int GID2; + int GID3; + int GID4; + int GID5; + int GID6; + int GID7; // end addition [Valaris] }; -struct square { - int val1[5]; - int val2[5]; +struct square +{ + int val1[5]; + int val2[5]; }; -enum { - GBI_EXP =1, // ギルドのEXP - GBI_GUILDLV =2, // ギルドのLv - GBI_SKILLPOINT =3, // ギルドのスキルポイント - GBI_SKILLLV =4, // ギルドスキルLv +enum +{ + GBI_EXP = 1, // ギルドのEXP + GBI_GUILDLV = 2, // ギルドのLv + GBI_SKILLPOINT = 3, // ギルドのスキルポイント + GBI_SKILLLV = 4, // ギルドスキルLv - GMI_POSITION =0, // メンバーの役職変更 - GMI_EXP =1, // メンバーのEXP + GMI_POSITION = 0, // メンバーの役職変更 + GMI_EXP = 1, // メンバーのEXP }; @@ -284,4 +303,4 @@ enum { #endif #endif -#endif // _MMO_H_ +#endif // _MMO_H_ diff --git a/src/common/mt_rand.c b/src/common/mt_rand.c index fc9a9ec..627d9dd 100644 --- a/src/common/mt_rand.c +++ b/src/common/mt_rand.c @@ -48,72 +48,71 @@ #include <time.h> #include "mt_rand.h" -#define N (624) /* length of state vector */ -#define M (397) /* a period parameter */ -#define K (0x9908B0DFU) /* a magic constant */ -#define hiBit(u) ((u) & 0x80000000U) /* mask all but highest bit of u */ -#define loBit(u) ((u) & 0x00000001U) /* mask all but lowest bit of u */ -#define loBits(u) ((u) & 0x7FFFFFFFU) /* mask the highest bit of u */ -#define mixBits(u, v) (hiBit(u)|loBits(v)) /* move hi bit of u to hi bit of v */ - -static unsigned long state[N+1]; /* state vector + 1 extra to not violate ANSI C */ -static unsigned long *next; /* next random value is computed from here */ -static int left = -1; /* can *next++ this many times before reloading */ - - -void mt_seed(unsigned long seed) +#define N (624) /* length of state vector */ +#define M (397) /* a period parameter */ +#define K (0x9908B0DFU) /* a magic constant */ +#define hiBit(u) ((u) & 0x80000000U) /* mask all but highest bit of u */ +#define loBit(u) ((u) & 0x00000001U) /* mask all but lowest bit of u */ +#define loBits(u) ((u) & 0x7FFFFFFFU) /* mask the highest bit of u */ +#define mixBits(u, v) (hiBit(u)|loBits(v)) /* move hi bit of u to hi bit of v */ + +static unsigned long state[N + 1]; /* state vector + 1 extra to not violate ANSI C */ +static unsigned long *next; /* next random value is computed from here */ +static int left = -1; /* can *next++ this many times before reloading */ + +void mt_seed (unsigned long seed) { register unsigned long x = (seed | 1U) & 0xFFFFFFFFU, *s = state; - register int j; + register int j; - for(left=0, *s++=x, j=N; --j; - *s++ = (x*=69069U) & 0xFFFFFFFFU); + for (left = 0, *s++ = x, j = N; --j; *s++ = (x *= 69069U) & 0xFFFFFFFFU); } - -unsigned long mt_reload(void) +unsigned long mt_reload (void) { - register unsigned long *p0=state, *p2=state+2, *pM=state+M, s0, s1; - register int j; + register unsigned long *p0 = state, *p2 = state + 2, *pM = + state + M, s0, s1; + register int j; - if(left < -1) - mt_seed(time(NULL)); + if (left < -1) + mt_seed (time (NULL)); - left=N-1, next=state+1; + left = N - 1, next = state + 1; - for(s0=state[0], s1=state[1], j=N-M+1; --j; s0=s1, s1=*p2++) - *p0++ = *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U); + for (s0 = state[0], s1 = state[1], j = N - M + 1; --j; + s0 = s1, s1 = *p2++) + *p0++ = *pM++ ^ (mixBits (s0, s1) >> 1) ^ (loBit (s1) ? K : 0U); - for(pM=state, j=M; --j; s0=s1, s1=*p2++) - *p0++ = *pM++ ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U); + for (pM = state, j = M; --j; s0 = s1, s1 = *p2++) + *p0++ = *pM++ ^ (mixBits (s0, s1) >> 1) ^ (loBit (s1) ? K : 0U); - s1=state[0], *p0 = *pM ^ (mixBits(s0, s1) >> 1) ^ (loBit(s1) ? K : 0U); + s1 = state[0], *p0 = + *pM ^ (mixBits (s0, s1) >> 1) ^ (loBit (s1) ? K : 0U); s1 ^= (s1 >> 11); - s1 ^= (s1 << 7) & 0x9D2C5680U; + s1 ^= (s1 << 7) & 0x9D2C5680U; s1 ^= (s1 << 15) & 0xEFC60000U; - return(s1 ^ (s1 >> 18)); + return (s1 ^ (s1 >> 18)); } - -unsigned long mt_random(void) +unsigned long mt_random (void) { unsigned long y; - if(--left < 0) - return(mt_reload()); + if (--left < 0) + return (mt_reload ()); - y = *next++; + y = *next++; y ^= (y >> 11); - y ^= (y << 7) & 0x9D2C5680U; + y ^= (y << 7) & 0x9D2C5680U; y ^= (y << 15) & 0xEFC60000U; - return(y ^ (y >> 18)); + return (y ^ (y >> 18)); } -int mt_rand(void) { - unsigned long r = mt_random(); - while (r >> 16) - r = (r & 0xFFFF) + (r >> 16); +int mt_rand (void) +{ + unsigned long r = mt_random (); + while (r >> 16) + r = (r & 0xFFFF) + (r >> 16); - return(r); + return (r); } - diff --git a/src/common/mt_rand.h b/src/common/mt_rand.h index bda5861..d798fee 100644 --- a/src/common/mt_rand.h +++ b/src/common/mt_rand.h @@ -1,9 +1,9 @@ #ifndef __mt_rand_h #define __mt_rand_h -void mt_seed(unsigned long seed); -unsigned long mt_reload(void); -unsigned long mt_random(void); -int mt_rand(void); +void mt_seed (unsigned long seed); +unsigned long mt_reload (void); +unsigned long mt_random (void); +int mt_rand (void); #endif /* __mt_rand_h */ diff --git a/src/common/nullpo.c b/src/common/nullpo.c index 5fbf5fc..daeca9f 100644 --- a/src/common/nullpo.c +++ b/src/common/nullpo.c @@ -4,87 +4,83 @@ #include "nullpo.h" // #include "logs.h" // 布石してみる -static void nullpo_info_core(const char *file, int line, const char *func, - const char *fmt, va_list ap); +static void nullpo_info_core (const char *file, int line, const char *func, + const char *fmt, va_list ap); /*====================================== * Nullチェック 及び 情報出力 *-------------------------------------- */ -int nullpo_chk_f(const char *file, int line, const char *func, const void *target, - const char *fmt, ...) +int nullpo_chk_f (const char *file, int line, const char *func, + const void *target, const char *fmt, ...) { - va_list ap; - - if (target != NULL) - return 0; - - va_start(ap, fmt); - nullpo_info_core(file, line, func, fmt, ap); - va_end(ap); - return 1; + va_list ap; + + if (target != NULL) + return 0; + + va_start (ap, fmt); + nullpo_info_core (file, line, func, fmt, ap); + va_end (ap); + return 1; } -int nullpo_chk(const char *file, int line, const char *func, const void *target) +int nullpo_chk (const char *file, int line, const char *func, + const void *target) { - if (target != NULL) - return 0; - - nullpo_info_core(file, line, func, NULL, NULL); - return 1; -} + if (target != NULL) + return 0; + nullpo_info_core (file, line, func, NULL, NULL); + return 1; +} /*====================================== * nullpo情報出力(外部呼出し向けラッパ) *-------------------------------------- */ -void nullpo_info_f(const char *file, int line, const char *func, - const char *fmt, ...) +void nullpo_info_f (const char *file, int line, const char *func, + const char *fmt, ...) { - va_list ap; - - va_start(ap, fmt); - nullpo_info_core(file, line, func, fmt, ap); - va_end(ap); + va_list ap; + + va_start (ap, fmt); + nullpo_info_core (file, line, func, fmt, ap); + va_end (ap); } -void nullpo_info(const char *file, int line, const char *func) +void nullpo_info (const char *file, int line, const char *func) { - nullpo_info_core(file, line, func, NULL, NULL); + nullpo_info_core (file, line, func, NULL, NULL); } - /*====================================== * nullpo情報出力(Main) *-------------------------------------- */ -static void nullpo_info_core(const char *file, int line, const char *func, - const char *fmt, va_list ap) +static void nullpo_info_core (const char *file, int line, const char *func, + const char *fmt, va_list ap) { - if (file == NULL) - file = "??"; - - func = - func == NULL ? "unknown": - func[0] == '\0' ? "unknown": - func; - - printf("--- nullpo info --------------------------------------------\n"); - printf("%s:%d: in func `%s'\n", file, line, func); - if (fmt != NULL) - { - if (fmt[0] != '\0') - { - vprintf(fmt, ap); - - // 最後に改行したか確認 - if (fmt[strlen(fmt)-1] != '\n') - printf("\n"); - } - } - printf("--- end nullpo info ----------------------------------------\n"); - - // ここらでnullpoログをファイルに書き出せたら - // まとめて提出できるなと思っていたり。 + if (file == NULL) + file = "??"; + + func = func == NULL ? "unknown" : func[0] == '\0' ? "unknown" : func; + + printf ("--- nullpo info --------------------------------------------\n"); + printf ("%s:%d: in func `%s'\n", file, line, func); + if (fmt != NULL) + { + if (fmt[0] != '\0') + { + vprintf (fmt, ap); + + // 最後に改行したか確認 + if (fmt[strlen (fmt) - 1] != '\n') + printf ("\n"); + } + } + printf ("--- end nullpo info ----------------------------------------\n"); + + // ここらでnullpoログをファイルに書き出せたら + // まとめて提出できるなと思っていたり。 } diff --git a/src/common/nullpo.h b/src/common/nullpo.h index 2d33500..bac92cd 100644 --- a/src/common/nullpo.h +++ b/src/common/nullpo.h @@ -1,11 +1,9 @@ #ifndef _NULLPO_H_ #define _NULLPO_H_ - #define NULLPO_CHECK 1 - // 全体のスイッチを宣言しているヘッダがあれば - // そこに移動していただけると - + // 全体のスイッチを宣言しているヘッダがあれば + // そこに移動していただけると #if __STDC_VERSION__ < 199901L # if __GNUC__ >= 2 @@ -16,10 +14,9 @@ #endif #ifdef LCCWIN32 -#define __attribute__(x) /* nothing */ +#define __attribute__(x) /* nothing */ #endif - #define NLP_MARK __FILE__, __LINE__, __func__ /*---------------------------------------------------------------------------- @@ -87,7 +84,6 @@ #define nullpo_retr(ret, t) \ if (nullpo_chk(NLP_MARK, (void *)(t))) {return(ret);} - // 可変引数マクロに関する条件コンパイル #if __STDC_VERSION__ >= 199901L /* C99に対応 */ @@ -165,8 +161,8 @@ * 1 NULL *-------------------------------------- */ -int nullpo_chk(const char *file, int line, const char *func, const void *target); - +int nullpo_chk (const char *file, int line, const char *func, + const void *target); /*====================================== * nullpo_chk_f @@ -184,10 +180,9 @@ int nullpo_chk(const char *file, int line, const char *func, const void *target) * 1 NULL *-------------------------------------- */ -int nullpo_chk_f(const char *file, int line, const char *func, const void *target, - const char *fmt, ...) - __attribute__((format(printf,5,6))); - +int nullpo_chk_f (const char *file, int line, const char *func, + const void *target, const char *fmt, ...) + __attribute__ ((format (printf, 5, 6))); /*====================================== * nullpo_info @@ -199,8 +194,7 @@ int nullpo_chk_f(const char *file, int line, const char *func, const void *targe * これらには NLP_MARK を使うとよい *-------------------------------------- */ -void nullpo_info(const char *file, int line, const char *func); - +void nullpo_info (const char *file, int line, const char *func); /*====================================== * nullpo_info_f @@ -214,9 +208,8 @@ void nullpo_info(const char *file, int line, const char *func); * 備考や関係変数の書き出しなどに *-------------------------------------- */ -void nullpo_info_f(const char *file, int line, const char *func, - const char *fmt, ...) - __attribute__((format(printf,4,5))); - +void nullpo_info_f (const char *file, int line, const char *func, + const char *fmt, ...) + __attribute__ ((format (printf, 4, 5))); #endif diff --git a/src/common/socket.c b/src/common/socket.c index 886072e..dbf19c1 100644 --- a/src/common/socket.c +++ b/src/common/socket.c @@ -21,7 +21,7 @@ #include <fcntl.h> #include <string.h> -#include "mmo.h" // [Valaris] thanks to fov +#include "mmo.h" // [Valaris] thanks to fov #include "socket.h" #include "utils.h" @@ -30,24 +30,24 @@ #endif fd_set readfds; -int fd_max; -int currentuse; +int fd_max; +int currentuse; -int rfifo_size = 65536; -int wfifo_size = 65536; +int rfifo_size = 65536; +int wfifo_size = 65536; struct socket_data *session[FD_SETSIZE]; -static int null_parse(int fd); -static int (*default_func_parse)(int) = null_parse; +static int null_parse (int fd); +static int (*default_func_parse) (int) = null_parse; /*====================================== * CORE : Set function *-------------------------------------- */ -void set_defaultparse(int (*defaultparse)(int)) +void set_defaultparse (int (*defaultparse) (int)) { - default_func_parse = defaultparse; + default_func_parse = defaultparse; } /*====================================== @@ -55,84 +55,99 @@ void set_defaultparse(int (*defaultparse)(int)) *-------------------------------------- */ -static int recv_to_fifo(int fd) +static int recv_to_fifo (int fd) { - int len; - - //printf("recv_to_fifo : %d %d\n",fd,session[fd]->eof); - if(session[fd]->eof) - return -1; + int len; + //printf("recv_to_fifo : %d %d\n",fd,session[fd]->eof); + if (session[fd]->eof) + return -1; #ifdef LCCWIN32 - len = recv(fd,session[fd]->rdata+session[fd]->rdata_size, RFIFOSPACE(fd), 0); + len = + recv (fd, session[fd]->rdata + session[fd]->rdata_size, + RFIFOSPACE (fd), 0); #else - len=read(fd,session[fd]->rdata+session[fd]->rdata_size,RFIFOSPACE(fd)); + len = + read (fd, session[fd]->rdata + session[fd]->rdata_size, + RFIFOSPACE (fd)); #endif -// printf (":::RECEIVE:::\n"); -// dump(session[fd]->rdata, len); printf ("\n"); - - //{ int i; printf("recv %d : ",fd); for(i=0;i<len;i++){ printf("%02x ",RFIFOB(fd,session[fd]->rdata_size+i)); } printf("\n");} - if(len>0){ - session[fd]->rdata_size+=len; - if (!session[fd]->connected) session[fd]->connected = 1; - } else if(len<=0){ - // value of connection is not necessary the same -// if (fd == 4) // Removed [Yor] -// printf("Char-Server Has Disconnected.\n"); -// else if (fd == 5) // Removed [Yor] -// printf("Attempt To Log In Successful.\n"); -// else if (fd == 7) // Removed [Yor] -// printf("Char-Server Has Disconnected.\n"); -// else if (fd == 8) // Removed [Valaris] -// printf("%s has logged off your server.\n",RFIFOP(fd,6)); // Removed [Valaris] - -// else if (fd != 8) // [Valaris] - printf("set eof : connection #%d\n", fd); - session[fd]->eof=1; - } - return 0; +// printf (":::RECEIVE:::\n"); +// dump(session[fd]->rdata, len); printf ("\n"); + + //{ int i; printf("recv %d : ",fd); for(i=0;i<len;i++){ printf("%02x ",RFIFOB(fd,session[fd]->rdata_size+i)); } printf("\n");} + if (len > 0) + { + session[fd]->rdata_size += len; + if (!session[fd]->connected) + session[fd]->connected = 1; + } + else if (len <= 0) + { + // value of connection is not necessary the same +// if (fd == 4) // Removed [Yor] +// printf("Char-Server Has Disconnected.\n"); +// else if (fd == 5) // Removed [Yor] +// printf("Attempt To Log In Successful.\n"); +// else if (fd == 7) // Removed [Yor] +// printf("Char-Server Has Disconnected.\n"); +// else if (fd == 8) // Removed [Valaris] +// printf("%s has logged off your server.\n",RFIFOP(fd,6)); // Removed [Valaris] + +// else if (fd != 8) // [Valaris] + printf ("set eof : connection #%d\n", fd); + session[fd]->eof = 1; + } + return 0; } -static int send_from_fifo(int fd) +static int send_from_fifo (int fd) { - int len; + int len; - //printf("send_from_fifo : %d\n",fd); - if(session[fd]->eof) - return -1; + //printf("send_from_fifo : %d\n",fd); + if (session[fd]->eof) + return -1; #ifdef LCCWIN32 - len = send(fd, session[fd]->wdata,session[fd]->wdata_size, 0); + len = send (fd, session[fd]->wdata, session[fd]->wdata_size, 0); #else - len=write(fd,session[fd]->wdata,session[fd]->wdata_size); + len = write (fd, session[fd]->wdata, session[fd]->wdata_size); #endif -// printf (":::SEND:::\n"); -// dump(session[fd]->wdata, len); printf ("\n"); - - //{ int i; printf("send %d : ",fd); for(i=0;i<len;i++){ printf("%02x ",session[fd]->wdata[i]); } printf("\n");} - if(len>0){ - if(len<session[fd]->wdata_size){ - memmove(session[fd]->wdata,session[fd]->wdata+len,session[fd]->wdata_size-len); - session[fd]->wdata_size-=len; - } else { - session[fd]->wdata_size=0; - } - if (!session[fd]->connected) session[fd]->connected = 1; - } else { - printf("set eof :%d\n",fd); - session[fd]->eof=1; - } - return 0; +// printf (":::SEND:::\n"); +// dump(session[fd]->wdata, len); printf ("\n"); + + //{ int i; printf("send %d : ",fd); for(i=0;i<len;i++){ printf("%02x ",session[fd]->wdata[i]); } printf("\n");} + if (len > 0) + { + if (len < session[fd]->wdata_size) + { + memmove (session[fd]->wdata, session[fd]->wdata + len, + session[fd]->wdata_size - len); + session[fd]->wdata_size -= len; + } + else + { + session[fd]->wdata_size = 0; + } + if (!session[fd]->connected) + session[fd]->connected = 1; + } + else + { + printf ("set eof :%d\n", fd); + session[fd]->eof = 1; + } + return 0; } -static int null_parse(int fd) +static int null_parse (int fd) { - printf("null_parse : %d\n",fd); - RFIFOSKIP(fd,RFIFOREST(fd)); - return 0; + printf ("null_parse : %d\n", fd); + RFIFOSKIP (fd, RFIFOREST (fd)); + return 0; } /*====================================== @@ -140,366 +155,397 @@ static int null_parse(int fd) *-------------------------------------- */ -static int connect_client(int listen_fd) +static int connect_client (int listen_fd) { - int fd; - struct sockaddr_in client_address; - unsigned int len; - int result; - int yes = 1; // reuse fix - - //printf("connect_client : %d\n",listen_fd); - - printf("used: %d, max FDs: %d, SOFT: %d\n", currentuse, FD_SETSIZE, SOFT_LIMIT); - - len = sizeof(client_address); - - fd = accept(listen_fd,(struct sockaddr*)&client_address,&len); - if (fd_max <= fd) { - fd_max = fd + 1; - } else if (fd == -1) { - perror("accept"); - return -1; - } - if (!free_fds()) { // gracefully end the connecting if no free FD - printf("softlimit reached, disconnecting : %d\n", fd); - delete_session(fd); - return -1; - } - -// setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,NULL,0); - setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof yes); // reuse fix + int fd; + struct sockaddr_in client_address; + unsigned int len; + int result; + int yes = 1; // reuse fix + + //printf("connect_client : %d\n",listen_fd); + + printf ("used: %d, max FDs: %d, SOFT: %d\n", currentuse, FD_SETSIZE, + SOFT_LIMIT); + + len = sizeof (client_address); + + fd = accept (listen_fd, (struct sockaddr *) &client_address, &len); + if (fd_max <= fd) + { + fd_max = fd + 1; + } + else if (fd == -1) + { + perror ("accept"); + return -1; + } + if (!free_fds ()) + { // gracefully end the connecting if no free FD + printf ("softlimit reached, disconnecting : %d\n", fd); + delete_session (fd); + return -1; + } + +// setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,NULL,0); + setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof yes); // reuse fix #ifdef SO_REUSEPORT -// setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,NULL,0); - setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes); //reuse fix +// setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,NULL,0); + setsockopt (fd, SOL_SOCKET, SO_REUSEPORT, (char *) &yes, sizeof yes); //reuse fix #endif -// setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,NULL,0); - setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes); // reuse fix +// setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,NULL,0); + setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (char *) &yes, sizeof yes); // reuse fix - FD_SET(fd,&readfds); + FD_SET (fd, &readfds); #ifdef LCCWIN32 - { - unsigned long val = 1; - ioctlsocket(fd, FIONBIO, &val); - } + { + unsigned long val = 1; + ioctlsocket (fd, FIONBIO, &val); + } #else - result = fcntl(fd, F_SETFL, O_NONBLOCK); + result = fcntl (fd, F_SETFL, O_NONBLOCK); #endif - CREATE(session[fd], struct socket_data, 1); - CREATE(session[fd]->rdata, unsigned char, rfifo_size); - CREATE(session[fd]->wdata, unsigned char, wfifo_size); + CREATE (session[fd], struct socket_data, 1); + CREATE (session[fd]->rdata, unsigned char, rfifo_size); + CREATE (session[fd]->wdata, unsigned char, wfifo_size); - session[fd]->max_rdata = rfifo_size; - session[fd]->max_wdata = wfifo_size; - session[fd]->func_recv = recv_to_fifo; - session[fd]->func_send = send_from_fifo; - session[fd]->func_parse = default_func_parse; - session[fd]->client_addr = client_address; - session[fd]->created = time(NULL); - session[fd]->connected = 0; + session[fd]->max_rdata = rfifo_size; + session[fd]->max_wdata = wfifo_size; + session[fd]->func_recv = recv_to_fifo; + session[fd]->func_send = send_from_fifo; + session[fd]->func_parse = default_func_parse; + session[fd]->client_addr = client_address; + session[fd]->created = time (NULL); + session[fd]->connected = 0; - currentuse++; + currentuse++; - //printf("new_session : %d %d\n",fd,session[fd]->eof); - return fd; + //printf("new_session : %d %d\n",fd,session[fd]->eof); + return fd; } -int make_listen_port(int port) +int make_listen_port (int port) { - struct sockaddr_in server_address; - int fd; - int result; - int yes = 1; // reuse fix - - fd = socket( AF_INET, SOCK_STREAM, 0 ); - if(fd_max<=fd) fd_max=fd+1; - else if (fd == -1) { - perror("connect"); - return -1; - } + struct sockaddr_in server_address; + int fd; + int result; + int yes = 1; // reuse fix + + fd = socket (AF_INET, SOCK_STREAM, 0); + if (fd_max <= fd) + fd_max = fd + 1; + else if (fd == -1) + { + perror ("connect"); + return -1; + } #ifdef LCCWIN32 - { - unsigned long val = 1; - ioctlsocket(fd, FIONBIO, &val); - } + { + unsigned long val = 1; + ioctlsocket (fd, FIONBIO, &val); + } #else - result = fcntl(fd, F_SETFL, O_NONBLOCK); + result = fcntl (fd, F_SETFL, O_NONBLOCK); #endif -// setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,NULL,0); - setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof yes); // reuse fix +// setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,NULL,0); + setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof yes); // reuse fix #ifdef SO_REUSEPORT -// setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,NULL,0); - setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes); //reuse fix +// setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,NULL,0); + setsockopt (fd, SOL_SOCKET, SO_REUSEPORT, (char *) &yes, sizeof yes); //reuse fix #endif -// setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,NULL,0); - setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes); // reuse fix - - server_address.sin_family = AF_INET; - server_address.sin_addr.s_addr = htonl( INADDR_ANY ); - server_address.sin_port = htons(port); - - result = bind(fd, (struct sockaddr*)&server_address, sizeof(server_address)); - if( result == -1 ) { - perror("bind"); - exit(1); - } - result = listen( fd, 5 ); - if( result == -1 ) { /* error */ - perror("listen"); - exit(1); - } - - FD_SET(fd, &readfds ); - - CREATE(session[fd], struct socket_data, 1); - - if(session[fd]==NULL){ - printf("out of memory : make_listen_port\n"); - exit(1); - } - memset(session[fd],0,sizeof(*session[fd])); - session[fd]->func_recv = connect_client; - session[fd]->created = time(NULL); - session[fd]->connected = 1; - - currentuse++; - return fd; +// setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,NULL,0); + setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (char *) &yes, sizeof yes); // reuse fix + + server_address.sin_family = AF_INET; + server_address.sin_addr.s_addr = htonl (INADDR_ANY); + server_address.sin_port = htons (port); + + result = + bind (fd, (struct sockaddr *) &server_address, + sizeof (server_address)); + if (result == -1) + { + perror ("bind"); + exit (1); + } + result = listen (fd, 5); + if (result == -1) + { /* error */ + perror ("listen"); + exit (1); + } + + FD_SET (fd, &readfds); + + CREATE (session[fd], struct socket_data, 1); + + if (session[fd] == NULL) + { + printf ("out of memory : make_listen_port\n"); + exit (1); + } + memset (session[fd], 0, sizeof (*session[fd])); + session[fd]->func_recv = connect_client; + session[fd]->created = time (NULL); + session[fd]->connected = 1; + + currentuse++; + return fd; } -int make_connection(long ip,int port) +int make_connection (long ip, int port) { - struct sockaddr_in server_address; - int fd; - int result; - int yes = 1; // reuse fix - - fd = socket( AF_INET, SOCK_STREAM, 0 ); - if(fd_max<=fd) fd_max=fd+1; - else if (fd == -1) { - perror("socket"); - return -1; - } - -// setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,NULL,0); - setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof yes); // reuse fix + struct sockaddr_in server_address; + int fd; + int result; + int yes = 1; // reuse fix + + fd = socket (AF_INET, SOCK_STREAM, 0); + if (fd_max <= fd) + fd_max = fd + 1; + else if (fd == -1) + { + perror ("socket"); + return -1; + } + +// setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,NULL,0); + setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (char *) &yes, sizeof yes); // reuse fix #ifdef SO_REUSEPORT -// setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,NULL,0); - setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,(char *)&yes,sizeof yes); //reuse fix +// setsockopt(fd,SOL_SOCKET,SO_REUSEPORT,NULL,0); + setsockopt (fd, SOL_SOCKET, SO_REUSEPORT, (char *) &yes, sizeof yes); //reuse fix #endif -// setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,NULL,0); - setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,(char *)&yes,sizeof yes); // reuse fix +// setsockopt(fd,IPPROTO_TCP,TCP_NODELAY,NULL,0); + setsockopt (fd, IPPROTO_TCP, TCP_NODELAY, (char *) &yes, sizeof yes); // reuse fix - server_address.sin_family = AF_INET; - server_address.sin_addr.s_addr = ip; - server_address.sin_port = htons(port); + server_address.sin_family = AF_INET; + server_address.sin_addr.s_addr = ip; + server_address.sin_port = htons (port); #ifdef LCCWIN32 - { - unsigned long val = 1; - ioctlsocket(fd, FIONBIO, &val); - } + { + unsigned long val = 1; + ioctlsocket (fd, FIONBIO, &val); + } #else - result = fcntl(fd, F_SETFL, O_NONBLOCK); + result = fcntl (fd, F_SETFL, O_NONBLOCK); #endif - result = connect(fd, (struct sockaddr *)(&server_address),sizeof(struct sockaddr_in)); + result = + connect (fd, (struct sockaddr *) (&server_address), + sizeof (struct sockaddr_in)); - FD_SET(fd,&readfds); + FD_SET (fd, &readfds); - CREATE(session[fd], struct socket_data, 1); - CREATE(session[fd]->rdata, unsigned char, rfifo_size); - CREATE(session[fd]->wdata, unsigned char, wfifo_size); + CREATE (session[fd], struct socket_data, 1); + CREATE (session[fd]->rdata, unsigned char, rfifo_size); + CREATE (session[fd]->wdata, unsigned char, wfifo_size); - session[fd]->max_rdata = rfifo_size; - session[fd]->max_wdata = wfifo_size; - session[fd]->func_recv = recv_to_fifo; - session[fd]->func_send = send_from_fifo; - session[fd]->func_parse = default_func_parse; - session[fd]->created = time(NULL); - session[fd]->connected = 1; + session[fd]->max_rdata = rfifo_size; + session[fd]->max_wdata = wfifo_size; + session[fd]->func_recv = recv_to_fifo; + session[fd]->func_send = send_from_fifo; + session[fd]->func_parse = default_func_parse; + session[fd]->created = time (NULL); + session[fd]->connected = 1; - currentuse++; - return fd; + currentuse++; + return fd; } -int delete_session(int fd) +int delete_session (int fd) { - if(fd<0 || fd>=FD_SETSIZE) - return -1; - FD_CLR(fd,&readfds); - if(session[fd]){ - if(session[fd]->rdata) - free(session[fd]->rdata); - if(session[fd]->wdata) - free(session[fd]->wdata); - if(session[fd]->session_data) - free(session[fd]->session_data); - free(session[fd]); - } - session[fd]=NULL; - shutdown(fd, SHUT_RDWR); - close(fd); - currentuse--; - if (currentuse<0) { - printf("delete_session: current sessions negative!\n"); - currentuse=0; - } - //printf("delete_session:%d\n",fd); - return 0; + if (fd < 0 || fd >= FD_SETSIZE) + return -1; + FD_CLR (fd, &readfds); + if (session[fd]) + { + if (session[fd]->rdata) + free (session[fd]->rdata); + if (session[fd]->wdata) + free (session[fd]->wdata); + if (session[fd]->session_data) + free (session[fd]->session_data); + free (session[fd]); + } + session[fd] = NULL; + shutdown (fd, SHUT_RDWR); + close (fd); + currentuse--; + if (currentuse < 0) + { + printf ("delete_session: current sessions negative!\n"); + currentuse = 0; + } + //printf("delete_session:%d\n",fd); + return 0; } -int realloc_fifo(int fd,int rfifo_size,int wfifo_size) +int realloc_fifo (int fd, int rfifo_size, int wfifo_size) { - struct socket_data *s=session[fd]; - if( s->max_rdata != rfifo_size && s->rdata_size < rfifo_size){ - RECREATE(s->rdata, unsigned char, rfifo_size); - s->max_rdata = rfifo_size; - } - if( s->max_wdata != wfifo_size && s->wdata_size < wfifo_size){ - RECREATE(s->wdata, unsigned char, wfifo_size); - s->max_wdata = wfifo_size; - } - return 0; + struct socket_data *s = session[fd]; + if (s->max_rdata != rfifo_size && s->rdata_size < rfifo_size) + { + RECREATE (s->rdata, unsigned char, rfifo_size); + s->max_rdata = rfifo_size; + } + if (s->max_wdata != wfifo_size && s->wdata_size < wfifo_size) + { + RECREATE (s->wdata, unsigned char, wfifo_size); + s->max_wdata = wfifo_size; + } + return 0; } -int WFIFOSET(int fd,int len) +int WFIFOSET (int fd, int len) { - struct socket_data *s=session[fd]; - if( s->wdata_size+len+16384 > s->max_wdata ){ - realloc_fifo(fd,s->max_rdata, s->max_wdata <<1 ); - printf("socket: %d wdata expanded to %d bytes.\n",fd, s->max_wdata); - } - s->wdata_size=(s->wdata_size+(len)+2048 < s->max_wdata) ? - s->wdata_size+len : (printf("socket: %d wdata lost !!\n",fd),s->wdata_size); - return 0; + struct socket_data *s = session[fd]; + if (s->wdata_size + len + 16384 > s->max_wdata) + { + realloc_fifo (fd, s->max_rdata, s->max_wdata << 1); + printf ("socket: %d wdata expanded to %d bytes.\n", fd, s->max_wdata); + } + s->wdata_size = (s->wdata_size + (len) + 2048 < s->max_wdata) ? + s->wdata_size + len : (printf ("socket: %d wdata lost !!\n", fd), + s->wdata_size); + return 0; } -int do_sendrecv(int next) +int do_sendrecv (int next) { - fd_set rfd,wfd; - struct timeval timeout; - int ret,i; - - rfd=readfds; - FD_ZERO(&wfd); - for(i=0;i<fd_max;i++){ - if(!session[i] && FD_ISSET(i,&readfds)){ - printf("force clr fds %d\n",i); - FD_CLR(i,&readfds); - continue; - } - if(!session[i]) - continue; - if(session[i]->wdata_size) - FD_SET(i,&wfd); - } - timeout.tv_sec = next/1000; - timeout.tv_usec = next%1000*1000; - ret = select(fd_max,&rfd,&wfd,NULL,&timeout); - if(ret<=0) - return 0; - for(i=0;i<fd_max;i++){ - if(!session[i]) - continue; - if(FD_ISSET(i,&wfd)){ - //printf("write:%d\n",i); - if(session[i]->func_send) - //send_from_fifo(i); - session[i]->func_send(i); - } - if(FD_ISSET(i,&rfd)){ - //printf("read:%d\n",i); - if(session[i]->func_recv) - //recv_to_fifo(i); - session[i]->func_recv(i); - } - } - return 0; + fd_set rfd, wfd; + struct timeval timeout; + int ret, i; + + rfd = readfds; + FD_ZERO (&wfd); + for (i = 0; i < fd_max; i++) + { + if (!session[i] && FD_ISSET (i, &readfds)) + { + printf ("force clr fds %d\n", i); + FD_CLR (i, &readfds); + continue; + } + if (!session[i]) + continue; + if (session[i]->wdata_size) + FD_SET (i, &wfd); + } + timeout.tv_sec = next / 1000; + timeout.tv_usec = next % 1000 * 1000; + ret = select (fd_max, &rfd, &wfd, NULL, &timeout); + if (ret <= 0) + return 0; + for (i = 0; i < fd_max; i++) + { + if (!session[i]) + continue; + if (FD_ISSET (i, &wfd)) + { + //printf("write:%d\n",i); + if (session[i]->func_send) + //send_from_fifo(i); + session[i]->func_send (i); + } + if (FD_ISSET (i, &rfd)) + { + //printf("read:%d\n",i); + if (session[i]->func_recv) + //recv_to_fifo(i); + session[i]->func_recv (i); + } + } + return 0; } -int do_parsepacket(void) +int do_parsepacket (void) { - int i; - for(i=0;i<fd_max;i++){ - if(!session[i]) - continue; - if(!session[i]->connected && time(NULL)-session[i]->created > CONNECT_TIMEOUT) { - printf("Session #%d timed out\n", i); - session[i]->eof = 1; - } - if(session[i]->rdata_size==0 && session[i]->eof==0) - continue; - if(session[i]->func_parse){ - session[i]->func_parse(i); - if(!session[i]) - continue; - } - RFIFOFLUSH(i); - } - return 0; + int i; + for (i = 0; i < fd_max; i++) + { + if (!session[i]) + continue; + if (!session[i]->connected + && time (NULL) - session[i]->created > CONNECT_TIMEOUT) + { + printf ("Session #%d timed out\n", i); + session[i]->eof = 1; + } + if (session[i]->rdata_size == 0 && session[i]->eof == 0) + continue; + if (session[i]->func_parse) + { + session[i]->func_parse (i); + if (!session[i]) + continue; + } + RFIFOFLUSH (i); + } + return 0; } -void do_socket(void) +void do_socket (void) { - FD_ZERO(&readfds); - currentuse = 2; + FD_ZERO (&readfds); + currentuse = 2; } -int RFIFOSKIP(int fd,int len) +int RFIFOSKIP (int fd, int len) { - struct socket_data *s=session[fd]; + struct socket_data *s = session[fd]; - if (s->rdata_size-s->rdata_pos-len<0) { - fprintf(stderr,"too many skip\n"); - exit(1); - } + if (s->rdata_size - s->rdata_pos - len < 0) + { + fprintf (stderr, "too many skip\n"); + exit (1); + } - s->rdata_pos = s->rdata_pos+len; + s->rdata_pos = s->rdata_pos + len; - return 0; + return 0; } - -int Net_Init(void) +int Net_Init (void) { - #ifdef LCCWIN32 - /* Start up the windows networking */ - WORD version_wanted = MAKEWORD(1,1); - WSADATA wsaData; - - if ( WSAStartup(version_wanted, &wsaData) != 0 ) { - printf("SYSERR: WinSock not available!\n"); - exit(1); - } - #endif - - return(0); +#ifdef LCCWIN32 + /* Start up the windows networking */ + WORD version_wanted = MAKEWORD (1, 1); + WSADATA wsaData; + + if (WSAStartup (version_wanted, &wsaData) != 0) + { + printf ("SYSERR: WinSock not available!\n"); + exit (1); + } +#endif + + return (0); } -int fclose_(FILE *fp) +int fclose_ (FILE * fp) { - int res = fclose(fp); - if (res == 0) - currentuse--; -// printf("file closed: used: %d\n",currentuse); - return res; + int res = fclose (fp); + if (res == 0) + currentuse--; +// printf("file closed: used: %d\n",currentuse); + return res; } -FILE *fopen_(const char *path, const char *mode) +FILE *fopen_ (const char *path, const char *mode) { - FILE *f = fopen(path, mode); - if (f != NULL) - currentuse++; -// printf("file opened: used: %d\n",currentuse); - return f; + FILE *f = fopen (path, mode); + if (f != NULL) + currentuse++; +// printf("file opened: used: %d\n",currentuse); + return f; } -int free_fds() +int free_fds () { - return (currentuse+1 < SOFT_LIMIT) ? 1 : 0; + return (currentuse + 1 < SOFT_LIMIT) ? 1 : 0; } - diff --git a/src/common/socket.h b/src/common/socket.h index b67e660..aa4f91f 100644 --- a/src/common/socket.h +++ b/src/common/socket.h @@ -43,33 +43,34 @@ #ifdef __INTERIX #define FD_SETSIZE 4096 -#endif // __INTERIX +#endif // __INTERIX /* Removed Cygwin FD_SETSIZE declarations, now are directly passed on to the compiler through Makefile [Valaris] */ // Struct declaration -struct socket_data{ - int eof; - time_t created; - int connected; - unsigned char *rdata,*wdata; - int max_rdata,max_wdata; - int rdata_size,wdata_size; - int rdata_pos; - struct sockaddr_in client_addr; - int (*func_recv)(int); - int (*func_send)(int); - int (*func_parse)(int); - void* session_data; +struct socket_data +{ + int eof; + time_t created; + int connected; + unsigned char *rdata, *wdata; + int max_rdata, max_wdata; + int rdata_size, wdata_size; + int rdata_pos; + struct sockaddr_in client_addr; + int (*func_recv) (int); + int (*func_send) (int); + int (*func_parse) (int); + void *session_data; }; // Data prototype declaration #ifdef LCCWIN32 - #undef FD_SETSIZE - #define FD_SETSIZE 4096 +#undef FD_SETSIZE +#define FD_SETSIZE 4096 #endif @@ -79,32 +80,31 @@ struct socket_data{ // socket timeout to establish a full connection in seconds #define CONNECT_TIMEOUT 15 - extern struct socket_data *session[FD_SETSIZE]; -extern int rfifo_size,wfifo_size; +extern int rfifo_size, wfifo_size; extern int fd_max; // Function prototype declaration -int make_listen_port(int); -int make_connection(long,int); -int delete_session(int); -int realloc_fifo(int fd,int rfifo_size,int wfifo_size); -int WFIFOSET(int fd,int len); -int RFIFOSKIP(int fd,int len); +int make_listen_port (int); +int make_connection (long, int); +int delete_session (int); +int realloc_fifo (int fd, int rfifo_size, int wfifo_size); +int WFIFOSET (int fd, int len); +int RFIFOSKIP (int fd, int len); -int do_sendrecv(int next); -int do_parsepacket(void); -void do_socket(void); +int do_sendrecv (int next); +int do_parsepacket (void); +void do_socket (void); -void set_defaultparse(int (*defaultparse)(int)); +void set_defaultparse (int (*defaultparse) (int)); -int Net_Init(void); +int Net_Init (void); -int fclose_(FILE *fp); -FILE *fopen_(const char *path, const char *mode); +int fclose_ (FILE * fp); +FILE *fopen_ (const char *path, const char *mode); -int free_fds(); +int free_fds (); -#endif // _SOCKET_H_ +#endif // _SOCKET_H_ diff --git a/src/common/timer.c b/src/common/timer.c index 8193ff9..d9552fe 100644 --- a/src/common/timer.c +++ b/src/common/timer.c @@ -20,58 +20,60 @@ #include "memwatch.h" #endif -static struct TimerData* timer_data; -static int timer_data_max,timer_data_num; -static int* free_timer_list; +static struct TimerData *timer_data; +static int timer_data_max, timer_data_num; +static int *free_timer_list; static int free_timer_list_max, free_timer_list_pos; static int timer_heap_max; -static int* timer_heap = NULL; +static int *timer_heap = NULL; // for debug -struct timer_func_list { - int (*func)(int,unsigned int,int,int); - struct timer_func_list* next; - char* name; +struct timer_func_list +{ + int (*func) (int, unsigned int, int, int); + struct timer_func_list *next; + char *name; }; -static struct timer_func_list* tfl_root; +static struct timer_func_list *tfl_root; #if defined(LCCWIN32) -void gettimeofday(struct timeval *t, struct timezone *dummy) +void gettimeofday (struct timeval *t, struct timezone *dummy) { - DWORD millisec = GetTickCount(); + DWORD millisec = GetTickCount (); - t->tv_sec = (int) (millisec / 1000); - t->tv_usec = (millisec % 1000) * 1000; + t->tv_sec = (int) (millisec / 1000); + t->tv_usec = (millisec % 1000) * 1000; } #endif - // -int add_timer_func_list(int (*func)(int,unsigned int,int,int),char* name) +int add_timer_func_list (int (*func) (int, unsigned int, int, int), + char *name) { - struct timer_func_list* tfl; + struct timer_func_list *tfl; - CREATE(tfl, struct timer_func_list, 1); - CREATE(tfl->name, char, strlen(name) + 1); + CREATE (tfl, struct timer_func_list, 1); + CREATE (tfl->name, char, strlen (name) + 1); - tfl->next = tfl_root; - tfl->func = func; - strcpy(tfl->name,name); - tfl_root = tfl; + tfl->next = tfl_root; + tfl->func = func; + strcpy (tfl->name, name); + tfl_root = tfl; - return 0; + return 0; } -char* search_timer_func_list(int (*func)(int,unsigned int,int,int)) +char *search_timer_func_list (int (*func) (int, unsigned int, int, int)) { - struct timer_func_list* tfl; - for(tfl = tfl_root;tfl;tfl = tfl->next) { - if (func == tfl->func) - return tfl->name; - } - return "???"; + struct timer_func_list *tfl; + for (tfl = tfl_root; tfl; tfl = tfl->next) + { + if (func == tfl->func) + return tfl->name; + } + return "???"; } /*---------------------------- @@ -79,234 +81,273 @@ char* search_timer_func_list(int (*func)(int,unsigned int,int,int)) *----------------------------*/ static unsigned int gettick_cache; static int gettick_count; -unsigned int gettick_nocache(void) +unsigned int gettick_nocache (void) { - struct timeval tval; - gettimeofday(&tval,NULL); - gettick_count = 256; - return gettick_cache = tval.tv_sec * 1000 + tval.tv_usec/1000; + struct timeval tval; + gettimeofday (&tval, NULL); + gettick_count = 256; + return gettick_cache = tval.tv_sec * 1000 + tval.tv_usec / 1000; } -unsigned int gettick(void) +unsigned int gettick (void) { - gettick_count--; - if (gettick_count<0) - return gettick_nocache(); - return gettick_cache; + gettick_count--; + if (gettick_count < 0) + return gettick_nocache (); + return gettick_cache; } /*====================================== * CORE : Timer Heap *-------------------------------------- */ -static void push_timer_heap(int index) +static void push_timer_heap (int index) { - int i, h; - - if (timer_heap == NULL || timer_heap[0] + 1 >= timer_heap_max) { - int first = timer_heap == NULL; - - timer_heap_max += 256; - RECREATE(timer_heap, int, timer_heap_max); - memset(timer_heap + (timer_heap_max - 256), 0, sizeof(int) * 256); - if (first) - timer_heap[0] = 0; - } - - timer_heap[0]++; - - for (h = timer_heap[0]-1, i = (h - 1) / 2; - h > 0 && DIFF_TICK(timer_data[index].tick, - timer_data[timer_heap[i + 1]].tick) < 0; - i = (h - 1) / 2) { - timer_heap[h + 1] = timer_heap[i + 1]; - h = i; - } - timer_heap[h + 1] = index; + int i, h; + + if (timer_heap == NULL || timer_heap[0] + 1 >= timer_heap_max) + { + int first = timer_heap == NULL; + + timer_heap_max += 256; + RECREATE (timer_heap, int, timer_heap_max); + memset (timer_heap + (timer_heap_max - 256), 0, sizeof (int) * 256); + if (first) + timer_heap[0] = 0; + } + + timer_heap[0]++; + + for (h = timer_heap[0] - 1, i = (h - 1) / 2; + h > 0 && DIFF_TICK (timer_data[index].tick, + timer_data[timer_heap[i + 1]].tick) < 0; + i = (h - 1) / 2) + { + timer_heap[h + 1] = timer_heap[i + 1]; + h = i; + } + timer_heap[h + 1] = index; } -static int top_timer_heap() +static int top_timer_heap () { - if (timer_heap == NULL || timer_heap[0] <= 0) - return -1; + if (timer_heap == NULL || timer_heap[0] <= 0) + return -1; - return timer_heap[1]; + return timer_heap[1]; } -static int pop_timer_heap() +static int pop_timer_heap () { - int i,h,k; - int ret,last; - - if (timer_heap == NULL || timer_heap[0] <= 0) - return -1; - ret = timer_heap[1]; - last = timer_heap[timer_heap[0]]; - timer_heap[0]--; - - for(h = 0,k = 2;k<timer_heap[0];k = k * 2 + 2) { - if (DIFF_TICK(timer_data[timer_heap[k + 1]].tick , timer_data[timer_heap[k]].tick)>0) - k--; - timer_heap[h + 1] = timer_heap[k + 1], h = k; - } - if (k == timer_heap[0]) - timer_heap[h + 1] = timer_heap[k], h = k-1; - - for(i = (h-1)/2; - h>0 && DIFF_TICK(timer_data[timer_heap[i + 1]].tick , timer_data[last].tick)>0; - i = (h-1)/2) { - timer_heap[h + 1] = timer_heap[i + 1],h = i; - } - timer_heap[h + 1] = last; - - return ret; + int i, h, k; + int ret, last; + + if (timer_heap == NULL || timer_heap[0] <= 0) + return -1; + ret = timer_heap[1]; + last = timer_heap[timer_heap[0]]; + timer_heap[0]--; + + for (h = 0, k = 2; k < timer_heap[0]; k = k * 2 + 2) + { + if (DIFF_TICK + (timer_data[timer_heap[k + 1]].tick, + timer_data[timer_heap[k]].tick) > 0) + k--; + timer_heap[h + 1] = timer_heap[k + 1], h = k; + } + if (k == timer_heap[0]) + timer_heap[h + 1] = timer_heap[k], h = k - 1; + + for (i = (h - 1) / 2; + h > 0 + && DIFF_TICK (timer_data[timer_heap[i + 1]].tick, + timer_data[last].tick) > 0; i = (h - 1) / 2) + { + timer_heap[h + 1] = timer_heap[i + 1], h = i; + } + timer_heap[h + 1] = last; + + return ret; } -int add_timer(unsigned int tick,int (*func)(int,unsigned int,int,int),int id,int data) +int add_timer (unsigned int tick, int (*func) (int, unsigned int, int, int), + int id, int data) { - struct TimerData* td; - int i; - - if (free_timer_list_pos) { - do { - i = free_timer_list[--free_timer_list_pos]; - } while(i >= timer_data_num && free_timer_list_pos > 0); - } else - i = timer_data_num; - if (i >= timer_data_num) - for (i = timer_data_num;i<timer_data_max && timer_data[i].type; i++); - if (i >= timer_data_num && i >= timer_data_max) { - int j; - if (timer_data_max == 0) { - timer_data_max = 256; - CREATE(timer_data, struct TimerData, timer_data_max); - } else { - timer_data_max += 256; - RECREATE(timer_data, struct TimerData, timer_data_max); - if (timer_data == NULL) { - printf("out of memory : add_timer timer_data\n"); - exit(1); - } - memset(timer_data + (timer_data_max - 256), 0, - sizeof(struct TimerData) * 256); - } - for(j = timer_data_max-256;j<timer_data_max; j++) - timer_data[j].type = 0; - } - td = &timer_data[i]; - td->tick = tick; - td->func = func; - td->id = id; - td->data = data; - td->type = TIMER_ONCE_AUTODEL; - td->interval = 1000; - push_timer_heap(i); - if (i >= timer_data_num) - timer_data_num = i + 1; - return i; + struct TimerData *td; + int i; + + if (free_timer_list_pos) + { + do + { + i = free_timer_list[--free_timer_list_pos]; + } + while (i >= timer_data_num && free_timer_list_pos > 0); + } + else + i = timer_data_num; + if (i >= timer_data_num) + for (i = timer_data_num; i < timer_data_max && timer_data[i].type; + i++); + if (i >= timer_data_num && i >= timer_data_max) + { + int j; + if (timer_data_max == 0) + { + timer_data_max = 256; + CREATE (timer_data, struct TimerData, timer_data_max); + } + else + { + timer_data_max += 256; + RECREATE (timer_data, struct TimerData, timer_data_max); + if (timer_data == NULL) + { + printf ("out of memory : add_timer timer_data\n"); + exit (1); + } + memset (timer_data + (timer_data_max - 256), 0, + sizeof (struct TimerData) * 256); + } + for (j = timer_data_max - 256; j < timer_data_max; j++) + timer_data[j].type = 0; + } + td = &timer_data[i]; + td->tick = tick; + td->func = func; + td->id = id; + td->data = data; + td->type = TIMER_ONCE_AUTODEL; + td->interval = 1000; + push_timer_heap (i); + if (i >= timer_data_num) + timer_data_num = i + 1; + return i; } -int add_timer_interval(unsigned int tick,int (*func)(int,unsigned int,int,int),int id,int data,int interval) +int add_timer_interval (unsigned int tick, + int (*func) (int, unsigned int, int, int), int id, + int data, int interval) { - int tid; - tid = add_timer(tick,func,id,data); - timer_data[tid].type = TIMER_INTERVAL; - timer_data[tid].interval = interval; - return tid; + int tid; + tid = add_timer (tick, func, id, data); + timer_data[tid].type = TIMER_INTERVAL; + timer_data[tid].interval = interval; + return tid; } -int delete_timer(int id,int (*func)(int,unsigned int,int,int)) +int delete_timer (int id, int (*func) (int, unsigned int, int, int)) { - if (id <= 0 || id >= timer_data_num) { - printf("delete_timer error : no such timer %d\n", id); - return -1; - } - if (timer_data[id].func != func) { - printf("delete_timer error : function dismatch %08x(%s) != %08x(%s)\n", - (int)timer_data[id].func, - search_timer_func_list(timer_data[id].func), - (int)func, - search_timer_func_list(func)); - return -2; - } - // そのうち消えるにまかせる - timer_data[id].func = NULL; - timer_data[id].type = TIMER_ONCE_AUTODEL; - timer_data[id].tick -= 60 * 60 * 1000; - return 0; + if (id <= 0 || id >= timer_data_num) + { + printf ("delete_timer error : no such timer %d\n", id); + return -1; + } + if (timer_data[id].func != func) + { + printf + ("delete_timer error : function dismatch %08x(%s) != %08x(%s)\n", + (int) timer_data[id].func, + search_timer_func_list (timer_data[id].func), (int) func, + search_timer_func_list (func)); + return -2; + } + // そのうち消えるにまかせる + timer_data[id].func = NULL; + timer_data[id].type = TIMER_ONCE_AUTODEL; + timer_data[id].tick -= 60 * 60 * 1000; + return 0; } -int addtick_timer(int tid,unsigned int tick) +int addtick_timer (int tid, unsigned int tick) { - return timer_data[tid].tick += tick; + return timer_data[tid].tick += tick; } -struct TimerData* get_timer(int tid) + +struct TimerData *get_timer (int tid) { - return &timer_data[tid]; + return &timer_data[tid]; } - -int do_timer(unsigned int tick) +int do_timer (unsigned int tick) { - int i,nextmin = 1000; + int i, nextmin = 1000; #if 0 - static int disp_tick = 0; - if (DIFF_TICK(disp_tick,tick)<-5000 || DIFF_TICK(disp_tick,tick)>5000) { - printf("timer %d(%d + %d)\n",timer_data_num,timer_heap[0],free_timer_list_pos); - disp_tick = tick; - } + static int disp_tick = 0; + if (DIFF_TICK (disp_tick, tick) < -5000 + || DIFF_TICK (disp_tick, tick) > 5000) + { + printf ("timer %d(%d + %d)\n", timer_data_num, timer_heap[0], + free_timer_list_pos); + disp_tick = tick; + } #endif - while((i = top_timer_heap()) >= 0) { - if (DIFF_TICK(timer_data[i].tick , tick)>0) { - nextmin = DIFF_TICK(timer_data[i].tick , tick); - break; - } - pop_timer_heap(); - timer_data[i].type |= TIMER_REMOVE_HEAP; - if (timer_data[i].func) { - if (DIFF_TICK(timer_data[i].tick , tick) < -1000) { - // 1秒以上の大幅な遅延が発生しているので、 - // timer処理タイミングを現在値とする事で - // 呼び出し時タイミング(引数のtick)相対で処理してる - // timer関数の次回処理タイミングを遅らせる - timer_data[i].func(i,tick,timer_data[i].id,timer_data[i].data); - } else { - timer_data[i].func(i,timer_data[i].tick,timer_data[i].id,timer_data[i].data); - } - } - if (timer_data[i].type&TIMER_REMOVE_HEAP) { - switch(timer_data[i].type & ~TIMER_REMOVE_HEAP) { - case TIMER_ONCE_AUTODEL: - timer_data[i].type = 0; - if (free_timer_list_pos >= free_timer_list_max) { - free_timer_list_max += 256; - RECREATE(free_timer_list, int, free_timer_list_max); - memset(free_timer_list + (free_timer_list_max - 256), 0, - 256 * sizeof(free_timer_list[0])); - } - free_timer_list[free_timer_list_pos++] = i; - break; - case TIMER_INTERVAL: - if (DIFF_TICK(timer_data[i].tick , tick) < -1000) { - timer_data[i].tick = tick + timer_data[i].interval; - } else { - timer_data[i].tick += timer_data[i].interval; - } - timer_data[i].type &= ~TIMER_REMOVE_HEAP; - push_timer_heap(i); - break; - } - } - } - - if (nextmin<10) - nextmin = 10; - return nextmin; + while ((i = top_timer_heap ()) >= 0) + { + if (DIFF_TICK (timer_data[i].tick, tick) > 0) + { + nextmin = DIFF_TICK (timer_data[i].tick, tick); + break; + } + pop_timer_heap (); + timer_data[i].type |= TIMER_REMOVE_HEAP; + if (timer_data[i].func) + { + if (DIFF_TICK (timer_data[i].tick, tick) < -1000) + { + // 1秒以上の大幅な遅延が発生しているので、 + // timer処理タイミングを現在値とする事で + // 呼び出し時タイミング(引数のtick)相対で処理してる + // timer関数の次回処理タイミングを遅らせる + timer_data[i].func (i, tick, timer_data[i].id, + timer_data[i].data); + } + else + { + timer_data[i].func (i, timer_data[i].tick, timer_data[i].id, + timer_data[i].data); + } + } + if (timer_data[i].type & TIMER_REMOVE_HEAP) + { + switch (timer_data[i].type & ~TIMER_REMOVE_HEAP) + { + case TIMER_ONCE_AUTODEL: + timer_data[i].type = 0; + if (free_timer_list_pos >= free_timer_list_max) + { + free_timer_list_max += 256; + RECREATE (free_timer_list, int, free_timer_list_max); + memset (free_timer_list + (free_timer_list_max - 256), + 0, 256 * sizeof (free_timer_list[0])); + } + free_timer_list[free_timer_list_pos++] = i; + break; + case TIMER_INTERVAL: + if (DIFF_TICK (timer_data[i].tick, tick) < -1000) + { + timer_data[i].tick = tick + timer_data[i].interval; + } + else + { + timer_data[i].tick += timer_data[i].interval; + } + timer_data[i].type &= ~TIMER_REMOVE_HEAP; + push_timer_heap (i); + break; + } + } + } + + if (nextmin < 10) + nextmin = 10; + return nextmin; } -void timer_final() +void timer_final () { - free(timer_data); + free (timer_data); } diff --git a/src/common/timer.h b/src/common/timer.h index f6fc5c8..c6c4b52 100644 --- a/src/common/timer.h +++ b/src/common/timer.h @@ -13,33 +13,35 @@ // Struct declaration -struct TimerData { - unsigned int tick; - int (*func)(int,unsigned int,int,int); - int id; - int data; - int type; - int interval; - int heap_pos; +struct TimerData +{ + unsigned int tick; + int (*func) (int, unsigned int, int, int); + int id; + int data; + int type; + int interval; + int heap_pos; }; // Function prototype declaration -unsigned int gettick_nocache(void); -unsigned int gettick(void); +unsigned int gettick_nocache (void); +unsigned int gettick (void); -int add_timer(unsigned int,int (*)(int,unsigned int,int,int),int,int); -int add_timer_interval(unsigned int,int (*)(int,unsigned int,int,int),int,int,int); -int delete_timer(int,int (*)(int,unsigned int,int,int)); +int add_timer (unsigned int, int (*)(int, unsigned int, int, int), int, int); +int add_timer_interval (unsigned int, int (*)(int, unsigned int, int, int), + int, int, int); +int delete_timer (int, int (*)(int, unsigned int, int, int)); -int addtick_timer(int tid,unsigned int tick); -struct TimerData *get_timer(int tid); +int addtick_timer (int tid, unsigned int tick); +struct TimerData *get_timer (int tid); -int do_timer(unsigned int tick); +int do_timer (unsigned int tick); -int add_timer_func_list(int (*)(int,unsigned int,int,int),char*); -char* search_timer_func_list(int (*)(int,unsigned int,int,int)); +int add_timer_func_list (int (*)(int, unsigned int, int, int), char *); +char *search_timer_func_list (int (*)(int, unsigned int, int, int)); -extern void timer_final(); +extern void timer_final (); -#endif // _TIMER_H_ +#endif // _TIMER_H_ diff --git a/src/common/utils.c b/src/common/utils.c index b0ecd26..1433a5e 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -2,107 +2,120 @@ #include "utils.h" #include <stdio.h> -void dump(unsigned char *buffer, int num) +void dump (unsigned char *buffer, int num) { - int icnt,jcnt; - - printf(" Hex ASCII\n"); - printf(" ----------------------------------------------- ----------------"); - - for (icnt=0;icnt<num;icnt+=16) { - printf("\n%p ",&buffer[icnt]); - for (jcnt=icnt;jcnt<icnt+16;++jcnt) { - if (jcnt < num) { - printf("%02hX ",buffer[jcnt]); - } else - printf(" "); + int icnt, jcnt; + + printf + (" Hex ASCII\n"); + printf + (" ----------------------------------------------- ----------------"); + + for (icnt = 0; icnt < num; icnt += 16) + { + printf ("\n%p ", &buffer[icnt]); + for (jcnt = icnt; jcnt < icnt + 16; ++jcnt) + { + if (jcnt < num) + { + printf ("%02hX ", buffer[jcnt]); + } + else + printf (" "); + } + + printf (" | "); + + for (jcnt = icnt; jcnt < icnt + 16; ++jcnt) + { + if (jcnt < num) + { + if (buffer[jcnt] > 31 && buffer[jcnt] < 127) + printf ("%c", buffer[jcnt]); + else + printf ("."); + } + else + printf (" "); + } } - - printf(" | "); - - for (jcnt=icnt;jcnt<icnt+16;++jcnt) { - if (jcnt < num) { - if (buffer[jcnt] > 31 && buffer[jcnt] < 127) - printf("%c",buffer[jcnt]); - else - printf("."); - } else - printf(" "); - } - } - printf("\n"); + printf ("\n"); } - #ifdef LCCWIN32 -char *rindex(char *str, char c) +char *rindex (char *str, char c) { - char *sptr; - - sptr = str; - while(*sptr) - ++sptr; - if (c == '\0') - return(sptr); - while(str != sptr) - if (*sptr-- == c) - return(++sptr); - return(NULL); + char *sptr; + + sptr = str; + while (*sptr) + ++sptr; + if (c == '\0') + return (sptr); + while (str != sptr) + if (*sptr-- == c) + return (++sptr); + return (NULL); } -int strcasecmp(const char *arg1, const char *arg2) +int strcasecmp (const char *arg1, const char *arg2) { - int chk, i; + int chk, i; - if (arg1 == NULL || arg2 == NULL) { - printf("SYSERR: str_cmp() passed a NULL pointer, %p or %p.\n", arg1, arg2); - return (0); - } + if (arg1 == NULL || arg2 == NULL) + { + printf ("SYSERR: str_cmp() passed a NULL pointer, %p or %p.\n", arg1, + arg2); + return (0); + } - for (i = 0; arg1[i] || arg2[i]; i++) - if ((chk = LOWER(arg1[i]) - LOWER(arg2[i])) != 0) - return (chk); /* not equal */ + for (i = 0; arg1[i] || arg2[i]; i++) + if ((chk = LOWER (arg1[i]) - LOWER (arg2[i])) != 0) + return (chk); /* not equal */ - return (0); + return (0); } -int strncasecmp(const char *arg1, const char *arg2, int n) +int strncasecmp (const char *arg1, const char *arg2, int n) { - int chk, i; + int chk, i; - if (arg1 == NULL || arg2 == NULL) { - printf("SYSERR: strn_cmp() passed a NULL pointer, %p or %p.\n", arg1, arg2); - return (0); - } + if (arg1 == NULL || arg2 == NULL) + { + printf ("SYSERR: strn_cmp() passed a NULL pointer, %p or %p.\n", arg1, + arg2); + return (0); + } - for (i = 0; (arg1[i] || arg2[i]) && (n > 0); i++, n--) - if ((chk = LOWER(arg1[i]) - LOWER(arg2[i])) != 0) - return (chk); /* not equal */ + for (i = 0; (arg1[i] || arg2[i]) && (n > 0); i++, n--) + if ((chk = LOWER (arg1[i]) - LOWER (arg2[i])) != 0) + return (chk); /* not equal */ - return (0); + return (0); } -void str_upper(char *name) +void str_upper (char *name) { - int len = strlen(name); - while (len--) { - if (*name >= 'a' && *name <= 'z') - *name -= ('a' - 'A'); - name++; - } + int len = strlen (name); + while (len--) + { + if (*name >= 'a' && *name <= 'z') + *name -= ('a' - 'A'); + name++; + } } -void str_lower(char *name) +void str_lower (char *name) { - int len = strlen(name); + int len = strlen (name); - while (len--) { - if (*name >= 'A' && *name <= 'Z') - *name += ('a' - 'A'); - name++; - } + while (len--) + { + if (*name >= 'A' && *name <= 'Z') + *name += ('a' - 'A'); + name++; + } } #endif - diff --git a/src/common/utils.h b/src/common/utils.h index 88d1027..10c10ad 100644 --- a/src/common/utils.h +++ b/src/common/utils.h @@ -9,18 +9,15 @@ /* strcasecmp -> stricmp -> str_cmp */ - #ifdef LCCWIN32 - int strcasecmp(const char *arg1, const char *arg2); - int strncasecmp(const char *arg1, const char *arg2, int n); - void str_upper(char *name); - void str_lower(char *name); - char *rindex(char *str, char c); +int strcasecmp (const char *arg1, const char *arg2); +int strncasecmp (const char *arg1, const char *arg2, int n); +void str_upper (char *name); +void str_lower (char *name); +char *rindex (char *str, char c); #endif - - void dump(unsigned char *buffer, int num); - +void dump (unsigned char *buffer, int num); #define CREATE(result, type, number) do {\ if ((number) * sizeof(type) <= 0) \ diff --git a/src/common/version.h b/src/common/version.h index e33e2b3..60c9fca 100644 --- a/src/common/version.h +++ b/src/common/version.h @@ -2,17 +2,17 @@ #ifndef _VERSION_H_ #define _VERSION_H_ -#define ATHENA_MAJOR_VERSION 1 // Major Version -#define ATHENA_MINOR_VERSION 0 // Minor Version -#define ATHENA_REVISION 0 // Revision +#define ATHENA_MAJOR_VERSION 1 // Major Version +#define ATHENA_MINOR_VERSION 0 // Minor Version +#define ATHENA_REVISION 0 // Revision -#define ATHENA_RELEASE_FLAG 1 // 1=Develop,0=Stable -#define ATHENA_OFFICIAL_FLAG 1 // 1=Mod,0=Official +#define ATHENA_RELEASE_FLAG 1 // 1=Develop,0=Stable +#define ATHENA_OFFICIAL_FLAG 1 // 1=Mod,0=Official -#define ATHENA_SERVER_LOGIN 1 // login server -#define ATHENA_SERVER_CHAR 2 // char server -#define ATHENA_SERVER_INTER 4 // inter server -#define ATHENA_SERVER_MAP 8 // map server +#define ATHENA_SERVER_LOGIN 1 // login server +#define ATHENA_SERVER_CHAR 2 // char server +#define ATHENA_SERVER_INTER 4 // inter server +#define ATHENA_SERVER_MAP 8 // map server // ATHENA_MOD_VERSIONはパッチ番号です。 // これは無理に変えなくても気が向いたら変える程度の扱いで。 @@ -22,6 +22,6 @@ // あんまり信用しないこと。 // 鯖snapshotの時や、大きな変更があった場合は設定してほしいです。 // C言語の仕様上、最初に0を付けると8進数になるので間違えないで下さい。 -#define ATHENA_MOD_VERSION 1052 // mod version (patch No.) +#define ATHENA_MOD_VERSION 1052 // mod version (patch No.) #endif diff --git a/src/ladmin/ladmin.c b/src/ladmin/ladmin.c index 810be57..9ea2b28 100644 --- a/src/ladmin/ladmin.c +++ b/src/ladmin/ladmin.c @@ -10,17 +10,17 @@ #include <stdio.h> #include <stdlib.h> #include <netinet/in.h> -#include <sys/time.h> // gettimeofday +#include <sys/time.h> // gettimeofday #include <time.h> #include <sys/ioctl.h> -#include <unistd.h> // close +#include <unistd.h> // close #include <signal.h> #include <fcntl.h> -#include <string.h> // str* -#include <arpa/inet.h> // inet_addr -#include <netdb.h> // gethostbyname -#include <stdarg.h> // valist -#include <ctype.h> // tolower +#include <string.h> // str* +#include <arpa/inet.h> // inet_addr +#include <netdb.h> // gethostbyname +#include <stdarg.h> // valist +#include <ctype.h> // tolower #include "core.h" #include "socket.h" @@ -49,15 +49,15 @@ extern int eathena_interactive_session; // from core.c // Be sure that you authorize remote administration in login-server // (see login_athena.conf, 'admin_state' parameter) //------------------------------------------------------------------------- -char loginserverip[16] = "127.0.0.1"; // IP of login-server -int loginserverport = 6900; // Port of login-server -char loginserveradminpassword[24] = "admin"; // Administration password +char loginserverip[16] = "127.0.0.1"; // IP of login-server +int loginserverport = 6900; // Port of login-server +char loginserveradminpassword[24] = "admin"; // Administration password #ifdef PASSWORDENC -int passenc = 2; // Encoding type of the password +int passenc = 2; // Encoding type of the password #else -int passenc = 0; // Encoding type of the password +int passenc = 0; // Encoding type of the password #endif -char defaultlanguage = 'E'; // Default language (F: Fran軋is/E: English) +char defaultlanguage = 'E'; // Default language (F: Fran軋is/E: English) // (if it's not 'F', default is English) char ladmin_log_filename[1024] = "log/ladmin.log"; char date_format[32] = "%Y-%m-%d %H:%M:%S"; @@ -244,953 +244,1438 @@ char date_format[32] = "%Y-%m-%d %H:%M:%S"; // Displays complete information of an account. // //------------------------------------------------------------------------- -int login_fd; -int login_ip; -int bytes_to_read = 0; // flag to know if we waiting bytes from login-server +int login_fd; +int login_ip; +int bytes_to_read = 0; // flag to know if we waiting bytes from login-server char command[1024]; char parameters[1024]; -int list_first, list_last, list_type, list_count; // parameter to display a list of accounts -int already_exit_function = 0; // sometimes, the exit function is called twice... so, don't log twice the message +int list_first, list_last, list_type, list_count; // parameter to display a list of accounts +int already_exit_function = 0; // sometimes, the exit function is called twice... so, don't log twice the message //------------------------------ // Writing function of logs file //------------------------------ -int ladmin_log(char *fmt, ...) { - FILE *logfp; - va_list ap; - struct timeval tv; - char tmpstr[2048]; - - va_start(ap, fmt); - - logfp = fopen_(ladmin_log_filename, "a"); - if (logfp) { - if (fmt[0] == '\0') // jump a line if no message - fprintf(logfp, RETCODE); - else { - gettimeofday(&tv, NULL); - strftime(tmpstr, 24, date_format, localtime(&(tv.tv_sec))); - sprintf(tmpstr + strlen(tmpstr), ".%03d: %s", (int)tv.tv_usec / 1000, fmt); - vfprintf(logfp, tmpstr, ap); - } - fclose_(logfp); - } +int ladmin_log (char *fmt, ...) +{ + FILE *logfp; + va_list ap; + struct timeval tv; + char tmpstr[2048]; + + va_start (ap, fmt); + + logfp = fopen_ (ladmin_log_filename, "a"); + if (logfp) + { + if (fmt[0] == '\0') // jump a line if no message + fprintf (logfp, RETCODE); + else + { + gettimeofday (&tv, NULL); + strftime (tmpstr, 24, date_format, localtime (&(tv.tv_sec))); + sprintf (tmpstr + strlen (tmpstr), ".%03d: %s", + (int) tv.tv_usec / 1000, fmt); + vfprintf (logfp, tmpstr, ap); + } + fclose_ (logfp); + } - va_end(ap); - return 0; + va_end (ap); + return 0; } //----------------------------------------------------- // Function to suppress control characters in a string. //----------------------------------------------------- -int remove_control_chars(unsigned char *str) { - int i; - int change = 0; - - for(i = 0; str[i]; i++) { - if (str[i] < 32) { - str[i] = '_'; - change = 1; - } - } +int remove_control_chars (unsigned char *str) +{ + int i; + int change = 0; + + for (i = 0; str[i]; i++) + { + if (str[i] < 32) + { + str[i] = '_'; + change = 1; + } + } - return change; + return change; } //--------------------------------------------- // Function to return ordonal text of a number. //--------------------------------------------- -char* makeordinal(int number) { - if (defaultlanguage == 'F') { - if (number == 0) - return ""; - else if (number == 1) - return "er"; - else - return "鑪e"; - } else { - if ((number % 10) < 4 && (number % 10) != 0 && (number < 10 || number > 20)) { - if ((number % 10) == 1) - return "st"; - else if ((number % 10) == 2) - return "nd"; - else - return "rd"; - } else { - return "th"; - } - } - return ""; +char *makeordinal (int number) +{ + if (defaultlanguage == 'F') + { + if (number == 0) + return ""; + else if (number == 1) + return "er"; + else + return "鑪e"; + } + else + { + if ((number % 10) < 4 && (number % 10) != 0 + && (number < 10 || number > 20)) + { + if ((number % 10) == 1) + return "st"; + else if ((number % 10) == 2) + return "nd"; + else + return "rd"; + } + else + { + return "th"; + } + } + return ""; } //----------------------------------------------------------------------------------------- // Function to test of the validity of an account name (return 0 if incorrect, and 1 if ok) //----------------------------------------------------------------------------------------- -int verify_accountname(char* account_name) { - int i; - - for(i = 0; account_name[i]; i++) { - if (account_name[i] < 32) { - if (defaultlanguage == 'F') { - printf("Caract鑽e interdit trouv dans le nom du compte (%d%s caract鑽e).\n", i+1, makeordinal(i+1)); - ladmin_log("Caract鑽e interdit trouv dans le nom du compte (%d%s caract鑽e)." RETCODE, i+1, makeordinal(i+1)); - } else { - printf("Illegal character found in the account name (%d%s character).\n", i+1, makeordinal(i+1)); - ladmin_log("Illegal character found in the account name (%d%s character)." RETCODE, i+1, makeordinal(i+1)); - } - return 0; - } - } - - if (strlen(account_name) < 4) { - if (defaultlanguage == 'F') { - printf("Nom du compte trop court. Entrez un nom de compte de 4-23 caract鑽es.\n"); - ladmin_log("Nom du compte trop court. Entrez un nom de compte de 4-23 caract鑽es." RETCODE); - } else { - printf("Account name is too short. Please input an account name of 4-23 bytes.\n"); - ladmin_log("Account name is too short. Please input an account name of 4-23 bytes." RETCODE); - } - return 0; - } - - if (strlen(account_name) > 23) { - if (defaultlanguage == 'F') { - printf("Nom du compte trop long. Entrez un nom de compte de 4-23 caract鑽es.\n"); - ladmin_log("Nom du compte trop long. Entrez un nom de compte de 4-23 caract鑽es." RETCODE); - } else { - printf("Account name is too long. Please input an account name of 4-23 bytes.\n"); - ladmin_log("Account name is too long. Please input an account name of 4-23 bytes." RETCODE); - } - return 0; - } +int verify_accountname (char *account_name) +{ + int i; + + for (i = 0; account_name[i]; i++) + { + if (account_name[i] < 32) + { + if (defaultlanguage == 'F') + { + printf + ("Caract鑽e interdit trouv dans le nom du compte (%d%s caract鑽e).\n", + i + 1, makeordinal (i + 1)); + ladmin_log + ("Caract鑽e interdit trouv dans le nom du compte (%d%s caract鑽e)." + RETCODE, i + 1, makeordinal (i + 1)); + } + else + { + printf + ("Illegal character found in the account name (%d%s character).\n", + i + 1, makeordinal (i + 1)); + ladmin_log + ("Illegal character found in the account name (%d%s character)." + RETCODE, i + 1, makeordinal (i + 1)); + } + return 0; + } + } + + if (strlen (account_name) < 4) + { + if (defaultlanguage == 'F') + { + printf + ("Nom du compte trop court. Entrez un nom de compte de 4-23 caract鑽es.\n"); + ladmin_log + ("Nom du compte trop court. Entrez un nom de compte de 4-23 caract鑽es." + RETCODE); + } + else + { + printf + ("Account name is too short. Please input an account name of 4-23 bytes.\n"); + ladmin_log + ("Account name is too short. Please input an account name of 4-23 bytes." + RETCODE); + } + return 0; + } + + if (strlen (account_name) > 23) + { + if (defaultlanguage == 'F') + { + printf + ("Nom du compte trop long. Entrez un nom de compte de 4-23 caract鑽es.\n"); + ladmin_log + ("Nom du compte trop long. Entrez un nom de compte de 4-23 caract鑽es." + RETCODE); + } + else + { + printf + ("Account name is too long. Please input an account name of 4-23 bytes.\n"); + ladmin_log + ("Account name is too long. Please input an account name of 4-23 bytes." + RETCODE); + } + return 0; + } - return 1; + return 1; } //--------------------------------------------------- // E-mail check: return 0 (not correct) or 1 (valid). //--------------------------------------------------- -int e_mail_check(unsigned char *email) { - char ch; - unsigned char* last_arobas; +int e_mail_check (unsigned char *email) +{ + char ch; + unsigned char *last_arobas; - // athena limits - if (strlen(email) < 3 || strlen(email) > 39) - return 0; + // athena limits + if (strlen (email) < 3 || strlen (email) > 39) + return 0; - // part of RFC limits (official reference of e-mail description) - if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@') - return 0; + // part of RFC limits (official reference of e-mail description) + if (strchr (email, '@') == NULL || email[strlen (email) - 1] == '@') + return 0; - if (email[strlen(email)-1] == '.') - return 0; + if (email[strlen (email) - 1] == '.') + return 0; - last_arobas = strrchr(email, '@'); + last_arobas = strrchr (email, '@'); - if (strstr(last_arobas, "@.") != NULL || - strstr(last_arobas, "..") != NULL) - return 0; + if (strstr (last_arobas, "@.") != NULL || + strstr (last_arobas, "..") != NULL) + return 0; - for(ch = 1; ch < 32; ch++) { - if (strchr(last_arobas, ch) != NULL) { - return 0; - break; - } - } + for (ch = 1; ch < 32; ch++) + { + if (strchr (last_arobas, ch) != NULL) + { + return 0; + break; + } + } - if (strchr(last_arobas, ' ') != NULL || - strchr(last_arobas, ';') != NULL) - return 0; + if (strchr (last_arobas, ' ') != NULL || + strchr (last_arobas, ';') != NULL) + return 0; - // all correct - return 1; + // all correct + return 1; } //---------------------------------- // Sub-function: Input of a password //---------------------------------- -int typepasswd(char * password) { - char password1[1023], password2[1023]; - int letter; - int i; - - if (defaultlanguage == 'F') { - ladmin_log("Aucun mot de passe n'a 騁 donn. Demande d'un mot de passe." RETCODE); - } else { - ladmin_log("No password was given. Request to obtain a password." RETCODE); - } - - memset(password1, '\0', sizeof(password1)); - memset(password2, '\0', sizeof(password2)); - if (defaultlanguage == 'F') - printf("\033[1;36m Entrez le mot de passe > \033[0;32;42m"); - else - printf("\033[1;36m Type the password > \033[0;32;42m"); - i = 0; - while ((letter = getchar()) != '\n') - password1[i++] = letter; - if (defaultlanguage == 'F') - printf("\033[0m\033[1;36m R-entrez le mot de passe > \033[0;32;42m"); - else - printf("\033[0m\033[1;36m Verify the password > \033[0;32;42m"); - i = 0; - while ((letter = getchar()) != '\n') - password2[i++] = letter; - - printf("\033[0m"); - fflush(stdout); - fflush(stdin); - - if (strcmp(password1, password2) != 0) { - if (defaultlanguage == 'F') { - printf("Erreur de v駻ification du mot de passe: Saisissez le m麥e mot de passe svp.\n"); - ladmin_log("Erreur de v駻ification du mot de passe: Saisissez le m麥e mot de passe svp." RETCODE); - ladmin_log(" Premier mot de passe: %s, second mot de passe: %s." RETCODE, password1, password2); - } else { - printf("Password verification failed. Please input same password.\n"); - ladmin_log("Password verification failed. Please input same password." RETCODE); - ladmin_log(" First password: %s, second password: %s." RETCODE, password1, password2); - } - return 0; - } - if (defaultlanguage == 'F') { - ladmin_log("Mot de passe saisi: %s." RETCODE, password1); - } else { - ladmin_log("Typed password: %s." RETCODE, password1); - } - strcpy(password, password1); - return 1; +int typepasswd (char *password) +{ + char password1[1023], password2[1023]; + int letter; + int i; + + if (defaultlanguage == 'F') + { + ladmin_log + ("Aucun mot de passe n'a 騁 donn. Demande d'un mot de passe." + RETCODE); + } + else + { + ladmin_log ("No password was given. Request to obtain a password." + RETCODE); + } + + memset (password1, '\0', sizeof (password1)); + memset (password2, '\0', sizeof (password2)); + if (defaultlanguage == 'F') + printf ("\033[1;36m Entrez le mot de passe > \033[0;32;42m"); + else + printf ("\033[1;36m Type the password > \033[0;32;42m"); + i = 0; + while ((letter = getchar ()) != '\n') + password1[i++] = letter; + if (defaultlanguage == 'F') + printf + ("\033[0m\033[1;36m R-entrez le mot de passe > \033[0;32;42m"); + else + printf ("\033[0m\033[1;36m Verify the password > \033[0;32;42m"); + i = 0; + while ((letter = getchar ()) != '\n') + password2[i++] = letter; + + printf ("\033[0m"); + fflush (stdout); + fflush (stdin); + + if (strcmp (password1, password2) != 0) + { + if (defaultlanguage == 'F') + { + printf + ("Erreur de v駻ification du mot de passe: Saisissez le m麥e mot de passe svp.\n"); + ladmin_log + ("Erreur de v駻ification du mot de passe: Saisissez le m麥e mot de passe svp." + RETCODE); + ladmin_log (" Premier mot de passe: %s, second mot de passe: %s." + RETCODE, password1, password2); + } + else + { + printf + ("Password verification failed. Please input same password.\n"); + ladmin_log + ("Password verification failed. Please input same password." + RETCODE); + ladmin_log (" First password: %s, second password: %s." RETCODE, + password1, password2); + } + return 0; + } + if (defaultlanguage == 'F') + { + ladmin_log ("Mot de passe saisi: %s." RETCODE, password1); + } + else + { + ladmin_log ("Typed password: %s." RETCODE, password1); + } + strcpy (password, password1); + return 1; } //------------------------------------------------------------------------------------ // Sub-function: Test of the validity of password (return 0 if incorrect, and 1 if ok) //------------------------------------------------------------------------------------ -int verify_password(char * password) { - int i; - - for(i = 0; password[i]; i++) { - if (password[i] < 32) { - if (defaultlanguage == 'F') { - printf("Caract鑽e interdit trouv dans le mot de passe (%d%s caract鑽e).\n", i+1, makeordinal(i+1)); - ladmin_log("Caract鑽e interdit trouv dans le nom du compte (%d%s caract鑽e)." RETCODE, i+1, makeordinal(i+1)); - } else { - printf("Illegal character found in the password (%d%s character).\n", i+1, makeordinal(i+1)); - ladmin_log("Illegal character found in the password (%d%s character)." RETCODE, i+1, makeordinal(i+1)); - } - return 0; - } - } - - if (strlen(password) < 4) { - if (defaultlanguage == 'F') { - printf("Nom du compte trop court. Entrez un nom de compte de 4-23 caract鑽es.\n"); - ladmin_log("Nom du compte trop court. Entrez un nom de compte de 4-23 caract鑽es." RETCODE); - } else { - printf("Account name is too short. Please input an account name of 4-23 bytes.\n"); - ladmin_log("Account name is too short. Please input an account name of 4-23 bytes." RETCODE); - } - return 0; - } - - if (strlen(password) > 23) { - if (defaultlanguage == 'F') { - printf("Mot de passe trop long. Entrez un mot de passe de 4-23 caract鑽es.\n"); - ladmin_log("Mot de passe trop long. Entrez un mot de passe de 4-23 caract鑽es." RETCODE); - } else { - printf("Password is too long. Please input a password of 4-23 bytes.\n"); - ladmin_log("Password is too long. Please input a password of 4-23 bytes." RETCODE); - } - return 0; - } +int verify_password (char *password) +{ + int i; + + for (i = 0; password[i]; i++) + { + if (password[i] < 32) + { + if (defaultlanguage == 'F') + { + printf + ("Caract鑽e interdit trouv dans le mot de passe (%d%s caract鑽e).\n", + i + 1, makeordinal (i + 1)); + ladmin_log + ("Caract鑽e interdit trouv dans le nom du compte (%d%s caract鑽e)." + RETCODE, i + 1, makeordinal (i + 1)); + } + else + { + printf + ("Illegal character found in the password (%d%s character).\n", + i + 1, makeordinal (i + 1)); + ladmin_log + ("Illegal character found in the password (%d%s character)." + RETCODE, i + 1, makeordinal (i + 1)); + } + return 0; + } + } + + if (strlen (password) < 4) + { + if (defaultlanguage == 'F') + { + printf + ("Nom du compte trop court. Entrez un nom de compte de 4-23 caract鑽es.\n"); + ladmin_log + ("Nom du compte trop court. Entrez un nom de compte de 4-23 caract鑽es." + RETCODE); + } + else + { + printf + ("Account name is too short. Please input an account name of 4-23 bytes.\n"); + ladmin_log + ("Account name is too short. Please input an account name of 4-23 bytes." + RETCODE); + } + return 0; + } + + if (strlen (password) > 23) + { + if (defaultlanguage == 'F') + { + printf + ("Mot de passe trop long. Entrez un mot de passe de 4-23 caract鑽es.\n"); + ladmin_log + ("Mot de passe trop long. Entrez un mot de passe de 4-23 caract鑽es." + RETCODE); + } + else + { + printf + ("Password is too long. Please input a password of 4-23 bytes.\n"); + ladmin_log + ("Password is too long. Please input a password of 4-23 bytes." + RETCODE); + } + return 0; + } - return 1; + return 1; } //------------------------------------------------------------------ // Sub-function: Check the name of a command (return complete name) //----------------------------------------------------------------- -int check_command(char * command) { +int check_command (char *command) +{ // help - if (strncmp(command, "aide", 2) == 0 && strncmp(command, "aide", strlen(command)) == 0) // not 1 letter command: 'aide' or 'add'? - strcpy(command, "aide"); - else if (strncmp(command, "help", 1) == 0 && strncmp(command, "help", strlen(command)) == 0) - strcpy(command, "help"); + if (strncmp (command, "aide", 2) == 0 && strncmp (command, "aide", strlen (command)) == 0) // not 1 letter command: 'aide' or 'add'? + strcpy (command, "aide"); + else if (strncmp (command, "help", 1) == 0 + && strncmp (command, "help", strlen (command)) == 0) + strcpy (command, "help"); // general commands - else if (strncmp(command, "add", 2) == 0 && strncmp(command, "add", strlen(command)) == 0) // not 1 letter command: 'aide' or 'add'? - strcpy(command, "add"); - else if ((strncmp(command, "ban", 3) == 0 && strncmp(command, "ban", strlen(command)) == 0) || - (strncmp(command, "banish", 4) == 0 && strncmp(command, "banish", strlen(command)) == 0)) - strcpy(command, "ban"); - else if ((strncmp(command, "banadd", 4) == 0 && strncmp(command, "banadd", strlen(command)) == 0) || // not 1 letter command: 'ba' or 'bs'? 'banadd' or 'banset' ? - strcmp(command, "ba") == 0) - strcpy(command, "banadd"); - else if ((strncmp(command, "banset", 4) == 0 && strncmp(command, "banset", strlen(command)) == 0) || // not 1 letter command: 'ba' or 'bs'? 'banadd' or 'banset' ? - strcmp(command, "bs") == 0) - strcpy(command, "banset"); - else if (strncmp(command, "block", 2) == 0 && strncmp(command, "block", strlen(command)) == 0) - strcpy(command, "block"); - else if (strncmp(command, "check", 2) == 0 && strncmp(command, "check", strlen(command)) == 0) // not 1 letter command: 'check' or 'create'? - strcpy(command, "check"); - else if (strncmp(command, "create", 2) == 0 && strncmp(command, "create", strlen(command)) == 0) // not 1 letter command: 'check' or 'create'? - strcpy(command, "create"); - else if (strncmp(command, "delete", 1) == 0 && strncmp(command, "delete", strlen(command)) == 0) - strcpy(command, "delete"); - else if ((strncmp(command, "email", 2) == 0 && strncmp(command, "email", strlen(command)) == 0) || // not 1 letter command: 'email', 'end' or 'exit'? - (strncmp(command, "e-mail", 2) == 0 && strncmp(command, "e-mail", strlen(command)) == 0)) - strcpy(command, "email"); - else if (strncmp(command, "getcount", 2) == 0 && strncmp(command, "getcount", strlen(command)) == 0) // not 1 letter command: 'getcount' or 'gm'? - strcpy(command, "getcount"); -// else if (strncmp(command, "gm", 2) == 0 && strncmp(command, "gm", strlen(command)) == 0) // not 1 letter command: 'getcount' or 'gm'? -// strcpy(command, "gm"); -// else if (strncmp(command, "id", 2) == 0 && strncmp(command, "id", strlen(command)) == 0) // not 1 letter command: 'id' or 'info'? -// strcpy(command, "id"); - else if (strncmp(command, "info", 2) == 0 && strncmp(command, "info", strlen(command)) == 0) // not 1 letter command: 'id' or 'info'? - strcpy(command, "info"); -// else if (strncmp(command, "kami", 4) == 0 && strncmp(command, "kami", strlen(command)) == 0) // only all letters command: 'kami' or 'kamib'? -// strcpy(command, "kami"); -// else if (strncmp(command, "kamib", 5) == 0 && strncmp(command, "kamib", strlen(command)) == 0) // only all letters command: 'kami' or 'kamib'? -// strcpy(command, "kamib"); - else if ((strncmp(command, "language", 2) == 0 && strncmp(command, "language", strlen(command)) == 0)) // not 1 letter command: 'language' or 'list'? - strcpy(command, "language"); - else if ((strncmp(command, "list", 2) == 0 && strncmp(command, "list", strlen(command)) == 0) || // 'list' is default list command // not 1 letter command: 'language' or 'list'? - strcmp(command, "ls") == 0) - strcpy(command, "list"); - else if (strncmp(command, "itemfrob", 6) == 0) - strcpy(command, "itemfrob"); - else if ((strncmp(command, "listban", 5) == 0 && strncmp(command, "listban", strlen(command)) == 0) || - (strncmp(command, "lsban", 3) == 0 && strncmp(command, "lsban", strlen(command)) == 0) || - strcmp(command, "lb") == 0) - strcpy(command, "listban"); - else if ((strncmp(command, "listgm", 5) == 0 && strncmp(command, "listgm", strlen(command)) == 0) || - (strncmp(command, "lsgm", 3) == 0 && strncmp(command, "lsgm", strlen(command)) == 0) || - strcmp(command, "lg") == 0) - strcpy(command, "listgm"); - else if ((strncmp(command, "listok", 5) == 0 && strncmp(command, "listok", strlen(command)) == 0) || - (strncmp(command, "lsok", 3) == 0 && strncmp(command, "lsok", strlen(command)) == 0) || - strcmp(command, "lo") == 0) - strcpy(command, "listok"); - else if (strncmp(command, "memo", 1) == 0 && strncmp(command, "memo", strlen(command)) == 0) - strcpy(command, "memo"); - else if (strncmp(command, "name", 1) == 0 && strncmp(command, "name", strlen(command)) == 0) - strcpy(command, "name"); - else if ((strncmp(command, "password", 1) == 0 && strncmp(command, "password", strlen(command)) == 0) || - strcmp(command, "passwd") == 0) - strcpy(command, "password"); - else if (strncmp(command, "reloadgm", 1) == 0 && strncmp(command, "reloadgm", strlen(command)) == 0) - strcpy(command, "reloadgm"); - else if (strncmp(command, "search", 3) == 0 && strncmp(command, "search", strlen(command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'? - strcpy(command, "search"); // not 2 letters command: 'search' or 'sex'? -// else if (strncmp(command, "sex", 3) == 0 && strncmp(command, "sex", strlen(command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'? -// strcpy(command, "sex"); // not 2 letters command: 'search' or 'sex'? - else if (strncmp(command, "state", 2) == 0 && strncmp(command, "state", strlen(command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'? - strcpy(command, "state"); - else if ((strncmp(command, "timeadd", 5) == 0 && strncmp(command, "timeadd", strlen(command)) == 0) || // not 1 letter command: 'ta' or 'ts'? 'timeadd' or 'timeset'? - strcmp(command, "ta") == 0) - strcpy(command, "timeadd"); - else if ((strncmp(command, "timeset", 5) == 0 && strncmp(command, "timeset", strlen(command)) == 0) || // not 1 letter command: 'ta' or 'ts'? 'timeadd' or 'timeset'? - strcmp(command, "ts") == 0) - strcpy(command, "timeset"); - else if ((strncmp(command, "unban", 5) == 0 && strncmp(command, "unban", strlen(command)) == 0) || - (strncmp(command, "unbanish", 4) == 0 && strncmp(command, "unbanish", strlen(command)) == 0)) - strcpy(command, "unban"); - else if (strncmp(command, "unblock", 4) == 0 && strncmp(command, "unblock", strlen(command)) == 0) - strcpy(command, "unblock"); - else if (strncmp(command, "version", 1) == 0 && strncmp(command, "version", strlen(command)) == 0) - strcpy(command, "version"); - else if (strncmp(command, "who", 1) == 0 && strncmp(command, "who", strlen(command)) == 0) - strcpy(command, "who"); + else if (strncmp (command, "add", 2) == 0 && strncmp (command, "add", strlen (command)) == 0) // not 1 letter command: 'aide' or 'add'? + strcpy (command, "add"); + else if ((strncmp (command, "ban", 3) == 0 + && strncmp (command, "ban", strlen (command)) == 0) + || (strncmp (command, "banish", 4) == 0 + && strncmp (command, "banish", strlen (command)) == 0)) + strcpy (command, "ban"); + else if ((strncmp (command, "banadd", 4) == 0 && strncmp (command, "banadd", strlen (command)) == 0) || // not 1 letter command: 'ba' or 'bs'? 'banadd' or 'banset' ? + strcmp (command, "ba") == 0) + strcpy (command, "banadd"); + else if ((strncmp (command, "banset", 4) == 0 && strncmp (command, "banset", strlen (command)) == 0) || // not 1 letter command: 'ba' or 'bs'? 'banadd' or 'banset' ? + strcmp (command, "bs") == 0) + strcpy (command, "banset"); + else if (strncmp (command, "block", 2) == 0 + && strncmp (command, "block", strlen (command)) == 0) + strcpy (command, "block"); + else if (strncmp (command, "check", 2) == 0 && strncmp (command, "check", strlen (command)) == 0) // not 1 letter command: 'check' or 'create'? + strcpy (command, "check"); + else if (strncmp (command, "create", 2) == 0 && strncmp (command, "create", strlen (command)) == 0) // not 1 letter command: 'check' or 'create'? + strcpy (command, "create"); + else if (strncmp (command, "delete", 1) == 0 + && strncmp (command, "delete", strlen (command)) == 0) + strcpy (command, "delete"); + else if ((strncmp (command, "email", 2) == 0 && strncmp (command, "email", strlen (command)) == 0) || // not 1 letter command: 'email', 'end' or 'exit'? + (strncmp (command, "e-mail", 2) == 0 + && strncmp (command, "e-mail", strlen (command)) == 0)) + strcpy (command, "email"); + else if (strncmp (command, "getcount", 2) == 0 && strncmp (command, "getcount", strlen (command)) == 0) // not 1 letter command: 'getcount' or 'gm'? + strcpy (command, "getcount"); +// else if (strncmp(command, "gm", 2) == 0 && strncmp(command, "gm", strlen(command)) == 0) // not 1 letter command: 'getcount' or 'gm'? +// strcpy(command, "gm"); +// else if (strncmp(command, "id", 2) == 0 && strncmp(command, "id", strlen(command)) == 0) // not 1 letter command: 'id' or 'info'? +// strcpy(command, "id"); + else if (strncmp (command, "info", 2) == 0 && strncmp (command, "info", strlen (command)) == 0) // not 1 letter command: 'id' or 'info'? + strcpy (command, "info"); +// else if (strncmp(command, "kami", 4) == 0 && strncmp(command, "kami", strlen(command)) == 0) // only all letters command: 'kami' or 'kamib'? +// strcpy(command, "kami"); +// else if (strncmp(command, "kamib", 5) == 0 && strncmp(command, "kamib", strlen(command)) == 0) // only all letters command: 'kami' or 'kamib'? +// strcpy(command, "kamib"); + else if ((strncmp (command, "language", 2) == 0 && strncmp (command, "language", strlen (command)) == 0)) // not 1 letter command: 'language' or 'list'? + strcpy (command, "language"); + else if ((strncmp (command, "list", 2) == 0 && strncmp (command, "list", strlen (command)) == 0) || // 'list' is default list command // not 1 letter command: 'language' or 'list'? + strcmp (command, "ls") == 0) + strcpy (command, "list"); + else if (strncmp (command, "itemfrob", 6) == 0) + strcpy (command, "itemfrob"); + else if ((strncmp (command, "listban", 5) == 0 + && strncmp (command, "listban", strlen (command)) == 0) + || (strncmp (command, "lsban", 3) == 0 + && strncmp (command, "lsban", strlen (command)) == 0) + || strcmp (command, "lb") == 0) + strcpy (command, "listban"); + else if ((strncmp (command, "listgm", 5) == 0 + && strncmp (command, "listgm", strlen (command)) == 0) + || (strncmp (command, "lsgm", 3) == 0 + && strncmp (command, "lsgm", strlen (command)) == 0) + || strcmp (command, "lg") == 0) + strcpy (command, "listgm"); + else if ((strncmp (command, "listok", 5) == 0 + && strncmp (command, "listok", strlen (command)) == 0) + || (strncmp (command, "lsok", 3) == 0 + && strncmp (command, "lsok", strlen (command)) == 0) + || strcmp (command, "lo") == 0) + strcpy (command, "listok"); + else if (strncmp (command, "memo", 1) == 0 + && strncmp (command, "memo", strlen (command)) == 0) + strcpy (command, "memo"); + else if (strncmp (command, "name", 1) == 0 + && strncmp (command, "name", strlen (command)) == 0) + strcpy (command, "name"); + else if ((strncmp (command, "password", 1) == 0 + && strncmp (command, "password", strlen (command)) == 0) + || strcmp (command, "passwd") == 0) + strcpy (command, "password"); + else if (strncmp (command, "reloadgm", 1) == 0 + && strncmp (command, "reloadgm", strlen (command)) == 0) + strcpy (command, "reloadgm"); + else if (strncmp (command, "search", 3) == 0 && strncmp (command, "search", strlen (command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'? + strcpy (command, "search"); // not 2 letters command: 'search' or 'sex'? +// else if (strncmp(command, "sex", 3) == 0 && strncmp(command, "sex", strlen(command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'? +// strcpy(command, "sex"); // not 2 letters command: 'search' or 'sex'? + else if (strncmp (command, "state", 2) == 0 && strncmp (command, "state", strlen (command)) == 0) // not 1 letter command: 'search', 'state' or 'sex'? + strcpy (command, "state"); + else if ((strncmp (command, "timeadd", 5) == 0 && strncmp (command, "timeadd", strlen (command)) == 0) || // not 1 letter command: 'ta' or 'ts'? 'timeadd' or 'timeset'? + strcmp (command, "ta") == 0) + strcpy (command, "timeadd"); + else if ((strncmp (command, "timeset", 5) == 0 && strncmp (command, "timeset", strlen (command)) == 0) || // not 1 letter command: 'ta' or 'ts'? 'timeadd' or 'timeset'? + strcmp (command, "ts") == 0) + strcpy (command, "timeset"); + else if ((strncmp (command, "unban", 5) == 0 + && strncmp (command, "unban", strlen (command)) == 0) + || (strncmp (command, "unbanish", 4) == 0 + && strncmp (command, "unbanish", strlen (command)) == 0)) + strcpy (command, "unban"); + else if (strncmp (command, "unblock", 4) == 0 + && strncmp (command, "unblock", strlen (command)) == 0) + strcpy (command, "unblock"); + else if (strncmp (command, "version", 1) == 0 + && strncmp (command, "version", strlen (command)) == 0) + strcpy (command, "version"); + else if (strncmp (command, "who", 1) == 0 + && strncmp (command, "who", strlen (command)) == 0) + strcpy (command, "who"); // quit - else if (strncmp(command, "quit", 1) == 0 && strncmp(command, "quit", strlen(command)) == 0) - strcpy(command, "quit"); - else if (strncmp(command, "exit", 2) == 0 && strncmp(command, "exit", strlen(command)) == 0) // not 1 letter command: 'email', 'end' or 'exit'? - strcpy(command, "exit"); - else if (strncmp(command, "end", 2) == 0 && strncmp(command, "end", strlen(command)) == 0) // not 1 letter command: 'email', 'end' or 'exit'? - strcpy(command, "end"); - - return 0; + else if (strncmp (command, "quit", 1) == 0 + && strncmp (command, "quit", strlen (command)) == 0) + strcpy (command, "quit"); + else if (strncmp (command, "exit", 2) == 0 && strncmp (command, "exit", strlen (command)) == 0) // not 1 letter command: 'email', 'end' or 'exit'? + strcpy (command, "exit"); + else if (strncmp (command, "end", 2) == 0 && strncmp (command, "end", strlen (command)) == 0) // not 1 letter command: 'email', 'end' or 'exit'? + strcpy (command, "end"); + + return 0; } //----------------------------------------- // Sub-function: Display commands of ladmin //----------------------------------------- -void display_help(char* param, int language) { - char command[1023]; - int i; - - memset(command, '\0', sizeof(command)); - - if (sscanf(param, "%s ", command) < 1 || strlen(command) == 0) - strcpy(command, ""); // any value that is not a command - - if (command[0] == '?') { - if (defaultlanguage == 'F') - strcpy(command, "aide"); - else - strcpy(command, "help"); - } - - // lowercase for command - for (i = 0; command[i]; i++) - command[i] = tolower(command[i]); - - // Analyse of the command - check_command(command); // give complete name to the command - - if (defaultlanguage == 'F') { - ladmin_log("Affichage des commandes ou d'une commande." RETCODE); - } else { - ladmin_log("Displaying of the commands or a command." RETCODE); - } - - if (language == 1) { - if (strcmp(command, "aide") == 0) { - printf("aide/help/?\n"); - printf(" Affiche la description des commandes\n"); - printf("aide/help/? [commande]\n"); - printf(" Affiche la description de la commande specifi馥\n"); - } else if (strcmp(command, "help") == 0 ) { - printf("aide/help/?\n"); - printf(" Display the description of the commands\n"); - printf("aide/help/? [command]\n"); - printf(" Display the description of the specified command\n"); +void display_help (char *param, int language) +{ + char command[1023]; + int i; + + memset (command, '\0', sizeof (command)); + + if (sscanf (param, "%s ", command) < 1 || strlen (command) == 0) + strcpy (command, ""); // any value that is not a command + + if (command[0] == '?') + { + if (defaultlanguage == 'F') + strcpy (command, "aide"); + else + strcpy (command, "help"); + } + + // lowercase for command + for (i = 0; command[i]; i++) + command[i] = tolower (command[i]); + + // Analyse of the command + check_command (command); // give complete name to the command + + if (defaultlanguage == 'F') + { + ladmin_log ("Affichage des commandes ou d'une commande." RETCODE); + } + else + { + ladmin_log ("Displaying of the commands or a command." RETCODE); + } + + if (language == 1) + { + if (strcmp (command, "aide") == 0) + { + printf ("aide/help/?\n"); + printf (" Affiche la description des commandes\n"); + printf ("aide/help/? [commande]\n"); + printf (" Affiche la description de la commande specifi馥\n"); + } + else if (strcmp (command, "help") == 0) + { + printf ("aide/help/?\n"); + printf (" Display the description of the commands\n"); + printf ("aide/help/? [command]\n"); + printf (" Display the description of the specified command\n"); // general commands - } else if (strcmp(command, "add") == 0) { - printf("add <nomcompte> <sexe> <motdepasse>\n"); - printf(" Cr馥 un compte avec l'email par d馭aut (a@a.com).\n"); - printf(" Concernant le sexe, seule la premi鑽e lettre compte (F ou M).\n"); - printf(" L'e-mail est a@a.com (e-mail par d馭aut). C'est comme n'avoir aucun e-mail.\n"); - printf(" Lorsque motdepasse est omis, la saisie se fait sans que la frappe se voit.\n"); - printf(" <exemple> add testname Male testpass\n"); - } else if (strcmp(command, "ban") == 0) { - printf("ban/banish aaaa/mm/jj hh:mm:ss <nom compte>\n"); - printf(" Change la date de fin de bannissement d'un compte.\n"); - printf(" Comme banset, mais <nom compte> est la fin.\n"); - } else if (strcmp(command, "banadd") == 0) { - printf("banadd <nomcompte> <Modificateur>\n"); - printf(" Ajoute ou soustrait du temps la date de banissement d'un compte.\n"); - printf(" Les modificateurs sont construits comme suit:\n"); - printf(" Valeur d'ajustement (-1, 1, +1, etc...)\n"); - printf(" El駑ent modifi:\n"); - printf(" a ou y: ann馥\n"); - printf(" m: mois\n"); - printf(" j ou d: jour\n"); - printf(" h: heure\n"); - printf(" mn: minute\n"); - printf(" s: seconde\n"); - printf(" <exemple> banadd testname +1m-2mn1s-6a\n"); - printf(" Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n"); - printf(" et 6 ans dans le m麥e temps.\n"); - printf("NOTE: Si vous modifez la date de banissement d'un compte non bani,\n"); - printf(" vous indiquez comme date (le moment actuel +- les ajustements)\n"); - } else if (strcmp(command, "banset") == 0) { - printf("banset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n"); - printf(" Change la date de fin de bannissement d'un compte.\n"); - printf(" Heure par d馭aut [hh:mm:ss]: 23:59:59.\n"); - printf("banset <nomcompte> 0\n"); - printf(" D饕anni un compte (0 = de-banni).\n"); - } else if (strcmp(command, "block") == 0) { - printf("block <nom compte>\n"); - printf(" Place le status d'un compte 5 (You have been blocked by the GM Team).\n"); - printf(" La commande est l'駲uivalent de state <nom_compte> 5.\n"); - } else if (strcmp(command, "check") == 0) { - printf("check <nomcompte> <motdepasse>\n"); - printf(" V駻ifie la validit d'un mot de passe pour un compte\n"); - printf(" NOTE: Le serveur n'enverra jamais un mot de passe.\n"); - printf(" C'est la seule m騁hode que vous poss馘ez pour savoir\n"); - printf(" si un mot de passe est le bon. L'autre m騁hode est\n"); - printf(" d'avoir un acc鑚 ('physique') au fichier des comptes.\n"); - } else if (strcmp(command, "create") == 0) { - printf("create <nomcompte> <sexe> <email> <motdepasse>\n"); - printf(" Comme la commande add, mais avec l'e-mail en plus.\n"); - printf(" <exemple> create testname Male mon@mail.com testpass\n"); - } else if (strcmp(command, "delete") == 0) { - printf("del <nom compte>\n"); - printf(" Supprime un compte.\n"); - printf(" La commande demande confirmation. Apr鑚 confirmation, le compte est d騁ruit.\n"); - } else if (strcmp(command, "email") == 0) { - printf("email <nomcompte> <email>\n"); - printf(" Modifie l'e-mail d'un compte.\n"); - } else if (strcmp(command, "getcount") == 0) { - printf("getcount\n"); - printf(" Donne le nombre de joueurs en ligne par serveur de char.\n"); - } else if (strcmp(command, "gm") == 0) { - printf("gm <nomcompte> [Niveau_GM]\n"); - printf(" Modifie le niveau de GM d'un compte.\n"); - printf(" Valeur par d馭aut: 0 (suppression du niveau de GM).\n"); - printf(" <exemple> gm nomtest 80\n"); - } else if (strcmp(command, "id") == 0) { - printf("id <nom compte>\n"); - printf(" Donne l'id d'un compte.\n"); - } else if (strcmp(command, "info") == 0) { - printf("info <idcompte>\n"); - printf(" Affiche les informations sur un compte.\n"); - } else if (strcmp(command, "kami") == 0) { - printf("kami <message>\n"); - printf(" Envoi un message g駭駻al sur tous les serveurs de map (en jaune).\n"); - } else if (strcmp(command, "kamib") == 0) { - printf("kamib <message>\n"); - printf(" Envoi un message g駭駻al sur tous les serveurs de map (en bleu).\n"); - } else if (strcmp(command, "language") == 0) { - printf("language <langue>\n"); - printf(" Change la langue d'affichage.\n"); - printf(" Langues possibles: 'Fran軋is' ou 'English'.\n"); - } else if (strcmp(command, "list") == 0) { - printf("list/ls [Premier_id [Dernier_id]]\n"); - printf(" Affiche une liste de comptes.\n"); - printf(" 'Premier_id', 'Dernier_id': indique les identifiants de d駱art et de fin.\n"); - printf(" La recherche par nom n'est pas possible avec cette commande.\n"); - printf(" <example> list 10 9999999\n"); - } else if (strcmp(command, "itemfrob") == 0) { - printf("Not localised yet.\n"); - } else if (strcmp(command, "listban") == 0) { - printf("listBan/lsBan [Premier_id [Dernier_id]]\n"); - printf(" Comme list/ls, mais seulement pour les comptes avec statut ou bannis.\n"); - } else if (strcmp(command, "listgm") == 0) { - printf("listGM/lsGM [Premier_id [Dernier_id]]\n"); - printf(" Comme list/ls, mais seulement pour les comptes GM.\n"); - } else if (strcmp(command, "listok") == 0) { - printf("listOK/lsOK [Premier_id [Dernier_id]]\n"); - printf(" Comme list/ls, mais seulement pour les comptes sans statut et non bannis.\n"); - } else if (strcmp(command, "memo") == 0) { - printf("memo <nomcompte> <memo>\n"); - printf(" Modifie le m駑o d'un compte.\n"); - printf(" 'memo': Il peut avoir jusqu' 253 caract鑽es (avec des espaces ou non).\n"); - } else if (strcmp(command, "name") == 0) { - printf("name <idcompte>\n"); - printf(" Donne le nom d'un compte.\n"); - } else if (strcmp(command, "password") == 0) { - printf("passwd <nomcompte> <nouveaumotdepasse>\n"); - printf(" Change le mot de passe d'un compte.\n"); - printf(" Lorsque nouveaumotdepasse est omis,\n"); - printf(" la saisie se fait sans que la frappe ne se voit.\n"); - } else if (strcmp(command, "reloadgm") == 0) { - printf("reloadGM\n"); - printf(" Reload GM configuration file\n"); - } else if (strcmp(command, "search") == 0) { - printf("search <expression>\n"); - printf(" Cherche des comptes.\n"); - printf(" Affiche les comptes dont les noms correspondent.\n"); -// printf("search -r/-e/--expr/--regex <expression>\n"); -// printf(" Cherche des comptes par expression reguli鑽e.\n"); -// printf(" Affiche les comptes dont les noms correspondent.\n"); - } else if (strcmp(command, "sex") == 0) { - printf("sex <nomcompte> <sexe>\n"); - printf(" Modifie le sexe d'un compte.\n"); - printf(" <exemple> sex testname Male\n"); - } else if (strcmp(command, "state") == 0) { - printf("state <nomcompte> <nouveaustatut> <message_erreur_7>\n"); - printf(" Change le statut d'un compte.\n"); - printf(" 'nouveaustatut': Le statut est le m麥e que celui du packet 0x006a + 1.\n"); - printf(" les possibilit駸 sont:\n"); - printf(" 0 = Compte ok\n"); - printf(" 1 = Unregistered ID\n"); - printf(" 2 = Incorrect Password\n"); - printf(" 3 = This ID is expired\n"); - printf(" 4 = Rejected from Server\n"); - printf(" 5 = You have been blocked by the GM Team\n"); - printf(" 6 = Your Game's EXE file is not the latest version\n"); - printf(" 7 = You are Prohibited to log in until...\n"); - printf(" 8 = Server is jammed due to over populated\n"); - printf(" 9 = No MSG\n"); - printf(" 100 = This ID has been totally erased\n"); - printf(" all other values are 'No MSG', then use state 9 please.\n"); - printf(" 'message_erreur_7': message du code erreur 6 =\n"); - printf(" = Your are Prohibited to log in until... (packet 0x006a)\n"); - } else if (strcmp(command, "timeadd") == 0) { - printf("timeadd <nomcompte> <modificateur>\n"); - printf(" Ajoute/soustrait du temps la limite de validit d'un compte.\n"); - printf(" Le modificateur est compos comme suit:\n"); - printf(" Valeur modificatrice (-1, 1, +1, etc...)\n"); - printf(" El駑ent modifi:\n"); - printf(" a ou y: ann馥\n"); - printf(" m: mois\n"); - printf(" j ou d: jour\n"); - printf(" h: heure\n"); - printf(" mn: minute\n"); - printf(" s: seconde\n"); - printf(" <exemple> timeadd testname +1m-2mn1s-6a\n"); - printf(" Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n"); - printf(" et 6 ans dans le m麥e temps.\n"); - printf("NOTE: Vous ne pouvez pas modifier une limite de validit illimit馥. Si vous\n"); - printf(" d駸irez le faire, c'est que vous voulez probablement cr馥r un limite de\n"); - printf(" validit limit馥. Donc, en premier, fix une limite de valitid.\n"); - } else if (strcmp(command, "timeadd") == 0) { - printf("timeset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n"); - printf(" Change la limite de validit d'un compte.\n"); - printf(" Heure par d馭aut [hh:mm:ss]: 23:59:59.\n"); - printf("timeset <nomcompte> 0\n"); - printf(" Donne une limite de validit illimit馥 (0 = illimit馥).\n"); - } else if (strcmp(command, "unban") == 0) { - printf("unban/unbanish <nom compte>\n"); - printf(" Ote le banissement d'un compte.\n"); - printf(" La commande est l'駲uivalent de banset <nom_compte> 0.\n"); - } else if (strcmp(command, "unblock") == 0) { - printf("unblock <nom compte>\n"); - printf(" Place le status d'un compte 0 (Compte ok).\n"); - printf(" La commande est l'駲uivalent de state <nom_compte> 0.\n"); - } else if (strcmp(command, "version") == 0) { - printf("version\n"); - printf(" Affiche la version du login-serveur.\n"); - } else if (strcmp(command, "who") == 0) { - printf("who <nom compte>\n"); - printf(" Affiche les informations sur un compte.\n"); + } + else if (strcmp (command, "add") == 0) + { + printf ("add <nomcompte> <sexe> <motdepasse>\n"); + printf (" Cr馥 un compte avec l'email par d馭aut (a@a.com).\n"); + printf + (" Concernant le sexe, seule la premi鑽e lettre compte (F ou M).\n"); + printf + (" L'e-mail est a@a.com (e-mail par d馭aut). C'est comme n'avoir aucun e-mail.\n"); + printf + (" Lorsque motdepasse est omis, la saisie se fait sans que la frappe se voit.\n"); + printf (" <exemple> add testname Male testpass\n"); + } + else if (strcmp (command, "ban") == 0) + { + printf ("ban/banish aaaa/mm/jj hh:mm:ss <nom compte>\n"); + printf (" Change la date de fin de bannissement d'un compte.\n"); + printf (" Comme banset, mais <nom compte> est la fin.\n"); + } + else if (strcmp (command, "banadd") == 0) + { + printf ("banadd <nomcompte> <Modificateur>\n"); + printf + (" Ajoute ou soustrait du temps la date de banissement d'un compte.\n"); + printf (" Les modificateurs sont construits comme suit:\n"); + printf (" Valeur d'ajustement (-1, 1, +1, etc...)\n"); + printf (" El駑ent modifi:\n"); + printf (" a ou y: ann馥\n"); + printf (" m: mois\n"); + printf (" j ou d: jour\n"); + printf (" h: heure\n"); + printf (" mn: minute\n"); + printf (" s: seconde\n"); + printf (" <exemple> banadd testname +1m-2mn1s-6a\n"); + printf + (" Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n"); + printf (" et 6 ans dans le m麥e temps.\n"); + printf + ("NOTE: Si vous modifez la date de banissement d'un compte non bani,\n"); + printf + (" vous indiquez comme date (le moment actuel +- les ajustements)\n"); + } + else if (strcmp (command, "banset") == 0) + { + printf ("banset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n"); + printf (" Change la date de fin de bannissement d'un compte.\n"); + printf (" Heure par d馭aut [hh:mm:ss]: 23:59:59.\n"); + printf ("banset <nomcompte> 0\n"); + printf (" D饕anni un compte (0 = de-banni).\n"); + } + else if (strcmp (command, "block") == 0) + { + printf ("block <nom compte>\n"); + printf + (" Place le status d'un compte 5 (You have been blocked by the GM Team).\n"); + printf + (" La commande est l'駲uivalent de state <nom_compte> 5.\n"); + } + else if (strcmp (command, "check") == 0) + { + printf ("check <nomcompte> <motdepasse>\n"); + printf + (" V駻ifie la validit d'un mot de passe pour un compte\n"); + printf (" NOTE: Le serveur n'enverra jamais un mot de passe.\n"); + printf + (" C'est la seule m騁hode que vous poss馘ez pour savoir\n"); + printf + (" si un mot de passe est le bon. L'autre m騁hode est\n"); + printf + (" d'avoir un acc鑚 ('physique') au fichier des comptes.\n"); + } + else if (strcmp (command, "create") == 0) + { + printf ("create <nomcompte> <sexe> <email> <motdepasse>\n"); + printf (" Comme la commande add, mais avec l'e-mail en plus.\n"); + printf + (" <exemple> create testname Male mon@mail.com testpass\n"); + } + else if (strcmp (command, "delete") == 0) + { + printf ("del <nom compte>\n"); + printf (" Supprime un compte.\n"); + printf + (" La commande demande confirmation. Apr鑚 confirmation, le compte est d騁ruit.\n"); + } + else if (strcmp (command, "email") == 0) + { + printf ("email <nomcompte> <email>\n"); + printf (" Modifie l'e-mail d'un compte.\n"); + } + else if (strcmp (command, "getcount") == 0) + { + printf ("getcount\n"); + printf + (" Donne le nombre de joueurs en ligne par serveur de char.\n"); + } + else if (strcmp (command, "gm") == 0) + { + printf ("gm <nomcompte> [Niveau_GM]\n"); + printf (" Modifie le niveau de GM d'un compte.\n"); + printf + (" Valeur par d馭aut: 0 (suppression du niveau de GM).\n"); + printf (" <exemple> gm nomtest 80\n"); + } + else if (strcmp (command, "id") == 0) + { + printf ("id <nom compte>\n"); + printf (" Donne l'id d'un compte.\n"); + } + else if (strcmp (command, "info") == 0) + { + printf ("info <idcompte>\n"); + printf (" Affiche les informations sur un compte.\n"); + } + else if (strcmp (command, "kami") == 0) + { + printf ("kami <message>\n"); + printf + (" Envoi un message g駭駻al sur tous les serveurs de map (en jaune).\n"); + } + else if (strcmp (command, "kamib") == 0) + { + printf ("kamib <message>\n"); + printf + (" Envoi un message g駭駻al sur tous les serveurs de map (en bleu).\n"); + } + else if (strcmp (command, "language") == 0) + { + printf ("language <langue>\n"); + printf (" Change la langue d'affichage.\n"); + printf (" Langues possibles: 'Fran軋is' ou 'English'.\n"); + } + else if (strcmp (command, "list") == 0) + { + printf ("list/ls [Premier_id [Dernier_id]]\n"); + printf (" Affiche une liste de comptes.\n"); + printf + (" 'Premier_id', 'Dernier_id': indique les identifiants de d駱art et de fin.\n"); + printf + (" La recherche par nom n'est pas possible avec cette commande.\n"); + printf (" <example> list 10 9999999\n"); + } + else if (strcmp (command, "itemfrob") == 0) + { + printf ("Not localised yet.\n"); + } + else if (strcmp (command, "listban") == 0) + { + printf ("listBan/lsBan [Premier_id [Dernier_id]]\n"); + printf + (" Comme list/ls, mais seulement pour les comptes avec statut ou bannis.\n"); + } + else if (strcmp (command, "listgm") == 0) + { + printf ("listGM/lsGM [Premier_id [Dernier_id]]\n"); + printf (" Comme list/ls, mais seulement pour les comptes GM.\n"); + } + else if (strcmp (command, "listok") == 0) + { + printf ("listOK/lsOK [Premier_id [Dernier_id]]\n"); + printf + (" Comme list/ls, mais seulement pour les comptes sans statut et non bannis.\n"); + } + else if (strcmp (command, "memo") == 0) + { + printf ("memo <nomcompte> <memo>\n"); + printf (" Modifie le m駑o d'un compte.\n"); + printf + (" 'memo': Il peut avoir jusqu' 253 caract鑽es (avec des espaces ou non).\n"); + } + else if (strcmp (command, "name") == 0) + { + printf ("name <idcompte>\n"); + printf (" Donne le nom d'un compte.\n"); + } + else if (strcmp (command, "password") == 0) + { + printf ("passwd <nomcompte> <nouveaumotdepasse>\n"); + printf (" Change le mot de passe d'un compte.\n"); + printf (" Lorsque nouveaumotdepasse est omis,\n"); + printf (" la saisie se fait sans que la frappe ne se voit.\n"); + } + else if (strcmp (command, "reloadgm") == 0) + { + printf ("reloadGM\n"); + printf (" Reload GM configuration file\n"); + } + else if (strcmp (command, "search") == 0) + { + printf ("search <expression>\n"); + printf (" Cherche des comptes.\n"); + printf (" Affiche les comptes dont les noms correspondent.\n"); +// printf("search -r/-e/--expr/--regex <expression>\n"); +// printf(" Cherche des comptes par expression reguli鑽e.\n"); +// printf(" Affiche les comptes dont les noms correspondent.\n"); + } + else if (strcmp (command, "sex") == 0) + { + printf ("sex <nomcompte> <sexe>\n"); + printf (" Modifie le sexe d'un compte.\n"); + printf (" <exemple> sex testname Male\n"); + } + else if (strcmp (command, "state") == 0) + { + printf ("state <nomcompte> <nouveaustatut> <message_erreur_7>\n"); + printf (" Change le statut d'un compte.\n"); + printf + (" 'nouveaustatut': Le statut est le m麥e que celui du packet 0x006a + 1.\n"); + printf (" les possibilit駸 sont:\n"); + printf (" 0 = Compte ok\n"); + printf (" 1 = Unregistered ID\n"); + printf (" 2 = Incorrect Password\n"); + printf (" 3 = This ID is expired\n"); + printf (" 4 = Rejected from Server\n"); + printf + (" 5 = You have been blocked by the GM Team\n"); + printf + (" 6 = Your Game's EXE file is not the latest version\n"); + printf + (" 7 = You are Prohibited to log in until...\n"); + printf + (" 8 = Server is jammed due to over populated\n"); + printf (" 9 = No MSG\n"); + printf (" 100 = This ID has been totally erased\n"); + printf + (" all other values are 'No MSG', then use state 9 please.\n"); + printf (" 'message_erreur_7': message du code erreur 6 =\n"); + printf + (" = Your are Prohibited to log in until... (packet 0x006a)\n"); + } + else if (strcmp (command, "timeadd") == 0) + { + printf ("timeadd <nomcompte> <modificateur>\n"); + printf + (" Ajoute/soustrait du temps la limite de validit d'un compte.\n"); + printf (" Le modificateur est compos comme suit:\n"); + printf (" Valeur modificatrice (-1, 1, +1, etc...)\n"); + printf (" El駑ent modifi:\n"); + printf (" a ou y: ann馥\n"); + printf (" m: mois\n"); + printf (" j ou d: jour\n"); + printf (" h: heure\n"); + printf (" mn: minute\n"); + printf (" s: seconde\n"); + printf (" <exemple> timeadd testname +1m-2mn1s-6a\n"); + printf + (" Cette exemple ajoute 1 mois et une seconde, et soustrait 2 minutes\n"); + printf (" et 6 ans dans le m麥e temps.\n"); + printf + ("NOTE: Vous ne pouvez pas modifier une limite de validit illimit馥. Si vous\n"); + printf + (" d駸irez le faire, c'est que vous voulez probablement cr馥r un limite de\n"); + printf + (" validit limit馥. Donc, en premier, fix une limite de valitid.\n"); + } + else if (strcmp (command, "timeadd") == 0) + { + printf ("timeset <nomcompte> aaaa/mm/jj [hh:mm:ss]\n"); + printf (" Change la limite de validit d'un compte.\n"); + printf (" Heure par d馭aut [hh:mm:ss]: 23:59:59.\n"); + printf ("timeset <nomcompte> 0\n"); + printf + (" Donne une limite de validit illimit馥 (0 = illimit馥).\n"); + } + else if (strcmp (command, "unban") == 0) + { + printf ("unban/unbanish <nom compte>\n"); + printf (" Ote le banissement d'un compte.\n"); + printf + (" La commande est l'駲uivalent de banset <nom_compte> 0.\n"); + } + else if (strcmp (command, "unblock") == 0) + { + printf ("unblock <nom compte>\n"); + printf (" Place le status d'un compte 0 (Compte ok).\n"); + printf + (" La commande est l'駲uivalent de state <nom_compte> 0.\n"); + } + else if (strcmp (command, "version") == 0) + { + printf ("version\n"); + printf (" Affiche la version du login-serveur.\n"); + } + else if (strcmp (command, "who") == 0) + { + printf ("who <nom compte>\n"); + printf (" Affiche les informations sur un compte.\n"); // quit - } else if (strcmp(command, "quit") == 0 || - strcmp(command, "exit") == 0 || - strcmp(command, "end") == 0) { - printf("quit/end/exit\n"); - printf(" Fin du programme d'administration.\n"); + } + else if (strcmp (command, "quit") == 0 || + strcmp (command, "exit") == 0 || + strcmp (command, "end") == 0) + { + printf ("quit/end/exit\n"); + printf (" Fin du programme d'administration.\n"); // unknown command - } else { - if (strlen(command) > 0) - printf("Commande inconnue [%s] pour l'aide. Affichage de toutes les commandes.\n", command); - printf(" aide/help/? -- Affiche cet aide\n"); - printf(" aide/help/? [commande] -- Affiche l'aide de la commande\n"); - printf(" add <nomcompte> <sexe> <motdepasse> -- Cr馥 un compte (sans email)\n"); - printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom compte> -- Fixe la date finale de banismnt\n"); - printf(" banadd/ba <nomcompte> <modificateur> -- Ajout/soustrait du temps la\n"); - printf(" exemple: ba moncompte +1m-2mn1s-2y date finale de banissement\n"); - printf(" banset/bs <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la date fin de banisemnt\n"); - printf(" banset/bs <nomcompte> 0 -- D-banis un compte.\n"); - printf(" block <nom compte> -- Mets le status d'un compte 5 (blocked by the GM Team)\n"); - printf(" check <nomcompte> <motdepasse> -- V駻ifie un mot de passe d'un compte\n"); - printf(" create <nomcompte> <sexe> <email> <motdepasse> -- Cr馥 un compte (avec email)\n"); - printf(" del <nom compte> -- Supprime un compte\n"); - printf(" email <nomcompte> <email> -- Modifie l'e-mail d'un compte\n"); - printf(" getcount -- Donne le nb de joueurs en ligne\n"); - printf(" gm <nomcompte> [Niveau_GM] -- Modifie le niveau de GM d'un compte\n"); - printf(" id <nom compte> -- Donne l'id d'un compte\n"); - printf(" info <idcompte> -- Affiche les infos sur un compte\n"); - printf(" kami <message> -- Envoi un message g駭駻al (en jaune)\n"); - printf(" kamib <message> -- Envoi un message g駭駻al (en bleu)\n"); - printf(" language <langue> -- Change la langue d'affichage.\n"); - printf(" list/ls [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n"); - printf(" listBan/lsBan [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n"); - printf(" avec un statut ou bannis\n"); - printf(" listGM/lsGM [Premier_id [Dernier_id] ] -- Affiche une liste de comptes GM\n"); - printf(" listOK/lsOK [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n"); - printf(" sans status et non bannis\n"); - printf(" memo <nomcompte> <memo> -- Modifie le memo d'un compte\n"); - printf(" name <idcompte> -- Donne le nom d'un compte\n"); - printf(" passwd <nomcompte> <nouveaumotdepasse> -- Change le mot de passe d'un compte\n"); - printf(" quit/end/exit -- Fin du programme d'administation\n"); - printf(" reloadGM -- Recharger le fichier de config des GM\n"); - printf(" search <expression> -- Cherche des comptes\n"); -// printf(" search -e/-r/--expr/--regex <expression> -- Cherche des comptes par REGEX\n"); - printf(" sex <nomcompte> <sexe> -- Modifie le sexe d'un compte\n"); - printf(" state <nomcompte> <nouveaustatut> <messageerr7> -- Change le statut d'1 compte\n"); - printf(" timeadd/ta <nomcompte> <modificateur> -- Ajout/soustrait du temps la\n"); - printf(" exemple: ta moncompte +1m-2mn1s-2y limite de validit饅n"); - printf(" timeset/ts <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la limite de validit饅n"); - printf(" timeset/ts <nomcompte> 0 -- limite de validit = illimit馥\n"); - printf(" unban/unbanish <nom compte> -- Ote le banissement d'un compte\n"); - printf(" unblock <nom compte> -- Mets le status d'un compte 0 (Compte ok)\n"); - printf(" version -- Donne la version du login-serveur\n"); - printf(" who <nom compte> -- Affiche les infos sur un compte\n"); - printf(" Note: Pour les noms de compte avec des espaces, tapez \"<nom compte>\" (ou ').\n"); - } - } else { - if (strcmp(command, "aide") == 0) { - printf("aide/help/?\n"); - printf(" Display the description of the commands\n"); - printf("aide/help/? [command]\n"); - printf(" Display the description of the specified command\n"); - } else if (strcmp(command, "help") == 0 ) { - printf("aide/help/?\n"); - printf(" Display the description of the commands\n"); - printf("aide/help/? [command]\n"); - printf(" Display the description of the specified command\n"); + } + else + { + if (strlen (command) > 0) + printf + ("Commande inconnue [%s] pour l'aide. Affichage de toutes les commandes.\n", + command); + printf + (" aide/help/? -- Affiche cet aide\n"); + printf + (" aide/help/? [commande] -- Affiche l'aide de la commande\n"); + printf + (" add <nomcompte> <sexe> <motdepasse> -- Cr馥 un compte (sans email)\n"); + printf + (" ban/banish aaaa/mm/jj hh:mm:ss <nom compte> -- Fixe la date finale de banismnt\n"); + printf + (" banadd/ba <nomcompte> <modificateur> -- Ajout/soustrait du temps la\n"); + printf + (" exemple: ba moncompte +1m-2mn1s-2y date finale de banissement\n"); + printf + (" banset/bs <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la date fin de banisemnt\n"); + printf + (" banset/bs <nomcompte> 0 -- D-banis un compte.\n"); + printf + (" block <nom compte> -- Mets le status d'un compte 5 (blocked by the GM Team)\n"); + printf + (" check <nomcompte> <motdepasse> -- V駻ifie un mot de passe d'un compte\n"); + printf + (" create <nomcompte> <sexe> <email> <motdepasse> -- Cr馥 un compte (avec email)\n"); + printf + (" del <nom compte> -- Supprime un compte\n"); + printf + (" email <nomcompte> <email> -- Modifie l'e-mail d'un compte\n"); + printf + (" getcount -- Donne le nb de joueurs en ligne\n"); + printf + (" gm <nomcompte> [Niveau_GM] -- Modifie le niveau de GM d'un compte\n"); + printf + (" id <nom compte> -- Donne l'id d'un compte\n"); + printf + (" info <idcompte> -- Affiche les infos sur un compte\n"); + printf + (" kami <message> -- Envoi un message g駭駻al (en jaune)\n"); + printf + (" kamib <message> -- Envoi un message g駭駻al (en bleu)\n"); + printf + (" language <langue> -- Change la langue d'affichage.\n"); + printf + (" list/ls [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n"); + printf + (" listBan/lsBan [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n"); + printf + (" avec un statut ou bannis\n"); + printf + (" listGM/lsGM [Premier_id [Dernier_id] ] -- Affiche une liste de comptes GM\n"); + printf + (" listOK/lsOK [Premier_id [Dernier_id] ] -- Affiche une liste de comptes\n"); + printf + (" sans status et non bannis\n"); + printf + (" memo <nomcompte> <memo> -- Modifie le memo d'un compte\n"); + printf + (" name <idcompte> -- Donne le nom d'un compte\n"); + printf + (" passwd <nomcompte> <nouveaumotdepasse> -- Change le mot de passe d'un compte\n"); + printf + (" quit/end/exit -- Fin du programme d'administation\n"); + printf + (" reloadGM -- Recharger le fichier de config des GM\n"); + printf + (" search <expression> -- Cherche des comptes\n"); +// printf(" search -e/-r/--expr/--regex <expression> -- Cherche des comptes par REGEX\n"); + printf + (" sex <nomcompte> <sexe> -- Modifie le sexe d'un compte\n"); + printf + (" state <nomcompte> <nouveaustatut> <messageerr7> -- Change le statut d'1 compte\n"); + printf + (" timeadd/ta <nomcompte> <modificateur> -- Ajout/soustrait du temps la\n"); + printf + (" exemple: ta moncompte +1m-2mn1s-2y limite de validit饅n"); + printf + (" timeset/ts <nomcompte> aaaa/mm/jj [hh:mm:ss] -- Change la limite de validit饅n"); + printf + (" timeset/ts <nomcompte> 0 -- limite de validit = illimit馥\n"); + printf + (" unban/unbanish <nom compte> -- Ote le banissement d'un compte\n"); + printf + (" unblock <nom compte> -- Mets le status d'un compte 0 (Compte ok)\n"); + printf + (" version -- Donne la version du login-serveur\n"); + printf + (" who <nom compte> -- Affiche les infos sur un compte\n"); + printf + (" Note: Pour les noms de compte avec des espaces, tapez \"<nom compte>\" (ou ').\n"); + } + } + else + { + if (strcmp (command, "aide") == 0) + { + printf ("aide/help/?\n"); + printf (" Display the description of the commands\n"); + printf ("aide/help/? [command]\n"); + printf (" Display the description of the specified command\n"); + } + else if (strcmp (command, "help") == 0) + { + printf ("aide/help/?\n"); + printf (" Display the description of the commands\n"); + printf ("aide/help/? [command]\n"); + printf (" Display the description of the specified command\n"); // general commands - } else if (strcmp(command, "add") == 0) { - printf("add <account_name> <sex> <password>\n"); - printf(" Create an account with the default email (a@a.com).\n"); - printf(" Concerning the sex, only the first letter is used (F or M).\n"); - printf(" The e-mail is set to a@a.com (default e-mail). It's like to have no e-mail.\n"); - printf(" When the password is omitted,\n"); - printf(" the input is done without displaying of the pressed keys.\n"); - printf(" <example> add testname Male testpass\n"); - } else if (strcmp(command, "ban") == 0) { - printf("ban/banish yyyy/mm/dd hh:mm:ss <account name>\n"); - printf(" Changes the final date of a banishment of an account.\n"); - printf(" Like banset, but <account name> is at end.\n"); - } else if (strcmp(command, "banadd") == 0) { - printf("banadd <account_name> <modifier>\n"); - printf(" Adds or substracts time from the final date of a banishment of an account.\n"); - printf(" Modifier is done as follows:\n"); - printf(" Adjustment value (-1, 1, +1, etc...)\n"); - printf(" Modified element:\n"); - printf(" a or y: year\n"); - printf(" m: month\n"); - printf(" j or d: day\n"); - printf(" h: hour\n"); - printf(" mn: minute\n"); - printf(" s: second\n"); - printf(" <example> banadd testname +1m-2mn1s-6y\n"); - printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n"); - printf(" and 6 years at the same time.\n"); - printf("NOTE: If you modify the final date of a non-banished account,\n"); - printf(" you fix the final date to (actual time +- adjustments)\n"); - } else if (strcmp(command, "banset") == 0) { - printf("banset <account_name> yyyy/mm/dd [hh:mm:ss]\n"); - printf(" Changes the final date of a banishment of an account.\n"); - printf(" Default time [hh:mm:ss]: 23:59:59.\n"); - printf("banset <account_name> 0\n"); - printf(" Set a non-banished account (0 = unbanished).\n"); - } else if (strcmp(command, "block") == 0) { - printf("block <account name>\n"); - printf(" Set state 5 (You have been blocked by the GM Team) to an account.\n"); - printf(" This command works like state <account_name> 5.\n"); - } else if (strcmp(command, "check") == 0) { - printf("check <account_name> <password>\n"); - printf(" Check the validity of a password for an account.\n"); - printf(" NOTE: Server will never sends back a password.\n"); - printf(" It's the only method you have to know if a password is correct.\n"); - printf(" The other method is to have a ('physical') access to the accounts file.\n"); - } else if (strcmp(command, "create") == 0) { - printf("create <account_name> <sex> <email> <password>\n"); - printf(" Like the 'add' command, but with e-mail moreover.\n"); - printf(" <example> create testname Male my@mail.com testpass\n"); - } else if (strcmp(command, "delete") == 0) { - printf("del <account name>\n"); - printf(" Remove an account.\n"); - printf(" This order requires confirmation. After confirmation, the account is deleted.\n"); - } else if (strcmp(command, "email") == 0) { - printf("email <account_name> <email>\n"); - printf(" Modify the e-mail of an account.\n"); - } else if (strcmp(command, "getcount") == 0) { - printf("getcount\n"); - printf(" Give the number of players online on all char-servers.\n"); - } else if (strcmp(command, "gm") == 0) { - printf("gm <account_name> [GM_level]\n"); - printf(" Modify the GM level of an account.\n"); - printf(" Default value remove GM level (GM level = 0).\n"); - printf(" <example> gm testname 80\n"); - } else if (strcmp(command, "id") == 0) { - printf("id <account name>\n"); - printf(" Give the id of an account.\n"); - } else if (strcmp(command, "info") == 0) { - printf("info <account_id>\n"); - printf(" Display complete information of an account.\n"); - } else if (strcmp(command, "kami") == 0) { - printf("kami <message>\n"); - printf(" Sends a broadcast message on all map-server (in yellow).\n"); - } else if (strcmp(command, "kamib") == 0) { - printf("kamib <message>\n"); - printf(" Sends a broadcast message on all map-server (in blue).\n"); - } else if (strcmp(command, "language") == 0) { - printf("language <language>\n"); - printf(" Change the language of displaying.\n"); - printf(" Possible languages: Fran軋is or English.\n"); - } else if (strcmp(command, "list") == 0) { - printf("list/ls [start_id [end_id]]\n"); - printf(" Display a list of accounts.\n"); - printf(" 'start_id', 'end_id': indicate end and start identifiers.\n"); - printf(" Research by name is not possible with this command.\n"); - printf(" <example> list 10 9999999\n"); - } else if (strcmp(command, "itemfrob") == 0) { - printf("itemfrob <source-id> <dest-id>\n"); - printf(" Translates item IDs for all accounts.\n"); - printf(" Any items matching the source item ID will be mapped to the dest-id.\n"); - printf(" <example> itemfrob 500 700\n"); - } else if (strcmp(command, "listban") == 0) { - printf("listBan/lsBan [start_id [end_id]]\n"); - printf(" Like list/ls, but only for accounts with state or banished.\n"); - } else if (strcmp(command, "listgm") == 0) { - printf("listGM/lsGM [start_id [end_id]]\n"); - printf(" Like list/ls, but only for GM accounts.\n"); - } else if (strcmp(command, "listok") == 0) { - printf("listOK/lsOK [start_id [end_id]]\n"); - printf(" Like list/ls, but only for accounts without state and not banished.\n"); - } else if (strcmp(command, "memo") == 0) { - printf("memo <account_name> <memo>\n"); - printf(" Modify the memo of an account.\n"); - printf(" 'memo': it can have until 253 characters (with spaces or not).\n"); - } else if (strcmp(command, "name") == 0) { - printf("name <account_id>\n"); - printf(" Give the name of an account.\n"); - } else if (strcmp(command, "password") == 0) { - printf("passwd <account_name> <new_password>\n"); - printf(" Change the password of an account.\n"); - printf(" When new password is omitted,\n"); - printf(" the input is done without displaying of the pressed keys.\n"); - } else if (strcmp(command, "reloadgm") == 0) { - printf("reloadGM\n"); - printf(" Reload GM configuration file\n"); - } else if (strcmp(command, "search") == 0) { - printf("search <expression>\n"); - printf(" Seek accounts.\n"); - printf(" Displays the accounts whose names correspond.\n"); -// printf("search -r/-e/--expr/--regex <expression>\n"); -// printf(" Seek accounts by regular expression.\n"); -// printf(" Displays the accounts whose names correspond.\n"); - } else if (strcmp(command, "sex") == 0) { - printf("sex <account_name> <sex>\n"); - printf(" Modify the sex of an account.\n"); - printf(" <example> sex testname Male\n"); - } else if (strcmp(command, "state") == 0) { - printf("state <account_name> <new_state> <error_message_#7>\n"); - printf(" Change the state of an account.\n"); - printf(" 'new_state': state is the state of the packet 0x006a + 1.\n"); - printf(" The possibilities are:\n"); - printf(" 0 = Account ok\n"); - printf(" 1 = Unregistered ID\n"); - printf(" 2 = Incorrect Password\n"); - printf(" 3 = This ID is expired\n"); - printf(" 4 = Rejected from Server\n"); - printf(" 5 = You have been blocked by the GM Team\n"); - printf(" 6 = Your Game's EXE file is not the latest version\n"); - printf(" 7 = You are Prohibited to log in until...\n"); - printf(" 8 = Server is jammed due to over populated\n"); - printf(" 9 = No MSG\n"); - printf(" 100 = This ID has been totally erased\n"); - printf(" all other values are 'No MSG', then use state 9 please.\n"); - printf(" 'error_message_#7': message of the code error 6\n"); - printf(" = Your are Prohibited to log in until... (packet 0x006a)\n"); - } else if (strcmp(command, "timeadd") == 0) { - printf("timeadd <account_name> <modifier>\n"); - printf(" Adds or substracts time from the validity limit of an account.\n"); - printf(" Modifier is done as follows:\n"); - printf(" Adjustment value (-1, 1, +1, etc...)\n"); - printf(" Modified element:\n"); - printf(" a or y: year\n"); - printf(" m: month\n"); - printf(" j or d: day\n"); - printf(" h: hour\n"); - printf(" mn: minute\n"); - printf(" s: second\n"); - printf(" <example> timeadd testname +1m-2mn1s-6y\n"); - printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n"); - printf(" and 6 years at the same time.\n"); - printf("NOTE: You can not modify a unlimited validity limit.\n"); - printf(" If you want modify it, you want probably create a limited validity limit.\n"); - printf(" So, at first, you must set the validity limit to a date/time.\n"); - } else if (strcmp(command, "timeadd") == 0) { - printf("timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n"); - printf(" Changes the validity limit of an account.\n"); - printf(" Default time [hh:mm:ss]: 23:59:59.\n"); - printf("timeset <account_name> 0\n"); - printf(" Gives an unlimited validity limit (0 = unlimited).\n"); - } else if (strcmp(command, "unban") == 0) { - printf("unban/unbanish <account name>\n"); - printf(" Remove the banishment of an account.\n"); - printf(" This command works like banset <account_name> 0.\n"); - } else if (strcmp(command, "unblock") == 0) { - printf("unblock <account name>\n"); - printf(" Set state 0 (Account ok) to an account.\n"); - printf(" This command works like state <account_name> 0.\n"); - } else if (strcmp(command, "version") == 0) { - printf("version\n"); - printf(" Display the version of the login-server.\n"); - } else if (strcmp(command, "who") == 0) { - printf("who <account name>\n"); - printf(" Displays complete information of an account.\n"); + } + else if (strcmp (command, "add") == 0) + { + printf ("add <account_name> <sex> <password>\n"); + printf + (" Create an account with the default email (a@a.com).\n"); + printf + (" Concerning the sex, only the first letter is used (F or M).\n"); + printf + (" The e-mail is set to a@a.com (default e-mail). It's like to have no e-mail.\n"); + printf (" When the password is omitted,\n"); + printf + (" the input is done without displaying of the pressed keys.\n"); + printf (" <example> add testname Male testpass\n"); + } + else if (strcmp (command, "ban") == 0) + { + printf ("ban/banish yyyy/mm/dd hh:mm:ss <account name>\n"); + printf + (" Changes the final date of a banishment of an account.\n"); + printf (" Like banset, but <account name> is at end.\n"); + } + else if (strcmp (command, "banadd") == 0) + { + printf ("banadd <account_name> <modifier>\n"); + printf + (" Adds or substracts time from the final date of a banishment of an account.\n"); + printf (" Modifier is done as follows:\n"); + printf (" Adjustment value (-1, 1, +1, etc...)\n"); + printf (" Modified element:\n"); + printf (" a or y: year\n"); + printf (" m: month\n"); + printf (" j or d: day\n"); + printf (" h: hour\n"); + printf (" mn: minute\n"); + printf (" s: second\n"); + printf (" <example> banadd testname +1m-2mn1s-6y\n"); + printf + (" this example adds 1 month and 1 second, and substracts 2 minutes\n"); + printf (" and 6 years at the same time.\n"); + printf + ("NOTE: If you modify the final date of a non-banished account,\n"); + printf + (" you fix the final date to (actual time +- adjustments)\n"); + } + else if (strcmp (command, "banset") == 0) + { + printf ("banset <account_name> yyyy/mm/dd [hh:mm:ss]\n"); + printf + (" Changes the final date of a banishment of an account.\n"); + printf (" Default time [hh:mm:ss]: 23:59:59.\n"); + printf ("banset <account_name> 0\n"); + printf (" Set a non-banished account (0 = unbanished).\n"); + } + else if (strcmp (command, "block") == 0) + { + printf ("block <account name>\n"); + printf + (" Set state 5 (You have been blocked by the GM Team) to an account.\n"); + printf (" This command works like state <account_name> 5.\n"); + } + else if (strcmp (command, "check") == 0) + { + printf ("check <account_name> <password>\n"); + printf (" Check the validity of a password for an account.\n"); + printf (" NOTE: Server will never sends back a password.\n"); + printf + (" It's the only method you have to know if a password is correct.\n"); + printf + (" The other method is to have a ('physical') access to the accounts file.\n"); + } + else if (strcmp (command, "create") == 0) + { + printf ("create <account_name> <sex> <email> <password>\n"); + printf (" Like the 'add' command, but with e-mail moreover.\n"); + printf + (" <example> create testname Male my@mail.com testpass\n"); + } + else if (strcmp (command, "delete") == 0) + { + printf ("del <account name>\n"); + printf (" Remove an account.\n"); + printf + (" This order requires confirmation. After confirmation, the account is deleted.\n"); + } + else if (strcmp (command, "email") == 0) + { + printf ("email <account_name> <email>\n"); + printf (" Modify the e-mail of an account.\n"); + } + else if (strcmp (command, "getcount") == 0) + { + printf ("getcount\n"); + printf + (" Give the number of players online on all char-servers.\n"); + } + else if (strcmp (command, "gm") == 0) + { + printf ("gm <account_name> [GM_level]\n"); + printf (" Modify the GM level of an account.\n"); + printf (" Default value remove GM level (GM level = 0).\n"); + printf (" <example> gm testname 80\n"); + } + else if (strcmp (command, "id") == 0) + { + printf ("id <account name>\n"); + printf (" Give the id of an account.\n"); + } + else if (strcmp (command, "info") == 0) + { + printf ("info <account_id>\n"); + printf (" Display complete information of an account.\n"); + } + else if (strcmp (command, "kami") == 0) + { + printf ("kami <message>\n"); + printf + (" Sends a broadcast message on all map-server (in yellow).\n"); + } + else if (strcmp (command, "kamib") == 0) + { + printf ("kamib <message>\n"); + printf + (" Sends a broadcast message on all map-server (in blue).\n"); + } + else if (strcmp (command, "language") == 0) + { + printf ("language <language>\n"); + printf (" Change the language of displaying.\n"); + printf (" Possible languages: Fran軋is or English.\n"); + } + else if (strcmp (command, "list") == 0) + { + printf ("list/ls [start_id [end_id]]\n"); + printf (" Display a list of accounts.\n"); + printf + (" 'start_id', 'end_id': indicate end and start identifiers.\n"); + printf + (" Research by name is not possible with this command.\n"); + printf (" <example> list 10 9999999\n"); + } + else if (strcmp (command, "itemfrob") == 0) + { + printf ("itemfrob <source-id> <dest-id>\n"); + printf (" Translates item IDs for all accounts.\n"); + printf + (" Any items matching the source item ID will be mapped to the dest-id.\n"); + printf (" <example> itemfrob 500 700\n"); + } + else if (strcmp (command, "listban") == 0) + { + printf ("listBan/lsBan [start_id [end_id]]\n"); + printf + (" Like list/ls, but only for accounts with state or banished.\n"); + } + else if (strcmp (command, "listgm") == 0) + { + printf ("listGM/lsGM [start_id [end_id]]\n"); + printf (" Like list/ls, but only for GM accounts.\n"); + } + else if (strcmp (command, "listok") == 0) + { + printf ("listOK/lsOK [start_id [end_id]]\n"); + printf + (" Like list/ls, but only for accounts without state and not banished.\n"); + } + else if (strcmp (command, "memo") == 0) + { + printf ("memo <account_name> <memo>\n"); + printf (" Modify the memo of an account.\n"); + printf + (" 'memo': it can have until 253 characters (with spaces or not).\n"); + } + else if (strcmp (command, "name") == 0) + { + printf ("name <account_id>\n"); + printf (" Give the name of an account.\n"); + } + else if (strcmp (command, "password") == 0) + { + printf ("passwd <account_name> <new_password>\n"); + printf (" Change the password of an account.\n"); + printf (" When new password is omitted,\n"); + printf + (" the input is done without displaying of the pressed keys.\n"); + } + else if (strcmp (command, "reloadgm") == 0) + { + printf ("reloadGM\n"); + printf (" Reload GM configuration file\n"); + } + else if (strcmp (command, "search") == 0) + { + printf ("search <expression>\n"); + printf (" Seek accounts.\n"); + printf (" Displays the accounts whose names correspond.\n"); +// printf("search -r/-e/--expr/--regex <expression>\n"); +// printf(" Seek accounts by regular expression.\n"); +// printf(" Displays the accounts whose names correspond.\n"); + } + else if (strcmp (command, "sex") == 0) + { + printf ("sex <account_name> <sex>\n"); + printf (" Modify the sex of an account.\n"); + printf (" <example> sex testname Male\n"); + } + else if (strcmp (command, "state") == 0) + { + printf ("state <account_name> <new_state> <error_message_#7>\n"); + printf (" Change the state of an account.\n"); + printf + (" 'new_state': state is the state of the packet 0x006a + 1.\n"); + printf (" The possibilities are:\n"); + printf (" 0 = Account ok\n"); + printf (" 1 = Unregistered ID\n"); + printf (" 2 = Incorrect Password\n"); + printf (" 3 = This ID is expired\n"); + printf (" 4 = Rejected from Server\n"); + printf + (" 5 = You have been blocked by the GM Team\n"); + printf + (" 6 = Your Game's EXE file is not the latest version\n"); + printf + (" 7 = You are Prohibited to log in until...\n"); + printf + (" 8 = Server is jammed due to over populated\n"); + printf (" 9 = No MSG\n"); + printf (" 100 = This ID has been totally erased\n"); + printf + (" all other values are 'No MSG', then use state 9 please.\n"); + printf (" 'error_message_#7': message of the code error 6\n"); + printf + (" = Your are Prohibited to log in until... (packet 0x006a)\n"); + } + else if (strcmp (command, "timeadd") == 0) + { + printf ("timeadd <account_name> <modifier>\n"); + printf + (" Adds or substracts time from the validity limit of an account.\n"); + printf (" Modifier is done as follows:\n"); + printf (" Adjustment value (-1, 1, +1, etc...)\n"); + printf (" Modified element:\n"); + printf (" a or y: year\n"); + printf (" m: month\n"); + printf (" j or d: day\n"); + printf (" h: hour\n"); + printf (" mn: minute\n"); + printf (" s: second\n"); + printf (" <example> timeadd testname +1m-2mn1s-6y\n"); + printf + (" this example adds 1 month and 1 second, and substracts 2 minutes\n"); + printf (" and 6 years at the same time.\n"); + printf ("NOTE: You can not modify a unlimited validity limit.\n"); + printf + (" If you want modify it, you want probably create a limited validity limit.\n"); + printf + (" So, at first, you must set the validity limit to a date/time.\n"); + } + else if (strcmp (command, "timeadd") == 0) + { + printf ("timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n"); + printf (" Changes the validity limit of an account.\n"); + printf (" Default time [hh:mm:ss]: 23:59:59.\n"); + printf ("timeset <account_name> 0\n"); + printf (" Gives an unlimited validity limit (0 = unlimited).\n"); + } + else if (strcmp (command, "unban") == 0) + { + printf ("unban/unbanish <account name>\n"); + printf (" Remove the banishment of an account.\n"); + printf (" This command works like banset <account_name> 0.\n"); + } + else if (strcmp (command, "unblock") == 0) + { + printf ("unblock <account name>\n"); + printf (" Set state 0 (Account ok) to an account.\n"); + printf (" This command works like state <account_name> 0.\n"); + } + else if (strcmp (command, "version") == 0) + { + printf ("version\n"); + printf (" Display the version of the login-server.\n"); + } + else if (strcmp (command, "who") == 0) + { + printf ("who <account name>\n"); + printf (" Displays complete information of an account.\n"); // quit - } else if (strcmp(command, "quit") == 0 || - strcmp(command, "exit") == 0 || - strcmp(command, "end") == 0) { - printf("quit/end/exit\n"); - printf(" End of the program of administration.\n"); + } + else if (strcmp (command, "quit") == 0 || + strcmp (command, "exit") == 0 || + strcmp (command, "end") == 0) + { + printf ("quit/end/exit\n"); + printf (" End of the program of administration.\n"); // unknown command - } else { - if (strlen(command) > 0) - printf("Unknown command [%s] for help. Displaying of all commands.\n", command); - printf(" aide/help/? -- Display this help\n"); - printf(" aide/help/? [command] -- Display the help of the command\n"); - printf(" add <account_name> <sex> <password> -- Create an account with default email\n"); - printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name> -- Change final date of a ban\n"); - printf(" banadd/ba <account_name> <modifier> -- Add or substract time from the final\n"); - printf(" example: ba apple +1m-2mn1s-2y date of a banishment of an account\n"); - printf(" banset/bs <account_name> yyyy/mm/dd [hh:mm:ss] -- Change final date of a ban\n"); - printf(" banset/bs <account_name> 0 -- Un-banish an account\n"); - printf(" block <account name> -- Set state 5 (blocked by the GM Team) to an account\n"); - printf(" check <account_name> <password> -- Check the validity of a password\n"); - printf(" create <account_name> <sex> <email> <passwrd> -- Create an account with email\n"); - printf(" del <account name> -- Remove an account\n"); - printf(" email <account_name> <email> -- Modify an email of an account\n"); - printf(" getcount -- Give the number of players online\n"); - printf(" gm <account_name> [GM_level] -- Modify the GM level of an account\n"); - printf(" id <account name> -- Give the id of an account\n"); - printf(" info <account_id> -- Display all information of an account\n"); - printf(" itemfrob <source-id> <dest-id> -- Map all items from one item ID to another\n"); - printf(" kami <message> -- Sends a broadcast message (in yellow)\n"); - printf(" kamib <message> -- Sends a broadcast message (in blue)\n"); - printf(" language <language> -- Change the language of displaying.\n"); - printf(" list/ls [First_id [Last_id]] -- Display a list of accounts\n"); - printf(" listBan/lsBan [First_id [Last_id] ] -- Display a list of accounts\n"); - printf(" with state or banished\n"); - printf(" listGM/lsGM [First_id [Last_id]] -- Display a list of GM accounts\n"); - printf(" listOK/lsOK [First_id [Last_id] ] -- Display a list of accounts\n"); - printf(" without state and not banished\n"); - printf(" memo <account_name> <memo> -- Modify the memo of an account\n"); - printf(" name <account_id> -- Give the name of an account\n"); - printf(" passwd <account_name> <new_password> -- Change the password of an account\n"); - printf(" quit/end/exit -- End of the program of administation\n"); - printf(" reloadGM -- Reload GM configuration file\n"); - printf(" search <expression> -- Seek accounts\n"); -// printf(" search -e/-r/--expr/--regex <expressn> -- Seek accounts by regular-expression\n"); - printf(" sex <nomcompte> <sexe> -- Modify the sex of an account\n"); - printf(" state <account_name> <new_state> <error_message_#7> -- Change the state\n"); - printf(" timeadd/ta <account_name> <modifier> -- Add or substract time from the\n"); - printf(" example: ta apple +1m-2mn1s-2y validity limit of an account\n"); - printf(" timeset/ts <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit\n"); - printf(" timeset/ts <account_name> 0 -- Give a unlimited validity limit\n"); - printf(" unban/unbanish <account name> -- Remove the banishment of an account\n"); - printf(" unblock <account name> -- Set state 0 (Account ok) to an account\n"); - printf(" version -- Gives the version of the login-server\n"); - printf(" who <account name> -- Display all information of an account\n"); - printf(" who <account name> -- Display all information of an account\n"); - printf(" Note: To use spaces in an account name, type \"<account name>\" (or ').\n"); - } - } + } + else + { + if (strlen (command) > 0) + printf + ("Unknown command [%s] for help. Displaying of all commands.\n", + command); + printf + (" aide/help/? -- Display this help\n"); + printf + (" aide/help/? [command] -- Display the help of the command\n"); + printf + (" add <account_name> <sex> <password> -- Create an account with default email\n"); + printf + (" ban/banish yyyy/mm/dd hh:mm:ss <account name> -- Change final date of a ban\n"); + printf + (" banadd/ba <account_name> <modifier> -- Add or substract time from the final\n"); + printf + (" example: ba apple +1m-2mn1s-2y date of a banishment of an account\n"); + printf + (" banset/bs <account_name> yyyy/mm/dd [hh:mm:ss] -- Change final date of a ban\n"); + printf + (" banset/bs <account_name> 0 -- Un-banish an account\n"); + printf + (" block <account name> -- Set state 5 (blocked by the GM Team) to an account\n"); + printf + (" check <account_name> <password> -- Check the validity of a password\n"); + printf + (" create <account_name> <sex> <email> <passwrd> -- Create an account with email\n"); + printf + (" del <account name> -- Remove an account\n"); + printf + (" email <account_name> <email> -- Modify an email of an account\n"); + printf + (" getcount -- Give the number of players online\n"); + printf + (" gm <account_name> [GM_level] -- Modify the GM level of an account\n"); + printf + (" id <account name> -- Give the id of an account\n"); + printf + (" info <account_id> -- Display all information of an account\n"); + printf + (" itemfrob <source-id> <dest-id> -- Map all items from one item ID to another\n"); + printf + (" kami <message> -- Sends a broadcast message (in yellow)\n"); + printf + (" kamib <message> -- Sends a broadcast message (in blue)\n"); + printf + (" language <language> -- Change the language of displaying.\n"); + printf + (" list/ls [First_id [Last_id]] -- Display a list of accounts\n"); + printf + (" listBan/lsBan [First_id [Last_id] ] -- Display a list of accounts\n"); + printf + (" with state or banished\n"); + printf + (" listGM/lsGM [First_id [Last_id]] -- Display a list of GM accounts\n"); + printf + (" listOK/lsOK [First_id [Last_id] ] -- Display a list of accounts\n"); + printf + (" without state and not banished\n"); + printf + (" memo <account_name> <memo> -- Modify the memo of an account\n"); + printf + (" name <account_id> -- Give the name of an account\n"); + printf + (" passwd <account_name> <new_password> -- Change the password of an account\n"); + printf + (" quit/end/exit -- End of the program of administation\n"); + printf + (" reloadGM -- Reload GM configuration file\n"); + printf + (" search <expression> -- Seek accounts\n"); +// printf(" search -e/-r/--expr/--regex <expressn> -- Seek accounts by regular-expression\n"); + printf + (" sex <nomcompte> <sexe> -- Modify the sex of an account\n"); + printf + (" state <account_name> <new_state> <error_message_#7> -- Change the state\n"); + printf + (" timeadd/ta <account_name> <modifier> -- Add or substract time from the\n"); + printf + (" example: ta apple +1m-2mn1s-2y validity limit of an account\n"); + printf + (" timeset/ts <account_name> yyyy/mm/dd [hh:mm:ss] -- Change the validify limit\n"); + printf + (" timeset/ts <account_name> 0 -- Give a unlimited validity limit\n"); + printf + (" unban/unbanish <account name> -- Remove the banishment of an account\n"); + printf + (" unblock <account name> -- Set state 0 (Account ok) to an account\n"); + printf + (" version -- Gives the version of the login-server\n"); + printf + (" who <account name> -- Display all information of an account\n"); + printf + (" who <account name> -- Display all information of an account\n"); + printf + (" Note: To use spaces in an account name, type \"<account name>\" (or ').\n"); + } + } } //----------------------------- // Sub-function: add an account //----------------------------- -int addaccount(char* param, int emailflag) { - char name[1023], sex[1023], email[1023], password[1023]; -// int i; - - memset(name, '\0', sizeof(name)); - memset(sex, '\0', sizeof(sex)); - memset(email, '\0', sizeof(email)); - memset(password, '\0', sizeof(password)); - - if (emailflag == 0) { // add command - if (sscanf(param, "\"%[^\"]\" %s %[^\r\n]", name, sex, password) < 2 && // password can be void - sscanf(param, "'%[^']' %s %[^\r\n]", name, sex, password) < 2 && // password can be void - sscanf(param, "%s %s %[^\r\n]", name, sex, password) < 2) { // password can be void - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte, un sexe et un mot de passe svp.\n"); - printf("<exemple> add nomtest Male motdepassetest\n"); - ladmin_log("Nombre incorrect de param鑼res pour cr馥r un compte (commande 'add')." RETCODE); - } else { - printf("Please input an account name, a sex and a password.\n"); - printf("<example> add testname Male testpass\n"); - ladmin_log("Incomplete parameters to create an account ('add' command)." RETCODE); - } - return 136; - } - strcpy(email, "a@a.com"); // default email - } else { // 1: create command - if (sscanf(param, "\"%[^\"]\" %s %s %[^\r\n]", name, sex, email, password) < 3 && // password can be void - sscanf(param, "'%[^']' %s %s %[^\r\n]", name, sex, email, password) < 3 && // password can be void - sscanf(param, "%s %s %s %[^\r\n]", name, sex, email, password) < 3) { // password can be void - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte, un sexe et un mot de passe svp.\n"); - printf("<exemple> create nomtest Male mo@mail.com motdepassetest\n"); - ladmin_log("Nombre incorrect de param鑼res pour cr馥r un compte (commande 'create')." RETCODE); - } else { - printf("Please input an account name, a sex and a password.\n"); - printf("<example> create testname Male my@mail.com testpass\n"); - ladmin_log("Incomplete parameters to create an account ('create' command)." RETCODE); - } - return 136; - } - } - if (verify_accountname(name) == 0) { - return 102; - } +int addaccount (char *param, int emailflag) +{ + char name[1023], sex[1023], email[1023], password[1023]; +// int i; + + memset (name, '\0', sizeof (name)); + memset (sex, '\0', sizeof (sex)); + memset (email, '\0', sizeof (email)); + memset (password, '\0', sizeof (password)); + + if (emailflag == 0) + { // add command + if (sscanf (param, "\"%[^\"]\" %s %[^\r\n]", name, sex, password) < 2 && // password can be void + sscanf (param, "'%[^']' %s %[^\r\n]", name, sex, password) < 2 && // password can be void + sscanf (param, "%s %s %[^\r\n]", name, sex, password) < 2) + { // password can be void + if (defaultlanguage == 'F') + { + printf + ("Entrez un nom de compte, un sexe et un mot de passe svp.\n"); + printf ("<exemple> add nomtest Male motdepassetest\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour cr馥r un compte (commande 'add')." + RETCODE); + } + else + { + printf + ("Please input an account name, a sex and a password.\n"); + printf ("<example> add testname Male testpass\n"); + ladmin_log + ("Incomplete parameters to create an account ('add' command)." + RETCODE); + } + return 136; + } + strcpy (email, "a@a.com"); // default email + } + else + { // 1: create command + if (sscanf (param, "\"%[^\"]\" %s %s %[^\r\n]", name, sex, email, password) < 3 && // password can be void + sscanf (param, "'%[^']' %s %s %[^\r\n]", name, sex, email, password) < 3 && // password can be void + sscanf (param, "%s %s %s %[^\r\n]", name, sex, email, + password) < 3) + { // password can be void + if (defaultlanguage == 'F') + { + printf + ("Entrez un nom de compte, un sexe et un mot de passe svp.\n"); + printf + ("<exemple> create nomtest Male mo@mail.com motdepassetest\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour cr馥r un compte (commande 'create')." + RETCODE); + } + else + { + printf + ("Please input an account name, a sex and a password.\n"); + printf + ("<example> create testname Male my@mail.com testpass\n"); + ladmin_log + ("Incomplete parameters to create an account ('create' command)." + RETCODE); + } + return 136; + } + } + if (verify_accountname (name) == 0) + { + return 102; + } /* for(i = 0; name[i]; i++) { if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_", name[i]) == NULL) { @@ -1205,1857 +1690,2717 @@ int addaccount(char* param, int emailflag) { } }*/ - sex[0] = toupper(sex[0]); - if (strchr("MF", sex[0]) == NULL) { - if (defaultlanguage == 'F') { - printf("Sexe incorrect [%s]. Entrez M ou F svp.\n", sex); - ladmin_log("Sexe incorrect [%s]. Entrez M ou F svp." RETCODE, sex); - } else { - printf("Illegal gender [%s]. Please input M or F.\n", sex); - ladmin_log("Illegal gender [%s]. Please input M or F." RETCODE, sex); - } - return 103; - } - - if (strlen(email) < 3) { - if (defaultlanguage == 'F') { - printf("Email trop courte [%s]. Entrez une e-mail valide svp.\n", email); - ladmin_log("Email trop courte [%s]. Entrez une e-mail valide svp." RETCODE, email); - } else { - printf("Email is too short [%s]. Please input a valid e-mail.\n", email); - ladmin_log("Email is too short [%s]. Please input a valid e-mail." RETCODE, email); - } - return 109; - } - if (strlen(email) > 39) { - if (defaultlanguage == 'F') { - printf("Email trop longue [%s]. Entrez une e-mail de 39 caract鑽es maximum svp.\n", email); - ladmin_log("Email trop longue [%s]. Entrez une e-mail de 39 caract鑽es maximum svp." RETCODE, email); - } else { - printf("Email is too long [%s]. Please input an e-mail with 39 bytes at the most.\n", email); - ladmin_log("Email is too long [%s]. Please input an e-mail with 39 bytes at the most." RETCODE, email); - } - return 109; - } - if (e_mail_check(email) == 0) { - if (defaultlanguage == 'F') { - printf("Email incorrecte [%s]. Entrez une e-mail valide svp.\n", email); - ladmin_log("Email incorrecte [%s]. Entrez une e-mail valide svp." RETCODE, email); - } else { - printf("Invalid email [%s]. Please input a valid e-mail.\n", email); - ladmin_log("Invalid email [%s]. Please input a valid e-mail." RETCODE, email); - } - return 109; - } - - if (strlen(password) == 0) { - if (typepasswd(password) == 0) - return 108; - } - if (verify_password(password) == 0) - return 104; - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour cr馥r un compte." RETCODE); - } else { - ladmin_log("Request to login-server to create an account." RETCODE); - } - - WFIFOW(login_fd,0) = 0x7930; - memcpy(WFIFOP(login_fd,2), name, 24); - memcpy(WFIFOP(login_fd,26), password, 24); - WFIFOB(login_fd,50) = sex[0]; - memcpy(WFIFOP(login_fd,51), email, 40); - WFIFOSET(login_fd,91); - bytes_to_read = 1; - - return 0; + sex[0] = toupper (sex[0]); + if (strchr ("MF", sex[0]) == NULL) + { + if (defaultlanguage == 'F') + { + printf ("Sexe incorrect [%s]. Entrez M ou F svp.\n", sex); + ladmin_log ("Sexe incorrect [%s]. Entrez M ou F svp." RETCODE, + sex); + } + else + { + printf ("Illegal gender [%s]. Please input M or F.\n", sex); + ladmin_log ("Illegal gender [%s]. Please input M or F." RETCODE, + sex); + } + return 103; + } + + if (strlen (email) < 3) + { + if (defaultlanguage == 'F') + { + printf ("Email trop courte [%s]. Entrez une e-mail valide svp.\n", + email); + ladmin_log + ("Email trop courte [%s]. Entrez une e-mail valide svp." + RETCODE, email); + } + else + { + printf ("Email is too short [%s]. Please input a valid e-mail.\n", + email); + ladmin_log + ("Email is too short [%s]. Please input a valid e-mail." + RETCODE, email); + } + return 109; + } + if (strlen (email) > 39) + { + if (defaultlanguage == 'F') + { + printf + ("Email trop longue [%s]. Entrez une e-mail de 39 caract鑽es maximum svp.\n", + email); + ladmin_log + ("Email trop longue [%s]. Entrez une e-mail de 39 caract鑽es maximum svp." + RETCODE, email); + } + else + { + printf + ("Email is too long [%s]. Please input an e-mail with 39 bytes at the most.\n", + email); + ladmin_log + ("Email is too long [%s]. Please input an e-mail with 39 bytes at the most." + RETCODE, email); + } + return 109; + } + if (e_mail_check (email) == 0) + { + if (defaultlanguage == 'F') + { + printf ("Email incorrecte [%s]. Entrez une e-mail valide svp.\n", + email); + ladmin_log ("Email incorrecte [%s]. Entrez une e-mail valide svp." + RETCODE, email); + } + else + { + printf ("Invalid email [%s]. Please input a valid e-mail.\n", + email); + ladmin_log ("Invalid email [%s]. Please input a valid e-mail." + RETCODE, email); + } + return 109; + } + + if (strlen (password) == 0) + { + if (typepasswd (password) == 0) + return 108; + } + if (verify_password (password) == 0) + return 104; + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour cr馥r un compte." + RETCODE); + } + else + { + ladmin_log ("Request to login-server to create an account." RETCODE); + } + + WFIFOW (login_fd, 0) = 0x7930; + memcpy (WFIFOP (login_fd, 2), name, 24); + memcpy (WFIFOP (login_fd, 26), password, 24); + WFIFOB (login_fd, 50) = sex[0]; + memcpy (WFIFOP (login_fd, 51), email, 40); + WFIFOSET (login_fd, 91); + bytes_to_read = 1; + + return 0; } //--------------------------------------------------------------------------------- // Sub-function: Add/substract time to the final date of a banishment of an account //--------------------------------------------------------------------------------- -int banaddaccount(char* param) { - char name[1023], modif[1023]; - int year, month, day, hour, minute, second; - char * p_modif; - int value, i; - - memset(name, '\0', sizeof(name)); - memset(modif, '\0', sizeof(modif)); - year = month = day = hour = minute = second = 0; - - if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, modif) < 2 && - sscanf(param, "'%[^']' %[^\r\n]", name, modif) < 2 && - sscanf(param, "%s %[^\r\n]", name, modif) < 2) { - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte et un modificateur svp.\n"); - printf(" <exemple> banadd nomtest +1m-2mn1s-6y\n"); - printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n"); - printf(" et 6 ans dans le m麥e temps.\n"); - ladmin_log("Nombre incorrect de param鑼res pour modifier la fin de ban d'un compte (commande 'banadd')." RETCODE); - } else { - printf("Please input an account name and a modifier.\n"); - printf(" <example>: banadd testname +1m-2mn1s-6y\n"); - printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n"); - printf(" and 6 years at the same time.\n"); - ladmin_log("Incomplete parameters to modify the ban date/time of an account ('banadd' command)." RETCODE); - } - return 136; - } - if (verify_accountname(name) == 0) { - return 102; - } - - // lowercase for modif - for (i = 0; modif[i]; i++) - modif[i] = tolower(modif[i]); - p_modif = modif; - while (strlen(p_modif) > 0) { - value = atoi(p_modif); - if (value == 0) { - p_modif++; - } else { - if (p_modif[0] == '-' || p_modif[0] == '+') - p_modif++; - while (strlen(p_modif) > 0 && p_modif[0] >= '0' && p_modif[0] <= '9') { - p_modif++; - } - if (p_modif[0] == 's') { - second = value; - p_modif++; - } else if (p_modif[0] == 'm' && p_modif[1] == 'n') { - minute = value; - p_modif += 2; - } else if (p_modif[0] == 'h') { - hour = value; - p_modif++; - } else if (p_modif[0] == 'd' || p_modif[0] == 'j') { - day = value; - p_modif += 2; - } else if (p_modif[0] == 'm') { - month = value; - p_modif++; - } else if (p_modif[0] == 'y' || p_modif[0] == 'a') { - year = value; - p_modif++; - } else { - p_modif++; - } - } - } - - if (defaultlanguage == 'F') { - printf(" ann馥: %d\n", year); - printf(" mois: %d\n", month); - printf(" jour: %d\n", day); - printf(" heure: %d\n", hour); - printf(" minute: %d\n", minute); - printf(" seconde: %d\n", second); - } else { - printf(" year: %d\n", year); - printf(" month: %d\n", month); - printf(" day: %d\n", day); - printf(" hour: %d\n", hour); - printf(" minute: %d\n", minute); - printf(" second: %d\n", second); - } - - if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) { - if (defaultlanguage == 'F') { - printf("Vous devez entrer un ajustement avec cette commande, svp:\n"); - printf(" Valeur d'ajustement (-1, 1, +1, etc...)\n"); - printf(" Element modifi:\n"); - printf(" a ou y: ann馥\n"); - printf(" m: mois\n"); - printf(" j ou d: jour\n"); - printf(" h: heure\n"); - printf(" mn: minute\n"); - printf(" s: seconde\n"); - printf(" <exemple> banadd nomtest +1m-2mn1s-6y\n"); - printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n"); - printf(" et 6 ans dans le m麥e temps.\n"); - ladmin_log("Aucun ajustement n'est pas un ajustement (commande 'banadd')." RETCODE); - } else { - printf("Please give an adjustment with this command:\n"); - printf(" Adjustment value (-1, 1, +1, etc...)\n"); - printf(" Modified element:\n"); - printf(" a or y: year\n"); - printf(" m: month\n"); - printf(" j or d: day\n"); - printf(" h: hour\n"); - printf(" mn: minute\n"); - printf(" s: second\n"); - printf(" <example> banadd testname +1m-2mn1s-6y\n"); - printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n"); - printf(" and 6 years at the same time.\n"); - ladmin_log("No adjustment isn't an adjustment ('banadd' command)." RETCODE); - } - return 137; - } - if (year > 127 || year < -127) { - if (defaultlanguage == 'F') { - printf("Entrez un ajustement d'ann馥s correct (de -127 127), svp.\n"); - ladmin_log("Ajustement de l'ann馥 hors norme (commande 'banadd')." RETCODE); - } else { - printf("Please give a correct adjustment for the years (from -127 to 127).\n"); - ladmin_log("Abnormal adjustement for the year ('banadd' command)." RETCODE); - } - return 137; - } - if (month > 255 || month < -255) { - if (defaultlanguage == 'F') { - printf("Entrez un ajustement de mois correct (de -255 255), svp.\n"); - ladmin_log("Ajustement du mois hors norme (commande 'banadd')." RETCODE); - } else { - printf("Please give a correct adjustment for the months (from -255 to 255).\n"); - ladmin_log("Abnormal adjustement for the month ('banadd' command)." RETCODE); - } - return 137; - } - if (day > 32767 || day < -32767) { - if (defaultlanguage == 'F') { - printf("Entrez un ajustement de jours correct (de -32767 32767), svp.\n"); - ladmin_log("Ajustement des jours hors norme (commande 'banadd')." RETCODE); - } else { - printf("Please give a correct adjustment for the days (from -32767 to 32767).\n"); - ladmin_log("Abnormal adjustement for the days ('banadd' command)." RETCODE); - } - return 137; - } - if (hour > 32767 || hour < -32767) { - if (defaultlanguage == 'F') { - printf("Entrez un ajustement d'heures correct (de -32767 32767), svp.\n"); - ladmin_log("Ajustement des heures hors norme (commande 'banadd')." RETCODE); - } else { - printf("Please give a correct adjustment for the hours (from -32767 to 32767).\n"); - ladmin_log("Abnormal adjustement for the hours ('banadd' command)." RETCODE); - } - return 137; - } - if (minute > 32767 || minute < -32767) { - if (defaultlanguage == 'F') { - printf("Entrez un ajustement de minutes correct (de -32767 32767), svp.\n"); - ladmin_log("Ajustement des minutes hors norme (commande 'banadd')." RETCODE); - } else { - printf("Please give a correct adjustment for the minutes (from -32767 to 32767).\n"); - ladmin_log("Abnormal adjustement for the minutes ('banadd' command)." RETCODE); - } - return 137; - } - if (second > 32767 || second < -32767) { - if (defaultlanguage == 'F') { - printf("Entrez un ajustement de secondes correct (de -32767 32767), svp.\n"); - ladmin_log("Ajustement des secondes hors norme (commande 'banadd')." RETCODE); - } else { - printf("Please give a correct adjustment for the seconds (from -32767 to 32767).\n"); - ladmin_log("Abnormal adjustement for the seconds ('banadd' command)." RETCODE); - } - return 137; - } - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour modifier la date d'un bannissement." RETCODE); - } else { - ladmin_log("Request to login-server to modify a ban date/time." RETCODE); - } - - WFIFOW(login_fd,0) = 0x794c; - memcpy(WFIFOP(login_fd,2), name, 24); - WFIFOW(login_fd,26) = (short)year; - WFIFOW(login_fd,28) = (short)month; - WFIFOW(login_fd,30) = (short)day; - WFIFOW(login_fd,32) = (short)hour; - WFIFOW(login_fd,34) = (short)minute; - WFIFOW(login_fd,36) = (short)second; - WFIFOSET(login_fd,38); - bytes_to_read = 1; - - return 0; +int banaddaccount (char *param) +{ + char name[1023], modif[1023]; + int year, month, day, hour, minute, second; + char *p_modif; + int value, i; + + memset (name, '\0', sizeof (name)); + memset (modif, '\0', sizeof (modif)); + year = month = day = hour = minute = second = 0; + + if (sscanf (param, "\"%[^\"]\" %[^\r\n]", name, modif) < 2 && + sscanf (param, "'%[^']' %[^\r\n]", name, modif) < 2 && + sscanf (param, "%s %[^\r\n]", name, modif) < 2) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte et un modificateur svp.\n"); + printf (" <exemple> banadd nomtest +1m-2mn1s-6y\n"); + printf + (" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n"); + printf (" et 6 ans dans le m麥e temps.\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour modifier la fin de ban d'un compte (commande 'banadd')." + RETCODE); + } + else + { + printf ("Please input an account name and a modifier.\n"); + printf (" <example>: banadd testname +1m-2mn1s-6y\n"); + printf + (" this example adds 1 month and 1 second, and substracts 2 minutes\n"); + printf (" and 6 years at the same time.\n"); + ladmin_log + ("Incomplete parameters to modify the ban date/time of an account ('banadd' command)." + RETCODE); + } + return 136; + } + if (verify_accountname (name) == 0) + { + return 102; + } + + // lowercase for modif + for (i = 0; modif[i]; i++) + modif[i] = tolower (modif[i]); + p_modif = modif; + while (strlen (p_modif) > 0) + { + value = atoi (p_modif); + if (value == 0) + { + p_modif++; + } + else + { + if (p_modif[0] == '-' || p_modif[0] == '+') + p_modif++; + while (strlen (p_modif) > 0 && p_modif[0] >= '0' + && p_modif[0] <= '9') + { + p_modif++; + } + if (p_modif[0] == 's') + { + second = value; + p_modif++; + } + else if (p_modif[0] == 'm' && p_modif[1] == 'n') + { + minute = value; + p_modif += 2; + } + else if (p_modif[0] == 'h') + { + hour = value; + p_modif++; + } + else if (p_modif[0] == 'd' || p_modif[0] == 'j') + { + day = value; + p_modif += 2; + } + else if (p_modif[0] == 'm') + { + month = value; + p_modif++; + } + else if (p_modif[0] == 'y' || p_modif[0] == 'a') + { + year = value; + p_modif++; + } + else + { + p_modif++; + } + } + } + + if (defaultlanguage == 'F') + { + printf (" ann馥: %d\n", year); + printf (" mois: %d\n", month); + printf (" jour: %d\n", day); + printf (" heure: %d\n", hour); + printf (" minute: %d\n", minute); + printf (" seconde: %d\n", second); + } + else + { + printf (" year: %d\n", year); + printf (" month: %d\n", month); + printf (" day: %d\n", day); + printf (" hour: %d\n", hour); + printf (" minute: %d\n", minute); + printf (" second: %d\n", second); + } + + if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 + && second == 0) + { + if (defaultlanguage == 'F') + { + printf + ("Vous devez entrer un ajustement avec cette commande, svp:\n"); + printf (" Valeur d'ajustement (-1, 1, +1, etc...)\n"); + printf (" Element modifi:\n"); + printf (" a ou y: ann馥\n"); + printf (" m: mois\n"); + printf (" j ou d: jour\n"); + printf (" h: heure\n"); + printf (" mn: minute\n"); + printf (" s: seconde\n"); + printf (" <exemple> banadd nomtest +1m-2mn1s-6y\n"); + printf + (" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n"); + printf (" et 6 ans dans le m麥e temps.\n"); + ladmin_log + ("Aucun ajustement n'est pas un ajustement (commande 'banadd')." + RETCODE); + } + else + { + printf ("Please give an adjustment with this command:\n"); + printf (" Adjustment value (-1, 1, +1, etc...)\n"); + printf (" Modified element:\n"); + printf (" a or y: year\n"); + printf (" m: month\n"); + printf (" j or d: day\n"); + printf (" h: hour\n"); + printf (" mn: minute\n"); + printf (" s: second\n"); + printf (" <example> banadd testname +1m-2mn1s-6y\n"); + printf + (" this example adds 1 month and 1 second, and substracts 2 minutes\n"); + printf (" and 6 years at the same time.\n"); + ladmin_log + ("No adjustment isn't an adjustment ('banadd' command)." + RETCODE); + } + return 137; + } + if (year > 127 || year < -127) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez un ajustement d'ann馥s correct (de -127 127), svp.\n"); + ladmin_log + ("Ajustement de l'ann馥 hors norme (commande 'banadd')." + RETCODE); + } + else + { + printf + ("Please give a correct adjustment for the years (from -127 to 127).\n"); + ladmin_log + ("Abnormal adjustement for the year ('banadd' command)." + RETCODE); + } + return 137; + } + if (month > 255 || month < -255) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez un ajustement de mois correct (de -255 255), svp.\n"); + ladmin_log ("Ajustement du mois hors norme (commande 'banadd')." + RETCODE); + } + else + { + printf + ("Please give a correct adjustment for the months (from -255 to 255).\n"); + ladmin_log + ("Abnormal adjustement for the month ('banadd' command)." + RETCODE); + } + return 137; + } + if (day > 32767 || day < -32767) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez un ajustement de jours correct (de -32767 32767), svp.\n"); + ladmin_log ("Ajustement des jours hors norme (commande 'banadd')." + RETCODE); + } + else + { + printf + ("Please give a correct adjustment for the days (from -32767 to 32767).\n"); + ladmin_log + ("Abnormal adjustement for the days ('banadd' command)." + RETCODE); + } + return 137; + } + if (hour > 32767 || hour < -32767) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez un ajustement d'heures correct (de -32767 32767), svp.\n"); + ladmin_log + ("Ajustement des heures hors norme (commande 'banadd')." + RETCODE); + } + else + { + printf + ("Please give a correct adjustment for the hours (from -32767 to 32767).\n"); + ladmin_log + ("Abnormal adjustement for the hours ('banadd' command)." + RETCODE); + } + return 137; + } + if (minute > 32767 || minute < -32767) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez un ajustement de minutes correct (de -32767 32767), svp.\n"); + ladmin_log + ("Ajustement des minutes hors norme (commande 'banadd')." + RETCODE); + } + else + { + printf + ("Please give a correct adjustment for the minutes (from -32767 to 32767).\n"); + ladmin_log + ("Abnormal adjustement for the minutes ('banadd' command)." + RETCODE); + } + return 137; + } + if (second > 32767 || second < -32767) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez un ajustement de secondes correct (de -32767 32767), svp.\n"); + ladmin_log + ("Ajustement des secondes hors norme (commande 'banadd')." + RETCODE); + } + else + { + printf + ("Please give a correct adjustment for the seconds (from -32767 to 32767).\n"); + ladmin_log + ("Abnormal adjustement for the seconds ('banadd' command)." + RETCODE); + } + return 137; + } + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour modifier la date d'un bannissement." + RETCODE); + } + else + { + ladmin_log ("Request to login-server to modify a ban date/time." + RETCODE); + } + + WFIFOW (login_fd, 0) = 0x794c; + memcpy (WFIFOP (login_fd, 2), name, 24); + WFIFOW (login_fd, 26) = (short) year; + WFIFOW (login_fd, 28) = (short) month; + WFIFOW (login_fd, 30) = (short) day; + WFIFOW (login_fd, 32) = (short) hour; + WFIFOW (login_fd, 34) = (short) minute; + WFIFOW (login_fd, 36) = (short) second; + WFIFOSET (login_fd, 38); + bytes_to_read = 1; + + return 0; } //----------------------------------------------------------------------- // Sub-function of sub-function banaccount, unbanaccount or bansetaccount // Set the final date of a banishment of an account //----------------------------------------------------------------------- -int bansetaccountsub(char* name, char* date, char* time) { - int year, month, day, hour, minute, second; - time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban) - struct tm *tmtime; - - year = month = day = hour = minute = second = 0; - ban_until_time = 0; - tmtime = localtime(&ban_until_time); // initialize - - if (verify_accountname(name) == 0) { - return 102; - } - - if (atoi(date) != 0 && - ((sscanf(date, "%d/%d/%d", &year, &month, &day) < 3 && - sscanf(date, "%d-%d-%d", &year, &month, &day) < 3 && - sscanf(date, "%d.%d.%d", &year, &month, &day) < 3) || - sscanf(time, "%d:%d:%d", &hour, &minute, &second) < 3)) { - if (defaultlanguage == 'F') { - printf("Entrez une date et une heure svp (format: aaaa/mm/jj hh:mm:ss).\n"); - printf("Vous pouvez aussi mettre 0 la place si vous utilisez la commande 'banset'.\n"); - ladmin_log("Format incorrect pour la date/heure (commande'banset' ou 'ban')." RETCODE); - } else { - printf("Please input a date and a time (format: yyyy/mm/dd hh:mm:ss).\n"); - printf("You can imput 0 instead of if you use 'banset' command.\n"); - ladmin_log("Invalid format for the date/time ('banset' or 'ban' command)." RETCODE); - } - return 102; - } - - if (atoi(date) == 0) { - ban_until_time = 0; - } else { - if (year < 70) { - year = year + 100; - } - if (year >= 1900) { - year = year - 1900; - } - if (month < 1 || month > 12) { - if (defaultlanguage == 'F') { - printf("Entrez un mois correct svp (entre 1 et 12).\n"); - ladmin_log("Mois incorrect pour la date (command 'banset' ou 'ban')." RETCODE); - } else { - printf("Please give a correct value for the month (from 1 to 12).\n"); - ladmin_log("Invalid month for the date ('banset' or 'ban' command)." RETCODE); - } - return 102; - } - month = month - 1; - if (day < 1 || day > 31) { - if (defaultlanguage == 'F') { - printf("Entrez un jour correct svp (entre 1 et 31).\n"); - ladmin_log("Jour incorrect pour la date (command 'banset' ou 'ban')." RETCODE); - } else { - printf("Please give a correct value for the day (from 1 to 31).\n"); - ladmin_log("Invalid day for the date ('banset' or 'ban' command)." RETCODE); - } - return 102; - } - if (((month == 3 || month == 5 || month == 8 || month == 10) && day > 30) || - (month == 1 && day > 29)) { - if (defaultlanguage == 'F') { - printf("Entrez un jour correct en fonction du mois (%d) svp.\n", month); - ladmin_log("Jour incorrect pour ce mois correspondant (command 'banset' ou 'ban')." RETCODE); - } else { - printf("Please give a correct value for a day of this month (%d).\n", month); - ladmin_log("Invalid day for this month ('banset' or 'ban' command)." RETCODE); - } - return 102; - } - if (hour < 0 || hour > 23) { - if (defaultlanguage == 'F') { - printf("Entrez une heure correcte svp (entre 0 et 23).\n"); - ladmin_log("Heure incorrecte pour l'heure (command 'banset' ou 'ban')." RETCODE); - } else { - printf("Please give a correct value for the hour (from 0 to 23).\n"); - ladmin_log("Invalid hour for the time ('banset' or 'ban' command)." RETCODE); - } - return 102; - } - if (minute < 0 || minute > 59) { - if (defaultlanguage == 'F') { - printf("Entrez des minutes correctes svp (entre 0 et 59).\n"); - ladmin_log("Minute incorrecte pour l'heure (command 'banset' ou 'ban')." RETCODE); - } else { - printf("Please give a correct value for the minutes (from 0 to 59).\n"); - ladmin_log("Invalid minute for the time ('banset' or 'ban' command)." RETCODE); - } - return 102; - } - if (second < 0 || second > 59) { - if (defaultlanguage == 'F') { - printf("Entrez des secondes correctes svp (entre 0 et 59).\n"); - ladmin_log("Seconde incorrecte pour l'heure (command 'banset' ou 'ban')." RETCODE); - } else { - printf("Please give a correct value for the seconds (from 0 to 59).\n"); - ladmin_log("Invalid second for the time ('banset' or 'ban' command)." RETCODE); - } - return 102; - } - tmtime->tm_year = year; - tmtime->tm_mon = month; - tmtime->tm_mday = day; - tmtime->tm_hour = hour; - tmtime->tm_min = minute; - tmtime->tm_sec = second; - tmtime->tm_isdst = -1; // -1: no winter/summer time modification - ban_until_time = timegm(tmtime); - if (ban_until_time == -1) { - if (defaultlanguage == 'F') { - printf("Date incorrecte.\n"); - printf("Entrez une date et une heure svp (format: aaaa/mm/jj hh:mm:ss).\n"); - printf("Vous pouvez aussi mettre 0 la place si vous utilisez la commande 'banset'.\n"); - ladmin_log("Date incorrecte. (command 'banset' ou 'ban')." RETCODE); - } else { - printf("Invalid date.\n"); - printf("Please input a date and a time (format: yyyy/mm/dd hh:mm:ss).\n"); - printf("You can imput 0 instead of if you use 'banset' command.\n"); - ladmin_log("Invalid date. ('banset' or 'ban' command)." RETCODE); - } - return 102; - } - } - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour fixer un ban." RETCODE); - } else { - ladmin_log("Request to login-server to set a ban." RETCODE); - } - - WFIFOW(login_fd,0) = 0x794a; - memcpy(WFIFOP(login_fd,2), name, 24); - WFIFOL(login_fd,26) = (int)ban_until_time; - WFIFOSET(login_fd,30); - bytes_to_read = 1; - - return 0; +int bansetaccountsub (char *name, char *date, char *time) +{ + int year, month, day, hour, minute, second; + time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban) + struct tm *tmtime; + + year = month = day = hour = minute = second = 0; + ban_until_time = 0; + tmtime = localtime (&ban_until_time); // initialize + + if (verify_accountname (name) == 0) + { + return 102; + } + + if (atoi (date) != 0 && + ((sscanf (date, "%d/%d/%d", &year, &month, &day) < 3 && + sscanf (date, "%d-%d-%d", &year, &month, &day) < 3 && + sscanf (date, "%d.%d.%d", &year, &month, &day) < 3) || + sscanf (time, "%d:%d:%d", &hour, &minute, &second) < 3)) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez une date et une heure svp (format: aaaa/mm/jj hh:mm:ss).\n"); + printf + ("Vous pouvez aussi mettre 0 la place si vous utilisez la commande 'banset'.\n"); + ladmin_log + ("Format incorrect pour la date/heure (commande'banset' ou 'ban')." + RETCODE); + } + else + { + printf + ("Please input a date and a time (format: yyyy/mm/dd hh:mm:ss).\n"); + printf + ("You can imput 0 instead of if you use 'banset' command.\n"); + ladmin_log + ("Invalid format for the date/time ('banset' or 'ban' command)." + RETCODE); + } + return 102; + } + + if (atoi (date) == 0) + { + ban_until_time = 0; + } + else + { + if (year < 70) + { + year = year + 100; + } + if (year >= 1900) + { + year = year - 1900; + } + if (month < 1 || month > 12) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un mois correct svp (entre 1 et 12).\n"); + ladmin_log + ("Mois incorrect pour la date (command 'banset' ou 'ban')." + RETCODE); + } + else + { + printf + ("Please give a correct value for the month (from 1 to 12).\n"); + ladmin_log + ("Invalid month for the date ('banset' or 'ban' command)." + RETCODE); + } + return 102; + } + month = month - 1; + if (day < 1 || day > 31) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un jour correct svp (entre 1 et 31).\n"); + ladmin_log + ("Jour incorrect pour la date (command 'banset' ou 'ban')." + RETCODE); + } + else + { + printf + ("Please give a correct value for the day (from 1 to 31).\n"); + ladmin_log + ("Invalid day for the date ('banset' or 'ban' command)." + RETCODE); + } + return 102; + } + if (((month == 3 || month == 5 || month == 8 || month == 10) + && day > 30) || (month == 1 && day > 29)) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez un jour correct en fonction du mois (%d) svp.\n", + month); + ladmin_log + ("Jour incorrect pour ce mois correspondant (command 'banset' ou 'ban')." + RETCODE); + } + else + { + printf + ("Please give a correct value for a day of this month (%d).\n", + month); + ladmin_log + ("Invalid day for this month ('banset' or 'ban' command)." + RETCODE); + } + return 102; + } + if (hour < 0 || hour > 23) + { + if (defaultlanguage == 'F') + { + printf ("Entrez une heure correcte svp (entre 0 et 23).\n"); + ladmin_log + ("Heure incorrecte pour l'heure (command 'banset' ou 'ban')." + RETCODE); + } + else + { + printf + ("Please give a correct value for the hour (from 0 to 23).\n"); + ladmin_log + ("Invalid hour for the time ('banset' or 'ban' command)." + RETCODE); + } + return 102; + } + if (minute < 0 || minute > 59) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez des minutes correctes svp (entre 0 et 59).\n"); + ladmin_log + ("Minute incorrecte pour l'heure (command 'banset' ou 'ban')." + RETCODE); + } + else + { + printf + ("Please give a correct value for the minutes (from 0 to 59).\n"); + ladmin_log + ("Invalid minute for the time ('banset' or 'ban' command)." + RETCODE); + } + return 102; + } + if (second < 0 || second > 59) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez des secondes correctes svp (entre 0 et 59).\n"); + ladmin_log + ("Seconde incorrecte pour l'heure (command 'banset' ou 'ban')." + RETCODE); + } + else + { + printf + ("Please give a correct value for the seconds (from 0 to 59).\n"); + ladmin_log + ("Invalid second for the time ('banset' or 'ban' command)." + RETCODE); + } + return 102; + } + tmtime->tm_year = year; + tmtime->tm_mon = month; + tmtime->tm_mday = day; + tmtime->tm_hour = hour; + tmtime->tm_min = minute; + tmtime->tm_sec = second; + tmtime->tm_isdst = -1; // -1: no winter/summer time modification + ban_until_time = timegm (tmtime); + if (ban_until_time == -1) + { + if (defaultlanguage == 'F') + { + printf ("Date incorrecte.\n"); + printf + ("Entrez une date et une heure svp (format: aaaa/mm/jj hh:mm:ss).\n"); + printf + ("Vous pouvez aussi mettre 0 la place si vous utilisez la commande 'banset'.\n"); + ladmin_log ("Date incorrecte. (command 'banset' ou 'ban')." + RETCODE); + } + else + { + printf ("Invalid date.\n"); + printf + ("Please input a date and a time (format: yyyy/mm/dd hh:mm:ss).\n"); + printf + ("You can imput 0 instead of if you use 'banset' command.\n"); + ladmin_log ("Invalid date. ('banset' or 'ban' command)." + RETCODE); + } + return 102; + } + } + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour fixer un ban." + RETCODE); + } + else + { + ladmin_log ("Request to login-server to set a ban." RETCODE); + } + + WFIFOW (login_fd, 0) = 0x794a; + memcpy (WFIFOP (login_fd, 2), name, 24); + WFIFOL (login_fd, 26) = (int) ban_until_time; + WFIFOSET (login_fd, 30); + bytes_to_read = 1; + + return 0; } //--------------------------------------------------------------------- // Sub-function: Set the final date of a banishment of an account (ban) //--------------------------------------------------------------------- -int banaccount(char* param) { - char name[1023], date[1023], time[1023]; - - memset(name, '\0', sizeof(name)); - memset(date, '\0', sizeof(date)); - memset(time, '\0', sizeof(time)); - - if (sscanf(param, "%s %s \"%[^\"]\"", date, time, name) < 3 && - sscanf(param, "%s %s '%[^']'", date, time, name) < 3 && - sscanf(param, "%s %s %[^\r\n]", date, time, name) < 3) { - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte, une date et une heure svp.\n"); - printf("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n"); - printf(" banset <nom_du_compte> 0 (0 = d-bani)\n"); - printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n"); - printf(" unban/unbanish <nom du compte>\n"); - printf(" Heure par d馭aut [hh:mm:ss]: 23:59:59.\n"); - ladmin_log("Nombre incorrect de param鑼res pour fixer un ban (commande 'banset' ou 'ban')." RETCODE); - } else { - printf("Please input an account name, a date and a hour.\n"); - printf("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n"); - printf(" banset <account_name> 0 (0 = un-banished)\n"); - printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n"); - printf(" unban/unbanish <account name>\n"); - printf(" Default time [hh:mm:ss]: 23:59:59.\n"); - ladmin_log("Incomplete parameters to set a ban ('banset' or 'ban' command)." RETCODE); - } - return 136; - } +int banaccount (char *param) +{ + char name[1023], date[1023], time[1023]; + + memset (name, '\0', sizeof (name)); + memset (date, '\0', sizeof (date)); + memset (time, '\0', sizeof (time)); + + if (sscanf (param, "%s %s \"%[^\"]\"", date, time, name) < 3 && + sscanf (param, "%s %s '%[^']'", date, time, name) < 3 && + sscanf (param, "%s %s %[^\r\n]", date, time, name) < 3) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte, une date et une heure svp.\n"); + printf + ("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n"); + printf (" banset <nom_du_compte> 0 (0 = d-bani)\n"); + printf + (" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n"); + printf (" unban/unbanish <nom du compte>\n"); + printf (" Heure par d馭aut [hh:mm:ss]: 23:59:59.\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour fixer un ban (commande 'banset' ou 'ban')." + RETCODE); + } + else + { + printf ("Please input an account name, a date and a hour.\n"); + printf + ("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n"); + printf + (" banset <account_name> 0 (0 = un-banished)\n"); + printf + (" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n"); + printf (" unban/unbanish <account name>\n"); + printf (" Default time [hh:mm:ss]: 23:59:59.\n"); + ladmin_log + ("Incomplete parameters to set a ban ('banset' or 'ban' command)." + RETCODE); + } + return 136; + } - return bansetaccountsub(name, date, time); + return bansetaccountsub (name, date, time); } //------------------------------------------------------------------------ // Sub-function: Set the final date of a banishment of an account (banset) //------------------------------------------------------------------------ -int bansetaccount(char* param) { - char name[1023], date[1023], time[1023]; - - memset(name, '\0', sizeof(name)); - memset(date, '\0', sizeof(date)); - memset(time, '\0', sizeof(time)); - - if (sscanf(param, "\"%[^\"]\" %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void - sscanf(param, "'%[^']' %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void - sscanf(param, "%s %s %[^\r\n]", name, date, time) < 2) { // if date = 0, time can be void - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte, une date et une heure svp.\n"); - printf("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n"); - printf(" banset <nom_du_compte> 0 (0 = d-bani)\n"); - printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n"); - printf(" unban/unbanish <nom du compte>\n"); - printf(" Heure par d馭aut [hh:mm:ss]: 23:59:59.\n"); - ladmin_log("Nombre incorrect de param鑼res pour fixer un ban (commande 'banset' ou 'ban')." RETCODE); - } else { - printf("Please input an account name, a date and a hour.\n"); - printf("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n"); - printf(" banset <account_name> 0 (0 = un-banished)\n"); - printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n"); - printf(" unban/unbanish <account name>\n"); - printf(" Default time [hh:mm:ss]: 23:59:59.\n"); - ladmin_log("Incomplete parameters to set a ban ('banset' or 'ban' command)." RETCODE); - } - return 136; - } +int bansetaccount (char *param) +{ + char name[1023], date[1023], time[1023]; + + memset (name, '\0', sizeof (name)); + memset (date, '\0', sizeof (date)); + memset (time, '\0', sizeof (time)); + + if (sscanf (param, "\"%[^\"]\" %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void + sscanf (param, "'%[^']' %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void + sscanf (param, "%s %s %[^\r\n]", name, date, time) < 2) + { // if date = 0, time can be void + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte, une date et une heure svp.\n"); + printf + ("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n"); + printf (" banset <nom_du_compte> 0 (0 = d-bani)\n"); + printf + (" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n"); + printf (" unban/unbanish <nom du compte>\n"); + printf (" Heure par d馭aut [hh:mm:ss]: 23:59:59.\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour fixer un ban (commande 'banset' ou 'ban')." + RETCODE); + } + else + { + printf ("Please input an account name, a date and a hour.\n"); + printf + ("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n"); + printf + (" banset <account_name> 0 (0 = un-banished)\n"); + printf + (" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n"); + printf (" unban/unbanish <account name>\n"); + printf (" Default time [hh:mm:ss]: 23:59:59.\n"); + ladmin_log + ("Incomplete parameters to set a ban ('banset' or 'ban' command)." + RETCODE); + } + return 136; + } - if (time[0] == '\0') - strcpy(time, "23:59:59"); + if (time[0] == '\0') + strcpy (time, "23:59:59"); - return bansetaccountsub(name, date, time); + return bansetaccountsub (name, date, time); } //------------------------------------------------- // Sub-function: unbanishment of an account (unban) //------------------------------------------------- -int unbanaccount(char* param) { - char name[1023]; - - memset(name, '\0', sizeof(name)); - - if (strlen(param) == 0 || - (sscanf(param, "\"%[^\"]\"", name) < 1 && - sscanf(param, "'%[^']'", name) < 1 && - sscanf(param, "%[^\r\n]", name) < 1) || - strlen(name) == 0) { - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte svp.\n"); - printf("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n"); - printf(" banset <nom_du_compte> 0 (0 = d-bani)\n"); - printf(" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n"); - printf(" unban/unbanish <nom du compte>\n"); - printf(" Heure par d馭aut [hh:mm:ss]: 23:59:59.\n"); - ladmin_log("Nombre incorrect de param鑼res pour fixer un ban (commande 'unban')." RETCODE); - } else { - printf("Please input an account name.\n"); - printf("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n"); - printf(" banset <account_name> 0 (0 = un-banished)\n"); - printf(" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n"); - printf(" unban/unbanish <account name>\n"); - printf(" Default time [hh:mm:ss]: 23:59:59.\n"); - ladmin_log("Incomplete parameters to set a ban ('unban' command)." RETCODE); - } - return 136; - } +int unbanaccount (char *param) +{ + char name[1023]; + + memset (name, '\0', sizeof (name)); + + if (strlen (param) == 0 || + (sscanf (param, "\"%[^\"]\"", name) < 1 && + sscanf (param, "'%[^']'", name) < 1 && + sscanf (param, "%[^\r\n]", name) < 1) || strlen (name) == 0) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte svp.\n"); + printf + ("<exemple>: banset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n"); + printf (" banset <nom_du_compte> 0 (0 = d-bani)\n"); + printf + (" ban/banish aaaa/mm/jj hh:mm:ss <nom du compte>\n"); + printf (" unban/unbanish <nom du compte>\n"); + printf (" Heure par d馭aut [hh:mm:ss]: 23:59:59.\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour fixer un ban (commande 'unban')." + RETCODE); + } + else + { + printf ("Please input an account name.\n"); + printf + ("<example>: banset <account_name> yyyy/mm/dd [hh:mm:ss]\n"); + printf + (" banset <account_name> 0 (0 = un-banished)\n"); + printf + (" ban/banish yyyy/mm/dd hh:mm:ss <account name>\n"); + printf (" unban/unbanish <account name>\n"); + printf (" Default time [hh:mm:ss]: 23:59:59.\n"); + ladmin_log + ("Incomplete parameters to set a ban ('unban' command)." + RETCODE); + } + return 136; + } - return bansetaccountsub(name, "0", ""); + return bansetaccountsub (name, "0", ""); } //--------------------------------------------------------- // Sub-function: Asking to check the validity of a password // (Note: never send back a password with login-server!! security of passwords) //--------------------------------------------------------- -int checkaccount(char* param) { - char name[1023], password[1023]; - - memset(name, '\0', sizeof(name)); - memset(password, '\0', sizeof(password)); - - if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, password) < 1 && // password can be void - sscanf(param, "'%[^']' %[^\r\n]", name, password) < 1 && // password can be void - sscanf(param, "%s %[^\r\n]", name, password) < 1) { // password can be void - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte svp.\n"); - printf("<exemple> check testname motdepasse\n"); - ladmin_log("Nombre incorrect de param鑼res pour tester le mot d'un passe d'un compte (commande 'check')." RETCODE); - } else { - printf("Please input an account name.\n"); - printf("<example> check testname password\n"); - ladmin_log("Incomplete parameters to check the password of an account ('check' command)." RETCODE); - } - return 136; - } - - if (verify_accountname(name) == 0) { - return 102; - } - - if (strlen(password) == 0) { - if (typepasswd(password) == 0) - return 134; - } - if (verify_password(password) == 0) - return 131; - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour test un mot de passe." RETCODE); - } else { - ladmin_log("Request to login-server to check a password." RETCODE); - } - - WFIFOW(login_fd,0) = 0x793a; - memcpy(WFIFOP(login_fd,2), name, 24); - memcpy(WFIFOP(login_fd,26), password, 24); - WFIFOSET(login_fd,50); - bytes_to_read = 1; - - return 0; +int checkaccount (char *param) +{ + char name[1023], password[1023]; + + memset (name, '\0', sizeof (name)); + memset (password, '\0', sizeof (password)); + + if (sscanf (param, "\"%[^\"]\" %[^\r\n]", name, password) < 1 && // password can be void + sscanf (param, "'%[^']' %[^\r\n]", name, password) < 1 && // password can be void + sscanf (param, "%s %[^\r\n]", name, password) < 1) + { // password can be void + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte svp.\n"); + printf ("<exemple> check testname motdepasse\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour tester le mot d'un passe d'un compte (commande 'check')." + RETCODE); + } + else + { + printf ("Please input an account name.\n"); + printf ("<example> check testname password\n"); + ladmin_log + ("Incomplete parameters to check the password of an account ('check' command)." + RETCODE); + } + return 136; + } + + if (verify_accountname (name) == 0) + { + return 102; + } + + if (strlen (password) == 0) + { + if (typepasswd (password) == 0) + return 134; + } + if (verify_password (password) == 0) + return 131; + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour test un mot de passe." + RETCODE); + } + else + { + ladmin_log ("Request to login-server to check a password." RETCODE); + } + + WFIFOW (login_fd, 0) = 0x793a; + memcpy (WFIFOP (login_fd, 2), name, 24); + memcpy (WFIFOP (login_fd, 26), password, 24); + WFIFOSET (login_fd, 50); + bytes_to_read = 1; + + return 0; } //------------------------------------------------ // Sub-function: Asking for deletion of an account //------------------------------------------------ -int delaccount(char* param) { - char name[1023]; - char letter; - char confirm[1023]; - int i; - - memset(name, '\0', sizeof(name)); - - if (strlen(param) == 0 || - (sscanf(param, "\"%[^\"]\"", name) < 1 && - sscanf(param, "'%[^']'", name) < 1 && - sscanf(param, "%[^\r\n]", name) < 1) || - strlen(name) == 0) { - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte svp.\n"); - printf("<exemple> del nomtestasupprimer\n"); - ladmin_log("Aucun nom donn pour supprimer un compte (commande 'delete')." RETCODE); - } else { - printf("Please input an account name.\n"); - printf("<example> del testnametodelete\n"); - ladmin_log("No name given to delete an account ('delete' command)." RETCODE); - } - return 136; - } - - if (verify_accountname(name) == 0) { - return 102; - } - - memset(confirm, '\0', sizeof(confirm)); - while ((confirm[0] != 'o' || defaultlanguage != 'F') && confirm[0] != 'n' && (confirm[0] != 'y' || defaultlanguage == 'F')) { - if (defaultlanguage == 'F') - printf("\033[1;36m ** Etes-vous vraiment sr de vouloir SUPPRIMER le compte [$userid]? (o/n) > \033[0m"); - else - printf("\033[1;36m ** Are you really sure to DELETE account [$userid]? (y/n) > \033[0m"); - fflush(stdout); - memset(confirm, '\0', sizeof(confirm)); - i = 0; - while ((letter = getchar()) != '\n') - confirm[i++] = letter; - } - - if (confirm[0] == 'n') { - if (defaultlanguage == 'F') { - printf("Suppression annul馥.\n"); - ladmin_log("Suppression annul馥 par l'utilisateur (commande 'delete')." RETCODE); - } else { - printf("Deletion canceled.\n"); - ladmin_log("Deletion canceled by user ('delete' command)." RETCODE); - } - return 121; - } - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour d騁ruire un compte." RETCODE); - } else { - ladmin_log("Request to login-server to delete an acount." RETCODE); - } - - WFIFOW(login_fd,0) = 0x7932; - memcpy(WFIFOP(login_fd,2), name, 24); - WFIFOSET(login_fd,26); - bytes_to_read = 1; - - return 0; +int delaccount (char *param) +{ + char name[1023]; + char letter; + char confirm[1023]; + int i; + + memset (name, '\0', sizeof (name)); + + if (strlen (param) == 0 || + (sscanf (param, "\"%[^\"]\"", name) < 1 && + sscanf (param, "'%[^']'", name) < 1 && + sscanf (param, "%[^\r\n]", name) < 1) || strlen (name) == 0) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte svp.\n"); + printf ("<exemple> del nomtestasupprimer\n"); + ladmin_log + ("Aucun nom donn pour supprimer un compte (commande 'delete')." + RETCODE); + } + else + { + printf ("Please input an account name.\n"); + printf ("<example> del testnametodelete\n"); + ladmin_log + ("No name given to delete an account ('delete' command)." + RETCODE); + } + return 136; + } + + if (verify_accountname (name) == 0) + { + return 102; + } + + memset (confirm, '\0', sizeof (confirm)); + while ((confirm[0] != 'o' || defaultlanguage != 'F') && confirm[0] != 'n' + && (confirm[0] != 'y' || defaultlanguage == 'F')) + { + if (defaultlanguage == 'F') + printf + ("\033[1;36m ** Etes-vous vraiment sr de vouloir SUPPRIMER le compte [$userid]? (o/n) > \033[0m"); + else + printf + ("\033[1;36m ** Are you really sure to DELETE account [$userid]? (y/n) > \033[0m"); + fflush (stdout); + memset (confirm, '\0', sizeof (confirm)); + i = 0; + while ((letter = getchar ()) != '\n') + confirm[i++] = letter; + } + + if (confirm[0] == 'n') + { + if (defaultlanguage == 'F') + { + printf ("Suppression annul馥.\n"); + ladmin_log + ("Suppression annul馥 par l'utilisateur (commande 'delete')." + RETCODE); + } + else + { + printf ("Deletion canceled.\n"); + ladmin_log ("Deletion canceled by user ('delete' command)." + RETCODE); + } + return 121; + } + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour d騁ruire un compte." + RETCODE); + } + else + { + ladmin_log ("Request to login-server to delete an acount." RETCODE); + } + + WFIFOW (login_fd, 0) = 0x7932; + memcpy (WFIFOP (login_fd, 2), name, 24); + WFIFOSET (login_fd, 26); + bytes_to_read = 1; + + return 0; } //---------------------------------------------------------- // Sub-function: Asking to modification of an account e-mail //---------------------------------------------------------- -int changeemail(char* param) { - char name[1023], email[1023]; - - memset(name, '\0', sizeof(name)); - memset(email, '\0', sizeof(email)); - - if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, email) < 2 && - sscanf(param, "'%[^']' %[^\r\n]", name, email) < 2 && - sscanf(param, "%s %[^\r\n]", name, email) < 2) { - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte et une email svp.\n"); - printf("<exemple> email testname nouveauemail\n"); - ladmin_log("Nombre incorrect de param鑼res pour changer l'email d'un compte (commande 'email')." RETCODE); - } else { - printf("Please input an account name and an email.\n"); - printf("<example> email testname newemail\n"); - ladmin_log("Incomplete parameters to change the email of an account ('email' command)." RETCODE); - } - return 136; - } - - if (verify_accountname(name) == 0) { - return 102; - } - - if (strlen(email) < 3) { - if (defaultlanguage == 'F') { - printf("Email trop courte [%s]. Entrez une e-mail valide svp.\n", email); - ladmin_log("Email trop courte [%s]. Entrez une e-mail valide svp." RETCODE, email); - } else { - printf("Email is too short [%s]. Please input a valid e-mail.\n", email); - ladmin_log("Email is too short [%s]. Please input a valid e-mail." RETCODE, email); - } - return 109; - } - if (strlen(email) > 39) { - if (defaultlanguage == 'F') { - printf("Email trop longue [%s]. Entrez une e-mail de 39 caract鑽es maximum svp.\n", email); - ladmin_log("Email trop longue [%s]. Entrez une e-mail de 39 caract鑽es maximum svp." RETCODE, email); - } else { - printf("Email is too long [%s]. Please input an e-mail with 39 bytes at the most.\n", email); - ladmin_log("Email is too long [%s]. Please input an e-mail with 39 bytes at the most." RETCODE, email); - } - return 109; - } - if (e_mail_check(email) == 0) { - if (defaultlanguage == 'F') { - printf("Email incorrecte [%s]. Entrez une e-mail valide svp.\n", email); - ladmin_log("Email incorrecte [%s]. Entrez une e-mail valide svp." RETCODE, email); - } else { - printf("Invalid email [%s]. Please input a valid e-mail.\n", email); - ladmin_log("Invalid email [%s]. Please input a valid e-mail." RETCODE, email); - } - return 109; - } - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour changer une email." RETCODE); - } else { - ladmin_log("Request to login-server to change an email." RETCODE); - } - - WFIFOW(login_fd,0) = 0x7940; - memcpy(WFIFOP(login_fd,2), name, 24); - memcpy(WFIFOP(login_fd,26), email, 40); - WFIFOSET(login_fd,66); - bytes_to_read = 1; - - return 0; +int changeemail (char *param) +{ + char name[1023], email[1023]; + + memset (name, '\0', sizeof (name)); + memset (email, '\0', sizeof (email)); + + if (sscanf (param, "\"%[^\"]\" %[^\r\n]", name, email) < 2 && + sscanf (param, "'%[^']' %[^\r\n]", name, email) < 2 && + sscanf (param, "%s %[^\r\n]", name, email) < 2) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte et une email svp.\n"); + printf ("<exemple> email testname nouveauemail\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour changer l'email d'un compte (commande 'email')." + RETCODE); + } + else + { + printf ("Please input an account name and an email.\n"); + printf ("<example> email testname newemail\n"); + ladmin_log + ("Incomplete parameters to change the email of an account ('email' command)." + RETCODE); + } + return 136; + } + + if (verify_accountname (name) == 0) + { + return 102; + } + + if (strlen (email) < 3) + { + if (defaultlanguage == 'F') + { + printf ("Email trop courte [%s]. Entrez une e-mail valide svp.\n", + email); + ladmin_log + ("Email trop courte [%s]. Entrez une e-mail valide svp." + RETCODE, email); + } + else + { + printf ("Email is too short [%s]. Please input a valid e-mail.\n", + email); + ladmin_log + ("Email is too short [%s]. Please input a valid e-mail." + RETCODE, email); + } + return 109; + } + if (strlen (email) > 39) + { + if (defaultlanguage == 'F') + { + printf + ("Email trop longue [%s]. Entrez une e-mail de 39 caract鑽es maximum svp.\n", + email); + ladmin_log + ("Email trop longue [%s]. Entrez une e-mail de 39 caract鑽es maximum svp." + RETCODE, email); + } + else + { + printf + ("Email is too long [%s]. Please input an e-mail with 39 bytes at the most.\n", + email); + ladmin_log + ("Email is too long [%s]. Please input an e-mail with 39 bytes at the most." + RETCODE, email); + } + return 109; + } + if (e_mail_check (email) == 0) + { + if (defaultlanguage == 'F') + { + printf ("Email incorrecte [%s]. Entrez une e-mail valide svp.\n", + email); + ladmin_log ("Email incorrecte [%s]. Entrez une e-mail valide svp." + RETCODE, email); + } + else + { + printf ("Invalid email [%s]. Please input a valid e-mail.\n", + email); + ladmin_log ("Invalid email [%s]. Please input a valid e-mail." + RETCODE, email); + } + return 109; + } + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour changer une email." + RETCODE); + } + else + { + ladmin_log ("Request to login-server to change an email." RETCODE); + } + + WFIFOW (login_fd, 0) = 0x7940; + memcpy (WFIFOP (login_fd, 2), name, 24); + memcpy (WFIFOP (login_fd, 26), email, 40); + WFIFOSET (login_fd, 66); + bytes_to_read = 1; + + return 0; } //----------------------------------------------------- // Sub-function: Asking of the number of online players //----------------------------------------------------- -int getlogincount() { - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour obtenir le nombre de joueurs en jeu." RETCODE); - } else { - ladmin_log("Request to login-server to obtain the # of online players." RETCODE); - } - - WFIFOW(login_fd,0) = 0x7938; - WFIFOSET(login_fd,2); - bytes_to_read = 1; - - return 0; +int getlogincount () +{ + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour obtenir le nombre de joueurs en jeu." + RETCODE); + } + else + { + ladmin_log + ("Request to login-server to obtain the # of online players." + RETCODE); + } + + WFIFOW (login_fd, 0) = 0x7938; + WFIFOSET (login_fd, 2); + bytes_to_read = 1; + + return 0; } //---------------------------------------------------------- // Sub-function: Asking to modify the GM level of an account //---------------------------------------------------------- -int changegmlevel(char* param) { - char name[1023]; - int GM_level; - - memset(name, '\0', sizeof(name)); - GM_level = 0; - - if (sscanf(param, "\"%[^\"]\" %d", name, &GM_level) < 1 && - sscanf(param, "'%[^']' %d", name, &GM_level) < 1 && - sscanf(param, "%s %d", name, &GM_level) < 1) { - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte et un niveau de GM svp.\n"); - printf("<exemple> gm nomtest 80\n"); - ladmin_log("Nombre incorrect de param鑼res pour changer le Niveau de GM d'un compte (commande 'gm')." RETCODE); - } else { - printf("Please input an account name and a GM level.\n"); - printf("<example> gm testname 80\n"); - ladmin_log("Incomplete parameters to change the GM level of an account ('gm' command)." RETCODE); - } - return 136; - } - - if (verify_accountname(name) == 0) { - return 102; - } - - if (GM_level < 0 || GM_level > 99) { - if (defaultlanguage == 'F') { - printf("Niveau de GM incorrect [%d]. Entrez une valeur de 0 99 svp.\n", GM_level); - ladmin_log("Niveau de GM incorrect [%d]. La valeur peut 黎re de 0 99." RETCODE, GM_level); - } else { - printf("Illegal GM level [%d]. Please input a value from 0 to 99.\n", GM_level); - ladmin_log("Illegal GM level [%d]. The value can be from 0 to 99." RETCODE, GM_level); - } - return 103; - } - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour changer un niveau de GM." RETCODE); - } else { - ladmin_log("Request to login-server to change a GM level." RETCODE); - } - - WFIFOW(login_fd,0) = 0x793e; - memcpy(WFIFOP(login_fd,2), name, 24); - WFIFOB(login_fd,26) = GM_level; - WFIFOSET(login_fd,27); - bytes_to_read = 1; - - return 0; +int changegmlevel (char *param) +{ + char name[1023]; + int GM_level; + + memset (name, '\0', sizeof (name)); + GM_level = 0; + + if (sscanf (param, "\"%[^\"]\" %d", name, &GM_level) < 1 && + sscanf (param, "'%[^']' %d", name, &GM_level) < 1 && + sscanf (param, "%s %d", name, &GM_level) < 1) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte et un niveau de GM svp.\n"); + printf ("<exemple> gm nomtest 80\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour changer le Niveau de GM d'un compte (commande 'gm')." + RETCODE); + } + else + { + printf ("Please input an account name and a GM level.\n"); + printf ("<example> gm testname 80\n"); + ladmin_log + ("Incomplete parameters to change the GM level of an account ('gm' command)." + RETCODE); + } + return 136; + } + + if (verify_accountname (name) == 0) + { + return 102; + } + + if (GM_level < 0 || GM_level > 99) + { + if (defaultlanguage == 'F') + { + printf + ("Niveau de GM incorrect [%d]. Entrez une valeur de 0 99 svp.\n", + GM_level); + ladmin_log + ("Niveau de GM incorrect [%d]. La valeur peut 黎re de 0 99." + RETCODE, GM_level); + } + else + { + printf + ("Illegal GM level [%d]. Please input a value from 0 to 99.\n", + GM_level); + ladmin_log + ("Illegal GM level [%d]. The value can be from 0 to 99." + RETCODE, GM_level); + } + return 103; + } + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour changer un niveau de GM." + RETCODE); + } + else + { + ladmin_log ("Request to login-server to change a GM level." RETCODE); + } + + WFIFOW (login_fd, 0) = 0x793e; + memcpy (WFIFOP (login_fd, 2), name, 24); + WFIFOB (login_fd, 26) = GM_level; + WFIFOSET (login_fd, 27); + bytes_to_read = 1; + + return 0; } //--------------------------------------------- // Sub-function: Asking to obtain an account id //--------------------------------------------- -int idaccount(char* param) { - char name[1023]; - - memset(name, '\0', sizeof(name)); - - if (strlen(param) == 0 || - (sscanf(param, "\"%[^\"]\"", name) < 1 && - sscanf(param, "'%[^']'", name) < 1 && - sscanf(param, "%[^\r\n]", name) < 1) || - strlen(name) == 0) { - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte svp.\n"); - printf("<exemple> id nomtest\n"); - ladmin_log("Aucun nom donn pour rechecher l'id d'un compte (commande 'id')." RETCODE); - } else { - printf("Please input an account name.\n"); - printf("<example> id testname\n"); - ladmin_log("No name given to search an account id ('id' command)." RETCODE); - } - return 136; - } - - if (verify_accountname(name) == 0) { - return 102; - } - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour connatre l'id d'un compte." RETCODE); - } else { - ladmin_log("Request to login-server to know an account id." RETCODE); - } - - WFIFOW(login_fd,0) = 0x7944; - memcpy(WFIFOP(login_fd,2), name, 24); - WFIFOSET(login_fd,26); - bytes_to_read = 1; - - return 0; +int idaccount (char *param) +{ + char name[1023]; + + memset (name, '\0', sizeof (name)); + + if (strlen (param) == 0 || + (sscanf (param, "\"%[^\"]\"", name) < 1 && + sscanf (param, "'%[^']'", name) < 1 && + sscanf (param, "%[^\r\n]", name) < 1) || strlen (name) == 0) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte svp.\n"); + printf ("<exemple> id nomtest\n"); + ladmin_log + ("Aucun nom donn pour rechecher l'id d'un compte (commande 'id')." + RETCODE); + } + else + { + printf ("Please input an account name.\n"); + printf ("<example> id testname\n"); + ladmin_log + ("No name given to search an account id ('id' command)." + RETCODE); + } + return 136; + } + + if (verify_accountname (name) == 0) + { + return 102; + } + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour connatre l'id d'un compte." + RETCODE); + } + else + { + ladmin_log ("Request to login-server to know an account id." RETCODE); + } + + WFIFOW (login_fd, 0) = 0x7944; + memcpy (WFIFOP (login_fd, 2), name, 24); + WFIFOSET (login_fd, 26); + bytes_to_read = 1; + + return 0; } //---------------------------------------------------------------------------- // Sub-function: Asking to displaying information about an account (by its id) //---------------------------------------------------------------------------- -int infoaccount(int account_id) { - if (account_id < 0) { - if (defaultlanguage == 'F') { - printf("Entrez un id ayant une valeur positive svp.\n"); - ladmin_log("Une valeur n馮ative a 騁 donn pour trouver le compte." RETCODE); - } else { - printf("Please input a positive value for the id.\n"); - ladmin_log("Negative value was given to found the account." RETCODE); - } - return 136; - } - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour obtenir le information d'un compte (par l'id)." RETCODE); - } else { - ladmin_log("Request to login-server to obtain information about an account (by its id)." RETCODE); - } - - WFIFOW(login_fd,0) = 0x7954; - WFIFOL(login_fd,2) = account_id; - WFIFOSET(login_fd,6); - bytes_to_read = 1; - - return 0; +int infoaccount (int account_id) +{ + if (account_id < 0) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un id ayant une valeur positive svp.\n"); + ladmin_log + ("Une valeur n馮ative a 騁 donn pour trouver le compte." + RETCODE); + } + else + { + printf ("Please input a positive value for the id.\n"); + ladmin_log ("Negative value was given to found the account." + RETCODE); + } + return 136; + } + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour obtenir le information d'un compte (par l'id)." + RETCODE); + } + else + { + ladmin_log + ("Request to login-server to obtain information about an account (by its id)." + RETCODE); + } + + WFIFOW (login_fd, 0) = 0x7954; + WFIFOL (login_fd, 2) = account_id; + WFIFOSET (login_fd, 6); + bytes_to_read = 1; + + return 0; } //--------------------------------------- // Sub-function: Send a broadcast message //--------------------------------------- -int sendbroadcast(short type, char* message) { - if (strlen(message) == 0) { - if (defaultlanguage == 'F') { - printf("Entrez un message svp.\n"); - if (type == 0) { - printf("<exemple> kami un message\n"); - } else { - printf("<exemple> kamib un message\n"); - } - ladmin_log("Le message est vide (commande 'kami(b)')." RETCODE); - } else { - printf("Please input a message.\n"); - if (type == 0) { - printf("<example> kami a message\n"); - } else { - printf("<example> kamib a message\n"); - } - ladmin_log("The message is void ('kami(b)' command)." RETCODE); - } - return 136; - } +int sendbroadcast (short type, char *message) +{ + if (strlen (message) == 0) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un message svp.\n"); + if (type == 0) + { + printf ("<exemple> kami un message\n"); + } + else + { + printf ("<exemple> kamib un message\n"); + } + ladmin_log ("Le message est vide (commande 'kami(b)')." RETCODE); + } + else + { + printf ("Please input a message.\n"); + if (type == 0) + { + printf ("<example> kami a message\n"); + } + else + { + printf ("<example> kamib a message\n"); + } + ladmin_log ("The message is void ('kami(b)' command)." RETCODE); + } + return 136; + } - WFIFOW(login_fd,0) = 0x794e; - WFIFOW(login_fd,2) = type; - WFIFOL(login_fd,4) = strlen(message)+1; - memcpy(WFIFOP(login_fd,8), message, strlen(message)+1); - WFIFOSET(login_fd,8+strlen(message)+1); - bytes_to_read = 1; + WFIFOW (login_fd, 0) = 0x794e; + WFIFOW (login_fd, 2) = type; + WFIFOL (login_fd, 4) = strlen (message) + 1; + memcpy (WFIFOP (login_fd, 8), message, strlen (message) + 1); + WFIFOSET (login_fd, 8 + strlen (message) + 1); + bytes_to_read = 1; - return 0; + return 0; } //-------------------------------------------- // Sub-function: Change language of displaying //-------------------------------------------- -int changelanguage(char* language) { - if (strlen(language) == 0) { - if (defaultlanguage == 'F') { - printf("Entrez une langue svp.\n"); - printf("<exemple> language english\n"); - printf(" language fran軋is\n"); - ladmin_log("La langue est vide (commande 'language')." RETCODE); - } else { - printf("Please input a language.\n"); - printf("<example> language english\n"); - printf(" language fran軋is\n"); - ladmin_log("The language is void ('language' command)." RETCODE); - } - return 136; - } - - language[0] = toupper(language[0]); - if (language[0] == 'F' || language[0] == 'E') { - defaultlanguage = language[0]; - if (defaultlanguage == 'F') { - printf("Changement de la langue d'affichage en Fran軋is.\n"); - ladmin_log("Changement de la langue d'affichage en Fran軋is." RETCODE); - } else { - printf("Displaying language changed to English.\n"); - ladmin_log("Displaying language changed to English." RETCODE); - } - } else { - if (defaultlanguage == 'F') { - printf("Langue non param騁r馥 (langues possibles: 'Fran軋is' ou 'English').\n"); - ladmin_log("Langue non param騁r馥 (Fran軋is ou English n馗essaire)." RETCODE); - } else { - printf("Undefined language (possible languages: Fran軋is or English).\n"); - ladmin_log("Undefined language (must be Fran軋is or English)." RETCODE); - } - } +int changelanguage (char *language) +{ + if (strlen (language) == 0) + { + if (defaultlanguage == 'F') + { + printf ("Entrez une langue svp.\n"); + printf ("<exemple> language english\n"); + printf (" language fran軋is\n"); + ladmin_log ("La langue est vide (commande 'language')." RETCODE); + } + else + { + printf ("Please input a language.\n"); + printf ("<example> language english\n"); + printf (" language fran軋is\n"); + ladmin_log ("The language is void ('language' command)." RETCODE); + } + return 136; + } + + language[0] = toupper (language[0]); + if (language[0] == 'F' || language[0] == 'E') + { + defaultlanguage = language[0]; + if (defaultlanguage == 'F') + { + printf ("Changement de la langue d'affichage en Fran軋is.\n"); + ladmin_log ("Changement de la langue d'affichage en Fran軋is." + RETCODE); + } + else + { + printf ("Displaying language changed to English.\n"); + ladmin_log ("Displaying language changed to English." RETCODE); + } + } + else + { + if (defaultlanguage == 'F') + { + printf + ("Langue non param騁r馥 (langues possibles: 'Fran軋is' ou 'English').\n"); + ladmin_log + ("Langue non param騁r馥 (Fran軋is ou English n馗essaire)." + RETCODE); + } + else + { + printf + ("Undefined language (possible languages: Fran軋is or English).\n"); + ladmin_log ("Undefined language (must be Fran軋is or English)." + RETCODE); + } + } - return 0; + return 0; } //-------------------------------------------------------- // Sub-function: Asking to Displaying of the accounts list //-------------------------------------------------------- -int listaccount(char* param, int type) { +int listaccount (char *param, int type) +{ //int list_first, list_last, list_type; // parameter to display a list of accounts - int i; - - list_type = type; - - // set default values - list_first = 0; - list_last = 0; - - if (list_type == 1) { // if listgm - // get all accounts = use default - } else if (list_type == 2) { // if search - for (i = 0; param[i]; i++) - param[i] = tolower(param[i]); - // get all accounts = use default - } else if (list_type == 3) { // if listban - // get all accounts = use default - } else if (list_type == 4) { // if listok - // get all accounts = use default - } else { // if list (list_type == 0) - switch(sscanf(param, "%d %d", &list_first, &list_last)) { - case 0: - // get all accounts = use default - break; - case 1: - list_last = 0; - // use tests of the following value - default: - if (list_first < 0) - list_first = 0; - if (list_last < list_first || list_last < 0) - list_last = 0; - break; - } - } - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour obtenir la liste des comptes de %d %d." RETCODE, list_first, list_last); - } else { - ladmin_log("Request to login-server to obtain the list of accounts from %d to %d." RETCODE, list_first, list_last); - } - - WFIFOW(login_fd,0) = 0x7920; - WFIFOL(login_fd,2) = list_first; - WFIFOL(login_fd,6) = list_last; - WFIFOSET(login_fd,10); - bytes_to_read = 1; - - // 0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567 - if (defaultlanguage == 'F') { - Iprintf(" id_compte GM nom_utilisateur sexe count statut\n"); - } else { - Iprintf("account_id GM user_name sex count state\n"); - } - Iprintf("-------------------------------------------------------------------------------\n"); - list_count = 0; - - return 0; + int i; + + list_type = type; + + // set default values + list_first = 0; + list_last = 0; + + if (list_type == 1) + { // if listgm + // get all accounts = use default + } + else if (list_type == 2) + { // if search + for (i = 0; param[i]; i++) + param[i] = tolower (param[i]); + // get all accounts = use default + } + else if (list_type == 3) + { // if listban + // get all accounts = use default + } + else if (list_type == 4) + { // if listok + // get all accounts = use default + } + else + { // if list (list_type == 0) + switch (sscanf (param, "%d %d", &list_first, &list_last)) + { + case 0: + // get all accounts = use default + break; + case 1: + list_last = 0; + // use tests of the following value + default: + if (list_first < 0) + list_first = 0; + if (list_last < list_first || list_last < 0) + list_last = 0; + break; + } + } + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour obtenir la liste des comptes de %d %d." + RETCODE, list_first, list_last); + } + else + { + ladmin_log + ("Request to login-server to obtain the list of accounts from %d to %d." + RETCODE, list_first, list_last); + } + + WFIFOW (login_fd, 0) = 0x7920; + WFIFOL (login_fd, 2) = list_first; + WFIFOL (login_fd, 6) = list_last; + WFIFOSET (login_fd, 10); + bytes_to_read = 1; + + // 0123456789 01 01234567890123456789012301234 012345 0123456789012345678901234567 + if (defaultlanguage == 'F') + { + Iprintf + (" id_compte GM nom_utilisateur sexe count statut\n"); + } + else + { + Iprintf + ("account_id GM user_name sex count state\n"); + } + Iprintf + ("-------------------------------------------------------------------------------\n"); + list_count = 0; + + return 0; } //-------------------------------------------------------- // Sub-function: Frobnicate items //-------------------------------------------------------- -int itemfrob(char* param) +int itemfrob (char *param) { - int source_id, dest_id; + int source_id, dest_id; - if (sscanf(param, "%d %d", &source_id, &dest_id) < 2) { - printf("You must provide the source and destination item IDs.\n"); - return 1; - } + if (sscanf (param, "%d %d", &source_id, &dest_id) < 2) + { + printf ("You must provide the source and destination item IDs.\n"); + return 1; + } - WFIFOW(login_fd,0) = 0x7924; - WFIFOL(login_fd,2) = source_id; - WFIFOL(login_fd,6) = dest_id; - WFIFOSET(login_fd,10); - bytes_to_read = 1; // all logging is done to the three main servers + WFIFOW (login_fd, 0) = 0x7924; + WFIFOL (login_fd, 2) = source_id; + WFIFOL (login_fd, 6) = dest_id; + WFIFOSET (login_fd, 10); + bytes_to_read = 1; // all logging is done to the three main servers - - return 0; + return 0; } - //-------------------------------------------- // Sub-function: Asking to modify a memo field //-------------------------------------------- -int changememo(char* param) { - char name[1023], memo[1023]; - - memset(name, '\0', sizeof(name)); - memset(memo, '\0', sizeof(memo)); - - if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, memo) < 1 && // memo can be void - sscanf(param, "'%[^']' %[^\r\n]", name, memo) < 1 && // memo can be void - sscanf(param, "%s %[^\r\n]", name, memo) < 1) { // memo can be void - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte et un m駑o svp.\n"); - printf("<exemple> memo nomtest nouveau memo\n"); - ladmin_log("Nombre incorrect de param鑼res pour changer le m駑o d'un compte (commande 'email')." RETCODE); - } else { - printf("Please input an account name and a memo.\n"); - printf("<example> memo testname new memo\n"); - ladmin_log("Incomplete parameters to change the memo of an account ('email' command)." RETCODE); - } - return 136; - } - - if (verify_accountname(name) == 0) { - return 102; - } - - if (strlen(memo) > 254) { - if (defaultlanguage == 'F') { - printf("M駑o trop long (%d caract鑽es).\n", strlen(memo)); - printf("Entrez un m駑o de 254 caract鑽es maximum svp.\n"); - ladmin_log("M駑o trop long (%d caract鑽es). Entrez un m駑o de 254 caract鑽es maximum svp." RETCODE, strlen(memo)); - } else { - printf("Memo is too long (%d characters).\n", strlen(memo)); - printf("Please input a memo of 254 bytes at the maximum.\n"); - ladmin_log("Email is too long (%d characters). Please input a memo of 254 bytes at the maximum." RETCODE, strlen(memo)); - } - return 102; - } - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour changer un m駑o." RETCODE); - } else { - ladmin_log("Request to login-server to change a memo." RETCODE); - } - - WFIFOW(login_fd,0) = 0x7942; - memcpy(WFIFOP(login_fd,2), name, 24); - WFIFOW(login_fd,26) = strlen(memo); - if (strlen(memo) > 0) - memcpy(WFIFOP(login_fd,28), memo, strlen(memo)); - WFIFOSET(login_fd,28+strlen(memo)); - bytes_to_read = 1; - - return 0; +int changememo (char *param) +{ + char name[1023], memo[1023]; + + memset (name, '\0', sizeof (name)); + memset (memo, '\0', sizeof (memo)); + + if (sscanf (param, "\"%[^\"]\" %[^\r\n]", name, memo) < 1 && // memo can be void + sscanf (param, "'%[^']' %[^\r\n]", name, memo) < 1 && // memo can be void + sscanf (param, "%s %[^\r\n]", name, memo) < 1) + { // memo can be void + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte et un m駑o svp.\n"); + printf ("<exemple> memo nomtest nouveau memo\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour changer le m駑o d'un compte (commande 'email')." + RETCODE); + } + else + { + printf ("Please input an account name and a memo.\n"); + printf ("<example> memo testname new memo\n"); + ladmin_log + ("Incomplete parameters to change the memo of an account ('email' command)." + RETCODE); + } + return 136; + } + + if (verify_accountname (name) == 0) + { + return 102; + } + + if (strlen (memo) > 254) + { + if (defaultlanguage == 'F') + { + printf ("M駑o trop long (%d caract鑽es).\n", strlen (memo)); + printf ("Entrez un m駑o de 254 caract鑽es maximum svp.\n"); + ladmin_log + ("M駑o trop long (%d caract鑽es). Entrez un m駑o de 254 caract鑽es maximum svp." + RETCODE, strlen (memo)); + } + else + { + printf ("Memo is too long (%d characters).\n", strlen (memo)); + printf ("Please input a memo of 254 bytes at the maximum.\n"); + ladmin_log + ("Email is too long (%d characters). Please input a memo of 254 bytes at the maximum." + RETCODE, strlen (memo)); + } + return 102; + } + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour changer un m駑o." + RETCODE); + } + else + { + ladmin_log ("Request to login-server to change a memo." RETCODE); + } + + WFIFOW (login_fd, 0) = 0x7942; + memcpy (WFIFOP (login_fd, 2), name, 24); + WFIFOW (login_fd, 26) = strlen (memo); + if (strlen (memo) > 0) + memcpy (WFIFOP (login_fd, 28), memo, strlen (memo)); + WFIFOSET (login_fd, 28 + strlen (memo)); + bytes_to_read = 1; + + return 0; } //----------------------------------------------- // Sub-function: Asking to obtain an account name //----------------------------------------------- -int nameaccount(int id) { - if (id < 0) { - if (defaultlanguage == 'F') { - printf("Entrez un id ayant une valeur positive svp.\n"); - ladmin_log("Id n馮atif donn pour rechecher le nom d'un compte (commande 'name')." RETCODE); - } else { - printf("Please input a positive value for the id.\n"); - ladmin_log("Negativ id given to search an account name ('name' command)." RETCODE); - } - return 136; - } - - if (defaultlanguage == 'F') - ladmin_log("Envoi d'un requ黎e au serveur de logins pour connatre le nom d'un compte." RETCODE); - else - ladmin_log("Request to login-server to know an account name." RETCODE); - - WFIFOW(login_fd,0) = 0x7946; - WFIFOL(login_fd,2) = id; - WFIFOSET(login_fd,6); - bytes_to_read = 1; - - return 0; +int nameaccount (int id) +{ + if (id < 0) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un id ayant une valeur positive svp.\n"); + ladmin_log + ("Id n馮atif donn pour rechecher le nom d'un compte (commande 'name')." + RETCODE); + } + else + { + printf ("Please input a positive value for the id.\n"); + ladmin_log + ("Negativ id given to search an account name ('name' command)." + RETCODE); + } + return 136; + } + + if (defaultlanguage == 'F') + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour connatre le nom d'un compte." + RETCODE); + else + ladmin_log ("Request to login-server to know an account name." + RETCODE); + + WFIFOW (login_fd, 0) = 0x7946; + WFIFOL (login_fd, 2) = id; + WFIFOSET (login_fd, 6); + bytes_to_read = 1; + + return 0; } //------------------------------------------ // Sub-function: Asking to modify a password // (Note: never send back a password with login-server!! security of passwords) //------------------------------------------ -int changepasswd(char* param) { - char name[1023], password[1023]; - - memset(name, '\0', sizeof(name)); - memset(password, '\0', sizeof(password)); - - if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, password) < 1 && - sscanf(param, "'%[^']' %[^\r\n]", name, password) < 1 && - sscanf(param, "%s %[^\r\n]", name, password) < 1) { - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte svp.\n"); - printf("<exemple> passwd nomtest nouveaumotdepasse\n"); - ladmin_log("Nombre incorrect de param鑼res pour changer le mot d'un passe d'un compte (commande 'password')." RETCODE); - } else { - printf("Please input an account name.\n"); - printf("<example> passwd testname newpassword\n"); - ladmin_log("Incomplete parameters to change the password of an account ('password' command)." RETCODE); - } - return 136; - } - - if (verify_accountname(name) == 0) { - return 102; - } - - if (strlen(password) == 0) { - if (typepasswd(password) == 0) - return 134; - } - if (verify_password(password) == 0) - return 131; - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour changer un mot de passe." RETCODE); - } else { - ladmin_log("Request to login-server to change a password." RETCODE); - } - - WFIFOW(login_fd,0) = 0x7934; - memcpy(WFIFOP(login_fd,2), name, 24); - memcpy(WFIFOP(login_fd,26), password, 24); - WFIFOSET(login_fd,50); - bytes_to_read = 1; - - return 0; +int changepasswd (char *param) +{ + char name[1023], password[1023]; + + memset (name, '\0', sizeof (name)); + memset (password, '\0', sizeof (password)); + + if (sscanf (param, "\"%[^\"]\" %[^\r\n]", name, password) < 1 && + sscanf (param, "'%[^']' %[^\r\n]", name, password) < 1 && + sscanf (param, "%s %[^\r\n]", name, password) < 1) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte svp.\n"); + printf ("<exemple> passwd nomtest nouveaumotdepasse\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour changer le mot d'un passe d'un compte (commande 'password')." + RETCODE); + } + else + { + printf ("Please input an account name.\n"); + printf ("<example> passwd testname newpassword\n"); + ladmin_log + ("Incomplete parameters to change the password of an account ('password' command)." + RETCODE); + } + return 136; + } + + if (verify_accountname (name) == 0) + { + return 102; + } + + if (strlen (password) == 0) + { + if (typepasswd (password) == 0) + return 134; + } + if (verify_password (password) == 0) + return 131; + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour changer un mot de passe." + RETCODE); + } + else + { + ladmin_log ("Request to login-server to change a password." RETCODE); + } + + WFIFOW (login_fd, 0) = 0x7934; + memcpy (WFIFOP (login_fd, 2), name, 24); + memcpy (WFIFOP (login_fd, 26), password, 24); + WFIFOSET (login_fd, 50); + bytes_to_read = 1; + + return 0; } //---------------------------------------------------------------------- // Sub-function: Request to login-server to reload GM configuration file // this function have no answer //---------------------------------------------------------------------- -int reloadGM() { - WFIFOW(login_fd,0) = 0x7955; - WFIFOSET(login_fd,2); - bytes_to_read = 0; - - if (defaultlanguage == 'F') { - ladmin_log("Demande de recharger le fichier de configuration des GM envoy馥." RETCODE); - printf("Demande de recharger le fichier de configuration des GM envoy馥.\n"); - printf("V駻ifiez les comptes GM actuels (apr鑚 rechargement):\n"); - } else { - ladmin_log("Request to reload the GM configuration file sended." RETCODE); - printf("Request to reload the GM configuration file sended.\n"); - printf("Check the actual GM accounts (after reloading):\n"); - } - listaccount(parameters, 1); // 1: to list only GM - - return 180; +int reloadGM () +{ + WFIFOW (login_fd, 0) = 0x7955; + WFIFOSET (login_fd, 2); + bytes_to_read = 0; + + if (defaultlanguage == 'F') + { + ladmin_log + ("Demande de recharger le fichier de configuration des GM envoy馥." + RETCODE); + printf + ("Demande de recharger le fichier de configuration des GM envoy馥.\n"); + printf ("V駻ifiez les comptes GM actuels (apr鑚 rechargement):\n"); + } + else + { + ladmin_log ("Request to reload the GM configuration file sended." + RETCODE); + printf ("Request to reload the GM configuration file sended.\n"); + printf ("Check the actual GM accounts (after reloading):\n"); + } + listaccount (parameters, 1); // 1: to list only GM + + return 180; } //----------------------------------------------------- // Sub-function: Asking to modify the sex of an account //----------------------------------------------------- -int changesex(char* param) { - char name[1023], sex[1023]; - - memset(name, '\0', sizeof(name)); - memset(sex, '\0', sizeof(sex)); - - if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, sex) < 2 && - sscanf(param, "'%[^']' %[^\r\n]", name, sex) < 2 && - sscanf(param, "%s %[^\r\n]", name, sex) < 2) { - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte et un sexe svp.\n"); - printf("<exemple> sex nomtest Male\n"); - ladmin_log("Nombre incorrect de param鑼res pour changer le sexe d'un compte (commande 'sex')." RETCODE); - } else { - printf("Please input an account name and a sex.\n"); - printf("<example> sex testname Male\n"); - ladmin_log("Incomplete parameters to change the sex of an account ('sex' command)." RETCODE); - } - return 136; - } - - if (verify_accountname(name) == 0) { - return 102; - } - - sex[0] = toupper(sex[0]); - if (strchr("MF", sex[0]) == NULL) { - if (defaultlanguage == 'F') { - printf("Sexe incorrect [%s]. Entrez M ou F svp.\n", sex); - ladmin_log("Sexe incorrect [%s]. Entrez M ou F svp." RETCODE, sex); - } else { - printf("Illegal gender [%s]. Please input M or F.\n", sex); - ladmin_log("Illegal gender [%s]. Please input M or F." RETCODE, sex); - } - return 103; - } - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour changer un sexe." RETCODE); - } else { - ladmin_log("Request to login-server to change a sex." RETCODE); - } - - WFIFOW(login_fd,0) = 0x793c; - memcpy(WFIFOP(login_fd,2), name, 24); - WFIFOB(login_fd,26) = sex[0]; - WFIFOSET(login_fd,27); - bytes_to_read = 1; - - return 0; +int changesex (char *param) +{ + char name[1023], sex[1023]; + + memset (name, '\0', sizeof (name)); + memset (sex, '\0', sizeof (sex)); + + if (sscanf (param, "\"%[^\"]\" %[^\r\n]", name, sex) < 2 && + sscanf (param, "'%[^']' %[^\r\n]", name, sex) < 2 && + sscanf (param, "%s %[^\r\n]", name, sex) < 2) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte et un sexe svp.\n"); + printf ("<exemple> sex nomtest Male\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour changer le sexe d'un compte (commande 'sex')." + RETCODE); + } + else + { + printf ("Please input an account name and a sex.\n"); + printf ("<example> sex testname Male\n"); + ladmin_log + ("Incomplete parameters to change the sex of an account ('sex' command)." + RETCODE); + } + return 136; + } + + if (verify_accountname (name) == 0) + { + return 102; + } + + sex[0] = toupper (sex[0]); + if (strchr ("MF", sex[0]) == NULL) + { + if (defaultlanguage == 'F') + { + printf ("Sexe incorrect [%s]. Entrez M ou F svp.\n", sex); + ladmin_log ("Sexe incorrect [%s]. Entrez M ou F svp." RETCODE, + sex); + } + else + { + printf ("Illegal gender [%s]. Please input M or F.\n", sex); + ladmin_log ("Illegal gender [%s]. Please input M or F." RETCODE, + sex); + } + return 103; + } + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour changer un sexe." + RETCODE); + } + else + { + ladmin_log ("Request to login-server to change a sex." RETCODE); + } + + WFIFOW (login_fd, 0) = 0x793c; + memcpy (WFIFOP (login_fd, 2), name, 24); + WFIFOB (login_fd, 26) = sex[0]; + WFIFOSET (login_fd, 27); + bytes_to_read = 1; + + return 0; } //------------------------------------------------------------------------- // Sub-function of sub-function changestate, blockaccount or unblockaccount // Asking to modify the state of an account //------------------------------------------------------------------------- -int changestatesub(char* name, int state, char* error_message7) { - char error_message[1023]; // need to use, because we can modify error_message7 - - memset(error_message, '\0', sizeof(error_message)); - strncpy(error_message, error_message7, sizeof(error_message)-1); - - if ((state < 0 || state > 9) && state != 100) { // Valid values: 0: ok, or value of the 0x006a packet + 1 - if (defaultlanguage == 'F') { - printf("Entrez une des statuts suivantes svp:\n"); - printf(" 0 = Compte ok 6 = Your Game's EXE file is not the latest version\n"); - } else { - printf("Please input one of these states:\n"); - printf(" 0 = Account ok 6 = Your Game's EXE file is not the latest version\n"); - } - printf(" 1 = Unregistered ID 7 = You are Prohibited to log in until + message\n"); - printf(" 2 = Incorrect Password 8 = Server is jammed due to over populated\n"); - printf(" 3 = This ID is expired 9 = No MSG\n"); - printf(" 4 = Rejected from Server 100 = This ID has been totally erased\n"); - printf(" 5 = You have been blocked by the GM Team\n"); - if (defaultlanguage == 'F') { - printf("<exemples> state nomtest 5\n"); - printf(" state nomtest 7 fin de votre ban\n"); - printf(" block <nom compte>\n"); - printf(" unblock <nom compte>\n"); - ladmin_log("Valeur incorrecte pour le statut d'un compte (commande 'state', 'block' ou 'unblock')." RETCODE); - } else { - printf("<examples> state testname 5\n"); - printf(" state testname 7 end of your ban\n"); - printf(" block <account name>\n"); - printf(" unblock <account name>\n"); - ladmin_log("Invalid value for the state of an account ('state', 'block' or 'unblock' command)." RETCODE); - } - return 151; - } - - if (verify_accountname(name) == 0) { - return 102; - } - - if (state != 7) { - strcpy(error_message, "-"); - } else { - if (strlen(error_message) < 1) { - if (defaultlanguage == 'F') { - printf("Message d'erreur trop court. Entrez un message de 1-19 caract鑽es.\n"); - ladmin_log("Message d'erreur trop court. Entrez un message de 1-19 caract鑽es." RETCODE); - } else { - printf("Error message is too short. Please input a message of 1-19 bytes.\n"); - ladmin_log("Error message is too short. Please input a message of 1-19 bytes." RETCODE); - } - return 102; - } - if (strlen(error_message) > 19) { - if (defaultlanguage == 'F') { - printf("Message d'erreur trop long. Entrez un message de 1-19 caract鑽es.\n"); - ladmin_log("Message d'erreur trop long. Entrez un message de 1-19 caract鑽es." RETCODE); - } else { - printf("Error message is too long. Please input a message of 1-19 bytes.\n"); - ladmin_log("Error message is too long. Please input a message of 1-19 bytes." RETCODE); - } - return 102; - } - } - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour changer un statut." RETCODE); - } else { - ladmin_log("Request to login-server to change a state." RETCODE); - } - - WFIFOW(login_fd,0) = 0x7936; - memcpy(WFIFOP(login_fd,2), name, 24); - WFIFOL(login_fd,26) = state; - memcpy(WFIFOP(login_fd,30), error_message, 20); - WFIFOSET(login_fd,50); - bytes_to_read = 1; - - return 0; +int changestatesub (char *name, int state, char *error_message7) +{ + char error_message[1023]; // need to use, because we can modify error_message7 + + memset (error_message, '\0', sizeof (error_message)); + strncpy (error_message, error_message7, sizeof (error_message) - 1); + + if ((state < 0 || state > 9) && state != 100) + { // Valid values: 0: ok, or value of the 0x006a packet + 1 + if (defaultlanguage == 'F') + { + printf ("Entrez une des statuts suivantes svp:\n"); + printf + (" 0 = Compte ok 6 = Your Game's EXE file is not the latest version\n"); + } + else + { + printf ("Please input one of these states:\n"); + printf + (" 0 = Account ok 6 = Your Game's EXE file is not the latest version\n"); + } + printf + (" 1 = Unregistered ID 7 = You are Prohibited to log in until + message\n"); + printf + (" 2 = Incorrect Password 8 = Server is jammed due to over populated\n"); + printf (" 3 = This ID is expired 9 = No MSG\n"); + printf + (" 4 = Rejected from Server 100 = This ID has been totally erased\n"); + printf (" 5 = You have been blocked by the GM Team\n"); + if (defaultlanguage == 'F') + { + printf ("<exemples> state nomtest 5\n"); + printf (" state nomtest 7 fin de votre ban\n"); + printf (" block <nom compte>\n"); + printf (" unblock <nom compte>\n"); + ladmin_log + ("Valeur incorrecte pour le statut d'un compte (commande 'state', 'block' ou 'unblock')." + RETCODE); + } + else + { + printf ("<examples> state testname 5\n"); + printf (" state testname 7 end of your ban\n"); + printf (" block <account name>\n"); + printf (" unblock <account name>\n"); + ladmin_log + ("Invalid value for the state of an account ('state', 'block' or 'unblock' command)." + RETCODE); + } + return 151; + } + + if (verify_accountname (name) == 0) + { + return 102; + } + + if (state != 7) + { + strcpy (error_message, "-"); + } + else + { + if (strlen (error_message) < 1) + { + if (defaultlanguage == 'F') + { + printf + ("Message d'erreur trop court. Entrez un message de 1-19 caract鑽es.\n"); + ladmin_log + ("Message d'erreur trop court. Entrez un message de 1-19 caract鑽es." + RETCODE); + } + else + { + printf + ("Error message is too short. Please input a message of 1-19 bytes.\n"); + ladmin_log + ("Error message is too short. Please input a message of 1-19 bytes." + RETCODE); + } + return 102; + } + if (strlen (error_message) > 19) + { + if (defaultlanguage == 'F') + { + printf + ("Message d'erreur trop long. Entrez un message de 1-19 caract鑽es.\n"); + ladmin_log + ("Message d'erreur trop long. Entrez un message de 1-19 caract鑽es." + RETCODE); + } + else + { + printf + ("Error message is too long. Please input a message of 1-19 bytes.\n"); + ladmin_log + ("Error message is too long. Please input a message of 1-19 bytes." + RETCODE); + } + return 102; + } + } + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour changer un statut." + RETCODE); + } + else + { + ladmin_log ("Request to login-server to change a state." RETCODE); + } + + WFIFOW (login_fd, 0) = 0x7936; + memcpy (WFIFOP (login_fd, 2), name, 24); + WFIFOL (login_fd, 26) = state; + memcpy (WFIFOP (login_fd, 30), error_message, 20); + WFIFOSET (login_fd, 50); + bytes_to_read = 1; + + return 0; } //------------------------------------------------------- // Sub-function: Asking to modify the state of an account //------------------------------------------------------- -int changestate(char* param) { - char name[1023], error_message[1023]; - int state; - - memset(name, '\0', sizeof(name)); - memset(error_message, '\0', sizeof(error_message)); - - if (sscanf(param, "\"%[^\"]\" %d %[^\r\n]", name, &state, error_message) < 2 && - sscanf(param, "'%[^']' %d %[^\r\n]", name, &state, error_message) < 2 && - sscanf(param, "%s %d %[^\r\n]", name, &state, error_message) < 2) { - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte et un statut svp.\n"); - printf("<exemples> state nomtest 5\n"); - printf(" state nomtest 7 fin de votre ban\n"); - printf(" block <nom compte>\n"); - printf(" unblock <nom compte>\n"); - ladmin_log("Nombre incorrect de param鑼res pour changer le statut d'un compte (commande 'state')." RETCODE); - } else { - printf("Please input an account name and a state.\n"); - printf("<examples> state testname 5\n"); - printf(" state testname 7 end of your ban\n"); - printf(" block <account name>\n"); - printf(" unblock <account name>\n"); - ladmin_log("Incomplete parameters to change the state of an account ('state' command)." RETCODE); - } - return 136; - } +int changestate (char *param) +{ + char name[1023], error_message[1023]; + int state; + + memset (name, '\0', sizeof (name)); + memset (error_message, '\0', sizeof (error_message)); + + if (sscanf (param, "\"%[^\"]\" %d %[^\r\n]", name, &state, error_message) + < 2 + && sscanf (param, "'%[^']' %d %[^\r\n]", name, &state, + error_message) < 2 + && sscanf (param, "%s %d %[^\r\n]", name, &state, error_message) < 2) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte et un statut svp.\n"); + printf ("<exemples> state nomtest 5\n"); + printf (" state nomtest 7 fin de votre ban\n"); + printf (" block <nom compte>\n"); + printf (" unblock <nom compte>\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour changer le statut d'un compte (commande 'state')." + RETCODE); + } + else + { + printf ("Please input an account name and a state.\n"); + printf ("<examples> state testname 5\n"); + printf (" state testname 7 end of your ban\n"); + printf (" block <account name>\n"); + printf (" unblock <account name>\n"); + ladmin_log + ("Incomplete parameters to change the state of an account ('state' command)." + RETCODE); + } + return 136; + } - return changestatesub(name, state, error_message); + return changestatesub (name, state, error_message); } //------------------------------------------- // Sub-function: Asking to unblock an account //------------------------------------------- -int unblockaccount(char* param) { - char name[1023]; - - memset(name, '\0', sizeof(name)); - - if (strlen(param) == 0 || - (sscanf(param, "\"%[^\"]\"", name) < 1 && - sscanf(param, "'%[^']'", name) < 1 && - sscanf(param, "%[^\r\n]", name) < 1) || - strlen(name) == 0) { - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte svp.\n"); - printf("<exemples> state nomtest 5\n"); - printf(" state nomtest 7 fin de votre ban\n"); - printf(" block <nom compte>\n"); - printf(" unblock <nom compte>\n"); - ladmin_log("Nombre incorrect de param鑼res pour changer le statut d'un compte (commande 'unblock')." RETCODE); - } else { - printf("Please input an account name.\n"); - printf("<examples> state testname 5\n"); - printf(" state testname 7 end of your ban\n"); - printf(" block <account name>\n"); - printf(" unblock <account name>\n"); - ladmin_log("Incomplete parameters to change the state of an account ('unblock' command)." RETCODE); - } - return 136; - } +int unblockaccount (char *param) +{ + char name[1023]; + + memset (name, '\0', sizeof (name)); + + if (strlen (param) == 0 || + (sscanf (param, "\"%[^\"]\"", name) < 1 && + sscanf (param, "'%[^']'", name) < 1 && + sscanf (param, "%[^\r\n]", name) < 1) || strlen (name) == 0) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte svp.\n"); + printf ("<exemples> state nomtest 5\n"); + printf (" state nomtest 7 fin de votre ban\n"); + printf (" block <nom compte>\n"); + printf (" unblock <nom compte>\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour changer le statut d'un compte (commande 'unblock')." + RETCODE); + } + else + { + printf ("Please input an account name.\n"); + printf ("<examples> state testname 5\n"); + printf (" state testname 7 end of your ban\n"); + printf (" block <account name>\n"); + printf (" unblock <account name>\n"); + ladmin_log + ("Incomplete parameters to change the state of an account ('unblock' command)." + RETCODE); + } + return 136; + } - return changestatesub(name, 0, "-"); // state 0, no error message + return changestatesub (name, 0, "-"); // state 0, no error message } //------------------------------------------- // Sub-function: Asking to unblock an account //------------------------------------------- -int blockaccount(char* param) { - char name[1023]; - - memset(name, '\0', sizeof(name)); - - if (strlen(param) == 0 || - (sscanf(param, "\"%[^\"]\"", name) < 1 && - sscanf(param, "'%[^']'", name) < 1 && - sscanf(param, "%[^\r\n]", name) < 1) || - strlen(name) == 0) { - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte svp.\n"); - printf("<exemples> state nomtest 5\n"); - printf(" state nomtest 7 fin de votre ban\n"); - printf(" block <nom compte>\n"); - printf(" unblock <nom compte>\n"); - ladmin_log("Nombre incorrect de param鑼res pour changer le statut d'un compte (commande 'block')." RETCODE); - } else { - printf("Please input an account name.\n"); - printf("<examples> state testname 5\n"); - printf(" state testname 7 end of your ban\n"); - printf(" block <account name>\n"); - printf(" unblock <account name>\n"); - ladmin_log("Incomplete parameters to change the state of an account ('block' command)." RETCODE); - } - return 136; - } +int blockaccount (char *param) +{ + char name[1023]; + + memset (name, '\0', sizeof (name)); + + if (strlen (param) == 0 || + (sscanf (param, "\"%[^\"]\"", name) < 1 && + sscanf (param, "'%[^']'", name) < 1 && + sscanf (param, "%[^\r\n]", name) < 1) || strlen (name) == 0) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte svp.\n"); + printf ("<exemples> state nomtest 5\n"); + printf (" state nomtest 7 fin de votre ban\n"); + printf (" block <nom compte>\n"); + printf (" unblock <nom compte>\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour changer le statut d'un compte (commande 'block')." + RETCODE); + } + else + { + printf ("Please input an account name.\n"); + printf ("<examples> state testname 5\n"); + printf (" state testname 7 end of your ban\n"); + printf (" block <account name>\n"); + printf (" unblock <account name>\n"); + ladmin_log + ("Incomplete parameters to change the state of an account ('block' command)." + RETCODE); + } + return 136; + } - return changestatesub(name, 5, "-"); // state 5, no error message + return changestatesub (name, 5, "-"); // state 5, no error message } //--------------------------------------------------------------------- // Sub-function: Add/substract time to the validity limit of an account //--------------------------------------------------------------------- -int timeaddaccount(char* param) { - char name[1023], modif[1023]; - int year, month, day, hour, minute, second; - char * p_modif; - int value, i; - - memset(name, '\0', sizeof(name)); - memset(modif, '\0', sizeof(modif)); - year = month = day = hour = minute = second = 0; - - if (sscanf(param, "\"%[^\"]\" %[^\r\n]", name, modif) < 2 && - sscanf(param, "'%[^']' %[^\r\n]", name, modif) < 2 && - sscanf(param, "%s %[^\r\n]", name, modif) < 2) { - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte et un modificateur svp.\n"); - printf(" <exemple> timeadd nomtest +1m-2mn1s-6y\n"); - printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n"); - printf(" et 6 ans dans le m麥e temps.\n"); - ladmin_log("Nombre incorrect de param鑼res pour modifier une date limite d'utilisation (commande 'timeadd')." RETCODE); - } else { - printf("Please input an account name and a modifier.\n"); - printf(" <example>: timeadd testname +1m-2mn1s-6y\n"); - printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n"); - printf(" and 6 years at the same time.\n"); - ladmin_log("Incomplete parameters to modify a limit time ('timeadd' command)." RETCODE); - } - return 136; - } - if (verify_accountname(name) == 0) { - return 102; - } - - // lowercase for modif - for (i = 0; modif[i]; i++) - modif[i] = tolower(modif[i]); - p_modif = modif; - while (strlen(p_modif) > 0) { - value = atoi(p_modif); - if (value == 0) { - p_modif++; - } else { - if (p_modif[0] == '-' || p_modif[0] == '+') - p_modif++; - while (strlen(p_modif) > 0 && p_modif[0] >= '0' && p_modif[0] <= '9') { - p_modif++; - } - if (p_modif[0] == 's') { - second = value; - p_modif++; - } else if (p_modif[0] == 'm' && p_modif[1] == 'n') { - minute = value; - p_modif += 2; - } else if (p_modif[0] == 'h') { - hour = value; - p_modif++; - } else if (p_modif[0] == 'd' || p_modif[0] == 'j') { - day = value; - p_modif += 2; - } else if (p_modif[0] == 'm') { - month = value; - p_modif++; - } else if (p_modif[0] == 'y' || p_modif[0] == 'a') { - year = value; - p_modif++; - } else { - p_modif++; - } - } - } - - if (defaultlanguage == 'F') { - printf(" ann馥: %d\n", year); - printf(" mois: %d\n", month); - printf(" jour: %d\n", day); - printf(" heure: %d\n", hour); - printf(" minute: %d\n", minute); - printf(" seconde: %d\n", second); - } else { - printf(" year: %d\n", year); - printf(" month: %d\n", month); - printf(" day: %d\n", day); - printf(" hour: %d\n", hour); - printf(" minute: %d\n", minute); - printf(" second: %d\n", second); - } - - if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) { - if (defaultlanguage == 'F') { - printf("Vous devez entrer un ajustement avec cette commande, svp:\n"); - printf(" Valeur d'ajustement (-1, 1, +1, etc...)\n"); - printf(" El駑ent modifi:\n"); - printf(" a ou y: ann馥\n"); - printf(" m: mois\n"); - printf(" j ou d: jour\n"); - printf(" h: heure\n"); - printf(" mn: minute\n"); - printf(" s: seconde\n"); - printf(" <exemple> timeadd nomtest +1m-2mn1s-6y\n"); - printf(" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n"); - printf(" et 6 ans dans le m麥e temps.\n"); - ladmin_log("Aucun ajustement n'est pas un ajustement (commande 'timeadd')." RETCODE); - } else { - printf("Please give an adjustment with this command:\n"); - printf(" Adjustment value (-1, 1, +1, etc...)\n"); - printf(" Modified element:\n"); - printf(" a or y: year\n"); - printf(" m: month\n"); - printf(" j or d: day\n"); - printf(" h: hour\n"); - printf(" mn: minute\n"); - printf(" s: second\n"); - printf(" <example> timeadd testname +1m-2mn1s-6y\n"); - printf(" this example adds 1 month and 1 second, and substracts 2 minutes\n"); - printf(" and 6 years at the same time.\n"); - ladmin_log("No adjustment isn't an adjustment ('timeadd' command)." RETCODE); - } - return 137; - } - if (year > 127 || year < -127) { - if (defaultlanguage == 'F') { - printf("Entrez un ajustement d'ann馥s correct (de -127 127), svp.\n"); - ladmin_log("Ajustement de l'ann馥 hors norme ('timeadd' command)." RETCODE); - } else { - printf("Please give a correct adjustment for the years (from -127 to 127).\n"); - ladmin_log("Abnormal adjustement for the year ('timeadd' command)." RETCODE); - } - return 137; - } - if (month > 255 || month < -255) { - if (defaultlanguage == 'F') { - printf("Entrez un ajustement de mois correct (de -255 255), svp.\n"); - ladmin_log("Ajustement du mois hors norme ('timeadd' command)." RETCODE); - } else { - printf("Please give a correct adjustment for the months (from -255 to 255).\n"); - ladmin_log("Abnormal adjustement for the month ('timeadd' command)." RETCODE); - } - return 137; - } - if (day > 32767 || day < -32767) { - if (defaultlanguage == 'F') { - printf("Entrez un ajustement de jours correct (de -32767 32767), svp.\n"); - ladmin_log("Ajustement des jours hors norme ('timeadd' command)." RETCODE); - } else { - printf("Please give a correct adjustment for the days (from -32767 to 32767).\n"); - ladmin_log("Abnormal adjustement for the days ('timeadd' command)." RETCODE); - } - return 137; - } - if (hour > 32767 || hour < -32767) { - if (defaultlanguage == 'F') { - printf("Entrez un ajustement d'heures correct (de -32767 32767), svp.\n"); - ladmin_log("Ajustement des heures hors norme ('timeadd' command)." RETCODE); - } else { - printf("Please give a correct adjustment for the hours (from -32767 to 32767).\n"); - ladmin_log("Abnormal adjustement for the hours ('timeadd' command)." RETCODE); - } - return 137; - } - if (minute > 32767 || minute < -32767) { - if (defaultlanguage == 'F') { - printf("Entrez un ajustement de minutes correct (de -32767 32767), svp.\n"); - ladmin_log("Ajustement des minutes hors norme ('timeadd' command)." RETCODE); - } else { - printf("Please give a correct adjustment for the minutes (from -32767 to 32767).\n"); - ladmin_log("Abnormal adjustement for the minutes ('timeadd' command)." RETCODE); - } - return 137; - } - if (second > 32767 || second < -32767) { - if (defaultlanguage == 'F') { - printf("Entrez un ajustement de secondes correct (de -32767 32767), svp.\n"); - ladmin_log("Ajustement des secondes hors norme ('timeadd' command)." RETCODE); - } else { - printf("Please give a correct adjustment for the seconds (from -32767 to 32767).\n"); - ladmin_log("Abnormal adjustement for the seconds ('timeadd' command)." RETCODE); - } - return 137; - } - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour modifier une date limite d'utilisation." RETCODE); - } else { - ladmin_log("Request to login-server to modify a time limit." RETCODE); - } - - WFIFOW(login_fd,0) = 0x7950; - memcpy(WFIFOP(login_fd,2), name, 24); - WFIFOW(login_fd,26) = (short)year; - WFIFOW(login_fd,28) = (short)month; - WFIFOW(login_fd,30) = (short)day; - WFIFOW(login_fd,32) = (short)hour; - WFIFOW(login_fd,34) = (short)minute; - WFIFOW(login_fd,36) = (short)second; - WFIFOSET(login_fd,38); - bytes_to_read = 1; - - return 0; +int timeaddaccount (char *param) +{ + char name[1023], modif[1023]; + int year, month, day, hour, minute, second; + char *p_modif; + int value, i; + + memset (name, '\0', sizeof (name)); + memset (modif, '\0', sizeof (modif)); + year = month = day = hour = minute = second = 0; + + if (sscanf (param, "\"%[^\"]\" %[^\r\n]", name, modif) < 2 && + sscanf (param, "'%[^']' %[^\r\n]", name, modif) < 2 && + sscanf (param, "%s %[^\r\n]", name, modif) < 2) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte et un modificateur svp.\n"); + printf (" <exemple> timeadd nomtest +1m-2mn1s-6y\n"); + printf + (" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n"); + printf (" et 6 ans dans le m麥e temps.\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour modifier une date limite d'utilisation (commande 'timeadd')." + RETCODE); + } + else + { + printf ("Please input an account name and a modifier.\n"); + printf (" <example>: timeadd testname +1m-2mn1s-6y\n"); + printf + (" this example adds 1 month and 1 second, and substracts 2 minutes\n"); + printf (" and 6 years at the same time.\n"); + ladmin_log + ("Incomplete parameters to modify a limit time ('timeadd' command)." + RETCODE); + } + return 136; + } + if (verify_accountname (name) == 0) + { + return 102; + } + + // lowercase for modif + for (i = 0; modif[i]; i++) + modif[i] = tolower (modif[i]); + p_modif = modif; + while (strlen (p_modif) > 0) + { + value = atoi (p_modif); + if (value == 0) + { + p_modif++; + } + else + { + if (p_modif[0] == '-' || p_modif[0] == '+') + p_modif++; + while (strlen (p_modif) > 0 && p_modif[0] >= '0' + && p_modif[0] <= '9') + { + p_modif++; + } + if (p_modif[0] == 's') + { + second = value; + p_modif++; + } + else if (p_modif[0] == 'm' && p_modif[1] == 'n') + { + minute = value; + p_modif += 2; + } + else if (p_modif[0] == 'h') + { + hour = value; + p_modif++; + } + else if (p_modif[0] == 'd' || p_modif[0] == 'j') + { + day = value; + p_modif += 2; + } + else if (p_modif[0] == 'm') + { + month = value; + p_modif++; + } + else if (p_modif[0] == 'y' || p_modif[0] == 'a') + { + year = value; + p_modif++; + } + else + { + p_modif++; + } + } + } + + if (defaultlanguage == 'F') + { + printf (" ann馥: %d\n", year); + printf (" mois: %d\n", month); + printf (" jour: %d\n", day); + printf (" heure: %d\n", hour); + printf (" minute: %d\n", minute); + printf (" seconde: %d\n", second); + } + else + { + printf (" year: %d\n", year); + printf (" month: %d\n", month); + printf (" day: %d\n", day); + printf (" hour: %d\n", hour); + printf (" minute: %d\n", minute); + printf (" second: %d\n", second); + } + + if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 + && second == 0) + { + if (defaultlanguage == 'F') + { + printf + ("Vous devez entrer un ajustement avec cette commande, svp:\n"); + printf (" Valeur d'ajustement (-1, 1, +1, etc...)\n"); + printf (" El駑ent modifi:\n"); + printf (" a ou y: ann馥\n"); + printf (" m: mois\n"); + printf (" j ou d: jour\n"); + printf (" h: heure\n"); + printf (" mn: minute\n"); + printf (" s: seconde\n"); + printf (" <exemple> timeadd nomtest +1m-2mn1s-6y\n"); + printf + (" Cette exemple ajoute 1 mois et 1 seconde, et soustrait 2 minutes\n"); + printf (" et 6 ans dans le m麥e temps.\n"); + ladmin_log + ("Aucun ajustement n'est pas un ajustement (commande 'timeadd')." + RETCODE); + } + else + { + printf ("Please give an adjustment with this command:\n"); + printf (" Adjustment value (-1, 1, +1, etc...)\n"); + printf (" Modified element:\n"); + printf (" a or y: year\n"); + printf (" m: month\n"); + printf (" j or d: day\n"); + printf (" h: hour\n"); + printf (" mn: minute\n"); + printf (" s: second\n"); + printf (" <example> timeadd testname +1m-2mn1s-6y\n"); + printf + (" this example adds 1 month and 1 second, and substracts 2 minutes\n"); + printf (" and 6 years at the same time.\n"); + ladmin_log + ("No adjustment isn't an adjustment ('timeadd' command)." + RETCODE); + } + return 137; + } + if (year > 127 || year < -127) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez un ajustement d'ann馥s correct (de -127 127), svp.\n"); + ladmin_log + ("Ajustement de l'ann馥 hors norme ('timeadd' command)." + RETCODE); + } + else + { + printf + ("Please give a correct adjustment for the years (from -127 to 127).\n"); + ladmin_log + ("Abnormal adjustement for the year ('timeadd' command)." + RETCODE); + } + return 137; + } + if (month > 255 || month < -255) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez un ajustement de mois correct (de -255 255), svp.\n"); + ladmin_log ("Ajustement du mois hors norme ('timeadd' command)." + RETCODE); + } + else + { + printf + ("Please give a correct adjustment for the months (from -255 to 255).\n"); + ladmin_log + ("Abnormal adjustement for the month ('timeadd' command)." + RETCODE); + } + return 137; + } + if (day > 32767 || day < -32767) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez un ajustement de jours correct (de -32767 32767), svp.\n"); + ladmin_log ("Ajustement des jours hors norme ('timeadd' command)." + RETCODE); + } + else + { + printf + ("Please give a correct adjustment for the days (from -32767 to 32767).\n"); + ladmin_log + ("Abnormal adjustement for the days ('timeadd' command)." + RETCODE); + } + return 137; + } + if (hour > 32767 || hour < -32767) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez un ajustement d'heures correct (de -32767 32767), svp.\n"); + ladmin_log + ("Ajustement des heures hors norme ('timeadd' command)." + RETCODE); + } + else + { + printf + ("Please give a correct adjustment for the hours (from -32767 to 32767).\n"); + ladmin_log + ("Abnormal adjustement for the hours ('timeadd' command)." + RETCODE); + } + return 137; + } + if (minute > 32767 || minute < -32767) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez un ajustement de minutes correct (de -32767 32767), svp.\n"); + ladmin_log + ("Ajustement des minutes hors norme ('timeadd' command)." + RETCODE); + } + else + { + printf + ("Please give a correct adjustment for the minutes (from -32767 to 32767).\n"); + ladmin_log + ("Abnormal adjustement for the minutes ('timeadd' command)." + RETCODE); + } + return 137; + } + if (second > 32767 || second < -32767) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez un ajustement de secondes correct (de -32767 32767), svp.\n"); + ladmin_log + ("Ajustement des secondes hors norme ('timeadd' command)." + RETCODE); + } + else + { + printf + ("Please give a correct adjustment for the seconds (from -32767 to 32767).\n"); + ladmin_log + ("Abnormal adjustement for the seconds ('timeadd' command)." + RETCODE); + } + return 137; + } + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour modifier une date limite d'utilisation." + RETCODE); + } + else + { + ladmin_log ("Request to login-server to modify a time limit." + RETCODE); + } + + WFIFOW (login_fd, 0) = 0x7950; + memcpy (WFIFOP (login_fd, 2), name, 24); + WFIFOW (login_fd, 26) = (short) year; + WFIFOW (login_fd, 28) = (short) month; + WFIFOW (login_fd, 30) = (short) day; + WFIFOW (login_fd, 32) = (short) hour; + WFIFOW (login_fd, 34) = (short) minute; + WFIFOW (login_fd, 36) = (short) second; + WFIFOSET (login_fd, 38); + bytes_to_read = 1; + + return 0; } //------------------------------------------------- // Sub-function: Set a validity limit of an account //------------------------------------------------- -int timesetaccount(char* param) { - char name[1023], date[1023], time[1023]; - int year, month, day, hour, minute, second; - time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) - struct tm *tmtime; - - memset(name, '\0', sizeof(name)); - memset(date, '\0', sizeof(date)); - memset(time, '\0', sizeof(time)); - year = month = day = hour = minute = second = 0; - connect_until_time = 0; - tmtime = localtime(&connect_until_time); // initialize - - if (sscanf(param, "\"%[^\"]\" %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void - sscanf(param, "'%[^']' %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void - sscanf(param, "%s %s %[^\r\n]", name, date, time) < 2) { // if date = 0, time can be void - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte, une date et une heure svp.\n"); - printf("<exemple>: timeset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n"); - printf(" timeset <nom_du_compte> 0 (0 = illimit)\n"); - printf(" Heure par d馭aut [hh:mm:ss]: 23:59:59.\n"); - ladmin_log("Nombre incorrect de param鑼res pour fixer une date limite d'utilisation (commande 'timeset')." RETCODE); - } else { - printf("Please input an account name, a date and a hour.\n"); - printf("<example>: timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n"); - printf(" timeset <account_name> 0 (0 = unlimited)\n"); - printf(" Default time [hh:mm:ss]: 23:59:59.\n"); - ladmin_log("Incomplete parameters to set a limit time ('timeset' command)." RETCODE); - } - return 136; - } - if (verify_accountname(name) == 0) { - return 102; - } - - if (time[0] == '\0') - strcpy(time, "23:59:59"); - - if (atoi(date) != 0 && - ((sscanf(date, "%d/%d/%d", &year, &month, &day) < 3 && - sscanf(date, "%d-%d-%d", &year, &month, &day) < 3 && - sscanf(date, "%d.%d.%d", &year, &month, &day) < 3 && - sscanf(date, "%d'%d'%d", &year, &month, &day) < 3) || - sscanf(time, "%d:%d:%d", &hour, &minute, &second) < 3)) { - if (defaultlanguage == 'F') { - printf("Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n"); - ladmin_log("Format incorrect pour la date/heure ('timeset' command)." RETCODE); - } else { - printf("Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n"); - ladmin_log("Invalid format for the date/time ('timeset' command)." RETCODE); - } - return 102; - } - - if (atoi(date) == 0) { - connect_until_time = 0; - } else { - if (year < 70) { - year = year + 100; - } - if (year >= 1900) { - year = year - 1900; - } - if (month < 1 || month > 12) { - if (defaultlanguage == 'F') { - printf("Entrez un mois correct svp (entre 1 et 12).\n"); - ladmin_log("Mois incorrect pour la date ('timeset' command)." RETCODE); - } else { - printf("Please give a correct value for the month (from 1 to 12).\n"); - ladmin_log("Invalid month for the date ('timeset' command)." RETCODE); - } - return 102; - } - month = month - 1; - if (day < 1 || day > 31) { - if (defaultlanguage == 'F') { - printf("Entrez un jour correct svp (entre 1 et 31).\n"); - ladmin_log("Jour incorrect pour la date ('timeset' command)." RETCODE); - } else { - printf("Please give a correct value for the day (from 1 to 31).\n"); - ladmin_log("Invalid day for the date ('timeset' command)." RETCODE); - } - return 102; - } - if (((month == 3 || month == 5 || month == 8 || month == 10) && day > 30) || - (month == 1 && day > 29)) { - if (defaultlanguage == 'F') { - printf("Entrez un jour correct en fonction du mois (%d) svp.\n", month); - ladmin_log("Jour incorrect pour ce mois correspondant ('timeset' command)." RETCODE); - } else { - printf("Please give a correct value for a day of this month (%d).\n", month); - ladmin_log("Invalid day for this month ('timeset' command)." RETCODE); - } - return 102; - } - if (hour < 0 || hour > 23) { - if (defaultlanguage == 'F') { - printf("Entrez une heure correcte svp (entre 0 et 23).\n"); - ladmin_log("Heure incorrecte pour l'heure ('timeset' command)." RETCODE); - } else { - printf("Please give a correct value for the hour (from 0 to 23).\n"); - ladmin_log("Invalid hour for the time ('timeset' command)." RETCODE); - } - return 102; - } - if (minute < 0 || minute > 59) { - if (defaultlanguage == 'F') { - printf("Entrez des minutes correctes svp (entre 0 et 59).\n"); - ladmin_log("Minute incorrecte pour l'heure ('timeset' command)." RETCODE); - } else { - printf("Please give a correct value for the minutes (from 0 to 59).\n"); - ladmin_log("Invalid minute for the time ('timeset' command)." RETCODE); - } - return 102; - } - if (second < 0 || second > 59) { - if (defaultlanguage == 'F') { - printf("Entrez des secondes correctes svp (entre 0 et 59).\n"); - ladmin_log("Seconde incorrecte pour l'heure ('timeset' command)." RETCODE); - } else { - printf("Please give a correct value for the seconds (from 0 to 59).\n"); - ladmin_log("Invalid second for the time ('timeset' command)." RETCODE); - } - return 102; - } - tmtime->tm_year = year; - tmtime->tm_mon = month; - tmtime->tm_mday = day; - tmtime->tm_hour = hour; - tmtime->tm_min = minute; - tmtime->tm_sec = second; - tmtime->tm_isdst = -1; // -1: no winter/summer time modification - connect_until_time = timegm(tmtime); - if (connect_until_time == -1) { - if (defaultlanguage == 'F') { - printf("Date incorrecte.\n"); - printf("Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n"); - ladmin_log("Date incorrecte. ('timeset' command)." RETCODE); - } else { - printf("Invalid date.\n"); - printf("Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n"); - ladmin_log("Invalid date. ('timeset' command)." RETCODE); - } - return 102; - } - } - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour fixer une date limite d'utilisation." RETCODE); - } else { - ladmin_log("Request to login-server to set a time limit." RETCODE); - } - - WFIFOW(login_fd,0) = 0x7948; - memcpy(WFIFOP(login_fd,2), name, 24); - WFIFOL(login_fd,26) = (int)connect_until_time; - WFIFOSET(login_fd,30); - bytes_to_read = 1; - - return 0; +int timesetaccount (char *param) +{ + char name[1023], date[1023], time[1023]; + int year, month, day, hour, minute, second; + time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) + struct tm *tmtime; + + memset (name, '\0', sizeof (name)); + memset (date, '\0', sizeof (date)); + memset (time, '\0', sizeof (time)); + year = month = day = hour = minute = second = 0; + connect_until_time = 0; + tmtime = localtime (&connect_until_time); // initialize + + if (sscanf (param, "\"%[^\"]\" %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void + sscanf (param, "'%[^']' %s %[^\r\n]", name, date, time) < 2 && // if date = 0, time can be void + sscanf (param, "%s %s %[^\r\n]", name, date, time) < 2) + { // if date = 0, time can be void + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte, une date et une heure svp.\n"); + printf + ("<exemple>: timeset <nom_du_compte> aaaa/mm/jj [hh:mm:ss]\n"); + printf + (" timeset <nom_du_compte> 0 (0 = illimit)\n"); + printf (" Heure par d馭aut [hh:mm:ss]: 23:59:59.\n"); + ladmin_log + ("Nombre incorrect de param鑼res pour fixer une date limite d'utilisation (commande 'timeset')." + RETCODE); + } + else + { + printf ("Please input an account name, a date and a hour.\n"); + printf + ("<example>: timeset <account_name> yyyy/mm/dd [hh:mm:ss]\n"); + printf + (" timeset <account_name> 0 (0 = unlimited)\n"); + printf (" Default time [hh:mm:ss]: 23:59:59.\n"); + ladmin_log + ("Incomplete parameters to set a limit time ('timeset' command)." + RETCODE); + } + return 136; + } + if (verify_accountname (name) == 0) + { + return 102; + } + + if (time[0] == '\0') + strcpy (time, "23:59:59"); + + if (atoi (date) != 0 && + ((sscanf (date, "%d/%d/%d", &year, &month, &day) < 3 && + sscanf (date, "%d-%d-%d", &year, &month, &day) < 3 && + sscanf (date, "%d.%d.%d", &year, &month, &day) < 3 && + sscanf (date, "%d'%d'%d", &year, &month, &day) < 3) || + sscanf (time, "%d:%d:%d", &hour, &minute, &second) < 3)) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n"); + ladmin_log + ("Format incorrect pour la date/heure ('timeset' command)." + RETCODE); + } + else + { + printf + ("Please input 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n"); + ladmin_log + ("Invalid format for the date/time ('timeset' command)." + RETCODE); + } + return 102; + } + + if (atoi (date) == 0) + { + connect_until_time = 0; + } + else + { + if (year < 70) + { + year = year + 100; + } + if (year >= 1900) + { + year = year - 1900; + } + if (month < 1 || month > 12) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un mois correct svp (entre 1 et 12).\n"); + ladmin_log ("Mois incorrect pour la date ('timeset' command)." + RETCODE); + } + else + { + printf + ("Please give a correct value for the month (from 1 to 12).\n"); + ladmin_log ("Invalid month for the date ('timeset' command)." + RETCODE); + } + return 102; + } + month = month - 1; + if (day < 1 || day > 31) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un jour correct svp (entre 1 et 31).\n"); + ladmin_log ("Jour incorrect pour la date ('timeset' command)." + RETCODE); + } + else + { + printf + ("Please give a correct value for the day (from 1 to 31).\n"); + ladmin_log ("Invalid day for the date ('timeset' command)." + RETCODE); + } + return 102; + } + if (((month == 3 || month == 5 || month == 8 || month == 10) + && day > 30) || (month == 1 && day > 29)) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez un jour correct en fonction du mois (%d) svp.\n", + month); + ladmin_log + ("Jour incorrect pour ce mois correspondant ('timeset' command)." + RETCODE); + } + else + { + printf + ("Please give a correct value for a day of this month (%d).\n", + month); + ladmin_log ("Invalid day for this month ('timeset' command)." + RETCODE); + } + return 102; + } + if (hour < 0 || hour > 23) + { + if (defaultlanguage == 'F') + { + printf ("Entrez une heure correcte svp (entre 0 et 23).\n"); + ladmin_log + ("Heure incorrecte pour l'heure ('timeset' command)." + RETCODE); + } + else + { + printf + ("Please give a correct value for the hour (from 0 to 23).\n"); + ladmin_log ("Invalid hour for the time ('timeset' command)." + RETCODE); + } + return 102; + } + if (minute < 0 || minute > 59) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez des minutes correctes svp (entre 0 et 59).\n"); + ladmin_log + ("Minute incorrecte pour l'heure ('timeset' command)." + RETCODE); + } + else + { + printf + ("Please give a correct value for the minutes (from 0 to 59).\n"); + ladmin_log ("Invalid minute for the time ('timeset' command)." + RETCODE); + } + return 102; + } + if (second < 0 || second > 59) + { + if (defaultlanguage == 'F') + { + printf + ("Entrez des secondes correctes svp (entre 0 et 59).\n"); + ladmin_log + ("Seconde incorrecte pour l'heure ('timeset' command)." + RETCODE); + } + else + { + printf + ("Please give a correct value for the seconds (from 0 to 59).\n"); + ladmin_log ("Invalid second for the time ('timeset' command)." + RETCODE); + } + return 102; + } + tmtime->tm_year = year; + tmtime->tm_mon = month; + tmtime->tm_mday = day; + tmtime->tm_hour = hour; + tmtime->tm_min = minute; + tmtime->tm_sec = second; + tmtime->tm_isdst = -1; // -1: no winter/summer time modification + connect_until_time = timegm (tmtime); + if (connect_until_time == -1) + { + if (defaultlanguage == 'F') + { + printf ("Date incorrecte.\n"); + printf + ("Ajoutez 0 ou une date et une heure svp (format: 0 ou aaaa/mm/jj hh:mm:ss).\n"); + ladmin_log ("Date incorrecte. ('timeset' command)." RETCODE); + } + else + { + printf ("Invalid date.\n"); + printf + ("Please add 0 or a date and a time (format: 0 or yyyy/mm/dd hh:mm:ss).\n"); + ladmin_log ("Invalid date. ('timeset' command)." RETCODE); + } + return 102; + } + } + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour fixer une date limite d'utilisation." + RETCODE); + } + else + { + ladmin_log ("Request to login-server to set a time limit." RETCODE); + } + + WFIFOW (login_fd, 0) = 0x7948; + memcpy (WFIFOP (login_fd, 2), name, 24); + WFIFOL (login_fd, 26) = (int) connect_until_time; + WFIFOSET (login_fd, 30); + bytes_to_read = 1; + + return 0; } //------------------------------------------------------------------------------ // Sub-function: Asking to displaying information about an account (by its name) //------------------------------------------------------------------------------ -int whoaccount(char* param) { - char name[1023]; - - memset(name, '\0', sizeof(name)); - - if (strlen(param) == 0 || - (sscanf(param, "\"%[^\"]\"", name) < 1 && - sscanf(param, "'%[^']'", name) < 1 && - sscanf(param, "%[^\r\n]", name) < 1) || - strlen(name) == 0) { - if (defaultlanguage == 'F') { - printf("Entrez un nom de compte svp.\n"); - printf("<exemple> who nomtest\n"); - ladmin_log("Aucun nom n'a 騁 donn pour trouver le compte." RETCODE); - } else { - printf("Please input an account name.\n"); - printf("<example> who testname\n"); - ladmin_log("No name was given to found the account." RETCODE); - } - return 136; - } - if (verify_accountname(name) == 0) { - return 102; - } - - if (defaultlanguage == 'F') { - ladmin_log("Envoi d'un requ黎e au serveur de logins pour obtenir le information d'un compte (par le nom)." RETCODE); - } else { - ladmin_log("Request to login-server to obtain information about an account (by its name)." RETCODE); - } - - WFIFOW(login_fd,0) = 0x7952; - memcpy(WFIFOP(login_fd,2), name, 24); - WFIFOSET(login_fd,26); - bytes_to_read = 1; - - return 0; +int whoaccount (char *param) +{ + char name[1023]; + + memset (name, '\0', sizeof (name)); + + if (strlen (param) == 0 || + (sscanf (param, "\"%[^\"]\"", name) < 1 && + sscanf (param, "'%[^']'", name) < 1 && + sscanf (param, "%[^\r\n]", name) < 1) || strlen (name) == 0) + { + if (defaultlanguage == 'F') + { + printf ("Entrez un nom de compte svp.\n"); + printf ("<exemple> who nomtest\n"); + ladmin_log ("Aucun nom n'a 騁 donn pour trouver le compte." + RETCODE); + } + else + { + printf ("Please input an account name.\n"); + printf ("<example> who testname\n"); + ladmin_log ("No name was given to found the account." RETCODE); + } + return 136; + } + if (verify_accountname (name) == 0) + { + return 102; + } + + if (defaultlanguage == 'F') + { + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour obtenir le information d'un compte (par le nom)." + RETCODE); + } + else + { + ladmin_log + ("Request to login-server to obtain information about an account (by its name)." + RETCODE); + } + + WFIFOW (login_fd, 0) = 0x7952; + memcpy (WFIFOP (login_fd, 2), name, 24); + WFIFOSET (login_fd, 26); + bytes_to_read = 1; + + return 0; } //-------------------------------------------------------- // Sub-function: Asking of the version of the login-server //-------------------------------------------------------- -int checkloginversion() { - if (defaultlanguage == 'F') - ladmin_log("Envoi d'un requ黎e au serveur de logins pour obtenir sa version." RETCODE); - else - ladmin_log("Request to login-server to obtain its version." RETCODE); - - WFIFOW(login_fd,0) = 0x7530; - WFIFOSET(login_fd,2); - bytes_to_read = 1; - - return 0; +int checkloginversion () +{ + if (defaultlanguage == 'F') + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour obtenir sa version." + RETCODE); + else + ladmin_log ("Request to login-server to obtain its version." RETCODE); + + WFIFOW (login_fd, 0) = 0x7530; + WFIFOSET (login_fd, 2); + bytes_to_read = 1; + + return 0; } //--------------------------------------------- @@ -3063,1371 +4408,2243 @@ int checkloginversion() { // this function wait until user type a command // and analyse the command. //--------------------------------------------- -int prompt() { - int i, j; - char buf[1024]; - char *p; - - // while we don't wait new packets - while (bytes_to_read == 0) { - // for help with the console colors look here: - // http://www.edoceo.com/liberum/?doc=printf-with-color - // some code explanation (used here): - // \033[2J : clear screen and go up/left (0, 0 position) - // \033[K : clear line from actual position to end of the line - // \033[0m : reset color parameter - // \033[1m : use bold for font - Iprintf("\n"); - if (defaultlanguage == 'F') { - Iprintf("\033[32mPour afficher les commandes, tapez 'Entr馥'.\033[0m\n"); - } else - Iprintf("\033[32mTo list the commands, type 'enter'.\033[0m\n"); - Iprintf("\033[0;36mLadmin-> \033[0m"); - Iprintf("\033[1m"); - fflush(stdout); - - // get command and parameter - memset(buf, '\0', sizeof(buf)); - fflush(stdin); - fgets(buf, 1023, stdin); - buf[1023] = '\0'; - - Iprintf("\033[0m"); - fflush(stdout); - - if (!eathena_interactive_session && !strlen(buf)) - exit(0); - - // remove final \n - if((p = strrchr(buf, '\n')) != NULL) - p[0] = '\0'; - // remove all control char - for (i = 0; buf[i]; i++) - if (buf[i] < 32) { - // remove cursor control. - if (buf[i] == 27 && buf[i+1] == '[' && - (buf[i+2] == 'H' || // home position (cursor) - buf[i+2] == 'J' || // clear screen - buf[i+2] == 'A' || // up 1 line - buf[i+2] == 'B' || // down 1 line - buf[i+2] == 'C' || // right 1 position - buf[i+2] == 'D' || // left 1 position - buf[i+2] == 'G')) { // center cursor (windows) - for (j = i; buf[j]; j++) - buf[j] = buf[j+3]; - } else if (buf[i] == 27 && buf[i+1] == '[' && buf[i+2] == '2' && buf[i+3] == 'J') { // clear screen - for (j = i; buf[j]; j++) - buf[j] = buf[j+4]; - } else if (buf[i] == 27 && buf[i+1] == '[' && buf[i+3] == '~' && - (buf[i+2] == '1' || // home (windows) - buf[i+2] == '2' || // insert (windows) - buf[i+2] == '3' || // del (windows) - buf[i+2] == '4' || // end (windows) - buf[i+2] == '5' || // pgup (windows) - buf[i+2] == '6')) { // pgdown (windows) - for (j = i; buf[j]; j++) - buf[j] = buf[j+4]; - } else { - // remove other control char. - for (j = i; buf[j]; j++) - buf[j] = buf[j+1]; - } - i--; - } - - // extract command name and parameters - memset(command, '\0', sizeof(command)); - memset(parameters, '\0', sizeof(parameters)); - sscanf(buf, "%1023s %[^\n]", command, parameters); - command[1023] = '\0'; - parameters[1023] = '\0'; - - // lowercase for command line - for (i = 0; command[i]; i++) - command[i] = tolower(command[i]); - - if (command[0] == '?' || strlen(command) == 0) { - if (defaultlanguage == 'F') { - strcpy(buf, "aide"); - strcpy(command, "aide"); - } else { - strcpy(buf, "help"); - strcpy(command, "help"); - } - } - - // Analyse of the command - check_command(command); // give complete name to the command +int prompt () +{ + int i, j; + char buf[1024]; + char *p; + + // while we don't wait new packets + while (bytes_to_read == 0) + { + // for help with the console colors look here: + // http://www.edoceo.com/liberum/?doc=printf-with-color + // some code explanation (used here): + // \033[2J : clear screen and go up/left (0, 0 position) + // \033[K : clear line from actual position to end of the line + // \033[0m : reset color parameter + // \033[1m : use bold for font + Iprintf ("\n"); + if (defaultlanguage == 'F') + { + Iprintf + ("\033[32mPour afficher les commandes, tapez 'Entr馥'.\033[0m\n"); + } + else + Iprintf ("\033[32mTo list the commands, type 'enter'.\033[0m\n"); + Iprintf ("\033[0;36mLadmin-> \033[0m"); + Iprintf ("\033[1m"); + fflush (stdout); + + // get command and parameter + memset (buf, '\0', sizeof (buf)); + fflush (stdin); + fgets (buf, 1023, stdin); + buf[1023] = '\0'; + + Iprintf ("\033[0m"); + fflush (stdout); + + if (!eathena_interactive_session && !strlen (buf)) + exit (0); + + // remove final \n + if ((p = strrchr (buf, '\n')) != NULL) + p[0] = '\0'; + // remove all control char + for (i = 0; buf[i]; i++) + if (buf[i] < 32) + { + // remove cursor control. + if (buf[i] == 27 && buf[i + 1] == '[' && (buf[i + 2] == 'H' || // home position (cursor) + buf[i + 2] == 'J' || // clear screen + buf[i + 2] == 'A' || // up 1 line + buf[i + 2] == 'B' || // down 1 line + buf[i + 2] == 'C' || // right 1 position + buf[i + 2] == 'D' || // left 1 position + buf[i + 2] == 'G')) + { // center cursor (windows) + for (j = i; buf[j]; j++) + buf[j] = buf[j + 3]; + } + else if (buf[i] == 27 && buf[i + 1] == '[' + && buf[i + 2] == '2' && buf[i + 3] == 'J') + { // clear screen + for (j = i; buf[j]; j++) + buf[j] = buf[j + 4]; + } + else if (buf[i] == 27 && buf[i + 1] == '[' && buf[i + 3] == '~' && (buf[i + 2] == '1' || // home (windows) + buf[i + 2] == '2' || // insert (windows) + buf[i + 2] == '3' || // del (windows) + buf[i + 2] == '4' || // end (windows) + buf[i + 2] == '5' || // pgup (windows) + buf + [i + + + 2] + == + '6')) + { // pgdown (windows) + for (j = i; buf[j]; j++) + buf[j] = buf[j + 4]; + } + else + { + // remove other control char. + for (j = i; buf[j]; j++) + buf[j] = buf[j + 1]; + } + i--; + } + + // extract command name and parameters + memset (command, '\0', sizeof (command)); + memset (parameters, '\0', sizeof (parameters)); + sscanf (buf, "%1023s %[^\n]", command, parameters); + command[1023] = '\0'; + parameters[1023] = '\0'; + + // lowercase for command line + for (i = 0; command[i]; i++) + command[i] = tolower (command[i]); + + if (command[0] == '?' || strlen (command) == 0) + { + if (defaultlanguage == 'F') + { + strcpy (buf, "aide"); + strcpy (command, "aide"); + } + else + { + strcpy (buf, "help"); + strcpy (command, "help"); + } + } - if (strlen(parameters) == 0) { - if (defaultlanguage == 'F') { - ladmin_log("Commande: '%s' (sans param鑼re)" RETCODE, command, parameters); - } else { - ladmin_log("Command: '%s' (without parameters)" RETCODE, command, parameters); - } - } else { - if (defaultlanguage == 'F') { - ladmin_log("Commande: '%s', param鑼res: '%s'" RETCODE, command, parameters); - } else { - ladmin_log("Command: '%s', parameters: '%s'" RETCODE, command, parameters); - } - } + // Analyse of the command + check_command (command); // give complete name to the command + + if (strlen (parameters) == 0) + { + if (defaultlanguage == 'F') + { + ladmin_log ("Commande: '%s' (sans param鑼re)" RETCODE, + command, parameters); + } + else + { + ladmin_log ("Command: '%s' (without parameters)" RETCODE, + command, parameters); + } + } + else + { + if (defaultlanguage == 'F') + { + ladmin_log ("Commande: '%s', param鑼res: '%s'" RETCODE, + command, parameters); + } + else + { + ladmin_log ("Command: '%s', parameters: '%s'" RETCODE, + command, parameters); + } + } - // Analyse of the command + // Analyse of the command // help - if (strcmp(command, "aide") == 0) { - display_help(parameters, 1); // 1: french - } else if (strcmp(command, "help") == 0 ) { - display_help(parameters, 0); // 0: english + if (strcmp (command, "aide") == 0) + { + display_help (parameters, 1); // 1: french + } + else if (strcmp (command, "help") == 0) + { + display_help (parameters, 0); // 0: english // general commands - } else if (strcmp(command, "add") == 0) { - addaccount(parameters, 0); // 0: no email - } else if (strcmp(command, "ban") == 0) { - banaccount(parameters); - } else if (strcmp(command, "banadd") == 0) { - banaddaccount(parameters); - } else if (strcmp(command, "banset") == 0) { - bansetaccount(parameters); - } else if (strcmp(command, "block") == 0) { - blockaccount(parameters); - } else if (strcmp(command, "check") == 0) { - checkaccount(parameters); - } else if (strcmp(command, "create") == 0) { - addaccount(parameters, 1); // 1: with email - } else if (strcmp(command, "delete") == 0) { - delaccount(parameters); - } else if (strcmp(command, "email") == 0) { - changeemail(parameters); - } else if (strcmp(command, "getcount") == 0) { - getlogincount(); - } else if (strcmp(command, "gm") == 0) { - changegmlevel(parameters); - } else if (strcmp(command, "id") == 0) { - idaccount(parameters); - } else if (strcmp(command, "info") == 0) { - infoaccount(atoi(parameters)); - } else if (strcmp(command, "kami") == 0) { - sendbroadcast(0, parameters); // flag for normal - } else if (strcmp(command, "kamib") == 0) { - sendbroadcast(0x10, parameters); // flag for blue - } else if (strcmp(command, "language") == 0) { - changelanguage(parameters); - } else if (strcmp(command, "itemfrob") == 0) { - itemfrob(parameters); // 0: to list all - } else if (strcmp(command, "list") == 0) { - listaccount(parameters, 0); // 0: to list all - } else if (strcmp(command, "listban") == 0) { - listaccount(parameters, 3); // 3: to list only accounts with state or bannished - } else if (strcmp(command, "listgm") == 0) { - listaccount(parameters, 1); // 1: to list only GM - } else if (strcmp(command, "listok") == 0) { - listaccount(parameters, 4); // 4: to list only accounts without state and not bannished - } else if (strcmp(command, "memo") == 0) { - changememo(parameters); - } else if (strcmp(command, "name") == 0) { - nameaccount(atoi(parameters)); - } else if (strcmp(command, "password") == 0) { - changepasswd(parameters); - } else if (strcmp(command, "reloadgm") == 0) { - reloadGM(); - } else if (strcmp(command, "search") == 0) { // no regex in C version - listaccount(parameters, 2); // 2: to list with pattern - } else if (strcmp(command, "sex") == 0) { - changesex(parameters); - } else if (strcmp(command, "state") == 0) { - changestate(parameters); - } else if (strcmp(command, "timeadd") == 0) { - timeaddaccount(parameters); - } else if (strcmp(command, "timeset") == 0) { - timesetaccount(parameters); - } else if (strcmp(command, "unban") == 0) { - unbanaccount(parameters); - } else if (strcmp(command, "unblock") == 0) { - unblockaccount(parameters); - } else if (strcmp(command, "version") == 0) { - checkloginversion(); - } else if (strcmp(command, "who") == 0) { - whoaccount(parameters); + } + else if (strcmp (command, "add") == 0) + { + addaccount (parameters, 0); // 0: no email + } + else if (strcmp (command, "ban") == 0) + { + banaccount (parameters); + } + else if (strcmp (command, "banadd") == 0) + { + banaddaccount (parameters); + } + else if (strcmp (command, "banset") == 0) + { + bansetaccount (parameters); + } + else if (strcmp (command, "block") == 0) + { + blockaccount (parameters); + } + else if (strcmp (command, "check") == 0) + { + checkaccount (parameters); + } + else if (strcmp (command, "create") == 0) + { + addaccount (parameters, 1); // 1: with email + } + else if (strcmp (command, "delete") == 0) + { + delaccount (parameters); + } + else if (strcmp (command, "email") == 0) + { + changeemail (parameters); + } + else if (strcmp (command, "getcount") == 0) + { + getlogincount (); + } + else if (strcmp (command, "gm") == 0) + { + changegmlevel (parameters); + } + else if (strcmp (command, "id") == 0) + { + idaccount (parameters); + } + else if (strcmp (command, "info") == 0) + { + infoaccount (atoi (parameters)); + } + else if (strcmp (command, "kami") == 0) + { + sendbroadcast (0, parameters); // flag for normal + } + else if (strcmp (command, "kamib") == 0) + { + sendbroadcast (0x10, parameters); // flag for blue + } + else if (strcmp (command, "language") == 0) + { + changelanguage (parameters); + } + else if (strcmp (command, "itemfrob") == 0) + { + itemfrob (parameters); // 0: to list all + } + else if (strcmp (command, "list") == 0) + { + listaccount (parameters, 0); // 0: to list all + } + else if (strcmp (command, "listban") == 0) + { + listaccount (parameters, 3); // 3: to list only accounts with state or bannished + } + else if (strcmp (command, "listgm") == 0) + { + listaccount (parameters, 1); // 1: to list only GM + } + else if (strcmp (command, "listok") == 0) + { + listaccount (parameters, 4); // 4: to list only accounts without state and not bannished + } + else if (strcmp (command, "memo") == 0) + { + changememo (parameters); + } + else if (strcmp (command, "name") == 0) + { + nameaccount (atoi (parameters)); + } + else if (strcmp (command, "password") == 0) + { + changepasswd (parameters); + } + else if (strcmp (command, "reloadgm") == 0) + { + reloadGM (); + } + else if (strcmp (command, "search") == 0) + { // no regex in C version + listaccount (parameters, 2); // 2: to list with pattern + } + else if (strcmp (command, "sex") == 0) + { + changesex (parameters); + } + else if (strcmp (command, "state") == 0) + { + changestate (parameters); + } + else if (strcmp (command, "timeadd") == 0) + { + timeaddaccount (parameters); + } + else if (strcmp (command, "timeset") == 0) + { + timesetaccount (parameters); + } + else if (strcmp (command, "unban") == 0) + { + unbanaccount (parameters); + } + else if (strcmp (command, "unblock") == 0) + { + unblockaccount (parameters); + } + else if (strcmp (command, "version") == 0) + { + checkloginversion (); + } + else if (strcmp (command, "who") == 0) + { + whoaccount (parameters); // quit - } else if (strcmp(command, "quit") == 0 || - strcmp(command, "exit") == 0 || - strcmp(command, "end") == 0) { - if (defaultlanguage == 'F') { - printf("Au revoir.\n"); - } else { - printf("Bye.\n"); - } - exit(0); + } + else if (strcmp (command, "quit") == 0 || + strcmp (command, "exit") == 0 || + strcmp (command, "end") == 0) + { + if (defaultlanguage == 'F') + { + printf ("Au revoir.\n"); + } + else + { + printf ("Bye.\n"); + } + exit (0); // unknown command - } else { - if (defaultlanguage == 'F') { - printf("Commande inconnue [%s].\n", buf); - ladmin_log("Commande inconnue [%s]." RETCODE, buf); - } else { - printf("Unknown command [%s].\n", buf); - ladmin_log("Unknown command [%s]." RETCODE, buf); - } - } - } + } + else + { + if (defaultlanguage == 'F') + { + printf ("Commande inconnue [%s].\n", buf); + ladmin_log ("Commande inconnue [%s]." RETCODE, buf); + } + else + { + printf ("Unknown command [%s].\n", buf); + ladmin_log ("Unknown command [%s]." RETCODE, buf); + } + } + } - return 0; + return 0; } //------------------------------------------------------------- // Function: Parse receiving informations from the login-server //------------------------------------------------------------- -int parse_fromlogin(int fd) { - struct char_session_data *sd; - - if (session[fd]->eof) { - if (defaultlanguage == 'F') { - printf("Impossible de se connecter au serveur de login [%s:%d] !\n", loginserverip, loginserverport); - ladmin_log("Impossible de se connecter au serveur de login [%s:%d] !" RETCODE, loginserverip, loginserverport); - } else { - printf("Impossible to have a connection with the login-server [%s:%d] !\n", loginserverip, loginserverport); - ladmin_log("Impossible to have a connection with the login-server [%s:%d] !" RETCODE, loginserverip, loginserverport); - } - close(fd); - delete_session(fd); - exit (0); - } - -// printf("parse_fromlogin : %d %d %d\n", fd, RFIFOREST(fd), RFIFOW(fd,0)); - sd = session[fd]->session_data; - - while(RFIFOREST(fd) >= 2) { - switch(RFIFOW(fd,0)) { - case 0x7919: // answer of a connection request - if (RFIFOREST(fd) < 3) - return 0; - if (RFIFOB(fd,2) != 0) { - if (defaultlanguage == 'F') { - printf("Erreur de login:\n"); - printf(" - mot de passe incorrect,\n"); - printf(" - syst鑪e d'administration non activ, ou\n"); - printf(" - IP non autoris馥.\n"); - ladmin_log("Erreur de login: mot de passe incorrect, syst鑪e d'administration non activ, ou IP non autoris馥." RETCODE); - } else { - printf("Error at login:\n"); - printf(" - incorrect password,\n"); - printf(" - administration system not activated, or\n"); - printf(" - unauthorised IP.\n"); - ladmin_log("Error at login: incorrect password, administration system not activated, or unauthorised IP." RETCODE); - } - session[fd]->eof = 1; - //bytes_to_read = 1; // not stop at prompt - } else { - if (defaultlanguage == 'F') { - printf("Connexion 騁ablie.\n"); - ladmin_log("Connexion 騁ablie." RETCODE); - printf("Lecture de la version du serveur de login...\n"); - ladmin_log("Lecture de la version du serveur de login..." RETCODE); - } else { - Iprintf("Established connection.\n"); - ladmin_log("Established connection." RETCODE); - Iprintf("Reading of the version of the login-server...\n"); - ladmin_log("Reading of the version of the login-server..." RETCODE); - } - //bytes_to_read = 1; // unchanged - checkloginversion(); - } - RFIFOSKIP(fd,3); - break; +int parse_fromlogin (int fd) +{ + struct char_session_data *sd; + + if (session[fd]->eof) + { + if (defaultlanguage == 'F') + { + printf + ("Impossible de se connecter au serveur de login [%s:%d] !\n", + loginserverip, loginserverport); + ladmin_log + ("Impossible de se connecter au serveur de login [%s:%d] !" + RETCODE, loginserverip, loginserverport); + } + else + { + printf + ("Impossible to have a connection with the login-server [%s:%d] !\n", + loginserverip, loginserverport); + ladmin_log + ("Impossible to have a connection with the login-server [%s:%d] !" + RETCODE, loginserverip, loginserverport); + } + close (fd); + delete_session (fd); + exit (0); + } + +// printf("parse_fromlogin : %d %d %d\n", fd, RFIFOREST(fd), RFIFOW(fd,0)); + sd = session[fd]->session_data; + + while (RFIFOREST (fd) >= 2) + { + switch (RFIFOW (fd, 0)) + { + case 0x7919: // answer of a connection request + if (RFIFOREST (fd) < 3) + return 0; + if (RFIFOB (fd, 2) != 0) + { + if (defaultlanguage == 'F') + { + printf ("Erreur de login:\n"); + printf (" - mot de passe incorrect,\n"); + printf + (" - syst鑪e d'administration non activ, ou\n"); + printf (" - IP non autoris馥.\n"); + ladmin_log + ("Erreur de login: mot de passe incorrect, syst鑪e d'administration non activ, ou IP non autoris馥." + RETCODE); + } + else + { + printf ("Error at login:\n"); + printf (" - incorrect password,\n"); + printf + (" - administration system not activated, or\n"); + printf (" - unauthorised IP.\n"); + ladmin_log + ("Error at login: incorrect password, administration system not activated, or unauthorised IP." + RETCODE); + } + session[fd]->eof = 1; + //bytes_to_read = 1; // not stop at prompt + } + else + { + if (defaultlanguage == 'F') + { + printf ("Connexion 騁ablie.\n"); + ladmin_log ("Connexion 騁ablie." RETCODE); + printf + ("Lecture de la version du serveur de login...\n"); + ladmin_log + ("Lecture de la version du serveur de login..." + RETCODE); + } + else + { + Iprintf ("Established connection.\n"); + ladmin_log ("Established connection." RETCODE); + Iprintf + ("Reading of the version of the login-server...\n"); + ladmin_log + ("Reading of the version of the login-server..." + RETCODE); + } + //bytes_to_read = 1; // unchanged + checkloginversion (); + } + RFIFOSKIP (fd, 3); + break; #ifdef PASSWORDENC - case 0x01dc: // answer of a coding key request - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - { - char md5str[64] = "", md5bin[32], md5key[RFIFOW(fd,2) - 4 + 1]; - memcpy(md5key, RFIFOP(fd,4), RFIFOW(fd,2) - 4); - md5key[sizeof(md5key)-1] = '0'; - if (passenc == 1) { - strncpy(md5str, RFIFOP(fd,4), RFIFOW(fd,2) - 4); - strcat(md5str, loginserveradminpassword); - } else if (passenc == 2) { - strncpy(md5str, loginserveradminpassword, sizeof(loginserveradminpassword)); - strcat(md5str, RFIFOP(fd,4)); - } - MD5_String2binary(md5str, md5bin); - WFIFOW(login_fd,0) = 0x7918; // Request for administation login (encrypted password) - WFIFOW(login_fd,2) = passenc; // Encrypted type - memcpy(WFIFOP(login_fd,4), md5bin, 16); - WFIFOSET(login_fd,20); - if (defaultlanguage == 'F') { - Iprintf("R馗eption de la clef MD5.\n"); - ladmin_log("R馗eption de la clef MD5." RETCODE); - Iprintf("Envoi du mot de passe crypt...\n"); - ladmin_log("Envoi du mot de passe crypt..." RETCODE); - } else { - Iprintf("Receiving of the MD5 key.\n"); - ladmin_log("Receiving of the MD5 key." RETCODE); - Iprintf("Sending of the encrypted password...\n"); - ladmin_log("Sending of the encrypted password..." RETCODE); - } - } - bytes_to_read = 1; - RFIFOSKIP(fd,RFIFOW(fd,2)); - break; + case 0x01dc: // answer of a coding key request + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + { + char md5str[64] = + "", md5bin[32], md5key[RFIFOW (fd, 2) - 4 + 1]; + memcpy (md5key, RFIFOP (fd, 4), RFIFOW (fd, 2) - 4); + md5key[sizeof (md5key) - 1] = '0'; + if (passenc == 1) + { + strncpy (md5str, RFIFOP (fd, 4), RFIFOW (fd, 2) - 4); + strcat (md5str, loginserveradminpassword); + } + else if (passenc == 2) + { + strncpy (md5str, loginserveradminpassword, + sizeof (loginserveradminpassword)); + strcat (md5str, RFIFOP (fd, 4)); + } + MD5_String2binary (md5str, md5bin); + WFIFOW (login_fd, 0) = 0x7918; // Request for administation login (encrypted password) + WFIFOW (login_fd, 2) = passenc; // Encrypted type + memcpy (WFIFOP (login_fd, 4), md5bin, 16); + WFIFOSET (login_fd, 20); + if (defaultlanguage == 'F') + { + Iprintf ("R馗eption de la clef MD5.\n"); + ladmin_log ("R馗eption de la clef MD5." RETCODE); + Iprintf ("Envoi du mot de passe crypt...\n"); + ladmin_log ("Envoi du mot de passe crypt..." + RETCODE); + } + else + { + Iprintf ("Receiving of the MD5 key.\n"); + ladmin_log ("Receiving of the MD5 key." RETCODE); + Iprintf ("Sending of the encrypted password...\n"); + ladmin_log ("Sending of the encrypted password..." + RETCODE); + } + } + bytes_to_read = 1; + RFIFOSKIP (fd, RFIFOW (fd, 2)); + break; #endif - case 0x7531: // Displaying of the version of the login-server - if (RFIFOREST(fd) < 10) - return 0; - Iprintf(" Login-Server [%s:%d]\n", loginserverip, loginserverport); - if (((int)RFIFOB(login_fd,5)) == 0) { - Iprintf(" eAthena version stable-%d.%d", (int)RFIFOB(login_fd,2), (int)RFIFOB(login_fd,3)); - } else { - Iprintf(" eAthena version dev-%d.%d", (int)RFIFOB(login_fd,2), (int)RFIFOB(login_fd,3)); - } - if (((int)RFIFOB(login_fd,4)) == 0) - Iprintf(" revision %d", (int)RFIFOB(login_fd,4)); - if (((int)RFIFOB(login_fd,6)) == 0) { - Iprintf("%d.\n", RFIFOW(login_fd,8)); - } else - Iprintf("-mod%d.\n", RFIFOW(login_fd,8)); - bytes_to_read = 0; - RFIFOSKIP(fd,10); - break; - - case 0x7925: // Itemfrob-OK - RFIFOSKIP(fd, 2); - bytes_to_read = 0; - break; - - case 0x7921: // Displaying of the list of accounts - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - if (RFIFOW(fd,2) < 5) { - if (defaultlanguage == 'F') { - ladmin_log(" R馗eption d'une liste des comptes vide." RETCODE); - if (list_count == 0) - printf("Aucun compte trouv.\n"); - else if (list_count == 1) - printf("1 compte trouv.\n"); - else - printf("%d comptes trouv駸.\n", list_count); - } else { - ladmin_log(" Receiving of a void accounts list." RETCODE); - if (list_count == 0) { - Iprintf("No account found.\n"); - } else if (list_count == 1) { - Iprintf("1 account found.\n"); - } else - Iprintf("%d accounts found.\n", list_count); - } - bytes_to_read = 0; - } else { - int i; - if (defaultlanguage == 'F') - ladmin_log(" R馗eption d'une liste des comptes." RETCODE); - else - ladmin_log(" Receiving of a accounts list." RETCODE); - for(i = 4; i < RFIFOW(fd,2); i += 38) { - int j; - char userid[24]; - char lower_userid[24]; - memcpy(userid, RFIFOP(fd,i + 5), sizeof(userid)); - userid[sizeof(userid)-1] = '\0'; - memset(lower_userid, '\0', sizeof(lower_userid)); - for (j = 0; userid[j]; j++) - lower_userid[j] = tolower(userid[j]); - list_first = RFIFOL(fd,i) + 1; - // here are checks... - if (list_type == 0 || - (list_type == 1 && RFIFOB(fd,i+4) > 0) || - (list_type == 2 && strstr(lower_userid, parameters) != NULL) || - (list_type == 3 && RFIFOL(fd,i+34) != 0) || - (list_type == 4 && RFIFOL(fd,i+34) == 0)) { - printf("%10d ", RFIFOL(fd,i)); - if (RFIFOB(fd,i+4) == 0) - printf(" "); - else - printf("%2d ", (int)RFIFOB(fd,i+4)); - printf("%-24s", userid); - if (defaultlanguage == 'F') { - if (RFIFOB(fd,i+29) == 0) - printf("%-5s ", "Femme"); - else if (RFIFOB(fd,i+29) == 1) - printf("%-5s ", "Male"); - else - printf("%-5s ", "Servr"); - } else { - if (RFIFOB(fd,i+29) == 0) - printf("%-5s ", "Femal"); - else if (RFIFOB(fd,i+29) == 1) - printf("%-5s ", "Male"); - else - printf("%-5s ", "Servr"); - } - printf("%6d ", RFIFOL(fd,i+30)); - switch(RFIFOL(fd,i+34)) { - case 0: - if (defaultlanguage == 'F') - printf("%-27s\n", "Compte Ok"); - else - printf("%-27s\n", "Account OK"); - break; - case 1: - printf("%-27s\n", "Unregistered ID"); - break; - case 2: - printf("%-27s\n", "Incorrect Password"); - break; - case 3: - printf("%-27s\n", "This ID is expired"); - break; - case 4: - printf("%-27s\n", "Rejected from Server"); - break; - case 5: - printf("%-27s\n", "Blocked by the GM Team"); // You have been blocked by the GM Team - break; - case 6: - printf("%-27s\n", "Your EXE file is too old"); // Your Game's EXE file is not the latest version - break; - case 7: - printf("%-27s\n", "Banishement or"); - printf(" Prohibited to login until...\n"); // You are Prohibited to log in until %s - break; - case 8: - printf("%-27s\n", "Server is over populated"); - break; - case 9: - printf("%-27s\n", "No MSG"); - break; - default: // 100 - printf("%-27s\n", "This ID is totally erased"); // This ID has been totally erased - break; - } - list_count++; - } - } - // asking of the following acounts - if (defaultlanguage == 'F') - ladmin_log("Envoi d'un requ黎e au serveur de logins pour obtenir la liste des comptes de %d %d (compl駑ent)." RETCODE, list_first, list_last); - else - ladmin_log("Request to login-server to obtain the list of accounts from %d to %d (complement)." RETCODE, list_first, list_last); - WFIFOW(login_fd,0) = 0x7920; - WFIFOL(login_fd,2) = list_first; - WFIFOL(login_fd,6) = list_last; - WFIFOSET(login_fd,10); - bytes_to_read = 1; - } - RFIFOSKIP(fd,RFIFOW(fd,2)); - break; - - case 0x7931: // Answer of login-server about an account creation - if (RFIFOREST(fd) < 30) - return 0; - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Echec la cr饌tion du compte [%s]. Un compte identique existe d駛.\n", RFIFOP(fd,6)); - ladmin_log("Echec la cr饌tion du compte [%s]. Un compte identique existe d駛." RETCODE, RFIFOP(fd,6)); - } else { - printf("Account [%s] creation failed. Same account already exists.\n", RFIFOP(fd,6)); - ladmin_log("Account [%s] creation failed. Same account already exists." RETCODE, RFIFOP(fd,6)); - } - } else { - if (defaultlanguage == 'F') { - printf("Compte [%s] cr鳬 avec succ鑚 [id: %d].\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Compte [%s] cr鳬 avec succ鑚 [id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } else { - printf("Account [%s] is successfully created [id: %d].\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Account [%s] is successfully created [id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,30); - break; - - case 0x7933: // Answer of login-server about an account deletion - if (RFIFOREST(fd) < 30) - return 0; - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Echec de la suppression du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6)); - ladmin_log("Echec de la suppression du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6)); - } else { - printf("Account [%s] deletion failed. Account doesn't exist.\n", RFIFOP(fd,6)); - ladmin_log("Account [%s] deletion failed. Account doesn't exist." RETCODE, RFIFOP(fd,6)); - } - } else { - if (defaultlanguage == 'F') { - printf("Compte [%s][id: %d] SUPPRIME avec succ鑚.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Compte [%s][id: %d] SUPPRIME avec succ鑚." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } else { - printf("Account [%s][id: %d] is successfully DELETED.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Account [%s][id: %d] is successfully DELETED." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,30); - break; - - case 0x7935: // answer of the change of an account password - if (RFIFOREST(fd) < 30) - return 0; - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Echec de la modification du mot de passe du compte [%s].\n", RFIFOP(fd,6)); - printf("Le compte [%s] n'existe pas.\n", RFIFOP(fd,6)); - ladmin_log("Echec de la modification du mot de passe du compte. Le compte [%s] n'existe pas." RETCODE, RFIFOP(fd,6)); - } else { - printf("Account [%s] password changing failed.\n", RFIFOP(fd,6)); - printf("Account [%s] doesn't exist.\n", RFIFOP(fd,6)); - ladmin_log("Account password changing failed. The compte [%s] doesn't exist." RETCODE, RFIFOP(fd,6)); - } - } else { - if (defaultlanguage == 'F') { - printf("Modification du mot de passe du compte [%s][id: %d] r騏ssie.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Modification du mot de passe du compte [%s][id: %d] r騏ssie." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } else { - printf("Account [%s][id: %d] password successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Account [%s][id: %d] password successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,30); - break; - - case 0x7937: // answer of the change of an account state - if (RFIFOREST(fd) < 34) - return 0; - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Echec du changement du statut du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6)); - ladmin_log("Echec du changement du statut du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6)); - } else { - printf("Account [%s] state changing failed. Account doesn't exist.\n", RFIFOP(fd,6)); - ladmin_log("Account [%s] state changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6)); - } - } else { - char tmpstr[256]; - if (defaultlanguage == 'F') { - sprintf(tmpstr, "Statut du compte [%s] chang avec succ鑚 en [", RFIFOP(fd,6)); - } else { - sprintf(tmpstr, "Account [%s] state successfully changed in [", RFIFOP(fd,6)); - } - switch(RFIFOL(fd,30)) { - case 0: - if (defaultlanguage == 'F') - strcat(tmpstr, "0: Compte Ok"); - else - strcat(tmpstr, "0: Account OK"); - break; - case 1: - strcat(tmpstr, "1: Unregistered ID"); - break; - case 2: - strcat(tmpstr, "2: Incorrect Password"); - break; - case 3: - strcat(tmpstr, "3: This ID is expired"); - break; - case 4: - strcat(tmpstr, "4: Rejected from Server"); - break; - case 5: - strcat(tmpstr, "5: You have been blocked by the GM Team"); - break; - case 6: - strcat(tmpstr, "6: [Your Game's EXE file is not the latest version"); - break; - case 7: - strcat(tmpstr, "7: You are Prohibited to log in until..."); - break; - case 8: - strcat(tmpstr, "8: Server is jammed due to over populated"); - break; - case 9: - strcat(tmpstr, "9: No MSG"); - break; - default: // 100 - strcat(tmpstr, "100: This ID is totally erased"); - break; - } - strcat(tmpstr, "]"); - printf("%s\n", tmpstr); - ladmin_log("%s%s", tmpstr, RETCODE); - } - bytes_to_read = 0; - RFIFOSKIP(fd,34); - break; - - case 0x7939: // answer of the number of online players - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - { - // Get length of the received packet - int i; - char name[20]; - if (defaultlanguage == 'F') { - ladmin_log(" R馗eption du nombre de joueurs en ligne." RETCODE); - } else { - ladmin_log(" Receiving of the number of online players." RETCODE); - } - // Read information of the servers - if (RFIFOW(fd,2) < 5) { - if (defaultlanguage == 'F') { - printf(" Aucun serveur n'est connect au login serveur.\n"); - } else { - printf(" No server is connected to the login-server.\n"); - } - } else { - if (defaultlanguage == 'F') { - printf(" Nombre de joueurs en ligne (serveur: nb):\n"); - } else { - printf(" Number of online players (server: number).\n"); - } - // Displaying of result - for(i = 4; i < RFIFOW(fd,2); i += 32) { - memcpy(name, RFIFOP(fd,i+6), sizeof(name)); - name[sizeof(name) - 1] = '\0'; - printf(" %-20s : %5d\n", name, RFIFOW(fd,i+26)); - } - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,RFIFOW(fd,2)); - break; - - case 0x793b: // answer of the check of a password - if (RFIFOREST(fd) < 30) - return 0; - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Le compte [%s] n'existe pas ou le mot de passe est incorrect.\n", RFIFOP(fd,6)); - ladmin_log("Le compte [%s] n'existe pas ou le mot de passe est incorrect." RETCODE, RFIFOP(fd,6)); - } else { - printf("The account [%s] doesn't exist or the password is incorrect.\n", RFIFOP(fd,6)); - ladmin_log("The account [%s] doesn't exist or the password is incorrect." RETCODE, RFIFOP(fd,6)); - } - } else { - if (defaultlanguage == 'F') { - printf("Le mot de passe donn correspond bien au compte [%s][id: %d].\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Le mot de passe donn correspond bien au compte [%s][id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } else { - printf("The proposed password is correct for the account [%s][id: %d].\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("The proposed password is correct for the account [%s][id: %d]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,30); - break; - - case 0x793d: // answer of the change of an account sex - if (RFIFOREST(fd) < 30) - return 0; - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Echec de la modification du sexe du compte [%s].\n", RFIFOP(fd,6)); - printf("Le compte [%s] n'existe pas ou le sexe est d駛 celui demand.\n", RFIFOP(fd,6)); - ladmin_log("Echec de la modification du sexe du compte. Le compte [%s] n'existe pas ou le sexe est d駛 celui demand." RETCODE, RFIFOP(fd,6)); - } else { - printf("Account [%s] sex changing failed.\n", RFIFOP(fd,6)); - printf("Account [%s] doesn't exist or the sex is already the good sex.\n", RFIFOP(fd,6)); - ladmin_log("Account sex changing failed. The compte [%s] doesn't exist or the sex is already the good sex." RETCODE, RFIFOP(fd,6)); - } - } else { - if (defaultlanguage == 'F') { - printf("Sexe du compte [%s][id: %d] chang avec succ鑚.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Sexe du compte [%s][id: %d] chang avec succ鑚." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } else { - printf("Account [%s][id: %d] sex successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Account [%s][id: %d] sex successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,30); - break; - - case 0x793f: // answer of the change of an account GM level - if (RFIFOREST(fd) < 30) - return 0; - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Echec de la modification du niveau de GM du compte [%s].\n", RFIFOP(fd,6)); - printf("Le compte [%s] n'existe pas, le niveau de GM est d駛 celui demand饅n", RFIFOP(fd,6)); - printf("ou il est impossible de modifier le fichier des comptes GM.\n"); - ladmin_log("Echec de la modification du niveau de GM du compte. Le compte [%s] n'existe pas, le niveau de GM est d駛 celui demand ou il est impossible de modifier le fichier des comptes GM." RETCODE, RFIFOP(fd,6)); - } else { - printf("Account [%s] GM level changing failed.\n", RFIFOP(fd,6)); - printf("Account [%s] doesn't exist, the GM level is already the good GM level\n", RFIFOP(fd,6)); - printf("or it's impossible to modify the GM accounts file.\n"); - ladmin_log("Account GM level changing failed. The compte [%s] doesn't exist, the GM level is already the good sex or it's impossible to modify the GM accounts file." RETCODE, RFIFOP(fd,6)); - } - } else { - if (defaultlanguage == 'F') { - printf("Niveau de GM du compte [%s][id: %d] chang avec succ鑚.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Niveau de GM du compte [%s][id: %d] chang avec succ鑚." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } else { - printf("Account [%s][id: %d] GM level successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Account [%s][id: %d] GM level successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,30); - break; - - case 0x7941: // answer of the change of an account email - if (RFIFOREST(fd) < 30) - return 0; - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Echec de la modification de l'e-mail du compte [%s].\n", RFIFOP(fd,6)); - printf("Le compte [%s] n'existe pas.\n", RFIFOP(fd,6)); - ladmin_log("Echec de la modification de l'e-mail du compte. Le compte [%s] n'existe pas." RETCODE, RFIFOP(fd,6)); - } else { - printf("Account [%s] e-mail changing failed.\n", RFIFOP(fd,6)); - printf("Account [%s] doesn't exist.\n", RFIFOP(fd,6)); - ladmin_log("Account e-mail changing failed. The compte [%s] doesn't exist." RETCODE, RFIFOP(fd,6)); - } - } else { - if (defaultlanguage == 'F') { - printf("Modification de l'e-mail du compte [%s][id: %d] r騏ssie.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Modification de l'e-mail du compte [%s][id: %d] r騏ssie." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } else { - printf("Account [%s][id: %d] e-mail successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Account [%s][id: %d] e-mail successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,30); - break; - - case 0x7943: // answer of the change of an account memo - if (RFIFOREST(fd) < 30) - return 0; - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Echec du changement du m駑o du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6)); - ladmin_log("Echec du changement du m駑o du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6)); - } else { - printf("Account [%s] memo changing failed. Account doesn't exist.\n", RFIFOP(fd,6)); - ladmin_log("Account [%s] memo changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6)); - } - } else { - if (defaultlanguage == 'F') { - printf("M駑o du compte [%s][id: %d] chang avec succ鑚.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("M駑o du compte [%s][id: %d] chang avec succ鑚." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } else { - printf("Account [%s][id: %d] memo successfully changed.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Account [%s][id: %d] memo successfully changed." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,30); - break; - - case 0x7945: // answer of an account id search - if (RFIFOREST(fd) < 30) - return 0; - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Impossible de trouver l'id du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6)); - ladmin_log("Impossible de trouver l'id du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6)); - } else { - printf("Unable to find the account [%s] id. Account doesn't exist.\n", RFIFOP(fd,6)); - ladmin_log("Unable to find the account [%s] id. Account doesn't exist." RETCODE, RFIFOP(fd,6)); - } - } else { - if (defaultlanguage == 'F') { - printf("Le compte [%s] a pour id: %d.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Le compte [%s] a pour id: %d." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } else { - printf("The account [%s] have the id: %d.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("The account [%s] have the id: %d." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,30); - break; - - case 0x7947: // answer of an account name search - if (RFIFOREST(fd) < 30) - return 0; - if (strcmp(RFIFOP(fd,6), "") == 0) { - if (defaultlanguage == 'F') { - printf("Impossible de trouver le nom du compte [%d]. Le compte n'existe pas.\n", RFIFOL(fd,2)); - ladmin_log("Impossible de trouver le nom du compte [%d]. Le compte n'existe pas." RETCODE, RFIFOL(fd,2)); - } else { - printf("Unable to find the account [%d] name. Account doesn't exist.\n", RFIFOL(fd,2)); - ladmin_log("Unable to find the account [%d] name. Account doesn't exist." RETCODE, RFIFOL(fd,2)); - } - } else { - if (defaultlanguage == 'F') { - printf("Le compte [id: %d] a pour nom: %s.\n", RFIFOL(fd,2), RFIFOP(fd,6)); - ladmin_log("Le compte [id: %d] a pour nom: %s." RETCODE, RFIFOL(fd,2), RFIFOP(fd,6)); - } else { - printf("The account [id: %d] have the name: %s.\n", RFIFOL(fd,2), RFIFOP(fd,6)); - ladmin_log("The account [id: %d] have the name: %s." RETCODE, RFIFOL(fd,2), RFIFOP(fd,6)); - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,30); - break; - - case 0x7949: // answer of an account validity limit set - if (RFIFOREST(fd) < 34) - return 0; - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Echec du changement de la validit du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6)); - ladmin_log("Echec du changement de la validit du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6)); - } else { - printf("Account [%s] validity limit changing failed. Account doesn't exist.\n", RFIFOP(fd,6)); - ladmin_log("Account [%s] validity limit changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6)); - } - } else { - time_t timestamp = RFIFOL(fd,30); - if (timestamp == 0) { - if (defaultlanguage == 'F') { - printf("Limite de validit du compte [%s][id: %d] chang馥 avec succ鑚 en [illimit饐.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Limite de validit du compte [%s][id: %d] chang馥 avec succ鑚 en [illimit饐." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } else { - printf("Validity Limit of the account [%s][id: %d] successfully changed to [unlimited].\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Validity Limit of the account [%s][id: %d] successfully changed to [unlimited]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } - } else { - char tmpstr[128]; - strftime(tmpstr, 24, date_format, localtime(×tamp)); - if (defaultlanguage == 'F') { - printf("Limite de validit du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - ladmin_log("Limite de validit du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - } else { - printf("Validity Limit of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - ladmin_log("Validity Limit of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - } - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,34); - break; - - case 0x794b: // answer of an account ban set - if (RFIFOREST(fd) < 34) - return 0; - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6)); - ladmin_log("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6)); - } else { - printf("Account [%s] final date of banishment changing failed. Account doesn't exist.\n", RFIFOP(fd,6)); - ladmin_log("Account [%s] final date of banishment changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6)); - } - } else { - time_t timestamp = RFIFOL(fd,30); - if (timestamp == 0) { - if (defaultlanguage == 'F') { - printf("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 en [d-bannie].\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 en [d-bannie]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } else { - printf("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished].\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } - } else { - char tmpstr[128]; - strftime(tmpstr, 24, date_format, localtime(×tamp)); - if (defaultlanguage == 'F') { - printf("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - ladmin_log("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - } else { - printf("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - } - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,34); - break; - - case 0x794d: // answer of an account ban date/time changing - if (RFIFOREST(fd) < 34) - return 0; - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6)); - ladmin_log("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6)); - } else { - printf("Account [%s] final date of banishment changing failed. Account doesn't exist.\n", RFIFOP(fd,6)); - ladmin_log("Account [%s] final date of banishment changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6)); - } - } else { - time_t timestamp = RFIFOL(fd,30); - if (timestamp == 0) { - if (defaultlanguage == 'F') { - printf("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 en [d-bannie].\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 en [d-bannie]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } else { - printf("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished].\n", RFIFOP(fd,6), RFIFOL(fd,2)); - ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished]." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } - } else { - char tmpstr[128]; - strftime(tmpstr, 24, date_format, localtime(×tamp)); - if (defaultlanguage == 'F') { - printf("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - ladmin_log("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - } else { - printf("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - ladmin_log("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - } - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,34); - break; - - case 0x794f: // answer of a broadcast - if (RFIFOREST(fd) < 4) - return 0; - if (RFIFOW(fd,2) == (unsigned short)-1) { - if (defaultlanguage == 'F') { - printf("Echec de l'envoi du message. Aucun server de char en ligne.\n"); - ladmin_log("Echec de l'envoi du message. Aucun server de char en ligne." RETCODE); - } else { - printf("Message sending failed. No online char-server.\n"); - ladmin_log("Message sending failed. No online char-server." RETCODE); - } - } else { - if (defaultlanguage == 'F') { - printf("Message transmis au server de logins avec succ鑚.\n"); - ladmin_log("Message transmis au server de logins avec succ鑚." RETCODE); - } else { - printf("Message successfully sended to login-server.\n"); - ladmin_log("Message successfully sended to login-server." RETCODE); - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,4); - break; - - case 0x7951: // answer of an account validity limit changing - if (RFIFOREST(fd) < 34) - return 0; - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Echec du changement de la validit du compte [%s]. Le compte n'existe pas.\n", RFIFOP(fd,6)); - ladmin_log("Echec du changement de la validit du compte [%s]. Le compte n'existe pas." RETCODE, RFIFOP(fd,6)); - } else { - printf("Account [%s] validity limit changing failed. Account doesn't exist.\n", RFIFOP(fd,6)); - ladmin_log("Account [%s] validity limit changing failed. Account doesn't exist." RETCODE, RFIFOP(fd,6)); - } - } else { - time_t timestamp = RFIFOL(fd,30); - if (timestamp == 0) { - if (defaultlanguage == 'F') { - printf("Limite de validit du compte [%s][id: %d] inchang馥.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - printf("Le compte a une validit illimit馥 ou\n"); - printf("la modification est impossible avec les ajustements demand駸.\n"); - ladmin_log("Limite de validit du compte [%s][id: %d] inchang馥. Le compte a une validit illimit馥 ou la modification est impossible avec les ajustements demand駸." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } else { - printf("Validity limit of the account [%s][id: %d] unchanged.\n", RFIFOP(fd,6), RFIFOL(fd,2)); - printf("The account have an unlimited validity limit or\n"); - printf("the changing is impossible with the proposed adjustments.\n"); - ladmin_log("Validity limit of the account [%s][id: %d] unchanged. The account have an unlimited validity limit or the changing is impossible with the proposed adjustments." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2)); - } - } else { - char tmpstr[128]; - strftime(tmpstr, 24, date_format, localtime(×tamp)); - if (defaultlanguage == 'F') { - printf("Limite de validit du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - ladmin_log("Limite de validit du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - } else { - printf("Validity limit of the account [%s][id: %d] successfully changed to be until %s.\n", RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - ladmin_log("Validity limit of the account [%s][id: %d] successfully changed to be until %s." RETCODE, RFIFOP(fd,6), RFIFOL(fd,2), tmpstr); - } - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,34); - break; - - case 0x7953: // answer of a request about informations of an account (by account name/id) - if (RFIFOREST(fd) < 150 || RFIFOREST(fd) < (150 + RFIFOW(fd,148))) - return 0; - { - char userid[24], error_message[20], lastlogin[24], last_ip[16], email[40], memo[255]; - time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban) - time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) - memcpy(userid, RFIFOP(fd,7), sizeof(userid)); - userid[sizeof(userid)-1] = '\0'; - memcpy(error_message, RFIFOP(fd,40), sizeof(error_message)); - error_message[sizeof(error_message)-1] = '\0'; - memcpy(lastlogin, RFIFOP(fd,60), sizeof(lastlogin)); - lastlogin[sizeof(lastlogin)-1] = '\0'; - memcpy(last_ip, RFIFOP(fd,84), sizeof(last_ip)); - last_ip[sizeof(last_ip)-1] = '\0'; - memcpy(email, RFIFOP(fd,100), sizeof(email)); - email[sizeof(email)-1] = '\0'; - connect_until_time = (time_t)RFIFOL(fd,140); - ban_until_time = (time_t)RFIFOL(fd,144); - memset(memo, '\0', sizeof(memo)); - strncpy(memo, RFIFOP(fd,150), RFIFOW(fd,148)); - if (RFIFOL(fd,2) == -1) { - if (defaultlanguage == 'F') { - printf("Impossible de trouver le compte [%s]. Le compte n'existe pas.\n", parameters); - ladmin_log("Impossible de trouver le compte [%s]. Le compte n'existe pas." RETCODE, parameters); - } else { - printf("Unabled to find the account [%s]. Account doesn't exist.\n", parameters); - ladmin_log("Unabled to find the account [%s]. Account doesn't exist." RETCODE, parameters); - } - } else if (strlen(userid) == 0) { - if (defaultlanguage == 'F') { - printf("Impossible de trouver le compte [id: %s]. Le compte n'existe pas.\n", parameters); - ladmin_log("Impossible de trouver le compte [id: %s]. Le compte n'existe pas." RETCODE, parameters); - } else { - printf("Unabled to find the account [id: %s]. Account doesn't exist.\n", parameters); - ladmin_log("Unabled to find the account [id: %s]. Account doesn't exist." RETCODE, parameters); - } - } else { - if (defaultlanguage == 'F') { - ladmin_log("R馗eption d'information concernant un compte." RETCODE); - printf("Le compte a les caract駻istiques suivantes:\n"); - } else { - ladmin_log("Receiving information about an account." RETCODE); - printf("The account is set with:\n"); - } - if (RFIFOB(fd,6) == 0) { - printf(" Id: %d (non-GM)\n", RFIFOL(fd,2)); - } else { - if (defaultlanguage == 'F') { - printf(" Id: %d (GM niveau %d)\n", RFIFOL(fd,2), (int)RFIFOB(fd,6)); - } else { - printf(" Id: %d (GM level %d)\n", RFIFOL(fd,2), (int)RFIFOB(fd,6)); - } - } - if (defaultlanguage == 'F') { - printf(" Nom: '%s'\n", userid); - if (RFIFOB(fd,31) == 0) - printf(" Sexe: Femme\n"); - else if (RFIFOB(fd,31) == 1) - printf(" Sexe: Male\n"); - else - printf(" Sexe: Serveur\n"); - } else { - printf(" Name: '%s'\n", userid); - if (RFIFOB(fd,31) == 0) - printf(" Sex: Female\n"); - else if (RFIFOB(fd,31) == 1) - printf(" Sex: Male\n"); - else - printf(" Sex: Server\n"); - } - printf(" E-mail: %s\n", email); - switch(RFIFOL(fd,36)) { - case 0: - if (defaultlanguage == 'F') - printf(" Statut: 0 [Compte Ok]\n"); - else - printf(" Statut: 0 [Account OK]\n"); - break; - case 1: - printf(" Statut: 1 [Unregistered ID]\n"); - break; - case 2: - printf(" Statut: 2 [Incorrect Password]\n"); - break; - case 3: - printf(" Statut: 3 [This ID is expired]\n"); - break; - case 4: - printf(" Statut: 4 [Rejected from Server]\n"); - break; - case 5: - printf(" Statut: 5 [You have been blocked by the GM Team]\n"); - break; - case 6: - printf(" Statut: 6 [Your Game's EXE file is not the latest version]\n"); - break; - case 7: - printf(" Statut: 7 [You are Prohibited to log in until %s]\n", error_message); - break; - case 8: - printf(" Statut: 8 [Server is jammed due to over populated]\n"); - break; - case 9: - printf(" Statut: 9 [No MSG]\n"); - break; - default: // 100 - printf(" Statut: %d [This ID is totally erased]\n", RFIFOL(fd,36)); - break; - } - if (defaultlanguage == 'F') { - if (ban_until_time == 0) { - printf(" Banissement: non banni.\n"); - } else { - char tmpstr[128]; - strftime(tmpstr, 24, date_format, localtime(&ban_until_time)); - printf(" Banissement: jusqu'au %s.\n", tmpstr); - } - if (RFIFOL(fd,32) > 1) - printf(" Compteur: %d connexions.\n", RFIFOL(fd,32)); - else - printf(" Compteur: %d connexion.\n", RFIFOL(fd,32)); - printf(" Derni鑽e connexion le: %s (ip: %s)\n", lastlogin, last_ip); - if (connect_until_time == 0) { - printf(" Limite de validit: illimit.\n"); - } else { - char tmpstr[128]; - strftime(tmpstr, 24, date_format, localtime(&connect_until_time)); - printf(" Limite de validit: jusqu'au %s.\n", tmpstr); - } - } else { - if (ban_until_time == 0) { - printf(" Banishment: not banished.\n"); - } else { - char tmpstr[128]; - strftime(tmpstr, 24, date_format, localtime(&ban_until_time)); - printf(" Banishment: until %s.\n", tmpstr); - } - if (RFIFOL(fd,32) > 1) - printf(" Count: %d connections.\n", RFIFOL(fd,32)); - else - printf(" Count: %d connection.\n", RFIFOL(fd,32)); - printf(" Last connection at: %s (ip: %s)\n", lastlogin, last_ip); - if (connect_until_time == 0) { - printf(" Validity limit: unlimited.\n"); - } else { - char tmpstr[128]; - strftime(tmpstr, 24, date_format, localtime(&connect_until_time)); - printf(" Validity limit: until %s.\n", tmpstr); - } - } - printf(" Memo: '%s'\n", memo); - } - } - bytes_to_read = 0; - RFIFOSKIP(fd,150 + RFIFOW(fd,148)); - break; - - default: - printf("Remote administration has been disconnected (unknown packet).\n"); - ladmin_log("'End of connection, unknown packet." RETCODE); - session[fd]->eof = 1; - return 0; - } - } + case 0x7531: // Displaying of the version of the login-server + if (RFIFOREST (fd) < 10) + return 0; + Iprintf (" Login-Server [%s:%d]\n", loginserverip, + loginserverport); + if (((int) RFIFOB (login_fd, 5)) == 0) + { + Iprintf (" eAthena version stable-%d.%d", + (int) RFIFOB (login_fd, 2), + (int) RFIFOB (login_fd, 3)); + } + else + { + Iprintf (" eAthena version dev-%d.%d", + (int) RFIFOB (login_fd, 2), + (int) RFIFOB (login_fd, 3)); + } + if (((int) RFIFOB (login_fd, 4)) == 0) + Iprintf (" revision %d", (int) RFIFOB (login_fd, 4)); + if (((int) RFIFOB (login_fd, 6)) == 0) + { + Iprintf ("%d.\n", RFIFOW (login_fd, 8)); + } + else + Iprintf ("-mod%d.\n", RFIFOW (login_fd, 8)); + bytes_to_read = 0; + RFIFOSKIP (fd, 10); + break; + + case 0x7925: // Itemfrob-OK + RFIFOSKIP (fd, 2); + bytes_to_read = 0; + break; + + case 0x7921: // Displaying of the list of accounts + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + if (RFIFOW (fd, 2) < 5) + { + if (defaultlanguage == 'F') + { + ladmin_log + (" R馗eption d'une liste des comptes vide." + RETCODE); + if (list_count == 0) + printf ("Aucun compte trouv.\n"); + else if (list_count == 1) + printf ("1 compte trouv.\n"); + else + printf ("%d comptes trouv駸.\n", list_count); + } + else + { + ladmin_log (" Receiving of a void accounts list." + RETCODE); + if (list_count == 0) + { + Iprintf ("No account found.\n"); + } + else if (list_count == 1) + { + Iprintf ("1 account found.\n"); + } + else + Iprintf ("%d accounts found.\n", list_count); + } + bytes_to_read = 0; + } + else + { + int i; + if (defaultlanguage == 'F') + ladmin_log (" R馗eption d'une liste des comptes." + RETCODE); + else + ladmin_log (" Receiving of a accounts list." + RETCODE); + for (i = 4; i < RFIFOW (fd, 2); i += 38) + { + int j; + char userid[24]; + char lower_userid[24]; + memcpy (userid, RFIFOP (fd, i + 5), sizeof (userid)); + userid[sizeof (userid) - 1] = '\0'; + memset (lower_userid, '\0', sizeof (lower_userid)); + for (j = 0; userid[j]; j++) + lower_userid[j] = tolower (userid[j]); + list_first = RFIFOL (fd, i) + 1; + // here are checks... + if (list_type == 0 || + (list_type == 1 && RFIFOB (fd, i + 4) > 0) || + (list_type == 2 + && strstr (lower_userid, parameters) != NULL) + || (list_type == 3 && RFIFOL (fd, i + 34) != 0) + || (list_type == 4 && RFIFOL (fd, i + 34) == 0)) + { + printf ("%10d ", RFIFOL (fd, i)); + if (RFIFOB (fd, i + 4) == 0) + printf (" "); + else + printf ("%2d ", (int) RFIFOB (fd, i + 4)); + printf ("%-24s", userid); + if (defaultlanguage == 'F') + { + if (RFIFOB (fd, i + 29) == 0) + printf ("%-5s ", "Femme"); + else if (RFIFOB (fd, i + 29) == 1) + printf ("%-5s ", "Male"); + else + printf ("%-5s ", "Servr"); + } + else + { + if (RFIFOB (fd, i + 29) == 0) + printf ("%-5s ", "Femal"); + else if (RFIFOB (fd, i + 29) == 1) + printf ("%-5s ", "Male"); + else + printf ("%-5s ", "Servr"); + } + printf ("%6d ", RFIFOL (fd, i + 30)); + switch (RFIFOL (fd, i + 34)) + { + case 0: + if (defaultlanguage == 'F') + printf ("%-27s\n", "Compte Ok"); + else + printf ("%-27s\n", "Account OK"); + break; + case 1: + printf ("%-27s\n", "Unregistered ID"); + break; + case 2: + printf ("%-27s\n", "Incorrect Password"); + break; + case 3: + printf ("%-27s\n", "This ID is expired"); + break; + case 4: + printf ("%-27s\n", + "Rejected from Server"); + break; + case 5: + printf ("%-27s\n", "Blocked by the GM Team"); // You have been blocked by the GM Team + break; + case 6: + printf ("%-27s\n", "Your EXE file is too old"); // Your Game's EXE file is not the latest version + break; + case 7: + printf ("%-27s\n", "Banishement or"); + printf (" Prohibited to login until...\n"); // You are Prohibited to log in until %s + break; + case 8: + printf ("%-27s\n", + "Server is over populated"); + break; + case 9: + printf ("%-27s\n", "No MSG"); + break; + default: // 100 + printf ("%-27s\n", "This ID is totally erased"); // This ID has been totally erased + break; + } + list_count++; + } + } + // asking of the following acounts + if (defaultlanguage == 'F') + ladmin_log + ("Envoi d'un requ黎e au serveur de logins pour obtenir la liste des comptes de %d %d (compl駑ent)." + RETCODE, list_first, list_last); + else + ladmin_log + ("Request to login-server to obtain the list of accounts from %d to %d (complement)." + RETCODE, list_first, list_last); + WFIFOW (login_fd, 0) = 0x7920; + WFIFOL (login_fd, 2) = list_first; + WFIFOL (login_fd, 6) = list_last; + WFIFOSET (login_fd, 10); + bytes_to_read = 1; + } + RFIFOSKIP (fd, RFIFOW (fd, 2)); + break; + + case 0x7931: // Answer of login-server about an account creation + if (RFIFOREST (fd) < 30) + return 0; + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Echec la cr饌tion du compte [%s]. Un compte identique existe d駛.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Echec la cr饌tion du compte [%s]. Un compte identique existe d駛." + RETCODE, RFIFOP (fd, 6)); + } + else + { + printf + ("Account [%s] creation failed. Same account already exists.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Account [%s] creation failed. Same account already exists." + RETCODE, RFIFOP (fd, 6)); + } + } + else + { + if (defaultlanguage == 'F') + { + printf ("Compte [%s] cr鳬 avec succ鑚 [id: %d].\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log ("Compte [%s] cr鳬 avec succ鑚 [id: %d]." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + else + { + printf + ("Account [%s] is successfully created [id: %d].\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Account [%s] is successfully created [id: %d]." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 30); + break; + + case 0x7933: // Answer of login-server about an account deletion + if (RFIFOREST (fd) < 30) + return 0; + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Echec de la suppression du compte [%s]. Le compte n'existe pas.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Echec de la suppression du compte [%s]. Le compte n'existe pas." + RETCODE, RFIFOP (fd, 6)); + } + else + { + printf + ("Account [%s] deletion failed. Account doesn't exist.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Account [%s] deletion failed. Account doesn't exist." + RETCODE, RFIFOP (fd, 6)); + } + } + else + { + if (defaultlanguage == 'F') + { + printf ("Compte [%s][id: %d] SUPPRIME avec succ鑚.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Compte [%s][id: %d] SUPPRIME avec succ鑚." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + else + { + printf + ("Account [%s][id: %d] is successfully DELETED.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Account [%s][id: %d] is successfully DELETED." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 30); + break; + + case 0x7935: // answer of the change of an account password + if (RFIFOREST (fd) < 30) + return 0; + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Echec de la modification du mot de passe du compte [%s].\n", + RFIFOP (fd, 6)); + printf ("Le compte [%s] n'existe pas.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Echec de la modification du mot de passe du compte. Le compte [%s] n'existe pas." + RETCODE, RFIFOP (fd, 6)); + } + else + { + printf ("Account [%s] password changing failed.\n", + RFIFOP (fd, 6)); + printf ("Account [%s] doesn't exist.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Account password changing failed. The compte [%s] doesn't exist." + RETCODE, RFIFOP (fd, 6)); + } + } + else + { + if (defaultlanguage == 'F') + { + printf + ("Modification du mot de passe du compte [%s][id: %d] r騏ssie.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Modification du mot de passe du compte [%s][id: %d] r騏ssie." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + else + { + printf + ("Account [%s][id: %d] password successfully changed.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Account [%s][id: %d] password successfully changed." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 30); + break; + + case 0x7937: // answer of the change of an account state + if (RFIFOREST (fd) < 34) + return 0; + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Echec du changement du statut du compte [%s]. Le compte n'existe pas.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Echec du changement du statut du compte [%s]. Le compte n'existe pas." + RETCODE, RFIFOP (fd, 6)); + } + else + { + printf + ("Account [%s] state changing failed. Account doesn't exist.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Account [%s] state changing failed. Account doesn't exist." + RETCODE, RFIFOP (fd, 6)); + } + } + else + { + char tmpstr[256]; + if (defaultlanguage == 'F') + { + sprintf (tmpstr, + "Statut du compte [%s] chang avec succ鑚 en [", + RFIFOP (fd, 6)); + } + else + { + sprintf (tmpstr, + "Account [%s] state successfully changed in [", + RFIFOP (fd, 6)); + } + switch (RFIFOL (fd, 30)) + { + case 0: + if (defaultlanguage == 'F') + strcat (tmpstr, "0: Compte Ok"); + else + strcat (tmpstr, "0: Account OK"); + break; + case 1: + strcat (tmpstr, "1: Unregistered ID"); + break; + case 2: + strcat (tmpstr, "2: Incorrect Password"); + break; + case 3: + strcat (tmpstr, "3: This ID is expired"); + break; + case 4: + strcat (tmpstr, "4: Rejected from Server"); + break; + case 5: + strcat (tmpstr, + "5: You have been blocked by the GM Team"); + break; + case 6: + strcat (tmpstr, + "6: [Your Game's EXE file is not the latest version"); + break; + case 7: + strcat (tmpstr, + "7: You are Prohibited to log in until..."); + break; + case 8: + strcat (tmpstr, + "8: Server is jammed due to over populated"); + break; + case 9: + strcat (tmpstr, "9: No MSG"); + break; + default: // 100 + strcat (tmpstr, "100: This ID is totally erased"); + break; + } + strcat (tmpstr, "]"); + printf ("%s\n", tmpstr); + ladmin_log ("%s%s", tmpstr, RETCODE); + } + bytes_to_read = 0; + RFIFOSKIP (fd, 34); + break; + + case 0x7939: // answer of the number of online players + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + { + // Get length of the received packet + int i; + char name[20]; + if (defaultlanguage == 'F') + { + ladmin_log + (" R馗eption du nombre de joueurs en ligne." + RETCODE); + } + else + { + ladmin_log + (" Receiving of the number of online players." + RETCODE); + } + // Read information of the servers + if (RFIFOW (fd, 2) < 5) + { + if (defaultlanguage == 'F') + { + printf + (" Aucun serveur n'est connect au login serveur.\n"); + } + else + { + printf + (" No server is connected to the login-server.\n"); + } + } + else + { + if (defaultlanguage == 'F') + { + printf + (" Nombre de joueurs en ligne (serveur: nb):\n"); + } + else + { + printf + (" Number of online players (server: number).\n"); + } + // Displaying of result + for (i = 4; i < RFIFOW (fd, 2); i += 32) + { + memcpy (name, RFIFOP (fd, i + 6), sizeof (name)); + name[sizeof (name) - 1] = '\0'; + printf (" %-20s : %5d\n", name, + RFIFOW (fd, i + 26)); + } + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, RFIFOW (fd, 2)); + break; + + case 0x793b: // answer of the check of a password + if (RFIFOREST (fd) < 30) + return 0; + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Le compte [%s] n'existe pas ou le mot de passe est incorrect.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Le compte [%s] n'existe pas ou le mot de passe est incorrect." + RETCODE, RFIFOP (fd, 6)); + } + else + { + printf + ("The account [%s] doesn't exist or the password is incorrect.\n", + RFIFOP (fd, 6)); + ladmin_log + ("The account [%s] doesn't exist or the password is incorrect." + RETCODE, RFIFOP (fd, 6)); + } + } + else + { + if (defaultlanguage == 'F') + { + printf + ("Le mot de passe donn correspond bien au compte [%s][id: %d].\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Le mot de passe donn correspond bien au compte [%s][id: %d]." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + else + { + printf + ("The proposed password is correct for the account [%s][id: %d].\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("The proposed password is correct for the account [%s][id: %d]." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 30); + break; + + case 0x793d: // answer of the change of an account sex + if (RFIFOREST (fd) < 30) + return 0; + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Echec de la modification du sexe du compte [%s].\n", + RFIFOP (fd, 6)); + printf + ("Le compte [%s] n'existe pas ou le sexe est d駛 celui demand.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Echec de la modification du sexe du compte. Le compte [%s] n'existe pas ou le sexe est d駛 celui demand." + RETCODE, RFIFOP (fd, 6)); + } + else + { + printf ("Account [%s] sex changing failed.\n", + RFIFOP (fd, 6)); + printf + ("Account [%s] doesn't exist or the sex is already the good sex.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Account sex changing failed. The compte [%s] doesn't exist or the sex is already the good sex." + RETCODE, RFIFOP (fd, 6)); + } + } + else + { + if (defaultlanguage == 'F') + { + printf + ("Sexe du compte [%s][id: %d] chang avec succ鑚.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Sexe du compte [%s][id: %d] chang avec succ鑚." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + else + { + printf + ("Account [%s][id: %d] sex successfully changed.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Account [%s][id: %d] sex successfully changed." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 30); + break; + + case 0x793f: // answer of the change of an account GM level + if (RFIFOREST (fd) < 30) + return 0; + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Echec de la modification du niveau de GM du compte [%s].\n", + RFIFOP (fd, 6)); + printf + ("Le compte [%s] n'existe pas, le niveau de GM est d駛 celui demand饅n", + RFIFOP (fd, 6)); + printf + ("ou il est impossible de modifier le fichier des comptes GM.\n"); + ladmin_log + ("Echec de la modification du niveau de GM du compte. Le compte [%s] n'existe pas, le niveau de GM est d駛 celui demand ou il est impossible de modifier le fichier des comptes GM." + RETCODE, RFIFOP (fd, 6)); + } + else + { + printf ("Account [%s] GM level changing failed.\n", + RFIFOP (fd, 6)); + printf + ("Account [%s] doesn't exist, the GM level is already the good GM level\n", + RFIFOP (fd, 6)); + printf + ("or it's impossible to modify the GM accounts file.\n"); + ladmin_log + ("Account GM level changing failed. The compte [%s] doesn't exist, the GM level is already the good sex or it's impossible to modify the GM accounts file." + RETCODE, RFIFOP (fd, 6)); + } + } + else + { + if (defaultlanguage == 'F') + { + printf + ("Niveau de GM du compte [%s][id: %d] chang avec succ鑚.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Niveau de GM du compte [%s][id: %d] chang avec succ鑚." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + else + { + printf + ("Account [%s][id: %d] GM level successfully changed.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Account [%s][id: %d] GM level successfully changed." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 30); + break; + + case 0x7941: // answer of the change of an account email + if (RFIFOREST (fd) < 30) + return 0; + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Echec de la modification de l'e-mail du compte [%s].\n", + RFIFOP (fd, 6)); + printf ("Le compte [%s] n'existe pas.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Echec de la modification de l'e-mail du compte. Le compte [%s] n'existe pas." + RETCODE, RFIFOP (fd, 6)); + } + else + { + printf ("Account [%s] e-mail changing failed.\n", + RFIFOP (fd, 6)); + printf ("Account [%s] doesn't exist.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Account e-mail changing failed. The compte [%s] doesn't exist." + RETCODE, RFIFOP (fd, 6)); + } + } + else + { + if (defaultlanguage == 'F') + { + printf + ("Modification de l'e-mail du compte [%s][id: %d] r騏ssie.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Modification de l'e-mail du compte [%s][id: %d] r騏ssie." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + else + { + printf + ("Account [%s][id: %d] e-mail successfully changed.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Account [%s][id: %d] e-mail successfully changed." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 30); + break; + + case 0x7943: // answer of the change of an account memo + if (RFIFOREST (fd) < 30) + return 0; + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Echec du changement du m駑o du compte [%s]. Le compte n'existe pas.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Echec du changement du m駑o du compte [%s]. Le compte n'existe pas." + RETCODE, RFIFOP (fd, 6)); + } + else + { + printf + ("Account [%s] memo changing failed. Account doesn't exist.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Account [%s] memo changing failed. Account doesn't exist." + RETCODE, RFIFOP (fd, 6)); + } + } + else + { + if (defaultlanguage == 'F') + { + printf + ("M駑o du compte [%s][id: %d] chang avec succ鑚.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("M駑o du compte [%s][id: %d] chang avec succ鑚." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + else + { + printf + ("Account [%s][id: %d] memo successfully changed.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Account [%s][id: %d] memo successfully changed." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 30); + break; + + case 0x7945: // answer of an account id search + if (RFIFOREST (fd) < 30) + return 0; + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Impossible de trouver l'id du compte [%s]. Le compte n'existe pas.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Impossible de trouver l'id du compte [%s]. Le compte n'existe pas." + RETCODE, RFIFOP (fd, 6)); + } + else + { + printf + ("Unable to find the account [%s] id. Account doesn't exist.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Unable to find the account [%s] id. Account doesn't exist." + RETCODE, RFIFOP (fd, 6)); + } + } + else + { + if (defaultlanguage == 'F') + { + printf ("Le compte [%s] a pour id: %d.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log ("Le compte [%s] a pour id: %d." RETCODE, + RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + else + { + printf ("The account [%s] have the id: %d.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log ("The account [%s] have the id: %d." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 30); + break; + + case 0x7947: // answer of an account name search + if (RFIFOREST (fd) < 30) + return 0; + if (strcmp (RFIFOP (fd, 6), "") == 0) + { + if (defaultlanguage == 'F') + { + printf + ("Impossible de trouver le nom du compte [%d]. Le compte n'existe pas.\n", + RFIFOL (fd, 2)); + ladmin_log + ("Impossible de trouver le nom du compte [%d]. Le compte n'existe pas." + RETCODE, RFIFOL (fd, 2)); + } + else + { + printf + ("Unable to find the account [%d] name. Account doesn't exist.\n", + RFIFOL (fd, 2)); + ladmin_log + ("Unable to find the account [%d] name. Account doesn't exist." + RETCODE, RFIFOL (fd, 2)); + } + } + else + { + if (defaultlanguage == 'F') + { + printf ("Le compte [id: %d] a pour nom: %s.\n", + RFIFOL (fd, 2), RFIFOP (fd, 6)); + ladmin_log ("Le compte [id: %d] a pour nom: %s." + RETCODE, RFIFOL (fd, 2), RFIFOP (fd, 6)); + } + else + { + printf ("The account [id: %d] have the name: %s.\n", + RFIFOL (fd, 2), RFIFOP (fd, 6)); + ladmin_log ("The account [id: %d] have the name: %s." + RETCODE, RFIFOL (fd, 2), RFIFOP (fd, 6)); + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 30); + break; + + case 0x7949: // answer of an account validity limit set + if (RFIFOREST (fd) < 34) + return 0; + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Echec du changement de la validit du compte [%s]. Le compte n'existe pas.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Echec du changement de la validit du compte [%s]. Le compte n'existe pas." + RETCODE, RFIFOP (fd, 6)); + } + else + { + printf + ("Account [%s] validity limit changing failed. Account doesn't exist.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Account [%s] validity limit changing failed. Account doesn't exist." + RETCODE, RFIFOP (fd, 6)); + } + } + else + { + time_t timestamp = RFIFOL (fd, 30); + if (timestamp == 0) + { + if (defaultlanguage == 'F') + { + printf + ("Limite de validit du compte [%s][id: %d] chang馥 avec succ鑚 en [illimit饐.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Limite de validit du compte [%s][id: %d] chang馥 avec succ鑚 en [illimit饐." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + else + { + printf + ("Validity Limit of the account [%s][id: %d] successfully changed to [unlimited].\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Validity Limit of the account [%s][id: %d] successfully changed to [unlimited]." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + } + else + { + char tmpstr[128]; + strftime (tmpstr, 24, date_format, + localtime (×tamp)); + if (defaultlanguage == 'F') + { + printf + ("Limite de validit du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2), tmpstr); + ladmin_log + ("Limite de validit du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2), + tmpstr); + } + else + { + printf + ("Validity Limit of the account [%s][id: %d] successfully changed to be until %s.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2), tmpstr); + ladmin_log + ("Validity Limit of the account [%s][id: %d] successfully changed to be until %s." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2), + tmpstr); + } + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 34); + break; + + case 0x794b: // answer of an account ban set + if (RFIFOREST (fd) < 34) + return 0; + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas." + RETCODE, RFIFOP (fd, 6)); + } + else + { + printf + ("Account [%s] final date of banishment changing failed. Account doesn't exist.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Account [%s] final date of banishment changing failed. Account doesn't exist." + RETCODE, RFIFOP (fd, 6)); + } + } + else + { + time_t timestamp = RFIFOL (fd, 30); + if (timestamp == 0) + { + if (defaultlanguage == 'F') + { + printf + ("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 en [d-bannie].\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 en [d-bannie]." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + else + { + printf + ("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished].\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished]." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + } + else + { + char tmpstr[128]; + strftime (tmpstr, 24, date_format, + localtime (×tamp)); + if (defaultlanguage == 'F') + { + printf + ("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2), tmpstr); + ladmin_log + ("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2), + tmpstr); + } + else + { + printf + ("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2), tmpstr); + ladmin_log + ("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2), + tmpstr); + } + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 34); + break; + + case 0x794d: // answer of an account ban date/time changing + if (RFIFOREST (fd) < 34) + return 0; + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Echec du changement de la date finale de banissement du compte [%s]. Le compte n'existe pas." + RETCODE, RFIFOP (fd, 6)); + } + else + { + printf + ("Account [%s] final date of banishment changing failed. Account doesn't exist.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Account [%s] final date of banishment changing failed. Account doesn't exist." + RETCODE, RFIFOP (fd, 6)); + } + } + else + { + time_t timestamp = RFIFOL (fd, 30); + if (timestamp == 0) + { + if (defaultlanguage == 'F') + { + printf + ("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 en [d-bannie].\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 en [d-bannie]." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + else + { + printf + ("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished].\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + ladmin_log + ("Final date of banishment of the account [%s][id: %d] successfully changed to [unbanished]." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + } + else + { + char tmpstr[128]; + strftime (tmpstr, 24, date_format, + localtime (×tamp)); + if (defaultlanguage == 'F') + { + printf + ("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2), tmpstr); + ladmin_log + ("Date finale de banissement du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2), + tmpstr); + } + else + { + printf + ("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2), tmpstr); + ladmin_log + ("Final date of banishment of the account [%s][id: %d] successfully changed to be until %s." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2), + tmpstr); + } + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 34); + break; + + case 0x794f: // answer of a broadcast + if (RFIFOREST (fd) < 4) + return 0; + if (RFIFOW (fd, 2) == (unsigned short) -1) + { + if (defaultlanguage == 'F') + { + printf + ("Echec de l'envoi du message. Aucun server de char en ligne.\n"); + ladmin_log + ("Echec de l'envoi du message. Aucun server de char en ligne." + RETCODE); + } + else + { + printf + ("Message sending failed. No online char-server.\n"); + ladmin_log + ("Message sending failed. No online char-server." + RETCODE); + } + } + else + { + if (defaultlanguage == 'F') + { + printf + ("Message transmis au server de logins avec succ鑚.\n"); + ladmin_log + ("Message transmis au server de logins avec succ鑚." + RETCODE); + } + else + { + printf + ("Message successfully sended to login-server.\n"); + ladmin_log + ("Message successfully sended to login-server." + RETCODE); + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 4); + break; + + case 0x7951: // answer of an account validity limit changing + if (RFIFOREST (fd) < 34) + return 0; + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Echec du changement de la validit du compte [%s]. Le compte n'existe pas.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Echec du changement de la validit du compte [%s]. Le compte n'existe pas." + RETCODE, RFIFOP (fd, 6)); + } + else + { + printf + ("Account [%s] validity limit changing failed. Account doesn't exist.\n", + RFIFOP (fd, 6)); + ladmin_log + ("Account [%s] validity limit changing failed. Account doesn't exist." + RETCODE, RFIFOP (fd, 6)); + } + } + else + { + time_t timestamp = RFIFOL (fd, 30); + if (timestamp == 0) + { + if (defaultlanguage == 'F') + { + printf + ("Limite de validit du compte [%s][id: %d] inchang馥.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + printf + ("Le compte a une validit illimit馥 ou\n"); + printf + ("la modification est impossible avec les ajustements demand駸.\n"); + ladmin_log + ("Limite de validit du compte [%s][id: %d] inchang馥. Le compte a une validit illimit馥 ou la modification est impossible avec les ajustements demand駸." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + else + { + printf + ("Validity limit of the account [%s][id: %d] unchanged.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2)); + printf + ("The account have an unlimited validity limit or\n"); + printf + ("the changing is impossible with the proposed adjustments.\n"); + ladmin_log + ("Validity limit of the account [%s][id: %d] unchanged. The account have an unlimited validity limit or the changing is impossible with the proposed adjustments." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2)); + } + } + else + { + char tmpstr[128]; + strftime (tmpstr, 24, date_format, + localtime (×tamp)); + if (defaultlanguage == 'F') + { + printf + ("Limite de validit du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2), tmpstr); + ladmin_log + ("Limite de validit du compte [%s][id: %d] chang馥 avec succ鑚 pour 黎re jusqu'au %s." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2), + tmpstr); + } + else + { + printf + ("Validity limit of the account [%s][id: %d] successfully changed to be until %s.\n", + RFIFOP (fd, 6), RFIFOL (fd, 2), tmpstr); + ladmin_log + ("Validity limit of the account [%s][id: %d] successfully changed to be until %s." + RETCODE, RFIFOP (fd, 6), RFIFOL (fd, 2), + tmpstr); + } + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 34); + break; + + case 0x7953: // answer of a request about informations of an account (by account name/id) + if (RFIFOREST (fd) < 150 + || RFIFOREST (fd) < (150 + RFIFOW (fd, 148))) + return 0; + { + char userid[24], error_message[20], lastlogin[24], + last_ip[16], email[40], memo[255]; + time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban) + time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) + memcpy (userid, RFIFOP (fd, 7), sizeof (userid)); + userid[sizeof (userid) - 1] = '\0'; + memcpy (error_message, RFIFOP (fd, 40), + sizeof (error_message)); + error_message[sizeof (error_message) - 1] = '\0'; + memcpy (lastlogin, RFIFOP (fd, 60), sizeof (lastlogin)); + lastlogin[sizeof (lastlogin) - 1] = '\0'; + memcpy (last_ip, RFIFOP (fd, 84), sizeof (last_ip)); + last_ip[sizeof (last_ip) - 1] = '\0'; + memcpy (email, RFIFOP (fd, 100), sizeof (email)); + email[sizeof (email) - 1] = '\0'; + connect_until_time = (time_t) RFIFOL (fd, 140); + ban_until_time = (time_t) RFIFOL (fd, 144); + memset (memo, '\0', sizeof (memo)); + strncpy (memo, RFIFOP (fd, 150), RFIFOW (fd, 148)); + if (RFIFOL (fd, 2) == -1) + { + if (defaultlanguage == 'F') + { + printf + ("Impossible de trouver le compte [%s]. Le compte n'existe pas.\n", + parameters); + ladmin_log + ("Impossible de trouver le compte [%s]. Le compte n'existe pas." + RETCODE, parameters); + } + else + { + printf + ("Unabled to find the account [%s]. Account doesn't exist.\n", + parameters); + ladmin_log + ("Unabled to find the account [%s]. Account doesn't exist." + RETCODE, parameters); + } + } + else if (strlen (userid) == 0) + { + if (defaultlanguage == 'F') + { + printf + ("Impossible de trouver le compte [id: %s]. Le compte n'existe pas.\n", + parameters); + ladmin_log + ("Impossible de trouver le compte [id: %s]. Le compte n'existe pas." + RETCODE, parameters); + } + else + { + printf + ("Unabled to find the account [id: %s]. Account doesn't exist.\n", + parameters); + ladmin_log + ("Unabled to find the account [id: %s]. Account doesn't exist." + RETCODE, parameters); + } + } + else + { + if (defaultlanguage == 'F') + { + ladmin_log + ("R馗eption d'information concernant un compte." + RETCODE); + printf + ("Le compte a les caract駻istiques suivantes:\n"); + } + else + { + ladmin_log + ("Receiving information about an account." + RETCODE); + printf ("The account is set with:\n"); + } + if (RFIFOB (fd, 6) == 0) + { + printf (" Id: %d (non-GM)\n", RFIFOL (fd, 2)); + } + else + { + if (defaultlanguage == 'F') + { + printf (" Id: %d (GM niveau %d)\n", + RFIFOL (fd, 2), (int) RFIFOB (fd, 6)); + } + else + { + printf (" Id: %d (GM level %d)\n", + RFIFOL (fd, 2), (int) RFIFOB (fd, 6)); + } + } + if (defaultlanguage == 'F') + { + printf (" Nom: '%s'\n", userid); + if (RFIFOB (fd, 31) == 0) + printf (" Sexe: Femme\n"); + else if (RFIFOB (fd, 31) == 1) + printf (" Sexe: Male\n"); + else + printf (" Sexe: Serveur\n"); + } + else + { + printf (" Name: '%s'\n", userid); + if (RFIFOB (fd, 31) == 0) + printf (" Sex: Female\n"); + else if (RFIFOB (fd, 31) == 1) + printf (" Sex: Male\n"); + else + printf (" Sex: Server\n"); + } + printf (" E-mail: %s\n", email); + switch (RFIFOL (fd, 36)) + { + case 0: + if (defaultlanguage == 'F') + printf (" Statut: 0 [Compte Ok]\n"); + else + printf (" Statut: 0 [Account OK]\n"); + break; + case 1: + printf (" Statut: 1 [Unregistered ID]\n"); + break; + case 2: + printf (" Statut: 2 [Incorrect Password]\n"); + break; + case 3: + printf (" Statut: 3 [This ID is expired]\n"); + break; + case 4: + printf + (" Statut: 4 [Rejected from Server]\n"); + break; + case 5: + printf + (" Statut: 5 [You have been blocked by the GM Team]\n"); + break; + case 6: + printf + (" Statut: 6 [Your Game's EXE file is not the latest version]\n"); + break; + case 7: + printf + (" Statut: 7 [You are Prohibited to log in until %s]\n", + error_message); + break; + case 8: + printf + (" Statut: 8 [Server is jammed due to over populated]\n"); + break; + case 9: + printf (" Statut: 9 [No MSG]\n"); + break; + default: // 100 + printf + (" Statut: %d [This ID is totally erased]\n", + RFIFOL (fd, 36)); + break; + } + if (defaultlanguage == 'F') + { + if (ban_until_time == 0) + { + printf (" Banissement: non banni.\n"); + } + else + { + char tmpstr[128]; + strftime (tmpstr, 24, date_format, + localtime (&ban_until_time)); + printf (" Banissement: jusqu'au %s.\n", + tmpstr); + } + if (RFIFOL (fd, 32) > 1) + printf (" Compteur: %d connexions.\n", + RFIFOL (fd, 32)); + else + printf (" Compteur: %d connexion.\n", + RFIFOL (fd, 32)); + printf (" Derni鑽e connexion le: %s (ip: %s)\n", + lastlogin, last_ip); + if (connect_until_time == 0) + { + printf (" Limite de validit: illimit.\n"); + } + else + { + char tmpstr[128]; + strftime (tmpstr, 24, date_format, + localtime (&connect_until_time)); + printf (" Limite de validit: jusqu'au %s.\n", + tmpstr); + } + } + else + { + if (ban_until_time == 0) + { + printf (" Banishment: not banished.\n"); + } + else + { + char tmpstr[128]; + strftime (tmpstr, 24, date_format, + localtime (&ban_until_time)); + printf (" Banishment: until %s.\n", tmpstr); + } + if (RFIFOL (fd, 32) > 1) + printf (" Count: %d connections.\n", + RFIFOL (fd, 32)); + else + printf (" Count: %d connection.\n", + RFIFOL (fd, 32)); + printf (" Last connection at: %s (ip: %s)\n", + lastlogin, last_ip); + if (connect_until_time == 0) + { + printf (" Validity limit: unlimited.\n"); + } + else + { + char tmpstr[128]; + strftime (tmpstr, 24, date_format, + localtime (&connect_until_time)); + printf (" Validity limit: until %s.\n", + tmpstr); + } + } + printf (" Memo: '%s'\n", memo); + } + } + bytes_to_read = 0; + RFIFOSKIP (fd, 150 + RFIFOW (fd, 148)); + break; + + default: + printf + ("Remote administration has been disconnected (unknown packet).\n"); + ladmin_log ("'End of connection, unknown packet." RETCODE); + session[fd]->eof = 1; + return 0; + } + } - // if we don't wait new packets, do the prompt - prompt(); + // if we don't wait new packets, do the prompt + prompt (); - return 0; + return 0; } //------------------------------------ // Function to connect to login-server //------------------------------------ -int Connect_login_server() { - if (defaultlanguage == 'F') { - Iprintf("Essai de connection au server de logins...\n"); - ladmin_log("Essai de connection au server de logins..." RETCODE); - } else { - Iprintf("Attempt to connect to login-server...\n"); - ladmin_log("Attempt to connect to login-server..." RETCODE); - } - - if ((login_fd = make_connection(login_ip, loginserverport)) < 0) - return 0; +int Connect_login_server () +{ + if (defaultlanguage == 'F') + { + Iprintf ("Essai de connection au server de logins...\n"); + ladmin_log ("Essai de connection au server de logins..." RETCODE); + } + else + { + Iprintf ("Attempt to connect to login-server...\n"); + ladmin_log ("Attempt to connect to login-server..." RETCODE); + } + + if ((login_fd = make_connection (login_ip, loginserverport)) < 0) + return 0; #ifdef PASSWORDENC - if (passenc == 0) { + if (passenc == 0) + { #endif - WFIFOW(login_fd,0) = 0x7918; // Request for administation login - WFIFOW(login_fd,2) = 0; // no encrypted - memcpy(WFIFOP(login_fd,4), loginserveradminpassword, 24); - WFIFOSET(login_fd,28); - bytes_to_read = 1; - - if (defaultlanguage == 'F') { - Iprintf("Envoi du mot de passe...\n"); - ladmin_log("Envoi du mot de passe..." RETCODE); - } else { - Iprintf("Sending of the password...\n"); - ladmin_log("Sending of the password..." RETCODE); - } + WFIFOW (login_fd, 0) = 0x7918; // Request for administation login + WFIFOW (login_fd, 2) = 0; // no encrypted + memcpy (WFIFOP (login_fd, 4), loginserveradminpassword, 24); + WFIFOSET (login_fd, 28); + bytes_to_read = 1; + + if (defaultlanguage == 'F') + { + Iprintf ("Envoi du mot de passe...\n"); + ladmin_log ("Envoi du mot de passe..." RETCODE); + } + else + { + Iprintf ("Sending of the password...\n"); + ladmin_log ("Sending of the password..." RETCODE); + } #ifdef PASSWORDENC - } else { - WFIFOW(login_fd,0) = 0x791a; // Sending request about the coding key - WFIFOSET(login_fd,2); - bytes_to_read = 1; - if (defaultlanguage == 'F') { - Iprintf("Demande de la clef MD5...\n"); - ladmin_log("Demande de la clef MD5..." RETCODE); - } else { - Iprintf("Request about the MD5 key...\n"); - ladmin_log("Request about the MD5 key..." RETCODE); - } - } + } + else + { + WFIFOW (login_fd, 0) = 0x791a; // Sending request about the coding key + WFIFOSET (login_fd, 2); + bytes_to_read = 1; + if (defaultlanguage == 'F') + { + Iprintf ("Demande de la clef MD5...\n"); + ladmin_log ("Demande de la clef MD5..." RETCODE); + } + else + { + Iprintf ("Request about the MD5 key...\n"); + ladmin_log ("Request about the MD5 key..." RETCODE); + } + } #endif - return 0; + return 0; } //------------------------------------------------- // Return numerical value of a switch configuration // on/off, english, fran軋is, deutsch, espaol //------------------------------------------------- -int config_switch(const char *str) { - if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0) - return 1; - if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0) - return 0; - - return atoi(str); +int config_switch (const char *str) +{ + if (strcmpi (str, "on") == 0 || strcmpi (str, "yes") == 0 + || strcmpi (str, "oui") == 0 || strcmpi (str, "ja") == 0 + || strcmpi (str, "si") == 0) + return 1; + if (strcmpi (str, "off") == 0 || strcmpi (str, "no") == 0 + || strcmpi (str, "non") == 0 || strcmpi (str, "nein") == 0) + return 0; + + return atoi (str); } //----------------------------------- // Reading general configuration file //----------------------------------- -int ladmin_config_read(const char *cfgName) { - char line[1024], w1[1024], w2[1024]; - FILE *fp; - - fp = fopen_(cfgName, "r"); - if (fp == NULL) { - if (defaultlanguage == 'F') { - printf("\033[0mFichier de configuration (%s) non trouv.\n", cfgName); - } else { - printf("\033[0mConfiguration file (%s) not found.\n", cfgName); - } - return 1; - } - - if (defaultlanguage == 'F') { - Iprintf("\033[0m---D饕ut de lecture du fichier de configuration Ladmin (%s)\n", cfgName); - } else { - Iprintf("\033[0m---Start reading of Ladmin configuration file (%s)\n", cfgName); - } - while(fgets(line, sizeof(line)-1, fp)) { - if (line[0] == '/' && line[1] == '/') - continue; - - line[sizeof(line)-1] = '\0'; - if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) { - remove_control_chars(w1); - remove_control_chars(w2); - - if(strcmpi(w1,"login_ip")==0){ - struct hostent *h = gethostbyname (w2); - if (h != NULL) { - if (defaultlanguage == 'F') { - Iprintf("Adresse du serveur de logins: %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - } else { - Iprintf("Login server IP address: %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - } - sprintf(loginserverip, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - } else - memcpy(loginserverip, w2, 16); - } else if (strcmpi(w1, "login_port") == 0) { - loginserverport = atoi(w2); - } else if (strcmpi(w1, "admin_pass") == 0) { - strncpy(loginserveradminpassword, w2, sizeof(loginserveradminpassword)); - loginserveradminpassword[sizeof(loginserveradminpassword)-1] = '\0'; +int ladmin_config_read (const char *cfgName) +{ + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + fp = fopen_ (cfgName, "r"); + if (fp == NULL) + { + if (defaultlanguage == 'F') + { + printf ("\033[0mFichier de configuration (%s) non trouv.\n", + cfgName); + } + else + { + printf ("\033[0mConfiguration file (%s) not found.\n", cfgName); + } + return 1; + } + + if (defaultlanguage == 'F') + { + Iprintf + ("\033[0m---D饕ut de lecture du fichier de configuration Ladmin (%s)\n", + cfgName); + } + else + { + Iprintf + ("\033[0m---Start reading of Ladmin configuration file (%s)\n", + cfgName); + } + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + + line[sizeof (line) - 1] = '\0'; + if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) == 2) + { + remove_control_chars (w1); + remove_control_chars (w2); + + if (strcmpi (w1, "login_ip") == 0) + { + struct hostent *h = gethostbyname (w2); + if (h != NULL) + { + if (defaultlanguage == 'F') + { + Iprintf + ("Adresse du serveur de logins: %s -> %d.%d.%d.%d\n", + w2, (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + } + else + { + Iprintf + ("Login server IP address: %s -> %d.%d.%d.%d\n", + w2, (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + } + sprintf (loginserverip, "%d.%d.%d.%d", + (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + } + else + memcpy (loginserverip, w2, 16); + } + else if (strcmpi (w1, "login_port") == 0) + { + loginserverport = atoi (w2); + } + else if (strcmpi (w1, "admin_pass") == 0) + { + strncpy (loginserveradminpassword, w2, + sizeof (loginserveradminpassword)); + loginserveradminpassword[sizeof (loginserveradminpassword) - + 1] = '\0'; #ifdef PASSWORDENC - } else if (strcmpi(w1, "passenc") == 0) { - passenc = atoi(w2); - if (passenc < 0 || passenc > 2) - passenc = 0; + } + else if (strcmpi (w1, "passenc") == 0) + { + passenc = atoi (w2); + if (passenc < 0 || passenc > 2) + passenc = 0; #endif - } else if (strcmpi(w1, "defaultlanguage") == 0) { - if (w2[0] == 'F' || w2[0] == 'E') - defaultlanguage = w2[0]; - } else if (strcmpi(w1, "ladmin_log_filename") == 0) { - strncpy(ladmin_log_filename, w2, sizeof(ladmin_log_filename)); - ladmin_log_filename[sizeof(ladmin_log_filename)-1] = '\0'; - } else if (strcmpi(w1, "date_format") == 0) { // note: never have more than 19 char for the date! - switch (atoi(w2)) { - case 0: - strcpy(date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59 - break; - case 1: - strcpy(date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59 - break; - case 2: - strcpy(date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59 - break; - case 3: - strcpy(date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59 - break; - } - } else if (strcmpi(w1, "import") == 0) { - ladmin_config_read(w2); - } - } - } - fclose_(fp); + } + else if (strcmpi (w1, "defaultlanguage") == 0) + { + if (w2[0] == 'F' || w2[0] == 'E') + defaultlanguage = w2[0]; + } + else if (strcmpi (w1, "ladmin_log_filename") == 0) + { + strncpy (ladmin_log_filename, w2, + sizeof (ladmin_log_filename)); + ladmin_log_filename[sizeof (ladmin_log_filename) - 1] = '\0'; + } + else if (strcmpi (w1, "date_format") == 0) + { // note: never have more than 19 char for the date! + switch (atoi (w2)) + { + case 0: + strcpy (date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59 + break; + case 1: + strcpy (date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59 + break; + case 2: + strcpy (date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59 + break; + case 3: + strcpy (date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59 + break; + } + } + else if (strcmpi (w1, "import") == 0) + { + ladmin_config_read (w2); + } + } + } + fclose_ (fp); - login_ip = inet_addr(loginserverip); + login_ip = inet_addr (loginserverip); - if (defaultlanguage == 'F') { - Iprintf("---Lecture du fichier de configuration Ladmin termin馥.\n"); - } else { - Iprintf("---End reading of Ladmin configuration file.\n"); - } + if (defaultlanguage == 'F') + { + Iprintf ("---Lecture du fichier de configuration Ladmin termin馥.\n"); + } + else + { + Iprintf ("---End reading of Ladmin configuration file.\n"); + } - return 0; + return 0; } //-------------------------------------- // Function called at exit of the server //-------------------------------------- -void do_final(void) { - - if (already_exit_function == 0) { - delete_session(login_fd); +void do_final (void) +{ - if (defaultlanguage == 'F') { - Iprintf("\033[0m----Fin de Ladmin (fin normale avec fermeture de tous les fichiers).\n"); - ladmin_log("----Fin de Ladmin (fin normale avec fermeture de tous les fichiers)." RETCODE); - } else { - Iprintf("\033[0m----End of Ladmin (normal end with closing of all files).\n"); - ladmin_log("----End of Ladmin (normal end with closing of all files)." RETCODE); - } + if (already_exit_function == 0) + { + delete_session (login_fd); + + if (defaultlanguage == 'F') + { + Iprintf + ("\033[0m----Fin de Ladmin (fin normale avec fermeture de tous les fichiers).\n"); + ladmin_log + ("----Fin de Ladmin (fin normale avec fermeture de tous les fichiers)." + RETCODE); + } + else + { + Iprintf + ("\033[0m----End of Ladmin (normal end with closing of all files).\n"); + ladmin_log + ("----End of Ladmin (normal end with closing of all files)." + RETCODE); + } - already_exit_function = 1; - } + already_exit_function = 1; + } } //------------------------ // Main function of ladmin //------------------------ -int do_init(int argc, char **argv) { - // read ladmin configuration - ladmin_config_read((argc > 1) ? argv[1] : LADMIN_CONF_NAME); - - ladmin_log(""); - if (defaultlanguage == 'F') { - ladmin_log("Fichier de configuration lu." RETCODE); - } else { - ladmin_log("Configuration file readed." RETCODE); - } - - srand(time(NULL)); - - set_termfunc(do_final); - set_defaultparse(parse_fromlogin); - - if (defaultlanguage == 'F') { - Iprintf("Outil d'administration distance de eAthena.\n"); - Iprintf("(pour eAthena version %d.%d.%d.)\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION); - } else { - Iprintf("EAthena login-server administration tool.\n"); - Iprintf("(for eAthena version %d.%d.%d.)\n", ATHENA_MAJOR_VERSION, ATHENA_MINOR_VERSION, ATHENA_REVISION); - } - - if (defaultlanguage == 'F') { - ladmin_log("Ladmin est pr黎." RETCODE); - Iprintf("Ladmin est \033[1;32mpr黎\033[0m.\n\n"); - } else { - ladmin_log("Ladmin is ready." RETCODE); - Iprintf("Ladmin is \033[1;32mready\033[0m.\n\n"); - } - - Connect_login_server(); - - atexit(do_final); - - return 0; +int do_init (int argc, char **argv) +{ + // read ladmin configuration + ladmin_config_read ((argc > 1) ? argv[1] : LADMIN_CONF_NAME); + + ladmin_log (""); + if (defaultlanguage == 'F') + { + ladmin_log ("Fichier de configuration lu." RETCODE); + } + else + { + ladmin_log ("Configuration file readed." RETCODE); + } + + srand (time (NULL)); + + set_termfunc (do_final); + set_defaultparse (parse_fromlogin); + + if (defaultlanguage == 'F') + { + Iprintf ("Outil d'administration distance de eAthena.\n"); + Iprintf ("(pour eAthena version %d.%d.%d.)\n", ATHENA_MAJOR_VERSION, + ATHENA_MINOR_VERSION, ATHENA_REVISION); + } + else + { + Iprintf ("EAthena login-server administration tool.\n"); + Iprintf ("(for eAthena version %d.%d.%d.)\n", ATHENA_MAJOR_VERSION, + ATHENA_MINOR_VERSION, ATHENA_REVISION); + } + + if (defaultlanguage == 'F') + { + ladmin_log ("Ladmin est pr黎." RETCODE); + Iprintf ("Ladmin est \033[1;32mpr黎\033[0m.\n\n"); + } + else + { + ladmin_log ("Ladmin is ready." RETCODE); + Iprintf ("Ladmin is \033[1;32mready\033[0m.\n\n"); + } + + Connect_login_server (); + + atexit (do_final); + + return 0; } diff --git a/src/ladmin/ladmin.h b/src/ladmin/ladmin.h index f76bfc2..dc1efe6 100644 --- a/src/ladmin/ladmin.h +++ b/src/ladmin/ladmin.h @@ -3,9 +3,9 @@ #define _LADMIN_H_ #define LADMIN_CONF_NAME "conf/ladmin_athena.conf" -#define PASSWORDENC 3 // A definition is given when making an encryption password correspond. - // It is 1 at the time of passwordencrypt. - // It is made into 2 at the time of passwordencrypt2. - // When it is made 3, it corresponds to both. +#define PASSWORDENC 3 // A definition is given when making an encryption password correspond. + // It is 1 at the time of passwordencrypt. + // It is made into 2 at the time of passwordencrypt2. + // When it is made 3, it corresponds to both. #endif diff --git a/src/ladmin/md5calc.c b/src/ladmin/md5calc.c index 7b9a9a2..49a4aaa 100644 --- a/src/ladmin/md5calc.c +++ b/src/ladmin/md5calc.c @@ -20,198 +20,255 @@ static unsigned int *pX; // Stirng Table static const unsigned int T[] = { - 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0 - 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4 - 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8 - 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12 - 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16 - 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20 - 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24 - 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28 - 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32 - 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36 - 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40 - 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44 - 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48 - 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52 - 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56 - 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60 + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0 + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4 + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8 + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12 + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16 + 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20 + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24 + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28 + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32 + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36 + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40 + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44 + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48 + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52 + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56 + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60 }; // ROTATE_LEFT The left is made to rotate x [ n-bit ]. This is diverted as it is from RFC. #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) // The function used for other calculation -static unsigned int F(unsigned int X, unsigned int Y, unsigned int Z) +static unsigned int F (unsigned int X, unsigned int Y, unsigned int Z) { - return (X & Y) | (~X & Z); + return (X & Y) | (~X & Z); } -static unsigned int G(unsigned int X, unsigned int Y, unsigned int Z) + +static unsigned int G (unsigned int X, unsigned int Y, unsigned int Z) { - return (X & Z) | (Y & ~Z); + return (X & Z) | (Y & ~Z); } -static unsigned int H(unsigned int X, unsigned int Y, unsigned int Z) + +static unsigned int H (unsigned int X, unsigned int Y, unsigned int Z) { - return X ^ Y ^ Z; + return X ^ Y ^ Z; } -static unsigned int I(unsigned int X, unsigned int Y, unsigned int Z) + +static unsigned int I (unsigned int X, unsigned int Y, unsigned int Z) { - return Y ^ (X | ~Z); + return Y ^ (X | ~Z); } -static unsigned int Round(unsigned int a, unsigned int b, unsigned int FGHI, - unsigned int k, unsigned int s, unsigned int i) +static unsigned int Round (unsigned int a, unsigned int b, unsigned int FGHI, + unsigned int k, unsigned int s, unsigned int i) { - return b + ROTATE_LEFT(a + FGHI + pX[k] + T[i], s); + return b + ROTATE_LEFT (a + FGHI + pX[k] + T[i], s); } -static void Round1(unsigned int *a, unsigned int b, unsigned int c, - unsigned int d,unsigned int k, unsigned int s, unsigned int i) +static void Round1 (unsigned int *a, unsigned int b, unsigned int c, + unsigned int d, unsigned int k, unsigned int s, + unsigned int i) { - *a = Round(*a, b, F(b,c,d), k, s, i); + *a = Round (*a, b, F (b, c, d), k, s, i); } -static void Round2(unsigned int *a, unsigned int b, unsigned int c, - unsigned int d,unsigned int k, unsigned int s, unsigned int i) + +static void Round2 (unsigned int *a, unsigned int b, unsigned int c, + unsigned int d, unsigned int k, unsigned int s, + unsigned int i) { - *a = Round(*a, b, G(b,c,d), k, s, i); + *a = Round (*a, b, G (b, c, d), k, s, i); } -static void Round3(unsigned int *a, unsigned int b, unsigned int c, - unsigned int d,unsigned int k, unsigned int s, unsigned int i) + +static void Round3 (unsigned int *a, unsigned int b, unsigned int c, + unsigned int d, unsigned int k, unsigned int s, + unsigned int i) { - *a = Round(*a, b, H(b,c,d), k, s, i); + *a = Round (*a, b, H (b, c, d), k, s, i); } -static void Round4(unsigned int *a, unsigned int b, unsigned int c, - unsigned int d,unsigned int k, unsigned int s, unsigned int i) + +static void Round4 (unsigned int *a, unsigned int b, unsigned int c, + unsigned int d, unsigned int k, unsigned int s, + unsigned int i) { - *a = Round(*a, b, I(b,c,d), k, s, i); + *a = Round (*a, b, I (b, c, d), k, s, i); } -static void MD5_Round_Calculate(const unsigned char *block, - unsigned int *A2, unsigned int *B2, unsigned int *C2, unsigned int *D2) +static void MD5_Round_Calculate (const unsigned char *block, + unsigned int *A2, unsigned int *B2, + unsigned int *C2, unsigned int *D2) { - //create X It is since it is required. - unsigned int X[16]; //512bit 64byte - int j,k; - - //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D) - unsigned int A=*A2, B=*B2, C=*C2, D=*D2; - unsigned int AA = A,BB = B,CC = C,DD = D; - - //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4 - pX = X; - - //Copy block(padding_message) i into X - for (j=0,k=0; j<64; j+=4,k++) - X[k] = ( (unsigned int )block[j] ) // 8byte*4 -> 32byte conversion - | ( ((unsigned int )block[j+1]) << 8 ) // A function called Decode as used in the field of RFC - | ( ((unsigned int )block[j+2]) << 16 ) - | ( ((unsigned int )block[j+3]) << 24 ); - - - //Round 1 - Round1(&A,B,C,D, 0, 7, 0); Round1(&D,A,B,C, 1, 12, 1); Round1(&C,D,A,B, 2, 17, 2); Round1(&B,C,D,A, 3, 22, 3); - Round1(&A,B,C,D, 4, 7, 4); Round1(&D,A,B,C, 5, 12, 5); Round1(&C,D,A,B, 6, 17, 6); Round1(&B,C,D,A, 7, 22, 7); - Round1(&A,B,C,D, 8, 7, 8); Round1(&D,A,B,C, 9, 12, 9); Round1(&C,D,A,B, 10, 17, 10); Round1(&B,C,D,A, 11, 22, 11); - Round1(&A,B,C,D, 12, 7, 12); Round1(&D,A,B,C, 13, 12, 13); Round1(&C,D,A,B, 14, 17, 14); Round1(&B,C,D,A, 15, 22, 15); - - //Round 2 - Round2(&A,B,C,D, 1, 5, 16); Round2(&D,A,B,C, 6, 9, 17); Round2(&C,D,A,B, 11, 14, 18); Round2(&B,C,D,A, 0, 20, 19); - Round2(&A,B,C,D, 5, 5, 20); Round2(&D,A,B,C, 10, 9, 21); Round2(&C,D,A,B, 15, 14, 22); Round2(&B,C,D,A, 4, 20, 23); - Round2(&A,B,C,D, 9, 5, 24); Round2(&D,A,B,C, 14, 9, 25); Round2(&C,D,A,B, 3, 14, 26); Round2(&B,C,D,A, 8, 20, 27); - Round2(&A,B,C,D, 13, 5, 28); Round2(&D,A,B,C, 2, 9, 29); Round2(&C,D,A,B, 7, 14, 30); Round2(&B,C,D,A, 12, 20, 31); - - //Round 3 - Round3(&A,B,C,D, 5, 4, 32); Round3(&D,A,B,C, 8, 11, 33); Round3(&C,D,A,B, 11, 16, 34); Round3(&B,C,D,A, 14, 23, 35); - Round3(&A,B,C,D, 1, 4, 36); Round3(&D,A,B,C, 4, 11, 37); Round3(&C,D,A,B, 7, 16, 38); Round3(&B,C,D,A, 10, 23, 39); - Round3(&A,B,C,D, 13, 4, 40); Round3(&D,A,B,C, 0, 11, 41); Round3(&C,D,A,B, 3, 16, 42); Round3(&B,C,D,A, 6, 23, 43); - Round3(&A,B,C,D, 9, 4, 44); Round3(&D,A,B,C, 12, 11, 45); Round3(&C,D,A,B, 15, 16, 46); Round3(&B,C,D,A, 2, 23, 47); - - //Round 4 - Round4(&A,B,C,D, 0, 6, 48); Round4(&D,A,B,C, 7, 10, 49); Round4(&C,D,A,B, 14, 15, 50); Round4(&B,C,D,A, 5, 21, 51); - Round4(&A,B,C,D, 12, 6, 52); Round4(&D,A,B,C, 3, 10, 53); Round4(&C,D,A,B, 10, 15, 54); Round4(&B,C,D,A, 1, 21, 55); - Round4(&A,B,C,D, 8, 6, 56); Round4(&D,A,B,C, 15, 10, 57); Round4(&C,D,A,B, 6, 15, 58); Round4(&B,C,D,A, 13, 21, 59); - Round4(&A,B,C,D, 4, 6, 60); Round4(&D,A,B,C, 11, 10, 61); Round4(&C,D,A,B, 2, 15, 62); Round4(&B,C,D,A, 9, 21, 63); - - // Then perform the following additions. (let's add) - *A2 = A + AA; - *B2 = B + BB; - *C2 = C + CC; - *D2 = D + DD; - - //The clearance of confidential information - memset(pX, 0, sizeof(X)); + //create X It is since it is required. + unsigned int X[16]; //512bit 64byte + int j, k; + + //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D) + unsigned int A = *A2, B = *B2, C = *C2, D = *D2; + unsigned int AA = A, BB = B, CC = C, DD = D; + + //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4 + pX = X; + + //Copy block(padding_message) i into X + for (j = 0, k = 0; j < 64; j += 4, k++) + X[k] = ((unsigned int) block[j]) // 8byte*4 -> 32byte conversion + | (((unsigned int) block[j + 1]) << 8) // A function called Decode as used in the field of RFC + | (((unsigned int) block[j + 2]) << 16) + | (((unsigned int) block[j + 3]) << 24); + + //Round 1 + Round1 (&A, B, C, D, 0, 7, 0); + Round1 (&D, A, B, C, 1, 12, 1); + Round1 (&C, D, A, B, 2, 17, 2); + Round1 (&B, C, D, A, 3, 22, 3); + Round1 (&A, B, C, D, 4, 7, 4); + Round1 (&D, A, B, C, 5, 12, 5); + Round1 (&C, D, A, B, 6, 17, 6); + Round1 (&B, C, D, A, 7, 22, 7); + Round1 (&A, B, C, D, 8, 7, 8); + Round1 (&D, A, B, C, 9, 12, 9); + Round1 (&C, D, A, B, 10, 17, 10); + Round1 (&B, C, D, A, 11, 22, 11); + Round1 (&A, B, C, D, 12, 7, 12); + Round1 (&D, A, B, C, 13, 12, 13); + Round1 (&C, D, A, B, 14, 17, 14); + Round1 (&B, C, D, A, 15, 22, 15); + + //Round 2 + Round2 (&A, B, C, D, 1, 5, 16); + Round2 (&D, A, B, C, 6, 9, 17); + Round2 (&C, D, A, B, 11, 14, 18); + Round2 (&B, C, D, A, 0, 20, 19); + Round2 (&A, B, C, D, 5, 5, 20); + Round2 (&D, A, B, C, 10, 9, 21); + Round2 (&C, D, A, B, 15, 14, 22); + Round2 (&B, C, D, A, 4, 20, 23); + Round2 (&A, B, C, D, 9, 5, 24); + Round2 (&D, A, B, C, 14, 9, 25); + Round2 (&C, D, A, B, 3, 14, 26); + Round2 (&B, C, D, A, 8, 20, 27); + Round2 (&A, B, C, D, 13, 5, 28); + Round2 (&D, A, B, C, 2, 9, 29); + Round2 (&C, D, A, B, 7, 14, 30); + Round2 (&B, C, D, A, 12, 20, 31); + + //Round 3 + Round3 (&A, B, C, D, 5, 4, 32); + Round3 (&D, A, B, C, 8, 11, 33); + Round3 (&C, D, A, B, 11, 16, 34); + Round3 (&B, C, D, A, 14, 23, 35); + Round3 (&A, B, C, D, 1, 4, 36); + Round3 (&D, A, B, C, 4, 11, 37); + Round3 (&C, D, A, B, 7, 16, 38); + Round3 (&B, C, D, A, 10, 23, 39); + Round3 (&A, B, C, D, 13, 4, 40); + Round3 (&D, A, B, C, 0, 11, 41); + Round3 (&C, D, A, B, 3, 16, 42); + Round3 (&B, C, D, A, 6, 23, 43); + Round3 (&A, B, C, D, 9, 4, 44); + Round3 (&D, A, B, C, 12, 11, 45); + Round3 (&C, D, A, B, 15, 16, 46); + Round3 (&B, C, D, A, 2, 23, 47); + + //Round 4 + Round4 (&A, B, C, D, 0, 6, 48); + Round4 (&D, A, B, C, 7, 10, 49); + Round4 (&C, D, A, B, 14, 15, 50); + Round4 (&B, C, D, A, 5, 21, 51); + Round4 (&A, B, C, D, 12, 6, 52); + Round4 (&D, A, B, C, 3, 10, 53); + Round4 (&C, D, A, B, 10, 15, 54); + Round4 (&B, C, D, A, 1, 21, 55); + Round4 (&A, B, C, D, 8, 6, 56); + Round4 (&D, A, B, C, 15, 10, 57); + Round4 (&C, D, A, B, 6, 15, 58); + Round4 (&B, C, D, A, 13, 21, 59); + Round4 (&A, B, C, D, 4, 6, 60); + Round4 (&D, A, B, C, 11, 10, 61); + Round4 (&C, D, A, B, 2, 15, 62); + Round4 (&B, C, D, A, 9, 21, 63); + + // Then perform the following additions. (let's add) + *A2 = A + AA; + *B2 = B + BB; + *C2 = C + CC; + *D2 = D + DD; + + //The clearance of confidential information + memset (pX, 0, sizeof (X)); } //------------------------------------------------------------------- // The function for the exteriors /** output is the coded binary in the character sequence which wants to code string. */ -void MD5_String2binary(const char * string, char * output) +void MD5_String2binary (const char *string, char *output) { //var - /*8bit*/ - unsigned char padding_message[64]; //Extended message 512bit 64byte - unsigned char *pstring; //The position of string in the present scanning notes is held. + /*8bit */ + unsigned char padding_message[64]; //Extended message 512bit 64byte + unsigned char *pstring; //The position of string in the present scanning notes is held. // unsigned char digest[16]; - /*32bit*/ - unsigned int string_byte_len, //The byte chief of string is held. - string_bit_len, //The bit length of string is held. - copy_len, //The number of bytes which is used by 1-3 and which remained - msg_digest[4]; //Message digest 128bit 4byte - unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference) - *B = &msg_digest[1], - *C = &msg_digest[2], - *D = &msg_digest[3]; - int i; + /*32bit */ + unsigned int string_byte_len, //The byte chief of string is held. + string_bit_len, //The bit length of string is held. + copy_len, //The number of bytes which is used by 1-3 and which remained + msg_digest[4]; //Message digest 128bit 4byte + unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference) + *B = &msg_digest[1], *C = &msg_digest[2], *D = &msg_digest[3]; + int i; //prog - //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head) - *A = 0x67452301; - *B = 0xefcdab89; - *C = 0x98badcfe; - *D = 0x10325476; - - //Step 1.Append Padding Bits (extension of a mark bit) - //1-1 - string_byte_len = strlen(string); //The byte chief of a character sequence is acquired. - pstring = (unsigned char *)string; //The position of the present character sequence is set. - - //1-2 Repeat calculation until length becomes less than 64 bytes. - for (i=string_byte_len; 64<=i; i-=64,pstring+=64) - MD5_Round_Calculate(pstring, A,B,C,D); - - //1-3 - copy_len = string_byte_len % 64; //The number of bytes which remained is computed. - strncpy((char *)padding_message, (char *)pstring, copy_len); //A message is copied to an extended bit sequence. - memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length. - padding_message[copy_len] |= 0x80; //The next of a message is 1. - - //1-4 - //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes. - if (56 <= copy_len) { - MD5_Round_Calculate(padding_message, A,B,C,D); - memset(padding_message, 0, 56); //56 bytes is newly fill uped with 0. - } - - - //Step 2.Append Length (the information on length is added) - string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank) - memcpy(&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set. - - //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank. - if (UINT_MAX / 8 < string_byte_len) { - unsigned int high = (string_byte_len - UINT_MAX / 8) * 8; - memcpy(&padding_message[60], &high, 4); - } else - memset(&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0. - - //Step 4.Process Message in 16-Word Blocks (calculation of MD5) - MD5_Round_Calculate(padding_message, A,B,C,D); - - - //Step 5.Output (output) - memcpy(output,msg_digest,16); + //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head) + *A = 0x67452301; + *B = 0xefcdab89; + *C = 0x98badcfe; + *D = 0x10325476; + + //Step 1.Append Padding Bits (extension of a mark bit) + //1-1 + string_byte_len = strlen (string); //The byte chief of a character sequence is acquired. + pstring = (unsigned char *) string; //The position of the present character sequence is set. + + //1-2 Repeat calculation until length becomes less than 64 bytes. + for (i = string_byte_len; 64 <= i; i -= 64, pstring += 64) + MD5_Round_Calculate (pstring, A, B, C, D); + + //1-3 + copy_len = string_byte_len % 64; //The number of bytes which remained is computed. + strncpy ((char *) padding_message, (char *) pstring, copy_len); //A message is copied to an extended bit sequence. + memset (padding_message + copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length. + padding_message[copy_len] |= 0x80; //The next of a message is 1. + + //1-4 + //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes. + if (56 <= copy_len) + { + MD5_Round_Calculate (padding_message, A, B, C, D); + memset (padding_message, 0, 56); //56 bytes is newly fill uped with 0. + } + + //Step 2.Append Length (the information on length is added) + string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank) + memcpy (&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set. + + //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank. + if (UINT_MAX / 8 < string_byte_len) + { + unsigned int high = (string_byte_len - UINT_MAX / 8) * 8; + memcpy (&padding_message[60], &high, 4); + } + else + memset (&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0. + + //Step 4.Process Message in 16-Word Blocks (calculation of MD5) + MD5_Round_Calculate (padding_message, A, B, C, D); + + //Step 5.Output (output) + memcpy (output, msg_digest, 16); // memcpy (digest, msg_digest, and 16); //8 byte*4 < - 32byte conversion A function called Encode as used in the field of RFC /* sprintf(output, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", @@ -222,16 +279,15 @@ void MD5_String2binary(const char * string, char * output) } /** output is the coded character sequence in the character sequence which wants to code string. */ -void MD5_String(const char * string, char * output) +void MD5_String (const char *string, char *output) { - unsigned char digest[16]; - - MD5_String2binary(string,digest); - sprintf(output, - "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", - digest[ 0], digest[ 1], digest[ 2], digest[ 3], - digest[ 4], digest[ 5], digest[ 6], digest[ 7], - digest[ 8], digest[ 9], digest[10], digest[11], - digest[12], digest[13], digest[14], digest[15]); + unsigned char digest[16]; + + MD5_String2binary (string, digest); + sprintf (output, + "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + digest[0], digest[1], digest[2], digest[3], + digest[4], digest[5], digest[6], digest[7], + digest[8], digest[9], digest[10], digest[11], + digest[12], digest[13], digest[14], digest[15]); } - diff --git a/src/ladmin/md5calc.h b/src/ladmin/md5calc.h index b4dd614..ddf176c 100644 --- a/src/ladmin/md5calc.h +++ b/src/ladmin/md5calc.h @@ -2,7 +2,7 @@ #ifndef _MD5CALC_H_ #define _MD5CALC_H_ -void MD5_String(const char * string, char * output); -void MD5_String2binary(const char * string, char * output); +void MD5_String (const char *string, char *output); +void MD5_String2binary (const char *string, char *output); #endif diff --git a/src/login/login.c b/src/login/login.c index b44eb19..47b0967 100644 --- a/src/login/login.c +++ b/src/login/login.c @@ -9,7 +9,7 @@ #include <sys/time.h> #include <time.h> #include <sys/ioctl.h> -#include <sys/stat.h> // for stat/lstat/fstat +#include <sys/stat.h> // for stat/lstat/fstat #include <unistd.h> #include <signal.h> #include <fcntl.h> @@ -35,86 +35,91 @@ #include "memwatch.h" #endif -int account_id_count = START_ACCOUNT_NUM; -int server_num; -int new_account_flag = 0; -int login_port = 6900; +int account_id_count = START_ACCOUNT_NUM; +int server_num; +int new_account_flag = 0; +int login_port = 6900; char lan_char_ip[16]; -int subneti[4]; -int subnetmaski[4]; +int subneti[4]; +int subnetmaski[4]; char update_host[128] = ""; char main_server[20] = ""; char account_filename[1024] = "save/account.txt"; char GM_account_filename[1024] = "conf/GM_account.txt"; char login_log_filename[1024] = "log/login.log"; -char login_log_unknown_packets_filename[1024] = "log/login_unknown_packets.log"; +char login_log_unknown_packets_filename[1024] = + "log/login_unknown_packets.log"; char date_format[32] = "%Y-%m-%d %H:%M:%S"; -int save_unknown_packets = 0; +int save_unknown_packets = 0; long creation_time_GM_account_file; -int gm_account_filename_check_timer = 15; // Timer to check if GM_account file has been changed and reload GM account automaticaly (in seconds; default: 15) +int gm_account_filename_check_timer = 15; // Timer to check if GM_account file has been changed and reload GM account automaticaly (in seconds; default: 15) -int display_parse_login = 0; // 0: no, 1: yes -int display_parse_admin = 0; // 0: no, 1: yes -int display_parse_fromchar = 0; // 0: no, 1: yes (without packet 0x2714), 2: all packets +int display_parse_login = 0; // 0: no, 1: yes +int display_parse_admin = 0; // 0: no, 1: yes +int display_parse_fromchar = 0; // 0: no, 1: yes (without packet 0x2714), 2: all packets struct mmo_char_server server[MAX_SERVERS]; -int server_fd[MAX_SERVERS]; -int server_freezeflag[MAX_SERVERS]; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed -int anti_freeze_enable = 0; -int ANTI_FREEZE_INTERVAL = 15; - -int login_fd; - -enum { - ACO_DENY_ALLOW = 0, - ACO_ALLOW_DENY, - ACO_MUTUAL_FAILTURE, - ACO_STRSIZE = 128, +int server_fd[MAX_SERVERS]; +int server_freezeflag[MAX_SERVERS]; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed +int anti_freeze_enable = 0; +int ANTI_FREEZE_INTERVAL = 15; + +int login_fd; + +enum +{ + ACO_DENY_ALLOW = 0, + ACO_ALLOW_DENY, + ACO_MUTUAL_FAILTURE, + ACO_STRSIZE = 128, }; -int access_order = ACO_DENY_ALLOW; -int access_allownum = 0; -int access_denynum = 0; +int access_order = ACO_DENY_ALLOW; +int access_allownum = 0; +int access_denynum = 0; char *access_allow = NULL; char *access_deny = NULL; -int access_ladmin_allownum = 0; +int access_ladmin_allownum = 0; char *access_ladmin_allow = NULL; -int min_level_to_connect = 0; // minimum level of player/GM (0: player, 1-99: gm) to connect on the server -int add_to_unlimited_account = 0; // Give possibility or not to adjust (ladmin command: timeadd) the time of an unlimited account. -int start_limited_time = -1; // Starting additional sec from now for the limited time at creation of accounts (-1: unlimited time, 0 or more: additional sec from now) -int check_ip_flag = 1; // It's to check IP of a player between login-server and char-server (part of anti-hacking system) +int min_level_to_connect = 0; // minimum level of player/GM (0: player, 1-99: gm) to connect on the server +int add_to_unlimited_account = 0; // Give possibility or not to adjust (ladmin command: timeadd) the time of an unlimited account. +int start_limited_time = -1; // Starting additional sec from now for the limited time at creation of accounts (-1: unlimited time, 0 or more: additional sec from now) +int check_ip_flag = 1; // It's to check IP of a player between login-server and char-server (part of anti-hacking system) -struct login_session_data { - int md5keylen; - char md5key[20]; +struct login_session_data +{ + int md5keylen; + char md5key[20]; }; #define AUTH_FIFO_SIZE 256 -struct { - int account_id, login_id1, login_id2; - int ip, sex, delflag; +struct +{ + int account_id, login_id1, login_id2; + int ip, sex, delflag; } auth_fifo[AUTH_FIFO_SIZE]; -int auth_fifo_pos = 0; - -struct auth_dat { - int account_id, sex; - char userid[24], pass[24], lastlogin[24]; - int logincount; - int state; // packet 0x006a value + 1 (0: compte OK) - char email[40]; // e-mail (by default: a@a.com) - char error_message[20]; // Message of error code #6 = Your are Prohibited to log in until %s (packet 0x006a) - time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban) - time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) - char last_ip[16]; // save of last IP of connection - char memo[255]; // a memo field - int account_reg2_num; - struct global_reg account_reg2[ACCOUNT_REG2_NUM]; -} *auth_dat; - -int auth_num = 0, auth_max = 0; +int auth_fifo_pos = 0; + +struct auth_dat +{ + int account_id, sex; + char userid[24], pass[24], lastlogin[24]; + int logincount; + int state; // packet 0x006a value + 1 (0: compte OK) + char email[40]; // e-mail (by default: a@a.com) + char error_message[20]; // Message of error code #6 = Your are Prohibited to log in until %s (packet 0x006a) + time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban) + time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) + char last_ip[16]; // save of last IP of connection + char memo[255]; // a memo field + int account_reg2_num; + struct global_reg account_reg2[ACCOUNT_REG2_NUM]; +} *auth_dat; + +int auth_num = 0, auth_max = 0; // define the number of times that some players must authentify them before to save account file. // it's just about normal authentification. If an account is created or modified, save is immediatly done. @@ -123,294 +128,358 @@ int auth_num = 0, auth_max = 0; #define AUTH_BEFORE_SAVE_FILE 10 // set divider of auth_num to found number of change before save #define AUTH_SAVE_FILE_DIVIDER 50 -int auth_before_save_file = 0; // Counter. First save when 1st char-server do connection. +int auth_before_save_file = 0; // Counter. First save when 1st char-server do connection. -int admin_state = 0; +int admin_state = 0; char admin_pass[24] = ""; char gm_pass[64] = ""; -int level_new_gm = 60; +int level_new_gm = 60; static struct dbt *gm_account_db; -#define VERSION_2_UPDATEHOST 0x01 // client supports updatehost -#define VERSION_2_SERVERORDER 0x02 // send servers in forward order +#define VERSION_2_UPDATEHOST 0x01 // client supports updatehost +#define VERSION_2_SERVERORDER 0x02 // send servers in forward order //------------------------------ // Writing function of logs file //------------------------------ -int login_log(char *fmt, ...) { - FILE *logfp; - va_list ap; - struct timeval tv; - char tmpstr[2048]; - - va_start(ap, fmt); - - logfp = fopen_(login_log_filename, "a"); - if (logfp) { - if (fmt[0] == '\0') // jump a line if no message - fprintf(logfp, RETCODE); - else { - gettimeofday(&tv, NULL); - strftime(tmpstr, 24, date_format, gmtime(&(tv.tv_sec))); - sprintf(tmpstr + strlen(tmpstr), ".%03d: %s", (int)tv.tv_usec / 1000, fmt); - vfprintf(logfp, tmpstr, ap); - } - fclose_(logfp); - } - - va_end(ap); - return 0; +int login_log (char *fmt, ...) +{ + FILE *logfp; + va_list ap; + struct timeval tv; + char tmpstr[2048]; + + va_start (ap, fmt); + + logfp = fopen_ (login_log_filename, "a"); + if (logfp) + { + if (fmt[0] == '\0') // jump a line if no message + fprintf (logfp, RETCODE); + else + { + gettimeofday (&tv, NULL); + strftime (tmpstr, 24, date_format, gmtime (&(tv.tv_sec))); + sprintf (tmpstr + strlen (tmpstr), ".%03d: %s", + (int) tv.tv_usec / 1000, fmt); + vfprintf (logfp, tmpstr, ap); + } + fclose_ (logfp); + } + + va_end (ap); + return 0; } //---------------------------------------------------------------------- // Determine if an account (id) is a GM account // and returns its level (or 0 if it isn't a GM account or if not found) //---------------------------------------------------------------------- -int isGM(int account_id) { - struct gm_account *p; - - p = numdb_search(gm_account_db, account_id); - if (p == NULL) - return 0; - return p->level; +int isGM (int account_id) +{ + struct gm_account *p; + + p = numdb_search (gm_account_db, account_id); + if (p == NULL) + return 0; + return p->level; } //------------------------------------------------------- // Reading function of GM accounts file (and their level) //------------------------------------------------------- -int read_gm_account() { - char line[512]; - struct gm_account *p; - FILE *fp; - int c = 0; - int GM_level; - struct stat file_stat; - - free(gm_account_db); - gm_account_db = numdb_init(); - - // get last modify time/date - if (stat(GM_account_filename, &file_stat)) - creation_time_GM_account_file = 0; // error - else - creation_time_GM_account_file = file_stat.st_mtime; - - if ((fp = fopen_(GM_account_filename, "r")) == NULL) { - printf("read_gm_account: GM accounts file [%s] not found.\n", GM_account_filename); - printf(" Actually, there is no GM accounts on the server.\n"); - login_log("read_gm_account: GM accounts file [%s] not found." RETCODE, GM_account_filename); - login_log(" Actually, there is no GM accounts on the server." RETCODE); - return 1; - } - // limited to 4000, because we send information to char-servers (more than 4000 GM accounts???) - // int (id) + int (level) = 8 bytes * 4000 = 32k (limit of packets in windows) - while(fgets(line, sizeof(line)-1, fp) && c < 4000) { - if ((line[0] == '/' && line[1] == '/') || line[0] == '\0' || line[0] == '\n' || line[0] == '\r') - continue; - p = calloc(sizeof(struct gm_account), 1); - if (p == NULL) { - printf("read_gm_account: memory allocation failure (malloc)!\n"); - exit(0); - } - if (sscanf(line, "%d %d", &p->account_id, &p->level) != 2 && sscanf(line, "%d: %d", &p->account_id, &p->level) != 2) - printf("read_gm_account: file [%s], invalid 'id_acount level' format.\n", GM_account_filename); - else if (p->level <= 0) - printf("read_gm_account: file [%s] %dth account (invalid level [0 or negative]: %d).\n", GM_account_filename, c+1, p->level); - else { - if (p->level > 99) { - printf("read_gm_account: file [%s] %dth account (invalid level, but corrected: %d->99).\n", GM_account_filename, c+1, p->level); - p->level = 99; - } - if ((GM_level = isGM(p->account_id)) > 0) { // if it's not a new account - if (GM_level == p->level) - printf("read_gm_account: GM account %d defined twice (same level: %d).\n", p->account_id, p->level); - else - printf("read_gm_account: GM account %d defined twice (levels: %d and %d).\n", p->account_id, GM_level, p->level); - } - if (GM_level != p->level) { // if new account or new level - numdb_insert(gm_account_db, p->account_id, p); - //printf("GM account:%d, level: %d->%d\n", p->account_id, GM_level, p->level); - if (GM_level == 0) { // if new account - c++; - if (c >= 4000) { - printf("***WARNING: 4000 GM accounts found. Next GM accounts are not readed.\n"); - login_log("***WARNING: 4000 GM accounts found. Next GM accounts are not readed." RETCODE); - } - } - } - } - } - fclose_(fp); - - printf("read_gm_account: file '%s' readed (%d GM accounts found).\n", GM_account_filename, c); - login_log("read_gm_account: file '%s' readed (%d GM accounts found)." RETCODE, GM_account_filename, c); - - return 0; +int read_gm_account () +{ + char line[512]; + struct gm_account *p; + FILE *fp; + int c = 0; + int GM_level; + struct stat file_stat; + + free (gm_account_db); + gm_account_db = numdb_init (); + + // get last modify time/date + if (stat (GM_account_filename, &file_stat)) + creation_time_GM_account_file = 0; // error + else + creation_time_GM_account_file = file_stat.st_mtime; + + if ((fp = fopen_ (GM_account_filename, "r")) == NULL) + { + printf ("read_gm_account: GM accounts file [%s] not found.\n", + GM_account_filename); + printf + (" Actually, there is no GM accounts on the server.\n"); + login_log ("read_gm_account: GM accounts file [%s] not found." + RETCODE, GM_account_filename); + login_log + (" Actually, there is no GM accounts on the server." + RETCODE); + return 1; + } + // limited to 4000, because we send information to char-servers (more than 4000 GM accounts???) + // int (id) + int (level) = 8 bytes * 4000 = 32k (limit of packets in windows) + while (fgets (line, sizeof (line) - 1, fp) && c < 4000) + { + if ((line[0] == '/' && line[1] == '/') || line[0] == '\0' + || line[0] == '\n' || line[0] == '\r') + continue; + p = calloc (sizeof (struct gm_account), 1); + if (p == NULL) + { + printf ("read_gm_account: memory allocation failure (malloc)!\n"); + exit (0); + } + if (sscanf (line, "%d %d", &p->account_id, &p->level) != 2 + && sscanf (line, "%d: %d", &p->account_id, &p->level) != 2) + printf + ("read_gm_account: file [%s], invalid 'id_acount level' format.\n", + GM_account_filename); + else if (p->level <= 0) + printf + ("read_gm_account: file [%s] %dth account (invalid level [0 or negative]: %d).\n", + GM_account_filename, c + 1, p->level); + else + { + if (p->level > 99) + { + printf + ("read_gm_account: file [%s] %dth account (invalid level, but corrected: %d->99).\n", + GM_account_filename, c + 1, p->level); + p->level = 99; + } + if ((GM_level = isGM (p->account_id)) > 0) + { // if it's not a new account + if (GM_level == p->level) + printf + ("read_gm_account: GM account %d defined twice (same level: %d).\n", + p->account_id, p->level); + else + printf + ("read_gm_account: GM account %d defined twice (levels: %d and %d).\n", + p->account_id, GM_level, p->level); + } + if (GM_level != p->level) + { // if new account or new level + numdb_insert (gm_account_db, p->account_id, p); + //printf("GM account:%d, level: %d->%d\n", p->account_id, GM_level, p->level); + if (GM_level == 0) + { // if new account + c++; + if (c >= 4000) + { + printf + ("***WARNING: 4000 GM accounts found. Next GM accounts are not readed.\n"); + login_log + ("***WARNING: 4000 GM accounts found. Next GM accounts are not readed." + RETCODE); + } + } + } + } + } + fclose_ (fp); + + printf ("read_gm_account: file '%s' readed (%d GM accounts found).\n", + GM_account_filename, c); + login_log ("read_gm_account: file '%s' readed (%d GM accounts found)." + RETCODE, GM_account_filename, c); + + return 0; } //-------------------------------------------------------------- // Test of the IP mask // (ip: IP to be tested, str: mask x.x.x.x/# or x.x.x.x/y.y.y.y) //-------------------------------------------------------------- -int check_ipmask(unsigned int ip, const unsigned char *str) { - unsigned int mask = 0, i = 0, m, ip2, a0, a1, a2, a3; - unsigned char *p = (unsigned char *)&ip2, *p2 = (unsigned char *)&mask; - - if (sscanf(str, "%d.%d.%d.%d/%n", &a0, &a1, &a2, &a3, &i) != 4 || i == 0) - return 0; - p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3; - - if (sscanf(str+i, "%d.%d.%d.%d", &a0, &a1, &a2, &a3) == 4) { - p2[0] = a0; p2[1] = a1; p2[2] = a2; p2[3] = a3; - mask = ntohl(mask); - } else if (sscanf(str+i, "%d", &m) == 1 && m >= 0 && m <= 32) { - for(i = 0; i < m && i < 32; i++) - mask = (mask >> 1) | 0x80000000; - } else { - printf("check_ipmask: invalid mask [%s].\n", str); - return 0; - } - -// printf("Tested IP: %08x, network: %08x, network mask: %08x\n", -// (unsigned int)ntohl(ip), (unsigned int)ntohl(ip2), (unsigned int)mask); - return ((ntohl(ip) & mask) == (ntohl(ip2) & mask)); +int check_ipmask (unsigned int ip, const unsigned char *str) +{ + unsigned int mask = 0, i = 0, m, ip2, a0, a1, a2, a3; + unsigned char *p = (unsigned char *) &ip2, *p2 = (unsigned char *) &mask; + + if (sscanf (str, "%d.%d.%d.%d/%n", &a0, &a1, &a2, &a3, &i) != 4 || i == 0) + return 0; + p[0] = a0; + p[1] = a1; + p[2] = a2; + p[3] = a3; + + if (sscanf (str + i, "%d.%d.%d.%d", &a0, &a1, &a2, &a3) == 4) + { + p2[0] = a0; + p2[1] = a1; + p2[2] = a2; + p2[3] = a3; + mask = ntohl (mask); + } + else if (sscanf (str + i, "%d", &m) == 1 && m >= 0 && m <= 32) + { + for (i = 0; i < m && i < 32; i++) + mask = (mask >> 1) | 0x80000000; + } + else + { + printf ("check_ipmask: invalid mask [%s].\n", str); + return 0; + } + +// printf("Tested IP: %08x, network: %08x, network mask: %08x\n", +// (unsigned int)ntohl(ip), (unsigned int)ntohl(ip2), (unsigned int)mask); + return ((ntohl (ip) & mask) == (ntohl (ip2) & mask)); } //--------------------- // Access control by IP //--------------------- -int check_ip(unsigned int ip) { - int i; - unsigned char *p = (unsigned char *)&ip; - char buf[32]; - enum { ACF_DEF, ACF_ALLOW, ACF_DENY } flag = ACF_DEF; - - if (access_allownum == 0 && access_denynum == 0) - return 1; // When there is no restriction, all IP are authorised. - -// + 012.345.: front match form, or -// all: all IP are matched, or -// 012.345.678.901/24: network form (mask with # of bits), or -// 012.345.678.901/255.255.255.0: network form (mask with ip mask) -// + Note about the DNS resolution (like www.ne.jp, etc.): -// There is no guarantee to have an answer. -// If we have an answer, there is no guarantee to have a 100% correct value. -// And, the waiting time (to check) can be long (over 1 minute to a timeout). That can block the software. -// So, DNS notation isn't authorised for ip checking. - sprintf(buf, "%d.%d.%d.%d.", p[0], p[1], p[2], p[3]); - - for(i = 0; i < access_allownum; i++) { - const char *p = access_allow + i * ACO_STRSIZE; - if (memcmp(p, buf, strlen(p)) == 0 || check_ipmask(ip, p)) { - flag = ACF_ALLOW; - if (access_order == ACO_ALLOW_DENY) - return 1; // With 'allow, deny' (deny if not allow), allow has priority - break; - } - } - - for(i = 0; i < access_denynum; i++) { - const char *p = access_deny + i * ACO_STRSIZE; - if (memcmp(p, buf, strlen(p)) == 0 || check_ipmask(ip, p)) { - flag = ACF_DENY; - return 0; // At this point, if it's 'deny', we refuse connection. - break; - } - } - - return (flag == ACF_ALLOW || access_order == ACO_DENY_ALLOW) ? 1:0; - // With 'mutual-failture', only 'allow' and non 'deny' IP are authorised. - // A non 'allow' (even non 'deny') IP is not authorised. It's like: if allowed and not denied, it's authorised. - // So, it's disapproval if you have no description at the time of 'mutual-failture'. - // With 'deny,allow' (allow if not deny), because here it's not deny, we authorise. +int check_ip (unsigned int ip) +{ + int i; + unsigned char *p = (unsigned char *) &ip; + char buf[32]; + enum + { ACF_DEF, ACF_ALLOW, ACF_DENY } flag = ACF_DEF; + + if (access_allownum == 0 && access_denynum == 0) + return 1; // When there is no restriction, all IP are authorised. + +// + 012.345.: front match form, or +// all: all IP are matched, or +// 012.345.678.901/24: network form (mask with # of bits), or +// 012.345.678.901/255.255.255.0: network form (mask with ip mask) +// + Note about the DNS resolution (like www.ne.jp, etc.): +// There is no guarantee to have an answer. +// If we have an answer, there is no guarantee to have a 100% correct value. +// And, the waiting time (to check) can be long (over 1 minute to a timeout). That can block the software. +// So, DNS notation isn't authorised for ip checking. + sprintf (buf, "%d.%d.%d.%d.", p[0], p[1], p[2], p[3]); + + for (i = 0; i < access_allownum; i++) + { + const char *p = access_allow + i * ACO_STRSIZE; + if (memcmp (p, buf, strlen (p)) == 0 || check_ipmask (ip, p)) + { + flag = ACF_ALLOW; + if (access_order == ACO_ALLOW_DENY) + return 1; // With 'allow, deny' (deny if not allow), allow has priority + break; + } + } + + for (i = 0; i < access_denynum; i++) + { + const char *p = access_deny + i * ACO_STRSIZE; + if (memcmp (p, buf, strlen (p)) == 0 || check_ipmask (ip, p)) + { + flag = ACF_DENY; + return 0; // At this point, if it's 'deny', we refuse connection. + break; + } + } + + return (flag == ACF_ALLOW || access_order == ACO_DENY_ALLOW) ? 1 : 0; + // With 'mutual-failture', only 'allow' and non 'deny' IP are authorised. + // A non 'allow' (even non 'deny') IP is not authorised. It's like: if allowed and not denied, it's authorised. + // So, it's disapproval if you have no description at the time of 'mutual-failture'. + // With 'deny,allow' (allow if not deny), because here it's not deny, we authorise. } //-------------------------------- // Access control by IP for ladmin //-------------------------------- -int check_ladminip(unsigned int ip) { - int i; - unsigned char *p = (unsigned char *)&ip; - char buf[32]; - - if (access_ladmin_allownum == 0) - return 1; // When there is no restriction, all IP are authorised. - -// + 012.345.: front match form, or -// all: all IP are matched, or -// 012.345.678.901/24: network form (mask with # of bits), or -// 012.345.678.901/255.255.255.0: network form (mask with ip mask) -// + Note about the DNS resolution (like www.ne.jp, etc.): -// There is no guarantee to have an answer. -// If we have an answer, there is no guarantee to have a 100% correct value. -// And, the waiting time (to check) can be long (over 1 minute to a timeout). That can block the software. -// So, DNS notation isn't authorised for ip checking. - sprintf(buf, "%d.%d.%d.%d.", p[0], p[1], p[2], p[3]); - - for(i = 0; i < access_ladmin_allownum; i++) { - const char *p = access_ladmin_allow + i * ACO_STRSIZE; - if (memcmp(p, buf, strlen(p)) == 0 || check_ipmask(ip, p)) { - return 1; - } - } - - return 0; +int check_ladminip (unsigned int ip) +{ + int i; + unsigned char *p = (unsigned char *) &ip; + char buf[32]; + + if (access_ladmin_allownum == 0) + return 1; // When there is no restriction, all IP are authorised. + +// + 012.345.: front match form, or +// all: all IP are matched, or +// 012.345.678.901/24: network form (mask with # of bits), or +// 012.345.678.901/255.255.255.0: network form (mask with ip mask) +// + Note about the DNS resolution (like www.ne.jp, etc.): +// There is no guarantee to have an answer. +// If we have an answer, there is no guarantee to have a 100% correct value. +// And, the waiting time (to check) can be long (over 1 minute to a timeout). That can block the software. +// So, DNS notation isn't authorised for ip checking. + sprintf (buf, "%d.%d.%d.%d.", p[0], p[1], p[2], p[3]); + + for (i = 0; i < access_ladmin_allownum; i++) + { + const char *p = access_ladmin_allow + i * ACO_STRSIZE; + if (memcmp (p, buf, strlen (p)) == 0 || check_ipmask (ip, p)) + { + return 1; + } + } + + return 0; } //----------------------------------------------------- // Function to suppress control characters in a string. //----------------------------------------------------- -int remove_control_chars(unsigned char *str) { - int i; - int change = 0; - - for(i = 0; str[i]; i++) { - if (str[i] < 32) { - str[i] = '_'; - change = 1; - } - } - - return change; +int remove_control_chars (unsigned char *str) +{ + int i; + int change = 0; + + for (i = 0; str[i]; i++) + { + if (str[i] < 32) + { + str[i] = '_'; + change = 1; + } + } + + return change; } //--------------------------------------------------- // E-mail check: return 0 (not correct) or 1 (valid). //--------------------------------------------------- -int e_mail_check(unsigned char *email) { - char ch; - unsigned char* last_arobas; - - // athena limits - if (strlen(email) < 3 || strlen(email) > 39) - return 0; - - // part of RFC limits (official reference of e-mail description) - if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@') - return 0; - - if (email[strlen(email)-1] == '.') - return 0; - - last_arobas = strrchr(email, '@'); - - if (strstr(last_arobas, "@.") != NULL || - strstr(last_arobas, "..") != NULL) - return 0; - - for(ch = 1; ch < 32; ch++) { - if (strchr(last_arobas, ch) != NULL) { - return 0; - break; - } - } - - if (strchr(last_arobas, ' ') != NULL || - strchr(last_arobas, ';') != NULL) - return 0; - - // all correct - return 1; +int e_mail_check (unsigned char *email) +{ + char ch; + unsigned char *last_arobas; + + // athena limits + if (strlen (email) < 3 || strlen (email) > 39) + return 0; + + // part of RFC limits (official reference of e-mail description) + if (strchr (email, '@') == NULL || email[strlen (email) - 1] == '@') + return 0; + + if (email[strlen (email) - 1] == '.') + return 0; + + last_arobas = strrchr (email, '@'); + + if (strstr (last_arobas, "@.") != NULL || + strstr (last_arobas, "..") != NULL) + return 0; + + for (ch = 1; ch < 32; ch++) + { + if (strchr (last_arobas, ch) != NULL) + { + return 0; + break; + } + } + + if (strchr (last_arobas, ' ') != NULL || + strchr (last_arobas, ';') != NULL) + return 0; + + // all correct + return 1; } //----------------------------------------------- @@ -421,426 +490,568 @@ int e_mail_check(unsigned char *email) { // and returns index if only 1 account is found // and similar to the searched name. //----------------------------------------------- -int search_account_index(char* account_name) { - int i, quantity, index; - - quantity = 0; - index = -1; - for(i = 0; i < auth_num; i++) { - // Without case sensitive check (increase the number of similar account names found) - if (stricmp(auth_dat[i].userid, account_name) == 0) { - // Strict comparison (if found, we finish the function immediatly with correct value) - if (strcmp(auth_dat[i].userid, account_name) == 0) - return i; - quantity++; - index = i; - } - } - // Here, the exact account name is not found - // We return the found index of a similar account ONLY if there is 1 similar account - if (quantity == 1) - return index; - - // Exact account name is not found and 0 or more than 1 similar accounts have been found ==> we say not found - return -1; +int search_account_index (char *account_name) +{ + int i, quantity, index; + + quantity = 0; + index = -1; + for (i = 0; i < auth_num; i++) + { + // Without case sensitive check (increase the number of similar account names found) + if (stricmp (auth_dat[i].userid, account_name) == 0) + { + // Strict comparison (if found, we finish the function immediatly with correct value) + if (strcmp (auth_dat[i].userid, account_name) == 0) + return i; + quantity++; + index = i; + } + } + // Here, the exact account name is not found + // We return the found index of a similar account ONLY if there is 1 similar account + if (quantity == 1) + return index; + + // Exact account name is not found and 0 or more than 1 similar accounts have been found ==> we say not found + return -1; } //-------------------------------------------------------- // Create a string to save the account in the account file //-------------------------------------------------------- -int mmo_auth_tostr(char *str, struct auth_dat *p) { - int i; - char *str_p = str; - - str_p += sprintf(str_p, "%d\t%s\t%s\t%s\t%c\t%d\t%d\t" - "%s\t%s\t%ld\t%s\t%s\t%ld\t", - p->account_id, p->userid, p->pass, p->lastlogin, - (p->sex == 2) ? 'S' : (p->sex ? 'M' : 'F'), - p->logincount, p->state, - p->email, p->error_message, - p->connect_until_time, p->last_ip, p->memo, p->ban_until_time); - - for(i = 0; i < p->account_reg2_num; i++) - if (p->account_reg2[i].str[0]) - str_p += sprintf(str_p, "%s,%d ", p->account_reg2[i].str, p->account_reg2[i].value); - - return 0; +int mmo_auth_tostr (char *str, struct auth_dat *p) +{ + int i; + char *str_p = str; + + str_p += sprintf (str_p, "%d\t%s\t%s\t%s\t%c\t%d\t%d\t" + "%s\t%s\t%ld\t%s\t%s\t%ld\t", + p->account_id, p->userid, p->pass, p->lastlogin, + (p->sex == 2) ? 'S' : (p->sex ? 'M' : 'F'), + p->logincount, p->state, + p->email, p->error_message, + p->connect_until_time, p->last_ip, p->memo, + p->ban_until_time); + + for (i = 0; i < p->account_reg2_num; i++) + if (p->account_reg2[i].str[0]) + str_p += + sprintf (str_p, "%s,%d ", p->account_reg2[i].str, + p->account_reg2[i].value); + + return 0; } //--------------------------------- // Reading of the accounts database //--------------------------------- -int mmo_auth_init(void) { - FILE *fp; - int account_id, logincount, state, n, i, j, v; - char line[2048], *p, userid[2048], pass[2048], lastlogin[2048], sex, email[2048], error_message[2048], last_ip[2048], memo[2048]; - time_t ban_until_time; - time_t connect_until_time; - char str[2048]; - int GM_count = 0; - int server_count = 0; - - auth_dat = calloc(sizeof(struct auth_dat) * 256, 1); - auth_max = 256; - - fp = fopen_(account_filename, "r"); - if (fp == NULL) { - // no account file -> no account -> no login, including char-server (ERROR) - printf("\033[1;31mmmo_auth_init: Accounts file [%s] not found.\033[0m\n", account_filename); - return 0; - } - - while(fgets(line, sizeof(line)-1, fp) != NULL) { - if (line[0] == '/' && line[1] == '/') - continue; - line[sizeof(line)-1] = '\0'; - p = line; - - // database version reading (v2) - if (((i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t" - "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]\t%ld%n", - &account_id, userid, pass, lastlogin, &sex, &logincount, &state, - email, error_message, &connect_until_time, last_ip, memo, &ban_until_time, &n)) == 13 && line[n] == '\t') || - ((i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t" - "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]%n", - &account_id, userid, pass, lastlogin, &sex, &logincount, &state, - email, error_message, &connect_until_time, last_ip, memo, &n)) == 12 && line[n] == '\t')) { - n = n + 1; - - // Some checks - if (account_id > END_ACCOUNT_NUM) { - printf("\033[1;31mmmo_auth_init: ******Error: an account has an id higher than %d\n", END_ACCOUNT_NUM); - printf(" account id #%d -> account not read (saved in log file).\033[0m\n", account_id); - login_log("mmmo_auth_init: ******Error: an account has an id higher than %d." RETCODE, END_ACCOUNT_NUM); - login_log(" account id #%d -> account not read (saved in next line):" RETCODE, account_id); - login_log("%s", line); - continue; - } - userid[23] = '\0'; - remove_control_chars(userid); - for(j = 0; j < auth_num; j++) { - if (auth_dat[j].account_id == account_id) { - printf("\033[1;31mmmo_auth_init: ******Error: an account has an identical id to another.\n"); - printf(" account id #%d -> new account not read (saved in log file).\033[0m\n", account_id); - login_log("mmmo_auth_init: ******Error: an account has an identical id to another." RETCODE); - login_log(" account id #%d -> new account not read (saved in next line):" RETCODE, account_id); - login_log("%s", line); - break; - } else if (strcmp(auth_dat[j].userid, userid) == 0) { - printf("\033[1;31mmmo_auth_init: ******Error: account name already exists.\n"); - printf(" account name '%s' -> new account not read.\n", userid); // 2 lines, account name can be long. - printf(" Account saved in log file.\033[0m\n"); - login_log("mmmo_auth_init: ******Error: an account has an identical id to another." RETCODE); - login_log(" account id #%d -> new account not read (saved in next line):" RETCODE, account_id); - login_log("%s", line); - break; - } - } - if (j != auth_num) - continue; - - if (auth_num >= auth_max) { - auth_max += 256; - auth_dat = realloc(auth_dat, sizeof(struct auth_dat) * auth_max); - } - - memset(&auth_dat[auth_num], '\0', sizeof(struct auth_dat)); - - auth_dat[auth_num].account_id = account_id; - - strncpy(auth_dat[auth_num].userid, userid, 24); - - pass[23] = '\0'; - remove_control_chars(pass); - strncpy(auth_dat[auth_num].pass, pass, 24); - - lastlogin[23] = '\0'; - remove_control_chars(lastlogin); - strncpy(auth_dat[auth_num].lastlogin, lastlogin, 24); - - auth_dat[auth_num].sex = (sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm'); - - if (logincount >= 0) - auth_dat[auth_num].logincount = logincount; - else - auth_dat[auth_num].logincount = 0; - - if (state > 255) - auth_dat[auth_num].state = 100; - else if (state < 0) - auth_dat[auth_num].state = 0; - else - auth_dat[auth_num].state = state; - - if (e_mail_check(email) == 0) { - printf("Account %s (%d): invalid e-mail (replaced par a@a.com).\n", auth_dat[auth_num].userid, auth_dat[auth_num].account_id); - strncpy(auth_dat[auth_num].email, "a@a.com", 40); - } else { - remove_control_chars(email); - strncpy(auth_dat[auth_num].email, email, 40); - } - - error_message[19] = '\0'; - remove_control_chars(error_message); - if (error_message[0] == '\0' || state != 7) { // 7, because state is packet 0x006a value + 1 - strncpy(auth_dat[auth_num].error_message, "-", 20); - } else { - strncpy(auth_dat[auth_num].error_message, error_message, 20); - } - - if (i == 13) - auth_dat[auth_num].ban_until_time = ban_until_time; - else - auth_dat[auth_num].ban_until_time = 0; - - auth_dat[auth_num].connect_until_time = connect_until_time; - - last_ip[15] = '\0'; - remove_control_chars(last_ip); - strncpy(auth_dat[auth_num].last_ip, last_ip, 16); - - memo[254] = '\0'; - remove_control_chars(memo); - strncpy(auth_dat[auth_num].memo, memo, 255); - - for(j = 0; j < ACCOUNT_REG2_NUM; j++) { - p += n; - if (sscanf(p, "%[^\t,],%d %n", str, &v, &n) != 2) { - // We must check if a str is void. If it's, we can continue to read other REG2. - // Account line will have something like: str2,9 ,9 str3,1 (here, ,9 is not good) - if (p[0] == ',' && sscanf(p, ",%d %n", &v, &n) == 1) { - j--; - continue; - } else - break; - } - str[31] = '\0'; - remove_control_chars(str); - strncpy(auth_dat[auth_num].account_reg2[j].str, str, 32); - auth_dat[auth_num].account_reg2[j].value = v; - } - auth_dat[auth_num].account_reg2_num = j; - - if (isGM(account_id) > 0) - GM_count++; - if (auth_dat[auth_num].sex == 2) - server_count++; - - auth_num++; - if (account_id >= account_id_count) - account_id_count = account_id + 1; - - // Old athena database version reading (v1) - } else if ((i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t%n", - &account_id, userid, pass, lastlogin, &sex, &logincount, &state, &n)) >= 5) { - if (account_id > END_ACCOUNT_NUM) { - printf("\033[1;31mmmo_auth_init: ******Error: an account has an id higher than %d\n", END_ACCOUNT_NUM); - printf(" account id #%d -> account not read (saved in log file).\033[0m\n", account_id); - login_log("mmmo_auth_init: ******Error: an account has an id higher than %d." RETCODE, END_ACCOUNT_NUM); - login_log(" account id #%d -> account not read (saved in next line):" RETCODE, account_id); - login_log("%s", line); - continue; - } - userid[23] = '\0'; - remove_control_chars(userid); - for(j = 0; j < auth_num; j++) { - if (auth_dat[j].account_id == account_id) { - printf("\033[1;31mmmo_auth_init: ******Error: an account has an identical id to another.\n"); - printf(" account id #%d -> new account not read (saved in log file).\033[0m\n", account_id); - login_log("mmmo_auth_init: ******Error: an account has an identical id to another." RETCODE); - login_log(" account id #%d -> new account not read (saved in next line):" RETCODE, account_id); - login_log("%s", line); - break; - } else if (strcmp(auth_dat[j].userid, userid) == 0) { - printf("\033[1;31mmmo_auth_init: ******Error: account name already exists.\n"); - printf(" account name '%s' -> new account not read.\n", userid); // 2 lines, account name can be long. - printf(" Account saved in log file.\033[0m\n"); - login_log("mmmo_auth_init: ******Error: an account has an identical id to another." RETCODE); - login_log(" account id #%d -> new account not read (saved in next line):" RETCODE, account_id); - login_log("%s", line); - break; - } - } - if (j != auth_num) - continue; - - if (auth_num >= auth_max) { - auth_max += 256; - auth_dat = realloc(auth_dat, sizeof(struct auth_dat) * auth_max); - } - - memset(&auth_dat[auth_num], '\0', sizeof(struct auth_dat)); - - auth_dat[auth_num].account_id = account_id; - - strncpy(auth_dat[auth_num].userid, userid, 24); - - pass[23] = '\0'; - remove_control_chars(pass); - strncpy(auth_dat[auth_num].pass, pass, 24); - - lastlogin[23] = '\0'; - remove_control_chars(lastlogin); - strncpy(auth_dat[auth_num].lastlogin, lastlogin, 24); - - auth_dat[auth_num].sex = (sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm'); - - if (i >= 6) { - if (logincount >= 0) - auth_dat[auth_num].logincount = logincount; - else - auth_dat[auth_num].logincount = 0; - } else - auth_dat[auth_num].logincount = 0; - - if (i >= 7) { - if (state > 255) - auth_dat[auth_num].state = 100; - else if (state < 0) - auth_dat[auth_num].state = 0; - else - auth_dat[auth_num].state = state; - } else - auth_dat[auth_num].state = 0; - - // Initialization of new data - strncpy(auth_dat[auth_num].email, "a@a.com", 40); - strncpy(auth_dat[auth_num].error_message, "-", 20); - auth_dat[auth_num].ban_until_time = 0; - auth_dat[auth_num].connect_until_time = 0; - strncpy(auth_dat[auth_num].last_ip, "-", 16); - strncpy(auth_dat[auth_num].memo, "-", 255); - - for(j = 0; j < ACCOUNT_REG2_NUM; j++) { - p += n; - if (sscanf(p, "%[^\t,],%d %n", str, &v, &n) != 2) { - // We must check if a str is void. If it's, we can continue to read other REG2. - // Account line will have something like: str2,9 ,9 str3,1 (here, ,9 is not good) - if (p[0] == ',' && sscanf(p, ",%d %n", &v, &n) == 1) { - j--; - continue; - } else - break; - } - str[31] = '\0'; - remove_control_chars(str); - strncpy(auth_dat[auth_num].account_reg2[j].str, str, 32); - auth_dat[auth_num].account_reg2[j].value = v; - } - auth_dat[auth_num].account_reg2_num = j; - - if (isGM(account_id) > 0) - GM_count++; - if (auth_dat[auth_num].sex == 2) - server_count++; - - auth_num++; - if (account_id >= account_id_count) - account_id_count = account_id + 1; - - } else { - i = 0; - if (sscanf(line, "%d\t%%newid%%\n%n", &account_id, &i) == 1 && - i > 0 && account_id > account_id_count) - account_id_count = account_id; - } - } - fclose_(fp); - - if (auth_num == 0) { - printf("mmo_auth_init: No account found in %s.\n", account_filename); - sprintf(line, "No account found in %s.", account_filename); - } else { - if (auth_num == 1) { - printf("mmo_auth_init: 1 account read in %s,\n", account_filename); - sprintf(line, "1 account read in %s,", account_filename); - } else { - printf("mmo_auth_init: %d accounts read in %s,\n", auth_num, account_filename); - sprintf(line, "%d accounts read in %s,", auth_num, account_filename); - } - if (GM_count == 0) { - printf(" of which is no GM account, and "); - sprintf(str, "%s of which is no GM account and", line); - } else if (GM_count == 1) { - printf(" of which is 1 GM account, and "); - sprintf(str, "%s of which is 1 GM account and", line); - } else { - printf(" of which is %d GM accounts, and ", GM_count); - sprintf(str, "%s of which is %d GM accounts and", line, GM_count); - } - if (server_count == 0) { - printf("no server account ('S').\n"); - sprintf(line, "%s no server account ('S').", str); - } else if (server_count == 1) { - printf("1 server account ('S').\n"); - sprintf(line, "%s 1 server account ('S').", str); - } else { - printf("%d server accounts ('S').\n", server_count); - sprintf(line, "%s %d server accounts ('S').", str, server_count); - } - } - login_log("%s" RETCODE, line); - - return 0; +int mmo_auth_init (void) +{ + FILE *fp; + int account_id, logincount, state, n, i, j, v; + char line[2048], *p, userid[2048], pass[2048], lastlogin[2048], sex, + email[2048], error_message[2048], last_ip[2048], memo[2048]; + time_t ban_until_time; + time_t connect_until_time; + char str[2048]; + int GM_count = 0; + int server_count = 0; + + auth_dat = calloc (sizeof (struct auth_dat) * 256, 1); + auth_max = 256; + + fp = fopen_ (account_filename, "r"); + if (fp == NULL) + { + // no account file -> no account -> no login, including char-server (ERROR) + printf + ("\033[1;31mmmo_auth_init: Accounts file [%s] not found.\033[0m\n", + account_filename); + return 0; + } + + while (fgets (line, sizeof (line) - 1, fp) != NULL) + { + if (line[0] == '/' && line[1] == '/') + continue; + line[sizeof (line) - 1] = '\0'; + p = line; + + // database version reading (v2) + if (((i = sscanf (line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t" + "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]\t%ld%n", + &account_id, userid, pass, lastlogin, &sex, + &logincount, &state, email, error_message, + &connect_until_time, last_ip, memo, &ban_until_time, + &n)) == 13 && line[n] == '\t') + || + ((i = + sscanf (line, + "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t" + "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]%n", &account_id, + userid, pass, lastlogin, &sex, &logincount, &state, + email, error_message, &connect_until_time, last_ip, + memo, &n)) == 12 && line[n] == '\t')) + { + n = n + 1; + + // Some checks + if (account_id > END_ACCOUNT_NUM) + { + printf + ("\033[1;31mmmo_auth_init: ******Error: an account has an id higher than %d\n", + END_ACCOUNT_NUM); + printf + (" account id #%d -> account not read (saved in log file).\033[0m\n", + account_id); + login_log + ("mmmo_auth_init: ******Error: an account has an id higher than %d." + RETCODE, END_ACCOUNT_NUM); + login_log + (" account id #%d -> account not read (saved in next line):" + RETCODE, account_id); + login_log ("%s", line); + continue; + } + userid[23] = '\0'; + remove_control_chars (userid); + for (j = 0; j < auth_num; j++) + { + if (auth_dat[j].account_id == account_id) + { + printf + ("\033[1;31mmmo_auth_init: ******Error: an account has an identical id to another.\n"); + printf + (" account id #%d -> new account not read (saved in log file).\033[0m\n", + account_id); + login_log + ("mmmo_auth_init: ******Error: an account has an identical id to another." + RETCODE); + login_log + (" account id #%d -> new account not read (saved in next line):" + RETCODE, account_id); + login_log ("%s", line); + break; + } + else if (strcmp (auth_dat[j].userid, userid) == 0) + { + printf + ("\033[1;31mmmo_auth_init: ******Error: account name already exists.\n"); + printf (" account name '%s' -> new account not read.\n", userid); // 2 lines, account name can be long. + printf + (" Account saved in log file.\033[0m\n"); + login_log + ("mmmo_auth_init: ******Error: an account has an identical id to another." + RETCODE); + login_log + (" account id #%d -> new account not read (saved in next line):" + RETCODE, account_id); + login_log ("%s", line); + break; + } + } + if (j != auth_num) + continue; + + if (auth_num >= auth_max) + { + auth_max += 256; + auth_dat = + realloc (auth_dat, sizeof (struct auth_dat) * auth_max); + } + + memset (&auth_dat[auth_num], '\0', sizeof (struct auth_dat)); + + auth_dat[auth_num].account_id = account_id; + + strncpy (auth_dat[auth_num].userid, userid, 24); + + pass[23] = '\0'; + remove_control_chars (pass); + strncpy (auth_dat[auth_num].pass, pass, 24); + + lastlogin[23] = '\0'; + remove_control_chars (lastlogin); + strncpy (auth_dat[auth_num].lastlogin, lastlogin, 24); + + auth_dat[auth_num].sex = (sex == 'S' + || sex == 's') ? 2 : (sex == 'M' + || sex == 'm'); + + if (logincount >= 0) + auth_dat[auth_num].logincount = logincount; + else + auth_dat[auth_num].logincount = 0; + + if (state > 255) + auth_dat[auth_num].state = 100; + else if (state < 0) + auth_dat[auth_num].state = 0; + else + auth_dat[auth_num].state = state; + + if (e_mail_check (email) == 0) + { + printf + ("Account %s (%d): invalid e-mail (replaced par a@a.com).\n", + auth_dat[auth_num].userid, + auth_dat[auth_num].account_id); + strncpy (auth_dat[auth_num].email, "a@a.com", 40); + } + else + { + remove_control_chars (email); + strncpy (auth_dat[auth_num].email, email, 40); + } + + error_message[19] = '\0'; + remove_control_chars (error_message); + if (error_message[0] == '\0' || state != 7) + { // 7, because state is packet 0x006a value + 1 + strncpy (auth_dat[auth_num].error_message, "-", 20); + } + else + { + strncpy (auth_dat[auth_num].error_message, error_message, 20); + } + + if (i == 13) + auth_dat[auth_num].ban_until_time = ban_until_time; + else + auth_dat[auth_num].ban_until_time = 0; + + auth_dat[auth_num].connect_until_time = connect_until_time; + + last_ip[15] = '\0'; + remove_control_chars (last_ip); + strncpy (auth_dat[auth_num].last_ip, last_ip, 16); + + memo[254] = '\0'; + remove_control_chars (memo); + strncpy (auth_dat[auth_num].memo, memo, 255); + + for (j = 0; j < ACCOUNT_REG2_NUM; j++) + { + p += n; + if (sscanf (p, "%[^\t,],%d %n", str, &v, &n) != 2) + { + // We must check if a str is void. If it's, we can continue to read other REG2. + // Account line will have something like: str2,9 ,9 str3,1 (here, ,9 is not good) + if (p[0] == ',' && sscanf (p, ",%d %n", &v, &n) == 1) + { + j--; + continue; + } + else + break; + } + str[31] = '\0'; + remove_control_chars (str); + strncpy (auth_dat[auth_num].account_reg2[j].str, str, 32); + auth_dat[auth_num].account_reg2[j].value = v; + } + auth_dat[auth_num].account_reg2_num = j; + + if (isGM (account_id) > 0) + GM_count++; + if (auth_dat[auth_num].sex == 2) + server_count++; + + auth_num++; + if (account_id >= account_id_count) + account_id_count = account_id + 1; + + // Old athena database version reading (v1) + } + else if ((i = + sscanf (line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t%n", + &account_id, userid, pass, lastlogin, &sex, + &logincount, &state, &n)) >= 5) + { + if (account_id > END_ACCOUNT_NUM) + { + printf + ("\033[1;31mmmo_auth_init: ******Error: an account has an id higher than %d\n", + END_ACCOUNT_NUM); + printf + (" account id #%d -> account not read (saved in log file).\033[0m\n", + account_id); + login_log + ("mmmo_auth_init: ******Error: an account has an id higher than %d." + RETCODE, END_ACCOUNT_NUM); + login_log + (" account id #%d -> account not read (saved in next line):" + RETCODE, account_id); + login_log ("%s", line); + continue; + } + userid[23] = '\0'; + remove_control_chars (userid); + for (j = 0; j < auth_num; j++) + { + if (auth_dat[j].account_id == account_id) + { + printf + ("\033[1;31mmmo_auth_init: ******Error: an account has an identical id to another.\n"); + printf + (" account id #%d -> new account not read (saved in log file).\033[0m\n", + account_id); + login_log + ("mmmo_auth_init: ******Error: an account has an identical id to another." + RETCODE); + login_log + (" account id #%d -> new account not read (saved in next line):" + RETCODE, account_id); + login_log ("%s", line); + break; + } + else if (strcmp (auth_dat[j].userid, userid) == 0) + { + printf + ("\033[1;31mmmo_auth_init: ******Error: account name already exists.\n"); + printf (" account name '%s' -> new account not read.\n", userid); // 2 lines, account name can be long. + printf + (" Account saved in log file.\033[0m\n"); + login_log + ("mmmo_auth_init: ******Error: an account has an identical id to another." + RETCODE); + login_log + (" account id #%d -> new account not read (saved in next line):" + RETCODE, account_id); + login_log ("%s", line); + break; + } + } + if (j != auth_num) + continue; + + if (auth_num >= auth_max) + { + auth_max += 256; + auth_dat = + realloc (auth_dat, sizeof (struct auth_dat) * auth_max); + } + + memset (&auth_dat[auth_num], '\0', sizeof (struct auth_dat)); + + auth_dat[auth_num].account_id = account_id; + + strncpy (auth_dat[auth_num].userid, userid, 24); + + pass[23] = '\0'; + remove_control_chars (pass); + strncpy (auth_dat[auth_num].pass, pass, 24); + + lastlogin[23] = '\0'; + remove_control_chars (lastlogin); + strncpy (auth_dat[auth_num].lastlogin, lastlogin, 24); + + auth_dat[auth_num].sex = (sex == 'S' + || sex == 's') ? 2 : (sex == 'M' + || sex == 'm'); + + if (i >= 6) + { + if (logincount >= 0) + auth_dat[auth_num].logincount = logincount; + else + auth_dat[auth_num].logincount = 0; + } + else + auth_dat[auth_num].logincount = 0; + + if (i >= 7) + { + if (state > 255) + auth_dat[auth_num].state = 100; + else if (state < 0) + auth_dat[auth_num].state = 0; + else + auth_dat[auth_num].state = state; + } + else + auth_dat[auth_num].state = 0; + + // Initialization of new data + strncpy (auth_dat[auth_num].email, "a@a.com", 40); + strncpy (auth_dat[auth_num].error_message, "-", 20); + auth_dat[auth_num].ban_until_time = 0; + auth_dat[auth_num].connect_until_time = 0; + strncpy (auth_dat[auth_num].last_ip, "-", 16); + strncpy (auth_dat[auth_num].memo, "-", 255); + + for (j = 0; j < ACCOUNT_REG2_NUM; j++) + { + p += n; + if (sscanf (p, "%[^\t,],%d %n", str, &v, &n) != 2) + { + // We must check if a str is void. If it's, we can continue to read other REG2. + // Account line will have something like: str2,9 ,9 str3,1 (here, ,9 is not good) + if (p[0] == ',' && sscanf (p, ",%d %n", &v, &n) == 1) + { + j--; + continue; + } + else + break; + } + str[31] = '\0'; + remove_control_chars (str); + strncpy (auth_dat[auth_num].account_reg2[j].str, str, 32); + auth_dat[auth_num].account_reg2[j].value = v; + } + auth_dat[auth_num].account_reg2_num = j; + + if (isGM (account_id) > 0) + GM_count++; + if (auth_dat[auth_num].sex == 2) + server_count++; + + auth_num++; + if (account_id >= account_id_count) + account_id_count = account_id + 1; + + } + else + { + i = 0; + if (sscanf (line, "%d\t%%newid%%\n%n", &account_id, &i) == 1 && + i > 0 && account_id > account_id_count) + account_id_count = account_id; + } + } + fclose_ (fp); + + if (auth_num == 0) + { + printf ("mmo_auth_init: No account found in %s.\n", account_filename); + sprintf (line, "No account found in %s.", account_filename); + } + else + { + if (auth_num == 1) + { + printf ("mmo_auth_init: 1 account read in %s,\n", + account_filename); + sprintf (line, "1 account read in %s,", account_filename); + } + else + { + printf ("mmo_auth_init: %d accounts read in %s,\n", auth_num, + account_filename); + sprintf (line, "%d accounts read in %s,", auth_num, + account_filename); + } + if (GM_count == 0) + { + printf (" of which is no GM account, and "); + sprintf (str, "%s of which is no GM account and", line); + } + else if (GM_count == 1) + { + printf (" of which is 1 GM account, and "); + sprintf (str, "%s of which is 1 GM account and", line); + } + else + { + printf (" of which is %d GM accounts, and ", + GM_count); + sprintf (str, "%s of which is %d GM accounts and", line, + GM_count); + } + if (server_count == 0) + { + printf ("no server account ('S').\n"); + sprintf (line, "%s no server account ('S').", str); + } + else if (server_count == 1) + { + printf ("1 server account ('S').\n"); + sprintf (line, "%s 1 server account ('S').", str); + } + else + { + printf ("%d server accounts ('S').\n", server_count); + sprintf (line, "%s %d server accounts ('S').", str, server_count); + } + } + login_log ("%s" RETCODE, line); + + return 0; } //------------------------------------------ // Writing of the accounts database file // (accounts are sorted by id before save) //------------------------------------------ -void mmo_auth_sync(void) { - FILE *fp; - int i, j, k, lock; - int id[auth_num]; - char line[65536]; - - // Sorting before save - for(i = 0; i < auth_num; i++) { - id[i] = i; - for(j = 0; j < i; j++) { - if (auth_dat[i].account_id < auth_dat[id[j]].account_id) { - for(k = i; k > j; k--) - id[k] = id[k-1]; - id[j] = i; // id[i] - break; - } - } - } - - // Data save - fp = lock_fopen(account_filename, &lock); - if (fp == NULL) - return; - fprintf(fp, "// Accounts file: here are saved all information about the accounts.\n"); - fprintf(fp, "// Structure: ID, account name, password, last login time, sex, # of logins, state, email, error message for state 7, validity time, last (accepted) login ip, memo field, ban timestamp, repeated(register text, register value)\n"); - fprintf(fp, "// Some explanations:\n"); - fprintf(fp, "// account name : between 4 to 23 char for a normal account (standard client can't send less than 4 char).\n"); - fprintf(fp, "// account password: between 4 to 23 char\n"); - fprintf(fp, "// sex : M or F for normal accounts, S for server accounts\n"); - fprintf(fp, "// state : 0: account is ok, 1 to 256: error code of packet 0x006a + 1\n"); - fprintf(fp, "// email : between 3 to 39 char (a@a.com is like no email)\n"); - fprintf(fp, "// error message : text for the state 7: 'Your are Prohibited to login until <text>'. Max 19 char\n"); - fprintf(fp, "// valitidy time : 0: unlimited account, <other value>: date calculated by addition of 1/1/1970 + value (number of seconds since the 1/1/1970)\n"); - fprintf(fp, "// memo field : max 254 char\n"); - fprintf(fp, "// ban time : 0: no ban, <other value>: banned until the date: date calculated by addition of 1/1/1970 + value (number of seconds since the 1/1/1970)\n"); - for(i = 0; i < auth_num; i++) { - k = id[i]; // use of sorted index - if (auth_dat[k].account_id < 0) - continue; - - mmo_auth_tostr(line, &auth_dat[k]); - fprintf(fp, "%s" RETCODE, line); - } - fprintf(fp, "%d\t%%newid%%\n", account_id_count); - - lock_fclose(fp, account_filename, &lock); - - // set new counter to minimum number of auth before save - auth_before_save_file = auth_num / AUTH_SAVE_FILE_DIVIDER; // Re-initialise counter. We have save. - if (auth_before_save_file < AUTH_BEFORE_SAVE_FILE) - auth_before_save_file = AUTH_BEFORE_SAVE_FILE; - - return; +void mmo_auth_sync (void) +{ + FILE *fp; + int i, j, k, lock; + int id[auth_num]; + char line[65536]; + + // Sorting before save + for (i = 0; i < auth_num; i++) + { + id[i] = i; + for (j = 0; j < i; j++) + { + if (auth_dat[i].account_id < auth_dat[id[j]].account_id) + { + for (k = i; k > j; k--) + id[k] = id[k - 1]; + id[j] = i; // id[i] + break; + } + } + } + + // Data save + fp = lock_fopen (account_filename, &lock); + if (fp == NULL) + return; + fprintf (fp, + "// Accounts file: here are saved all information about the accounts.\n"); + fprintf (fp, + "// Structure: ID, account name, password, last login time, sex, # of logins, state, email, error message for state 7, validity time, last (accepted) login ip, memo field, ban timestamp, repeated(register text, register value)\n"); + fprintf (fp, "// Some explanations:\n"); + fprintf (fp, + "// account name : between 4 to 23 char for a normal account (standard client can't send less than 4 char).\n"); + fprintf (fp, "// account password: between 4 to 23 char\n"); + fprintf (fp, + "// sex : M or F for normal accounts, S for server accounts\n"); + fprintf (fp, + "// state : 0: account is ok, 1 to 256: error code of packet 0x006a + 1\n"); + fprintf (fp, + "// email : between 3 to 39 char (a@a.com is like no email)\n"); + fprintf (fp, + "// error message : text for the state 7: 'Your are Prohibited to login until <text>'. Max 19 char\n"); + fprintf (fp, + "// valitidy time : 0: unlimited account, <other value>: date calculated by addition of 1/1/1970 + value (number of seconds since the 1/1/1970)\n"); + fprintf (fp, "// memo field : max 254 char\n"); + fprintf (fp, + "// ban time : 0: no ban, <other value>: banned until the date: date calculated by addition of 1/1/1970 + value (number of seconds since the 1/1/1970)\n"); + for (i = 0; i < auth_num; i++) + { + k = id[i]; // use of sorted index + if (auth_dat[k].account_id < 0) + continue; + + mmo_auth_tostr (line, &auth_dat[k]); + fprintf (fp, "%s" RETCODE, line); + } + fprintf (fp, "%d\t%%newid%%\n", account_id_count); + + lock_fclose (fp, account_filename, &lock); + + // set new counter to minimum number of auth before save + auth_before_save_file = auth_num / AUTH_SAVE_FILE_DIVIDER; // Re-initialise counter. We have save. + if (auth_before_save_file < AUTH_BEFORE_SAVE_FILE) + auth_before_save_file = AUTH_BEFORE_SAVE_FILE; + + return; } //----------------------------------------------------- @@ -854,2973 +1065,4082 @@ void mmo_auth_sync(void) { // immediatly and set the minimum of // authentifications to its initialization value. //----------------------------------------------------- -int check_auth_sync(int tid, unsigned int tick, int id, int data) { - // we only save if necessary: - // we have do some authentifications without do saving - if (auth_before_save_file < AUTH_BEFORE_SAVE_FILE || - auth_before_save_file < (int)(auth_num / AUTH_SAVE_FILE_DIVIDER)) - mmo_auth_sync(); - - return 0; +int check_auth_sync (int tid, unsigned int tick, int id, int data) +{ + // we only save if necessary: + // we have do some authentifications without do saving + if (auth_before_save_file < AUTH_BEFORE_SAVE_FILE || + auth_before_save_file < (int) (auth_num / AUTH_SAVE_FILE_DIVIDER)) + mmo_auth_sync (); + + return 0; } //-------------------------------------------------------------------- // Packet send to all char-servers, except one (wos: without our self) //-------------------------------------------------------------------- -int charif_sendallwos(int sfd, unsigned char *buf, unsigned int len) { - int i, c; - - for(i = 0, c = 0; i < MAX_SERVERS; i++) { - int fd; - if ((fd = server_fd[i]) >= 0 && fd != sfd) { - memcpy(WFIFOP(fd,0), buf, len); - WFIFOSET(fd, len); - c++; - } - } - return c; +int charif_sendallwos (int sfd, unsigned char *buf, unsigned int len) +{ + int i, c; + + for (i = 0, c = 0; i < MAX_SERVERS; i++) + { + int fd; + if ((fd = server_fd[i]) >= 0 && fd != sfd) + { + memcpy (WFIFOP (fd, 0), buf, len); + WFIFOSET (fd, len); + c++; + } + } + return c; } //----------------------------------------------------- // Send GM accounts to all char-server //----------------------------------------------------- -void send_GM_accounts() { - int i; - char buf[32000]; - int GM_value; - int len; - - len = 4; - WBUFW(buf,0) = 0x2732; - for(i = 0; i < auth_num; i++) - // send only existing accounts. We can not create a GM account when server is online. - if ((GM_value = isGM(auth_dat[i].account_id)) > 0) { - WBUFL(buf,len) = auth_dat[i].account_id; - WBUFB(buf,len+4) = (unsigned char)GM_value; - len += 5; - } - WBUFW(buf,2) = len; - charif_sendallwos(-1, buf, len); - - return; +void send_GM_accounts () +{ + int i; + char buf[32000]; + int GM_value; + int len; + + len = 4; + WBUFW (buf, 0) = 0x2732; + for (i = 0; i < auth_num; i++) + // send only existing accounts. We can not create a GM account when server is online. + if ((GM_value = isGM (auth_dat[i].account_id)) > 0) + { + WBUFL (buf, len) = auth_dat[i].account_id; + WBUFB (buf, len + 4) = (unsigned char) GM_value; + len += 5; + } + WBUFW (buf, 2) = len; + charif_sendallwos (-1, buf, len); + + return; } //----------------------------------------------------- // Check if GM file account have been changed //----------------------------------------------------- -int check_GM_file(int tid, unsigned int tick, int id, int data) { - struct stat file_stat; - long new_time; - - // if we would not check - if (gm_account_filename_check_timer < 1) - return 0; - - // get last modify time/date - if (stat(GM_account_filename, &file_stat)) - new_time = 0; // error - else - new_time = file_stat.st_mtime; - - if (new_time != creation_time_GM_account_file) { - read_gm_account(); - send_GM_accounts(); - } - - return 0; +int check_GM_file (int tid, unsigned int tick, int id, int data) +{ + struct stat file_stat; + long new_time; + + // if we would not check + if (gm_account_filename_check_timer < 1) + return 0; + + // get last modify time/date + if (stat (GM_account_filename, &file_stat)) + new_time = 0; // error + else + new_time = file_stat.st_mtime; + + if (new_time != creation_time_GM_account_file) + { + read_gm_account (); + send_GM_accounts (); + } + + return 0; } //------------------------------------- // Account creation (with e-mail check) //------------------------------------- -int mmo_auth_new(struct mmo_account* account, char sex, char* email) { - time_t timestamp, timestamp_temp; - struct tm *tmtime; - int i = auth_num; +int mmo_auth_new (struct mmo_account *account, char sex, char *email) +{ + time_t timestamp, timestamp_temp; + struct tm *tmtime; + int i = auth_num; - if (auth_num >= auth_max) { - auth_max += 256; - auth_dat = realloc(auth_dat, sizeof(struct auth_dat) * auth_max); - } + if (auth_num >= auth_max) + { + auth_max += 256; + auth_dat = realloc (auth_dat, sizeof (struct auth_dat) * auth_max); + } - memset(&auth_dat[i], '\0', sizeof(struct auth_dat)); + memset (&auth_dat[i], '\0', sizeof (struct auth_dat)); - while (isGM(account_id_count) > 0) - account_id_count++; + while (isGM (account_id_count) > 0) + account_id_count++; - auth_dat[i].account_id = account_id_count++; + auth_dat[i].account_id = account_id_count++; - strncpy(auth_dat[i].userid, account->userid, 24); - auth_dat[i].userid[23] = '\0'; + strncpy (auth_dat[i].userid, account->userid, 24); + auth_dat[i].userid[23] = '\0'; - strncpy(auth_dat[i].pass, account->passwd, 24); - auth_dat[i].pass[23] = '\0'; + strncpy (auth_dat[i].pass, account->passwd, 24); + auth_dat[i].pass[23] = '\0'; - memcpy(auth_dat[i].lastlogin, "-", 2); + memcpy (auth_dat[i].lastlogin, "-", 2); - auth_dat[i].sex = (sex == 'M'); + auth_dat[i].sex = (sex == 'M'); - auth_dat[i].logincount = 0; + auth_dat[i].logincount = 0; - auth_dat[i].state = 0; + auth_dat[i].state = 0; - if (e_mail_check(email) == 0) - strncpy(auth_dat[i].email, "a@a.com", 40); - else - strncpy(auth_dat[i].email, email, 40); + if (e_mail_check (email) == 0) + strncpy (auth_dat[i].email, "a@a.com", 40); + else + strncpy (auth_dat[i].email, email, 40); - strncpy(auth_dat[i].error_message, "-", 20); + strncpy (auth_dat[i].error_message, "-", 20); - auth_dat[i].ban_until_time = 0; + auth_dat[i].ban_until_time = 0; - if (start_limited_time < 0) - auth_dat[i].connect_until_time = 0; // unlimited - else { // limited time - timestamp = time(NULL) + start_limited_time; - // double conversion to be sure that it is possible - tmtime = gmtime(×tamp); - timestamp_temp = mktime(tmtime); - if (timestamp_temp != -1 && (timestamp_temp + 3600) >= timestamp) // check possible value and overflow (and avoid summer/winter hour) - auth_dat[i].connect_until_time = timestamp_temp; - else - auth_dat[i].connect_until_time = 0; // unlimited - } + if (start_limited_time < 0) + auth_dat[i].connect_until_time = 0; // unlimited + else + { // limited time + timestamp = time (NULL) + start_limited_time; + // double conversion to be sure that it is possible + tmtime = gmtime (×tamp); + timestamp_temp = mktime (tmtime); + if (timestamp_temp != -1 && (timestamp_temp + 3600) >= timestamp) // check possible value and overflow (and avoid summer/winter hour) + auth_dat[i].connect_until_time = timestamp_temp; + else + auth_dat[i].connect_until_time = 0; // unlimited + } - strncpy(auth_dat[i].last_ip, "-", 16); + strncpy (auth_dat[i].last_ip, "-", 16); - strncpy(auth_dat[i].memo, "-", 255); + strncpy (auth_dat[i].memo, "-", 255); - auth_dat[i].account_reg2_num = 0; + auth_dat[i].account_reg2_num = 0; - auth_num++; + auth_num++; - return (account_id_count - 1); + return (account_id_count - 1); } //--------------------------------------- // Check/authentification of a connection //--------------------------------------- -int mmo_auth(struct mmo_account* account, int fd) { - int i; - struct timeval tv; - char tmpstr[256]; - int len, newaccount = 0; - char md5str[64], md5bin[32]; - char ip[16]; - unsigned char *sin_addr = (unsigned char *)&session[fd]->client_addr.sin_addr; - - sprintf(ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3]); - - len = strlen(account->userid) - 2; - // Account creation with _M/_F - if (account->passwdenc == 0 && account->userid[len] == '_' && - (account->userid[len+1] == 'F' || account->userid[len+1] == 'M') && new_account_flag == 1 && - account_id_count <= END_ACCOUNT_NUM && len >= 4 && strlen(account->passwd) >= 4) { - if (new_account_flag == 1) - newaccount = 1; - account->userid[len] = '\0'; - } - - // Strict account search - for(i = 0; i < auth_num; i++) { - if (strcmp(account->userid, auth_dat[i].userid) == 0) - break; - } - // if there is no creation request and strict account search fails, we do a no sensitive case research for index - if (newaccount == 0 && i == auth_num) { - i = search_account_index(account->userid); - if (i == -1) - i = auth_num; - else - memcpy(account->userid, auth_dat[i].userid, 24); // for the possible tests/checks afterwards (copy correcte sensitive case). - } - - if (i != auth_num) { - int encpasswdok = 0; - struct login_session_data *ld; - if (newaccount) { - login_log("Attempt of creation of an already existant account (account: %s_%c, pass: %s, received pass: %s, ip: %s)" RETCODE, - account->userid, account->userid[len+1], auth_dat[i].pass, account->passwd, ip); - return 9; // 9 = Account already exists - } - ld = session[fd]->session_data; +int mmo_auth (struct mmo_account *account, int fd) +{ + int i; + struct timeval tv; + char tmpstr[256]; + int len, newaccount = 0; + char md5str[64], md5bin[32]; + char ip[16]; + unsigned char *sin_addr = + (unsigned char *) &session[fd]->client_addr.sin_addr; + + sprintf (ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], + sin_addr[3]); + + len = strlen (account->userid) - 2; + // Account creation with _M/_F + if (account->passwdenc == 0 && account->userid[len] == '_' && + (account->userid[len + 1] == 'F' || account->userid[len + 1] == 'M') + && new_account_flag == 1 && account_id_count <= END_ACCOUNT_NUM + && len >= 4 && strlen (account->passwd) >= 4) + { + if (new_account_flag == 1) + newaccount = 1; + account->userid[len] = '\0'; + } + + // Strict account search + for (i = 0; i < auth_num; i++) + { + if (strcmp (account->userid, auth_dat[i].userid) == 0) + break; + } + // if there is no creation request and strict account search fails, we do a no sensitive case research for index + if (newaccount == 0 && i == auth_num) + { + i = search_account_index (account->userid); + if (i == -1) + i = auth_num; + else + memcpy (account->userid, auth_dat[i].userid, 24); // for the possible tests/checks afterwards (copy correcte sensitive case). + } + + if (i != auth_num) + { + int encpasswdok = 0; + struct login_session_data *ld; + if (newaccount) + { + login_log + ("Attempt of creation of an already existant account (account: %s_%c, pass: %s, received pass: %s, ip: %s)" + RETCODE, account->userid, account->userid[len + 1], + auth_dat[i].pass, account->passwd, ip); + return 9; // 9 = Account already exists + } + ld = session[fd]->session_data; #ifdef PASSWORDENC - if (account->passwdenc > 0) { - int j = account->passwdenc; - if (!ld) { - login_log("Md5 key not created (account: %s, ip: %s)" RETCODE, account->userid, ip); - return 1; // 1 = Incorrect Password - } - if (j > 2) - j = 1; - do { - if (j == 1) { - strncpy(md5str, ld->md5key, sizeof(ld->md5key)); // 20 - strcat(md5str, auth_dat[i].pass); // 24 - } else if (j == 2) { - strncpy(md5str, auth_dat[i].pass, sizeof(auth_dat[i].pass)); // 24 - strcat(md5str, ld->md5key); // 20 - } else - md5str[0] = '\0'; - md5str[sizeof(md5str)-1] = '\0'; // 64 - MD5_String2binary(md5str, md5bin); - encpasswdok = (memcmp(account->passwd, md5bin, 16) == 0); - } while (j < 2 && !encpasswdok && (j++) != account->passwdenc); -// printf("key[%s] md5 [%s] ", md5key, md5); -// printf("client [%s] accountpass [%s]\n", account->passwd, auth_dat[i].pass); - } + if (account->passwdenc > 0) + { + int j = account->passwdenc; + if (!ld) + { + login_log ("Md5 key not created (account: %s, ip: %s)" + RETCODE, account->userid, ip); + return 1; // 1 = Incorrect Password + } + if (j > 2) + j = 1; + do + { + if (j == 1) + { + strncpy (md5str, ld->md5key, sizeof (ld->md5key)); // 20 + strcat (md5str, auth_dat[i].pass); // 24 + } + else if (j == 2) + { + strncpy (md5str, auth_dat[i].pass, sizeof (auth_dat[i].pass)); // 24 + strcat (md5str, ld->md5key); // 20 + } + else + md5str[0] = '\0'; + md5str[sizeof (md5str) - 1] = '\0'; // 64 + MD5_String2binary (md5str, md5bin); + encpasswdok = (memcmp (account->passwd, md5bin, 16) == 0); + } + while (j < 2 && !encpasswdok && (j++) != account->passwdenc); +// printf("key[%s] md5 [%s] ", md5key, md5); +// printf("client [%s] accountpass [%s]\n", account->passwd, auth_dat[i].pass); + } #endif - if ((strcmp(account->passwd, auth_dat[i].pass) && !encpasswdok)) { - if (account->passwdenc == 0) - login_log("Invalid password (account: %s, pass: %s, received pass: %s, ip: %s)" RETCODE, account->userid, auth_dat[i].pass, account->passwd, ip); + if ((strcmp (account->passwd, auth_dat[i].pass) && !encpasswdok)) + { + if (account->passwdenc == 0) + login_log + ("Invalid password (account: %s, pass: %s, received pass: %s, ip: %s)" + RETCODE, account->userid, auth_dat[i].pass, + account->passwd, ip); #ifdef PASSWORDENC - else { - char logbuf[512], *p = logbuf; - int j; - p += sprintf(p, "Invalid password (account: %s, received md5[", account->userid); - for(j = 0; j < 16; j++) - p += sprintf(p, "%02x", ((unsigned char *)account->passwd)[j]); - p += sprintf(p,"] calculated md5["); - for(j = 0; j < 16; j++) - p += sprintf(p, "%02x", ((unsigned char *)md5bin)[j]); - p += sprintf(p, "] md5 key["); - for(j = 0; j < ld->md5keylen; j++) - p += sprintf(p, "%02x", ((unsigned char *)ld->md5key)[j]); - p += sprintf(p, "], ip: %s)" RETCODE, ip); - login_log(logbuf); - } + else + { + char logbuf[512], *p = logbuf; + int j; + p += sprintf (p, + "Invalid password (account: %s, received md5[", + account->userid); + for (j = 0; j < 16; j++) + p += sprintf (p, "%02x", + ((unsigned char *) account->passwd)[j]); + p += sprintf (p, "] calculated md5["); + for (j = 0; j < 16; j++) + p += sprintf (p, "%02x", ((unsigned char *) md5bin)[j]); + p += sprintf (p, "] md5 key["); + for (j = 0; j < ld->md5keylen; j++) + p += sprintf (p, "%02x", + ((unsigned char *) ld->md5key)[j]); + p += sprintf (p, "], ip: %s)" RETCODE, ip); + login_log (logbuf); + } #endif - return 1; // 1 = Incorrect Password - } - - if (auth_dat[i].state) { - login_log("Connection refused (account: %s, pass: %s, state: %d, ip: %s)" RETCODE, - account->userid, account->passwd, auth_dat[i].state, ip); - switch(auth_dat[i].state) { // packet 0x006a value + 1 - case 1: // 0 = Unregistered ID - case 2: // 1 = Incorrect Password - case 3: // 2 = This ID is expired - case 4: // 3 = Rejected from Server - case 5: // 4 = You have been blocked by the GM Team - case 6: // 5 = Your Game's EXE file is not the latest version - case 7: // 6 = Your are Prohibited to log in until %s - case 8: // 7 = Server is jammed due to over populated - case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this) - case 100: // 99 = This ID has been totally erased - return auth_dat[i].state - 1; - break; - default: - return 99; // 99 = ID has been totally erased - break; - } - } - - if (auth_dat[i].ban_until_time != 0) { // if account is banned - strftime(tmpstr, 20, date_format, gmtime(&auth_dat[i].ban_until_time)); - tmpstr[19] = '\0'; - if (auth_dat[i].ban_until_time > time(NULL)) { // always banned - login_log("Connection refused (account: %s, pass: %s, banned until %s, ip: %s)" RETCODE, - account->userid, account->passwd, tmpstr, ip); - return 6; // 6 = Your are Prohibited to log in until %s - } else { // ban is finished - login_log("End of ban (account: %s, pass: %s, previously banned until %s -> not more banned, ip: %s)" RETCODE, - account->userid, account->passwd, tmpstr, ip); - auth_dat[i].ban_until_time = 0; // reset the ban time - } - } - - if (auth_dat[i].connect_until_time != 0 && auth_dat[i].connect_until_time < time(NULL)) { - login_log("Connection refused (account: %s, pass: %s, expired ID, ip: %s)" RETCODE, - account->userid, account->passwd, ip); - return 2; // 2 = This ID is expired - } - - login_log("Authentification accepted (account: %s (id: %d), ip: %s)" RETCODE, account->userid, auth_dat[i].account_id, ip); - } else { - if (newaccount == 0) { - login_log("Unknown account (account: %s, received pass: %s, ip: %s)" RETCODE, - account->userid, account->passwd, ip); - return 0; // 0 = Unregistered ID - } else { - int new_id = mmo_auth_new(account, account->userid[len+1], "a@a.com"); - login_log("Account creation and authentification accepted (account %s (id: %d), pass: %s, sex: %c, connection with _F/_M, ip: %s)" RETCODE, - account->userid, new_id, account->passwd, account->userid[len+1], ip); - auth_before_save_file = 0; // Creation of an account -> save accounts file immediatly - } - } - - gettimeofday(&tv, NULL); - strftime(tmpstr, 24, date_format, gmtime(&(tv.tv_sec))); - sprintf(tmpstr + strlen(tmpstr), ".%03d", (int)tv.tv_usec / 1000); - - account->account_id = auth_dat[i].account_id; - account->login_id1 = mt_random(); - account->login_id2 = mt_random(); - memcpy(account->lastlogin, auth_dat[i].lastlogin, 24); - memcpy(auth_dat[i].lastlogin, tmpstr, 24); - account->sex = auth_dat[i].sex; - strncpy(auth_dat[i].last_ip, ip, 16); - auth_dat[i].logincount++; - - // Save until for change ip/time of auth is not very useful => limited save for that - // Save there informations isnot necessary, because they are saved in log file. - if (--auth_before_save_file <= 0) // Reduce counter. 0 or less, we save - mmo_auth_sync(); - - return -1; // account OK + return 1; // 1 = Incorrect Password + } + + if (auth_dat[i].state) + { + login_log + ("Connection refused (account: %s, pass: %s, state: %d, ip: %s)" + RETCODE, account->userid, account->passwd, auth_dat[i].state, + ip); + switch (auth_dat[i].state) + { // packet 0x006a value + 1 + case 1: // 0 = Unregistered ID + case 2: // 1 = Incorrect Password + case 3: // 2 = This ID is expired + case 4: // 3 = Rejected from Server + case 5: // 4 = You have been blocked by the GM Team + case 6: // 5 = Your Game's EXE file is not the latest version + case 7: // 6 = Your are Prohibited to log in until %s + case 8: // 7 = Server is jammed due to over populated + case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this) + case 100: // 99 = This ID has been totally erased + return auth_dat[i].state - 1; + break; + default: + return 99; // 99 = ID has been totally erased + break; + } + } + + if (auth_dat[i].ban_until_time != 0) + { // if account is banned + strftime (tmpstr, 20, date_format, + gmtime (&auth_dat[i].ban_until_time)); + tmpstr[19] = '\0'; + if (auth_dat[i].ban_until_time > time (NULL)) + { // always banned + login_log + ("Connection refused (account: %s, pass: %s, banned until %s, ip: %s)" + RETCODE, account->userid, account->passwd, tmpstr, ip); + return 6; // 6 = Your are Prohibited to log in until %s + } + else + { // ban is finished + login_log + ("End of ban (account: %s, pass: %s, previously banned until %s -> not more banned, ip: %s)" + RETCODE, account->userid, account->passwd, tmpstr, ip); + auth_dat[i].ban_until_time = 0; // reset the ban time + } + } + + if (auth_dat[i].connect_until_time != 0 + && auth_dat[i].connect_until_time < time (NULL)) + { + login_log + ("Connection refused (account: %s, pass: %s, expired ID, ip: %s)" + RETCODE, account->userid, account->passwd, ip); + return 2; // 2 = This ID is expired + } + + login_log ("Authentification accepted (account: %s (id: %d), ip: %s)" + RETCODE, account->userid, auth_dat[i].account_id, ip); + } + else + { + if (newaccount == 0) + { + login_log + ("Unknown account (account: %s, received pass: %s, ip: %s)" + RETCODE, account->userid, account->passwd, ip); + return 0; // 0 = Unregistered ID + } + else + { + int new_id = + mmo_auth_new (account, account->userid[len + 1], "a@a.com"); + login_log + ("Account creation and authentification accepted (account %s (id: %d), pass: %s, sex: %c, connection with _F/_M, ip: %s)" + RETCODE, account->userid, new_id, account->passwd, + account->userid[len + 1], ip); + auth_before_save_file = 0; // Creation of an account -> save accounts file immediatly + } + } + + gettimeofday (&tv, NULL); + strftime (tmpstr, 24, date_format, gmtime (&(tv.tv_sec))); + sprintf (tmpstr + strlen (tmpstr), ".%03d", (int) tv.tv_usec / 1000); + + account->account_id = auth_dat[i].account_id; + account->login_id1 = mt_random (); + account->login_id2 = mt_random (); + memcpy (account->lastlogin, auth_dat[i].lastlogin, 24); + memcpy (auth_dat[i].lastlogin, tmpstr, 24); + account->sex = auth_dat[i].sex; + strncpy (auth_dat[i].last_ip, ip, 16); + auth_dat[i].logincount++; + + // Save until for change ip/time of auth is not very useful => limited save for that + // Save there informations isnot necessary, because they are saved in log file. + if (--auth_before_save_file <= 0) // Reduce counter. 0 or less, we save + mmo_auth_sync (); + + return -1; // account OK } //------------------------------- // Char-server anti-freeze system //------------------------------- -int char_anti_freeze_system(int tid, unsigned int tick, int id, int data) { - int i; - - //printf("Entering in char_anti_freeze_system function to check freeze of servers.\n"); - for(i = 0; i < MAX_SERVERS; i++) { - if (server_fd[i] >= 0) {// if char-server is online - //printf("char_anti_freeze_system: server #%d '%s', flag: %d.\n", i, server[i].name, server_freezeflag[i]); - if (server_freezeflag[i]-- < 1) { // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed - printf("Char-server anti-freeze system: char-server #%d '%s' is freezed -> disconnection.\n", i, server[i].name); - login_log("Char-server anti-freeze system: char-server #%d '%s' is freezed -> disconnection." RETCODE, - i, server[i].name); - session[server_fd[i]]->eof = 1; - } - } - } - - return 0; +int char_anti_freeze_system (int tid, unsigned int tick, int id, int data) +{ + int i; + + //printf("Entering in char_anti_freeze_system function to check freeze of servers.\n"); + for (i = 0; i < MAX_SERVERS; i++) + { + if (server_fd[i] >= 0) + { // if char-server is online + //printf("char_anti_freeze_system: server #%d '%s', flag: %d.\n", i, server[i].name, server_freezeflag[i]); + if (server_freezeflag[i]-- < 1) + { // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed + printf + ("Char-server anti-freeze system: char-server #%d '%s' is freezed -> disconnection.\n", + i, server[i].name); + login_log + ("Char-server anti-freeze system: char-server #%d '%s' is freezed -> disconnection." + RETCODE, i, server[i].name); + session[server_fd[i]]->eof = 1; + } + } + } + + return 0; } //-------------------------------- // Packet parsing for char-servers //-------------------------------- -int parse_fromchar(int fd) { - int i, j, id; - unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; - char ip[16]; - - sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); - - for(id = 0; id < MAX_SERVERS; id++) - if (server_fd[id] == fd) - break; - if (id == MAX_SERVERS || session[fd]->eof) { - if (id < MAX_SERVERS) { - printf("Char-server '%s' has disconnected.\n", server[id].name); - login_log("Char-server '%s' has disconnected (ip: %s)." RETCODE, - server[id].name, ip); - server_fd[id] = -1; - memset(&server[id], 0, sizeof(struct mmo_char_server)); - } - close(fd); - delete_session(fd); - return 0; - } - - while (RFIFOREST(fd) >= 2) { - if (display_parse_fromchar == 2 || (display_parse_fromchar == 1 && RFIFOW(fd,0) != 0x2714)) // 0x2714 is done very often (number of players) - printf("parse_fromchar: connection #%d, packet: 0x%x (with being read: %d bytes).\n", fd, RFIFOW(fd,0), RFIFOREST(fd)); - - switch (RFIFOW(fd,0)) { - // request from map-server via char-server to reload GM accounts (by Yor). - case 0x2709: - login_log("Char-server '%s': Request to re-load GM configuration file (ip: %s)." RETCODE, server[id].name, ip); - read_gm_account(); - // send GM accounts to all char-servers - send_GM_accounts(); - RFIFOSKIP(fd,2); - break; - - case 0x2712: // request from char-server to authentify an account - if (RFIFOREST(fd) < 19) - return 0; - { - int acc; - acc = RFIFOL(fd,2); // speed up - for(i = 0; i < AUTH_FIFO_SIZE; i++) { - if (auth_fifo[i].account_id == acc && - auth_fifo[i].login_id1 == RFIFOL(fd,6) && +int parse_fromchar (int fd) +{ + int i, j, id; + unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; + char ip[16]; + + sprintf (ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); + + for (id = 0; id < MAX_SERVERS; id++) + if (server_fd[id] == fd) + break; + if (id == MAX_SERVERS || session[fd]->eof) + { + if (id < MAX_SERVERS) + { + printf ("Char-server '%s' has disconnected.\n", server[id].name); + login_log ("Char-server '%s' has disconnected (ip: %s)." RETCODE, + server[id].name, ip); + server_fd[id] = -1; + memset (&server[id], 0, sizeof (struct mmo_char_server)); + } + close (fd); + delete_session (fd); + return 0; + } + + while (RFIFOREST (fd) >= 2) + { + if (display_parse_fromchar == 2 || (display_parse_fromchar == 1 && RFIFOW (fd, 0) != 0x2714)) // 0x2714 is done very often (number of players) + printf + ("parse_fromchar: connection #%d, packet: 0x%x (with being read: %d bytes).\n", + fd, RFIFOW (fd, 0), RFIFOREST (fd)); + + switch (RFIFOW (fd, 0)) + { + // request from map-server via char-server to reload GM accounts (by Yor). + case 0x2709: + login_log + ("Char-server '%s': Request to re-load GM configuration file (ip: %s)." + RETCODE, server[id].name, ip); + read_gm_account (); + // send GM accounts to all char-servers + send_GM_accounts (); + RFIFOSKIP (fd, 2); + break; + + case 0x2712: // request from char-server to authentify an account + if (RFIFOREST (fd) < 19) + return 0; + { + int acc; + acc = RFIFOL (fd, 2); // speed up + for (i = 0; i < AUTH_FIFO_SIZE; i++) + { + if (auth_fifo[i].account_id == acc && + auth_fifo[i].login_id1 == RFIFOL (fd, 6) && #if CMP_AUTHFIFO_LOGIN2 != 0 - auth_fifo[i].login_id2 == RFIFOL(fd,10) && // relate to the versions higher than 18 + auth_fifo[i].login_id2 == RFIFOL (fd, 10) && // relate to the versions higher than 18 #endif - auth_fifo[i].sex == RFIFOB(fd,14) && - (!check_ip_flag || auth_fifo[i].ip == RFIFOL(fd,15)) && - !auth_fifo[i].delflag) { - int p, k; - auth_fifo[i].delflag = 1; - login_log("Char-server '%s': authentification of the account %d accepted (ip: %s)." RETCODE, - server[id].name, acc, ip); -// printf("%d\n", i); - for(k = 0; k < auth_num; k++) { - if (auth_dat[k].account_id == acc) { - WFIFOW(fd,0) = 0x2729; // Sending of the account_reg2 - WFIFOL(fd,4) = acc; - for(p = 8, j = 0; j < auth_dat[k].account_reg2_num; p += 36, j++) { - memcpy(WFIFOP(fd,p), auth_dat[k].account_reg2[j].str, 32); - WFIFOL(fd,p+32) = auth_dat[k].account_reg2[j].value; - } - WFIFOW(fd,2) = p; - WFIFOSET(fd,p); -// printf("parse_fromchar: Sending of account_reg2: login->char (auth fifo)\n"); - WFIFOW(fd,0) = 0x2713; - WFIFOL(fd,2) = acc; - WFIFOB(fd,6) = 0; - memcpy(WFIFOP(fd, 7), auth_dat[k].email, 40); - WFIFOL(fd,47) = (unsigned long)auth_dat[k].connect_until_time; - WFIFOSET(fd,51); - break; - } - } - break; - } - } - // authentification not found - if (i == AUTH_FIFO_SIZE) { - login_log("Char-server '%s': authentification of the account %d REFUSED (ip: %s)." RETCODE, - server[id].name, acc, ip); - WFIFOW(fd,0) = 0x2713; - WFIFOL(fd,2) = acc; - WFIFOB(fd,6) = 1; - // It is unnecessary to send email - // It is unnecessary to send validity date of the account - WFIFOSET(fd,51); - } - } - RFIFOSKIP(fd,19); - break; - - case 0x2714: - if (RFIFOREST(fd) < 6) - return 0; - //printf("parse_fromchar: Receiving of the users number of the server '%s': %d\n", server[id].name, RFIFOL(fd,2)); - server[id].users = RFIFOL(fd,2); - if(anti_freeze_enable) - server_freezeflag[id] = 5; // Char anti-freeze system. Counter. 5 ok, 4...0 freezed - RFIFOSKIP(fd,6); - break; - - // we receive a e-mail creation of an account with a default e-mail (no answer) - case 0x2715: { - int acc; - char email[40]; - if (RFIFOREST(fd) < 46) - return 0; - acc = RFIFOL(fd,2); // speed up - memcpy(email, RFIFOP(fd,6), 40); - email[39] = '\0'; - remove_control_chars(email); - //printf("parse_fromchar: an e-mail creation of an account with a default e-mail: server '%s', account: %d, e-mail: '%s'.\n", server[id].name, acc, RFIFOP(fd,6)); - if (e_mail_check(email) == 0) - login_log("Char-server '%s': Attempt to create an e-mail on an account with a default e-mail REFUSED - e-mail is invalid (account: %d, ip: %s)" RETCODE, - server[id].name, acc, ip); - else { - for(i = 0; i < auth_num; i++) { - if (auth_dat[i].account_id == acc && (strcmp(auth_dat[i].email, "a@a.com") == 0 || auth_dat[i].email[0] == '\0')) { - memcpy(auth_dat[i].email, email, 40); - login_log("Char-server '%s': Create an e-mail on an account with a default e-mail (account: %d, new e-mail: %s, ip: %s)." RETCODE, - server[id].name, acc, email, ip); - // Save - mmo_auth_sync(); - break; - } - } - if (i == auth_num) - login_log("Char-server '%s': Attempt to create an e-mail on an account with a default e-mail REFUSED - account doesn't exist or e-mail of account isn't default e-mail (account: %d, ip: %s)." RETCODE, - server[id].name, acc, ip); - } - RFIFOSKIP(fd,46); - break; - - // We receive an e-mail/limited time request, because a player comes back from a map-server to the char-server - } - case 0x2716: - if (RFIFOREST(fd) < 6) - return 0; - //printf("parse_fromchar: E-mail/limited time request from '%s' server (concerned account: %d)\n", server[id].name, RFIFOL(fd,2)); - for(i = 0; i < auth_num; i++) { - if (auth_dat[i].account_id == RFIFOL(fd,2)) { - login_log("Char-server '%s': e-mail of the account %d found (ip: %s)." RETCODE, - server[id].name, RFIFOL(fd,2), ip); - WFIFOW(fd,0) = 0x2717; - WFIFOL(fd,2) = RFIFOL(fd,2); - memcpy(WFIFOP(fd, 6), auth_dat[i].email, 40); - WFIFOL(fd,46) = (unsigned long)auth_dat[i].connect_until_time; - WFIFOSET(fd,50); - break; - } - } - if (i == auth_num) { - login_log("Char-server '%s': e-mail of the account %d NOT found (ip: %s)." RETCODE, - server[id].name, RFIFOL(fd,2), ip); - } - RFIFOSKIP(fd,6); - break; - - case 0x2720: // To become GM request - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - { - int acc; - unsigned char buf[10]; - FILE *fp; - acc = RFIFOL(fd,4); - //printf("parse_fromchar: Request to become a GM acount from %d account.\n", acc); - WBUFW(buf,0) = 0x2721; - WBUFL(buf,2) = acc; - WBUFL(buf,6) = 0; - if (strcmp(RFIFOP(fd,8), gm_pass) == 0) { - // only non-GM can become GM - if (isGM(acc) == 0) { - // if we autorise creation - if (level_new_gm > 0) { - // if we can open the file to add the new GM - if ((fp = fopen_(GM_account_filename, "a")) != NULL) { - char tmpstr[24]; - struct timeval tv; - gettimeofday(&tv, NULL); - strftime(tmpstr, 23, date_format, gmtime(&(tv.tv_sec))); - fprintf(fp, RETCODE "// %s: @GM command on account %d" RETCODE "%d %d" RETCODE, tmpstr, acc, acc, level_new_gm); - fclose_(fp); - WBUFL(buf,6) = level_new_gm; - read_gm_account(); - send_GM_accounts(); - printf("GM Change of the account %d: level 0 -> %d.\n", acc, level_new_gm); - login_log("Char-server '%s': GM Change of the account %d: level 0 -> %d (ip: %s)." RETCODE, - server[id].name, acc, level_new_gm, ip); - } else { - printf("Error of GM change (suggested account: %d, correct password, unable to add a GM account in GM accounts file)\n", acc); - login_log("Char-server '%s': Error of GM change (suggested account: %d, correct password, unable to add a GM account in GM accounts file, ip: %s)." RETCODE, - server[id].name, acc, ip); - } - } else { - printf("Error of GM change (suggested account: %d, correct password, but GM creation is disable (level_new_gm = 0))\n", acc); - login_log("Char-server '%s': Error of GM change (suggested account: %d, correct password, but GM creation is disable (level_new_gm = 0), ip: %s)." RETCODE, - server[id].name, acc, ip); - } - } else { - printf("Error of GM change (suggested account: %d (already GM), correct password).\n", acc); - login_log("Char-server '%s': Error of GM change (suggested account: %d (already GM), correct password, ip: %s)." RETCODE, - server[id].name, acc, ip); - } - } else { - printf("Error of GM change (suggested account: %d, invalid password).\n", acc); - login_log("Char-server '%s': Error of GM change (suggested account: %d, invalid password, ip: %s)." RETCODE, - server[id].name, acc, ip); - } - charif_sendallwos(-1, buf, 10); - } - RFIFOSKIP(fd, RFIFOW(fd,2)); - return 0; - - // Map server send information to change an email of an account via char-server - case 0x2722: // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B - if (RFIFOREST(fd) < 86) - return 0; - { - int acc; - char actual_email[40], new_email[40]; - acc = RFIFOL(fd,2); - memcpy(actual_email, RFIFOP(fd,6), 40); - actual_email[39] = '\0'; - remove_control_chars(actual_email); - memcpy(new_email, RFIFOP(fd,46), 40); - new_email[39] = '\0'; - remove_control_chars(new_email); - if (e_mail_check(actual_email) == 0) - login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual email is invalid (account: %d, ip: %s)" RETCODE, - server[id].name, acc, ip); - else if (e_mail_check(new_email) == 0) - login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a invalid new e-mail (account: %d, ip: %s)" RETCODE, - server[id].name, acc, ip); - else if (strcmpi(new_email, "a@a.com") == 0) - login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a default e-mail (account: %d, ip: %s)" RETCODE, - server[id].name, acc, ip); - else { - for(i = 0; i < auth_num; i++) { - if (auth_dat[i].account_id == acc) { - if (strcmpi(auth_dat[i].email, actual_email) == 0) { - memcpy(auth_dat[i].email, new_email, 40); - login_log("Char-server '%s': Modify an e-mail on an account (@email GM command) (account: %d (%s), new e-mail: %s, ip: %s)." RETCODE, - server[id].name, acc, auth_dat[i].userid, new_email, ip); - // Save - mmo_auth_sync(); - } else - login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual e-mail is incorrect (account: %d (%s), actual e-mail: %s, proposed e-mail: %s, ip: %s)." RETCODE, - server[id].name, acc, auth_dat[i].userid, auth_dat[i].email, actual_email, ip); - break; - } - } - if (i == auth_num) - login_log("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but account doesn't exist (account: %d, ip: %s)." RETCODE, - server[id].name, acc, ip); - } - } - RFIFOSKIP(fd, 86); - break; - - // Receiving of map-server via char-server a status change resquest (by Yor) - case 0x2724: - if (RFIFOREST(fd) < 10) - return 0; - { - int acc, statut; - acc = RFIFOL(fd,2); - statut = RFIFOL(fd,6); - for(i = 0; i < auth_num; i++) { - if (auth_dat[i].account_id == acc) { - if (auth_dat[i].state != statut) { - login_log("Char-server '%s': Status change (account: %d, new status %d, ip: %s)." RETCODE, - server[id].name, acc, statut, ip); - if (statut != 0) { - unsigned char buf[16]; - WBUFW(buf,0) = 0x2731; - WBUFL(buf,2) = acc; - WBUFB(buf,6) = 0; // 0: change of statut, 1: ban - WBUFL(buf,7) = statut; // status or final date of a banishment - charif_sendallwos(-1, buf, 11); - for(j = 0; j < AUTH_FIFO_SIZE; j++) - if (auth_fifo[j].account_id == acc) - auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification) - } - auth_dat[i].state = statut; - // Save - mmo_auth_sync(); - } else - login_log("Char-server '%s': Error of Status change - actual status is already the good status (account: %d, status %d, ip: %s)." RETCODE, - server[id].name, acc, statut, ip); - break; - } - } - if (i == auth_num) { - login_log("Char-server '%s': Error of Status change (account: %d not found, suggested status %d, ip: %s)." RETCODE, - server[id].name, acc, statut, ip); - } - RFIFOSKIP(fd,10); - } - return 0; - - case 0x2725: // Receiving of map-server via char-server a ban resquest (by Yor) - if (RFIFOREST(fd) < 18) - return 0; - { - int acc; - acc = RFIFOL(fd,2); - for(i = 0; i < auth_num; i++) { - if (auth_dat[i].account_id == acc) { - time_t timestamp; - struct tm *tmtime; - if (auth_dat[i].ban_until_time == 0 || auth_dat[i].ban_until_time < time(NULL)) - timestamp = time(NULL); - else - timestamp = auth_dat[i].ban_until_time; - tmtime = gmtime(×tamp); - tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,6); - tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,8); - tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,10); - tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,12); - tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,14); - tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,16); - timestamp = timegm(tmtime); - if (timestamp != -1) { - if (timestamp <= time(NULL)) - timestamp = 0; - if (auth_dat[i].ban_until_time != timestamp) { - if (timestamp != 0) { - unsigned char buf[16]; - char tmpstr[2048]; - strftime(tmpstr, 24, date_format, gmtime(×tamp)); - login_log("Char-server '%s': Ban request (account: %d, new final date of banishment: %d (%s), ip: %s)." RETCODE, - server[id].name, acc, timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip); - WBUFW(buf,0) = 0x2731; - WBUFL(buf,2) = auth_dat[i].account_id; - WBUFB(buf,6) = 1; // 0: change of statut, 1: ban - WBUFL(buf,7) = timestamp; // status or final date of a banishment - charif_sendallwos(-1, buf, 11); - for(j = 0; j < AUTH_FIFO_SIZE; j++) - if (auth_fifo[j].account_id == acc) - auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification) - } else { - login_log("Char-server '%s': Error of ban request (account: %d, new date unbans the account, ip: %s)." RETCODE, - server[id].name, acc, ip); - } - auth_dat[i].ban_until_time = timestamp; - // Save - mmo_auth_sync(); - } else { - login_log("Char-server '%s': Error of ban request (account: %d, no change for ban date, ip: %s)." RETCODE, - server[id].name, acc, ip); - } - } else { - login_log("Char-server '%s': Error of ban request (account: %d, invalid date, ip: %s)." RETCODE, - server[id].name, acc, ip); - } - break; - } - } - if (i == auth_num) { - login_log("Char-server '%s': Error of ban request (account: %d not found, ip: %s)." RETCODE, - server[id].name, acc, ip); - } - RFIFOSKIP(fd,18); - } - return 0; - - case 0x2727: // Change of sex (sex is reversed) - if (RFIFOREST(fd) < 6) - return 0; - { - int acc, sex; - acc = RFIFOL(fd,2); - for(i = 0; i < auth_num; i++) { -// printf("%d,", auth_dat[i].account_id); - if (auth_dat[i].account_id == acc) { - if (auth_dat[i].sex == 2) - login_log("Char-server '%s': Error of sex change - Server account (suggested account: %d, actual sex %d (Server), ip: %s)." RETCODE, - server[id].name, acc, auth_dat[i].sex, ip); - else { - unsigned char buf[16]; - if (auth_dat[i].sex == 0) - sex = 1; - else - sex = 0; - login_log("Char-server '%s': Sex change (account: %d, new sex %c, ip: %s)." RETCODE, - server[id].name, acc, (sex == 2) ? 'S' : (sex ? 'M' : 'F'), ip); - for(j = 0; j < AUTH_FIFO_SIZE; j++) - if (auth_fifo[j].account_id == acc) - auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification) - auth_dat[i].sex = sex; - WBUFW(buf,0) = 0x2723; - WBUFL(buf,2) = acc; - WBUFB(buf,6) = sex; - charif_sendallwos(-1, buf, 7); - // Save - mmo_auth_sync(); - } - break; - } - } - if (i == auth_num) { - login_log("Char-server '%s': Error of sex change (account: %d not found, sex would be reversed, ip: %s)." RETCODE, - server[id].name, acc, ip); - } - RFIFOSKIP(fd,6); - } - return 0; - - case 0x2728: // We receive account_reg2 from a char-server, and we send them to other char-servers. - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - { - int acc, p; - acc = RFIFOL(fd,4); - for(i = 0; i < auth_num; i++) { - if (auth_dat[i].account_id == acc) { - unsigned char buf[RFIFOW(fd,2)+1]; - login_log("Char-server '%s': receiving (from the char-server) of account_reg2 (account: %d, ip: %s)." RETCODE, - server[id].name, acc, ip); - for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) { - memcpy(auth_dat[i].account_reg2[j].str, RFIFOP(fd,p), 32); - auth_dat[i].account_reg2[j].str[31] = '\0'; - remove_control_chars(auth_dat[i].account_reg2[j].str); - auth_dat[i].account_reg2[j].value = RFIFOL(fd,p+32); - } - auth_dat[i].account_reg2_num = j; - // Sending information towards the other char-servers. - memcpy(WBUFP(buf,0), RFIFOP(fd,0), RFIFOW(fd,2)); - WBUFW(buf,0) = 0x2729; - charif_sendallwos(fd, buf, WBUFW(buf,2)); - // Save - mmo_auth_sync(); -// printf("parse_fromchar: receiving (from the char-server) of account_reg2 (account id: %d).\n", acc); - break; - } - } - if (i == auth_num) { -// printf("parse_fromchar: receiving (from the char-server) of account_reg2 (unknwon account id: %d).\n", acc); - login_log("Char-server '%s': receiving (from the char-server) of account_reg2 (account: %d not found, ip: %s)." RETCODE, - server[id].name, acc, ip); - } - } - RFIFOSKIP(fd,RFIFOW(fd,2)); - break; - - case 0x272a: // Receiving of map-server via char-server a unban resquest (by Yor) - if (RFIFOREST(fd) < 6) - return 0; - { - int acc; - acc = RFIFOL(fd,2); - for(i = 0; i < auth_num; i++) { - if (auth_dat[i].account_id == acc) { - if (auth_dat[i].ban_until_time != 0) { - auth_dat[i].ban_until_time = 0; - login_log("Char-server '%s': UnBan request (account: %d, ip: %s)." RETCODE, - server[id].name, acc, ip); - } else { - login_log("Char-server '%s': Error of UnBan request (account: %d, no change for unban date, ip: %s)." RETCODE, - server[id].name, acc, ip); - } - break; - } - } - if (i == auth_num) { - login_log("Char-server '%s': Error of UnBan request (account: %d not found, ip: %s)." RETCODE, - server[id].name, acc, ip); - } - RFIFOSKIP(fd,6); - } - return 0; - - // request from char-server to change account password - case 0x2740: // 0x2740 <account_id>.L <actual_password>.24B <new_password>.24B - if (RFIFOREST(fd) < 54) - return 0; - { - int acc; - char actual_pass[24], new_pass[24]; - acc = RFIFOL(fd,2); - memcpy(actual_pass, RFIFOP(fd,6), 24); - actual_pass[23] = '\0'; - remove_control_chars(actual_pass); - memcpy(new_pass, RFIFOP(fd,30), 24); - new_pass[23] = '\0'; - remove_control_chars(new_pass); - - int status = 0; - - for(i = 0; i < auth_num; i++) { - if (auth_dat[i].account_id == acc) { - if (strcmpi(auth_dat[i].pass, actual_pass) == 0) { - if (strlen(new_pass) < 4) - status = 3; - else { - status = 1; - memcpy(auth_dat[i].pass, new_pass, 24); - login_log("Char-server '%s': Change pass success (account: %d (%s), ip: %s." RETCODE, - server[id].name, acc, auth_dat[i].userid, ip); - // Save - mmo_auth_sync(); - } - } else { - status = 2; - login_log("Char-server '%s': Attempt to modify a pass failed, wrong password. (account: %d (%s), ip: %s)." RETCODE, - server[id].name, acc, auth_dat[i].userid, ip); - } - break; - } - } - WFIFOW(fd,0) = 0x2741; - WFIFOL(fd,2) = acc; - WFIFOB(fd,6) = status; // 0: acc not found, 1: success, 2: password mismatch, 3: pass too short - WFIFOSET(fd,7); - } - - RFIFOSKIP(fd, 54); - break; - - default: - { - FILE *logfp; - char tmpstr[24]; - struct timeval tv; - logfp = fopen_(login_log_unknown_packets_filename, "a"); - if (logfp) { - gettimeofday(&tv, NULL); - strftime(tmpstr, 23, date_format, gmtime(&(tv.tv_sec))); - fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000); - fprintf(logfp, "parse_fromchar: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd)); - fprintf(logfp, "Detail (in hex):" RETCODE); - fprintf(logfp, "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" RETCODE); - memset(tmpstr, '\0', sizeof(tmpstr)); - for(i = 0; i < RFIFOREST(fd); i++) { - if ((i & 15) == 0) - fprintf(logfp, "%04X ",i); - fprintf(logfp, "%02x ", RFIFOB(fd,i)); - if (RFIFOB(fd,i) > 0x1f) - tmpstr[i % 16] = RFIFOB(fd,i); - else - tmpstr[i % 16] = '.'; - if ((i - 7) % 16 == 0) // -8 + 1 - fprintf(logfp, " "); - else if ((i + 1) % 16 == 0) { - fprintf(logfp, " %s" RETCODE, tmpstr); - memset(tmpstr, '\0', sizeof(tmpstr)); - } - } - if (i % 16 != 0) { - for(j = i; j % 16 != 0; j++) { - fprintf(logfp, " "); - if ((j - 7) % 16 == 0) // -8 + 1 - fprintf(logfp, " "); - } - fprintf(logfp, " %s" RETCODE, tmpstr); - } - fprintf(logfp, RETCODE); - fclose_(logfp); - } - } - printf("parse_fromchar: Unknown packet 0x%x (from a char-server)! -> disconnection.\n", RFIFOW(fd,0)); - session[fd]->eof = 1; - printf("Char-server has been disconnected (unknown packet).\n"); - return 0; - } - } - return 0; + auth_fifo[i].sex == RFIFOB (fd, 14) && + (!check_ip_flag + || auth_fifo[i].ip == RFIFOL (fd, 15)) + && !auth_fifo[i].delflag) + { + int p, k; + auth_fifo[i].delflag = 1; + login_log + ("Char-server '%s': authentification of the account %d accepted (ip: %s)." + RETCODE, server[id].name, acc, ip); +// printf("%d\n", i); + for (k = 0; k < auth_num; k++) + { + if (auth_dat[k].account_id == acc) + { + WFIFOW (fd, 0) = 0x2729; // Sending of the account_reg2 + WFIFOL (fd, 4) = acc; + for (p = 8, j = 0; + j < auth_dat[k].account_reg2_num; + p += 36, j++) + { + memcpy (WFIFOP (fd, p), + auth_dat[k]. + account_reg2[j].str, 32); + WFIFOL (fd, p + 32) = + auth_dat[k].account_reg2[j].value; + } + WFIFOW (fd, 2) = p; + WFIFOSET (fd, p); +// printf("parse_fromchar: Sending of account_reg2: login->char (auth fifo)\n"); + WFIFOW (fd, 0) = 0x2713; + WFIFOL (fd, 2) = acc; + WFIFOB (fd, 6) = 0; + memcpy (WFIFOP (fd, 7), auth_dat[k].email, + 40); + WFIFOL (fd, 47) = + (unsigned long) + auth_dat[k].connect_until_time; + WFIFOSET (fd, 51); + break; + } + } + break; + } + } + // authentification not found + if (i == AUTH_FIFO_SIZE) + { + login_log + ("Char-server '%s': authentification of the account %d REFUSED (ip: %s)." + RETCODE, server[id].name, acc, ip); + WFIFOW (fd, 0) = 0x2713; + WFIFOL (fd, 2) = acc; + WFIFOB (fd, 6) = 1; + // It is unnecessary to send email + // It is unnecessary to send validity date of the account + WFIFOSET (fd, 51); + } + } + RFIFOSKIP (fd, 19); + break; + + case 0x2714: + if (RFIFOREST (fd) < 6) + return 0; + //printf("parse_fromchar: Receiving of the users number of the server '%s': %d\n", server[id].name, RFIFOL(fd,2)); + server[id].users = RFIFOL (fd, 2); + if (anti_freeze_enable) + server_freezeflag[id] = 5; // Char anti-freeze system. Counter. 5 ok, 4...0 freezed + RFIFOSKIP (fd, 6); + break; + + // we receive a e-mail creation of an account with a default e-mail (no answer) + case 0x2715: + { + int acc; + char email[40]; + if (RFIFOREST (fd) < 46) + return 0; + acc = RFIFOL (fd, 2); // speed up + memcpy (email, RFIFOP (fd, 6), 40); + email[39] = '\0'; + remove_control_chars (email); + //printf("parse_fromchar: an e-mail creation of an account with a default e-mail: server '%s', account: %d, e-mail: '%s'.\n", server[id].name, acc, RFIFOP(fd,6)); + if (e_mail_check (email) == 0) + login_log + ("Char-server '%s': Attempt to create an e-mail on an account with a default e-mail REFUSED - e-mail is invalid (account: %d, ip: %s)" + RETCODE, server[id].name, acc, ip); + else + { + for (i = 0; i < auth_num; i++) + { + if (auth_dat[i].account_id == acc + && (strcmp (auth_dat[i].email, "a@a.com") == 0 + || auth_dat[i].email[0] == '\0')) + { + memcpy (auth_dat[i].email, email, 40); + login_log + ("Char-server '%s': Create an e-mail on an account with a default e-mail (account: %d, new e-mail: %s, ip: %s)." + RETCODE, server[id].name, acc, email, ip); + // Save + mmo_auth_sync (); + break; + } + } + if (i == auth_num) + login_log + ("Char-server '%s': Attempt to create an e-mail on an account with a default e-mail REFUSED - account doesn't exist or e-mail of account isn't default e-mail (account: %d, ip: %s)." + RETCODE, server[id].name, acc, ip); + } + RFIFOSKIP (fd, 46); + break; + + // We receive an e-mail/limited time request, because a player comes back from a map-server to the char-server + } + case 0x2716: + if (RFIFOREST (fd) < 6) + return 0; + //printf("parse_fromchar: E-mail/limited time request from '%s' server (concerned account: %d)\n", server[id].name, RFIFOL(fd,2)); + for (i = 0; i < auth_num; i++) + { + if (auth_dat[i].account_id == RFIFOL (fd, 2)) + { + login_log + ("Char-server '%s': e-mail of the account %d found (ip: %s)." + RETCODE, server[id].name, RFIFOL (fd, 2), ip); + WFIFOW (fd, 0) = 0x2717; + WFIFOL (fd, 2) = RFIFOL (fd, 2); + memcpy (WFIFOP (fd, 6), auth_dat[i].email, 40); + WFIFOL (fd, 46) = + (unsigned long) auth_dat[i].connect_until_time; + WFIFOSET (fd, 50); + break; + } + } + if (i == auth_num) + { + login_log + ("Char-server '%s': e-mail of the account %d NOT found (ip: %s)." + RETCODE, server[id].name, RFIFOL (fd, 2), ip); + } + RFIFOSKIP (fd, 6); + break; + + case 0x2720: // To become GM request + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + { + int acc; + unsigned char buf[10]; + FILE *fp; + acc = RFIFOL (fd, 4); + //printf("parse_fromchar: Request to become a GM acount from %d account.\n", acc); + WBUFW (buf, 0) = 0x2721; + WBUFL (buf, 2) = acc; + WBUFL (buf, 6) = 0; + if (strcmp (RFIFOP (fd, 8), gm_pass) == 0) + { + // only non-GM can become GM + if (isGM (acc) == 0) + { + // if we autorise creation + if (level_new_gm > 0) + { + // if we can open the file to add the new GM + if ((fp = + fopen_ (GM_account_filename, + "a")) != NULL) + { + char tmpstr[24]; + struct timeval tv; + gettimeofday (&tv, NULL); + strftime (tmpstr, 23, date_format, + gmtime (&(tv.tv_sec))); + fprintf (fp, + RETCODE + "// %s: @GM command on account %d" + RETCODE "%d %d" RETCODE, tmpstr, + acc, acc, level_new_gm); + fclose_ (fp); + WBUFL (buf, 6) = level_new_gm; + read_gm_account (); + send_GM_accounts (); + printf + ("GM Change of the account %d: level 0 -> %d.\n", + acc, level_new_gm); + login_log + ("Char-server '%s': GM Change of the account %d: level 0 -> %d (ip: %s)." + RETCODE, server[id].name, acc, + level_new_gm, ip); + } + else + { + printf + ("Error of GM change (suggested account: %d, correct password, unable to add a GM account in GM accounts file)\n", + acc); + login_log + ("Char-server '%s': Error of GM change (suggested account: %d, correct password, unable to add a GM account in GM accounts file, ip: %s)." + RETCODE, server[id].name, acc, ip); + } + } + else + { + printf + ("Error of GM change (suggested account: %d, correct password, but GM creation is disable (level_new_gm = 0))\n", + acc); + login_log + ("Char-server '%s': Error of GM change (suggested account: %d, correct password, but GM creation is disable (level_new_gm = 0), ip: %s)." + RETCODE, server[id].name, acc, ip); + } + } + else + { + printf + ("Error of GM change (suggested account: %d (already GM), correct password).\n", + acc); + login_log + ("Char-server '%s': Error of GM change (suggested account: %d (already GM), correct password, ip: %s)." + RETCODE, server[id].name, acc, ip); + } + } + else + { + printf + ("Error of GM change (suggested account: %d, invalid password).\n", + acc); + login_log + ("Char-server '%s': Error of GM change (suggested account: %d, invalid password, ip: %s)." + RETCODE, server[id].name, acc, ip); + } + charif_sendallwos (-1, buf, 10); + } + RFIFOSKIP (fd, RFIFOW (fd, 2)); + return 0; + + // Map server send information to change an email of an account via char-server + case 0x2722: // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B + if (RFIFOREST (fd) < 86) + return 0; + { + int acc; + char actual_email[40], new_email[40]; + acc = RFIFOL (fd, 2); + memcpy (actual_email, RFIFOP (fd, 6), 40); + actual_email[39] = '\0'; + remove_control_chars (actual_email); + memcpy (new_email, RFIFOP (fd, 46), 40); + new_email[39] = '\0'; + remove_control_chars (new_email); + if (e_mail_check (actual_email) == 0) + login_log + ("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual email is invalid (account: %d, ip: %s)" + RETCODE, server[id].name, acc, ip); + else if (e_mail_check (new_email) == 0) + login_log + ("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a invalid new e-mail (account: %d, ip: %s)" + RETCODE, server[id].name, acc, ip); + else if (strcmpi (new_email, "a@a.com") == 0) + login_log + ("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a default e-mail (account: %d, ip: %s)" + RETCODE, server[id].name, acc, ip); + else + { + for (i = 0; i < auth_num; i++) + { + if (auth_dat[i].account_id == acc) + { + if (strcmpi (auth_dat[i].email, actual_email) + == 0) + { + memcpy (auth_dat[i].email, new_email, 40); + login_log + ("Char-server '%s': Modify an e-mail on an account (@email GM command) (account: %d (%s), new e-mail: %s, ip: %s)." + RETCODE, server[id].name, acc, + auth_dat[i].userid, new_email, ip); + // Save + mmo_auth_sync (); + } + else + login_log + ("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual e-mail is incorrect (account: %d (%s), actual e-mail: %s, proposed e-mail: %s, ip: %s)." + RETCODE, server[id].name, acc, + auth_dat[i].userid, + auth_dat[i].email, actual_email, ip); + break; + } + } + if (i == auth_num) + login_log + ("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but account doesn't exist (account: %d, ip: %s)." + RETCODE, server[id].name, acc, ip); + } + } + RFIFOSKIP (fd, 86); + break; + + // Receiving of map-server via char-server a status change resquest (by Yor) + case 0x2724: + if (RFIFOREST (fd) < 10) + return 0; + { + int acc, statut; + acc = RFIFOL (fd, 2); + statut = RFIFOL (fd, 6); + for (i = 0; i < auth_num; i++) + { + if (auth_dat[i].account_id == acc) + { + if (auth_dat[i].state != statut) + { + login_log + ("Char-server '%s': Status change (account: %d, new status %d, ip: %s)." + RETCODE, server[id].name, acc, statut, + ip); + if (statut != 0) + { + unsigned char buf[16]; + WBUFW (buf, 0) = 0x2731; + WBUFL (buf, 2) = acc; + WBUFB (buf, 6) = 0; // 0: change of statut, 1: ban + WBUFL (buf, 7) = statut; // status or final date of a banishment + charif_sendallwos (-1, buf, 11); + for (j = 0; j < AUTH_FIFO_SIZE; j++) + if (auth_fifo[j].account_id == acc) + auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification) + } + auth_dat[i].state = statut; + // Save + mmo_auth_sync (); + } + else + login_log + ("Char-server '%s': Error of Status change - actual status is already the good status (account: %d, status %d, ip: %s)." + RETCODE, server[id].name, acc, statut, + ip); + break; + } + } + if (i == auth_num) + { + login_log + ("Char-server '%s': Error of Status change (account: %d not found, suggested status %d, ip: %s)." + RETCODE, server[id].name, acc, statut, ip); + } + RFIFOSKIP (fd, 10); + } + return 0; + + case 0x2725: // Receiving of map-server via char-server a ban resquest (by Yor) + if (RFIFOREST (fd) < 18) + return 0; + { + int acc; + acc = RFIFOL (fd, 2); + for (i = 0; i < auth_num; i++) + { + if (auth_dat[i].account_id == acc) + { + time_t timestamp; + struct tm *tmtime; + if (auth_dat[i].ban_until_time == 0 + || auth_dat[i].ban_until_time < time (NULL)) + timestamp = time (NULL); + else + timestamp = auth_dat[i].ban_until_time; + tmtime = gmtime (×tamp); + tmtime->tm_year = + tmtime->tm_year + (short) RFIFOW (fd, 6); + tmtime->tm_mon = + tmtime->tm_mon + (short) RFIFOW (fd, 8); + tmtime->tm_mday = + tmtime->tm_mday + (short) RFIFOW (fd, 10); + tmtime->tm_hour = + tmtime->tm_hour + (short) RFIFOW (fd, 12); + tmtime->tm_min = + tmtime->tm_min + (short) RFIFOW (fd, 14); + tmtime->tm_sec = + tmtime->tm_sec + (short) RFIFOW (fd, 16); + timestamp = timegm (tmtime); + if (timestamp != -1) + { + if (timestamp <= time (NULL)) + timestamp = 0; + if (auth_dat[i].ban_until_time != timestamp) + { + if (timestamp != 0) + { + unsigned char buf[16]; + char tmpstr[2048]; + strftime (tmpstr, 24, date_format, + gmtime (×tamp)); + login_log + ("Char-server '%s': Ban request (account: %d, new final date of banishment: %d (%s), ip: %s)." + RETCODE, server[id].name, acc, + timestamp, + (timestamp == + 0 ? "no banishment" : tmpstr), + ip); + WBUFW (buf, 0) = 0x2731; + WBUFL (buf, 2) = + auth_dat[i].account_id; + WBUFB (buf, 6) = 1; // 0: change of statut, 1: ban + WBUFL (buf, 7) = timestamp; // status or final date of a banishment + charif_sendallwos (-1, buf, 11); + for (j = 0; j < AUTH_FIFO_SIZE; j++) + if (auth_fifo[j].account_id == + acc) + auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification) + } + else + { + login_log + ("Char-server '%s': Error of ban request (account: %d, new date unbans the account, ip: %s)." + RETCODE, server[id].name, acc, + ip); + } + auth_dat[i].ban_until_time = timestamp; + // Save + mmo_auth_sync (); + } + else + { + login_log + ("Char-server '%s': Error of ban request (account: %d, no change for ban date, ip: %s)." + RETCODE, server[id].name, acc, ip); + } + } + else + { + login_log + ("Char-server '%s': Error of ban request (account: %d, invalid date, ip: %s)." + RETCODE, server[id].name, acc, ip); + } + break; + } + } + if (i == auth_num) + { + login_log + ("Char-server '%s': Error of ban request (account: %d not found, ip: %s)." + RETCODE, server[id].name, acc, ip); + } + RFIFOSKIP (fd, 18); + } + return 0; + + case 0x2727: // Change of sex (sex is reversed) + if (RFIFOREST (fd) < 6) + return 0; + { + int acc, sex; + acc = RFIFOL (fd, 2); + for (i = 0; i < auth_num; i++) + { +// printf("%d,", auth_dat[i].account_id); + if (auth_dat[i].account_id == acc) + { + if (auth_dat[i].sex == 2) + login_log + ("Char-server '%s': Error of sex change - Server account (suggested account: %d, actual sex %d (Server), ip: %s)." + RETCODE, server[id].name, acc, + auth_dat[i].sex, ip); + else + { + unsigned char buf[16]; + if (auth_dat[i].sex == 0) + sex = 1; + else + sex = 0; + login_log + ("Char-server '%s': Sex change (account: %d, new sex %c, ip: %s)." + RETCODE, server[id].name, acc, + (sex == 2) ? 'S' : (sex ? 'M' : 'F'), + ip); + for (j = 0; j < AUTH_FIFO_SIZE; j++) + if (auth_fifo[j].account_id == acc) + auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification) + auth_dat[i].sex = sex; + WBUFW (buf, 0) = 0x2723; + WBUFL (buf, 2) = acc; + WBUFB (buf, 6) = sex; + charif_sendallwos (-1, buf, 7); + // Save + mmo_auth_sync (); + } + break; + } + } + if (i == auth_num) + { + login_log + ("Char-server '%s': Error of sex change (account: %d not found, sex would be reversed, ip: %s)." + RETCODE, server[id].name, acc, ip); + } + RFIFOSKIP (fd, 6); + } + return 0; + + case 0x2728: // We receive account_reg2 from a char-server, and we send them to other char-servers. + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + { + int acc, p; + acc = RFIFOL (fd, 4); + for (i = 0; i < auth_num; i++) + { + if (auth_dat[i].account_id == acc) + { + unsigned char buf[RFIFOW (fd, 2) + 1]; + login_log + ("Char-server '%s': receiving (from the char-server) of account_reg2 (account: %d, ip: %s)." + RETCODE, server[id].name, acc, ip); + for (p = 8, j = 0; + p < RFIFOW (fd, 2) && j < ACCOUNT_REG2_NUM; + p += 36, j++) + { + memcpy (auth_dat[i].account_reg2[j].str, + RFIFOP (fd, p), 32); + auth_dat[i].account_reg2[j].str[31] = '\0'; + remove_control_chars (auth_dat[i].account_reg2 + [j].str); + auth_dat[i].account_reg2[j].value = + RFIFOL (fd, p + 32); + } + auth_dat[i].account_reg2_num = j; + // Sending information towards the other char-servers. + memcpy (WBUFP (buf, 0), RFIFOP (fd, 0), + RFIFOW (fd, 2)); + WBUFW (buf, 0) = 0x2729; + charif_sendallwos (fd, buf, WBUFW (buf, 2)); + // Save + mmo_auth_sync (); +// printf("parse_fromchar: receiving (from the char-server) of account_reg2 (account id: %d).\n", acc); + break; + } + } + if (i == auth_num) + { +// printf("parse_fromchar: receiving (from the char-server) of account_reg2 (unknwon account id: %d).\n", acc); + login_log + ("Char-server '%s': receiving (from the char-server) of account_reg2 (account: %d not found, ip: %s)." + RETCODE, server[id].name, acc, ip); + } + } + RFIFOSKIP (fd, RFIFOW (fd, 2)); + break; + + case 0x272a: // Receiving of map-server via char-server a unban resquest (by Yor) + if (RFIFOREST (fd) < 6) + return 0; + { + int acc; + acc = RFIFOL (fd, 2); + for (i = 0; i < auth_num; i++) + { + if (auth_dat[i].account_id == acc) + { + if (auth_dat[i].ban_until_time != 0) + { + auth_dat[i].ban_until_time = 0; + login_log + ("Char-server '%s': UnBan request (account: %d, ip: %s)." + RETCODE, server[id].name, acc, ip); + } + else + { + login_log + ("Char-server '%s': Error of UnBan request (account: %d, no change for unban date, ip: %s)." + RETCODE, server[id].name, acc, ip); + } + break; + } + } + if (i == auth_num) + { + login_log + ("Char-server '%s': Error of UnBan request (account: %d not found, ip: %s)." + RETCODE, server[id].name, acc, ip); + } + RFIFOSKIP (fd, 6); + } + return 0; + + // request from char-server to change account password + case 0x2740: // 0x2740 <account_id>.L <actual_password>.24B <new_password>.24B + if (RFIFOREST (fd) < 54) + return 0; + { + int acc; + char actual_pass[24], new_pass[24]; + acc = RFIFOL (fd, 2); + memcpy (actual_pass, RFIFOP (fd, 6), 24); + actual_pass[23] = '\0'; + remove_control_chars (actual_pass); + memcpy (new_pass, RFIFOP (fd, 30), 24); + new_pass[23] = '\0'; + remove_control_chars (new_pass); + + int status = 0; + + for (i = 0; i < auth_num; i++) + { + if (auth_dat[i].account_id == acc) + { + if (strcmpi (auth_dat[i].pass, actual_pass) == 0) + { + if (strlen (new_pass) < 4) + status = 3; + else + { + status = 1; + memcpy (auth_dat[i].pass, new_pass, 24); + login_log + ("Char-server '%s': Change pass success (account: %d (%s), ip: %s." + RETCODE, server[id].name, acc, + auth_dat[i].userid, ip); + // Save + mmo_auth_sync (); + } + } + else + { + status = 2; + login_log + ("Char-server '%s': Attempt to modify a pass failed, wrong password. (account: %d (%s), ip: %s)." + RETCODE, server[id].name, acc, + auth_dat[i].userid, ip); + } + break; + } + } + WFIFOW (fd, 0) = 0x2741; + WFIFOL (fd, 2) = acc; + WFIFOB (fd, 6) = status; // 0: acc not found, 1: success, 2: password mismatch, 3: pass too short + WFIFOSET (fd, 7); + } + + RFIFOSKIP (fd, 54); + break; + + default: + { + FILE *logfp; + char tmpstr[24]; + struct timeval tv; + logfp = fopen_ (login_log_unknown_packets_filename, "a"); + if (logfp) + { + gettimeofday (&tv, NULL); + strftime (tmpstr, 23, date_format, gmtime (&(tv.tv_sec))); + fprintf (logfp, + "%s.%03d: receiving of an unknown packet -> disconnection" + RETCODE, tmpstr, (int) tv.tv_usec / 1000); + fprintf (logfp, + "parse_fromchar: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." + RETCODE, fd, ip, RFIFOW (fd, 0), RFIFOREST (fd)); + fprintf (logfp, "Detail (in hex):" RETCODE); + fprintf (logfp, + "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" + RETCODE); + memset (tmpstr, '\0', sizeof (tmpstr)); + for (i = 0; i < RFIFOREST (fd); i++) + { + if ((i & 15) == 0) + fprintf (logfp, "%04X ", i); + fprintf (logfp, "%02x ", RFIFOB (fd, i)); + if (RFIFOB (fd, i) > 0x1f) + tmpstr[i % 16] = RFIFOB (fd, i); + else + tmpstr[i % 16] = '.'; + if ((i - 7) % 16 == 0) // -8 + 1 + fprintf (logfp, " "); + else if ((i + 1) % 16 == 0) + { + fprintf (logfp, " %s" RETCODE, tmpstr); + memset (tmpstr, '\0', sizeof (tmpstr)); + } + } + if (i % 16 != 0) + { + for (j = i; j % 16 != 0; j++) + { + fprintf (logfp, " "); + if ((j - 7) % 16 == 0) // -8 + 1 + fprintf (logfp, " "); + } + fprintf (logfp, " %s" RETCODE, tmpstr); + } + fprintf (logfp, RETCODE); + fclose_ (logfp); + } + } + printf + ("parse_fromchar: Unknown packet 0x%x (from a char-server)! -> disconnection.\n", + RFIFOW (fd, 0)); + session[fd]->eof = 1; + printf + ("Char-server has been disconnected (unknown packet).\n"); + return 0; + } + } + return 0; } //--------------------------------------- // Packet parsing for administation login //--------------------------------------- -int parse_admin(int fd) { - int i, j; - unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; - char* account_name; - char ip[16]; - - sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); - - if (session[fd]->eof) { - close(fd); - delete_session(fd); - printf("Remote administration has disconnected (session #%d).\n", fd); - return 0; - } - - while(RFIFOREST(fd) >= 2) { - if (display_parse_admin == 1) - printf("parse_admin: connection #%d, packet: 0x%x (with being read: %d).\n", fd, RFIFOW(fd,0), RFIFOREST(fd)); - - switch(RFIFOW(fd,0)) { - case 0x7530: // Request of the server version - login_log("'ladmin': Sending of the server version (ip: %s)" RETCODE, ip); - WFIFOW(fd,0) = 0x7531; - WFIFOB(fd,2) = ATHENA_MAJOR_VERSION; - WFIFOB(fd,3) = ATHENA_MINOR_VERSION; - WFIFOB(fd,4) = ATHENA_REVISION; - WFIFOB(fd,5) = ATHENA_RELEASE_FLAG; - WFIFOB(fd,6) = ATHENA_OFFICIAL_FLAG; - WFIFOB(fd,7) = ATHENA_SERVER_LOGIN; - WFIFOW(fd,8) = ATHENA_MOD_VERSION; - WFIFOSET(fd,10); - RFIFOSKIP(fd,2); - break; - - case 0x7532: // Request of end of connection - login_log("'ladmin': End of connection (ip: %s)" RETCODE, ip); - RFIFOSKIP(fd,2); - session[fd]->eof = 1; - break; - - case 0x7920: // Request of an accounts list - if (RFIFOREST(fd) < 10) - return 0; - { - int st, ed, len; - int id[auth_num]; - st = RFIFOL(fd,2); - ed = RFIFOL(fd,6); - RFIFOSKIP(fd,10); - WFIFOW(fd,0) = 0x7921; - if (st < 0) - st = 0; - if (ed > END_ACCOUNT_NUM || ed < st || ed <= 0) - ed = END_ACCOUNT_NUM; - login_log("'ladmin': Sending an accounts list (ask: from %d to %d, ip: %s)" RETCODE, st, ed, ip); - // Sort before send - for(i = 0; i < auth_num; i++) { - int k; - id[i] = i; - for(j = 0; j < i; j++) { - if (auth_dat[id[i]].account_id < auth_dat[id[j]].account_id) { - for(k = i; k > j; k--) { - id[k] = id[k-1]; - } - id[j] = i; // id[i] - break; - } - } - } - // Sending accounts information - len = 4; - for(i = 0; i < auth_num && len < 30000; i++) { - int account_id = auth_dat[id[i]].account_id; // use sorted index - if (account_id >= st && account_id <= ed) { - j = id[i]; - WFIFOL(fd,len) = account_id; - WFIFOB(fd,len+4) = (unsigned char)isGM(account_id); - memcpy(WFIFOP(fd,len+5), auth_dat[j].userid, 24); - WFIFOB(fd,len+29) = auth_dat[j].sex; - WFIFOL(fd,len+30) = auth_dat[j].logincount; - if (auth_dat[j].state == 0 && auth_dat[j].ban_until_time != 0) // if no state and banished - WFIFOL(fd,len+34) = 7; // 6 = Your are Prohibited to log in until %s - else - WFIFOL(fd,len+34) = auth_dat[j].state; - len += 38; - } - } - WFIFOW(fd,2) = len; - WFIFOSET(fd,len); - } - break; - - case 0x7924: { // [Fate] Itemfrob package: change item IDs - if (RFIFOREST(fd) < 10) - return 0; - charif_sendallwos(-1, RFIFOP(fd, 0), 10); // forward package to char servers - RFIFOSKIP(fd,10); - WFIFOW(fd,0) = 0x7925; - WFIFOSET(fd, 2); +int parse_admin (int fd) +{ + int i, j; + unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; + char *account_name; + char ip[16]; + + sprintf (ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); + + if (session[fd]->eof) + { + close (fd); + delete_session (fd); + printf ("Remote administration has disconnected (session #%d).\n", + fd); + return 0; + } + + while (RFIFOREST (fd) >= 2) + { + if (display_parse_admin == 1) + printf + ("parse_admin: connection #%d, packet: 0x%x (with being read: %d).\n", + fd, RFIFOW (fd, 0), RFIFOREST (fd)); + + switch (RFIFOW (fd, 0)) + { + case 0x7530: // Request of the server version + login_log ("'ladmin': Sending of the server version (ip: %s)" + RETCODE, ip); + WFIFOW (fd, 0) = 0x7531; + WFIFOB (fd, 2) = ATHENA_MAJOR_VERSION; + WFIFOB (fd, 3) = ATHENA_MINOR_VERSION; + WFIFOB (fd, 4) = ATHENA_REVISION; + WFIFOB (fd, 5) = ATHENA_RELEASE_FLAG; + WFIFOB (fd, 6) = ATHENA_OFFICIAL_FLAG; + WFIFOB (fd, 7) = ATHENA_SERVER_LOGIN; + WFIFOW (fd, 8) = ATHENA_MOD_VERSION; + WFIFOSET (fd, 10); + RFIFOSKIP (fd, 2); + break; + + case 0x7532: // Request of end of connection + login_log ("'ladmin': End of connection (ip: %s)" RETCODE, + ip); + RFIFOSKIP (fd, 2); + session[fd]->eof = 1; + break; + + case 0x7920: // Request of an accounts list + if (RFIFOREST (fd) < 10) + return 0; + { + int st, ed, len; + int id[auth_num]; + st = RFIFOL (fd, 2); + ed = RFIFOL (fd, 6); + RFIFOSKIP (fd, 10); + WFIFOW (fd, 0) = 0x7921; + if (st < 0) + st = 0; + if (ed > END_ACCOUNT_NUM || ed < st || ed <= 0) + ed = END_ACCOUNT_NUM; + login_log + ("'ladmin': Sending an accounts list (ask: from %d to %d, ip: %s)" + RETCODE, st, ed, ip); + // Sort before send + for (i = 0; i < auth_num; i++) + { + int k; + id[i] = i; + for (j = 0; j < i; j++) + { + if (auth_dat[id[i]].account_id < + auth_dat[id[j]].account_id) + { + for (k = i; k > j; k--) + { + id[k] = id[k - 1]; + } + id[j] = i; // id[i] + break; + } + } + } + // Sending accounts information + len = 4; + for (i = 0; i < auth_num && len < 30000; i++) + { + int account_id = auth_dat[id[i]].account_id; // use sorted index + if (account_id >= st && account_id <= ed) + { + j = id[i]; + WFIFOL (fd, len) = account_id; + WFIFOB (fd, len + 4) = + (unsigned char) isGM (account_id); + memcpy (WFIFOP (fd, len + 5), auth_dat[j].userid, + 24); + WFIFOB (fd, len + 29) = auth_dat[j].sex; + WFIFOL (fd, len + 30) = auth_dat[j].logincount; + if (auth_dat[j].state == 0 && auth_dat[j].ban_until_time != 0) // if no state and banished + WFIFOL (fd, len + 34) = 7; // 6 = Your are Prohibited to log in until %s + else + WFIFOL (fd, len + 34) = auth_dat[j].state; + len += 38; + } + } + WFIFOW (fd, 2) = len; + WFIFOSET (fd, len); + } + break; + + case 0x7924: + { // [Fate] Itemfrob package: change item IDs + if (RFIFOREST (fd) < 10) + return 0; + charif_sendallwos (-1, RFIFOP (fd, 0), 10); // forward package to char servers + RFIFOSKIP (fd, 10); + WFIFOW (fd, 0) = 0x7925; + WFIFOSET (fd, 2); + break; + } + + case 0x7930: // Request for an account creation + if (RFIFOREST (fd) < 91) + return 0; + { + struct mmo_account ma; + ma.userid = RFIFOP (fd, 2); + ma.passwd = RFIFOP (fd, 26); + memcpy (ma.lastlogin, "-", 2); + ma.sex = RFIFOB (fd, 50); + WFIFOW (fd, 0) = 0x7931; + WFIFOL (fd, 2) = -1; + memcpy (WFIFOP (fd, 6), RFIFOP (fd, 2), 24); + if (strlen (ma.userid) > 23 || strlen (ma.passwd) > 23) + { + login_log + ("'ladmin': Attempt to create an invalid account (account or pass is too long, ip: %s)" + RETCODE, ip); + } + else if (strlen (ma.userid) < 4 || strlen (ma.passwd) < 4) + { + login_log + ("'ladmin': Attempt to create an invalid account (account or pass is too short, ip: %s)" + RETCODE, ip); + } + else if (ma.sex != 'F' && ma.sex != 'M') + { + login_log + ("'ladmin': Attempt to create an invalid account (account: %s, received pass: %s, invalid sex, ip: %s)" + RETCODE, ma.userid, ma.passwd, ip); + } + else if (account_id_count > END_ACCOUNT_NUM) + { + login_log + ("'ladmin': Attempt to create an account, but there is no more available id number (account: %s, pass: %s, sex: %c, ip: %s)" + RETCODE, ma.userid, ma.passwd, ma.sex, ip); + } + else + { + remove_control_chars (ma.userid); + remove_control_chars (ma.passwd); + for (i = 0; i < auth_num; i++) + { + if (strncmp (auth_dat[i].userid, ma.userid, 24) == + 0) + { + login_log + ("'ladmin': Attempt to create an already existing account (account: %s, pass: %s, received pass: %s, ip: %s)" + RETCODE, auth_dat[i].userid, + auth_dat[i].pass, ma.passwd, ip); + break; + } + } + if (i == auth_num) + { + int new_id; + char email[40]; + memcpy (email, RFIFOP (fd, 51), 40); + email[39] = '\0'; + remove_control_chars (email); + new_id = mmo_auth_new (&ma, ma.sex, email); + login_log + ("'ladmin': Account creation (account: %s (id: %d), pass: %s, sex: %c, email: %s, ip: %s)" + RETCODE, ma.userid, new_id, ma.passwd, + ma.sex, auth_dat[i].email, ip); + WFIFOL (fd, 2) = new_id; + mmo_auth_sync (); + } + } + WFIFOSET (fd, 30); + RFIFOSKIP (fd, 91); + } + break; + + case 0x7932: // Request for an account deletion + if (RFIFOREST (fd) < 26) + return 0; + WFIFOW (fd, 0) = 0x7933; + WFIFOL (fd, 2) = -1; + account_name = RFIFOP (fd, 2); + account_name[23] = '\0'; + remove_control_chars (account_name); + i = search_account_index (account_name); + if (i != -1) + { + // Char-server is notified of deletion (for characters deletion). + unsigned char buf[65535]; + WBUFW (buf, 0) = 0x2730; + WBUFL (buf, 2) = auth_dat[i].account_id; + charif_sendallwos (-1, buf, 6); + // send answer + memcpy (WFIFOP (fd, 6), auth_dat[i].userid, 24); + WFIFOL (fd, 2) = auth_dat[i].account_id; + // save deleted account in log file + login_log + ("'ladmin': Account deletion (account: %s, id: %d, ip: %s) - saved in next line:" + RETCODE, auth_dat[i].userid, auth_dat[i].account_id, + ip); + mmo_auth_tostr (buf, &auth_dat[i]); + login_log ("%s" RETCODE, buf); + // delete account + memset (auth_dat[i].userid, '\0', + sizeof (auth_dat[i].userid)); + auth_dat[i].account_id = -1; + mmo_auth_sync (); + } + else + { + memcpy (WFIFOP (fd, 6), account_name, 24); + login_log + ("'ladmin': Attempt to delete an unknown account (account: %s, ip: %s)" + RETCODE, account_name, ip); + } + WFIFOSET (fd, 30); + RFIFOSKIP (fd, 26); + break; + + case 0x7934: // Request to change a password + if (RFIFOREST (fd) < 50) + return 0; + WFIFOW (fd, 0) = 0x7935; + WFIFOL (fd, 2) = -1; + account_name = RFIFOP (fd, 2); + account_name[23] = '\0'; + remove_control_chars (account_name); + i = search_account_index (account_name); + if (i != -1) + { + memcpy (WFIFOP (fd, 6), auth_dat[i].userid, 24); + memcpy (auth_dat[i].pass, RFIFOP (fd, 26), 24); + auth_dat[i].pass[23] = '\0'; + remove_control_chars (auth_dat[i].pass); + WFIFOL (fd, 2) = auth_dat[i].account_id; + login_log + ("'ladmin': Modification of a password (account: %s, new password: %s, ip: %s)" + RETCODE, auth_dat[i].userid, auth_dat[i].pass, ip); + mmo_auth_sync (); + } + else + { + memcpy (WFIFOP (fd, 6), account_name, 24); + login_log + ("'ladmin': Attempt to modify the password of an unknown account (account: %s, ip: %s)" + RETCODE, account_name, ip); + } + WFIFOSET (fd, 30); + RFIFOSKIP (fd, 50); + break; + + case 0x7936: // Request to modify a state + if (RFIFOREST (fd) < 50) + return 0; + { + char error_message[20]; + int statut; + WFIFOW (fd, 0) = 0x7937; + WFIFOL (fd, 2) = -1; + account_name = RFIFOP (fd, 2); + account_name[23] = '\0'; + remove_control_chars (account_name); + statut = RFIFOL (fd, 26); + memcpy (error_message, RFIFOP (fd, 30), 20); + error_message[19] = '\0'; + remove_control_chars (error_message); + if (statut != 7 || error_message[0] == '\0') + { // 7: // 6 = Your are Prohibited to log in until %s + strcpy (error_message, "-"); + } + i = search_account_index (account_name); + if (i != -1) + { + memcpy (WFIFOP (fd, 6), auth_dat[i].userid, 24); + WFIFOL (fd, 2) = auth_dat[i].account_id; + if (auth_dat[i].state == statut + && strcmp (auth_dat[i].error_message, + error_message) == 0) + login_log + ("'ladmin': Modification of a state, but the state of the account is already the good state (account: %s, received state: %d, ip: %s)" + RETCODE, account_name, statut, ip); + else + { + if (statut == 7) + login_log + ("'ladmin': Modification of a state (account: %s, new state: %d - prohibited to login until '%s', ip: %s)" + RETCODE, auth_dat[i].userid, statut, + error_message, ip); + else + login_log + ("'ladmin': Modification of a state (account: %s, new state: %d, ip: %s)" + RETCODE, auth_dat[i].userid, statut, ip); + if (auth_dat[i].state == 0) + { + unsigned char buf[16]; + WBUFW (buf, 0) = 0x2731; + WBUFL (buf, 2) = auth_dat[i].account_id; + WBUFB (buf, 6) = 0; // 0: change of statut, 1: ban + WBUFL (buf, 7) = statut; // status or final date of a banishment + charif_sendallwos (-1, buf, 11); + for (j = 0; j < AUTH_FIFO_SIZE; j++) + if (auth_fifo[j].account_id == + auth_dat[i].account_id) + auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification) + } + auth_dat[i].state = statut; + memcpy (auth_dat[i].error_message, error_message, + 20); + mmo_auth_sync (); + } + } + else + { + memcpy (WFIFOP (fd, 6), account_name, 24); + login_log + ("'ladmin': Attempt to modify the state of an unknown account (account: %s, received state: %d, ip: %s)" + RETCODE, account_name, statut, ip); + } + WFIFOL (fd, 30) = statut; + } + WFIFOSET (fd, 34); + RFIFOSKIP (fd, 50); + break; + + case 0x7938: // Request for servers list and # of online players + login_log ("'ladmin': Sending of servers list (ip: %s)" + RETCODE, ip); + server_num = 0; + for (i = 0; i < MAX_SERVERS; i++) + { + if (server_fd[i] >= 0) + { + WFIFOL (fd, 4 + server_num * 32) = server[i].ip; + WFIFOW (fd, 4 + server_num * 32 + 4) = server[i].port; + memcpy (WFIFOP (fd, 4 + server_num * 32 + 6), + server[i].name, 20); + WFIFOW (fd, 4 + server_num * 32 + 26) = + server[i].users; + WFIFOW (fd, 4 + server_num * 32 + 28) = + server[i].maintenance; + WFIFOW (fd, 4 + server_num * 32 + 30) = server[i].new; + server_num++; + } + } + WFIFOW (fd, 0) = 0x7939; + WFIFOW (fd, 2) = 4 + 32 * server_num; + WFIFOSET (fd, 4 + 32 * server_num); + RFIFOSKIP (fd, 2); + break; + + case 0x793a: // Request to password check + if (RFIFOREST (fd) < 50) + return 0; + WFIFOW (fd, 0) = 0x793b; + WFIFOL (fd, 2) = -1; + account_name = RFIFOP (fd, 2); + account_name[23] = '\0'; + remove_control_chars (account_name); + i = search_account_index (account_name); + if (i != -1) + { + memcpy (WFIFOP (fd, 6), auth_dat[i].userid, 24); + if (strcmp (auth_dat[i].pass, RFIFOP (fd, 26)) == 0) + { + WFIFOL (fd, 2) = auth_dat[i].account_id; + login_log + ("'ladmin': Check of password OK (account: %s, password: %s, ip: %s)" + RETCODE, auth_dat[i].userid, auth_dat[i].pass, + ip); + } + else + { + char pass[24]; + memcpy (pass, RFIFOP (fd, 26), 24); + pass[23] = '\0'; + remove_control_chars (pass); + login_log + ("'ladmin': Failure of password check (account: %s, proposed pass: %s, ip: %s)" + RETCODE, auth_dat[i].userid, pass, ip); + } + } + else + { + memcpy (WFIFOP (fd, 6), account_name, 24); + login_log + ("'ladmin': Attempt to check the password of an unknown account (account: %s, ip: %s)" + RETCODE, account_name, ip); + } + WFIFOSET (fd, 30); + RFIFOSKIP (fd, 50); + break; + + case 0x793c: // Request to modify sex + if (RFIFOREST (fd) < 27) + return 0; + WFIFOW (fd, 0) = 0x793d; + WFIFOL (fd, 2) = -1; + account_name = RFIFOP (fd, 2); + account_name[23] = '\0'; + remove_control_chars (account_name); + memcpy (WFIFOP (fd, 6), account_name, 24); + { + char sex; + sex = RFIFOB (fd, 26); + if (sex != 'F' && sex != 'M') + { + if (sex > 31) + login_log + ("'ladmin': Attempt to give an invalid sex (account: %s, received sex: %c, ip: %s)" + RETCODE, account_name, sex, ip); + else + login_log + ("'ladmin': Attempt to give an invalid sex (account: %s, received sex: 'control char', ip: %s)" + RETCODE, account_name, ip); + } + else + { + i = search_account_index (account_name); + if (i != -1) + { + memcpy (WFIFOP (fd, 6), auth_dat[i].userid, 24); + if (auth_dat[i].sex != + ((sex == 'S' || sex == 's') ? 2 : (sex == 'M' + || sex == + 'm'))) + { + unsigned char buf[16]; + WFIFOL (fd, 2) = auth_dat[i].account_id; + for (j = 0; j < AUTH_FIFO_SIZE; j++) + if (auth_fifo[j].account_id == + auth_dat[i].account_id) + auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification) + auth_dat[i].sex = (sex == 'S' + || sex == + 's') ? 2 : (sex == 'M' + || sex == 'm'); + login_log + ("'ladmin': Modification of a sex (account: %s, new sex: %c, ip: %s)" + RETCODE, auth_dat[i].userid, sex, ip); + mmo_auth_sync (); + // send to all char-server the change + WBUFW (buf, 0) = 0x2723; + WBUFL (buf, 2) = auth_dat[i].account_id; + WBUFB (buf, 6) = auth_dat[i].sex; + charif_sendallwos (-1, buf, 7); + } + else + { + login_log + ("'ladmin': Modification of a sex, but the sex is already the good sex (account: %s, sex: %c, ip: %s)" + RETCODE, auth_dat[i].userid, sex, ip); + } + } + else + { + login_log + ("'ladmin': Attempt to modify the sex of an unknown account (account: %s, received sex: %c, ip: %s)" + RETCODE, account_name, sex, ip); + } + } + } + WFIFOSET (fd, 30); + RFIFOSKIP (fd, 27); + break; + + case 0x793e: // Request to modify GM level + if (RFIFOREST (fd) < 27) + return 0; + WFIFOW (fd, 0) = 0x793f; + WFIFOL (fd, 2) = -1; + account_name = RFIFOP (fd, 2); + account_name[23] = '\0'; + remove_control_chars (account_name); + memcpy (WFIFOP (fd, 6), account_name, 24); + { + char new_gm_level; + new_gm_level = RFIFOB (fd, 26); + if (new_gm_level < 0 || new_gm_level > 99) + { + login_log + ("'ladmin': Attempt to give an invalid GM level (account: %s, received GM level: %d, ip: %s)" + RETCODE, account_name, (int) new_gm_level, ip); + } + else + { + i = search_account_index (account_name); + if (i != -1) + { + int acc = auth_dat[i].account_id; + memcpy (WFIFOP (fd, 6), auth_dat[i].userid, 24); + if (isGM (acc) != new_gm_level) + { + // modification of the file + FILE *fp, *fp2; + int lock; + char line[512]; + int GM_account, GM_level; + int modify_flag; + char tmpstr[24]; + struct timeval tv; + if ((fp2 = + lock_fopen (GM_account_filename, + &lock)) != NULL) + { + if ((fp = + fopen_ (GM_account_filename, + "r")) != NULL) + { + gettimeofday (&tv, NULL); + strftime (tmpstr, 23, date_format, + gmtime (&(tv.tv_sec))); + modify_flag = 0; + // read/write GM file + while (fgets + (line, sizeof (line) - 1, fp)) + { + while (line[0] != '\0' + && (line[strlen (line) - 1] + == '\n' + || line[strlen (line) - + 1] == '\r')) + line[strlen (line) - 1] = + '\0'; + if ((line[0] == '/' + && line[1] == '/') + || line[0] == '\0') + fprintf (fp2, "%s" RETCODE, + line); + else + { + if (sscanf + (line, "%d %d", + &GM_account, + &GM_level) != 2 + && sscanf (line, "%d: %d", + &GM_account, + &GM_level) != + 2) + fprintf (fp2, + "%s" RETCODE, + line); + else if (GM_account != acc) + fprintf (fp2, + "%s" RETCODE, + line); + else if (new_gm_level < 1) + { + fprintf (fp2, + "// %s: 'ladmin' GM level removed on account %d '%s' (previous level: %d)" + RETCODE "//%d %d" + RETCODE, tmpstr, + acc, + auth_dat + [i].userid, + GM_level, acc, + new_gm_level); + modify_flag = 1; + } + else + { + fprintf (fp2, + "// %s: 'ladmin' GM level on account %d '%s' (previous level: %d)" + RETCODE "%d %d" + RETCODE, tmpstr, + acc, + auth_dat + [i].userid, + GM_level, acc, + new_gm_level); + modify_flag = 1; + } + } + } + if (modify_flag == 0) + fprintf (fp2, + "// %s: 'ladmin' GM level on account %d '%s' (previous level: 0)" + RETCODE "%d %d" RETCODE, + tmpstr, acc, + auth_dat[i].userid, acc, + new_gm_level); + fclose_ (fp); + } + else + { + login_log + ("'ladmin': Attempt to modify of a GM level - impossible to read GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" + RETCODE, auth_dat[i].userid, acc, + (int) new_gm_level, ip); + } + if (lock_fclose + (fp2, GM_account_filename, + &lock) == 0) + { + WFIFOL (fd, 2) = acc; + login_log + ("'ladmin': Modification of a GM level (account: %s (%d), new GM level: %d, ip: %s)" + RETCODE, auth_dat[i].userid, acc, + (int) new_gm_level, ip); + // read and send new GM informations + read_gm_account (); + send_GM_accounts (); + } + else + { + login_log + ("'ladmin': Attempt to modify of a GM level - impossible to write GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" + RETCODE, auth_dat[i].userid, acc, + (int) new_gm_level, ip); + } + } + else + { + login_log + ("'ladmin': Attempt to modify of a GM level - impossible to write GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" + RETCODE, auth_dat[i].userid, acc, + (int) new_gm_level, ip); + } + } + else + { + login_log + ("'ladmin': Attempt to modify of a GM level, but the GM level is already the good GM level (account: %s (%d), GM level: %d, ip: %s)" + RETCODE, auth_dat[i].userid, acc, + (int) new_gm_level, ip); + } + } + else + { + login_log + ("'ladmin': Attempt to modify the GM level of an unknown account (account: %s, received GM level: %d, ip: %s)" + RETCODE, account_name, (int) new_gm_level, + ip); + } + } + } + WFIFOSET (fd, 30); + RFIFOSKIP (fd, 27); + break; + + case 0x7940: // Request to modify e-mail + if (RFIFOREST (fd) < 66) + return 0; + WFIFOW (fd, 0) = 0x7941; + WFIFOL (fd, 2) = -1; + account_name = RFIFOP (fd, 2); + account_name[23] = '\0'; + remove_control_chars (account_name); + memcpy (WFIFOP (fd, 6), account_name, 24); + { + char email[40]; + memcpy (email, RFIFOP (fd, 26), 40); + if (e_mail_check (email) == 0) + { + login_log + ("'ladmin': Attempt to give an invalid e-mail (account: %s, ip: %s)" + RETCODE, account_name, ip); + } + else + { + remove_control_chars (email); + i = search_account_index (account_name); + if (i != -1) + { + memcpy (WFIFOP (fd, 6), auth_dat[i].userid, 24); + memcpy (auth_dat[i].email, email, 40); + WFIFOL (fd, 2) = auth_dat[i].account_id; + login_log + ("'ladmin': Modification of an email (account: %s, new e-mail: %s, ip: %s)" + RETCODE, auth_dat[i].userid, email, ip); + mmo_auth_sync (); + } + else + { + login_log + ("'ladmin': Attempt to modify the e-mail of an unknown account (account: %s, received e-mail: %s, ip: %s)" + RETCODE, account_name, email, ip); + } + } + } + WFIFOSET (fd, 30); + RFIFOSKIP (fd, 66); + break; + + case 0x7942: // Request to modify memo field + if (RFIFOREST (fd) < 28 + || RFIFOREST (fd) < (28 + RFIFOW (fd, 26))) + return 0; + WFIFOW (fd, 0) = 0x7943; + WFIFOL (fd, 2) = -1; + account_name = RFIFOP (fd, 2); + account_name[23] = '\0'; + remove_control_chars (account_name); + i = search_account_index (account_name); + if (i != -1) + { + int size_of_memo = sizeof (auth_dat[i].memo); + memcpy (WFIFOP (fd, 6), auth_dat[i].userid, 24); + memset (auth_dat[i].memo, '\0', size_of_memo); + if (RFIFOW (fd, 26) == 0) + { + strncpy (auth_dat[i].memo, "-", size_of_memo); + } + else if (RFIFOW (fd, 26) > size_of_memo - 1) + { + memcpy (auth_dat[i].memo, RFIFOP (fd, 28), + size_of_memo - 1); + } + else + { + memcpy (auth_dat[i].memo, RFIFOP (fd, 28), + RFIFOW (fd, 26)); + } + auth_dat[i].memo[size_of_memo - 1] = '\0'; + remove_control_chars (auth_dat[i].memo); + WFIFOL (fd, 2) = auth_dat[i].account_id; + login_log + ("'ladmin': Modification of a memo field (account: %s, new memo: %s, ip: %s)" + RETCODE, auth_dat[i].userid, auth_dat[i].memo, ip); + mmo_auth_sync (); + } + else + { + memcpy (WFIFOP (fd, 6), account_name, 24); + login_log + ("'ladmin': Attempt to modify the memo field of an unknown account (account: %s, ip: %s)" + RETCODE, account_name, ip); + } + WFIFOSET (fd, 30); + RFIFOSKIP (fd, 28 + RFIFOW (fd, 26)); + break; + + case 0x7944: // Request to found an account id + if (RFIFOREST (fd) < 26) + return 0; + WFIFOW (fd, 0) = 0x7945; + WFIFOL (fd, 2) = -1; + account_name = RFIFOP (fd, 2); + account_name[23] = '\0'; + remove_control_chars (account_name); + i = search_account_index (account_name); + if (i != -1) + { + memcpy (WFIFOP (fd, 6), auth_dat[i].userid, 24); + WFIFOL (fd, 2) = auth_dat[i].account_id; + login_log + ("'ladmin': Request (by the name) of an account id (account: %s, id: %d, ip: %s)" + RETCODE, auth_dat[i].userid, auth_dat[i].account_id, + ip); + } + else + { + memcpy (WFIFOP (fd, 6), account_name, 24); + login_log + ("'ladmin': ID request (by the name) of an unknown account (account: %s, ip: %s)" + RETCODE, account_name, ip); + } + WFIFOSET (fd, 30); + RFIFOSKIP (fd, 26); + break; + + case 0x7946: // Request to found an account name + if (RFIFOREST (fd) < 6) + return 0; + WFIFOW (fd, 0) = 0x7947; + WFIFOL (fd, 2) = RFIFOL (fd, 2); + memset (WFIFOP (fd, 6), '\0', 24); + for (i = 0; i < auth_num; i++) + { + if (auth_dat[i].account_id == RFIFOL (fd, 2)) + { + strncpy (WFIFOP (fd, 6), auth_dat[i].userid, 24); + login_log + ("'ladmin': Request (by id) of an account name (account: %s, id: %d, ip: %s)" + RETCODE, auth_dat[i].userid, RFIFOL (fd, 2), ip); break; + } } - - case 0x7930: // Request for an account creation - if (RFIFOREST(fd) < 91) - return 0; - { - struct mmo_account ma; - ma.userid = RFIFOP(fd, 2); - ma.passwd = RFIFOP(fd, 26); - memcpy(ma.lastlogin, "-", 2); - ma.sex = RFIFOB(fd,50); - WFIFOW(fd,0) = 0x7931; - WFIFOL(fd,2) = -1; - memcpy(WFIFOP(fd,6), RFIFOP(fd,2), 24); - if (strlen(ma.userid) > 23 || strlen(ma.passwd) > 23) { - login_log("'ladmin': Attempt to create an invalid account (account or pass is too long, ip: %s)" RETCODE, - ip); - } else if (strlen(ma.userid) < 4 || strlen(ma.passwd) < 4) { - login_log("'ladmin': Attempt to create an invalid account (account or pass is too short, ip: %s)" RETCODE, - ip); - } else if (ma.sex != 'F' && ma.sex != 'M') { - login_log("'ladmin': Attempt to create an invalid account (account: %s, received pass: %s, invalid sex, ip: %s)" RETCODE, - ma.userid, ma.passwd, ip); - } else if (account_id_count > END_ACCOUNT_NUM) { - login_log("'ladmin': Attempt to create an account, but there is no more available id number (account: %s, pass: %s, sex: %c, ip: %s)" RETCODE, - ma.userid, ma.passwd, ma.sex, ip); - } else { - remove_control_chars(ma.userid); - remove_control_chars(ma.passwd); - for(i = 0; i < auth_num; i++) { - if (strncmp(auth_dat[i].userid, ma.userid, 24) == 0) { - login_log("'ladmin': Attempt to create an already existing account (account: %s, pass: %s, received pass: %s, ip: %s)" RETCODE, - auth_dat[i].userid, auth_dat[i].pass, ma.passwd, ip); - break; - } - } - if (i == auth_num) { - int new_id; - char email[40]; - memcpy(email, RFIFOP(fd,51), 40); - email[39] = '\0'; - remove_control_chars(email); - new_id = mmo_auth_new(&ma, ma.sex, email); - login_log("'ladmin': Account creation (account: %s (id: %d), pass: %s, sex: %c, email: %s, ip: %s)" RETCODE, - ma.userid, new_id, ma.passwd, ma.sex, auth_dat[i].email, ip); - WFIFOL(fd,2) = new_id; - mmo_auth_sync(); - } - } - WFIFOSET(fd,30); - RFIFOSKIP(fd,91); - } - break; - - case 0x7932: // Request for an account deletion - if (RFIFOREST(fd) < 26) - return 0; - WFIFOW(fd,0) = 0x7933; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); - account_name[23] = '\0'; - remove_control_chars(account_name); - i = search_account_index(account_name); - if (i != -1) { - // Char-server is notified of deletion (for characters deletion). - unsigned char buf[65535]; - WBUFW(buf,0) = 0x2730; - WBUFL(buf,2) = auth_dat[i].account_id; - charif_sendallwos(-1, buf, 6); - // send answer - memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24); - WFIFOL(fd,2) = auth_dat[i].account_id; - // save deleted account in log file - login_log("'ladmin': Account deletion (account: %s, id: %d, ip: %s) - saved in next line:" RETCODE, - auth_dat[i].userid, auth_dat[i].account_id, ip); - mmo_auth_tostr(buf, &auth_dat[i]); - login_log("%s" RETCODE, buf); - // delete account - memset(auth_dat[i].userid, '\0', sizeof(auth_dat[i].userid)); - auth_dat[i].account_id = -1; - mmo_auth_sync(); - } else { - memcpy(WFIFOP(fd,6), account_name, 24); - login_log("'ladmin': Attempt to delete an unknown account (account: %s, ip: %s)" RETCODE, - account_name, ip); - } - WFIFOSET(fd,30); - RFIFOSKIP(fd,26); - break; - - case 0x7934: // Request to change a password - if (RFIFOREST(fd) < 50) - return 0; - WFIFOW(fd,0) = 0x7935; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); - account_name[23] = '\0'; - remove_control_chars(account_name); - i = search_account_index(account_name); - if (i != -1) { - memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24); - memcpy(auth_dat[i].pass, RFIFOP(fd,26), 24); - auth_dat[i].pass[23] = '\0'; - remove_control_chars(auth_dat[i].pass); - WFIFOL(fd,2) = auth_dat[i].account_id; - login_log("'ladmin': Modification of a password (account: %s, new password: %s, ip: %s)" RETCODE, - auth_dat[i].userid, auth_dat[i].pass, ip); - mmo_auth_sync(); - } else { - memcpy(WFIFOP(fd,6), account_name, 24); - login_log("'ladmin': Attempt to modify the password of an unknown account (account: %s, ip: %s)" RETCODE, - account_name, ip); - } - WFIFOSET(fd,30); - RFIFOSKIP(fd,50); - break; - - case 0x7936: // Request to modify a state - if (RFIFOREST(fd) < 50) - return 0; - { - char error_message[20]; - int statut; - WFIFOW(fd,0) = 0x7937; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); - account_name[23] = '\0'; - remove_control_chars(account_name); - statut = RFIFOL(fd,26); - memcpy(error_message, RFIFOP(fd,30), 20); - error_message[19] = '\0'; - remove_control_chars(error_message); - if (statut != 7 || error_message[0] == '\0') { // 7: // 6 = Your are Prohibited to log in until %s - strcpy(error_message, "-"); - } - i = search_account_index(account_name); - if (i != -1) { - memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24); - WFIFOL(fd,2) = auth_dat[i].account_id; - if (auth_dat[i].state == statut && strcmp(auth_dat[i].error_message, error_message) == 0) - login_log("'ladmin': Modification of a state, but the state of the account is already the good state (account: %s, received state: %d, ip: %s)" RETCODE, - account_name, statut, ip); - else { - if (statut == 7) - login_log("'ladmin': Modification of a state (account: %s, new state: %d - prohibited to login until '%s', ip: %s)" RETCODE, - auth_dat[i].userid, statut, error_message, ip); - else - login_log("'ladmin': Modification of a state (account: %s, new state: %d, ip: %s)" RETCODE, - auth_dat[i].userid, statut, ip); - if (auth_dat[i].state == 0) { - unsigned char buf[16]; - WBUFW(buf,0) = 0x2731; - WBUFL(buf,2) = auth_dat[i].account_id; - WBUFB(buf,6) = 0; // 0: change of statut, 1: ban - WBUFL(buf,7) = statut; // status or final date of a banishment - charif_sendallwos(-1, buf, 11); - for(j = 0; j < AUTH_FIFO_SIZE; j++) - if (auth_fifo[j].account_id == auth_dat[i].account_id) - auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification) - } - auth_dat[i].state = statut; - memcpy(auth_dat[i].error_message, error_message, 20); - mmo_auth_sync(); - } - } else { - memcpy(WFIFOP(fd,6), account_name, 24); - login_log("'ladmin': Attempt to modify the state of an unknown account (account: %s, received state: %d, ip: %s)" RETCODE, - account_name, statut, ip); - } - WFIFOL(fd,30) = statut; - } - WFIFOSET(fd,34); - RFIFOSKIP(fd,50); - break; - - case 0x7938: // Request for servers list and # of online players - login_log("'ladmin': Sending of servers list (ip: %s)" RETCODE, ip); - server_num = 0; - for(i = 0; i < MAX_SERVERS; i++) { - if (server_fd[i] >= 0) { - WFIFOL(fd,4+server_num*32) = server[i].ip; - WFIFOW(fd,4+server_num*32+4) = server[i].port; - memcpy(WFIFOP(fd,4+server_num*32+6), server[i].name, 20); - WFIFOW(fd,4+server_num*32+26) = server[i].users; - WFIFOW(fd,4+server_num*32+28) = server[i].maintenance; - WFIFOW(fd,4+server_num*32+30) = server[i].new; - server_num++; - } - } - WFIFOW(fd,0) = 0x7939; - WFIFOW(fd,2) = 4 + 32 * server_num; - WFIFOSET(fd,4+32*server_num); - RFIFOSKIP(fd,2); - break; - - case 0x793a: // Request to password check - if (RFIFOREST(fd) < 50) - return 0; - WFIFOW(fd,0) = 0x793b; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); - account_name[23] = '\0'; - remove_control_chars(account_name); - i = search_account_index(account_name); - if (i != -1) { - memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24); - if (strcmp(auth_dat[i].pass, RFIFOP(fd,26)) == 0) { - WFIFOL(fd,2) = auth_dat[i].account_id; - login_log("'ladmin': Check of password OK (account: %s, password: %s, ip: %s)" RETCODE, - auth_dat[i].userid, auth_dat[i].pass, ip); - } else { - char pass[24]; - memcpy(pass, RFIFOP(fd,26), 24); - pass[23] = '\0'; - remove_control_chars(pass); - login_log("'ladmin': Failure of password check (account: %s, proposed pass: %s, ip: %s)" RETCODE, - auth_dat[i].userid, pass, ip); - } - } else { - memcpy(WFIFOP(fd,6), account_name, 24); - login_log("'ladmin': Attempt to check the password of an unknown account (account: %s, ip: %s)" RETCODE, - account_name, ip); - } - WFIFOSET(fd,30); - RFIFOSKIP(fd,50); - break; - - case 0x793c: // Request to modify sex - if (RFIFOREST(fd) < 27) - return 0; - WFIFOW(fd,0) = 0x793d; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); - account_name[23] = '\0'; - remove_control_chars(account_name); - memcpy(WFIFOP(fd,6), account_name, 24); - { - char sex; - sex = RFIFOB(fd,26); - if (sex != 'F' && sex != 'M') { - if (sex > 31) - login_log("'ladmin': Attempt to give an invalid sex (account: %s, received sex: %c, ip: %s)" RETCODE, - account_name, sex, ip); - else - login_log("'ladmin': Attempt to give an invalid sex (account: %s, received sex: 'control char', ip: %s)" RETCODE, - account_name, ip); - } else { - i = search_account_index(account_name); - if (i != -1) { - memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24); - if (auth_dat[i].sex != ((sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm'))) { - unsigned char buf[16]; - WFIFOL(fd,2) = auth_dat[i].account_id; - for(j = 0; j < AUTH_FIFO_SIZE; j++) - if (auth_fifo[j].account_id == auth_dat[i].account_id) - auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification) - auth_dat[i].sex = (sex == 'S' || sex == 's') ? 2 : (sex == 'M' || sex == 'm'); - login_log("'ladmin': Modification of a sex (account: %s, new sex: %c, ip: %s)" RETCODE, - auth_dat[i].userid, sex, ip); - mmo_auth_sync(); - // send to all char-server the change - WBUFW(buf,0) = 0x2723; - WBUFL(buf,2) = auth_dat[i].account_id; - WBUFB(buf,6) = auth_dat[i].sex; - charif_sendallwos(-1, buf, 7); - } else { - login_log("'ladmin': Modification of a sex, but the sex is already the good sex (account: %s, sex: %c, ip: %s)" RETCODE, - auth_dat[i].userid, sex, ip); - } - } else { - login_log("'ladmin': Attempt to modify the sex of an unknown account (account: %s, received sex: %c, ip: %s)" RETCODE, - account_name, sex, ip); - } - } - } - WFIFOSET(fd,30); - RFIFOSKIP(fd,27); - break; - - case 0x793e: // Request to modify GM level - if (RFIFOREST(fd) < 27) - return 0; - WFIFOW(fd,0) = 0x793f; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); - account_name[23] = '\0'; - remove_control_chars(account_name); - memcpy(WFIFOP(fd,6), account_name, 24); - { - char new_gm_level; - new_gm_level = RFIFOB(fd,26); - if (new_gm_level < 0 || new_gm_level > 99) { - login_log("'ladmin': Attempt to give an invalid GM level (account: %s, received GM level: %d, ip: %s)" RETCODE, - account_name, (int)new_gm_level, ip); - } else { - i = search_account_index(account_name); - if (i != -1) { - int acc = auth_dat[i].account_id; - memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24); - if (isGM(acc) != new_gm_level) { - // modification of the file - FILE *fp, *fp2; - int lock; - char line[512]; - int GM_account, GM_level; - int modify_flag; - char tmpstr[24]; - struct timeval tv; - if ((fp2 = lock_fopen(GM_account_filename, &lock)) != NULL) { - if ((fp = fopen_(GM_account_filename, "r")) != NULL) { - gettimeofday(&tv, NULL); - strftime(tmpstr, 23, date_format, gmtime(&(tv.tv_sec))); - modify_flag = 0; - // read/write GM file - while(fgets(line, sizeof(line)-1, fp)) { - while(line[0] != '\0' && (line[strlen(line)-1] == '\n' || line[strlen(line)-1] == '\r')) - line[strlen(line)-1] = '\0'; - if ((line[0] == '/' && line[1] == '/') || line[0] == '\0') - fprintf(fp2, "%s" RETCODE, line); - else { - if (sscanf(line, "%d %d", &GM_account, &GM_level) != 2 && sscanf(line, "%d: %d", &GM_account, &GM_level) != 2) - fprintf(fp2, "%s" RETCODE, line); - else if (GM_account != acc) - fprintf(fp2, "%s" RETCODE, line); - else if (new_gm_level < 1) { - fprintf(fp2, "// %s: 'ladmin' GM level removed on account %d '%s' (previous level: %d)" RETCODE "//%d %d" RETCODE, tmpstr, acc, auth_dat[i].userid, GM_level, acc, new_gm_level); - modify_flag = 1; - } else { - fprintf(fp2, "// %s: 'ladmin' GM level on account %d '%s' (previous level: %d)" RETCODE "%d %d" RETCODE, tmpstr, acc, auth_dat[i].userid, GM_level, acc, new_gm_level); - modify_flag = 1; - } - } - } - if (modify_flag == 0) - fprintf(fp2, "// %s: 'ladmin' GM level on account %d '%s' (previous level: 0)" RETCODE "%d %d" RETCODE, tmpstr, acc, auth_dat[i].userid, acc, new_gm_level); - fclose_(fp); - } else { - login_log("'ladmin': Attempt to modify of a GM level - impossible to read GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" RETCODE, - auth_dat[i].userid, acc, (int)new_gm_level, ip); - } - if (lock_fclose(fp2, GM_account_filename, &lock) == 0) { - WFIFOL(fd,2) = acc; - login_log("'ladmin': Modification of a GM level (account: %s (%d), new GM level: %d, ip: %s)" RETCODE, - auth_dat[i].userid, acc, (int)new_gm_level, ip); - // read and send new GM informations - read_gm_account(); - send_GM_accounts(); - } else { - login_log("'ladmin': Attempt to modify of a GM level - impossible to write GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" RETCODE, - auth_dat[i].userid, acc, (int)new_gm_level, ip); - } - } else { - login_log("'ladmin': Attempt to modify of a GM level - impossible to write GM accounts file (account: %s (%d), received GM level: %d, ip: %s)" RETCODE, - auth_dat[i].userid, acc, (int)new_gm_level, ip); - } - } else { - login_log("'ladmin': Attempt to modify of a GM level, but the GM level is already the good GM level (account: %s (%d), GM level: %d, ip: %s)" RETCODE, - auth_dat[i].userid, acc, (int)new_gm_level, ip); - } - } else { - login_log("'ladmin': Attempt to modify the GM level of an unknown account (account: %s, received GM level: %d, ip: %s)" RETCODE, - account_name, (int)new_gm_level, ip); - } - } - } - WFIFOSET(fd,30); - RFIFOSKIP(fd,27); - break; - - case 0x7940: // Request to modify e-mail - if (RFIFOREST(fd) < 66) - return 0; - WFIFOW(fd,0) = 0x7941; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); - account_name[23] = '\0'; - remove_control_chars(account_name); - memcpy(WFIFOP(fd,6), account_name, 24); - { - char email[40]; - memcpy(email, RFIFOP(fd,26), 40); - if (e_mail_check(email) == 0) { - login_log("'ladmin': Attempt to give an invalid e-mail (account: %s, ip: %s)" RETCODE, - account_name, ip); - } else { - remove_control_chars(email); - i = search_account_index(account_name); - if (i != -1) { - memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24); - memcpy(auth_dat[i].email, email, 40); - WFIFOL(fd,2) = auth_dat[i].account_id; - login_log("'ladmin': Modification of an email (account: %s, new e-mail: %s, ip: %s)" RETCODE, - auth_dat[i].userid, email, ip); - mmo_auth_sync(); - } else { - login_log("'ladmin': Attempt to modify the e-mail of an unknown account (account: %s, received e-mail: %s, ip: %s)" RETCODE, - account_name, email, ip); - } - } - } - WFIFOSET(fd,30); - RFIFOSKIP(fd,66); - break; - - case 0x7942: // Request to modify memo field - if (RFIFOREST(fd) < 28 || RFIFOREST(fd) < (28 + RFIFOW(fd,26))) - return 0; - WFIFOW(fd,0) = 0x7943; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); - account_name[23] = '\0'; - remove_control_chars(account_name); - i = search_account_index(account_name); - if (i != -1) { - int size_of_memo = sizeof(auth_dat[i].memo); - memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24); - memset(auth_dat[i].memo, '\0', size_of_memo); - if (RFIFOW(fd,26) == 0) { - strncpy(auth_dat[i].memo, "-", size_of_memo); - } else if (RFIFOW(fd,26) > size_of_memo - 1) { - memcpy(auth_dat[i].memo, RFIFOP(fd,28), size_of_memo - 1); - } else { - memcpy(auth_dat[i].memo, RFIFOP(fd,28), RFIFOW(fd,26)); - } - auth_dat[i].memo[size_of_memo - 1] = '\0'; - remove_control_chars(auth_dat[i].memo); - WFIFOL(fd,2) = auth_dat[i].account_id; - login_log("'ladmin': Modification of a memo field (account: %s, new memo: %s, ip: %s)" RETCODE, - auth_dat[i].userid, auth_dat[i].memo, ip); - mmo_auth_sync(); - } else { - memcpy(WFIFOP(fd,6), account_name, 24); - login_log("'ladmin': Attempt to modify the memo field of an unknown account (account: %s, ip: %s)" RETCODE, - account_name, ip); - } - WFIFOSET(fd,30); - RFIFOSKIP(fd,28 + RFIFOW(fd,26)); - break; - - case 0x7944: // Request to found an account id - if (RFIFOREST(fd) < 26) - return 0; - WFIFOW(fd,0) = 0x7945; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); - account_name[23] = '\0'; - remove_control_chars(account_name); - i = search_account_index(account_name); - if (i != -1) { - memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24); - WFIFOL(fd,2) = auth_dat[i].account_id; - login_log("'ladmin': Request (by the name) of an account id (account: %s, id: %d, ip: %s)" RETCODE, - auth_dat[i].userid, auth_dat[i].account_id, ip); - } else { - memcpy(WFIFOP(fd,6), account_name, 24); - login_log("'ladmin': ID request (by the name) of an unknown account (account: %s, ip: %s)" RETCODE, - account_name, ip); - } - WFIFOSET(fd,30); - RFIFOSKIP(fd,26); - break; - - case 0x7946: // Request to found an account name - if (RFIFOREST(fd) < 6) - return 0; - WFIFOW(fd,0) = 0x7947; - WFIFOL(fd,2) = RFIFOL(fd,2); - memset(WFIFOP(fd,6), '\0', 24); - for(i = 0; i < auth_num; i++) { - if (auth_dat[i].account_id == RFIFOL(fd,2)) { - strncpy(WFIFOP(fd,6), auth_dat[i].userid, 24); - login_log("'ladmin': Request (by id) of an account name (account: %s, id: %d, ip: %s)" RETCODE, - auth_dat[i].userid, RFIFOL(fd,2), ip); - break; - } - } - if (i == auth_num) { - login_log("'ladmin': Name request (by id) of an unknown account (id: %d, ip: %s)" RETCODE, - RFIFOL(fd,2), ip); - strncpy(WFIFOP(fd,6), "", 24); - } - WFIFOSET(fd,30); - RFIFOSKIP(fd,6); - break; - - case 0x7948: // Request to change the validity limit (timestamp) (absolute value) - if (RFIFOREST(fd) < 30) - return 0; - { - time_t timestamp; - char tmpstr[2048]; - WFIFOW(fd,0) = 0x7949; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); - account_name[23] = '\0'; - remove_control_chars(account_name); - timestamp = (time_t)RFIFOL(fd,26); - strftime(tmpstr, 24, date_format, gmtime(×tamp)); - i = search_account_index(account_name); - if (i != -1) { - memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24); - login_log("'ladmin': Change of a validity limit (account: %s, new validity: %d (%s), ip: %s)" RETCODE, - auth_dat[i].userid, timestamp, (timestamp == 0 ? "unlimited" : tmpstr), ip); - auth_dat[i].connect_until_time = timestamp; - WFIFOL(fd,2) = auth_dat[i].account_id; - mmo_auth_sync(); - } else { - memcpy(WFIFOP(fd,6), account_name, 24); - login_log("'ladmin': Attempt to change the validity limit of an unknown account (account: %s, received validity: %d (%s), ip: %s)" RETCODE, - account_name, timestamp, (timestamp == 0 ? "unlimited" : tmpstr), ip); - } - WFIFOL(fd,30) = timestamp; - } - WFIFOSET(fd,34); - RFIFOSKIP(fd,30); - break; - - case 0x794a: // Request to change the final date of a banishment (timestamp) (absolute value) - if (RFIFOREST(fd) < 30) - return 0; - { - time_t timestamp; - char tmpstr[2048]; - WFIFOW(fd,0) = 0x794b; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); - account_name[23] = '\0'; - remove_control_chars(account_name); - timestamp = (time_t)RFIFOL(fd,26); - if (timestamp <= time(NULL)) - timestamp = 0; - strftime(tmpstr, 24, date_format, gmtime(×tamp)); - i = search_account_index(account_name); - if (i != -1) { - memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24); - WFIFOL(fd,2) = auth_dat[i].account_id; - login_log("'ladmin': Change of the final date of a banishment (account: %s, new final date of banishment: %d (%s), ip: %s)" RETCODE, - auth_dat[i].userid, timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip); - if (auth_dat[i].ban_until_time != timestamp) { - if (timestamp != 0) { - unsigned char buf[16]; - WBUFW(buf,0) = 0x2731; - WBUFL(buf,2) = auth_dat[i].account_id; - WBUFB(buf,6) = 1; // 0: change of statut, 1: ban - WBUFL(buf,7) = timestamp; // status or final date of a banishment - charif_sendallwos(-1, buf, 11); - for(j = 0; j < AUTH_FIFO_SIZE; j++) - if (auth_fifo[j].account_id == auth_dat[i].account_id) - auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification) - } - auth_dat[i].ban_until_time = timestamp; - mmo_auth_sync(); - } - } else { - memcpy(WFIFOP(fd,6), account_name, 24); - login_log("'ladmin': Attempt to change the final date of a banishment of an unknown account (account: %s, received final date of banishment: %d (%s), ip: %s)" RETCODE, - account_name, timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip); - } - WFIFOL(fd,30) = timestamp; - } - WFIFOSET(fd,34); - RFIFOSKIP(fd,30); - break; - - case 0x794c: // Request to change the final date of a banishment (timestamp) (relative change) - if (RFIFOREST(fd) < 38) - return 0; - { - time_t timestamp; - struct tm *tmtime; - char tmpstr[2048]; - WFIFOW(fd,0) = 0x794d; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); - account_name[23] = '\0'; - remove_control_chars(account_name); - i = search_account_index(account_name); - if (i != -1) { - WFIFOL(fd,2) = auth_dat[i].account_id; - memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24); - if (auth_dat[i].ban_until_time == 0 || auth_dat[i].ban_until_time < time(NULL)) - timestamp = time(NULL); - else - timestamp = auth_dat[i].ban_until_time; - tmtime = gmtime(×tamp); - tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,26); - tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,28); - tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,30); - tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,32); - tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,34); - tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,36); - timestamp = mktime(tmtime); - if (timestamp != -1) { - if (timestamp <= time(NULL)) - timestamp = 0; - strftime(tmpstr, 24, date_format, gmtime(×tamp)); - login_log("'ladmin': Adjustment of a final date of a banishment (account: %s, (%+d y %+d m %+d d %+d h %+d mn %+d s) -> new validity: %d (%s), ip: %s)" RETCODE, - auth_dat[i].userid, (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), timestamp, (timestamp == 0 ? "no banishment" : tmpstr), ip); - if (auth_dat[i].ban_until_time != timestamp) { - if (timestamp != 0) { - unsigned char buf[16]; - WBUFW(buf,0) = 0x2731; - WBUFL(buf,2) = auth_dat[i].account_id; - WBUFB(buf,6) = 1; // 0: change of statut, 1: ban - WBUFL(buf,7) = timestamp; // status or final date of a banishment - charif_sendallwos(-1, buf, 11); - for(j = 0; j < AUTH_FIFO_SIZE; j++) - if (auth_fifo[j].account_id == auth_dat[i].account_id) - auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification) - } - auth_dat[i].ban_until_time = timestamp; - mmo_auth_sync(); - } - } else { - strftime(tmpstr, 24, date_format, gmtime(&auth_dat[i].ban_until_time)); - login_log("'ladmin': Impossible to adjust the final date of a banishment (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> ???, ip: %s)" RETCODE, - auth_dat[i].userid, auth_dat[i].ban_until_time, (auth_dat[i].ban_until_time == 0 ? "no banishment" : tmpstr), (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), ip); - } - WFIFOL(fd,30) = (unsigned long)auth_dat[i].ban_until_time; - } else { - memcpy(WFIFOP(fd,6), account_name, 24); - login_log("'ladmin': Attempt to adjust the final date of a banishment of an unknown account (account: %s, ip: %s)" RETCODE, - account_name, ip); - WFIFOL(fd,30) = 0; - } - } - WFIFOSET(fd,34); - RFIFOSKIP(fd,38); - break; - - case 0x794e: // Request to send a broadcast message - if (RFIFOREST(fd) < 8 || RFIFOREST(fd) < (8 + RFIFOL(fd,4))) - return 0; - WFIFOW(fd,0) = 0x794f; - WFIFOW(fd,2) = -1; - if (RFIFOL(fd,4) < 1) { - login_log("'ladmin': Receiving a message for broadcast, but message is void (ip: %s)" RETCODE, - ip); - } else { - // at least 1 char-server - for(i = 0; i < MAX_SERVERS; i++) - if (server_fd[i] >= 0) - break; - if (i == MAX_SERVERS) { - login_log("'ladmin': Receiving a message for broadcast, but no char-server is online (ip: %s)" RETCODE, - ip); - } else { - char buf[32000]; - char message[32000]; - WFIFOW(fd,2) = 0; - memset(message, '\0', sizeof(message)); - memcpy(message, RFIFOP(fd,8), RFIFOL(fd,4)); - message[sizeof(message)-1] = '\0'; - remove_control_chars(message); - if (RFIFOW(fd,2) == 0) - login_log("'ladmin': Receiving a message for broadcast (message (in yellow): %s, ip: %s)" RETCODE, - message, ip); - else - login_log("'ladmin': Receiving a message for broadcast (message (in blue): %s, ip: %s)" RETCODE, - message, ip); - // send same message to all char-servers (no answer) - memcpy(WBUFP(buf,0), RFIFOP(fd,0), 8 + RFIFOL(fd,4)); - WBUFW(buf,0) = 0x2726; - charif_sendallwos(-1, buf, 8 + RFIFOL(fd,4)); - } - } - WFIFOSET(fd,4); - RFIFOSKIP(fd,8 + RFIFOL(fd,4)); - break; - - case 0x7950: // Request to change the validity limite (timestamp) (relative change) - if (RFIFOREST(fd) < 38) - return 0; - { - time_t timestamp; - struct tm *tmtime; - char tmpstr[2048]; - char tmpstr2[2048]; - WFIFOW(fd,0) = 0x7951; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); - account_name[23] = '\0'; - remove_control_chars(account_name); - i = search_account_index(account_name); - if (i != -1) { - WFIFOL(fd,2) = auth_dat[i].account_id; - memcpy(WFIFOP(fd,6), auth_dat[i].userid, 24); - timestamp = auth_dat[i].connect_until_time; - if (add_to_unlimited_account == 0 && timestamp == 0) { - login_log("'ladmin': Attempt to adjust the validity limit of an unlimited account (account: %s, ip: %s)" RETCODE, - auth_dat[i].userid, ip); - WFIFOL(fd,30) = 0; - } else { - if (timestamp == 0 || timestamp < time(NULL)) - timestamp = time(NULL); - tmtime = gmtime(×tamp); - tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,26); - tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,28); - tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,30); - tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,32); - tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,34); - tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,36); - timestamp = mktime(tmtime); - if (timestamp != -1) { - strftime(tmpstr, 24, date_format, gmtime(&auth_dat[i].connect_until_time)); - strftime(tmpstr2, 24, date_format, gmtime(×tamp)); - login_log("'ladmin': Adjustment of a validity limit (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> new validity: %d (%s), ip: %s)" RETCODE, - auth_dat[i].userid, auth_dat[i].connect_until_time, (auth_dat[i].connect_until_time == 0 ? "unlimited" : tmpstr), (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), timestamp, (timestamp == 0 ? "unlimited" : tmpstr2), ip); - auth_dat[i].connect_until_time = timestamp; - mmo_auth_sync(); - WFIFOL(fd,30) = (unsigned long)auth_dat[i].connect_until_time; - } else { - strftime(tmpstr, 24, date_format, gmtime(&auth_dat[i].connect_until_time)); - login_log("'ladmin': Impossible to adjust a validity limit (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> ???, ip: %s)" RETCODE, - auth_dat[i].userid, auth_dat[i].connect_until_time, (auth_dat[i].connect_until_time == 0 ? "unlimited" : tmpstr), (short)RFIFOW(fd,26), (short)RFIFOW(fd,28), (short)RFIFOW(fd,30), (short)RFIFOW(fd,32), (short)RFIFOW(fd,34), (short)RFIFOW(fd,36), ip); - WFIFOL(fd,30) = 0; - } - } - } else { - memcpy(WFIFOP(fd,6), account_name, 24); - login_log("'ladmin': Attempt to adjust the validity limit of an unknown account (account: %s, ip: %s)" RETCODE, - account_name, ip); - WFIFOL(fd,30) = 0; - } - } - WFIFOSET(fd,34); - RFIFOSKIP(fd,38); - break; - - case 0x7952: // Request about informations of an account (by account name) - if (RFIFOREST(fd) < 26) - return 0; - WFIFOW(fd,0) = 0x7953; - WFIFOL(fd,2) = -1; - account_name = RFIFOP(fd,2); - account_name[23] = '\0'; - remove_control_chars(account_name); - i = search_account_index(account_name); - if (i != -1) { - WFIFOL(fd,2) = auth_dat[i].account_id; - WFIFOB(fd,6) = (unsigned char)isGM(auth_dat[i].account_id); - memcpy(WFIFOP(fd,7), auth_dat[i].userid, 24); - WFIFOB(fd,31) = auth_dat[i].sex; - WFIFOL(fd,32) = auth_dat[i].logincount; - WFIFOL(fd,36) = auth_dat[i].state; - memcpy(WFIFOP(fd,40), auth_dat[i].error_message, 20); - memcpy(WFIFOP(fd,60), auth_dat[i].lastlogin, 24); - memcpy(WFIFOP(fd,84), auth_dat[i].last_ip, 16); - memcpy(WFIFOP(fd,100), auth_dat[i].email, 40); - WFIFOL(fd,140) = (unsigned long)auth_dat[i].connect_until_time; - WFIFOL(fd,144) = (unsigned long)auth_dat[i].ban_until_time; - WFIFOW(fd,148) = strlen(auth_dat[i].memo); - if (auth_dat[i].memo[0]) { - memcpy(WFIFOP(fd,150), auth_dat[i].memo, strlen(auth_dat[i].memo)); - } - login_log("'ladmin': Sending information of an account (request by the name; account: %s, id: %d, ip: %s)" RETCODE, - auth_dat[i].userid, auth_dat[i].account_id, ip); - WFIFOSET(fd,150+strlen(auth_dat[i].memo)); - } else { - memcpy(WFIFOP(fd,7), account_name, 24); - WFIFOW(fd,148) = 0; - login_log("'ladmin': Attempt to obtain information (by the name) of an unknown account (account: %s, ip: %s)" RETCODE, - account_name, ip); - WFIFOSET(fd,150); - } - RFIFOSKIP(fd,26); - break; - - case 0x7954: // Request about information of an account (by account id) - if (RFIFOREST(fd) < 6) - return 0; - WFIFOW(fd,0) = 0x7953; - WFIFOL(fd,2) = RFIFOL(fd,2); - memset(WFIFOP(fd,7), '\0', 24); - for(i = 0; i < auth_num; i++) { - if (auth_dat[i].account_id == RFIFOL(fd,2)) { - login_log("'ladmin': Sending information of an account (request by the id; account: %s, id: %d, ip: %s)" RETCODE, - auth_dat[i].userid, RFIFOL(fd,2), ip); - WFIFOB(fd,6) = (unsigned char)isGM(auth_dat[i].account_id); - memcpy(WFIFOP(fd,7), auth_dat[i].userid, 24); - WFIFOB(fd,31) = auth_dat[i].sex; - WFIFOL(fd,32) = auth_dat[i].logincount; - WFIFOL(fd,36) = auth_dat[i].state; - memcpy(WFIFOP(fd,40), auth_dat[i].error_message, 20); - memcpy(WFIFOP(fd,60), auth_dat[i].lastlogin, 24); - memcpy(WFIFOP(fd,84), auth_dat[i].last_ip, 16); - memcpy(WFIFOP(fd,100), auth_dat[i].email, 40); - WFIFOL(fd,140) = (unsigned long)auth_dat[i].connect_until_time; - WFIFOL(fd,144) = (unsigned long)auth_dat[i].ban_until_time; - WFIFOW(fd,148) = strlen(auth_dat[i].memo); - if (auth_dat[i].memo[0]) { - memcpy(WFIFOP(fd,150), auth_dat[i].memo, strlen(auth_dat[i].memo)); - } - WFIFOSET(fd,150+strlen(auth_dat[i].memo)); - break; - } - } - if (i == auth_num) { - login_log("'ladmin': Attempt to obtain information (by the id) of an unknown account (id: %d, ip: %s)" RETCODE, - RFIFOL(fd,2), ip); - strncpy(WFIFOP(fd,7), "", 24); - WFIFOW(fd,148) = 0; - WFIFOSET(fd,150); - } - RFIFOSKIP(fd,6); - break; - - case 0x7955: // Request to reload GM file (no answer) - login_log("'ladmin': Request to re-load GM configuration file (ip: %s)." RETCODE, ip); - read_gm_account(); - // send GM accounts to all char-servers - send_GM_accounts(); - RFIFOSKIP(fd,2); - break; - - default: - { - FILE *logfp; - char tmpstr[24]; - struct timeval tv; - logfp = fopen_(login_log_unknown_packets_filename, "a"); - if (logfp) { - gettimeofday(&tv, NULL); - strftime(tmpstr, 23, date_format, gmtime(&(tv.tv_sec))); - fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000); - fprintf(logfp, "parse_admin: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd)); - fprintf(logfp, "Detail (in hex):" RETCODE); - fprintf(logfp, "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" RETCODE); - memset(tmpstr, '\0', sizeof(tmpstr)); - for(i = 0; i < RFIFOREST(fd); i++) { - if ((i & 15) == 0) - fprintf(logfp, "%04X ",i); - fprintf(logfp, "%02x ", RFIFOB(fd,i)); - if (RFIFOB(fd,i) > 0x1f) - tmpstr[i % 16] = RFIFOB(fd,i); - else - tmpstr[i % 16] = '.'; - if ((i - 7) % 16 == 0) // -8 + 1 - fprintf(logfp, " "); - else if ((i + 1) % 16 == 0) { - fprintf(logfp, " %s" RETCODE, tmpstr); - memset(tmpstr, '\0', sizeof(tmpstr)); - } - } - if (i % 16 != 0) { - for(j = i; j % 16 != 0; j++) { - fprintf(logfp, " "); - if ((j - 7) % 16 == 0) // -8 + 1 - fprintf(logfp, " "); - } - fprintf(logfp, " %s" RETCODE, tmpstr); - } - fprintf(logfp, RETCODE); - fclose_(logfp); - } - } - login_log("'ladmin': End of connection, unknown packet (ip: %s)" RETCODE, ip); - session[fd]->eof = 1; - printf("Remote administration has been disconnected (unknown packet).\n"); - return 0; - } - //WFIFOW(fd,0) = 0x791f; - //WFIFOSET(fd,2); - } - return 0; + if (i == auth_num) + { + login_log + ("'ladmin': Name request (by id) of an unknown account (id: %d, ip: %s)" + RETCODE, RFIFOL (fd, 2), ip); + strncpy (WFIFOP (fd, 6), "", 24); + } + WFIFOSET (fd, 30); + RFIFOSKIP (fd, 6); + break; + + case 0x7948: // Request to change the validity limit (timestamp) (absolute value) + if (RFIFOREST (fd) < 30) + return 0; + { + time_t timestamp; + char tmpstr[2048]; + WFIFOW (fd, 0) = 0x7949; + WFIFOL (fd, 2) = -1; + account_name = RFIFOP (fd, 2); + account_name[23] = '\0'; + remove_control_chars (account_name); + timestamp = (time_t) RFIFOL (fd, 26); + strftime (tmpstr, 24, date_format, gmtime (×tamp)); + i = search_account_index (account_name); + if (i != -1) + { + memcpy (WFIFOP (fd, 6), auth_dat[i].userid, 24); + login_log + ("'ladmin': Change of a validity limit (account: %s, new validity: %d (%s), ip: %s)" + RETCODE, auth_dat[i].userid, timestamp, + (timestamp == 0 ? "unlimited" : tmpstr), ip); + auth_dat[i].connect_until_time = timestamp; + WFIFOL (fd, 2) = auth_dat[i].account_id; + mmo_auth_sync (); + } + else + { + memcpy (WFIFOP (fd, 6), account_name, 24); + login_log + ("'ladmin': Attempt to change the validity limit of an unknown account (account: %s, received validity: %d (%s), ip: %s)" + RETCODE, account_name, timestamp, + (timestamp == 0 ? "unlimited" : tmpstr), ip); + } + WFIFOL (fd, 30) = timestamp; + } + WFIFOSET (fd, 34); + RFIFOSKIP (fd, 30); + break; + + case 0x794a: // Request to change the final date of a banishment (timestamp) (absolute value) + if (RFIFOREST (fd) < 30) + return 0; + { + time_t timestamp; + char tmpstr[2048]; + WFIFOW (fd, 0) = 0x794b; + WFIFOL (fd, 2) = -1; + account_name = RFIFOP (fd, 2); + account_name[23] = '\0'; + remove_control_chars (account_name); + timestamp = (time_t) RFIFOL (fd, 26); + if (timestamp <= time (NULL)) + timestamp = 0; + strftime (tmpstr, 24, date_format, gmtime (×tamp)); + i = search_account_index (account_name); + if (i != -1) + { + memcpy (WFIFOP (fd, 6), auth_dat[i].userid, 24); + WFIFOL (fd, 2) = auth_dat[i].account_id; + login_log + ("'ladmin': Change of the final date of a banishment (account: %s, new final date of banishment: %d (%s), ip: %s)" + RETCODE, auth_dat[i].userid, timestamp, + (timestamp == 0 ? "no banishment" : tmpstr), ip); + if (auth_dat[i].ban_until_time != timestamp) + { + if (timestamp != 0) + { + unsigned char buf[16]; + WBUFW (buf, 0) = 0x2731; + WBUFL (buf, 2) = auth_dat[i].account_id; + WBUFB (buf, 6) = 1; // 0: change of statut, 1: ban + WBUFL (buf, 7) = timestamp; // status or final date of a banishment + charif_sendallwos (-1, buf, 11); + for (j = 0; j < AUTH_FIFO_SIZE; j++) + if (auth_fifo[j].account_id == + auth_dat[i].account_id) + auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification) + } + auth_dat[i].ban_until_time = timestamp; + mmo_auth_sync (); + } + } + else + { + memcpy (WFIFOP (fd, 6), account_name, 24); + login_log + ("'ladmin': Attempt to change the final date of a banishment of an unknown account (account: %s, received final date of banishment: %d (%s), ip: %s)" + RETCODE, account_name, timestamp, + (timestamp == 0 ? "no banishment" : tmpstr), ip); + } + WFIFOL (fd, 30) = timestamp; + } + WFIFOSET (fd, 34); + RFIFOSKIP (fd, 30); + break; + + case 0x794c: // Request to change the final date of a banishment (timestamp) (relative change) + if (RFIFOREST (fd) < 38) + return 0; + { + time_t timestamp; + struct tm *tmtime; + char tmpstr[2048]; + WFIFOW (fd, 0) = 0x794d; + WFIFOL (fd, 2) = -1; + account_name = RFIFOP (fd, 2); + account_name[23] = '\0'; + remove_control_chars (account_name); + i = search_account_index (account_name); + if (i != -1) + { + WFIFOL (fd, 2) = auth_dat[i].account_id; + memcpy (WFIFOP (fd, 6), auth_dat[i].userid, 24); + if (auth_dat[i].ban_until_time == 0 + || auth_dat[i].ban_until_time < time (NULL)) + timestamp = time (NULL); + else + timestamp = auth_dat[i].ban_until_time; + tmtime = gmtime (×tamp); + tmtime->tm_year = + tmtime->tm_year + (short) RFIFOW (fd, 26); + tmtime->tm_mon = + tmtime->tm_mon + (short) RFIFOW (fd, 28); + tmtime->tm_mday = + tmtime->tm_mday + (short) RFIFOW (fd, 30); + tmtime->tm_hour = + tmtime->tm_hour + (short) RFIFOW (fd, 32); + tmtime->tm_min = + tmtime->tm_min + (short) RFIFOW (fd, 34); + tmtime->tm_sec = + tmtime->tm_sec + (short) RFIFOW (fd, 36); + timestamp = mktime (tmtime); + if (timestamp != -1) + { + if (timestamp <= time (NULL)) + timestamp = 0; + strftime (tmpstr, 24, date_format, + gmtime (×tamp)); + login_log + ("'ladmin': Adjustment of a final date of a banishment (account: %s, (%+d y %+d m %+d d %+d h %+d mn %+d s) -> new validity: %d (%s), ip: %s)" + RETCODE, auth_dat[i].userid, + (short) RFIFOW (fd, 26), (short) RFIFOW (fd, + 28), + (short) RFIFOW (fd, 30), (short) RFIFOW (fd, + 32), + (short) RFIFOW (fd, 34), (short) RFIFOW (fd, + 36), + timestamp, + (timestamp == 0 ? "no banishment" : tmpstr), + ip); + if (auth_dat[i].ban_until_time != timestamp) + { + if (timestamp != 0) + { + unsigned char buf[16]; + WBUFW (buf, 0) = 0x2731; + WBUFL (buf, 2) = auth_dat[i].account_id; + WBUFB (buf, 6) = 1; // 0: change of statut, 1: ban + WBUFL (buf, 7) = timestamp; // status or final date of a banishment + charif_sendallwos (-1, buf, 11); + for (j = 0; j < AUTH_FIFO_SIZE; j++) + if (auth_fifo[j].account_id == + auth_dat[i].account_id) + auth_fifo[j].login_id1++; // to avoid reconnection error when come back from map-server (char-server will ask again the authentification) + } + auth_dat[i].ban_until_time = timestamp; + mmo_auth_sync (); + } + } + else + { + strftime (tmpstr, 24, date_format, + gmtime (&auth_dat[i].ban_until_time)); + login_log + ("'ladmin': Impossible to adjust the final date of a banishment (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> ???, ip: %s)" + RETCODE, auth_dat[i].userid, + auth_dat[i].ban_until_time, + (auth_dat[i].ban_until_time == + 0 ? "no banishment" : tmpstr), + (short) RFIFOW (fd, 26), (short) RFIFOW (fd, + 28), + (short) RFIFOW (fd, 30), (short) RFIFOW (fd, + 32), + (short) RFIFOW (fd, 34), (short) RFIFOW (fd, + 36), + ip); + } + WFIFOL (fd, 30) = + (unsigned long) auth_dat[i].ban_until_time; + } + else + { + memcpy (WFIFOP (fd, 6), account_name, 24); + login_log + ("'ladmin': Attempt to adjust the final date of a banishment of an unknown account (account: %s, ip: %s)" + RETCODE, account_name, ip); + WFIFOL (fd, 30) = 0; + } + } + WFIFOSET (fd, 34); + RFIFOSKIP (fd, 38); + break; + + case 0x794e: // Request to send a broadcast message + if (RFIFOREST (fd) < 8 + || RFIFOREST (fd) < (8 + RFIFOL (fd, 4))) + return 0; + WFIFOW (fd, 0) = 0x794f; + WFIFOW (fd, 2) = -1; + if (RFIFOL (fd, 4) < 1) + { + login_log + ("'ladmin': Receiving a message for broadcast, but message is void (ip: %s)" + RETCODE, ip); + } + else + { + // at least 1 char-server + for (i = 0; i < MAX_SERVERS; i++) + if (server_fd[i] >= 0) + break; + if (i == MAX_SERVERS) + { + login_log + ("'ladmin': Receiving a message for broadcast, but no char-server is online (ip: %s)" + RETCODE, ip); + } + else + { + char buf[32000]; + char message[32000]; + WFIFOW (fd, 2) = 0; + memset (message, '\0', sizeof (message)); + memcpy (message, RFIFOP (fd, 8), RFIFOL (fd, 4)); + message[sizeof (message) - 1] = '\0'; + remove_control_chars (message); + if (RFIFOW (fd, 2) == 0) + login_log + ("'ladmin': Receiving a message for broadcast (message (in yellow): %s, ip: %s)" + RETCODE, message, ip); + else + login_log + ("'ladmin': Receiving a message for broadcast (message (in blue): %s, ip: %s)" + RETCODE, message, ip); + // send same message to all char-servers (no answer) + memcpy (WBUFP (buf, 0), RFIFOP (fd, 0), + 8 + RFIFOL (fd, 4)); + WBUFW (buf, 0) = 0x2726; + charif_sendallwos (-1, buf, 8 + RFIFOL (fd, 4)); + } + } + WFIFOSET (fd, 4); + RFIFOSKIP (fd, 8 + RFIFOL (fd, 4)); + break; + + case 0x7950: // Request to change the validity limite (timestamp) (relative change) + if (RFIFOREST (fd) < 38) + return 0; + { + time_t timestamp; + struct tm *tmtime; + char tmpstr[2048]; + char tmpstr2[2048]; + WFIFOW (fd, 0) = 0x7951; + WFIFOL (fd, 2) = -1; + account_name = RFIFOP (fd, 2); + account_name[23] = '\0'; + remove_control_chars (account_name); + i = search_account_index (account_name); + if (i != -1) + { + WFIFOL (fd, 2) = auth_dat[i].account_id; + memcpy (WFIFOP (fd, 6), auth_dat[i].userid, 24); + timestamp = auth_dat[i].connect_until_time; + if (add_to_unlimited_account == 0 && timestamp == 0) + { + login_log + ("'ladmin': Attempt to adjust the validity limit of an unlimited account (account: %s, ip: %s)" + RETCODE, auth_dat[i].userid, ip); + WFIFOL (fd, 30) = 0; + } + else + { + if (timestamp == 0 || timestamp < time (NULL)) + timestamp = time (NULL); + tmtime = gmtime (×tamp); + tmtime->tm_year = + tmtime->tm_year + (short) RFIFOW (fd, 26); + tmtime->tm_mon = + tmtime->tm_mon + (short) RFIFOW (fd, 28); + tmtime->tm_mday = + tmtime->tm_mday + (short) RFIFOW (fd, 30); + tmtime->tm_hour = + tmtime->tm_hour + (short) RFIFOW (fd, 32); + tmtime->tm_min = + tmtime->tm_min + (short) RFIFOW (fd, 34); + tmtime->tm_sec = + tmtime->tm_sec + (short) RFIFOW (fd, 36); + timestamp = mktime (tmtime); + if (timestamp != -1) + { + strftime (tmpstr, 24, date_format, + gmtime (&auth_dat + [i].connect_until_time)); + strftime (tmpstr2, 24, date_format, + gmtime (×tamp)); + login_log + ("'ladmin': Adjustment of a validity limit (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> new validity: %d (%s), ip: %s)" + RETCODE, auth_dat[i].userid, + auth_dat[i].connect_until_time, + (auth_dat[i].connect_until_time == + 0 ? "unlimited" : tmpstr), + (short) RFIFOW (fd, 26), + (short) RFIFOW (fd, 28), + (short) RFIFOW (fd, 30), + (short) RFIFOW (fd, 32), + (short) RFIFOW (fd, 34), + (short) RFIFOW (fd, 36), timestamp, + (timestamp == 0 ? "unlimited" : tmpstr2), + ip); + auth_dat[i].connect_until_time = timestamp; + mmo_auth_sync (); + WFIFOL (fd, 30) = + (unsigned long) + auth_dat[i].connect_until_time; + } + else + { + strftime (tmpstr, 24, date_format, + gmtime (&auth_dat + [i].connect_until_time)); + login_log + ("'ladmin': Impossible to adjust a validity limit (account: %s, %d (%s) + (%+d y %+d m %+d d %+d h %+d mn %+d s) -> ???, ip: %s)" + RETCODE, auth_dat[i].userid, + auth_dat[i].connect_until_time, + (auth_dat[i].connect_until_time == + 0 ? "unlimited" : tmpstr), + (short) RFIFOW (fd, 26), + (short) RFIFOW (fd, 28), + (short) RFIFOW (fd, 30), + (short) RFIFOW (fd, 32), + (short) RFIFOW (fd, 34), + (short) RFIFOW (fd, 36), ip); + WFIFOL (fd, 30) = 0; + } + } + } + else + { + memcpy (WFIFOP (fd, 6), account_name, 24); + login_log + ("'ladmin': Attempt to adjust the validity limit of an unknown account (account: %s, ip: %s)" + RETCODE, account_name, ip); + WFIFOL (fd, 30) = 0; + } + } + WFIFOSET (fd, 34); + RFIFOSKIP (fd, 38); + break; + + case 0x7952: // Request about informations of an account (by account name) + if (RFIFOREST (fd) < 26) + return 0; + WFIFOW (fd, 0) = 0x7953; + WFIFOL (fd, 2) = -1; + account_name = RFIFOP (fd, 2); + account_name[23] = '\0'; + remove_control_chars (account_name); + i = search_account_index (account_name); + if (i != -1) + { + WFIFOL (fd, 2) = auth_dat[i].account_id; + WFIFOB (fd, 6) = + (unsigned char) isGM (auth_dat[i].account_id); + memcpy (WFIFOP (fd, 7), auth_dat[i].userid, 24); + WFIFOB (fd, 31) = auth_dat[i].sex; + WFIFOL (fd, 32) = auth_dat[i].logincount; + WFIFOL (fd, 36) = auth_dat[i].state; + memcpy (WFIFOP (fd, 40), auth_dat[i].error_message, 20); + memcpy (WFIFOP (fd, 60), auth_dat[i].lastlogin, 24); + memcpy (WFIFOP (fd, 84), auth_dat[i].last_ip, 16); + memcpy (WFIFOP (fd, 100), auth_dat[i].email, 40); + WFIFOL (fd, 140) = + (unsigned long) auth_dat[i].connect_until_time; + WFIFOL (fd, 144) = + (unsigned long) auth_dat[i].ban_until_time; + WFIFOW (fd, 148) = strlen (auth_dat[i].memo); + if (auth_dat[i].memo[0]) + { + memcpy (WFIFOP (fd, 150), auth_dat[i].memo, + strlen (auth_dat[i].memo)); + } + login_log + ("'ladmin': Sending information of an account (request by the name; account: %s, id: %d, ip: %s)" + RETCODE, auth_dat[i].userid, auth_dat[i].account_id, + ip); + WFIFOSET (fd, 150 + strlen (auth_dat[i].memo)); + } + else + { + memcpy (WFIFOP (fd, 7), account_name, 24); + WFIFOW (fd, 148) = 0; + login_log + ("'ladmin': Attempt to obtain information (by the name) of an unknown account (account: %s, ip: %s)" + RETCODE, account_name, ip); + WFIFOSET (fd, 150); + } + RFIFOSKIP (fd, 26); + break; + + case 0x7954: // Request about information of an account (by account id) + if (RFIFOREST (fd) < 6) + return 0; + WFIFOW (fd, 0) = 0x7953; + WFIFOL (fd, 2) = RFIFOL (fd, 2); + memset (WFIFOP (fd, 7), '\0', 24); + for (i = 0; i < auth_num; i++) + { + if (auth_dat[i].account_id == RFIFOL (fd, 2)) + { + login_log + ("'ladmin': Sending information of an account (request by the id; account: %s, id: %d, ip: %s)" + RETCODE, auth_dat[i].userid, RFIFOL (fd, 2), ip); + WFIFOB (fd, 6) = + (unsigned char) isGM (auth_dat[i].account_id); + memcpy (WFIFOP (fd, 7), auth_dat[i].userid, 24); + WFIFOB (fd, 31) = auth_dat[i].sex; + WFIFOL (fd, 32) = auth_dat[i].logincount; + WFIFOL (fd, 36) = auth_dat[i].state; + memcpy (WFIFOP (fd, 40), auth_dat[i].error_message, + 20); + memcpy (WFIFOP (fd, 60), auth_dat[i].lastlogin, 24); + memcpy (WFIFOP (fd, 84), auth_dat[i].last_ip, 16); + memcpy (WFIFOP (fd, 100), auth_dat[i].email, 40); + WFIFOL (fd, 140) = + (unsigned long) auth_dat[i].connect_until_time; + WFIFOL (fd, 144) = + (unsigned long) auth_dat[i].ban_until_time; + WFIFOW (fd, 148) = strlen (auth_dat[i].memo); + if (auth_dat[i].memo[0]) + { + memcpy (WFIFOP (fd, 150), auth_dat[i].memo, + strlen (auth_dat[i].memo)); + } + WFIFOSET (fd, 150 + strlen (auth_dat[i].memo)); + break; + } + } + if (i == auth_num) + { + login_log + ("'ladmin': Attempt to obtain information (by the id) of an unknown account (id: %d, ip: %s)" + RETCODE, RFIFOL (fd, 2), ip); + strncpy (WFIFOP (fd, 7), "", 24); + WFIFOW (fd, 148) = 0; + WFIFOSET (fd, 150); + } + RFIFOSKIP (fd, 6); + break; + + case 0x7955: // Request to reload GM file (no answer) + login_log + ("'ladmin': Request to re-load GM configuration file (ip: %s)." + RETCODE, ip); + read_gm_account (); + // send GM accounts to all char-servers + send_GM_accounts (); + RFIFOSKIP (fd, 2); + break; + + default: + { + FILE *logfp; + char tmpstr[24]; + struct timeval tv; + logfp = fopen_ (login_log_unknown_packets_filename, "a"); + if (logfp) + { + gettimeofday (&tv, NULL); + strftime (tmpstr, 23, date_format, gmtime (&(tv.tv_sec))); + fprintf (logfp, + "%s.%03d: receiving of an unknown packet -> disconnection" + RETCODE, tmpstr, (int) tv.tv_usec / 1000); + fprintf (logfp, + "parse_admin: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." + RETCODE, fd, ip, RFIFOW (fd, 0), RFIFOREST (fd)); + fprintf (logfp, "Detail (in hex):" RETCODE); + fprintf (logfp, + "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" + RETCODE); + memset (tmpstr, '\0', sizeof (tmpstr)); + for (i = 0; i < RFIFOREST (fd); i++) + { + if ((i & 15) == 0) + fprintf (logfp, "%04X ", i); + fprintf (logfp, "%02x ", RFIFOB (fd, i)); + if (RFIFOB (fd, i) > 0x1f) + tmpstr[i % 16] = RFIFOB (fd, i); + else + tmpstr[i % 16] = '.'; + if ((i - 7) % 16 == 0) // -8 + 1 + fprintf (logfp, " "); + else if ((i + 1) % 16 == 0) + { + fprintf (logfp, " %s" RETCODE, tmpstr); + memset (tmpstr, '\0', sizeof (tmpstr)); + } + } + if (i % 16 != 0) + { + for (j = i; j % 16 != 0; j++) + { + fprintf (logfp, " "); + if ((j - 7) % 16 == 0) // -8 + 1 + fprintf (logfp, " "); + } + fprintf (logfp, " %s" RETCODE, tmpstr); + } + fprintf (logfp, RETCODE); + fclose_ (logfp); + } + } + login_log + ("'ladmin': End of connection, unknown packet (ip: %s)" + RETCODE, ip); + session[fd]->eof = 1; + printf + ("Remote administration has been disconnected (unknown packet).\n"); + return 0; + } + //WFIFOW(fd,0) = 0x791f; + //WFIFOSET(fd,2); + } + return 0; } //-------------------------------------------- // Test to know if an IP come from LAN or WAN. //-------------------------------------------- -int lan_ip_check(unsigned char *p) { - int i; - int lancheck = 1; - -// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n", -// p[0], p[1], p[2], p[3], -// subneti[0], subneti[1], subneti[2], subneti[3], -// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]); - for(i = 0; i < 4; i++) { - if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) { - lancheck = 0; - break; - } - } - printf("LAN test (result): %s source\033[0m.\n", (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN"); - return lancheck; +int lan_ip_check (unsigned char *p) +{ + int i; + int lancheck = 1; + +// printf("lan_ip_check: to compare: %d.%d.%d.%d, network: %d.%d.%d.%d/%d.%d.%d.%d\n", +// p[0], p[1], p[2], p[3], +// subneti[0], subneti[1], subneti[2], subneti[3], +// subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]); + for (i = 0; i < 4; i++) + { + if ((subneti[i] & subnetmaski[i]) != (p[i] & subnetmaski[i])) + { + lancheck = 0; + break; + } + } + printf ("LAN test (result): %s source\033[0m.\n", + (lancheck) ? "\033[1;36mLAN" : "\033[1;32mWAN"); + return lancheck; } //---------------------------------------------------------------------------------------- // Default packet parsing (normal players or administation/char-server connexion requests) //---------------------------------------------------------------------------------------- -int parse_login(int fd) { - struct mmo_account account; - int result, i, j; - unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; - char ip[16]; - int host_len; - - sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); - - if (session[fd]->eof) { - close(fd); - delete_session(fd); - return 0; - } - - while(RFIFOREST(fd) >= 2) { - if (display_parse_login == 1) { - if (RFIFOW(fd,0) == 0x64 || RFIFOW(fd,0) == 0x01dd) { - if (RFIFOREST(fd) >= ((RFIFOW(fd,0) == 0x64) ? 55 : 47)) - printf("parse_login: connection #%d, packet: 0x%x (with being read: %d), account: %s.\n", fd, RFIFOW(fd,0), RFIFOREST(fd), RFIFOP(fd,6)); - } else if (RFIFOW(fd,0) == 0x2710) { - if (RFIFOREST(fd) >= 86) - printf("parse_login: connection #%d, packet: 0x%x (with being read: %d), server: %s.\n", fd, RFIFOW(fd,0), RFIFOREST(fd), RFIFOP(fd,60)); - } else - printf("parse_login: connection #%d, packet: 0x%x (with being read: %d).\n", fd, RFIFOW(fd,0), RFIFOREST(fd)); - } - - switch(RFIFOW(fd,0)) { - case 0x200: // New alive packet: structure: 0x200 <account.userid>.24B. used to verify if client is always alive. - if (RFIFOREST(fd) < 26) - return 0; - RFIFOSKIP(fd,26); - break; - - case 0x204: // New alive packet: structure: 0x204 <encrypted.account.userid>.16B. (new ragexe from 22 june 2004) - if (RFIFOREST(fd) < 18) - return 0; - RFIFOSKIP(fd,18); - break; - - case 0x64: // Ask connection of a client - case 0x01dd: // Ask connection of a client (encryption mode) - if (RFIFOREST(fd) < ((RFIFOW(fd,0) == 0x64) ? 55 : 47)) - return 0; - - account.userid = RFIFOP(fd,6); - account.userid[23] = '\0'; - remove_control_chars(account.userid); - account.passwd = RFIFOP(fd,30); - if (RFIFOW(fd,0) == 0x64) { - account.passwd[23] = '\0'; - remove_control_chars(account.passwd); - } +int parse_login (int fd) +{ + struct mmo_account account; + int result, i, j; + unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; + char ip[16]; + int host_len; + + sprintf (ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); + + if (session[fd]->eof) + { + close (fd); + delete_session (fd); + return 0; + } + + while (RFIFOREST (fd) >= 2) + { + if (display_parse_login == 1) + { + if (RFIFOW (fd, 0) == 0x64 || RFIFOW (fd, 0) == 0x01dd) + { + if (RFIFOREST (fd) >= ((RFIFOW (fd, 0) == 0x64) ? 55 : 47)) + printf + ("parse_login: connection #%d, packet: 0x%x (with being read: %d), account: %s.\n", + fd, RFIFOW (fd, 0), RFIFOREST (fd), RFIFOP (fd, 6)); + } + else if (RFIFOW (fd, 0) == 0x2710) + { + if (RFIFOREST (fd) >= 86) + printf + ("parse_login: connection #%d, packet: 0x%x (with being read: %d), server: %s.\n", + fd, RFIFOW (fd, 0), RFIFOREST (fd), RFIFOP (fd, 60)); + } + else + printf + ("parse_login: connection #%d, packet: 0x%x (with being read: %d).\n", + fd, RFIFOW (fd, 0), RFIFOREST (fd)); + } + + switch (RFIFOW (fd, 0)) + { + case 0x200: // New alive packet: structure: 0x200 <account.userid>.24B. used to verify if client is always alive. + if (RFIFOREST (fd) < 26) + return 0; + RFIFOSKIP (fd, 26); + break; + + case 0x204: // New alive packet: structure: 0x204 <encrypted.account.userid>.16B. (new ragexe from 22 june 2004) + if (RFIFOREST (fd) < 18) + return 0; + RFIFOSKIP (fd, 18); + break; + + case 0x64: // Ask connection of a client + case 0x01dd: // Ask connection of a client (encryption mode) + if (RFIFOREST (fd) < ((RFIFOW (fd, 0) == 0x64) ? 55 : 47)) + return 0; + + account.userid = RFIFOP (fd, 6); + account.userid[23] = '\0'; + remove_control_chars (account.userid); + account.passwd = RFIFOP (fd, 30); + if (RFIFOW (fd, 0) == 0x64) + { + account.passwd[23] = '\0'; + remove_control_chars (account.passwd); + } #ifdef PASSWORDENC - account.passwdenc = (RFIFOW(fd,0) == 0x64) ? 0 : PASSWORDENC; + account.passwdenc = + (RFIFOW (fd, 0) == 0x64) ? 0 : PASSWORDENC; #else - account.passwdenc = 0; + account.passwdenc = 0; #endif - if (RFIFOW(fd,0) == 0x64) { - login_log("Request for connection (non encryption mode) of %s (ip: %s)." RETCODE, account.userid, ip); - } else { - login_log("Request for connection (encryption mode) of %s (ip: %s)." RETCODE, account.userid, ip); - } - - if (!check_ip(session[fd]->client_addr.sin_addr.s_addr)) { - login_log("Connection refused: IP isn't authorised (deny/allow, ip: %s)." RETCODE, ip); - WFIFOW(fd,0) = 0x6a; - WFIFOB(fd,2) = 0x03; - WFIFOSET(fd,3); - RFIFOSKIP(fd,(RFIFOW(fd,0) == 0x64) ? 55 : 47); - break; - } - - result = mmo_auth(&account, fd); - if (result == -1) { - int gm_level = isGM(account.account_id); - if (min_level_to_connect > gm_level) { - login_log("Connection refused: the minimum GM level for connection is %d (account: %s, GM level: %d, ip: %s)." RETCODE, - min_level_to_connect, account.userid, gm_level, ip); - WFIFOW(fd,0) = 0x81; - WFIFOL(fd,2) = 1; // 01 = Server closed - WFIFOSET(fd,3); - } else { - int version_2 = RFIFOB(fd, 54); // version 2 - - if (gm_level) - printf("Connection of the GM (level:%d) account '%s' accepted.\n", gm_level, account.userid); - else - printf("Connection of the account '%s' accepted.\n", account.userid); - - /* - * Add a 0x0063 packet, which contains the name of the update host. The packet will only - * be sent if login_athena.conf contains a non-null entry for "update_host:" - * - * Because older clients cannot handle the 0x63 packet, we check the "version 2" value - * from the incoming 0x64 packet (the byte at offset 54). If bit 0 of this is set, - * then the client can safely accept the 0x63 packet. The "version 2" value is not - * otherwise used by eAthena. - */ - if ((RFIFOW(fd, 0) == 0x64) - && (version_2 & VERSION_2_UPDATEHOST)) - { - host_len = (int)strlen(update_host); - if (host_len > 0) - { - WFIFOW(fd, 0) = 0x63; - WFIFOW(fd, 2) = 4 + host_len; - memcpy(WFIFOP(fd, 4), update_host, host_len); - WFIFOSET(fd, 4 + host_len); - } - } - - // Load list of char servers into outbound packet - server_num = 0; - if (version_2 && VERSION_2_SERVERORDER) - for(i = 0; i < MAX_SERVERS; i++) { - if (server_fd[i] >= 0) { - if (lan_ip_check(p)) - WFIFOL(fd,47+server_num*32) = inet_addr(lan_char_ip); - else - WFIFOL(fd,47+server_num*32) = server[i].ip; - WFIFOW(fd,47+server_num*32+4) = server[i].port; - memcpy(WFIFOP(fd,47+server_num*32+6), server[i].name, 20); - WFIFOW(fd,47+server_num*32+26) = server[i].users; - WFIFOW(fd,47+server_num*32+28) = server[i].maintenance; - WFIFOW(fd,47+server_num*32+30) = server[i].new; - server_num++; - } - } - else // Send them in reverse, as the client defaults to the second (!) one - for(i = MAX_SERVERS - 1; i >= 0; i--) { - if (server_fd[i] >= 0) { - if (lan_ip_check(p)) - WFIFOL(fd,47+server_num*32) = inet_addr(lan_char_ip); - else - WFIFOL(fd,47+server_num*32) = server[i].ip; - WFIFOW(fd,47+server_num*32+4) = server[i].port; - memcpy(WFIFOP(fd,47+server_num*32+6), server[i].name, 20); - WFIFOW(fd,47+server_num*32+26) = server[i].users; - WFIFOW(fd,47+server_num*32+28) = server[i].maintenance; - WFIFOW(fd,47+server_num*32+30) = server[i].new; - server_num++; - } - } - // if at least 1 char-server - if (server_num > 0) { - WFIFOW(fd,0) = 0x69; - WFIFOW(fd,2) = 47+32*server_num; - WFIFOL(fd,4) = account.login_id1; - WFIFOL(fd,8) = account.account_id; - WFIFOL(fd,12) = account.login_id2; - WFIFOL(fd,16) = 0; // in old version, that was for ip (not more used) - memcpy(WFIFOP(fd,20), account.lastlogin, 24); // in old version, that was for name (not more used) - WFIFOB(fd,46) = account.sex; - WFIFOSET(fd,47+32*server_num); - if (auth_fifo_pos >= AUTH_FIFO_SIZE) - auth_fifo_pos = 0; - auth_fifo[auth_fifo_pos].account_id = account.account_id; - auth_fifo[auth_fifo_pos].login_id1 = account.login_id1; - auth_fifo[auth_fifo_pos].login_id2 = account.login_id2; - auth_fifo[auth_fifo_pos].sex = account.sex; - auth_fifo[auth_fifo_pos].delflag = 0; - auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr; - auth_fifo_pos++; - // if no char-server, don't send void list of servers, just disconnect the player with proper message - } else { - login_log("Connection refused: there is no char-server online (account: %s, ip: %s)." RETCODE, - account.userid, ip); - WFIFOW(fd,0) = 0x81; - WFIFOL(fd,2) = 1; // 01 = Server closed - WFIFOSET(fd,3); - } - } - } else { - memset(WFIFOP(fd,0), '\0', 23); - WFIFOW(fd,0) = 0x6a; - WFIFOB(fd,2) = result; - if (result == 6) { // 6 = Your are Prohibited to log in until %s - i = search_account_index(account.userid); - if (i != -1) { - if (auth_dat[i].ban_until_time != 0) { // if account is banned, we send ban timestamp - char tmpstr[256]; - strftime(tmpstr, 20, date_format, gmtime(&auth_dat[i].ban_until_time)); - tmpstr[19] = '\0'; - memcpy(WFIFOP(fd,3), tmpstr, 20); - } else { // we send error message - memcpy(WFIFOP(fd,3), auth_dat[i].error_message, 20); - } - } - } - WFIFOSET(fd,23); - } - RFIFOSKIP(fd,(RFIFOW(fd,0) == 0x64) ? 55 : 47); - break; - - case 0x01db: // Sending request of the coding key - case 0x791a: // Sending request of the coding key (administration packet) - { - struct login_session_data *ld; - if (session[fd]->session_data) { - printf("login: abnormal request of MD5 key (already opened session).\n"); - session[fd]->eof = 1; - return 0; - } - ld = session[fd]->session_data = calloc(sizeof(*ld), 1); - if (!ld) { - printf("login: Request for md5 key: memory allocation failure (malloc)!\n"); - session[fd]->eof = 1; - return 0; - } - if (RFIFOW(fd,0) == 0x01db) { - login_log("Sending request of the coding key (ip: %s)" RETCODE, ip); - } else { - login_log("'ladmin': Sending request of the coding key (ip: %s)" RETCODE, ip); - } - // Creation of the coding key - memset(ld->md5key, '\0', sizeof(ld->md5key)); - ld->md5keylen = rand() % 4 + 12; - for(i = 0; i < ld->md5keylen; i++) - ld->md5key[i] = rand() % 255 + 1; - - RFIFOSKIP(fd,2); - WFIFOW(fd,0) = 0x01dc; - WFIFOW(fd,2) = 4 + ld->md5keylen; - memcpy(WFIFOP(fd,4), ld->md5key, ld->md5keylen); - WFIFOSET(fd,WFIFOW(fd,2)); - } - break; - - case 0x2710: // Connection request of a char-server - if (RFIFOREST(fd) < 86) - return 0; - { - int GM_value, len; - unsigned char* server_name; - account.userid = RFIFOP(fd,2); - account.userid[23] = '\0'; - remove_control_chars(account.userid); - account.passwd = RFIFOP(fd,26); - account.passwd[23] = '\0'; - remove_control_chars(account.passwd); - account.passwdenc = 0; - server_name = RFIFOP(fd,60); - server_name[19] = '\0'; - remove_control_chars(server_name); - login_log("Connection request of the char-server '%s' @ %d.%d.%d.%d:%d (ip: %s)" RETCODE, - server_name, RFIFOB(fd,54), RFIFOB(fd,55), RFIFOB(fd,56), RFIFOB(fd,57), RFIFOW(fd,58), ip); - result = mmo_auth(&account, fd); - - if (result == -1 && account.sex == 2) { - // If this is the main server, and we don't already have a main server - if (server_fd[0] <= 0 && strcmpi(server_name, main_server) == 0) - { - account.account_id = 0; - } - else - { - int i; - for (i = 1; i < MAX_SERVERS; i++) { - if (server_fd[i] <= 0) { - account.account_id = i; - break; - } - } - } - } - - if (result == -1 && account.sex == 2 && account.account_id < MAX_SERVERS && server_fd[account.account_id] == -1) { - login_log("Connection of the char-server '%s' accepted (account: %s, pass: %s, ip: %s)" RETCODE, - server_name, account.userid, account.passwd, ip); - printf("Connection of the char-server '%s' accepted.\n", server_name); - memset(&server[account.account_id], 0, sizeof(struct mmo_char_server)); - server[account.account_id].ip = RFIFOL(fd,54); - server[account.account_id].port = RFIFOW(fd,58); - memcpy(server[account.account_id].name, server_name, 20); - server[account.account_id].users = 0; - server[account.account_id].maintenance = RFIFOW(fd,82); - server[account.account_id].new = RFIFOW(fd,84); - server_fd[account.account_id] = fd; - if(anti_freeze_enable) - server_freezeflag[account.account_id] = 5; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed - WFIFOW(fd,0) = 0x2711; - WFIFOB(fd,2) = 0; - WFIFOSET(fd,3); - session[fd]->func_parse = parse_fromchar; - realloc_fifo(fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); - // send GM account to char-server - len = 4; - WFIFOW(fd,0) = 0x2732; - for(i = 0; i < auth_num; i++) - // send only existing accounts. We can not create a GM account when server is online. - if ((GM_value = isGM(auth_dat[i].account_id)) > 0) { - WFIFOL(fd,len) = auth_dat[i].account_id; - WFIFOB(fd,len+4) = (unsigned char)GM_value; - len += 5; - } - WFIFOW(fd,2) = len; - WFIFOSET(fd,len); - } else { - login_log("Connexion of the char-server '%s' REFUSED (account: %s, pass: %s, ip: %s)" RETCODE, - server_name, account.userid, account.passwd, ip); - WFIFOW(fd,0) = 0x2711; - WFIFOB(fd,2) = 3; - WFIFOSET(fd,3); - } - } - RFIFOSKIP(fd,86); - return 0; - - case 0x7530: // Request of the server version - login_log("Sending of the server version (ip: %s)" RETCODE, ip); - WFIFOW(fd,0) = 0x7531; - WFIFOB(fd,2) = -1; - WFIFOB(fd,3) = 'T'; - WFIFOB(fd,4) = 'M'; - WFIFOB(fd,5) = 'W'; - WFIFOB(fd,6) = ' '; - WFIFOB(fd,7) = 'e'; - WFIFOW(fd,8) = 'A'; - WFIFOSET(fd,10); - RFIFOSKIP(fd,2); - break; - - case 0x7532: // Request to end connection - login_log("End of connection (ip: %s)" RETCODE, ip); - session[fd]->eof = 1; - return 0; - - case 0x7918: // Request for administation login - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < ((RFIFOW(fd,2) == 0) ? 28 : 20)) - return 0; - WFIFOW(fd,0) = 0x7919; - WFIFOB(fd,2) = 1; - if (!check_ladminip(session[fd]->client_addr.sin_addr.s_addr)) { - login_log("'ladmin'-login: Connection in administration mode refused: IP isn't authorised (ladmin_allow, ip: %s)." RETCODE, ip); - } else { - struct login_session_data *ld = session[fd]->session_data; - if (RFIFOW(fd,2) == 0) { // non encrypted password - unsigned char* password; - password = RFIFOP(fd,4); - password[23] = '\0'; - remove_control_chars(password); - // If remote administration is enabled and password sent by client matches password read from login server configuration file - if ((admin_state == 1) && (strcmp(password, admin_pass) == 0)) { - login_log("'ladmin'-login: Connection in administration mode accepted (non encrypted password: %s, ip: %s)" RETCODE, password, ip); - printf("Connection of a remote administration accepted (non encrypted password).\n"); - WFIFOB(fd,2) = 0; - session[fd]->func_parse = parse_admin; - } else if (admin_state != 1) - login_log("'ladmin'-login: Connection in administration mode REFUSED - remote administration is disabled (non encrypted password: %s, ip: %s)" RETCODE, password, ip); - else - login_log("'ladmin'-login: Connection in administration mode REFUSED - invalid password (non encrypted password: %s, ip: %s)" RETCODE, password, ip); - } else { // encrypted password - if (!ld) - printf("'ladmin'-login: error! MD5 key not created/requested for an administration login.\n"); - else { - char md5str[64] = "", md5bin[32]; - if (RFIFOW(fd,2) == 1) { - strncpy(md5str, ld->md5key, sizeof(ld->md5key)); // 20 - strcat(md5str, admin_pass); // 24 - } else if (RFIFOW(fd,2) == 2) { - strncpy(md5str, admin_pass, sizeof(admin_pass)); // 24 - strcat(md5str, ld->md5key); // 20 - } - MD5_String2binary(md5str, md5bin); - // If remote administration is enabled and password hash sent by client matches hash of password read from login server configuration file - if ((admin_state == 1) && (memcmp(md5bin, RFIFOP(fd,4), 16) == 0)) { - login_log("'ladmin'-login: Connection in administration mode accepted (encrypted password, ip: %s)" RETCODE, ip); - printf("Connection of a remote administration accepted (encrypted password).\n"); - WFIFOB(fd,2) = 0; - session[fd]->func_parse = parse_admin; - } else if (admin_state != 1) - login_log("'ladmin'-login: Connection in administration mode REFUSED - remote administration is disabled (encrypted password, ip: %s)" RETCODE, ip); - else - login_log("'ladmin'-login: Connection in administration mode REFUSED - invalid password (encrypted password, ip: %s)" RETCODE, ip); - } - } - } - WFIFOSET(fd,3); - RFIFOSKIP(fd, (RFIFOW(fd,2) == 0) ? 28 : 20); - break; - - default: - if (save_unknown_packets) { - FILE *logfp; - char tmpstr[24]; - struct timeval tv; - logfp = fopen_(login_log_unknown_packets_filename, "a"); - if (logfp) { - gettimeofday(&tv, NULL); - strftime(tmpstr, 23, date_format, gmtime(&(tv.tv_sec))); - fprintf(logfp, "%s.%03d: receiving of an unknown packet -> disconnection" RETCODE, tmpstr, (int)tv.tv_usec / 1000); - fprintf(logfp, "parse_login: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." RETCODE, fd, ip, RFIFOW(fd,0), RFIFOREST(fd)); - fprintf(logfp, "Detail (in hex):" RETCODE); - fprintf(logfp, "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" RETCODE); - memset(tmpstr, '\0', sizeof(tmpstr)); - for(i = 0; i < RFIFOREST(fd); i++) { - if ((i & 15) == 0) - fprintf(logfp, "%04X ",i); - fprintf(logfp, "%02x ", RFIFOB(fd,i)); - if (RFIFOB(fd,i) > 0x1f) - tmpstr[i % 16] = RFIFOB(fd,i); - else - tmpstr[i % 16] = '.'; - if ((i - 7) % 16 == 0) // -8 + 1 - fprintf(logfp, " "); - else if ((i + 1) % 16 == 0) { - fprintf(logfp, " %s" RETCODE, tmpstr); - memset(tmpstr, '\0', sizeof(tmpstr)); - } - } - if (i % 16 != 0) { - for(j = i; j % 16 != 0; j++) { - fprintf(logfp, " "); - if ((j - 7) % 16 == 0) // -8 + 1 - fprintf(logfp, " "); - } - fprintf(logfp, " %s" RETCODE, tmpstr); - } - fprintf(logfp, RETCODE); - fclose_(logfp); - } - } - login_log("End of connection, unknown packet (ip: %s)" RETCODE, ip); - session[fd]->eof = 1; - return 0; - } - } - return 0; -} + if (RFIFOW (fd, 0) == 0x64) + { + login_log + ("Request for connection (non encryption mode) of %s (ip: %s)." + RETCODE, account.userid, ip); + } + else + { + login_log + ("Request for connection (encryption mode) of %s (ip: %s)." + RETCODE, account.userid, ip); + } + if (!check_ip (session[fd]->client_addr.sin_addr.s_addr)) + { + login_log + ("Connection refused: IP isn't authorised (deny/allow, ip: %s)." + RETCODE, ip); + WFIFOW (fd, 0) = 0x6a; + WFIFOB (fd, 2) = 0x03; + WFIFOSET (fd, 3); + RFIFOSKIP (fd, (RFIFOW (fd, 0) == 0x64) ? 55 : 47); + break; + } + + result = mmo_auth (&account, fd); + if (result == -1) + { + int gm_level = isGM (account.account_id); + if (min_level_to_connect > gm_level) + { + login_log + ("Connection refused: the minimum GM level for connection is %d (account: %s, GM level: %d, ip: %s)." + RETCODE, min_level_to_connect, account.userid, + gm_level, ip); + WFIFOW (fd, 0) = 0x81; + WFIFOL (fd, 2) = 1; // 01 = Server closed + WFIFOSET (fd, 3); + } + else + { + int version_2 = RFIFOB (fd, 54); // version 2 + + if (gm_level) + printf + ("Connection of the GM (level:%d) account '%s' accepted.\n", + gm_level, account.userid); + else + printf + ("Connection of the account '%s' accepted.\n", + account.userid); + + /* + * Add a 0x0063 packet, which contains the name of the update host. The packet will only + * be sent if login_athena.conf contains a non-null entry for "update_host:" + * + * Because older clients cannot handle the 0x63 packet, we check the "version 2" value + * from the incoming 0x64 packet (the byte at offset 54). If bit 0 of this is set, + * then the client can safely accept the 0x63 packet. The "version 2" value is not + * otherwise used by eAthena. + */ + if ((RFIFOW (fd, 0) == 0x64) + && (version_2 & VERSION_2_UPDATEHOST)) + { + host_len = (int) strlen (update_host); + if (host_len > 0) + { + WFIFOW (fd, 0) = 0x63; + WFIFOW (fd, 2) = 4 + host_len; + memcpy (WFIFOP (fd, 4), update_host, + host_len); + WFIFOSET (fd, 4 + host_len); + } + } + + // Load list of char servers into outbound packet + server_num = 0; + if (version_2 && VERSION_2_SERVERORDER) + for (i = 0; i < MAX_SERVERS; i++) + { + if (server_fd[i] >= 0) + { + if (lan_ip_check (p)) + WFIFOL (fd, 47 + server_num * 32) = + inet_addr (lan_char_ip); + else + WFIFOL (fd, 47 + server_num * 32) = + server[i].ip; + WFIFOW (fd, 47 + server_num * 32 + 4) = + server[i].port; + memcpy (WFIFOP + (fd, 47 + server_num * 32 + 6), + server[i].name, 20); + WFIFOW (fd, 47 + server_num * 32 + 26) = + server[i].users; + WFIFOW (fd, 47 + server_num * 32 + 28) = + server[i].maintenance; + WFIFOW (fd, 47 + server_num * 32 + 30) = + server[i].new; + server_num++; + } + } + else // Send them in reverse, as the client defaults to the second (!) one + for (i = MAX_SERVERS - 1; i >= 0; i--) + { + if (server_fd[i] >= 0) + { + if (lan_ip_check (p)) + WFIFOL (fd, 47 + server_num * 32) = + inet_addr (lan_char_ip); + else + WFIFOL (fd, 47 + server_num * 32) = + server[i].ip; + WFIFOW (fd, 47 + server_num * 32 + 4) = + server[i].port; + memcpy (WFIFOP + (fd, 47 + server_num * 32 + 6), + server[i].name, 20); + WFIFOW (fd, 47 + server_num * 32 + 26) = + server[i].users; + WFIFOW (fd, 47 + server_num * 32 + 28) = + server[i].maintenance; + WFIFOW (fd, 47 + server_num * 32 + 30) = + server[i].new; + server_num++; + } + } + // if at least 1 char-server + if (server_num > 0) + { + WFIFOW (fd, 0) = 0x69; + WFIFOW (fd, 2) = 47 + 32 * server_num; + WFIFOL (fd, 4) = account.login_id1; + WFIFOL (fd, 8) = account.account_id; + WFIFOL (fd, 12) = account.login_id2; + WFIFOL (fd, 16) = 0; // in old version, that was for ip (not more used) + memcpy (WFIFOP (fd, 20), account.lastlogin, 24); // in old version, that was for name (not more used) + WFIFOB (fd, 46) = account.sex; + WFIFOSET (fd, 47 + 32 * server_num); + if (auth_fifo_pos >= AUTH_FIFO_SIZE) + auth_fifo_pos = 0; + auth_fifo[auth_fifo_pos].account_id = + account.account_id; + auth_fifo[auth_fifo_pos].login_id1 = + account.login_id1; + auth_fifo[auth_fifo_pos].login_id2 = + account.login_id2; + auth_fifo[auth_fifo_pos].sex = account.sex; + auth_fifo[auth_fifo_pos].delflag = 0; + auth_fifo[auth_fifo_pos].ip = + session[fd]->client_addr.sin_addr.s_addr; + auth_fifo_pos++; + // if no char-server, don't send void list of servers, just disconnect the player with proper message + } + else + { + login_log + ("Connection refused: there is no char-server online (account: %s, ip: %s)." + RETCODE, account.userid, ip); + WFIFOW (fd, 0) = 0x81; + WFIFOL (fd, 2) = 1; // 01 = Server closed + WFIFOSET (fd, 3); + } + } + } + else + { + memset (WFIFOP (fd, 0), '\0', 23); + WFIFOW (fd, 0) = 0x6a; + WFIFOB (fd, 2) = result; + if (result == 6) + { // 6 = Your are Prohibited to log in until %s + i = search_account_index (account.userid); + if (i != -1) + { + if (auth_dat[i].ban_until_time != 0) + { // if account is banned, we send ban timestamp + char tmpstr[256]; + strftime (tmpstr, 20, date_format, + gmtime (&auth_dat + [i].ban_until_time)); + tmpstr[19] = '\0'; + memcpy (WFIFOP (fd, 3), tmpstr, 20); + } + else + { // we send error message + memcpy (WFIFOP (fd, 3), + auth_dat[i].error_message, 20); + } + } + } + WFIFOSET (fd, 23); + } + RFIFOSKIP (fd, (RFIFOW (fd, 0) == 0x64) ? 55 : 47); + break; + + case 0x01db: // Sending request of the coding key + case 0x791a: // Sending request of the coding key (administration packet) + { + struct login_session_data *ld; + if (session[fd]->session_data) + { + printf + ("login: abnormal request of MD5 key (already opened session).\n"); + session[fd]->eof = 1; + return 0; + } + ld = session[fd]->session_data = calloc (sizeof (*ld), 1); + if (!ld) + { + printf + ("login: Request for md5 key: memory allocation failure (malloc)!\n"); + session[fd]->eof = 1; + return 0; + } + if (RFIFOW (fd, 0) == 0x01db) + { + login_log ("Sending request of the coding key (ip: %s)" + RETCODE, ip); + } + else + { + login_log + ("'ladmin': Sending request of the coding key (ip: %s)" + RETCODE, ip); + } + // Creation of the coding key + memset (ld->md5key, '\0', sizeof (ld->md5key)); + ld->md5keylen = rand () % 4 + 12; + for (i = 0; i < ld->md5keylen; i++) + ld->md5key[i] = rand () % 255 + 1; + + RFIFOSKIP (fd, 2); + WFIFOW (fd, 0) = 0x01dc; + WFIFOW (fd, 2) = 4 + ld->md5keylen; + memcpy (WFIFOP (fd, 4), ld->md5key, ld->md5keylen); + WFIFOSET (fd, WFIFOW (fd, 2)); + } + break; + + case 0x2710: // Connection request of a char-server + if (RFIFOREST (fd) < 86) + return 0; + { + int GM_value, len; + unsigned char *server_name; + account.userid = RFIFOP (fd, 2); + account.userid[23] = '\0'; + remove_control_chars (account.userid); + account.passwd = RFIFOP (fd, 26); + account.passwd[23] = '\0'; + remove_control_chars (account.passwd); + account.passwdenc = 0; + server_name = RFIFOP (fd, 60); + server_name[19] = '\0'; + remove_control_chars (server_name); + login_log + ("Connection request of the char-server '%s' @ %d.%d.%d.%d:%d (ip: %s)" + RETCODE, server_name, RFIFOB (fd, 54), RFIFOB (fd, + 55), + RFIFOB (fd, 56), RFIFOB (fd, 57), RFIFOW (fd, 58), + ip); + result = mmo_auth (&account, fd); + + if (result == -1 && account.sex == 2) + { + // If this is the main server, and we don't already have a main server + if (server_fd[0] <= 0 + && strcmpi (server_name, main_server) == 0) + { + account.account_id = 0; + } + else + { + int i; + for (i = 1; i < MAX_SERVERS; i++) + { + if (server_fd[i] <= 0) + { + account.account_id = i; + break; + } + } + } + } + + if (result == -1 && account.sex == 2 + && account.account_id < MAX_SERVERS + && server_fd[account.account_id] == -1) + { + login_log + ("Connection of the char-server '%s' accepted (account: %s, pass: %s, ip: %s)" + RETCODE, server_name, account.userid, + account.passwd, ip); + printf + ("Connection of the char-server '%s' accepted.\n", + server_name); + memset (&server[account.account_id], 0, + sizeof (struct mmo_char_server)); + server[account.account_id].ip = RFIFOL (fd, 54); + server[account.account_id].port = RFIFOW (fd, 58); + memcpy (server[account.account_id].name, server_name, + 20); + server[account.account_id].users = 0; + server[account.account_id].maintenance = + RFIFOW (fd, 82); + server[account.account_id].new = RFIFOW (fd, 84); + server_fd[account.account_id] = fd; + if (anti_freeze_enable) + server_freezeflag[account.account_id] = 5; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed + WFIFOW (fd, 0) = 0x2711; + WFIFOB (fd, 2) = 0; + WFIFOSET (fd, 3); + session[fd]->func_parse = parse_fromchar; + realloc_fifo (fd, FIFOSIZE_SERVERLINK, + FIFOSIZE_SERVERLINK); + // send GM account to char-server + len = 4; + WFIFOW (fd, 0) = 0x2732; + for (i = 0; i < auth_num; i++) + // send only existing accounts. We can not create a GM account when server is online. + if ((GM_value = + isGM (auth_dat[i].account_id)) > 0) + { + WFIFOL (fd, len) = auth_dat[i].account_id; + WFIFOB (fd, len + 4) = + (unsigned char) GM_value; + len += 5; + } + WFIFOW (fd, 2) = len; + WFIFOSET (fd, len); + } + else + { + login_log + ("Connexion of the char-server '%s' REFUSED (account: %s, pass: %s, ip: %s)" + RETCODE, server_name, account.userid, + account.passwd, ip); + WFIFOW (fd, 0) = 0x2711; + WFIFOB (fd, 2) = 3; + WFIFOSET (fd, 3); + } + } + RFIFOSKIP (fd, 86); + return 0; + + case 0x7530: // Request of the server version + login_log ("Sending of the server version (ip: %s)" RETCODE, + ip); + WFIFOW (fd, 0) = 0x7531; + WFIFOB (fd, 2) = -1; + WFIFOB (fd, 3) = 'T'; + WFIFOB (fd, 4) = 'M'; + WFIFOB (fd, 5) = 'W'; + WFIFOB (fd, 6) = ' '; + WFIFOB (fd, 7) = 'e'; + WFIFOW (fd, 8) = 'A'; + WFIFOSET (fd, 10); + RFIFOSKIP (fd, 2); + break; + + case 0x7532: // Request to end connection + login_log ("End of connection (ip: %s)" RETCODE, ip); + session[fd]->eof = 1; + return 0; + + case 0x7918: // Request for administation login + if (RFIFOREST (fd) < 4 + || RFIFOREST (fd) < ((RFIFOW (fd, 2) == 0) ? 28 : 20)) + return 0; + WFIFOW (fd, 0) = 0x7919; + WFIFOB (fd, 2) = 1; + if (!check_ladminip + (session[fd]->client_addr.sin_addr.s_addr)) + { + login_log + ("'ladmin'-login: Connection in administration mode refused: IP isn't authorised (ladmin_allow, ip: %s)." + RETCODE, ip); + } + else + { + struct login_session_data *ld = session[fd]->session_data; + if (RFIFOW (fd, 2) == 0) + { // non encrypted password + unsigned char *password; + password = RFIFOP (fd, 4); + password[23] = '\0'; + remove_control_chars (password); + // If remote administration is enabled and password sent by client matches password read from login server configuration file + if ((admin_state == 1) + && (strcmp (password, admin_pass) == 0)) + { + login_log + ("'ladmin'-login: Connection in administration mode accepted (non encrypted password: %s, ip: %s)" + RETCODE, password, ip); + printf + ("Connection of a remote administration accepted (non encrypted password).\n"); + WFIFOB (fd, 2) = 0; + session[fd]->func_parse = parse_admin; + } + else if (admin_state != 1) + login_log + ("'ladmin'-login: Connection in administration mode REFUSED - remote administration is disabled (non encrypted password: %s, ip: %s)" + RETCODE, password, ip); + else + login_log + ("'ladmin'-login: Connection in administration mode REFUSED - invalid password (non encrypted password: %s, ip: %s)" + RETCODE, password, ip); + } + else + { // encrypted password + if (!ld) + printf + ("'ladmin'-login: error! MD5 key not created/requested for an administration login.\n"); + else + { + char md5str[64] = "", md5bin[32]; + if (RFIFOW (fd, 2) == 1) + { + strncpy (md5str, ld->md5key, sizeof (ld->md5key)); // 20 + strcat (md5str, admin_pass); // 24 + } + else if (RFIFOW (fd, 2) == 2) + { + strncpy (md5str, admin_pass, sizeof (admin_pass)); // 24 + strcat (md5str, ld->md5key); // 20 + } + MD5_String2binary (md5str, md5bin); + // If remote administration is enabled and password hash sent by client matches hash of password read from login server configuration file + if ((admin_state == 1) + && (memcmp (md5bin, RFIFOP (fd, 4), 16) == 0)) + { + login_log + ("'ladmin'-login: Connection in administration mode accepted (encrypted password, ip: %s)" + RETCODE, ip); + printf + ("Connection of a remote administration accepted (encrypted password).\n"); + WFIFOB (fd, 2) = 0; + session[fd]->func_parse = parse_admin; + } + else if (admin_state != 1) + login_log + ("'ladmin'-login: Connection in administration mode REFUSED - remote administration is disabled (encrypted password, ip: %s)" + RETCODE, ip); + else + login_log + ("'ladmin'-login: Connection in administration mode REFUSED - invalid password (encrypted password, ip: %s)" + RETCODE, ip); + } + } + } + WFIFOSET (fd, 3); + RFIFOSKIP (fd, (RFIFOW (fd, 2) == 0) ? 28 : 20); + break; + + default: + if (save_unknown_packets) + { + FILE *logfp; + char tmpstr[24]; + struct timeval tv; + logfp = fopen_ (login_log_unknown_packets_filename, "a"); + if (logfp) + { + gettimeofday (&tv, NULL); + strftime (tmpstr, 23, date_format, + gmtime (&(tv.tv_sec))); + fprintf (logfp, + "%s.%03d: receiving of an unknown packet -> disconnection" + RETCODE, tmpstr, (int) tv.tv_usec / 1000); + fprintf (logfp, + "parse_login: connection #%d (ip: %s), packet: 0x%x (with being read: %d)." + RETCODE, fd, ip, RFIFOW (fd, 0), + RFIFOREST (fd)); + fprintf (logfp, "Detail (in hex):" RETCODE); + fprintf (logfp, + "---- 00-01-02-03-04-05-06-07 08-09-0A-0B-0C-0D-0E-0F" + RETCODE); + memset (tmpstr, '\0', sizeof (tmpstr)); + for (i = 0; i < RFIFOREST (fd); i++) + { + if ((i & 15) == 0) + fprintf (logfp, "%04X ", i); + fprintf (logfp, "%02x ", RFIFOB (fd, i)); + if (RFIFOB (fd, i) > 0x1f) + tmpstr[i % 16] = RFIFOB (fd, i); + else + tmpstr[i % 16] = '.'; + if ((i - 7) % 16 == 0) // -8 + 1 + fprintf (logfp, " "); + else if ((i + 1) % 16 == 0) + { + fprintf (logfp, " %s" RETCODE, tmpstr); + memset (tmpstr, '\0', sizeof (tmpstr)); + } + } + if (i % 16 != 0) + { + for (j = i; j % 16 != 0; j++) + { + fprintf (logfp, " "); + if ((j - 7) % 16 == 0) // -8 + 1 + fprintf (logfp, " "); + } + fprintf (logfp, " %s" RETCODE, tmpstr); + } + fprintf (logfp, RETCODE); + fclose_ (logfp); + } + } + login_log ("End of connection, unknown packet (ip: %s)" + RETCODE, ip); + session[fd]->eof = 1; + return 0; + } + } + return 0; +} //------------------------------------------------- // Return numerical value of a switch configuration // on/off, english, franソスais, deutsch, espaソスol //------------------------------------------------- -int config_switch(const char *str) { - if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0) - return 1; - if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0) - return 0; - - return atoi(str); +int config_switch (const char *str) +{ + if (strcmpi (str, "on") == 0 || strcmpi (str, "yes") == 0 + || strcmpi (str, "oui") == 0 || strcmpi (str, "ja") == 0 + || strcmpi (str, "si") == 0) + return 1; + if (strcmpi (str, "off") == 0 || strcmpi (str, "no") == 0 + || strcmpi (str, "non") == 0 || strcmpi (str, "nein") == 0) + return 0; + + return atoi (str); } //---------------------------------- // Reading Lan Support configuration //---------------------------------- -int login_lan_config_read(const char *lancfgName) { - int j; - struct hostent * h = NULL; - char line[1024], w1[1024], w2[1024]; - FILE *fp; - - // set default configuration - strncpy(lan_char_ip, "127.0.0.1", sizeof(lan_char_ip)); - subneti[0] = 127; - subneti[1] = 0; - subneti[2] = 0; - subneti[3] = 1; - for(j = 0; j < 4; j++) - subnetmaski[j] = 255; - - fp = fopen_(lancfgName, "r"); - - if (fp == NULL) { - printf("***WARNING: LAN Support configuration file is not found: %s\n", lancfgName); - return 1; - } - - printf("---Start reading Lan Support configuration file\n"); - - while(fgets(line, sizeof(line)-1, fp)) { - if (line[0] == '/' && line[1] == '/') - continue; - - line[sizeof(line)-1] = '\0'; - if (sscanf(line,"%[^:]: %[^\r\n]", w1, w2) != 2) - continue; - - remove_control_chars(w1); - remove_control_chars(w2); - if (strcmpi(w1, "lan_char_ip") == 0) { // Read Char-Server Lan IP Address - h = gethostbyname(w2); - if (h != NULL) { - sprintf(lan_char_ip, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - } else { - strncpy(lan_char_ip, w2, sizeof(lan_char_ip)); - lan_char_ip[sizeof(lan_char_ip)-1] = '\0'; - } - printf("LAN IP of char-server: %s.\n", lan_char_ip); - } else if (strcmpi(w1, "subnet") == 0) { // Read Subnetwork - for(j = 0; j < 4; j++) - subneti[j] = 0; - h = gethostbyname(w2); - if (h != NULL) { - for(j = 0; j < 4; j++) - subneti[j] = (unsigned char)h->h_addr[j]; - } else { - sscanf(w2, "%d.%d.%d.%d", &subneti[0], &subneti[1], &subneti[2], &subneti[3]); - } - printf("Sub-network of the char-server: %d.%d.%d.%d.\n", subneti[0], subneti[1], subneti[2], subneti[3]); - } else if (strcmpi(w1, "subnetmask") == 0) { // Read Subnetwork Mask - for(j = 0; j < 4; j++) - subnetmaski[j] = 255; - h = gethostbyname(w2); - if (h != NULL) { - for(j = 0; j < 4; j++) - subnetmaski[j] = (unsigned char)h->h_addr[j]; - } else { - sscanf(w2, "%d.%d.%d.%d", &subnetmaski[0], &subnetmaski[1], &subnetmaski[2], &subnetmaski[3]); - } - printf("Sub-network mask of the char-server: %d.%d.%d.%d.\n", subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]); - } - } - fclose_(fp); - - // log the LAN configuration - login_log("The LAN configuration of the server is set:" RETCODE); - login_log("- with LAN IP of char-server: %s." RETCODE, lan_char_ip); - login_log("- with the sub-network of the char-server: %d.%d.%d.%d/%d.%d.%d.%d." RETCODE, - subneti[0], subneti[1], subneti[2], subneti[3], subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]); - - // sub-network check of the char-server - { - unsigned int a0, a1, a2, a3; - unsigned char p[4]; - sscanf(lan_char_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3); - p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3; - printf("LAN test of LAN IP of the char-server: "); - if (lan_ip_check(p) == 0) { - printf("\033[1;31m***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network\033[0m\n"); - login_log("***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network." RETCODE); - } - } - - printf("---End reading of Lan Support configuration file\n"); - - return 0; +int login_lan_config_read (const char *lancfgName) +{ + int j; + struct hostent *h = NULL; + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + // set default configuration + strncpy (lan_char_ip, "127.0.0.1", sizeof (lan_char_ip)); + subneti[0] = 127; + subneti[1] = 0; + subneti[2] = 0; + subneti[3] = 1; + for (j = 0; j < 4; j++) + subnetmaski[j] = 255; + + fp = fopen_ (lancfgName, "r"); + + if (fp == NULL) + { + printf + ("***WARNING: LAN Support configuration file is not found: %s\n", + lancfgName); + return 1; + } + + printf ("---Start reading Lan Support configuration file\n"); + + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + + line[sizeof (line) - 1] = '\0'; + if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) != 2) + continue; + + remove_control_chars (w1); + remove_control_chars (w2); + if (strcmpi (w1, "lan_char_ip") == 0) + { // Read Char-Server Lan IP Address + h = gethostbyname (w2); + if (h != NULL) + { + sprintf (lan_char_ip, "%d.%d.%d.%d", + (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + } + else + { + strncpy (lan_char_ip, w2, sizeof (lan_char_ip)); + lan_char_ip[sizeof (lan_char_ip) - 1] = '\0'; + } + printf ("LAN IP of char-server: %s.\n", lan_char_ip); + } + else if (strcmpi (w1, "subnet") == 0) + { // Read Subnetwork + for (j = 0; j < 4; j++) + subneti[j] = 0; + h = gethostbyname (w2); + if (h != NULL) + { + for (j = 0; j < 4; j++) + subneti[j] = (unsigned char) h->h_addr[j]; + } + else + { + sscanf (w2, "%d.%d.%d.%d", &subneti[0], &subneti[1], + &subneti[2], &subneti[3]); + } + printf ("Sub-network of the char-server: %d.%d.%d.%d.\n", + subneti[0], subneti[1], subneti[2], subneti[3]); + } + else if (strcmpi (w1, "subnetmask") == 0) + { // Read Subnetwork Mask + for (j = 0; j < 4; j++) + subnetmaski[j] = 255; + h = gethostbyname (w2); + if (h != NULL) + { + for (j = 0; j < 4; j++) + subnetmaski[j] = (unsigned char) h->h_addr[j]; + } + else + { + sscanf (w2, "%d.%d.%d.%d", &subnetmaski[0], &subnetmaski[1], + &subnetmaski[2], &subnetmaski[3]); + } + printf ("Sub-network mask of the char-server: %d.%d.%d.%d.\n", + subnetmaski[0], subnetmaski[1], subnetmaski[2], + subnetmaski[3]); + } + } + fclose_ (fp); + + // log the LAN configuration + login_log ("The LAN configuration of the server is set:" RETCODE); + login_log ("- with LAN IP of char-server: %s." RETCODE, lan_char_ip); + login_log + ("- with the sub-network of the char-server: %d.%d.%d.%d/%d.%d.%d.%d." + RETCODE, subneti[0], subneti[1], subneti[2], subneti[3], + subnetmaski[0], subnetmaski[1], subnetmaski[2], subnetmaski[3]); + + // sub-network check of the char-server + { + unsigned int a0, a1, a2, a3; + unsigned char p[4]; + sscanf (lan_char_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3); + p[0] = a0; + p[1] = a1; + p[2] = a2; + p[3] = a3; + printf ("LAN test of LAN IP of the char-server: "); + if (lan_ip_check (p) == 0) + { + printf + ("\033[1;31m***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network\033[0m\n"); + login_log + ("***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network." + RETCODE); + } + } + + printf ("---End reading of Lan Support configuration file\n"); + + return 0; } //----------------------------------- // Reading general configuration file //----------------------------------- -int login_config_read(const char *cfgName) { - char line[1024], w1[1024], w2[1024]; - FILE *fp; - - fp = fopen_(cfgName, "r"); - if (fp == NULL) { - printf("Configuration file (%s) not found.\n", cfgName); - return 1; - } - - printf("---Start reading of Login Server configuration file (%s)\n", cfgName); - while(fgets(line, sizeof(line)-1, fp)) { - if (line[0] == '/' && line[1] == '/') - continue; - - line[sizeof(line)-1] = '\0'; - if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) { - remove_control_chars(w1); - remove_control_chars(w2); - - if (strcmpi(w1, "admin_state") == 0) { - admin_state = config_switch(w2); - } else if (strcmpi(w1, "admin_pass") == 0) { - strncpy(admin_pass, w2, sizeof(admin_pass)); - admin_pass[sizeof(admin_pass)-1] = '\0'; - } else if (strcmpi(w1, "ladminallowip") == 0) { - if (strcmpi(w2, "clear") == 0) { - if (access_ladmin_allow) - free(access_ladmin_allow); - access_ladmin_allow = NULL; - access_ladmin_allownum = 0; - } else { - if (strcmpi(w2, "all") == 0) { - // reset all previous values - if (access_ladmin_allow) - free(access_ladmin_allow); - // set to all - access_ladmin_allow = calloc(ACO_STRSIZE, 1); - access_ladmin_allownum = 1; - access_ladmin_allow[0] = '\0'; - } else if (w2[0] && !(access_ladmin_allownum == 1 && access_ladmin_allow[0] == '\0')) { // don't add IP if already 'all' - if (access_ladmin_allow) - access_ladmin_allow = realloc(access_ladmin_allow, (access_ladmin_allownum+1) * ACO_STRSIZE); - else - access_ladmin_allow = calloc(ACO_STRSIZE, 1); - strncpy(access_ladmin_allow + (access_ladmin_allownum++) * ACO_STRSIZE, w2, ACO_STRSIZE); - access_ladmin_allow[access_ladmin_allownum * ACO_STRSIZE - 1] = '\0'; - } - } - } else if (strcmpi(w1, "gm_pass") == 0) { - strncpy(gm_pass, w2, sizeof(gm_pass)); - gm_pass[sizeof(gm_pass)-1] = '\0'; - } else if (strcmpi(w1, "level_new_gm") == 0) { - level_new_gm = atoi(w2); - } else if (strcmpi(w1, "new_account") == 0) { - new_account_flag = config_switch(w2); - } else if (strcmpi(w1, "login_port") == 0) { - login_port = atoi(w2); - } else if (strcmpi(w1, "account_filename") == 0) { - strncpy(account_filename, w2, sizeof(account_filename)); - account_filename[sizeof(account_filename)-1] = '\0'; - } else if (strcmpi(w1, "gm_account_filename") == 0) { - strncpy(GM_account_filename, w2, sizeof(GM_account_filename)); - GM_account_filename[sizeof(GM_account_filename)-1] = '\0'; - } else if (strcmpi(w1, "gm_account_filename_check_timer") == 0) { - gm_account_filename_check_timer = atoi(w2); - } else if (strcmpi(w1, "login_log_filename") == 0) { - strncpy(login_log_filename, w2, sizeof(login_log_filename)); - login_log_filename[sizeof(login_log_filename)-1] = '\0'; - } else if (strcmpi(w1, "login_log_unknown_packets_filename") == 0) { - strncpy(login_log_unknown_packets_filename, w2, sizeof(login_log_unknown_packets_filename)); - login_log_unknown_packets_filename[sizeof(login_log_unknown_packets_filename)-1] = '\0'; - } else if (strcmpi(w1, "save_unknown_packets") == 0) { - save_unknown_packets = config_switch(w2); - } else if (strcmpi(w1, "display_parse_login") == 0) { - display_parse_login = config_switch(w2); // 0: no, 1: yes - } else if (strcmpi(w1, "display_parse_admin") == 0) { - display_parse_admin = config_switch(w2); // 0: no, 1: yes - } else if (strcmpi(w1, "display_parse_fromchar") == 0) { - display_parse_fromchar = config_switch(w2); // 0: no, 1: yes (without packet 0x2714), 2: all packets - } else if (strcmpi(w1, "date_format") == 0) { // note: never have more than 19 char for the date! - switch (atoi(w2)) { - case 0: - strcpy(date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59 - break; - case 1: - strcpy(date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59 - break; - case 2: - strcpy(date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59 - break; - case 3: - strcpy(date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59 - break; - } - } else if (strcmpi(w1, "min_level_to_connect") == 0) { - min_level_to_connect = atoi(w2); - } else if (strcmpi(w1, "add_to_unlimited_account") == 0) { - add_to_unlimited_account = config_switch(w2); - } else if (strcmpi(w1, "start_limited_time") == 0) { - start_limited_time = atoi(w2); - } else if (strcmpi(w1, "check_ip_flag") == 0) { - check_ip_flag = config_switch(w2); - } else if (strcmpi(w1, "order") == 0) { - access_order = atoi(w2); - if (strcmpi(w2, "deny,allow") == 0 || - strcmpi(w2, "deny, allow") == 0) access_order = ACO_DENY_ALLOW; - if (strcmpi(w2, "allow,deny") == 0 || - strcmpi(w2, "allow, deny") == 0) access_order = ACO_ALLOW_DENY; - if (strcmpi(w2, "mutual-failture") == 0 || - strcmpi(w2, "mutual-failure") == 0) access_order = ACO_MUTUAL_FAILTURE; - } else if (strcmpi(w1, "allow") == 0) { - if (strcmpi(w2, "clear") == 0) { - if (access_allow) - free(access_allow); - access_allow = NULL; - access_allownum = 0; - } else { - if (strcmpi(w2, "all") == 0) { - // reset all previous values - if (access_allow) - free(access_allow); - // set to all - access_allow = calloc(ACO_STRSIZE, 1); - access_allownum = 1; - access_allow[0] = '\0'; - } else if (w2[0] && !(access_allownum == 1 && access_allow[0] == '\0')) { // don't add IP if already 'all' - if (access_allow) - access_allow = realloc(access_allow, (access_allownum+1) * ACO_STRSIZE); - else - access_allow = calloc(ACO_STRSIZE, 1); - strncpy(access_allow + (access_allownum++) * ACO_STRSIZE, w2, ACO_STRSIZE); - access_allow[access_allownum * ACO_STRSIZE - 1] = '\0'; - } - } - } else if (strcmpi(w1, "deny") == 0) { - if (strcmpi(w2, "clear") == 0) { - if (access_deny) - free(access_deny); - access_deny = NULL; - access_denynum = 0; - } else { - if (strcmpi(w2, "all") == 0) { - // reset all previous values - if (access_deny) - free(access_deny); - // set to all - access_deny = calloc(ACO_STRSIZE, 1); - access_denynum = 1; - access_deny[0] = '\0'; - } else if (w2[0] && !(access_denynum == 1 && access_deny[0] == '\0')) { // don't add IP if already 'all' - if (access_deny) - access_deny = realloc(access_deny, (access_denynum+1) * ACO_STRSIZE); - else - access_deny = calloc(ACO_STRSIZE, 1); - strncpy(access_deny + (access_denynum++) * ACO_STRSIZE, w2, ACO_STRSIZE); - access_deny[access_denynum * ACO_STRSIZE - 1] = '\0'; - } - } - } else if(strcmpi(w1,"anti_freeze_enable")==0){ - anti_freeze_enable = config_switch(w2); - } else if (strcmpi(w1, "anti_freeze_interval") == 0) { - ANTI_FREEZE_INTERVAL = atoi(w2); - if (ANTI_FREEZE_INTERVAL < 5) - ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds - } else if (strcmpi(w1, "import") == 0) { - login_config_read(w2); - } else if (strcmpi(w1, "update_host") == 0) { - strncpy(update_host, w2, sizeof(update_host)); - update_host[sizeof(update_host)-1] = '\0'; - } else if (strcmpi(w1, "main_server") == 0) { - strncpy(main_server, w2, sizeof(main_server)); - main_server[sizeof(main_server)-1] = '\0'; - } - } - } - fclose_(fp); - - printf("---End reading of Login Server configuration file.\n"); - - return 0; +int login_config_read (const char *cfgName) +{ + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + fp = fopen_ (cfgName, "r"); + if (fp == NULL) + { + printf ("Configuration file (%s) not found.\n", cfgName); + return 1; + } + + printf ("---Start reading of Login Server configuration file (%s)\n", + cfgName); + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + + line[sizeof (line) - 1] = '\0'; + if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) == 2) + { + remove_control_chars (w1); + remove_control_chars (w2); + + if (strcmpi (w1, "admin_state") == 0) + { + admin_state = config_switch (w2); + } + else if (strcmpi (w1, "admin_pass") == 0) + { + strncpy (admin_pass, w2, sizeof (admin_pass)); + admin_pass[sizeof (admin_pass) - 1] = '\0'; + } + else if (strcmpi (w1, "ladminallowip") == 0) + { + if (strcmpi (w2, "clear") == 0) + { + if (access_ladmin_allow) + free (access_ladmin_allow); + access_ladmin_allow = NULL; + access_ladmin_allownum = 0; + } + else + { + if (strcmpi (w2, "all") == 0) + { + // reset all previous values + if (access_ladmin_allow) + free (access_ladmin_allow); + // set to all + access_ladmin_allow = calloc (ACO_STRSIZE, 1); + access_ladmin_allownum = 1; + access_ladmin_allow[0] = '\0'; + } + else if (w2[0] + && !(access_ladmin_allownum == 1 + && access_ladmin_allow[0] == '\0')) + { // don't add IP if already 'all' + if (access_ladmin_allow) + access_ladmin_allow = + realloc (access_ladmin_allow, + (access_ladmin_allownum + + 1) * ACO_STRSIZE); + else + access_ladmin_allow = calloc (ACO_STRSIZE, 1); + strncpy (access_ladmin_allow + + (access_ladmin_allownum++) * ACO_STRSIZE, w2, + ACO_STRSIZE); + access_ladmin_allow[access_ladmin_allownum * + ACO_STRSIZE - 1] = '\0'; + } + } + } + else if (strcmpi (w1, "gm_pass") == 0) + { + strncpy (gm_pass, w2, sizeof (gm_pass)); + gm_pass[sizeof (gm_pass) - 1] = '\0'; + } + else if (strcmpi (w1, "level_new_gm") == 0) + { + level_new_gm = atoi (w2); + } + else if (strcmpi (w1, "new_account") == 0) + { + new_account_flag = config_switch (w2); + } + else if (strcmpi (w1, "login_port") == 0) + { + login_port = atoi (w2); + } + else if (strcmpi (w1, "account_filename") == 0) + { + strncpy (account_filename, w2, sizeof (account_filename)); + account_filename[sizeof (account_filename) - 1] = '\0'; + } + else if (strcmpi (w1, "gm_account_filename") == 0) + { + strncpy (GM_account_filename, w2, + sizeof (GM_account_filename)); + GM_account_filename[sizeof (GM_account_filename) - 1] = '\0'; + } + else if (strcmpi (w1, "gm_account_filename_check_timer") == 0) + { + gm_account_filename_check_timer = atoi (w2); + } + else if (strcmpi (w1, "login_log_filename") == 0) + { + strncpy (login_log_filename, w2, sizeof (login_log_filename)); + login_log_filename[sizeof (login_log_filename) - 1] = '\0'; + } + else if (strcmpi (w1, "login_log_unknown_packets_filename") == 0) + { + strncpy (login_log_unknown_packets_filename, w2, + sizeof (login_log_unknown_packets_filename)); + login_log_unknown_packets_filename[sizeof + (login_log_unknown_packets_filename) + - 1] = '\0'; + } + else if (strcmpi (w1, "save_unknown_packets") == 0) + { + save_unknown_packets = config_switch (w2); + } + else if (strcmpi (w1, "display_parse_login") == 0) + { + display_parse_login = config_switch (w2); // 0: no, 1: yes + } + else if (strcmpi (w1, "display_parse_admin") == 0) + { + display_parse_admin = config_switch (w2); // 0: no, 1: yes + } + else if (strcmpi (w1, "display_parse_fromchar") == 0) + { + display_parse_fromchar = config_switch (w2); // 0: no, 1: yes (without packet 0x2714), 2: all packets + } + else if (strcmpi (w1, "date_format") == 0) + { // note: never have more than 19 char for the date! + switch (atoi (w2)) + { + case 0: + strcpy (date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59 + break; + case 1: + strcpy (date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59 + break; + case 2: + strcpy (date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59 + break; + case 3: + strcpy (date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59 + break; + } + } + else if (strcmpi (w1, "min_level_to_connect") == 0) + { + min_level_to_connect = atoi (w2); + } + else if (strcmpi (w1, "add_to_unlimited_account") == 0) + { + add_to_unlimited_account = config_switch (w2); + } + else if (strcmpi (w1, "start_limited_time") == 0) + { + start_limited_time = atoi (w2); + } + else if (strcmpi (w1, "check_ip_flag") == 0) + { + check_ip_flag = config_switch (w2); + } + else if (strcmpi (w1, "order") == 0) + { + access_order = atoi (w2); + if (strcmpi (w2, "deny,allow") == 0 || + strcmpi (w2, "deny, allow") == 0) + access_order = ACO_DENY_ALLOW; + if (strcmpi (w2, "allow,deny") == 0 || + strcmpi (w2, "allow, deny") == 0) + access_order = ACO_ALLOW_DENY; + if (strcmpi (w2, "mutual-failture") == 0 || + strcmpi (w2, "mutual-failure") == 0) + access_order = ACO_MUTUAL_FAILTURE; + } + else if (strcmpi (w1, "allow") == 0) + { + if (strcmpi (w2, "clear") == 0) + { + if (access_allow) + free (access_allow); + access_allow = NULL; + access_allownum = 0; + } + else + { + if (strcmpi (w2, "all") == 0) + { + // reset all previous values + if (access_allow) + free (access_allow); + // set to all + access_allow = calloc (ACO_STRSIZE, 1); + access_allownum = 1; + access_allow[0] = '\0'; + } + else if (w2[0] + && !(access_allownum == 1 + && access_allow[0] == '\0')) + { // don't add IP if already 'all' + if (access_allow) + access_allow = + realloc (access_allow, + (access_allownum + 1) * ACO_STRSIZE); + else + access_allow = calloc (ACO_STRSIZE, 1); + strncpy (access_allow + + (access_allownum++) * ACO_STRSIZE, w2, + ACO_STRSIZE); + access_allow[access_allownum * ACO_STRSIZE - 1] = + '\0'; + } + } + } + else if (strcmpi (w1, "deny") == 0) + { + if (strcmpi (w2, "clear") == 0) + { + if (access_deny) + free (access_deny); + access_deny = NULL; + access_denynum = 0; + } + else + { + if (strcmpi (w2, "all") == 0) + { + // reset all previous values + if (access_deny) + free (access_deny); + // set to all + access_deny = calloc (ACO_STRSIZE, 1); + access_denynum = 1; + access_deny[0] = '\0'; + } + else if (w2[0] + && !(access_denynum == 1 + && access_deny[0] == '\0')) + { // don't add IP if already 'all' + if (access_deny) + access_deny = + realloc (access_deny, + (access_denynum + 1) * ACO_STRSIZE); + else + access_deny = calloc (ACO_STRSIZE, 1); + strncpy (access_deny + + (access_denynum++) * ACO_STRSIZE, w2, + ACO_STRSIZE); + access_deny[access_denynum * ACO_STRSIZE - 1] = '\0'; + } + } + } + else if (strcmpi (w1, "anti_freeze_enable") == 0) + { + anti_freeze_enable = config_switch (w2); + } + else if (strcmpi (w1, "anti_freeze_interval") == 0) + { + ANTI_FREEZE_INTERVAL = atoi (w2); + if (ANTI_FREEZE_INTERVAL < 5) + ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds + } + else if (strcmpi (w1, "import") == 0) + { + login_config_read (w2); + } + else if (strcmpi (w1, "update_host") == 0) + { + strncpy (update_host, w2, sizeof (update_host)); + update_host[sizeof (update_host) - 1] = '\0'; + } + else if (strcmpi (w1, "main_server") == 0) + { + strncpy (main_server, w2, sizeof (main_server)); + main_server[sizeof (main_server) - 1] = '\0'; + } + } + } + fclose_ (fp); + + printf ("---End reading of Login Server configuration file.\n"); + + return 0; } //------------------------------------- // Displaying of configuration warnings //------------------------------------- -void display_conf_warnings(void) { - if (admin_state != 0 && admin_state != 1) { - printf("***WARNING: Invalid value for admin_state parameter -> set to 0 (no remote admin).\n"); - admin_state = 0; - } - - if (admin_state == 1) { - if (admin_pass[0] == '\0') { - printf("***WARNING: Administrator password is void (admin_pass).\n"); - } else if (strcmp(admin_pass, "admin") == 0) { - printf("***WARNING: You are using the default administrator password (admin_pass).\n"); - printf(" We highly recommend that you change it.\n"); - } - } - - if (gm_pass[0] == '\0') { - printf("***WARNING: 'To GM become' password is void (gm_pass).\n"); - printf(" We highly recommend that you set one password.\n"); - } else if (strcmp(gm_pass, "gm") == 0) { - printf("***WARNING: You are using the default GM password (gm_pass).\n"); - printf(" We highly recommend that you change it.\n"); - } - - if (level_new_gm < 0 || level_new_gm > 99) { - printf("***WARNING: Invalid value for level_new_gm parameter -> set to 60 (default).\n"); - level_new_gm = 60; - } - - if (new_account_flag != 0 && new_account_flag != 1) { - printf("***WARNING: Invalid value for new_account parameter -> set to 0 (no new account).\n"); - new_account_flag = 0; - } - - if (login_port < 1024 || login_port > 65535) { - printf("***WARNING: Invalid value for login_port parameter -> set to 6900 (default).\n"); - login_port = 6900; - } - - if (gm_account_filename_check_timer < 0) { - printf("***WARNING: Invalid value for gm_account_filename_check_timer parameter.\n"); - printf(" -> set to 15 sec (default).\n"); - gm_account_filename_check_timer = 15; - } else if (gm_account_filename_check_timer == 1) { - printf("***WARNING: Invalid value for gm_account_filename_check_timer parameter.\n"); - printf(" -> set to 2 sec (minimum value).\n"); - gm_account_filename_check_timer = 2; - } - - if (save_unknown_packets != 0 && save_unknown_packets != 1) { - printf("WARNING: Invalid value for save_unknown_packets parameter -> set to 0-no save.\n"); - save_unknown_packets = 0; - } - - if (display_parse_login != 0 && display_parse_login != 1) { // 0: no, 1: yes - printf("***WARNING: Invalid value for display_parse_login parameter\n"); - printf(" -> set to 0 (no display).\n"); - display_parse_login = 0; - } - - if (display_parse_admin != 0 && display_parse_admin != 1) { // 0: no, 1: yes - printf("***WARNING: Invalid value for display_parse_admin parameter\n"); - printf(" -> set to 0 (no display).\n"); - display_parse_admin = 0; - } - - if (display_parse_fromchar < 0 || display_parse_fromchar > 2) { // 0: no, 1: yes (without packet 0x2714), 2: all packets - printf("***WARNING: Invalid value for display_parse_fromchar parameter\n"); - printf(" -> set to 0 (no display).\n"); - display_parse_fromchar = 0; - } - - if (min_level_to_connect < 0) { // 0: all players, 1-99 at least gm level x - printf("***WARNING: Invalid value for min_level_to_connect (%d) parameter\n", min_level_to_connect); - printf(" -> set to 0 (any player).\n"); - min_level_to_connect = 0; - } else if (min_level_to_connect > 99) { // 0: all players, 1-99 at least gm level x - printf("***WARNING: Invalid value for min_level_to_connect (%d) parameter\n", min_level_to_connect); - printf(" -> set to 99 (only GM level 99).\n"); - min_level_to_connect = 99; - } - - if (add_to_unlimited_account != 0 && add_to_unlimited_account != 1) { // 0: no, 1: yes - printf("***WARNING: Invalid value for add_to_unlimited_account parameter\n"); - printf(" -> set to 0 (impossible to add a time to an unlimited account).\n"); - add_to_unlimited_account = 0; - } - - if (start_limited_time < -1) { // -1: create unlimited account, 0 or more: additionnal sec from now to create limited time - printf("***WARNING: Invalid value for start_limited_time parameter\n"); - printf(" -> set to -1 (new accounts are created with unlimited time).\n"); - start_limited_time = -1; - } - - if (check_ip_flag != 0 && check_ip_flag != 1) { // 0: no, 1: yes - printf("***WARNING: Invalid value for check_ip_flag parameter\n"); - printf(" -> set to 1 (check players ip between login-server & char-server).\n"); - check_ip_flag = 1; - } - - if (access_order == ACO_DENY_ALLOW) { - if (access_denynum == 1 && access_deny[0] == '\0') { - printf("***WARNING: The IP security order is 'deny,allow' (allow if not deny).\n"); - printf(" And you refuse ALL IP.\n"); - } - } else if (access_order == ACO_ALLOW_DENY) { - if (access_allownum == 0) { - printf("***WARNING: The IP security order is 'allow,deny' (deny if not allow).\n"); - printf(" But, NO IP IS AUTHORISED!\n"); - } - } else { // ACO_MUTUAL_FAILTURE - if (access_allownum == 0) { - printf("***WARNING: The IP security order is 'mutual-failture'\n"); - printf(" (allow if in the allow list and not in the deny list).\n"); - printf(" But, NO IP IS AUTHORISED!\n"); - } else if (access_denynum == 1 && access_deny[0] == '\0') { - printf("***WARNING: The IP security order is mutual-failture\n"); - printf(" (allow if in the allow list and not in the deny list).\n"); - printf(" But, you refuse ALL IP!\n"); - } - } - - return; +void display_conf_warnings (void) +{ + if (admin_state != 0 && admin_state != 1) + { + printf + ("***WARNING: Invalid value for admin_state parameter -> set to 0 (no remote admin).\n"); + admin_state = 0; + } + + if (admin_state == 1) + { + if (admin_pass[0] == '\0') + { + printf + ("***WARNING: Administrator password is void (admin_pass).\n"); + } + else if (strcmp (admin_pass, "admin") == 0) + { + printf + ("***WARNING: You are using the default administrator password (admin_pass).\n"); + printf (" We highly recommend that you change it.\n"); + } + } + + if (gm_pass[0] == '\0') + { + printf ("***WARNING: 'To GM become' password is void (gm_pass).\n"); + printf + (" We highly recommend that you set one password.\n"); + } + else if (strcmp (gm_pass, "gm") == 0) + { + printf + ("***WARNING: You are using the default GM password (gm_pass).\n"); + printf (" We highly recommend that you change it.\n"); + } + + if (level_new_gm < 0 || level_new_gm > 99) + { + printf + ("***WARNING: Invalid value for level_new_gm parameter -> set to 60 (default).\n"); + level_new_gm = 60; + } + + if (new_account_flag != 0 && new_account_flag != 1) + { + printf + ("***WARNING: Invalid value for new_account parameter -> set to 0 (no new account).\n"); + new_account_flag = 0; + } + + if (login_port < 1024 || login_port > 65535) + { + printf + ("***WARNING: Invalid value for login_port parameter -> set to 6900 (default).\n"); + login_port = 6900; + } + + if (gm_account_filename_check_timer < 0) + { + printf + ("***WARNING: Invalid value for gm_account_filename_check_timer parameter.\n"); + printf (" -> set to 15 sec (default).\n"); + gm_account_filename_check_timer = 15; + } + else if (gm_account_filename_check_timer == 1) + { + printf + ("***WARNING: Invalid value for gm_account_filename_check_timer parameter.\n"); + printf (" -> set to 2 sec (minimum value).\n"); + gm_account_filename_check_timer = 2; + } + + if (save_unknown_packets != 0 && save_unknown_packets != 1) + { + printf + ("WARNING: Invalid value for save_unknown_packets parameter -> set to 0-no save.\n"); + save_unknown_packets = 0; + } + + if (display_parse_login != 0 && display_parse_login != 1) + { // 0: no, 1: yes + printf + ("***WARNING: Invalid value for display_parse_login parameter\n"); + printf (" -> set to 0 (no display).\n"); + display_parse_login = 0; + } + + if (display_parse_admin != 0 && display_parse_admin != 1) + { // 0: no, 1: yes + printf + ("***WARNING: Invalid value for display_parse_admin parameter\n"); + printf (" -> set to 0 (no display).\n"); + display_parse_admin = 0; + } + + if (display_parse_fromchar < 0 || display_parse_fromchar > 2) + { // 0: no, 1: yes (without packet 0x2714), 2: all packets + printf + ("***WARNING: Invalid value for display_parse_fromchar parameter\n"); + printf (" -> set to 0 (no display).\n"); + display_parse_fromchar = 0; + } + + if (min_level_to_connect < 0) + { // 0: all players, 1-99 at least gm level x + printf + ("***WARNING: Invalid value for min_level_to_connect (%d) parameter\n", + min_level_to_connect); + printf (" -> set to 0 (any player).\n"); + min_level_to_connect = 0; + } + else if (min_level_to_connect > 99) + { // 0: all players, 1-99 at least gm level x + printf + ("***WARNING: Invalid value for min_level_to_connect (%d) parameter\n", + min_level_to_connect); + printf (" -> set to 99 (only GM level 99).\n"); + min_level_to_connect = 99; + } + + if (add_to_unlimited_account != 0 && add_to_unlimited_account != 1) + { // 0: no, 1: yes + printf + ("***WARNING: Invalid value for add_to_unlimited_account parameter\n"); + printf + (" -> set to 0 (impossible to add a time to an unlimited account).\n"); + add_to_unlimited_account = 0; + } + + if (start_limited_time < -1) + { // -1: create unlimited account, 0 or more: additionnal sec from now to create limited time + printf + ("***WARNING: Invalid value for start_limited_time parameter\n"); + printf + (" -> set to -1 (new accounts are created with unlimited time).\n"); + start_limited_time = -1; + } + + if (check_ip_flag != 0 && check_ip_flag != 1) + { // 0: no, 1: yes + printf ("***WARNING: Invalid value for check_ip_flag parameter\n"); + printf + (" -> set to 1 (check players ip between login-server & char-server).\n"); + check_ip_flag = 1; + } + + if (access_order == ACO_DENY_ALLOW) + { + if (access_denynum == 1 && access_deny[0] == '\0') + { + printf + ("***WARNING: The IP security order is 'deny,allow' (allow if not deny).\n"); + printf (" And you refuse ALL IP.\n"); + } + } + else if (access_order == ACO_ALLOW_DENY) + { + if (access_allownum == 0) + { + printf + ("***WARNING: The IP security order is 'allow,deny' (deny if not allow).\n"); + printf (" But, NO IP IS AUTHORISED!\n"); + } + } + else + { // ACO_MUTUAL_FAILTURE + if (access_allownum == 0) + { + printf + ("***WARNING: The IP security order is 'mutual-failture'\n"); + printf + (" (allow if in the allow list and not in the deny list).\n"); + printf (" But, NO IP IS AUTHORISED!\n"); + } + else if (access_denynum == 1 && access_deny[0] == '\0') + { + printf ("***WARNING: The IP security order is mutual-failture\n"); + printf + (" (allow if in the allow list and not in the deny list).\n"); + printf (" But, you refuse ALL IP!\n"); + } + } + + return; } //------------------------------- // Save configuration in log file //------------------------------- -void save_config_in_log(void) { - int i; - - // a newline in the log... - login_log(""); - login_log("The login-server starting..." RETCODE); - - // save configuration in log file - login_log("The configuration of the server is set:" RETCODE); - - if (admin_state != 1) - login_log("- with no remote administration." RETCODE); - else if (admin_pass[0] == '\0') - login_log("- with a remote administration with a VOID password." RETCODE); - else if (strcmp(admin_pass, "admin") == 0) - login_log("- with a remote administration with the DEFAULT password." RETCODE); - else - login_log("- with a remote administration with the password of %d character(s)." RETCODE, strlen(admin_pass)); - if (access_ladmin_allownum == 0 || (access_ladmin_allownum == 1 && access_ladmin_allow[0] == '\0')) { - login_log("- to accept any IP for remote administration" RETCODE); - } else { - login_log("- to accept following IP for remote administration:" RETCODE); - for(i = 0; i < access_ladmin_allownum; i++) - login_log(" %s" RETCODE, (char *)(access_ladmin_allow + i * ACO_STRSIZE)); - } - - if (gm_pass[0] == '\0') - login_log("- with a VOID 'To GM become' password (gm_pass)." RETCODE); - else if (strcmp(gm_pass, "gm") == 0) - login_log("- with the DEFAULT 'To GM become' password (gm_pass)." RETCODE); - else - login_log("- with a 'To GM become' password (gm_pass) of %d character(s)." RETCODE, strlen(gm_pass)); - if (level_new_gm == 0) - login_log("- to refuse any creation of GM with @gm." RETCODE); - else - login_log("- to create GM with level '%d' when @gm is used." RETCODE, level_new_gm); - - if (new_account_flag == 1) - login_log("- to ALLOW new users (with _F/_M)." RETCODE); - else - login_log("- to NOT ALLOW new users (with _F/_M)." RETCODE); - login_log("- with port: %d." RETCODE, login_port); - login_log("- with the accounts file name: '%s'." RETCODE, account_filename); - login_log("- with the GM accounts file name: '%s'." RETCODE, GM_account_filename); - if (gm_account_filename_check_timer == 0) - login_log("- to NOT check GM accounts file modifications." RETCODE); - else - login_log("- to check GM accounts file modifications every %d seconds." RETCODE, gm_account_filename_check_timer); - - // not necessary to log the 'login_log_filename', we are inside :) - - login_log("- with the unknown packets file name: '%s'." RETCODE, login_log_unknown_packets_filename); - if (save_unknown_packets) - login_log("- to SAVE all unkown packets." RETCODE); - else - login_log("- to SAVE only unkown packets sending by a char-server or a remote administration." RETCODE); - if (display_parse_login) - login_log("- to display normal parse packets on console." RETCODE); - else - login_log("- to NOT display normal parse packets on console." RETCODE); - if (display_parse_admin) - login_log("- to display administration parse packets on console." RETCODE); - else - login_log("- to NOT display administration parse packets on console." RETCODE); - if (display_parse_fromchar) - login_log("- to display char-server parse packets on console." RETCODE); - else - login_log("- to NOT display char-server parse packets on console." RETCODE); - - if (min_level_to_connect == 0) // 0: all players, 1-99 at least gm level x - login_log("- with no minimum level for connection." RETCODE); - else if (min_level_to_connect == 99) - login_log("- to accept only GM with level 99." RETCODE); - else - login_log("- to accept only GM with level %d or more." RETCODE, min_level_to_connect); - - if (add_to_unlimited_account) - login_log("- to authorize adjustment (with timeadd ladmin) on an unlimited account." RETCODE); - else - login_log("- to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before." RETCODE); - - if (start_limited_time < 0) - login_log("- to create new accounts with an unlimited time." RETCODE); - else if (start_limited_time == 0) - login_log("- to create new accounts with a limited time: time of creation." RETCODE); - else - login_log("- to create new accounts with a limited time: time of creation + %d second(s)." RETCODE, start_limited_time); - - if (check_ip_flag) - login_log("- with control of players IP between login-server and char-server." RETCODE); - else - login_log("- to not check players IP between login-server and char-server." RETCODE); - - if (access_order == ACO_DENY_ALLOW) { - if (access_denynum == 0) { - login_log("- with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP." RETCODE); - } else if (access_denynum == 1 && access_deny[0] == '\0') { - login_log("- with the IP security order: 'deny,allow' (allow if not deny). You refuse ALL IP." RETCODE); - } else { - login_log("- with the IP security order: 'deny,allow' (allow if not deny). Refused IP are:" RETCODE); - for(i = 0; i < access_denynum; i++) - login_log(" %s" RETCODE, (char *)(access_deny + i * ACO_STRSIZE)); - } - } else if (access_order == ACO_ALLOW_DENY) { - if (access_allownum == 0) { - login_log("- with the IP security order: 'allow,deny' (deny if not allow). But, NO IP IS AUTHORISED!" RETCODE); - } else if (access_allownum == 1 && access_allow[0] == '\0') { - login_log("- with the IP security order: 'allow,deny' (deny if not allow). You authorise ALL IP." RETCODE); - } else { - login_log("- with the IP security order: 'allow,deny' (deny if not allow). Authorised IP are:" RETCODE); - for(i = 0; i < access_allownum; i++) - login_log(" %s" RETCODE, (char *)(access_allow + i * ACO_STRSIZE)); - } - } else { // ACO_MUTUAL_FAILTURE - login_log("- with the IP security order: 'mutual-failture' (allow if in the allow list and not in the deny list)." RETCODE); - if (access_allownum == 0) { - login_log(" But, NO IP IS AUTHORISED!" RETCODE); - } else if (access_denynum == 1 && access_deny[0] == '\0') { - login_log(" But, you refuse ALL IP!" RETCODE); - } else { - if (access_allownum == 1 && access_allow[0] == '\0') { - login_log(" You authorise ALL IP." RETCODE); - } else { - login_log(" Authorised IP are:" RETCODE); - for(i = 0; i < access_allownum; i++) - login_log(" %s" RETCODE, (char *)(access_allow + i * ACO_STRSIZE)); - } - login_log(" Refused IP are:" RETCODE); - for(i = 0; i < access_denynum; i++) - login_log(" %s" RETCODE, (char *)(access_deny + i * ACO_STRSIZE)); - } - } +void save_config_in_log (void) +{ + int i; + + // a newline in the log... + login_log (""); + login_log ("The login-server starting..." RETCODE); + + // save configuration in log file + login_log ("The configuration of the server is set:" RETCODE); + + if (admin_state != 1) + login_log ("- with no remote administration." RETCODE); + else if (admin_pass[0] == '\0') + login_log ("- with a remote administration with a VOID password." + RETCODE); + else if (strcmp (admin_pass, "admin") == 0) + login_log ("- with a remote administration with the DEFAULT password." + RETCODE); + else + login_log + ("- with a remote administration with the password of %d character(s)." + RETCODE, strlen (admin_pass)); + if (access_ladmin_allownum == 0 + || (access_ladmin_allownum == 1 && access_ladmin_allow[0] == '\0')) + { + login_log ("- to accept any IP for remote administration" RETCODE); + } + else + { + login_log ("- to accept following IP for remote administration:" + RETCODE); + for (i = 0; i < access_ladmin_allownum; i++) + login_log (" %s" RETCODE, + (char *) (access_ladmin_allow + i * ACO_STRSIZE)); + } + + if (gm_pass[0] == '\0') + login_log ("- with a VOID 'To GM become' password (gm_pass)." + RETCODE); + else if (strcmp (gm_pass, "gm") == 0) + login_log ("- with the DEFAULT 'To GM become' password (gm_pass)." + RETCODE); + else + login_log + ("- with a 'To GM become' password (gm_pass) of %d character(s)." + RETCODE, strlen (gm_pass)); + if (level_new_gm == 0) + login_log ("- to refuse any creation of GM with @gm." RETCODE); + else + login_log ("- to create GM with level '%d' when @gm is used." RETCODE, + level_new_gm); + + if (new_account_flag == 1) + login_log ("- to ALLOW new users (with _F/_M)." RETCODE); + else + login_log ("- to NOT ALLOW new users (with _F/_M)." RETCODE); + login_log ("- with port: %d." RETCODE, login_port); + login_log ("- with the accounts file name: '%s'." RETCODE, + account_filename); + login_log ("- with the GM accounts file name: '%s'." RETCODE, + GM_account_filename); + if (gm_account_filename_check_timer == 0) + login_log ("- to NOT check GM accounts file modifications." RETCODE); + else + login_log + ("- to check GM accounts file modifications every %d seconds." + RETCODE, gm_account_filename_check_timer); + + // not necessary to log the 'login_log_filename', we are inside :) + + login_log ("- with the unknown packets file name: '%s'." RETCODE, + login_log_unknown_packets_filename); + if (save_unknown_packets) + login_log ("- to SAVE all unkown packets." RETCODE); + else + login_log + ("- to SAVE only unkown packets sending by a char-server or a remote administration." + RETCODE); + if (display_parse_login) + login_log ("- to display normal parse packets on console." RETCODE); + else + login_log ("- to NOT display normal parse packets on console." + RETCODE); + if (display_parse_admin) + login_log ("- to display administration parse packets on console." + RETCODE); + else + login_log ("- to NOT display administration parse packets on console." + RETCODE); + if (display_parse_fromchar) + login_log ("- to display char-server parse packets on console." + RETCODE); + else + login_log ("- to NOT display char-server parse packets on console." + RETCODE); + + if (min_level_to_connect == 0) // 0: all players, 1-99 at least gm level x + login_log ("- with no minimum level for connection." RETCODE); + else if (min_level_to_connect == 99) + login_log ("- to accept only GM with level 99." RETCODE); + else + login_log ("- to accept only GM with level %d or more." RETCODE, + min_level_to_connect); + + if (add_to_unlimited_account) + login_log + ("- to authorize adjustment (with timeadd ladmin) on an unlimited account." + RETCODE); + else + login_log + ("- to refuse adjustment (with timeadd ladmin) on an unlimited account. You must use timeset (ladmin command) before." + RETCODE); + + if (start_limited_time < 0) + login_log ("- to create new accounts with an unlimited time." + RETCODE); + else if (start_limited_time == 0) + login_log + ("- to create new accounts with a limited time: time of creation." + RETCODE); + else + login_log + ("- to create new accounts with a limited time: time of creation + %d second(s)." + RETCODE, start_limited_time); + + if (check_ip_flag) + login_log + ("- with control of players IP between login-server and char-server." + RETCODE); + else + login_log + ("- to not check players IP between login-server and char-server." + RETCODE); + + if (access_order == ACO_DENY_ALLOW) + { + if (access_denynum == 0) + { + login_log + ("- with the IP security order: 'deny,allow' (allow if not deny). You refuse no IP." + RETCODE); + } + else if (access_denynum == 1 && access_deny[0] == '\0') + { + login_log + ("- with the IP security order: 'deny,allow' (allow if not deny). You refuse ALL IP." + RETCODE); + } + else + { + login_log + ("- with the IP security order: 'deny,allow' (allow if not deny). Refused IP are:" + RETCODE); + for (i = 0; i < access_denynum; i++) + login_log (" %s" RETCODE, + (char *) (access_deny + i * ACO_STRSIZE)); + } + } + else if (access_order == ACO_ALLOW_DENY) + { + if (access_allownum == 0) + { + login_log + ("- with the IP security order: 'allow,deny' (deny if not allow). But, NO IP IS AUTHORISED!" + RETCODE); + } + else if (access_allownum == 1 && access_allow[0] == '\0') + { + login_log + ("- with the IP security order: 'allow,deny' (deny if not allow). You authorise ALL IP." + RETCODE); + } + else + { + login_log + ("- with the IP security order: 'allow,deny' (deny if not allow). Authorised IP are:" + RETCODE); + for (i = 0; i < access_allownum; i++) + login_log (" %s" RETCODE, + (char *) (access_allow + i * ACO_STRSIZE)); + } + } + else + { // ACO_MUTUAL_FAILTURE + login_log + ("- with the IP security order: 'mutual-failture' (allow if in the allow list and not in the deny list)." + RETCODE); + if (access_allownum == 0) + { + login_log (" But, NO IP IS AUTHORISED!" RETCODE); + } + else if (access_denynum == 1 && access_deny[0] == '\0') + { + login_log (" But, you refuse ALL IP!" RETCODE); + } + else + { + if (access_allownum == 1 && access_allow[0] == '\0') + { + login_log (" You authorise ALL IP." RETCODE); + } + else + { + login_log (" Authorised IP are:" RETCODE); + for (i = 0; i < access_allownum; i++) + login_log (" %s" RETCODE, + (char *) (access_allow + i * ACO_STRSIZE)); + } + login_log (" Refused IP are:" RETCODE); + for (i = 0; i < access_denynum; i++) + login_log (" %s" RETCODE, + (char *) (access_deny + i * ACO_STRSIZE)); + } + } } //-------------------------------------- // Function called at exit of the server //-------------------------------------- -void do_final(void) { - int i, fd; - - mmo_auth_sync(); - - free(auth_dat); - free(gm_account_db); - for (i = 0; i < MAX_SERVERS; i++) { - if ((fd = server_fd[i]) >= 0) - delete_session(fd); - } - delete_session(login_fd); - - login_log("----End of login-server (normal end with closing of all files)." RETCODE); +void do_final (void) +{ + int i, fd; + + mmo_auth_sync (); + + free (auth_dat); + free (gm_account_db); + for (i = 0; i < MAX_SERVERS; i++) + { + if ((fd = server_fd[i]) >= 0) + delete_session (fd); + } + delete_session (login_fd); + + login_log + ("----End of login-server (normal end with closing of all files)." + RETCODE); } //------------------------------ // Main function of login-server //------------------------------ -int do_init(int argc, char **argv) { - int i, j; - - // read login-server configuration - login_config_read((argc > 1) ? argv[1] : LOGIN_CONF_NAME); - display_conf_warnings(); // not in login_config_read, because we can use 'import' option, and display same message twice or more - save_config_in_log(); // not before, because log file name can be changed - login_lan_config_read((argc > 1) ? argv[1] : LAN_CONF_NAME); - - for(i = 0; i< AUTH_FIFO_SIZE; i++) - auth_fifo[i].delflag = 1; - for(i = 0; i < MAX_SERVERS; i++) - server_fd[i] = -1; - - gm_account_db = numdb_init(); - - read_gm_account(); - mmo_auth_init(); - set_termfunc(mmo_auth_sync); - set_defaultparse(parse_login); - login_fd = make_listen_port(login_port); - - add_timer_func_list(check_auth_sync, "check_auth_sync"); - - i = add_timer_interval(gettick() + 60000, check_auth_sync, 0, 0, 60000); // every 60 sec we check if we must save accounts file (only if necessary to save) - - if(anti_freeze_enable > 0) { - add_timer_func_list(char_anti_freeze_system, "char_anti_freeze_system"); - i = add_timer_interval(gettick() + 1000, char_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000); - } - - // add timer to check GM accounts file modification - j = gm_account_filename_check_timer; - if (j == 0) // if we would not to check, we check every 60 sec, just to have timer (if we change timer, is was not necessary to check if timer already exists) - j = 60; - add_timer_func_list(check_GM_file, "check_GM_file"); - i = add_timer_interval(gettick() + j * 1000, check_GM_file, 0, 0, j * 1000); // every x sec we check if gm file has been changed - - login_log("The login-server is ready (Server is listening on the port %d)." RETCODE, login_port); - - printf("The login-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", login_port); - - atexit(do_final); - return 0; +int do_init (int argc, char **argv) +{ + int i, j; + + // read login-server configuration + login_config_read ((argc > 1) ? argv[1] : LOGIN_CONF_NAME); + display_conf_warnings (); // not in login_config_read, because we can use 'import' option, and display same message twice or more + save_config_in_log (); // not before, because log file name can be changed + login_lan_config_read ((argc > 1) ? argv[1] : LAN_CONF_NAME); + + for (i = 0; i < AUTH_FIFO_SIZE; i++) + auth_fifo[i].delflag = 1; + for (i = 0; i < MAX_SERVERS; i++) + server_fd[i] = -1; + + gm_account_db = numdb_init (); + + read_gm_account (); + mmo_auth_init (); + set_termfunc (mmo_auth_sync); + set_defaultparse (parse_login); + login_fd = make_listen_port (login_port); + + add_timer_func_list (check_auth_sync, "check_auth_sync"); + + i = add_timer_interval (gettick () + 60000, check_auth_sync, 0, 0, 60000); // every 60 sec we check if we must save accounts file (only if necessary to save) + + if (anti_freeze_enable > 0) + { + add_timer_func_list (char_anti_freeze_system, + "char_anti_freeze_system"); + i = add_timer_interval (gettick () + 1000, char_anti_freeze_system, 0, + 0, ANTI_FREEZE_INTERVAL * 1000); + } + + // add timer to check GM accounts file modification + j = gm_account_filename_check_timer; + if (j == 0) // if we would not to check, we check every 60 sec, just to have timer (if we change timer, is was not necessary to check if timer already exists) + j = 60; + add_timer_func_list (check_GM_file, "check_GM_file"); + i = add_timer_interval (gettick () + j * 1000, check_GM_file, 0, 0, j * 1000); // every x sec we check if gm file has been changed + + login_log + ("The login-server is ready (Server is listening on the port %d)." + RETCODE, login_port); + + printf + ("The login-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", + login_port); + + atexit (do_final); + return 0; } - - diff --git a/src/login/login.h b/src/login/login.h index 3a8a6d5..f28afeb 100644 --- a/src/login/login.h +++ b/src/login/login.h @@ -6,33 +6,35 @@ #define LOGIN_CONF_NAME "conf/login_athena.conf" #define LAN_CONF_NAME "conf/lan_support.conf" -#define PASSWORDENC 3 // A definition is given when making an encryption password correspond. - // It is 1 at the time of passwordencrypt. - // It is made into 2 at the time of passwordencrypt2. - // When it is made 3, it corresponds to both. +#define PASSWORDENC 3 // A definition is given when making an encryption password correspond. + // It is 1 at the time of passwordencrypt. + // It is made into 2 at the time of passwordencrypt2. + // When it is made 3, it corresponds to both. #define START_ACCOUNT_NUM 2000000 #define END_ACCOUNT_NUM 100000000 -struct mmo_account { - char* userid; - char* passwd; - int passwdenc; +struct mmo_account +{ + char *userid; + char *passwd; + int passwdenc; - long account_id; - long login_id1; - long login_id2; - long char_id; - char lastlogin[24]; - int sex; + long account_id; + long login_id1; + long login_id2; + long char_id; + char lastlogin[24]; + int sex; }; -struct mmo_char_server { - char name[20]; - long ip; - short port; - int users; - int maintenance; - int new; +struct mmo_char_server +{ + char name[20]; + long ip; + short port; + int users; + int maintenance; + int new; }; #endif diff --git a/src/login/md5calc.c b/src/login/md5calc.c index 96bfc34..8e6df2c 100644 --- a/src/login/md5calc.c +++ b/src/login/md5calc.c @@ -20,198 +20,255 @@ static unsigned int *pX; // Stirng Table static const unsigned int T[] = { - 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0 - 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4 - 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8 - 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12 - 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16 - 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20 - 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24 - 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28 - 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32 - 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36 - 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40 - 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44 - 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48 - 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52 - 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56 - 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60 + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0 + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4 + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8 + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12 + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16 + 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20 + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24 + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28 + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32 + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36 + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40 + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44 + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48 + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52 + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56 + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60 }; // ROTATE_LEFT The left is made to rotate x [ n-bit ]. This is diverted as it is from RFC. #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) // The function used for other calculation -static unsigned int F(unsigned int X, unsigned int Y, unsigned int Z) +static unsigned int F (unsigned int X, unsigned int Y, unsigned int Z) { - return (X & Y) | (~X & Z); + return (X & Y) | (~X & Z); } -static unsigned int G(unsigned int X, unsigned int Y, unsigned int Z) + +static unsigned int G (unsigned int X, unsigned int Y, unsigned int Z) { - return (X & Z) | (Y & ~Z); + return (X & Z) | (Y & ~Z); } -static unsigned int H(unsigned int X, unsigned int Y, unsigned int Z) + +static unsigned int H (unsigned int X, unsigned int Y, unsigned int Z) { - return X ^ Y ^ Z; + return X ^ Y ^ Z; } -static unsigned int I(unsigned int X, unsigned int Y, unsigned int Z) + +static unsigned int I (unsigned int X, unsigned int Y, unsigned int Z) { - return Y ^ (X | ~Z); + return Y ^ (X | ~Z); } -static unsigned int Round(unsigned int a, unsigned int b, unsigned int FGHI, - unsigned int k, unsigned int s, unsigned int i) +static unsigned int Round (unsigned int a, unsigned int b, unsigned int FGHI, + unsigned int k, unsigned int s, unsigned int i) { - return b + ROTATE_LEFT(a + FGHI + pX[k] + T[i], s); + return b + ROTATE_LEFT (a + FGHI + pX[k] + T[i], s); } -static void Round1(unsigned int *a, unsigned int b, unsigned int c, - unsigned int d,unsigned int k, unsigned int s, unsigned int i) +static void Round1 (unsigned int *a, unsigned int b, unsigned int c, + unsigned int d, unsigned int k, unsigned int s, + unsigned int i) { - *a = Round(*a, b, F(b,c,d), k, s, i); + *a = Round (*a, b, F (b, c, d), k, s, i); } -static void Round2(unsigned int *a, unsigned int b, unsigned int c, - unsigned int d,unsigned int k, unsigned int s, unsigned int i) + +static void Round2 (unsigned int *a, unsigned int b, unsigned int c, + unsigned int d, unsigned int k, unsigned int s, + unsigned int i) { - *a = Round(*a, b, G(b,c,d), k, s, i); + *a = Round (*a, b, G (b, c, d), k, s, i); } -static void Round3(unsigned int *a, unsigned int b, unsigned int c, - unsigned int d,unsigned int k, unsigned int s, unsigned int i) + +static void Round3 (unsigned int *a, unsigned int b, unsigned int c, + unsigned int d, unsigned int k, unsigned int s, + unsigned int i) { - *a = Round(*a, b, H(b,c,d), k, s, i); + *a = Round (*a, b, H (b, c, d), k, s, i); } -static void Round4(unsigned int *a, unsigned int b, unsigned int c, - unsigned int d,unsigned int k, unsigned int s, unsigned int i) + +static void Round4 (unsigned int *a, unsigned int b, unsigned int c, + unsigned int d, unsigned int k, unsigned int s, + unsigned int i) { - *a = Round(*a, b, I(b,c,d), k, s, i); + *a = Round (*a, b, I (b, c, d), k, s, i); } -static void MD5_Round_Calculate(const unsigned char *block, - unsigned int *A2, unsigned int *B2, unsigned int *C2, unsigned int *D2) +static void MD5_Round_Calculate (const unsigned char *block, + unsigned int *A2, unsigned int *B2, + unsigned int *C2, unsigned int *D2) { - //create X It is since it is required. - unsigned int X[16]; //512bit 64byte - int j,k; - - //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D) - unsigned int A=*A2, B=*B2, C=*C2, D=*D2; - unsigned int AA = A,BB = B,CC = C,DD = D; - - //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4 - pX = X; - - //Copy block(padding_message) i into X - for (j=0,k=0; j<64; j+=4,k++) - X[k] = ( (unsigned int )block[j] ) // 8byte*4 -> 32byte conversion - | ( ((unsigned int )block[j+1]) << 8 ) // A function called Decode as used in the field of RFC - | ( ((unsigned int )block[j+2]) << 16 ) - | ( ((unsigned int )block[j+3]) << 24 ); - - - //Round 1 - Round1(&A,B,C,D, 0, 7, 0); Round1(&D,A,B,C, 1, 12, 1); Round1(&C,D,A,B, 2, 17, 2); Round1(&B,C,D,A, 3, 22, 3); - Round1(&A,B,C,D, 4, 7, 4); Round1(&D,A,B,C, 5, 12, 5); Round1(&C,D,A,B, 6, 17, 6); Round1(&B,C,D,A, 7, 22, 7); - Round1(&A,B,C,D, 8, 7, 8); Round1(&D,A,B,C, 9, 12, 9); Round1(&C,D,A,B, 10, 17, 10); Round1(&B,C,D,A, 11, 22, 11); - Round1(&A,B,C,D, 12, 7, 12); Round1(&D,A,B,C, 13, 12, 13); Round1(&C,D,A,B, 14, 17, 14); Round1(&B,C,D,A, 15, 22, 15); - - //Round 2 - Round2(&A,B,C,D, 1, 5, 16); Round2(&D,A,B,C, 6, 9, 17); Round2(&C,D,A,B, 11, 14, 18); Round2(&B,C,D,A, 0, 20, 19); - Round2(&A,B,C,D, 5, 5, 20); Round2(&D,A,B,C, 10, 9, 21); Round2(&C,D,A,B, 15, 14, 22); Round2(&B,C,D,A, 4, 20, 23); - Round2(&A,B,C,D, 9, 5, 24); Round2(&D,A,B,C, 14, 9, 25); Round2(&C,D,A,B, 3, 14, 26); Round2(&B,C,D,A, 8, 20, 27); - Round2(&A,B,C,D, 13, 5, 28); Round2(&D,A,B,C, 2, 9, 29); Round2(&C,D,A,B, 7, 14, 30); Round2(&B,C,D,A, 12, 20, 31); - - //Round 3 - Round3(&A,B,C,D, 5, 4, 32); Round3(&D,A,B,C, 8, 11, 33); Round3(&C,D,A,B, 11, 16, 34); Round3(&B,C,D,A, 14, 23, 35); - Round3(&A,B,C,D, 1, 4, 36); Round3(&D,A,B,C, 4, 11, 37); Round3(&C,D,A,B, 7, 16, 38); Round3(&B,C,D,A, 10, 23, 39); - Round3(&A,B,C,D, 13, 4, 40); Round3(&D,A,B,C, 0, 11, 41); Round3(&C,D,A,B, 3, 16, 42); Round3(&B,C,D,A, 6, 23, 43); - Round3(&A,B,C,D, 9, 4, 44); Round3(&D,A,B,C, 12, 11, 45); Round3(&C,D,A,B, 15, 16, 46); Round3(&B,C,D,A, 2, 23, 47); - - //Round 4 - Round4(&A,B,C,D, 0, 6, 48); Round4(&D,A,B,C, 7, 10, 49); Round4(&C,D,A,B, 14, 15, 50); Round4(&B,C,D,A, 5, 21, 51); - Round4(&A,B,C,D, 12, 6, 52); Round4(&D,A,B,C, 3, 10, 53); Round4(&C,D,A,B, 10, 15, 54); Round4(&B,C,D,A, 1, 21, 55); - Round4(&A,B,C,D, 8, 6, 56); Round4(&D,A,B,C, 15, 10, 57); Round4(&C,D,A,B, 6, 15, 58); Round4(&B,C,D,A, 13, 21, 59); - Round4(&A,B,C,D, 4, 6, 60); Round4(&D,A,B,C, 11, 10, 61); Round4(&C,D,A,B, 2, 15, 62); Round4(&B,C,D,A, 9, 21, 63); - - // Then perform the following additions. (let's add) - *A2 = A + AA; - *B2 = B + BB; - *C2 = C + CC; - *D2 = D + DD; - - //The clearance of confidential information - memset(pX, 0, sizeof(X)); + //create X It is since it is required. + unsigned int X[16]; //512bit 64byte + int j, k; + + //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D) + unsigned int A = *A2, B = *B2, C = *C2, D = *D2; + unsigned int AA = A, BB = B, CC = C, DD = D; + + //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4 + pX = X; + + //Copy block(padding_message) i into X + for (j = 0, k = 0; j < 64; j += 4, k++) + X[k] = ((unsigned int) block[j]) // 8byte*4 -> 32byte conversion + | (((unsigned int) block[j + 1]) << 8) // A function called Decode as used in the field of RFC + | (((unsigned int) block[j + 2]) << 16) + | (((unsigned int) block[j + 3]) << 24); + + //Round 1 + Round1 (&A, B, C, D, 0, 7, 0); + Round1 (&D, A, B, C, 1, 12, 1); + Round1 (&C, D, A, B, 2, 17, 2); + Round1 (&B, C, D, A, 3, 22, 3); + Round1 (&A, B, C, D, 4, 7, 4); + Round1 (&D, A, B, C, 5, 12, 5); + Round1 (&C, D, A, B, 6, 17, 6); + Round1 (&B, C, D, A, 7, 22, 7); + Round1 (&A, B, C, D, 8, 7, 8); + Round1 (&D, A, B, C, 9, 12, 9); + Round1 (&C, D, A, B, 10, 17, 10); + Round1 (&B, C, D, A, 11, 22, 11); + Round1 (&A, B, C, D, 12, 7, 12); + Round1 (&D, A, B, C, 13, 12, 13); + Round1 (&C, D, A, B, 14, 17, 14); + Round1 (&B, C, D, A, 15, 22, 15); + + //Round 2 + Round2 (&A, B, C, D, 1, 5, 16); + Round2 (&D, A, B, C, 6, 9, 17); + Round2 (&C, D, A, B, 11, 14, 18); + Round2 (&B, C, D, A, 0, 20, 19); + Round2 (&A, B, C, D, 5, 5, 20); + Round2 (&D, A, B, C, 10, 9, 21); + Round2 (&C, D, A, B, 15, 14, 22); + Round2 (&B, C, D, A, 4, 20, 23); + Round2 (&A, B, C, D, 9, 5, 24); + Round2 (&D, A, B, C, 14, 9, 25); + Round2 (&C, D, A, B, 3, 14, 26); + Round2 (&B, C, D, A, 8, 20, 27); + Round2 (&A, B, C, D, 13, 5, 28); + Round2 (&D, A, B, C, 2, 9, 29); + Round2 (&C, D, A, B, 7, 14, 30); + Round2 (&B, C, D, A, 12, 20, 31); + + //Round 3 + Round3 (&A, B, C, D, 5, 4, 32); + Round3 (&D, A, B, C, 8, 11, 33); + Round3 (&C, D, A, B, 11, 16, 34); + Round3 (&B, C, D, A, 14, 23, 35); + Round3 (&A, B, C, D, 1, 4, 36); + Round3 (&D, A, B, C, 4, 11, 37); + Round3 (&C, D, A, B, 7, 16, 38); + Round3 (&B, C, D, A, 10, 23, 39); + Round3 (&A, B, C, D, 13, 4, 40); + Round3 (&D, A, B, C, 0, 11, 41); + Round3 (&C, D, A, B, 3, 16, 42); + Round3 (&B, C, D, A, 6, 23, 43); + Round3 (&A, B, C, D, 9, 4, 44); + Round3 (&D, A, B, C, 12, 11, 45); + Round3 (&C, D, A, B, 15, 16, 46); + Round3 (&B, C, D, A, 2, 23, 47); + + //Round 4 + Round4 (&A, B, C, D, 0, 6, 48); + Round4 (&D, A, B, C, 7, 10, 49); + Round4 (&C, D, A, B, 14, 15, 50); + Round4 (&B, C, D, A, 5, 21, 51); + Round4 (&A, B, C, D, 12, 6, 52); + Round4 (&D, A, B, C, 3, 10, 53); + Round4 (&C, D, A, B, 10, 15, 54); + Round4 (&B, C, D, A, 1, 21, 55); + Round4 (&A, B, C, D, 8, 6, 56); + Round4 (&D, A, B, C, 15, 10, 57); + Round4 (&C, D, A, B, 6, 15, 58); + Round4 (&B, C, D, A, 13, 21, 59); + Round4 (&A, B, C, D, 4, 6, 60); + Round4 (&D, A, B, C, 11, 10, 61); + Round4 (&C, D, A, B, 2, 15, 62); + Round4 (&B, C, D, A, 9, 21, 63); + + // Then perform the following additions. (let's add) + *A2 = A + AA; + *B2 = B + BB; + *C2 = C + CC; + *D2 = D + DD; + + //The clearance of confidential information + memset (pX, 0, sizeof (X)); } //------------------------------------------------------------------- // The function for the exteriors /** output is the coded binary in the character sequence which wants to code string. */ -void MD5_String2binary(const char * string, char * output) +void MD5_String2binary (const char *string, char *output) { //var - /*8bit*/ - unsigned char padding_message[64]; //Extended message 512bit 64byte - unsigned char *pstring; //The position of string in the present scanning notes is held. + /*8bit */ + unsigned char padding_message[64]; //Extended message 512bit 64byte + unsigned char *pstring; //The position of string in the present scanning notes is held. // unsigned char digest[16]; - /*32bit*/ - unsigned int string_byte_len, //The byte chief of string is held. - string_bit_len, //The bit length of string is held. - copy_len, //The number of bytes which is used by 1-3 and which remained - msg_digest[4]; //Message digest 128bit 4byte - unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference) - *B = &msg_digest[1], - *C = &msg_digest[2], - *D = &msg_digest[3]; - int i; + /*32bit */ + unsigned int string_byte_len, //The byte chief of string is held. + string_bit_len, //The bit length of string is held. + copy_len, //The number of bytes which is used by 1-3 and which remained + msg_digest[4]; //Message digest 128bit 4byte + unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference) + *B = &msg_digest[1], *C = &msg_digest[2], *D = &msg_digest[3]; + int i; //prog - //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head) - *A = 0x67452301; - *B = 0xefcdab89; - *C = 0x98badcfe; - *D = 0x10325476; - - //Step 1.Append Padding Bits (extension of a mark bit) - //1-1 - string_byte_len = strlen(string); //The byte chief of a character sequence is acquired. - pstring = (unsigned char *)string; //The position of the present character sequence is set. - - //1-2 Repeat calculation until length becomes less than 64 bytes. - for (i=string_byte_len; 64<=i; i-=64,pstring+=64) - MD5_Round_Calculate(pstring, A,B,C,D); - - //1-3 - copy_len = string_byte_len % 64; //The number of bytes which remained is computed. - strncpy((char *)padding_message, (char *)pstring, copy_len); //A message is copied to an extended bit sequence. - memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length. - padding_message[copy_len] |= 0x80; //The next of a message is 1. - - //1-4 - //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes. - if (56 <= copy_len) { - MD5_Round_Calculate(padding_message, A,B,C,D); - memset(padding_message, 0, 56); //56 bytes is newly fill uped with 0. - } - - - //Step 2.Append Length (the information on length is added) - string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank) - memcpy(&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set. - - //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank. - if (UINT_MAX / 8 < string_byte_len) { - unsigned int high = (string_byte_len - UINT_MAX / 8) * 8; - memcpy(&padding_message[60], &high, 4); - } else - memset(&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0. - - //Step 4.Process Message in 16-Word Blocks (calculation of MD5) - MD5_Round_Calculate(padding_message, A,B,C,D); - - - //Step 5.Output (output) - memcpy(output,msg_digest,16); + //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head) + *A = 0x67452301; + *B = 0xefcdab89; + *C = 0x98badcfe; + *D = 0x10325476; + + //Step 1.Append Padding Bits (extension of a mark bit) + //1-1 + string_byte_len = strlen (string); //The byte chief of a character sequence is acquired. + pstring = (unsigned char *) string; //The position of the present character sequence is set. + + //1-2 Repeat calculation until length becomes less than 64 bytes. + for (i = string_byte_len; 64 <= i; i -= 64, pstring += 64) + MD5_Round_Calculate (pstring, A, B, C, D); + + //1-3 + copy_len = string_byte_len % 64; //The number of bytes which remained is computed. + strncpy ((char *) padding_message, (char *) pstring, copy_len); //A message is copied to an extended bit sequence. + memset (padding_message + copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length. + padding_message[copy_len] |= 0x80; //The next of a message is 1. + + //1-4 + //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes. + if (56 <= copy_len) + { + MD5_Round_Calculate (padding_message, A, B, C, D); + memset (padding_message, 0, 56); //56 bytes is newly fill uped with 0. + } + + //Step 2.Append Length (the information on length is added) + string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank) + memcpy (&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set. + + //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank. + if (UINT_MAX / 8 < string_byte_len) + { + unsigned int high = (string_byte_len - UINT_MAX / 8) * 8; + memcpy (&padding_message[60], &high, 4); + } + else + memset (&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0. + + //Step 4.Process Message in 16-Word Blocks (calculation of MD5) + MD5_Round_Calculate (padding_message, A, B, C, D); + + //Step 5.Output (output) + memcpy (output, msg_digest, 16); // memcpy (digest, msg_digest, and 16); //8 byte*4 < - 32byte conversion A function called Encode as used in the field of RFC /* sprintf(output, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", @@ -222,16 +279,15 @@ void MD5_String2binary(const char * string, char * output) } /** output is the coded character sequence in the character sequence which wants to code string. */ -void MD5_String(const char * string, char * output) +void MD5_String (const char *string, char *output) { - unsigned char digest[16]; - - MD5_String2binary(string,digest); - sprintf(output, - "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", - digest[ 0], digest[ 1], digest[ 2], digest[ 3], - digest[ 4], digest[ 5], digest[ 6], digest[ 7], - digest[ 8], digest[ 9], digest[10], digest[11], - digest[12], digest[13], digest[14], digest[15]); + unsigned char digest[16]; + + MD5_String2binary (string, digest); + sprintf (output, + "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + digest[0], digest[1], digest[2], digest[3], + digest[4], digest[5], digest[6], digest[7], + digest[8], digest[9], digest[10], digest[11], + digest[12], digest[13], digest[14], digest[15]); } - diff --git a/src/login/md5calc.h b/src/login/md5calc.h index 9137b5b..4a57861 100644 --- a/src/login/md5calc.h +++ b/src/login/md5calc.h @@ -2,7 +2,7 @@ #ifndef _MD5CALC_H_ #define _MD5CALC_H_ -void MD5_String(const char * string, char * output); -void MD5_String2binary(const char * string, char * output); +void MD5_String (const char *string, char *output); +void MD5_String2binary (const char *string, char *output); #endif diff --git a/src/login_sql/login.c b/src/login_sql/login.c index a46416c..cc59f19 100644 --- a/src/login_sql/login.c +++ b/src/login_sql/login.c @@ -21,7 +21,7 @@ #include <sys/time.h> #include <time.h> #include <sys/ioctl.h> -#include <sys/stat.h> // for stat/lstat/fstat +#include <sys/stat.h> // for stat/lstat/fstat #include <unistd.h> #include <signal.h> #include <fcntl.h> @@ -64,43 +64,43 @@ //----------------------------------------------------- // global variable //----------------------------------------------------- -int account_id_count = START_ACCOUNT_NUM; -int server_num; -int new_account_flag = 0; -int login_port = 6900; -char lan_char_ip[128]; // Lan char ip added by kashy -int subnetmaski[4]; // Subnetmask added by kashy +int account_id_count = START_ACCOUNT_NUM; +int server_num; +int new_account_flag = 0; +int login_port = 6900; +char lan_char_ip[128]; // Lan char ip added by kashy +int subnetmaski[4]; // Subnetmask added by kashy struct mmo_char_server server[MAX_SERVERS]; -int server_fd[MAX_SERVERS]; -int server_freezeflag[MAX_SERVERS]; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed -int anti_freeze_enable = 0; -int ANTI_FREEZE_INTERVAL = 15; +int server_fd[MAX_SERVERS]; +int server_freezeflag[MAX_SERVERS]; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed +int anti_freeze_enable = 0; +int ANTI_FREEZE_INTERVAL = 15; -int login_fd; +int login_fd; char date_format[32] = "%Y-%m-%d %H:%M:%S"; -int auth_num = 0, auth_max = 0; +int auth_num = 0, auth_max = 0; -int min_level_to_connect = 0; // minimum level of player/GM (0: player, 1-99: gm) to connect on the server -int check_ip_flag = 1; // It's to check IP of a player between login-server and char-server (part of anti-hacking system) +int min_level_to_connect = 0; // minimum level of player/GM (0: player, 1-99: gm) to connect on the server +int check_ip_flag = 1; // It's to check IP of a player between login-server and char-server (part of anti-hacking system) MYSQL mysql_handle; -int ipban = 1; -int dynamic_account_ban = 1; -int dynamic_account_ban_class = 0; -int dynamic_pass_failure_ban = 1; -int dynamic_pass_failure_ban_time = 5; -int dynamic_pass_failure_ban_how_many = 3; -int dynamic_pass_failure_ban_how_long = 60; +int ipban = 1; +int dynamic_account_ban = 1; +int dynamic_account_ban_class = 0; +int dynamic_pass_failure_ban = 1; +int dynamic_pass_failure_ban_time = 5; +int dynamic_pass_failure_ban_how_many = 3; +int dynamic_pass_failure_ban_how_long = 60; -int login_server_port = 3306; +int login_server_port = 3306; char login_server_ip[32] = "127.0.0.1"; char login_server_id[32] = "ragnarok"; char login_server_pw[32] = "ragnarok"; char login_server_db[32] = "ragnarok"; -int use_md5_passwds = 0; +int use_md5_passwds = 0; char login_db[256] = "login"; char loginlog_db[256] = "loginlog"; @@ -116,13 +116,13 @@ char tmpsql[65535], tmp_sql[65535]; //----------------------------------------------------- #define AUTH_FIFO_SIZE 256 -struct { - int account_id,login_id1,login_id2; - int ip,sex,delflag; +struct +{ + int account_id, login_id1, login_id2; + int ip, sex, delflag; } auth_fifo[AUTH_FIFO_SIZE]; -int auth_fifo_pos = 0; - +int auth_fifo_pos = 0; //----------------------------------------------------- @@ -132,341 +132,406 @@ static char md5key[20], md5keylen = 16; // check user level //----------------------------------------------------- -int isGM(int account_id) { - int level; - - MYSQL_RES* sql_res; - MYSQL_ROW sql_row; - level = 0; - sprintf(tmpsql,"SELECT `%s` FROM `%s` WHERE `%s`='%d'", login_db_level, login_db, login_db_account_id, account_id); - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error (select GM Level to Memory)- %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - if (sql_res) { - sql_row = mysql_fetch_row(sql_res); - level = atoi(sql_row[0]); - if (level > 99) - level = 99; - } - - if (level == 0) { - return 0; - //not GM - } - - mysql_free_result(sql_res); - - return level; +int isGM (int account_id) +{ + int level; + + MYSQL_RES *sql_res; + MYSQL_ROW sql_row; + level = 0; + sprintf (tmpsql, "SELECT `%s` FROM `%s` WHERE `%s`='%d'", login_db_level, + login_db, login_db_account_id, account_id); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error (select GM Level to Memory)- %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + sql_row = mysql_fetch_row (sql_res); + level = atoi (sql_row[0]); + if (level > 99) + level = 99; + } + + if (level == 0) + { + return 0; + //not GM + } + + mysql_free_result (sql_res); + + return level; } //----------------------------------------------------- // Function to suppress control characters in a string. //----------------------------------------------------- -int remove_control_chars(unsigned char *str) { - int i; - int change = 0; - - for(i = 0; str[i]; i++) { - if (str[i] < 32) { - str[i] = '_'; - change = 1; - } - } +int remove_control_chars (unsigned char *str) +{ + int i; + int change = 0; + + for (i = 0; str[i]; i++) + { + if (str[i] < 32) + { + str[i] = '_'; + change = 1; + } + } - return change; + return change; } //--------------------------------------------------- // E-mail check: return 0 (not correct) or 1 (valid). //--------------------------------------------------- -int e_mail_check(unsigned char *email) { - char ch; - unsigned char* last_arobas; - - // athena limits - if (strlen(email) < 3 || strlen(email) > 39) - return 0; - - // part of RFC limits (official reference of e-mail description) - if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@') - return 0; - - if (email[strlen(email)-1] == '.') - return 0; - - last_arobas = strrchr(email, '@'); - - if (strstr(last_arobas, "@.") != NULL || - strstr(last_arobas, "..") != NULL) - return 0; - - for(ch = 1; ch < 32; ch++) { - if (strchr(last_arobas, ch) != NULL) { - return 0; - break; - } - } +int e_mail_check (unsigned char *email) +{ + char ch; + unsigned char *last_arobas; + + // athena limits + if (strlen (email) < 3 || strlen (email) > 39) + return 0; + + // part of RFC limits (official reference of e-mail description) + if (strchr (email, '@') == NULL || email[strlen (email) - 1] == '@') + return 0; + + if (email[strlen (email) - 1] == '.') + return 0; + + last_arobas = strrchr (email, '@'); + + if (strstr (last_arobas, "@.") != NULL || + strstr (last_arobas, "..") != NULL) + return 0; + + for (ch = 1; ch < 32; ch++) + { + if (strchr (last_arobas, ch) != NULL) + { + return 0; + break; + } + } - if (strchr(last_arobas, ' ') != NULL || - strchr(last_arobas, ';') != NULL) - return 0; + if (strchr (last_arobas, ' ') != NULL || + strchr (last_arobas, ';') != NULL) + return 0; - // all correct - return 1; + // all correct + return 1; } //----------------------------------------------------- // Read Account database - mysql db //----------------------------------------------------- -int mmo_auth_sqldb_init(void) { - - printf("Login server init....\n"); - - // memory initialize - printf("memory initialize....\n"); - - mysql_init(&mysql_handle); - - // DB connection start - printf("Connect Login Database Server....\n"); - if (!mysql_real_connect(&mysql_handle, login_server_ip, login_server_id, login_server_pw, - login_server_db, login_server_port, (char *)NULL, 0)) { - // pointer check - printf("%s\n", mysql_error(&mysql_handle)); - exit(1); - } else { - printf("connect success!\n"); - } - - sprintf(tmpsql, "INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '', 'lserver', '100','login server started')", loginlog_db); - - //query - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - return 0; +int mmo_auth_sqldb_init (void) +{ + + printf ("Login server init....\n"); + + // memory initialize + printf ("memory initialize....\n"); + + mysql_init (&mysql_handle); + + // DB connection start + printf ("Connect Login Database Server....\n"); + if (!mysql_real_connect + (&mysql_handle, login_server_ip, login_server_id, login_server_pw, + login_server_db, login_server_port, (char *) NULL, 0)) + { + // pointer check + printf ("%s\n", mysql_error (&mysql_handle)); + exit (1); + } + else + { + printf ("connect success!\n"); + } + + sprintf (tmpsql, + "INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '', 'lserver', '100','login server started')", + loginlog_db); + + //query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + + return 0; } //----------------------------------------------------- // DB server connect check //----------------------------------------------------- -void mmo_auth_sqldb_sync(void) { - // db connect check? or close? - // ping pong DB server -if losted? then connect try. else crash. +void mmo_auth_sqldb_sync (void) +{ + // db connect check? or close? + // ping pong DB server -if losted? then connect try. else crash. } //----------------------------------------------------- // close DB //----------------------------------------------------- -void mmo_db_close(void) { - - //set log. - sprintf(tmpsql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '', 'lserver','100', 'login server shutdown')", loginlog_db); - - //query - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - //delete all server status - sprintf(tmpsql,"DELETE FROM `sstatus`"); - //query - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - mysql_close(&mysql_handle); - printf("close DB connect....\n"); - - int i, fd; - - for (i = 0; i < MAX_SERVERS; i++) { - if ((fd = server_fd[i]) >= 0) - delete_session(fd); - } - delete_session(login_fd); +void mmo_db_close (void) +{ + + //set log. + sprintf (tmpsql, + "INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '', 'lserver','100', 'login server shutdown')", + loginlog_db); + + //query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + + //delete all server status + sprintf (tmpsql, "DELETE FROM `sstatus`"); + //query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + + mysql_close (&mysql_handle); + printf ("close DB connect....\n"); + + int i, fd; + + for (i = 0; i < MAX_SERVERS; i++) + { + if ((fd = server_fd[i]) >= 0) + delete_session (fd); + } + delete_session (login_fd); } //----------------------------------------------------- // Make new account //----------------------------------------------------- -int mmo_auth_sqldb_new(struct mmo_account* account,const char *tmpstr, char sex) { - //no need on DB version +int mmo_auth_sqldb_new (struct mmo_account *account, const char *tmpstr, + char sex) +{ + //no need on DB version - printf("Request new account.... - not support on this version\n"); + printf ("Request new account.... - not support on this version\n"); - return 0; + return 0; } //----------------------------------------------------- // Make new account //----------------------------------------------------- -int mmo_auth_new(struct mmo_account* account, const char *tmpstr, char sex) { +int mmo_auth_new (struct mmo_account *account, const char *tmpstr, char sex) +{ - return 0; + return 0; } #ifdef LCCWIN32 -extern void gettimeofday(struct timeval *t, struct timezone *dummy); +extern void gettimeofday (struct timeval *t, struct timezone *dummy); #endif //----------------------------------------------------- // Auth //----------------------------------------------------- -int mmo_auth( struct mmo_account* account , int fd){ - struct timeval tv; - time_t ban_until_time; - char tmpstr[256]; - char t_uid[256], t_pass[256]; - char user_password[256]; - - MYSQL_RES* sql_res ; - MYSQL_ROW sql_row ; - //int sql_fields, sql_cnt; - char md5str[64], md5bin[32]; - - char ip[16]; - - unsigned char *sin_addr = (unsigned char *)&session[fd]->client_addr.sin_addr; - - printf ("auth start...\n"); - - sprintf(ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], sin_addr[3]); - - // auth start : time seed - gettimeofday(&tv, NULL); - strftime(tmpstr, 24, "%Y-%m-%d %H:%M:%S",gmtime(&(tv.tv_sec))); - sprintf(tmpstr+19, ".%03d", (int)tv.tv_usec/1000); - - jstrescapecpy(t_uid,account->userid); - jstrescapecpy(t_pass, account->passwd); - - // make query - sprintf(tmpsql, "SELECT `%s`,`%s`,`%s`,`lastlogin`,`logincount`,`sex`,`connect_until`,`last_ip`,`ban_until`,`state`,`%s`" - " FROM `%s` WHERE `%s`='%s'", login_db_account_id, login_db_userid, login_db_user_pass, login_db_level, login_db, login_db_userid, t_uid); - //login {0-account_id/1-userid/2-user_pass/3-lastlogin/4-logincount/5-sex/6-connect_untl/7-last_ip/8-ban_until/9-state} - - // query - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res) { - sql_row = mysql_fetch_row(sql_res); //row fetching - if (!sql_row) { - //there's no id. - printf ("auth failed no account %s %s %s\n", tmpstr, account->userid, account->passwd); - mysql_free_result(sql_res); - return 0; - } - } else { - printf("mmo_auth DB result error ! \n"); - return 0; - } - // Documented by CLOWNISIUS || LLRO || Gunstar lead this one with me - // IF changed to diferent returns~ you get diferent responses from your msgstringtable.txt - //Ireturn 2 == line 9 - //Ireturn 5 == line 311 - //Ireturn 6 == line 450 - //Ireturn 7 == line 440 - //Ireturn 8 == line 682 - //Ireturn 9 == line 704 - //Ireturn 10 == line 705 - //Ireturn 11 == line 706 - //Ireturn 12 == line 707 - //Ireturn 13 == line 708 - //Ireturn 14 == line 709 - //Ireturn 15 == line 710 - //Ireturn -1 == line 010 - // Check status - { - if (atoi(sql_row[9]) == -3) { - //id is banned - mysql_free_result(sql_res); - return -3; - } else if (atoi(sql_row[9]) == -2) { //dynamic ban - //id is banned - mysql_free_result(sql_res); - //add IP list. - return -2; - } +int mmo_auth (struct mmo_account *account, int fd) +{ + struct timeval tv; + time_t ban_until_time; + char tmpstr[256]; + char t_uid[256], t_pass[256]; + char user_password[256]; + + MYSQL_RES *sql_res; + MYSQL_ROW sql_row; + //int sql_fields, sql_cnt; + char md5str[64], md5bin[32]; + + char ip[16]; + + unsigned char *sin_addr = + (unsigned char *) &session[fd]->client_addr.sin_addr; + + printf ("auth start...\n"); + + sprintf (ip, "%d.%d.%d.%d", sin_addr[0], sin_addr[1], sin_addr[2], + sin_addr[3]); + + // auth start : time seed + gettimeofday (&tv, NULL); + strftime (tmpstr, 24, "%Y-%m-%d %H:%M:%S", gmtime (&(tv.tv_sec))); + sprintf (tmpstr + 19, ".%03d", (int) tv.tv_usec / 1000); + + jstrescapecpy (t_uid, account->userid); + jstrescapecpy (t_pass, account->passwd); + + // make query + sprintf (tmpsql, + "SELECT `%s`,`%s`,`%s`,`lastlogin`,`logincount`,`sex`,`connect_until`,`last_ip`,`ban_until`,`state`,`%s`" + " FROM `%s` WHERE `%s`='%s'", login_db_account_id, + login_db_userid, login_db_user_pass, login_db_level, login_db, + login_db_userid, t_uid); + //login {0-account_id/1-userid/2-user_pass/3-lastlogin/4-logincount/5-sex/6-connect_untl/7-last_ip/8-ban_until/9-state} + + // query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + sql_row = mysql_fetch_row (sql_res); //row fetching + if (!sql_row) + { + //there's no id. + printf ("auth failed no account %s %s %s\n", tmpstr, + account->userid, account->passwd); + mysql_free_result (sql_res); + return 0; + } + } + else + { + printf ("mmo_auth DB result error ! \n"); + return 0; + } + // Documented by CLOWNISIUS || LLRO || Gunstar lead this one with me + // IF changed to diferent returns~ you get diferent responses from your msgstringtable.txt + //Ireturn 2 == line 9 + //Ireturn 5 == line 311 + //Ireturn 6 == line 450 + //Ireturn 7 == line 440 + //Ireturn 8 == line 682 + //Ireturn 9 == line 704 + //Ireturn 10 == line 705 + //Ireturn 11 == line 706 + //Ireturn 12 == line 707 + //Ireturn 13 == line 708 + //Ireturn 14 == line 709 + //Ireturn 15 == line 710 + //Ireturn -1 == line 010 + // Check status + { + if (atoi (sql_row[9]) == -3) + { + //id is banned + mysql_free_result (sql_res); + return -3; + } + else if (atoi (sql_row[9]) == -2) + { //dynamic ban + //id is banned + mysql_free_result (sql_res); + //add IP list. + return -2; + } - if (use_md5_passwds) { - MD5_String(account->passwd,user_password); - } else { - jstrescapecpy(user_password, account->passwd); - } - printf("account id ok encval:%d\n",account->passwdenc); - int encpasswdok = 0; + if (use_md5_passwds) + { + MD5_String (account->passwd, user_password); + } + else + { + jstrescapecpy (user_password, account->passwd); + } + printf ("account id ok encval:%d\n", account->passwdenc); + int encpasswdok = 0; #ifdef PASSWORDENC - if (account->passwdenc > 0) { - printf ("start md5calc..\n"); - int j = account->passwdenc; - if (j > 2) - j = 1; - do { - if (j == 1) { - sprintf(md5str, "%s%s", md5key,sql_row[2]); - } else if (j == 2) { - sprintf(md5str, "%s%s", sql_row[2], md5key); - } else - md5str[0] = 0; - printf("j:%d mdstr:%s\n", j, md5str); - MD5_String2binary(md5str, md5bin); - encpasswdok = (memcmp(user_password, md5bin, 16) == 0); - } while (j < 2 && !encpasswdok && (j++) != account->passwdenc); - //printf("key[%s] md5 [%s] ", md5key, md5); - printf("client [%s] accountpass [%s]\n", user_password, sql_row[2]); - printf ("end md5calc..\n"); - } + if (account->passwdenc > 0) + { + printf ("start md5calc..\n"); + int j = account->passwdenc; + if (j > 2) + j = 1; + do + { + if (j == 1) + { + sprintf (md5str, "%s%s", md5key, sql_row[2]); + } + else if (j == 2) + { + sprintf (md5str, "%s%s", sql_row[2], md5key); + } + else + md5str[0] = 0; + printf ("j:%d mdstr:%s\n", j, md5str); + MD5_String2binary (md5str, md5bin); + encpasswdok = (memcmp (user_password, md5bin, 16) == 0); + } + while (j < 2 && !encpasswdok && (j++) != account->passwdenc); + //printf("key[%s] md5 [%s] ", md5key, md5); + printf ("client [%s] accountpass [%s]\n", user_password, + sql_row[2]); + printf ("end md5calc..\n"); + } #endif - if ((strcmp(user_password, sql_row[2]) && !encpasswdok)) { - if (account->passwdenc == 0) { - printf ("auth failed pass error %s %s %s" RETCODE, tmpstr, account->userid, user_password); + if ((strcmp (user_password, sql_row[2]) && !encpasswdok)) + { + if (account->passwdenc == 0) + { + printf ("auth failed pass error %s %s %s" RETCODE, tmpstr, + account->userid, user_password); #ifdef PASSWORDENC - } else { - char logbuf[1024], *p = logbuf; - int j; - p += sprintf(p, "auth failed pass error %s %s recv-md5[", tmpstr, account->userid); - for(j = 0; j < 16; j++) - p += sprintf(p, "%02x", ((unsigned char *)user_password)[j]); - p += sprintf(p, "] calc-md5["); - for(j = 0; j < 16; j++) - p += sprintf(p, "%02x", ((unsigned char *)md5bin)[j]); - p += sprintf(p, "] md5key["); - for(j = 0; j < md5keylen; j++) - p += sprintf(p, "%02x", ((unsigned char *)md5key)[j]); - p += sprintf(p, "]" RETCODE); - printf("%s\n", p); + } + else + { + char logbuf[1024], *p = logbuf; + int j; + p += sprintf (p, "auth failed pass error %s %s recv-md5[", + tmpstr, account->userid); + for (j = 0; j < 16; j++) + p += sprintf (p, "%02x", + ((unsigned char *) user_password)[j]); + p += sprintf (p, "] calc-md5["); + for (j = 0; j < 16; j++) + p += sprintf (p, "%02x", ((unsigned char *) md5bin)[j]); + p += sprintf (p, "] md5key["); + for (j = 0; j < md5keylen; j++) + p += sprintf (p, "%02x", ((unsigned char *) md5key)[j]); + p += sprintf (p, "]" RETCODE); + printf ("%s\n", p); #endif - } - return 1; - } - printf("auth ok %s %s" RETCODE, tmpstr, account->userid); - } - - if (atoi(sql_row[9])) { - switch(atoi(sql_row[9])) { // packet 0x006a value + 1 - case 1: // 0 = Unregistered ID - case 2: // 1 = Incorrect Password - case 3: // 2 = This ID is expired - case 4: // 3 = Rejected from Server - case 5: // 4 = You have been blocked by the GM Team - case 6: // 5 = Your Game's EXE file is not the latest version - case 7: // 6 = Your are Prohibited to log in until %s - case 8: // 7 = Server is jammed due to over populated - case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this) - case 100: // 99 = This ID has been totally erased - printf("Auth Error #%d\n", atoi(sql_row[9])); - return atoi(sql_row[9]) - 1; - break; - default: - return 99; // 99 = ID has been totally erased - break; - } - } + } + return 1; + } + printf ("auth ok %s %s" RETCODE, tmpstr, account->userid); + } + + if (atoi (sql_row[9])) + { + switch (atoi (sql_row[9])) + { // packet 0x006a value + 1 + case 1: // 0 = Unregistered ID + case 2: // 1 = Incorrect Password + case 3: // 2 = This ID is expired + case 4: // 3 = Rejected from Server + case 5: // 4 = You have been blocked by the GM Team + case 6: // 5 = Your Game's EXE file is not the latest version + case 7: // 6 = Your are Prohibited to log in until %s + case 8: // 7 = Server is jammed due to over populated + case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this) + case 100: // 99 = This ID has been totally erased + printf ("Auth Error #%d\n", atoi (sql_row[9])); + return atoi (sql_row[9]) - 1; + break; + default: + return 99; // 99 = ID has been totally erased + break; + } + } /* // do not remove this section. this is meant for future, and current forums usage @@ -498,1185 +563,1511 @@ int mmo_auth( struct mmo_account* account , int fd){ } } */ - ban_until_time = atol(sql_row[8]); - - //login {0-account_id/1-userid/2-user_pass/3-lastlogin/4-logincount/5-sex/6-connect_untl/7-last_ip/8-ban_until/9-state} - if (ban_until_time != 0) { // if account is banned - strftime(tmpstr, 20, date_format, gmtime(&ban_until_time)); - tmpstr[19] = '\0'; - if (ban_until_time > time(NULL)) { // always banned - return 6; // 6 = Your are Prohibited to log in until %s - } else { // ban is finished - // reset the ban time - sprintf(tmpsql, "UPDATE `%s` SET `ban_until`='0' WHERE `%s`='%s'", login_db, login_db_userid, t_uid); - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - } - } - - if (atol(sql_row[6]) != 0 && atol(sql_row[6]) < time(NULL)) { - return 2; // 2 = This ID is expired - } - - account->account_id = atoi(sql_row[0]); - account->login_id1 = rand(); - account->login_id2 = rand(); - memcpy(tmpstr, sql_row[3], 19); - memcpy(account->lastlogin, tmpstr, 24); - account->sex = sql_row[5][0] == 'S' ? 2 : sql_row[5][0]=='M'; - - sprintf(tmpsql, "UPDATE `%s` SET `lastlogin` = NOW(), `logincount`=`logincount` +1, `last_ip`='%s' WHERE `%s` = '%s'", - login_db, ip, login_db_userid, sql_row[1]); - mysql_free_result(sql_res) ; //resource free - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - return -1; + ban_until_time = atol (sql_row[8]); + + //login {0-account_id/1-userid/2-user_pass/3-lastlogin/4-logincount/5-sex/6-connect_untl/7-last_ip/8-ban_until/9-state} + if (ban_until_time != 0) + { // if account is banned + strftime (tmpstr, 20, date_format, gmtime (&ban_until_time)); + tmpstr[19] = '\0'; + if (ban_until_time > time (NULL)) + { // always banned + return 6; // 6 = Your are Prohibited to log in until %s + } + else + { // ban is finished + // reset the ban time + sprintf (tmpsql, + "UPDATE `%s` SET `ban_until`='0' WHERE `%s`='%s'", + login_db, login_db_userid, t_uid); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + } + } + + if (atol (sql_row[6]) != 0 && atol (sql_row[6]) < time (NULL)) + { + return 2; // 2 = This ID is expired + } + + account->account_id = atoi (sql_row[0]); + account->login_id1 = rand (); + account->login_id2 = rand (); + memcpy (tmpstr, sql_row[3], 19); + memcpy (account->lastlogin, tmpstr, 24); + account->sex = sql_row[5][0] == 'S' ? 2 : sql_row[5][0] == 'M'; + + sprintf (tmpsql, + "UPDATE `%s` SET `lastlogin` = NOW(), `logincount`=`logincount` +1, `last_ip`='%s' WHERE `%s` = '%s'", + login_db, ip, login_db_userid, sql_row[1]); + mysql_free_result (sql_res); //resource free + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + + return -1; } // Send to char -int charif_sendallwos(int sfd, unsigned char *buf, unsigned int len) { - int i, c; - int fd; - - c = 0; - for(i = 0; i < MAX_SERVERS; i++) { - if ((fd = server_fd[i]) > 0 && fd != sfd) { - memcpy(WFIFOP(fd,0), buf, len); - WFIFOSET(fd,len); - c++; - } - } +int charif_sendallwos (int sfd, unsigned char *buf, unsigned int len) +{ + int i, c; + int fd; + + c = 0; + for (i = 0; i < MAX_SERVERS; i++) + { + if ((fd = server_fd[i]) > 0 && fd != sfd) + { + memcpy (WFIFOP (fd, 0), buf, len); + WFIFOSET (fd, len); + c++; + } + } - return c; + return c; } //-------------------------------- // Char-server anti-freeze system //-------------------------------- -int char_anti_freeze_system(int tid, unsigned int tick, int id, int data) { - int i; - - for(i = 0; i < MAX_SERVERS; i++) { - if (server_fd[i] >= 0) {// if char-server is online -// printf("char_anti_freeze_system: server #%d '%s', flag: %d.\n", i, server[i].name, server_freezeflag[i]); - if (server_freezeflag[i]-- < 1) {// Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed - session[server_fd[i]]->eof = 1; - } - } - } +int char_anti_freeze_system (int tid, unsigned int tick, int id, int data) +{ + int i; + + for (i = 0; i < MAX_SERVERS; i++) + { + if (server_fd[i] >= 0) + { // if char-server is online +// printf("char_anti_freeze_system: server #%d '%s', flag: %d.\n", i, server[i].name, server_freezeflag[i]); + if (server_freezeflag[i]-- < 1) + { // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed + session[server_fd[i]]->eof = 1; + } + } + } - return 0; + return 0; } //----------------------------------------------------- // char-server packet parse //----------------------------------------------------- -int parse_fromchar(int fd){ - int i, id; - MYSQL_RES* sql_res; - MYSQL_ROW sql_row = NULL; - - unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; - char ip[16]; - - sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); - - for(id = 0; id < MAX_SERVERS; id++) - if (server_fd[id] == fd) - break; - - if (id == MAX_SERVERS || session[fd]->eof) { - if (id < MAX_SERVERS) { - printf("Char-server '%s' has disconnected.\n", server[id].name); - server_fd[id] = -1; - memset(&server[id], 0, sizeof(struct mmo_char_server)); - // server delete - sprintf(tmpsql, "DELETE FROM `sstatus` WHERE `index`='%d'", id); - // query - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - } - close(fd); - delete_session(fd); - return 0; - } - - while(RFIFOREST(fd) >= 2) { -// printf("char_parse: %d %d packet case=%x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0)); - - switch (RFIFOW(fd,0)) { - case 0x2712: - if (RFIFOREST(fd) < 19) - return 0; - { - int account_id; - account_id = RFIFOL(fd,2); // speed up - for(i=0;i<AUTH_FIFO_SIZE;i++){ - if (auth_fifo[i].account_id == account_id && - auth_fifo[i].login_id1 == RFIFOL(fd,6) && +int parse_fromchar (int fd) +{ + int i, id; + MYSQL_RES *sql_res; + MYSQL_ROW sql_row = NULL; + + unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; + char ip[16]; + + sprintf (ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); + + for (id = 0; id < MAX_SERVERS; id++) + if (server_fd[id] == fd) + break; + + if (id == MAX_SERVERS || session[fd]->eof) + { + if (id < MAX_SERVERS) + { + printf ("Char-server '%s' has disconnected.\n", server[id].name); + server_fd[id] = -1; + memset (&server[id], 0, sizeof (struct mmo_char_server)); + // server delete + sprintf (tmpsql, "DELETE FROM `sstatus` WHERE `index`='%d'", id); + // query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + } + close (fd); + delete_session (fd); + return 0; + } + + while (RFIFOREST (fd) >= 2) + { +// printf("char_parse: %d %d packet case=%x\n", fd, RFIFOREST(fd), RFIFOW(fd, 0)); + + switch (RFIFOW (fd, 0)) + { + case 0x2712: + if (RFIFOREST (fd) < 19) + return 0; + { + int account_id; + account_id = RFIFOL (fd, 2); // speed up + for (i = 0; i < AUTH_FIFO_SIZE; i++) + { + if (auth_fifo[i].account_id == account_id && + auth_fifo[i].login_id1 == RFIFOL (fd, 6) && #if CMP_AUTHFIFO_LOGIN2 != 0 - auth_fifo[i].login_id2 == RFIFOL(fd,10) && // relate to the versions higher than 18 + auth_fifo[i].login_id2 == RFIFOL (fd, 10) && // relate to the versions higher than 18 #endif - auth_fifo[i].sex == RFIFOB(fd,14) && + auth_fifo[i].sex == RFIFOB (fd, 14) && #if CMP_AUTHFIFO_IP != 0 - auth_fifo[i].ip == RFIFOL(fd,15) && + auth_fifo[i].ip == RFIFOL (fd, 15) && #endif - !auth_fifo[i].delflag) { - auth_fifo[i].delflag = 1; - printf("auth -> %d\n", i); - break; - } - } - - if (i != AUTH_FIFO_SIZE) { // send account_reg - int p; - time_t connect_until_time = 0; - char email[40] = ""; - account_id=RFIFOL(fd,2); - sprintf(tmpsql, "SELECT `email`,`connect_until` FROM `%s` WHERE `%s`='%d'", login_db, login_db_account_id, account_id); - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res) { - sql_row = mysql_fetch_row(sql_res); - connect_until_time = atol(sql_row[1]); - strcpy(email, sql_row[0]); - } - mysql_free_result(sql_res); - if (account_id > 0) { - sprintf(tmpsql, "SELECT `str`,`value` FROM `global_reg_value` WHERE `type`='1' AND `account_id`='%d'",account_id); - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res) { - WFIFOW(fd,0) = 0x2729; - WFIFOL(fd,4) = account_id; - for(p = 8; (sql_row = mysql_fetch_row(sql_res));p+=36){ - memcpy(WFIFOP(fd,p), sql_row[0], 32); - WFIFOL(fd,p+32) = atoi(sql_row[1]); - } - WFIFOW(fd,2) = p; - WFIFOSET(fd,p); - //printf("account_reg2 send : login->char (auth fifo)\n"); - WFIFOW(fd,0) = 0x2713; - WFIFOL(fd,2) = account_id; - WFIFOB(fd,6) = 0; - memcpy(WFIFOP(fd, 7), email, 40); - WFIFOL(fd,47) = (unsigned long) connect_until_time; - WFIFOSET(fd,51); - } - mysql_free_result(sql_res); - } - } else { - WFIFOW(fd,0) = 0x2713; - WFIFOL(fd,2) = account_id; - WFIFOB(fd,6) = 1; - WFIFOSET(fd,51); - } - } - RFIFOSKIP(fd,19); - break; - - case 0x2714: - if (RFIFOREST(fd) < 6) - return 0; - // how many users on world? (update) - if (server[id].users != RFIFOL(fd,2)) - printf("set users %s : %d\n", server[id].name, RFIFOL(fd,2)); - server[id].users = RFIFOL(fd,2); - if(anti_freeze_enable) - server_freezeflag[id] = 5; // Char anti-freeze system. Counter. 5 ok, 4...0 freezed - - sprintf(tmpsql,"UPDATE `sstatus` SET `user` = '%d' WHERE `index` = '%d'", server[id].users, id); - // query - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - RFIFOSKIP(fd,6); - break; - - // We receive an e-mail/limited time request, because a player comes back from a map-server to the char-server - case 0x2716: - if (RFIFOREST(fd) < 6) - return 0; - { - int account_id; - time_t connect_until_time = 0; - char email[40] = ""; - account_id=RFIFOL(fd,2); - sprintf(tmpsql,"SELECT `email`,`connect_until` FROM `%s` WHERE `%s`='%d'",login_db, login_db_account_id, account_id); - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res) { - sql_row = mysql_fetch_row(sql_res); - connect_until_time = atol(sql_row[1]); - strcpy(email, sql_row[0]); - } - mysql_free_result(sql_res); - //printf("parse_fromchar: E-mail/limited time request from '%s' server (concerned account: %d)\n", server[id].name, RFIFOL(fd,2)); - WFIFOW(fd,0) = 0x2717; - WFIFOL(fd,2) = RFIFOL(fd,2); - memcpy(WFIFOP(fd, 6), email, 40); - WFIFOL(fd,46) = (unsigned long) connect_until_time; - WFIFOSET(fd,50); - } - RFIFOSKIP(fd,6); - break; + !auth_fifo[i].delflag) + { + auth_fifo[i].delflag = 1; + printf ("auth -> %d\n", i); + break; + } + } - case 0x2720: // GM - if (RFIFOREST(fd) < 4) - return 0; - if (RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - //oldacc = RFIFOL(fd,4); - printf("change GM isn't support in this login server version.\n"); - printf("change GM error 0 %s\n", RFIFOP(fd, 8)); - - RFIFOSKIP(fd, RFIFOW(fd, 2)); - WFIFOW(fd, 0) = 0x2721; - WFIFOL(fd, 2) = RFIFOL(fd,4); // oldacc; - WFIFOL(fd, 6) = 0; // newacc; - WFIFOSET(fd, 10); - return 0; - - // Map server send information to change an email of an account via char-server - case 0x2722: // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B - if (RFIFOREST(fd) < 86) - return 0; - { - int acc; - char actual_email[40], new_email[40]; - acc = RFIFOL(fd,2); - memcpy(actual_email, RFIFOP(fd,6), 40); - memcpy(new_email, RFIFOP(fd,46), 40); - if (e_mail_check(actual_email) == 0) - printf("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual email is invalid (account: %d, ip: %s)" RETCODE, - server[id].name, acc, ip); - else if (e_mail_check(new_email) == 0) - printf("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a invalid new e-mail (account: %d, ip: %s)" RETCODE, - server[id].name, acc, ip); - else if (strcmpi(new_email, "a@a.com") == 0) - printf("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a default e-mail (account: %d, ip: %s)" RETCODE, - server[id].name, acc, ip); - else { - sprintf(tmpsql, "SELECT `%s`,`email` FROM `%s` WHERE `%s` = '%d'", login_db_userid, login_db, login_db_account_id, acc); - if (mysql_query(&mysql_handle, tmpsql)) - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - sql_res = mysql_store_result(&mysql_handle); - if (sql_res) { - sql_row = mysql_fetch_row(sql_res); //row fetching - - if (strcmpi(sql_row[1], actual_email) == 0) { - sprintf(tmpsql, "UPDATE `%s` SET `email` = '%s' WHERE `%s` = '%d'", login_db, new_email, login_db_account_id, acc); - // query - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - printf("Char-server '%s': Modify an e-mail on an account (@email GM command) (account: %d (%s), new e-mail: %s, ip: %s)." RETCODE, - server[id].name, acc, sql_row[0], actual_email, ip); - } - } - - } - } - RFIFOSKIP(fd, 86); - break; + if (i != AUTH_FIFO_SIZE) + { // send account_reg + int p; + time_t connect_until_time = 0; + char email[40] = ""; + account_id = RFIFOL (fd, 2); + sprintf (tmpsql, + "SELECT `email`,`connect_until` FROM `%s` WHERE `%s`='%d'", + login_db, login_db_account_id, account_id); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + sql_row = mysql_fetch_row (sql_res); + connect_until_time = atol (sql_row[1]); + strcpy (email, sql_row[0]); + } + mysql_free_result (sql_res); + if (account_id > 0) + { + sprintf (tmpsql, + "SELECT `str`,`value` FROM `global_reg_value` WHERE `type`='1' AND `account_id`='%d'", + account_id); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + WFIFOW (fd, 0) = 0x2729; + WFIFOL (fd, 4) = account_id; + for (p = 8; + (sql_row = mysql_fetch_row (sql_res)); + p += 36) + { + memcpy (WFIFOP (fd, p), sql_row[0], 32); + WFIFOL (fd, p + 32) = atoi (sql_row[1]); + } + WFIFOW (fd, 2) = p; + WFIFOSET (fd, p); + //printf("account_reg2 send : login->char (auth fifo)\n"); + WFIFOW (fd, 0) = 0x2713; + WFIFOL (fd, 2) = account_id; + WFIFOB (fd, 6) = 0; + memcpy (WFIFOP (fd, 7), email, 40); + WFIFOL (fd, 47) = + (unsigned long) connect_until_time; + WFIFOSET (fd, 51); + } + mysql_free_result (sql_res); + } + } + else + { + WFIFOW (fd, 0) = 0x2713; + WFIFOL (fd, 2) = account_id; + WFIFOB (fd, 6) = 1; + WFIFOSET (fd, 51); + } + } + RFIFOSKIP (fd, 19); + break; + + case 0x2714: + if (RFIFOREST (fd) < 6) + return 0; + // how many users on world? (update) + if (server[id].users != RFIFOL (fd, 2)) + printf ("set users %s : %d\n", server[id].name, + RFIFOL (fd, 2)); + server[id].users = RFIFOL (fd, 2); + if (anti_freeze_enable) + server_freezeflag[id] = 5; // Char anti-freeze system. Counter. 5 ok, 4...0 freezed + + sprintf (tmpsql, + "UPDATE `sstatus` SET `user` = '%d' WHERE `index` = '%d'", + server[id].users, id); + // query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + RFIFOSKIP (fd, 6); + break; + + // We receive an e-mail/limited time request, because a player comes back from a map-server to the char-server + case 0x2716: + if (RFIFOREST (fd) < 6) + return 0; + { + int account_id; + time_t connect_until_time = 0; + char email[40] = ""; + account_id = RFIFOL (fd, 2); + sprintf (tmpsql, + "SELECT `email`,`connect_until` FROM `%s` WHERE `%s`='%d'", + login_db, login_db_account_id, account_id); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + sql_row = mysql_fetch_row (sql_res); + connect_until_time = atol (sql_row[1]); + strcpy (email, sql_row[0]); + } + mysql_free_result (sql_res); + //printf("parse_fromchar: E-mail/limited time request from '%s' server (concerned account: %d)\n", server[id].name, RFIFOL(fd,2)); + WFIFOW (fd, 0) = 0x2717; + WFIFOL (fd, 2) = RFIFOL (fd, 2); + memcpy (WFIFOP (fd, 6), email, 40); + WFIFOL (fd, 46) = (unsigned long) connect_until_time; + WFIFOSET (fd, 50); + } + RFIFOSKIP (fd, 6); + break; + + case 0x2720: // GM + if (RFIFOREST (fd) < 4) + return 0; + if (RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + //oldacc = RFIFOL(fd,4); + printf + ("change GM isn't support in this login server version.\n"); + printf ("change GM error 0 %s\n", RFIFOP (fd, 8)); + + RFIFOSKIP (fd, RFIFOW (fd, 2)); + WFIFOW (fd, 0) = 0x2721; + WFIFOL (fd, 2) = RFIFOL (fd, 4); // oldacc; + WFIFOL (fd, 6) = 0; // newacc; + WFIFOSET (fd, 10); + return 0; + + // Map server send information to change an email of an account via char-server + case 0x2722: // 0x2722 <account_id>.L <actual_e-mail>.40B <new_e-mail>.40B + if (RFIFOREST (fd) < 86) + return 0; + { + int acc; + char actual_email[40], new_email[40]; + acc = RFIFOL (fd, 2); + memcpy (actual_email, RFIFOP (fd, 6), 40); + memcpy (new_email, RFIFOP (fd, 46), 40); + if (e_mail_check (actual_email) == 0) + printf + ("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command), but actual email is invalid (account: %d, ip: %s)" + RETCODE, server[id].name, acc, ip); + else if (e_mail_check (new_email) == 0) + printf + ("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a invalid new e-mail (account: %d, ip: %s)" + RETCODE, server[id].name, acc, ip); + else if (strcmpi (new_email, "a@a.com") == 0) + printf + ("Char-server '%s': Attempt to modify an e-mail on an account (@email GM command) with a default e-mail (account: %d, ip: %s)" + RETCODE, server[id].name, acc, ip); + else + { + sprintf (tmpsql, + "SELECT `%s`,`email` FROM `%s` WHERE `%s` = '%d'", + login_db_userid, login_db, + login_db_account_id, acc); + if (mysql_query (&mysql_handle, tmpsql)) + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + sql_row = mysql_fetch_row (sql_res); //row fetching + + if (strcmpi (sql_row[1], actual_email) == 0) + { + sprintf (tmpsql, + "UPDATE `%s` SET `email` = '%s' WHERE `%s` = '%d'", + login_db, new_email, + login_db_account_id, acc); + // query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + printf + ("Char-server '%s': Modify an e-mail on an account (@email GM command) (account: %d (%s), new e-mail: %s, ip: %s)." + RETCODE, server[id].name, acc, + sql_row[0], actual_email, ip); + } + } - case 0x2724: // Receiving of map-server via char-server a status change resquest (by Yor) - if (RFIFOREST(fd) < 10) - return 0; - { - int acc, statut; - acc = RFIFOL(fd,2); - statut = RFIFOL(fd,6); - sprintf(tmpsql, "SELECT `state` FROM `%s` WHERE `%s` = '%d'", login_db, login_db_account_id, acc); - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - if (sql_res) { - sql_row = mysql_fetch_row(sql_res); // row fetching - } - if (atoi(sql_row[0]) != statut && statut != 0) { - unsigned char buf[16]; - WBUFW(buf,0) = 0x2731; - WBUFL(buf,2) = acc; - WBUFB(buf,6) = 0; // 0: change of statut, 1: ban - WBUFL(buf,7) = statut; // status or final date of a banishment - charif_sendallwos(-1, buf, 11); - } - sprintf(tmpsql,"UPDATE `%s` SET `state` = '%d' WHERE `%s` = '%d'", login_db, statut,login_db_account_id,acc); - //query - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - RFIFOSKIP(fd,10); - } - return 0; - - case 0x2725: // Receiving of map-server via char-server a ban resquest (by Yor) - if (RFIFOREST(fd) < 18) - return 0; - { - int acc; - struct tm *tmtime; - time_t timestamp, tmptime; - acc = RFIFOL(fd,2); - sprintf(tmpsql, "SELECT `ban_until` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc); - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle); - if (sql_res) { - sql_row = mysql_fetch_row(sql_res); // row fetching - } - tmptime = atol(sql_row[0]); - if (tmptime == 0 || tmptime < time(NULL)) - timestamp = time(NULL); - else - timestamp = tmptime; - tmtime = gmtime(×tamp); - tmtime->tm_year = tmtime->tm_year + (short)RFIFOW(fd,6); - tmtime->tm_mon = tmtime->tm_mon + (short)RFIFOW(fd,8); - tmtime->tm_mday = tmtime->tm_mday + (short)RFIFOW(fd,10); - tmtime->tm_hour = tmtime->tm_hour + (short)RFIFOW(fd,12); - tmtime->tm_min = tmtime->tm_min + (short)RFIFOW(fd,14); - tmtime->tm_sec = tmtime->tm_sec + (short)RFIFOW(fd,16); - timestamp = timegm(tmtime); - if (timestamp != -1) { - if (timestamp <= time(NULL)) - timestamp = 0; - if (tmptime != timestamp) { - if (timestamp != 0) { - unsigned char buf[16]; - WBUFW(buf,0) = 0x2731; - WBUFL(buf,2) = acc; - WBUFB(buf,6) = 1; // 0: change of statut, 1: ban - WBUFL(buf,7) = timestamp; // status or final date of a banishment - charif_sendallwos(-1, buf, 11); - } - printf("Account: %d Banned until: %ld\n", acc, timestamp); - sprintf(tmpsql, "UPDATE `%s` SET `ban_until` = '%ld', `state`='7' WHERE `%s` = '%d'", login_db, timestamp, login_db_account_id, acc); - // query - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - } - } - RFIFOSKIP(fd,18); - break; - } - return 0; - - case 0x2727: - if (RFIFOREST(fd) < 6) - return 0; - { - int acc,sex; - unsigned char buf[16]; - acc=RFIFOL(fd,4); - sprintf(tmpsql,"SELECT `sex` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc); - - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - return 0; + } } - - sql_res = mysql_store_result(&mysql_handle) ; - - if (sql_res) { - if (mysql_num_rows(sql_res) == 0) { - mysql_free_result(sql_res); - return 0; - } - sql_row = mysql_fetch_row(sql_res); //row fetching - } - - if (strcmpi(sql_row[0], "M") == 0) - sex = 1; - else - sex = 0; - sprintf(tmpsql,"UPDATE `%s` SET `sex` = '%c' WHERE `%s` = '%d'", login_db, (sex==0?'M':'F'), login_db_account_id, acc); - //query - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - WBUFW(buf,0) = 0x2723; - WBUFL(buf,2) = acc; - WBUFB(buf,6) = sex; - charif_sendallwos(-1, buf, 7); - RFIFOSKIP(fd,6); - } - return 0; - - case 0x2728: // save account_reg - if (RFIFOREST(fd) < 4 || RFIFOREST(fd) < RFIFOW(fd,2)) - return 0; - { - int acc,p,j; - char str[32]; - char temp_str[32]; - int value; - acc=RFIFOL(fd,4); - - if (acc>0){ - unsigned char buf[RFIFOW(fd,2)+1]; - for(p=8,j=0;p<RFIFOW(fd,2) && j<ACCOUNT_REG2_NUM;p+=36,j++){ - memcpy(str,RFIFOP(fd,p),32); - value=RFIFOL(fd,p+32); - sprintf(tmpsql,"DELETE FROM `global_reg_value` WHERE `type`='1' AND `account_id`='%d' AND `str`='%s';",acc,jstrescapecpy(temp_str,str)); - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sprintf(tmpsql,"INSERT INTO `global_reg_value` (`type`, `account_id`, `str`, `value`) VALUES ( 1 , '%d' , '%s' , '%d');", acc, jstrescapecpy(temp_str,str), value); - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - } - - // Send to char - memcpy(WBUFP(buf,0),RFIFOP(fd,0),RFIFOW(fd,2)); - WBUFW(buf,0)=0x2729; - charif_sendallwos(fd,buf,WBUFW(buf,2)); - } - } - RFIFOSKIP(fd,RFIFOW(fd,2)); - //printf("login: save account_reg (from char)\n"); - break; - - case 0x272a: // Receiving of map-server via char-server a unban resquest (by Yor) - if (RFIFOREST(fd) < 6) - return 0; - { - int acc; - acc = RFIFOL(fd,2); - sprintf(tmpsql,"SELECT `ban_until` FROM `%s` WHERE `%s` = '%d'",login_db,login_db_account_id,acc); - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); + RFIFOSKIP (fd, 86); + break; + + case 0x2724: // Receiving of map-server via char-server a status change resquest (by Yor) + if (RFIFOREST (fd) < 10) + return 0; + { + int acc, statut; + acc = RFIFOL (fd, 2); + statut = RFIFOL (fd, 6); + sprintf (tmpsql, + "SELECT `state` FROM `%s` WHERE `%s` = '%d'", + login_db, login_db_account_id, acc); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + sql_row = mysql_fetch_row (sql_res); // row fetching + } + if (atoi (sql_row[0]) != statut && statut != 0) + { + unsigned char buf[16]; + WBUFW (buf, 0) = 0x2731; + WBUFL (buf, 2) = acc; + WBUFB (buf, 6) = 0; // 0: change of statut, 1: ban + WBUFL (buf, 7) = statut; // status or final date of a banishment + charif_sendallwos (-1, buf, 11); + } + sprintf (tmpsql, + "UPDATE `%s` SET `state` = '%d' WHERE `%s` = '%d'", + login_db, statut, login_db_account_id, acc); + //query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + RFIFOSKIP (fd, 10); } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res) { - sql_row = mysql_fetch_row(sql_res); //row fetching + return 0; + + case 0x2725: // Receiving of map-server via char-server a ban resquest (by Yor) + if (RFIFOREST (fd) < 18) + return 0; + { + int acc; + struct tm *tmtime; + time_t timestamp, tmptime; + acc = RFIFOL (fd, 2); + sprintf (tmpsql, + "SELECT `ban_until` FROM `%s` WHERE `%s` = '%d'", + login_db, login_db_account_id, acc); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + sql_row = mysql_fetch_row (sql_res); // row fetching + } + tmptime = atol (sql_row[0]); + if (tmptime == 0 || tmptime < time (NULL)) + timestamp = time (NULL); + else + timestamp = tmptime; + tmtime = gmtime (×tamp); + tmtime->tm_year = + tmtime->tm_year + (short) RFIFOW (fd, 6); + tmtime->tm_mon = tmtime->tm_mon + (short) RFIFOW (fd, 8); + tmtime->tm_mday = + tmtime->tm_mday + (short) RFIFOW (fd, 10); + tmtime->tm_hour = + tmtime->tm_hour + (short) RFIFOW (fd, 12); + tmtime->tm_min = tmtime->tm_min + (short) RFIFOW (fd, 14); + tmtime->tm_sec = tmtime->tm_sec + (short) RFIFOW (fd, 16); + timestamp = timegm (tmtime); + if (timestamp != -1) + { + if (timestamp <= time (NULL)) + timestamp = 0; + if (tmptime != timestamp) + { + if (timestamp != 0) + { + unsigned char buf[16]; + WBUFW (buf, 0) = 0x2731; + WBUFL (buf, 2) = acc; + WBUFB (buf, 6) = 1; // 0: change of statut, 1: ban + WBUFL (buf, 7) = timestamp; // status or final date of a banishment + charif_sendallwos (-1, buf, 11); + } + printf ("Account: %d Banned until: %ld\n", acc, + timestamp); + sprintf (tmpsql, + "UPDATE `%s` SET `ban_until` = '%ld', `state`='7' WHERE `%s` = '%d'", + login_db, timestamp, login_db_account_id, + acc); + // query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + } + } + RFIFOSKIP (fd, 18); + break; } - if (atol(sql_row[0]) != 0) { - sprintf(tmpsql,"UPDATE `%s` SET `ban_until` = '0', `state`='0' WHERE `%s` = '%d'", login_db,login_db_account_id,acc); + return 0; + + case 0x2727: + if (RFIFOREST (fd) < 6) + return 0; + { + int acc, sex; + unsigned char buf[16]; + acc = RFIFOL (fd, 4); + sprintf (tmpsql, + "SELECT `sex` FROM `%s` WHERE `%s` = '%d'", + login_db, login_db_account_id, acc); + + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + return 0; + } + + sql_res = mysql_store_result (&mysql_handle); + + if (sql_res) + { + if (mysql_num_rows (sql_res) == 0) + { + mysql_free_result (sql_res); + return 0; + } + sql_row = mysql_fetch_row (sql_res); //row fetching + } + + if (strcmpi (sql_row[0], "M") == 0) + sex = 1; + else + sex = 0; + sprintf (tmpsql, + "UPDATE `%s` SET `sex` = '%c' WHERE `%s` = '%d'", + login_db, (sex == 0 ? 'M' : 'F'), + login_db_account_id, acc); //query - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); } - break; - } - RFIFOSKIP(fd,6); - } - return 0; - - default: - printf("login: unknown packet %x! (from char).\n", RFIFOW(fd,0)); - session[fd]->eof = 1; - return 0; - } - } + WBUFW (buf, 0) = 0x2723; + WBUFL (buf, 2) = acc; + WBUFB (buf, 6) = sex; + charif_sendallwos (-1, buf, 7); + RFIFOSKIP (fd, 6); + } + return 0; + + case 0x2728: // save account_reg + if (RFIFOREST (fd) < 4 || RFIFOREST (fd) < RFIFOW (fd, 2)) + return 0; + { + int acc, p, j; + char str[32]; + char temp_str[32]; + int value; + acc = RFIFOL (fd, 4); + + if (acc > 0) + { + unsigned char buf[RFIFOW (fd, 2) + 1]; + for (p = 8, j = 0; + p < RFIFOW (fd, 2) && j < ACCOUNT_REG2_NUM; + p += 36, j++) + { + memcpy (str, RFIFOP (fd, p), 32); + value = RFIFOL (fd, p + 32); + sprintf (tmpsql, + "DELETE FROM `global_reg_value` WHERE `type`='1' AND `account_id`='%d' AND `str`='%s';", + acc, jstrescapecpy (temp_str, str)); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sprintf (tmpsql, + "INSERT INTO `global_reg_value` (`type`, `account_id`, `str`, `value`) VALUES ( 1 , '%d' , '%s' , '%d');", + acc, jstrescapecpy (temp_str, str), + value); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + } + + // Send to char + memcpy (WBUFP (buf, 0), RFIFOP (fd, 0), + RFIFOW (fd, 2)); + WBUFW (buf, 0) = 0x2729; + charif_sendallwos (fd, buf, WBUFW (buf, 2)); + } + } + RFIFOSKIP (fd, RFIFOW (fd, 2)); + //printf("login: save account_reg (from char)\n"); + break; + + case 0x272a: // Receiving of map-server via char-server a unban resquest (by Yor) + if (RFIFOREST (fd) < 6) + return 0; + { + int acc; + acc = RFIFOL (fd, 2); + sprintf (tmpsql, + "SELECT `ban_until` FROM `%s` WHERE `%s` = '%d'", + login_db, login_db_account_id, acc); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + sql_row = mysql_fetch_row (sql_res); //row fetching + } + if (atol (sql_row[0]) != 0) + { + sprintf (tmpsql, + "UPDATE `%s` SET `ban_until` = '0', `state`='0' WHERE `%s` = '%d'", + login_db, login_db_account_id, acc); + //query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + break; + } + RFIFOSKIP (fd, 6); + } + return 0; - return 0; + default: + printf ("login: unknown packet %x! (from char).\n", + RFIFOW (fd, 0)); + session[fd]->eof = 1; + return 0; + } + } + + return 0; } //Lan ip check added by Kashy -int lan_ip_check(unsigned char *p) { - int y; - int lancheck = 1; - int lancharip[4]; - - unsigned int k0, k1, k2, k3; - sscanf(lan_char_ip, "%d.%d.%d.%d", &k0, &k1, &k2, &k3); - lancharip[0] = k0; lancharip[1] = k1; lancharip[2] = k2; lancharip[3] = k3; - - for(y = 0; y < 4; y++) { - if ((lancharip[y] & subnetmaski[y])!= (p[y])) - lancheck = 0; - break; } - - printf("LAN check: %s.\n", (lancheck) ? "\033[1;32mLAN\033[0m" : "\033[1;31mWAN\033[0m"); - return lancheck; +int lan_ip_check (unsigned char *p) +{ + int y; + int lancheck = 1; + int lancharip[4]; + + unsigned int k0, k1, k2, k3; + sscanf (lan_char_ip, "%d.%d.%d.%d", &k0, &k1, &k2, &k3); + lancharip[0] = k0; + lancharip[1] = k1; + lancharip[2] = k2; + lancharip[3] = k3; + + for (y = 0; y < 4; y++) + { + if ((lancharip[y] & subnetmaski[y]) != (p[y])) + lancheck = 0; + break; + } + + printf ("LAN check: %s.\n", + (lancheck) ? "\033[1;32mLAN\033[0m" : "\033[1;31mWAN\033[0m"); + return lancheck; } //---------------------------------------------------------------------------------------- // Default packet parsing (normal players or administation/char-server connection requests) //---------------------------------------------------------------------------------------- -int parse_login(int fd) { - //int len; - - MYSQL_RES* sql_res ; - MYSQL_ROW sql_row = NULL; - - char t_uid[100]; - //int sql_fields, sql_cnt; - struct mmo_account account; - - int result, i; - unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; - char ip[16]; - - sprintf(ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); - - if (ipban > 0) { - //ip ban - //p[0], p[1], p[2], p[3] - //request DB connection - //check - sprintf(tmpsql, "SELECT count(*) FROM `ipbanlist` WHERE `list` = '%d.*.*.*' OR `list` = '%d.%d.*.*' OR `list` = '%d.%d.%d.*' OR `list` = '%d.%d.%d.%d'", - p[0], p[0], p[1], p[0], p[1], p[2], p[0], p[1], p[2], p[3]); - if (mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - sql_res = mysql_store_result(&mysql_handle) ; - sql_row = mysql_fetch_row(sql_res); //row fetching - - if (atoi(sql_row[0]) >0) { - // ip ban ok. - printf ("packet from banned ip : %d.%d.%d.%d" RETCODE, p[0], p[1], p[2], p[3]); - sprintf(tmpsql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', 'unknown','-3', 'ip banned')", loginlog_db, p[0], p[1], p[2], p[3]); - - // query - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - printf ("close session connection...\n"); - - // close connection - session[fd]->eof = 1; - - } else { - printf ("packet from ip (ban check ok) : %d.%d.%d.%d" RETCODE, p[0], p[1], p[2], p[3]); - } - mysql_free_result(sql_res); - } - - if (session[fd]->eof) { - for(i = 0; i < MAX_SERVERS; i++) - if (server_fd[i] == fd) - server_fd[i] = -1; - close(fd); - delete_session(fd); - return 0; - } - - while(RFIFOREST(fd)>=2){ - printf("parse_login : %d %d packet case=%x\n", fd, RFIFOREST(fd), RFIFOW(fd,0)); - - switch(RFIFOW(fd,0)){ - case 0x200: // New alive packet: structure: 0x200 <account.userid>.24B. used to verify if client is always alive. - if (RFIFOREST(fd) < 26) - return 0; - RFIFOSKIP(fd,26); - break; - - case 0x204: // New alive packet: structure: 0x204 <encrypted.account.userid>.16B. (new ragexe from 22 june 2004) - if (RFIFOREST(fd) < 18) - return 0; - RFIFOSKIP(fd,18); - break; +int parse_login (int fd) +{ + //int len; + + MYSQL_RES *sql_res; + MYSQL_ROW sql_row = NULL; + + char t_uid[100]; + //int sql_fields, sql_cnt; + struct mmo_account account; + + int result, i; + unsigned char *p = (unsigned char *) &session[fd]->client_addr.sin_addr; + char ip[16]; + + sprintf (ip, "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); + + if (ipban > 0) + { + //ip ban + //p[0], p[1], p[2], p[3] + //request DB connection + //check + sprintf (tmpsql, + "SELECT count(*) FROM `ipbanlist` WHERE `list` = '%d.*.*.*' OR `list` = '%d.%d.*.*' OR `list` = '%d.%d.%d.*' OR `list` = '%d.%d.%d.%d'", + p[0], p[0], p[1], p[0], p[1], p[2], p[0], p[1], p[2], p[3]); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } - case 0x64: // request client login - case 0x01dd: // request client login with encrypt - if(RFIFOREST(fd)< ((RFIFOW(fd, 0) ==0x64)?55:47)) - return 0; + sql_res = mysql_store_result (&mysql_handle); + sql_row = mysql_fetch_row (sql_res); //row fetching + + if (atoi (sql_row[0]) > 0) + { + // ip ban ok. + printf ("packet from banned ip : %d.%d.%d.%d" RETCODE, p[0], p[1], + p[2], p[3]); + sprintf (tmpsql, + "INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', 'unknown','-3', 'ip banned')", + loginlog_db, p[0], p[1], p[2], p[3]); + + // query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + printf ("close session connection...\n"); - printf("client connection request %s from %d.%d.%d.%d\n", RFIFOP(fd, 6), p[0], p[1], p[2], p[3]); + // close connection + session[fd]->eof = 1; - account.userid = RFIFOP(fd, 6); - account.passwd = RFIFOP(fd, 30); + } + else + { + printf ("packet from ip (ban check ok) : %d.%d.%d.%d" RETCODE, + p[0], p[1], p[2], p[3]); + } + mysql_free_result (sql_res); + } + + if (session[fd]->eof) + { + for (i = 0; i < MAX_SERVERS; i++) + if (server_fd[i] == fd) + server_fd[i] = -1; + close (fd); + delete_session (fd); + return 0; + } + + while (RFIFOREST (fd) >= 2) + { + printf ("parse_login : %d %d packet case=%x\n", fd, RFIFOREST (fd), + RFIFOW (fd, 0)); + + switch (RFIFOW (fd, 0)) + { + case 0x200: // New alive packet: structure: 0x200 <account.userid>.24B. used to verify if client is always alive. + if (RFIFOREST (fd) < 26) + return 0; + RFIFOSKIP (fd, 26); + break; + + case 0x204: // New alive packet: structure: 0x204 <encrypted.account.userid>.16B. (new ragexe from 22 june 2004) + if (RFIFOREST (fd) < 18) + return 0; + RFIFOSKIP (fd, 18); + break; + + case 0x64: // request client login + case 0x01dd: // request client login with encrypt + if (RFIFOREST (fd) < ((RFIFOW (fd, 0) == 0x64) ? 55 : 47)) + return 0; + + printf ("client connection request %s from %d.%d.%d.%d\n", + RFIFOP (fd, 6), p[0], p[1], p[2], p[3]); + + account.userid = RFIFOP (fd, 6); + account.passwd = RFIFOP (fd, 30); #ifdef PASSWORDENC - account.passwdenc= (RFIFOW(fd,0)==0x64)?0:PASSWORDENC; + account.passwdenc = + (RFIFOW (fd, 0) == 0x64) ? 0 : PASSWORDENC; #else - account.passwdenc=0; + account.passwdenc = 0; #endif - result=mmo_auth(&account, fd); - - jstrescapecpy(t_uid,RFIFOP(fd, 6)); - if(result==-1){ - int gm_level = isGM(account.account_id); - if (min_level_to_connect > gm_level) { - WFIFOW(fd,0) = 0x81; - WFIFOL(fd,2) = 1; // 01 = Server closed - WFIFOSET(fd,3); - } else { - if (p[0] != 127) { - sprintf(tmpsql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s','100', 'login ok')", loginlog_db, p[0], p[1], p[2], p[3], t_uid); - //query - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } + result = mmo_auth (&account, fd); + + jstrescapecpy (t_uid, RFIFOP (fd, 6)); + if (result == -1) + { + int gm_level = isGM (account.account_id); + if (min_level_to_connect > gm_level) + { + WFIFOW (fd, 0) = 0x81; + WFIFOL (fd, 2) = 1; // 01 = Server closed + WFIFOSET (fd, 3); } - if (gm_level) - printf("Connection of the GM (level:%d) account '%s' accepted.\n", gm_level, account.userid); - else - printf("Connection of the account '%s' accepted.\n", account.userid); - server_num=0; - for(i = 0; i < MAX_SERVERS; i++) { - if (server_fd[i] >= 0) { - //Lan check added by Kashy - if (lan_ip_check(p)) - WFIFOL(fd,47+server_num*32) = inet_addr(lan_char_ip); - else - WFIFOL(fd,47+server_num*32) = server[i].ip; - WFIFOW(fd,47+server_num*32+4) = server[i].port; - memcpy(WFIFOP(fd,47+server_num*32+6), server[i].name, 20); - WFIFOW(fd,47+server_num*32+26) = server[i].users; - WFIFOW(fd,47+server_num*32+28) = server[i].maintenance; - WFIFOW(fd,47+server_num*32+30) = server[i].new; - server_num++; + else + { + if (p[0] != 127) + { + sprintf (tmpsql, + "INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s','100', 'login ok')", + loginlog_db, p[0], p[1], p[2], p[3], + t_uid); + //query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + } + if (gm_level) + printf + ("Connection of the GM (level:%d) account '%s' accepted.\n", + gm_level, account.userid); + else + printf + ("Connection of the account '%s' accepted.\n", + account.userid); + server_num = 0; + for (i = 0; i < MAX_SERVERS; i++) + { + if (server_fd[i] >= 0) + { + //Lan check added by Kashy + if (lan_ip_check (p)) + WFIFOL (fd, 47 + server_num * 32) = + inet_addr (lan_char_ip); + else + WFIFOL (fd, 47 + server_num * 32) = + server[i].ip; + WFIFOW (fd, 47 + server_num * 32 + 4) = + server[i].port; + memcpy (WFIFOP (fd, 47 + server_num * 32 + 6), + server[i].name, 20); + WFIFOW (fd, 47 + server_num * 32 + 26) = + server[i].users; + WFIFOW (fd, 47 + server_num * 32 + 28) = + server[i].maintenance; + WFIFOW (fd, 47 + server_num * 32 + 30) = + server[i].new; + server_num++; + } + } + // if at least 1 char-server + if (server_num > 0) + { + WFIFOW (fd, 0) = 0x69; + WFIFOW (fd, 2) = 47 + 32 * server_num; + WFIFOL (fd, 4) = account.login_id1; + WFIFOL (fd, 8) = account.account_id; + WFIFOL (fd, 12) = account.login_id2; + WFIFOL (fd, 16) = 0; + memcpy (WFIFOP (fd, 20), account.lastlogin, 24); + WFIFOB (fd, 46) = account.sex; + WFIFOSET (fd, 47 + 32 * server_num); + if (auth_fifo_pos >= AUTH_FIFO_SIZE) + auth_fifo_pos = 0; + auth_fifo[auth_fifo_pos].account_id = + account.account_id; + auth_fifo[auth_fifo_pos].login_id1 = + account.login_id1; + auth_fifo[auth_fifo_pos].login_id2 = + account.login_id2; + auth_fifo[auth_fifo_pos].sex = account.sex; + auth_fifo[auth_fifo_pos].delflag = 0; + auth_fifo[auth_fifo_pos].ip = + session[fd]->client_addr.sin_addr.s_addr; + auth_fifo_pos++; + } + else + { + WFIFOW (fd, 0) = 0x81; + WFIFOL (fd, 2) = 1; // 01 = Server closed + WFIFOSET (fd, 3); } } - // if at least 1 char-server - if (server_num > 0) { - WFIFOW(fd,0)=0x69; - WFIFOW(fd,2)=47+32*server_num; - WFIFOL(fd,4)=account.login_id1; - WFIFOL(fd,8)=account.account_id; - WFIFOL(fd,12)=account.login_id2; - WFIFOL(fd,16)=0; - memcpy(WFIFOP(fd,20),account.lastlogin,24); - WFIFOB(fd,46)=account.sex; - WFIFOSET(fd,47+32*server_num); - if(auth_fifo_pos>=AUTH_FIFO_SIZE) - auth_fifo_pos=0; - auth_fifo[auth_fifo_pos].account_id=account.account_id; - auth_fifo[auth_fifo_pos].login_id1=account.login_id1; - auth_fifo[auth_fifo_pos].login_id2=account.login_id2; - auth_fifo[auth_fifo_pos].sex=account.sex; - auth_fifo[auth_fifo_pos].delflag=0; - auth_fifo[auth_fifo_pos].ip = session[fd]->client_addr.sin_addr.s_addr; - auth_fifo_pos++; - } else { - WFIFOW(fd,0) = 0x81; - WFIFOL(fd,2) = 1; // 01 = Server closed - WFIFOSET(fd,3); + } + else + { + char tmp_sql[512]; + char error[64]; + sprintf (tmp_sql, + "INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s', '%d','login failed : %%s')", + loginlog_db, p[0], p[1], p[2], p[3], t_uid, + result); + switch ((result + 1)) + { + case -2: //-3 = Account Banned + sprintf (tmpsql, tmp_sql, "Account banned."); + sprintf (error, "Account banned."); + break; + case -1: //-2 = Dynamic Ban + sprintf (tmpsql, tmp_sql, + "dynamic ban (ip and account)."); + sprintf (error, "dynamic ban (ip and account)."); + break; + case 1: // 0 = Unregistered ID + sprintf (tmpsql, tmp_sql, "Unregisterd ID."); + sprintf (error, "Unregisterd ID."); + break; + case 2: // 1 = Incorrect Password + sprintf (tmpsql, tmp_sql, "Incorrect Password."); + sprintf (error, "Incorrect Password."); + break; + case 3: // 2 = This ID is expired + sprintf (tmpsql, tmp_sql, "Account Expired."); + sprintf (error, "Account Expired."); + break; + case 4: // 3 = Rejected from Server + sprintf (tmpsql, tmp_sql, + "Rejected from server."); + sprintf (error, "Rejected from server."); + break; + case 5: // 4 = You have been blocked by the GM Team + sprintf (tmpsql, tmp_sql, "Blocked by GM."); + sprintf (error, "Blocked by GM."); + break; + case 6: // 5 = Your Game's EXE file is not the latest version + sprintf (tmpsql, tmp_sql, "Not latest game EXE."); + sprintf (error, "Not latest game EXE."); + break; + case 7: // 6 = Your are Prohibited to log in until %s + sprintf (tmpsql, tmp_sql, "Banned."); + sprintf (error, "Banned."); + break; + case 8: // 7 = Server is jammed due to over populated + sprintf (tmpsql, tmp_sql, + "Server Over-population."); + sprintf (error, "Server Over-population."); + break; + case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this) + sprintf (tmpsql, tmp_sql, " "); + sprintf (error, " "); + break; + case 100: // 99 = This ID has been totally erased + sprintf (tmpsql, tmp_sql, "Account gone."); + sprintf (error, "Account gone."); + break; + default: + sprintf (tmpsql, tmp_sql, "Uknown Error."); + sprintf (error, "Uknown Error."); + break; + } + //query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + if ((result == 1) && (dynamic_pass_failure_ban != 0)) + { // failed password + sprintf (tmpsql, "SELECT count(*) FROM `%s` WHERE `ip` = '%d.%d.%d.%d' AND `rcode` = '1' AND `time` > NOW() - INTERVAL %d MINUTE", loginlog_db, p[0], p[1], p[2], p[3], dynamic_pass_failure_ban_time); //how many times filed account? in one ip. + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + //check query result + sql_res = mysql_store_result (&mysql_handle); + sql_row = mysql_fetch_row (sql_res); //row fetching + + if (atoi (sql_row[0]) >= + dynamic_pass_failure_ban_how_many) + { + sprintf (tmpsql, + "INSERT INTO `ipbanlist`(`list`,`btime`,`rtime`,`reason`) VALUES ('%d.%d.%d.*', NOW() , NOW() + INTERVAL %d MINUTE ,'Password error ban: %s')", + p[0], p[1], p[2], + dynamic_pass_failure_ban_how_long, + t_uid); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + } + mysql_free_result (sql_res); + } + else if (result == -2) + { //dynamic banned - add ip to ban list. + sprintf (tmpsql, + "INSERT INTO `ipbanlist`(`list`,`btime`,`rtime`,`reason`) VALUES ('%d.%d.%d.*', NOW() , NOW() + INTERVAL 1 MONTH ,'Dynamic banned user id : %s')", + p[0], p[1], p[2], t_uid); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + result = -3; } - } - } else { - char tmp_sql[512]; - char error[64]; - sprintf(tmp_sql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s', '%d','login failed : %%s')", loginlog_db, p[0], p[1], p[2], p[3], t_uid, result); - switch((result + 1)) { - case -2: //-3 = Account Banned - sprintf(tmpsql,tmp_sql,"Account banned."); - sprintf(error,"Account banned."); - break; - case -1: //-2 = Dynamic Ban - sprintf(tmpsql,tmp_sql,"dynamic ban (ip and account)."); - sprintf(error,"dynamic ban (ip and account)."); - break; - case 1: // 0 = Unregistered ID - sprintf(tmpsql,tmp_sql,"Unregisterd ID."); - sprintf(error,"Unregisterd ID."); - break; - case 2: // 1 = Incorrect Password - sprintf(tmpsql,tmp_sql,"Incorrect Password."); - sprintf(error,"Incorrect Password."); - break; - case 3: // 2 = This ID is expired - sprintf(tmpsql,tmp_sql,"Account Expired."); - sprintf(error,"Account Expired."); - break; - case 4: // 3 = Rejected from Server - sprintf(tmpsql,tmp_sql,"Rejected from server."); - sprintf(error,"Rejected from server."); - break; - case 5: // 4 = You have been blocked by the GM Team - sprintf(tmpsql,tmp_sql,"Blocked by GM."); - sprintf(error,"Blocked by GM."); - break; - case 6: // 5 = Your Game's EXE file is not the latest version - sprintf(tmpsql,tmp_sql,"Not latest game EXE."); - sprintf(error,"Not latest game EXE."); - break; - case 7: // 6 = Your are Prohibited to log in until %s - sprintf(tmpsql,tmp_sql,"Banned."); - sprintf(error,"Banned."); - break; - case 8: // 7 = Server is jammed due to over populated - sprintf(tmpsql,tmp_sql,"Server Over-population."); - sprintf(error,"Server Over-population."); - break; - case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this) - sprintf(tmpsql,tmp_sql," "); - sprintf(error," "); - break; - case 100: // 99 = This ID has been totally erased - sprintf(tmpsql,tmp_sql,"Account gone."); - sprintf(error,"Account gone."); - break; - default: - sprintf(tmpsql,tmp_sql,"Uknown Error."); - sprintf(error,"Uknown Error."); - break; - } - //query - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - if ((result == 1) && (dynamic_pass_failure_ban != 0)){ // failed password - sprintf(tmpsql,"SELECT count(*) FROM `%s` WHERE `ip` = '%d.%d.%d.%d' AND `rcode` = '1' AND `time` > NOW() - INTERVAL %d MINUTE", - loginlog_db, p[0], p[1], p[2], p[3], dynamic_pass_failure_ban_time); //how many times filed account? in one ip. - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - //check query result - sql_res = mysql_store_result(&mysql_handle) ; - sql_row = mysql_fetch_row(sql_res); //row fetching - - if (atoi(sql_row[0]) >= dynamic_pass_failure_ban_how_many ) { - sprintf(tmpsql,"INSERT INTO `ipbanlist`(`list`,`btime`,`rtime`,`reason`) VALUES ('%d.%d.%d.*', NOW() , NOW() + INTERVAL %d MINUTE ,'Password error ban: %s')", p[0], p[1], p[2], dynamic_pass_failure_ban_how_long, t_uid); - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - } - mysql_free_result(sql_res); - } - else if (result == -2){ //dynamic banned - add ip to ban list. - sprintf(tmpsql,"INSERT INTO `ipbanlist`(`list`,`btime`,`rtime`,`reason`) VALUES ('%d.%d.%d.*', NOW() , NOW() + INTERVAL 1 MONTH ,'Dynamic banned user id : %s')", p[0], p[1], p[2], t_uid); - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - result = -3; - } - - sprintf(tmpsql,"SELECT `ban_until` FROM `%s` WHERE `%s` = '%s'",login_db,login_db_userid, t_uid); - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - sql_res = mysql_store_result(&mysql_handle) ; - if (sql_res) { - sql_row = mysql_fetch_row(sql_res); //row fetching - } - //cannot connect login failed - memset(WFIFOP(fd,0),'\0',23); - WFIFOW(fd,0)=0x6a; - WFIFOB(fd,2)=result; - if (result == 6) { // 6 = Your are Prohibited to log in until %s - if (atol(sql_row[0]) != 0) { // if account is banned, we send ban timestamp - char tmpstr[256]; - time_t ban_until_time; - ban_until_time = atol(sql_row[0]); - strftime(tmpstr, 20, date_format, gmtime(&ban_until_time)); - tmpstr[19] = '\0'; - memcpy(WFIFOP(fd,3), tmpstr, 20); - } else { // we send error message - memcpy(WFIFOP(fd,3), error, 20); - } - } - WFIFOSET(fd,23); - } - RFIFOSKIP(fd,(RFIFOW(fd,0)==0x64)?55:47); - break; - - case 0x01db: // request password key - if (session[fd]->session_data) { - printf("login: abnormal request of MD5 key (already opened session).\n"); - session[fd]->eof = 1; - return 0; - } - printf("Request Password key -%s\n",md5key); - RFIFOSKIP(fd,2); - WFIFOW(fd,0)=0x01dc; - WFIFOW(fd,2)=4+md5keylen; - memcpy(WFIFOP(fd,4),md5key,md5keylen); - WFIFOSET(fd,WFIFOW(fd,2)); - break; - - case 0x2710: // request Char-server connection - if(RFIFOREST(fd)<86) - return 0; - { - sprintf(tmpsql,"INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s@%s','100', 'charserver - %s@%d.%d.%d.%d:%d')", loginlog_db, p[0], p[1], p[2], p[3], RFIFOP(fd, 2),RFIFOP(fd, 60),RFIFOP(fd, 60), RFIFOB(fd, 54), RFIFOB(fd, 55), RFIFOB(fd, 56), RFIFOB(fd, 57), RFIFOW(fd, 58)); - - //query - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - printf("server connection request %s @ %d.%d.%d.%d:%d (%d.%d.%d.%d)\n", - RFIFOP(fd, 60), RFIFOB(fd, 54), RFIFOB(fd, 55), RFIFOB(fd, 56), RFIFOB(fd, 57), RFIFOW(fd, 58), - p[0], p[1], p[2], p[3]); - unsigned char* server_name; - account.userid = RFIFOP(fd, 2); - account.passwd = RFIFOP(fd, 26); - account.passwdenc = 0; - server_name = RFIFOP(fd,60); - result = mmo_auth(&account, fd); - //printf("Result: %d - Sex: %d - Account ID: %d\n",result,account.sex,(int) account.account_id); - - if(result == -1 && account.sex==2 && account.account_id<MAX_SERVERS && server_fd[account.account_id]==-1){ - printf("Connection of the char-server '%s' accepted.\n", server_name); - memset(&server[account.account_id], 0, sizeof(struct mmo_char_server)); - server[account.account_id].ip=RFIFOL(fd,54); - server[account.account_id].port=RFIFOW(fd,58); - memcpy(server[account.account_id].name,RFIFOP(fd,60),20); - server[account.account_id].users=0; - server[account.account_id].maintenance=RFIFOW(fd,82); - server[account.account_id].new=RFIFOW(fd,84); - server_fd[account.account_id]=fd; - if(anti_freeze_enable) - server_freezeflag[account.account_id] = 5; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed - sprintf(tmpsql,"DELETE FROM `sstatus` WHERE `index`='%ld'", account.account_id); - //query - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - - jstrescapecpy(t_uid,server[account.account_id].name); - sprintf(tmpsql,"INSERT INTO `sstatus`(`index`,`name`,`user`) VALUES ( '%ld', '%s', '%d')", - account.account_id, server[account.account_id].name,0); - //query - if(mysql_query(&mysql_handle, tmpsql)) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } - WFIFOW(fd,0)=0x2711; - WFIFOB(fd,2)=0; - WFIFOSET(fd,3); - session[fd]->func_parse=parse_fromchar; - realloc_fifo(fd,FIFOSIZE_SERVERLINK,FIFOSIZE_SERVERLINK); - } else { - WFIFOW(fd, 0) =0x2711; - WFIFOB(fd, 2)=3; - WFIFOSET(fd, 3); - } - } - RFIFOSKIP(fd, 86); - return 0; - - case 0x7530: // request Athena information - WFIFOW(fd,0)=0x7531; - WFIFOB(fd,2)=ATHENA_MAJOR_VERSION; - WFIFOB(fd,3)=ATHENA_MINOR_VERSION; - WFIFOB(fd,4)=ATHENA_REVISION; - WFIFOB(fd,5)=ATHENA_RELEASE_FLAG; - WFIFOB(fd,6)=ATHENA_OFFICIAL_FLAG; - WFIFOB(fd,7)=ATHENA_SERVER_LOGIN; - WFIFOW(fd,8)=ATHENA_MOD_VERSION; - WFIFOSET(fd,10); - RFIFOSKIP(fd,2); - printf ("Athena version check...\n"); - break; - case 0x7532: - default: - printf ("End of connection (ip: %s)" RETCODE, ip); - session[fd]->eof = 1; - return 0; - } - } + sprintf (tmpsql, + "SELECT `ban_until` FROM `%s` WHERE `%s` = '%s'", + login_db, login_db_userid, t_uid); + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + if (sql_res) + { + sql_row = mysql_fetch_row (sql_res); //row fetching + } + //cannot connect login failed + memset (WFIFOP (fd, 0), '\0', 23); + WFIFOW (fd, 0) = 0x6a; + WFIFOB (fd, 2) = result; + if (result == 6) + { // 6 = Your are Prohibited to log in until %s + if (atol (sql_row[0]) != 0) + { // if account is banned, we send ban timestamp + char tmpstr[256]; + time_t ban_until_time; + ban_until_time = atol (sql_row[0]); + strftime (tmpstr, 20, date_format, + gmtime (&ban_until_time)); + tmpstr[19] = '\0'; + memcpy (WFIFOP (fd, 3), tmpstr, 20); + } + else + { // we send error message + memcpy (WFIFOP (fd, 3), error, 20); + } + } + WFIFOSET (fd, 23); + } + RFIFOSKIP (fd, (RFIFOW (fd, 0) == 0x64) ? 55 : 47); + break; + + case 0x01db: // request password key + if (session[fd]->session_data) + { + printf + ("login: abnormal request of MD5 key (already opened session).\n"); + session[fd]->eof = 1; + return 0; + } + printf ("Request Password key -%s\n", md5key); + RFIFOSKIP (fd, 2); + WFIFOW (fd, 0) = 0x01dc; + WFIFOW (fd, 2) = 4 + md5keylen; + memcpy (WFIFOP (fd, 4), md5key, md5keylen); + WFIFOSET (fd, WFIFOW (fd, 2)); + break; + + case 0x2710: // request Char-server connection + if (RFIFOREST (fd) < 86) + return 0; + { + sprintf (tmpsql, + "INSERT INTO `%s`(`time`,`ip`,`user`,`rcode`,`log`) VALUES (NOW(), '%d.%d.%d.%d', '%s@%s','100', 'charserver - %s@%d.%d.%d.%d:%d')", + loginlog_db, p[0], p[1], p[2], p[3], RFIFOP (fd, + 2), + RFIFOP (fd, 60), RFIFOP (fd, 60), RFIFOB (fd, + 54), + RFIFOB (fd, 55), RFIFOB (fd, 56), RFIFOB (fd, + 57), + RFIFOW (fd, 58)); + + //query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + printf + ("server connection request %s @ %d.%d.%d.%d:%d (%d.%d.%d.%d)\n", + RFIFOP (fd, 60), RFIFOB (fd, 54), RFIFOB (fd, 55), + RFIFOB (fd, 56), RFIFOB (fd, 57), RFIFOW (fd, 58), + p[0], p[1], p[2], p[3]); + unsigned char *server_name; + account.userid = RFIFOP (fd, 2); + account.passwd = RFIFOP (fd, 26); + account.passwdenc = 0; + server_name = RFIFOP (fd, 60); + result = mmo_auth (&account, fd); + //printf("Result: %d - Sex: %d - Account ID: %d\n",result,account.sex,(int) account.account_id); + + if (result == -1 && account.sex == 2 + && account.account_id < MAX_SERVERS + && server_fd[account.account_id] == -1) + { + printf + ("Connection of the char-server '%s' accepted.\n", + server_name); + memset (&server[account.account_id], 0, + sizeof (struct mmo_char_server)); + server[account.account_id].ip = RFIFOL (fd, 54); + server[account.account_id].port = RFIFOW (fd, 58); + memcpy (server[account.account_id].name, + RFIFOP (fd, 60), 20); + server[account.account_id].users = 0; + server[account.account_id].maintenance = + RFIFOW (fd, 82); + server[account.account_id].new = RFIFOW (fd, 84); + server_fd[account.account_id] = fd; + if (anti_freeze_enable) + server_freezeflag[account.account_id] = 5; // Char-server anti-freeze system. Counter. 5 ok, 4...0 freezed + sprintf (tmpsql, + "DELETE FROM `sstatus` WHERE `index`='%ld'", + account.account_id); + //query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + + jstrescapecpy (t_uid, + server[account.account_id].name); + sprintf (tmpsql, + "INSERT INTO `sstatus`(`index`,`name`,`user`) VALUES ( '%ld', '%s', '%d')", + account.account_id, + server[account.account_id].name, 0); + //query + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + WFIFOW (fd, 0) = 0x2711; + WFIFOB (fd, 2) = 0; + WFIFOSET (fd, 3); + session[fd]->func_parse = parse_fromchar; + realloc_fifo (fd, FIFOSIZE_SERVERLINK, + FIFOSIZE_SERVERLINK); + } + else + { + WFIFOW (fd, 0) = 0x2711; + WFIFOB (fd, 2) = 3; + WFIFOSET (fd, 3); + } + } + RFIFOSKIP (fd, 86); + return 0; + + case 0x7530: // request Athena information + WFIFOW (fd, 0) = 0x7531; + WFIFOB (fd, 2) = ATHENA_MAJOR_VERSION; + WFIFOB (fd, 3) = ATHENA_MINOR_VERSION; + WFIFOB (fd, 4) = ATHENA_REVISION; + WFIFOB (fd, 5) = ATHENA_RELEASE_FLAG; + WFIFOB (fd, 6) = ATHENA_OFFICIAL_FLAG; + WFIFOB (fd, 7) = ATHENA_SERVER_LOGIN; + WFIFOW (fd, 8) = ATHENA_MOD_VERSION; + WFIFOSET (fd, 10); + RFIFOSKIP (fd, 2); + printf ("Athena version check...\n"); + break; + + case 0x7532: + default: + printf ("End of connection (ip: %s)" RETCODE, ip); + session[fd]->eof = 1; + return 0; + } + } - return 0; + return 0; } //------------------------------------------------- // Return numerical value of a switch configuration // on/off, english, fran軋is, deutsch, espaol //------------------------------------------------- -int config_switch(const char *str) { - if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0) - return 1; - if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0) - return 0; - - return atoi(str); +int config_switch (const char *str) +{ + if (strcmpi (str, "on") == 0 || strcmpi (str, "yes") == 0 + || strcmpi (str, "oui") == 0 || strcmpi (str, "ja") == 0 + || strcmpi (str, "si") == 0) + return 1; + if (strcmpi (str, "off") == 0 || strcmpi (str, "no") == 0 + || strcmpi (str, "non") == 0 || strcmpi (str, "nein") == 0) + return 0; + + return atoi (str); } - //Lan Support conf reading added by Kashy -int login_lan_config_read(const char *lancfgName){ - int i; - char subnetmask[128]; - char line[1024], w1[1024], w2[1024]; - FILE *fp; - - fp=fopen_(lancfgName, "r"); +int login_lan_config_read (const char *lancfgName) +{ + int i; + char subnetmask[128]; + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + fp = fopen_ (lancfgName, "r"); + + if (fp == NULL) + { + printf ("file not found: %s\n", lancfgName); + return 1; + } + printf ("Start reading of Lan Support configuration file\n"); + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + + i = sscanf (line, "%[^:]: %[^\r\n]", w1, w2); + if (i != 2) + continue; + + else if (strcmpi (w1, "lan_char_ip") == 0) + { + strcpy (lan_char_ip, w2); + printf ("set Lan_Char_IP : %s\n", w2); + } - if (fp == NULL) { - printf("file not found: %s\n", lancfgName); - return 1; - } - printf("Start reading of Lan Support configuration file\n"); - while(fgets(line, sizeof(line)-1, fp)){ - if (line[0] == '/' && line[1] == '/') - continue; - - i = sscanf(line,"%[^:]: %[^\r\n]",w1,w2); - if(i!=2) - continue; - - else if(strcmpi(w1,"lan_char_ip")==0){ - strcpy(lan_char_ip, w2); - printf ("set Lan_Char_IP : %s\n",w2); - } - - else if(strcmpi(w1,"subnetmask")==0){ - strcpy(subnetmask, w2); - unsigned int k0, k1, k2, k3; - sscanf(subnetmask, "%d.%d.%d.%d", &k0, &k1, &k2, &k3); - subnetmaski[0] = k0; subnetmaski[1] = k1; subnetmaski[2] = k2; subnetmaski[3] = k3; - printf ("set subnetmask : %s\n",w2); - } - } - fclose_(fp); - - { - unsigned int a0, a1, a2, a3; - unsigned char p[4]; - sscanf(lan_char_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3); - p[0] = a0; p[1] = a1; p[2] = a2; p[3] = a3; - printf("LAN test of LAN IP of the char-server: "); - if (lan_ip_check(p) == 0) { - printf("\033[1;31m***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network\033[0m\n"); - } - } + else if (strcmpi (w1, "subnetmask") == 0) + { + strcpy (subnetmask, w2); + unsigned int k0, k1, k2, k3; + sscanf (subnetmask, "%d.%d.%d.%d", &k0, &k1, &k2, &k3); + subnetmaski[0] = k0; + subnetmaski[1] = k1; + subnetmaski[2] = k2; + subnetmaski[3] = k3; + printf ("set subnetmask : %s\n", w2); + } + } + fclose_ (fp); + + { + unsigned int a0, a1, a2, a3; + unsigned char p[4]; + sscanf (lan_char_ip, "%d.%d.%d.%d", &a0, &a1, &a2, &a3); + p[0] = a0; + p[1] = a1; + p[2] = a2; + p[3] = a3; + printf ("LAN test of LAN IP of the char-server: "); + if (lan_ip_check (p) == 0) + { + printf + ("\033[1;31m***ERROR: LAN IP of the char-server doesn't belong to the specified Sub-network\033[0m\n"); + } + } - printf("End reading of Lan Support configuration file\n"); + printf ("End reading of Lan Support configuration file\n"); - return 0; + return 0; } //----------------------------------------------------- //BANNED IP CHECK. //----------------------------------------------------- -int ip_ban_check(int tid, unsigned int tick, int id, int data){ +int ip_ban_check (int tid, unsigned int tick, int id, int data) +{ - //query - if(mysql_query(&mysql_handle, "DELETE FROM `ipbanlist` WHERE `rtime` <= NOW()")) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle)); - } + //query + if (mysql_query + (&mysql_handle, "DELETE FROM `ipbanlist` WHERE `rtime` <= NOW()")) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } - return 0; + return 0; } //----------------------------------------------------- // reading configuration //----------------------------------------------------- -int login_config_read(const char *cfgName){ - int i; - char line[1024], w1[1024], w2[1024]; - FILE *fp; - - fp=fopen_(cfgName,"r"); - - if(fp==NULL){ - printf("Configuration file (%s) not found.\n", cfgName); - return 1; - } - printf ("start reading configuration...\n"); - while(fgets(line, sizeof(line)-1, fp)){ - if(line[0] == '/' && line[1] == '/') - continue; - - i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2); - if(i!=2) - continue; - - else if(strcmpi(w1,"login_port")==0){ - login_port=atoi(w2); - printf ("set login_port : %s\n",w2); - } - else if(strcmpi(w1,"ipban")==0){ - ipban=atoi(w2); - printf ("set ipban : %d\n",ipban); - } - //account ban -> ip ban - else if(strcmpi(w1,"dynamic_account_ban")==0){ - dynamic_account_ban=atoi(w2); - printf ("set dynamic_account_ban : %d\n",dynamic_account_ban); - } - else if(strcmpi(w1,"dynamic_account_ban_class")==0){ - dynamic_account_ban_class=atoi(w2); - printf ("set dynamic_account_ban_class : %d\n",dynamic_account_ban_class); - } - //dynamic password error ban - else if(strcmpi(w1,"dynamic_pass_failure_ban")==0){ - dynamic_pass_failure_ban=atoi(w2); - printf ("set dynamic_pass_failure_ban : %d\n",dynamic_pass_failure_ban); - } - else if(strcmpi(w1,"dynamic_pass_failure_ban_time")==0){ - dynamic_pass_failure_ban_time=atoi(w2); - printf ("set dynamic_pass_failure_ban_time : %d\n",dynamic_pass_failure_ban_time); - } - else if(strcmpi(w1,"dynamic_pass_failure_ban_how_many")==0){ - dynamic_pass_failure_ban_how_many=atoi(w2); - printf ("set dynamic_pass_failure_ban_how_many : %d\n",dynamic_pass_failure_ban_how_many); - } - else if(strcmpi(w1,"dynamic_pass_failure_ban_how_long")==0){ - dynamic_pass_failure_ban_how_long=atoi(w2); - printf ("set dynamic_pass_failure_ban_how_long : %d\n",dynamic_pass_failure_ban_how_long); - } - else if(strcmpi(w1,"anti_freeze_enable")==0){ - anti_freeze_enable = config_switch(w2); - } - else if (strcmpi(w1, "anti_freeze_interval") == 0) { - ANTI_FREEZE_INTERVAL = atoi(w2); - if (ANTI_FREEZE_INTERVAL < 5) - ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds - } - else if (strcmpi(w1, "import") == 0) { - login_config_read(w2); - } - else if(strcmpi(w1,"use_MD5_passwords")==0){ - if (!strcmpi(w2,"yes")) { - use_md5_passwds=1; - } else if (!strcmpi(w2,"no")){ - use_md5_passwds=0; - } - printf ("Using MD5 Passwords: %s \n",w2); - } - else if (strcmpi(w1, "date_format") == 0) { // note: never have more than 19 char for the date! - switch (atoi(w2)) { - case 0: - strcpy(date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59 - break; - case 1: - strcpy(date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59 - break; - case 2: - strcpy(date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59 - break; - case 3: - strcpy(date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59 - break; - } - } - else if (strcmpi(w1, "min_level_to_connect") == 0) { - min_level_to_connect = atoi(w2); - } - else if (strcmpi(w1, "check_ip_flag") == 0) { - check_ip_flag = config_switch(w2); - } - } - fclose_(fp); - printf ("End reading configuration...\n"); - return 0; +int login_config_read (const char *cfgName) +{ + int i; + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + fp = fopen_ (cfgName, "r"); + + if (fp == NULL) + { + printf ("Configuration file (%s) not found.\n", cfgName); + return 1; + } + printf ("start reading configuration...\n"); + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + + i = sscanf (line, "%[^:]: %[^\r\n]", w1, w2); + if (i != 2) + continue; + + else if (strcmpi (w1, "login_port") == 0) + { + login_port = atoi (w2); + printf ("set login_port : %s\n", w2); + } + else if (strcmpi (w1, "ipban") == 0) + { + ipban = atoi (w2); + printf ("set ipban : %d\n", ipban); + } + //account ban -> ip ban + else if (strcmpi (w1, "dynamic_account_ban") == 0) + { + dynamic_account_ban = atoi (w2); + printf ("set dynamic_account_ban : %d\n", dynamic_account_ban); + } + else if (strcmpi (w1, "dynamic_account_ban_class") == 0) + { + dynamic_account_ban_class = atoi (w2); + printf ("set dynamic_account_ban_class : %d\n", + dynamic_account_ban_class); + } + //dynamic password error ban + else if (strcmpi (w1, "dynamic_pass_failure_ban") == 0) + { + dynamic_pass_failure_ban = atoi (w2); + printf ("set dynamic_pass_failure_ban : %d\n", + dynamic_pass_failure_ban); + } + else if (strcmpi (w1, "dynamic_pass_failure_ban_time") == 0) + { + dynamic_pass_failure_ban_time = atoi (w2); + printf ("set dynamic_pass_failure_ban_time : %d\n", + dynamic_pass_failure_ban_time); + } + else if (strcmpi (w1, "dynamic_pass_failure_ban_how_many") == 0) + { + dynamic_pass_failure_ban_how_many = atoi (w2); + printf ("set dynamic_pass_failure_ban_how_many : %d\n", + dynamic_pass_failure_ban_how_many); + } + else if (strcmpi (w1, "dynamic_pass_failure_ban_how_long") == 0) + { + dynamic_pass_failure_ban_how_long = atoi (w2); + printf ("set dynamic_pass_failure_ban_how_long : %d\n", + dynamic_pass_failure_ban_how_long); + } + else if (strcmpi (w1, "anti_freeze_enable") == 0) + { + anti_freeze_enable = config_switch (w2); + } + else if (strcmpi (w1, "anti_freeze_interval") == 0) + { + ANTI_FREEZE_INTERVAL = atoi (w2); + if (ANTI_FREEZE_INTERVAL < 5) + ANTI_FREEZE_INTERVAL = 5; // minimum 5 seconds + } + else if (strcmpi (w1, "import") == 0) + { + login_config_read (w2); + } + else if (strcmpi (w1, "use_MD5_passwords") == 0) + { + if (!strcmpi (w2, "yes")) + { + use_md5_passwds = 1; + } + else if (!strcmpi (w2, "no")) + { + use_md5_passwds = 0; + } + printf ("Using MD5 Passwords: %s \n", w2); + } + else if (strcmpi (w1, "date_format") == 0) + { // note: never have more than 19 char for the date! + switch (atoi (w2)) + { + case 0: + strcpy (date_format, "%d-%m-%Y %H:%M:%S"); // 31-12-2004 23:59:59 + break; + case 1: + strcpy (date_format, "%m-%d-%Y %H:%M:%S"); // 12-31-2004 23:59:59 + break; + case 2: + strcpy (date_format, "%Y-%d-%m %H:%M:%S"); // 2004-31-12 23:59:59 + break; + case 3: + strcpy (date_format, "%Y-%m-%d %H:%M:%S"); // 2004-12-31 23:59:59 + break; + } + } + else if (strcmpi (w1, "min_level_to_connect") == 0) + { + min_level_to_connect = atoi (w2); + } + else if (strcmpi (w1, "check_ip_flag") == 0) + { + check_ip_flag = config_switch (w2); + } + } + fclose_ (fp); + printf ("End reading configuration...\n"); + return 0; } -void sql_config_read(const char *cfgName){ /* Kalaspuff, to get login_db */ - int i; - char line[1024], w1[1024], w2[1024]; - printf("reading configure: %s\n", cfgName); - FILE *fp=fopen_(cfgName,"r"); - if(fp==NULL){ - printf("file not found: %s\n",cfgName); - exit(1); - } - while(fgets(line, sizeof(line)-1, fp)){ - if(line[0] == '/' && line[1] == '/') - continue; - i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2); - if(i!=2) - continue; - if (strcmpi(w1, "login_db") == 0) { - strcpy(login_db, w2); - } - //add for DB connection - else if(strcmpi(w1,"login_server_ip")==0){ - strcpy(login_server_ip, w2); - printf ("set login_server_ip : %s\n",w2); - } - else if(strcmpi(w1,"login_server_port")==0){ - login_server_port=atoi(w2); - printf ("set login_server_port : %s\n",w2); - } - else if(strcmpi(w1,"login_server_id")==0){ - strcpy(login_server_id, w2); - printf ("set login_server_id : %s\n",w2); - } - else if(strcmpi(w1,"login_server_pw")==0){ - strcpy(login_server_pw, w2); - printf ("set login_server_pw : %s\n",w2); - } - else if(strcmpi(w1,"login_server_db")==0){ - strcpy(login_server_db, w2); - printf ("set login_server_db : %s\n",w2); - } - //added for custom column names for custom login table - else if(strcmpi(w1,"login_db_account_id")==0){ - strcpy(login_db_account_id, w2); - } - else if(strcmpi(w1,"login_db_userid")==0){ - strcpy(login_db_userid, w2); - } - else if(strcmpi(w1,"login_db_user_pass")==0){ - strcpy(login_db_user_pass, w2); - } - else if(strcmpi(w1,"login_db_level")==0){ - strcpy(login_db_level, w2); - } - //end of custom table config - else if (strcmpi(w1, "loginlog_db") == 0) { - strcpy(loginlog_db, w2); - } +void sql_config_read (const char *cfgName) +{ /* Kalaspuff, to get login_db */ + int i; + char line[1024], w1[1024], w2[1024]; + printf ("reading configure: %s\n", cfgName); + FILE *fp = fopen_ (cfgName, "r"); + if (fp == NULL) + { + printf ("file not found: %s\n", cfgName); + exit (1); + } + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + i = sscanf (line, "%[^:]: %[^\r\n]", w1, w2); + if (i != 2) + continue; + if (strcmpi (w1, "login_db") == 0) + { + strcpy (login_db, w2); + } + //add for DB connection + else if (strcmpi (w1, "login_server_ip") == 0) + { + strcpy (login_server_ip, w2); + printf ("set login_server_ip : %s\n", w2); + } + else if (strcmpi (w1, "login_server_port") == 0) + { + login_server_port = atoi (w2); + printf ("set login_server_port : %s\n", w2); + } + else if (strcmpi (w1, "login_server_id") == 0) + { + strcpy (login_server_id, w2); + printf ("set login_server_id : %s\n", w2); + } + else if (strcmpi (w1, "login_server_pw") == 0) + { + strcpy (login_server_pw, w2); + printf ("set login_server_pw : %s\n", w2); + } + else if (strcmpi (w1, "login_server_db") == 0) + { + strcpy (login_server_db, w2); + printf ("set login_server_db : %s\n", w2); + } + //added for custom column names for custom login table + else if (strcmpi (w1, "login_db_account_id") == 0) + { + strcpy (login_db_account_id, w2); + } + else if (strcmpi (w1, "login_db_userid") == 0) + { + strcpy (login_db_userid, w2); + } + else if (strcmpi (w1, "login_db_user_pass") == 0) + { + strcpy (login_db_user_pass, w2); } - fclose_(fp); - printf("reading configure done.....\n"); + else if (strcmpi (w1, "login_db_level") == 0) + { + strcpy (login_db_level, w2); + } + //end of custom table config + else if (strcmpi (w1, "loginlog_db") == 0) + { + strcpy (loginlog_db, w2); + } + } + fclose_ (fp); + printf ("reading configure done.....\n"); } -int do_init(int argc,char **argv){ - //initialize login server - int i; - - //read login configue - login_config_read( (argc>1)?argv[1]:LOGIN_CONF_NAME ); - sql_config_read(SQL_CONF_NAME); - login_lan_config_read((argc > 1) ? argv[1] : LAN_CONF_NAME); - //Generate Passworded Key. - printf ("memset md5key \n"); - memset(md5key, 0, sizeof(md5key)); - printf ("memset md5key complete\n"); - printf ("memset keyleng\n"); - md5keylen=rand()%4+12; - for(i=0;i<md5keylen;i++) - md5key[i]=rand()%255+1; - printf ("memset keyleng complete\n"); - - printf ("set FIFO Size\n"); - for(i=0;i<AUTH_FIFO_SIZE;i++) - auth_fifo[i].delflag=1; - printf ("set FIFO Size complete\n"); - - printf ("set max servers\n"); - for(i=0;i<MAX_SERVERS;i++) - server_fd[i]=-1; - printf ("set max servers complete\n"); - //server port open & binding - - login_fd=make_listen_port(login_port); - - //Auth start - printf ("Running mmo_auth_sqldb_init()\n"); - mmo_auth_sqldb_init(); - printf ("finished mmo_auth_sqldb_init()\n"); - //sync account when terminating. - //but no need when you using DBMS (mysql) - set_termfunc(mmo_db_close); - - //set default parser as parse_login function - set_defaultparse(parse_login); - - if(anti_freeze_enable > 0) { - add_timer_func_list(char_anti_freeze_system, "char_anti_freeze_system"); - i = add_timer_interval(gettick()+1000, char_anti_freeze_system, 0, 0, ANTI_FREEZE_INTERVAL * 1000); - } - - // ban deleter timer - 1 minute term - printf("add interval tic (ip_ban_check)....\n"); - i=add_timer_interval(gettick()+10, ip_ban_check,0,0,60*1000); - - printf("The login-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", login_port); - - return 0; +int do_init (int argc, char **argv) +{ + //initialize login server + int i; + + //read login configue + login_config_read ((argc > 1) ? argv[1] : LOGIN_CONF_NAME); + sql_config_read (SQL_CONF_NAME); + login_lan_config_read ((argc > 1) ? argv[1] : LAN_CONF_NAME); + //Generate Passworded Key. + printf ("memset md5key \n"); + memset (md5key, 0, sizeof (md5key)); + printf ("memset md5key complete\n"); + printf ("memset keyleng\n"); + md5keylen = rand () % 4 + 12; + for (i = 0; i < md5keylen; i++) + md5key[i] = rand () % 255 + 1; + printf ("memset keyleng complete\n"); + + printf ("set FIFO Size\n"); + for (i = 0; i < AUTH_FIFO_SIZE; i++) + auth_fifo[i].delflag = 1; + printf ("set FIFO Size complete\n"); + + printf ("set max servers\n"); + for (i = 0; i < MAX_SERVERS; i++) + server_fd[i] = -1; + printf ("set max servers complete\n"); + //server port open & binding + + login_fd = make_listen_port (login_port); + + //Auth start + printf ("Running mmo_auth_sqldb_init()\n"); + mmo_auth_sqldb_init (); + printf ("finished mmo_auth_sqldb_init()\n"); + //sync account when terminating. + //but no need when you using DBMS (mysql) + set_termfunc (mmo_db_close); + + //set default parser as parse_login function + set_defaultparse (parse_login); + + if (anti_freeze_enable > 0) + { + add_timer_func_list (char_anti_freeze_system, + "char_anti_freeze_system"); + i = add_timer_interval (gettick () + 1000, char_anti_freeze_system, 0, + 0, ANTI_FREEZE_INTERVAL * 1000); + } + + // ban deleter timer - 1 minute term + printf ("add interval tic (ip_ban_check)....\n"); + i = add_timer_interval (gettick () + 10, ip_ban_check, 0, 0, 60 * 1000); + + printf + ("The login-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", + login_port); + + return 0; } - - diff --git a/src/login_sql/login.h b/src/login_sql/login.h index 6335168..7eb3a84 100644 --- a/src/login_sql/login.h +++ b/src/login_sql/login.h @@ -7,35 +7,36 @@ #define SQL_CONF_NAME "conf/inter_athena.conf" #define LAN_CONF_NAME "conf/lan_support.conf" -#define PASSWORDENC 3 // A definition is given when making an encryption password correspond. - // It is 1 at the time of passwordencrypt. - // It is made into 2 at the time of passwordencrypt2. - // When it is made 3, it corresponds to both. +#define PASSWORDENC 3 // A definition is given when making an encryption password correspond. + // It is 1 at the time of passwordencrypt. + // It is made into 2 at the time of passwordencrypt2. + // When it is made 3, it corresponds to both. #define START_ACCOUNT_NUM 2000000 #define END_ACCOUNT_NUM 100000000 -struct mmo_account { - char* userid; - char* passwd; - int passwdenc; - - long account_id; - long login_id1; - long login_id2; - long char_id; - char lastlogin[24]; - int sex; +struct mmo_account +{ + char *userid; + char *passwd; + int passwdenc; + + long account_id; + long login_id1; + long login_id2; + long char_id; + char lastlogin[24]; + int sex; }; -struct mmo_char_server { - char name[20]; - long ip; - short port; - int users; - int maintenance; - int new; +struct mmo_char_server +{ + char name[20]; + long ip; + short port; + int users; + int maintenance; + int new; }; - #endif diff --git a/src/login_sql/md5calc.c b/src/login_sql/md5calc.c index 58cea12..0f0b65d 100644 --- a/src/login_sql/md5calc.c +++ b/src/login_sql/md5calc.c @@ -19,198 +19,255 @@ static unsigned int *pX; // Stirng Table static const unsigned int T[] = { - 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0 - 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4 - 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8 - 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12 - 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16 - 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20 - 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24 - 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28 - 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32 - 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36 - 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40 - 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44 - 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48 - 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52 - 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56 - 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60 + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, //0 + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, //4 + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, //8 + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, //12 + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, //16 + 0xd62f105d, 0x2441453, 0xd8a1e681, 0xe7d3fbc8, //20 + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, //24 + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, //28 + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, //32 + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, //36 + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05, //40 + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, //44 + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, //48 + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, //52 + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, //56 + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 //60 }; // ROTATE_LEFT The left is made to rotate x [ n-bit ]. This is diverted as it is from RFC. #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) // The function used for other calculation -static unsigned int F(unsigned int X, unsigned int Y, unsigned int Z) +static unsigned int F (unsigned int X, unsigned int Y, unsigned int Z) { - return (X & Y) | (~X & Z); + return (X & Y) | (~X & Z); } -static unsigned int G(unsigned int X, unsigned int Y, unsigned int Z) + +static unsigned int G (unsigned int X, unsigned int Y, unsigned int Z) { - return (X & Z) | (Y & ~Z); + return (X & Z) | (Y & ~Z); } -static unsigned int H(unsigned int X, unsigned int Y, unsigned int Z) + +static unsigned int H (unsigned int X, unsigned int Y, unsigned int Z) { - return X ^ Y ^ Z; + return X ^ Y ^ Z; } -static unsigned int I(unsigned int X, unsigned int Y, unsigned int Z) + +static unsigned int I (unsigned int X, unsigned int Y, unsigned int Z) { - return Y ^ (X | ~Z); + return Y ^ (X | ~Z); } -static unsigned int Round(unsigned int a, unsigned int b, unsigned int FGHI, - unsigned int k, unsigned int s, unsigned int i) +static unsigned int Round (unsigned int a, unsigned int b, unsigned int FGHI, + unsigned int k, unsigned int s, unsigned int i) { - return b + ROTATE_LEFT(a + FGHI + pX[k] + T[i], s); + return b + ROTATE_LEFT (a + FGHI + pX[k] + T[i], s); } -static void Round1(unsigned int *a, unsigned int b, unsigned int c, - unsigned int d,unsigned int k, unsigned int s, unsigned int i) +static void Round1 (unsigned int *a, unsigned int b, unsigned int c, + unsigned int d, unsigned int k, unsigned int s, + unsigned int i) { - *a = Round(*a, b, F(b,c,d), k, s, i); + *a = Round (*a, b, F (b, c, d), k, s, i); } -static void Round2(unsigned int *a, unsigned int b, unsigned int c, - unsigned int d,unsigned int k, unsigned int s, unsigned int i) + +static void Round2 (unsigned int *a, unsigned int b, unsigned int c, + unsigned int d, unsigned int k, unsigned int s, + unsigned int i) { - *a = Round(*a, b, G(b,c,d), k, s, i); + *a = Round (*a, b, G (b, c, d), k, s, i); } -static void Round3(unsigned int *a, unsigned int b, unsigned int c, - unsigned int d,unsigned int k, unsigned int s, unsigned int i) + +static void Round3 (unsigned int *a, unsigned int b, unsigned int c, + unsigned int d, unsigned int k, unsigned int s, + unsigned int i) { - *a = Round(*a, b, H(b,c,d), k, s, i); + *a = Round (*a, b, H (b, c, d), k, s, i); } -static void Round4(unsigned int *a, unsigned int b, unsigned int c, - unsigned int d,unsigned int k, unsigned int s, unsigned int i) + +static void Round4 (unsigned int *a, unsigned int b, unsigned int c, + unsigned int d, unsigned int k, unsigned int s, + unsigned int i) { - *a = Round(*a, b, I(b,c,d), k, s, i); + *a = Round (*a, b, I (b, c, d), k, s, i); } -static void MD5_Round_Calculate(const unsigned char *block, - unsigned int *A2, unsigned int *B2, unsigned int *C2, unsigned int *D2) +static void MD5_Round_Calculate (const unsigned char *block, + unsigned int *A2, unsigned int *B2, + unsigned int *C2, unsigned int *D2) { - //create X It is since it is required. - unsigned int X[16]; //512bit 64byte - int j,k; - - //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D) - unsigned int A=*A2, B=*B2, C=*C2, D=*D2; - unsigned int AA = A,BB = B,CC = C,DD = D; - - //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4 - pX = X; - - //Copy block(padding_message) i into X - for (j=0,k=0; j<64; j+=4,k++) - X[k] = ( (unsigned int )block[j] ) // 8byte*4 -> 32byte conversion - | ( ((unsigned int )block[j+1]) << 8 ) // A function called Decode as used in the field of RFC - | ( ((unsigned int )block[j+2]) << 16 ) - | ( ((unsigned int )block[j+3]) << 24 ); - - - //Round 1 - Round1(&A,B,C,D, 0, 7, 0); Round1(&D,A,B,C, 1, 12, 1); Round1(&C,D,A,B, 2, 17, 2); Round1(&B,C,D,A, 3, 22, 3); - Round1(&A,B,C,D, 4, 7, 4); Round1(&D,A,B,C, 5, 12, 5); Round1(&C,D,A,B, 6, 17, 6); Round1(&B,C,D,A, 7, 22, 7); - Round1(&A,B,C,D, 8, 7, 8); Round1(&D,A,B,C, 9, 12, 9); Round1(&C,D,A,B, 10, 17, 10); Round1(&B,C,D,A, 11, 22, 11); - Round1(&A,B,C,D, 12, 7, 12); Round1(&D,A,B,C, 13, 12, 13); Round1(&C,D,A,B, 14, 17, 14); Round1(&B,C,D,A, 15, 22, 15); - - //Round 2 - Round2(&A,B,C,D, 1, 5, 16); Round2(&D,A,B,C, 6, 9, 17); Round2(&C,D,A,B, 11, 14, 18); Round2(&B,C,D,A, 0, 20, 19); - Round2(&A,B,C,D, 5, 5, 20); Round2(&D,A,B,C, 10, 9, 21); Round2(&C,D,A,B, 15, 14, 22); Round2(&B,C,D,A, 4, 20, 23); - Round2(&A,B,C,D, 9, 5, 24); Round2(&D,A,B,C, 14, 9, 25); Round2(&C,D,A,B, 3, 14, 26); Round2(&B,C,D,A, 8, 20, 27); - Round2(&A,B,C,D, 13, 5, 28); Round2(&D,A,B,C, 2, 9, 29); Round2(&C,D,A,B, 7, 14, 30); Round2(&B,C,D,A, 12, 20, 31); - - //Round 3 - Round3(&A,B,C,D, 5, 4, 32); Round3(&D,A,B,C, 8, 11, 33); Round3(&C,D,A,B, 11, 16, 34); Round3(&B,C,D,A, 14, 23, 35); - Round3(&A,B,C,D, 1, 4, 36); Round3(&D,A,B,C, 4, 11, 37); Round3(&C,D,A,B, 7, 16, 38); Round3(&B,C,D,A, 10, 23, 39); - Round3(&A,B,C,D, 13, 4, 40); Round3(&D,A,B,C, 0, 11, 41); Round3(&C,D,A,B, 3, 16, 42); Round3(&B,C,D,A, 6, 23, 43); - Round3(&A,B,C,D, 9, 4, 44); Round3(&D,A,B,C, 12, 11, 45); Round3(&C,D,A,B, 15, 16, 46); Round3(&B,C,D,A, 2, 23, 47); - - //Round 4 - Round4(&A,B,C,D, 0, 6, 48); Round4(&D,A,B,C, 7, 10, 49); Round4(&C,D,A,B, 14, 15, 50); Round4(&B,C,D,A, 5, 21, 51); - Round4(&A,B,C,D, 12, 6, 52); Round4(&D,A,B,C, 3, 10, 53); Round4(&C,D,A,B, 10, 15, 54); Round4(&B,C,D,A, 1, 21, 55); - Round4(&A,B,C,D, 8, 6, 56); Round4(&D,A,B,C, 15, 10, 57); Round4(&C,D,A,B, 6, 15, 58); Round4(&B,C,D,A, 13, 21, 59); - Round4(&A,B,C,D, 4, 6, 60); Round4(&D,A,B,C, 11, 10, 61); Round4(&C,D,A,B, 2, 15, 62); Round4(&B,C,D,A, 9, 21, 63); - - // Then perform the following additions. (let's add) - *A2 = A + AA; - *B2 = B + BB; - *C2 = C + CC; - *D2 = D + DD; - - //The clearance of confidential information - memset(pX, 0, sizeof(X)); + //create X It is since it is required. + unsigned int X[16]; //512bit 64byte + int j, k; + + //Save A as AA, B as BB, C as CC, and and D as DD (saving of A, B, C, and D) + unsigned int A = *A2, B = *B2, C = *C2, D = *D2; + unsigned int AA = A, BB = B, CC = C, DD = D; + + //It is a large region variable reluctantly because of calculation of a round. . . for Round1...4 + pX = X; + + //Copy block(padding_message) i into X + for (j = 0, k = 0; j < 64; j += 4, k++) + X[k] = ((unsigned int) block[j]) // 8byte*4 -> 32byte conversion + | (((unsigned int) block[j + 1]) << 8) // A function called Decode as used in the field of RFC + | (((unsigned int) block[j + 2]) << 16) + | (((unsigned int) block[j + 3]) << 24); + + //Round 1 + Round1 (&A, B, C, D, 0, 7, 0); + Round1 (&D, A, B, C, 1, 12, 1); + Round1 (&C, D, A, B, 2, 17, 2); + Round1 (&B, C, D, A, 3, 22, 3); + Round1 (&A, B, C, D, 4, 7, 4); + Round1 (&D, A, B, C, 5, 12, 5); + Round1 (&C, D, A, B, 6, 17, 6); + Round1 (&B, C, D, A, 7, 22, 7); + Round1 (&A, B, C, D, 8, 7, 8); + Round1 (&D, A, B, C, 9, 12, 9); + Round1 (&C, D, A, B, 10, 17, 10); + Round1 (&B, C, D, A, 11, 22, 11); + Round1 (&A, B, C, D, 12, 7, 12); + Round1 (&D, A, B, C, 13, 12, 13); + Round1 (&C, D, A, B, 14, 17, 14); + Round1 (&B, C, D, A, 15, 22, 15); + + //Round 2 + Round2 (&A, B, C, D, 1, 5, 16); + Round2 (&D, A, B, C, 6, 9, 17); + Round2 (&C, D, A, B, 11, 14, 18); + Round2 (&B, C, D, A, 0, 20, 19); + Round2 (&A, B, C, D, 5, 5, 20); + Round2 (&D, A, B, C, 10, 9, 21); + Round2 (&C, D, A, B, 15, 14, 22); + Round2 (&B, C, D, A, 4, 20, 23); + Round2 (&A, B, C, D, 9, 5, 24); + Round2 (&D, A, B, C, 14, 9, 25); + Round2 (&C, D, A, B, 3, 14, 26); + Round2 (&B, C, D, A, 8, 20, 27); + Round2 (&A, B, C, D, 13, 5, 28); + Round2 (&D, A, B, C, 2, 9, 29); + Round2 (&C, D, A, B, 7, 14, 30); + Round2 (&B, C, D, A, 12, 20, 31); + + //Round 3 + Round3 (&A, B, C, D, 5, 4, 32); + Round3 (&D, A, B, C, 8, 11, 33); + Round3 (&C, D, A, B, 11, 16, 34); + Round3 (&B, C, D, A, 14, 23, 35); + Round3 (&A, B, C, D, 1, 4, 36); + Round3 (&D, A, B, C, 4, 11, 37); + Round3 (&C, D, A, B, 7, 16, 38); + Round3 (&B, C, D, A, 10, 23, 39); + Round3 (&A, B, C, D, 13, 4, 40); + Round3 (&D, A, B, C, 0, 11, 41); + Round3 (&C, D, A, B, 3, 16, 42); + Round3 (&B, C, D, A, 6, 23, 43); + Round3 (&A, B, C, D, 9, 4, 44); + Round3 (&D, A, B, C, 12, 11, 45); + Round3 (&C, D, A, B, 15, 16, 46); + Round3 (&B, C, D, A, 2, 23, 47); + + //Round 4 + Round4 (&A, B, C, D, 0, 6, 48); + Round4 (&D, A, B, C, 7, 10, 49); + Round4 (&C, D, A, B, 14, 15, 50); + Round4 (&B, C, D, A, 5, 21, 51); + Round4 (&A, B, C, D, 12, 6, 52); + Round4 (&D, A, B, C, 3, 10, 53); + Round4 (&C, D, A, B, 10, 15, 54); + Round4 (&B, C, D, A, 1, 21, 55); + Round4 (&A, B, C, D, 8, 6, 56); + Round4 (&D, A, B, C, 15, 10, 57); + Round4 (&C, D, A, B, 6, 15, 58); + Round4 (&B, C, D, A, 13, 21, 59); + Round4 (&A, B, C, D, 4, 6, 60); + Round4 (&D, A, B, C, 11, 10, 61); + Round4 (&C, D, A, B, 2, 15, 62); + Round4 (&B, C, D, A, 9, 21, 63); + + // Then perform the following additions. (let's add) + *A2 = A + AA; + *B2 = B + BB; + *C2 = C + CC; + *D2 = D + DD; + + //The clearance of confidential information + memset (pX, 0, sizeof (X)); } //------------------------------------------------------------------- // The function for the exteriors /** output is the coded binary in the character sequence which wants to code string. */ -void MD5_String2binary(const char * string, char * output) +void MD5_String2binary (const char *string, char *output) { //var - /*8bit*/ - unsigned char padding_message[64]; //Extended message 512bit 64byte - unsigned char *pstring; //The position of string in the present scanning notes is held. + /*8bit */ + unsigned char padding_message[64]; //Extended message 512bit 64byte + unsigned char *pstring; //The position of string in the present scanning notes is held. // unsigned char digest[16]; - /*32bit*/ - unsigned int string_byte_len, //The byte chief of string is held. - string_bit_len, //The bit length of string is held. - copy_len, //The number of bytes which is used by 1-3 and which remained - msg_digest[4]; //Message digest 128bit 4byte - unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference) - *B = &msg_digest[1], - *C = &msg_digest[2], - *D = &msg_digest[3]; - int i; + /*32bit */ + unsigned int string_byte_len, //The byte chief of string is held. + string_bit_len, //The bit length of string is held. + copy_len, //The number of bytes which is used by 1-3 and which remained + msg_digest[4]; //Message digest 128bit 4byte + unsigned int *A = &msg_digest[0], //The message digest in accordance with RFC (reference) + *B = &msg_digest[1], *C = &msg_digest[2], *D = &msg_digest[3]; + int i; //prog - //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head) - *A = 0x67452301; - *B = 0xefcdab89; - *C = 0x98badcfe; - *D = 0x10325476; - - //Step 1.Append Padding Bits (extension of a mark bit) - //1-1 - string_byte_len = strlen(string); //The byte chief of a character sequence is acquired. - pstring = (unsigned char *)string; //The position of the present character sequence is set. - - //1-2 Repeat calculation until length becomes less than 64 bytes. - for (i=string_byte_len; 64<=i; i-=64,pstring+=64) - MD5_Round_Calculate(pstring, A,B,C,D); - - //1-3 - copy_len = string_byte_len % 64; //The number of bytes which remained is computed. - strncpy((char *)padding_message, (char *)pstring, copy_len); //A message is copied to an extended bit sequence. - memset(padding_message+copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length. - padding_message[copy_len] |= 0x80; //The next of a message is 1. - - //1-4 - //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes. - if (56 <= copy_len) { - MD5_Round_Calculate(padding_message, A,B,C,D); - memset(padding_message, 0, 56); //56 bytes is newly fill uped with 0. - } - - - //Step 2.Append Length (the information on length is added) - string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank) - memcpy(&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set. - - //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank. - if (UINT_MAX / 8 < string_byte_len) { - unsigned int high = (string_byte_len - UINT_MAX / 8) * 8; - memcpy(&padding_message[60], &high, 4); - } else - memset(&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0. - - //Step 4.Process Message in 16-Word Blocks (calculation of MD5) - MD5_Round_Calculate(padding_message, A,B,C,D); - - - //Step 5.Output (output) - memcpy(output,msg_digest,16); + //Step 3.Initialize MD Buffer (although it is the initialization; step 3 of A, B, C, and D -- unavoidable -- a head) + *A = 0x67452301; + *B = 0xefcdab89; + *C = 0x98badcfe; + *D = 0x10325476; + + //Step 1.Append Padding Bits (extension of a mark bit) + //1-1 + string_byte_len = strlen (string); //The byte chief of a character sequence is acquired. + pstring = (unsigned char *) string; //The position of the present character sequence is set. + + //1-2 Repeat calculation until length becomes less than 64 bytes. + for (i = string_byte_len; 64 <= i; i -= 64, pstring += 64) + MD5_Round_Calculate (pstring, A, B, C, D); + + //1-3 + copy_len = string_byte_len % 64; //The number of bytes which remained is computed. + strncpy ((char *) padding_message, (char *) pstring, copy_len); //A message is copied to an extended bit sequence. + memset (padding_message + copy_len, 0, 64 - copy_len); //It buries by 0 until it becomes extended bit length. + padding_message[copy_len] |= 0x80; //The next of a message is 1. + + //1-4 + //If 56 bytes or more (less than 64 bytes) of remainder becomes, it will calculate by extending to 64 bytes. + if (56 <= copy_len) + { + MD5_Round_Calculate (padding_message, A, B, C, D); + memset (padding_message, 0, 56); //56 bytes is newly fill uped with 0. + } + + //Step 2.Append Length (the information on length is added) + string_bit_len = string_byte_len * 8; //From the byte chief to bit length (32 bytes of low rank) + memcpy (&padding_message[56], &string_bit_len, 4); //32 bytes of low rank is set. + + //When bit length cannot be expressed in 32 bytes of low rank, it is a beam raising to a higher rank. + if (UINT_MAX / 8 < string_byte_len) + { + unsigned int high = (string_byte_len - UINT_MAX / 8) * 8; + memcpy (&padding_message[60], &high, 4); + } + else + memset (&padding_message[60], 0, 4); //In this case, it is good for a higher rank at 0. + + //Step 4.Process Message in 16-Word Blocks (calculation of MD5) + MD5_Round_Calculate (padding_message, A, B, C, D); + + //Step 5.Output (output) + memcpy (output, msg_digest, 16); // memcpy (digest, msg_digest, and 16); //8 byte*4 < - 32byte conversion A function called Encode as used in the field of RFC /* sprintf(output, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", @@ -221,16 +278,15 @@ void MD5_String2binary(const char * string, char * output) } /** output is the coded character sequence in the character sequence which wants to code string. */ -void MD5_String(const char * string, char * output) +void MD5_String (const char *string, char *output) { - unsigned char digest[16]; - - MD5_String2binary(string,digest); - sprintf(output, - "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", - digest[ 0], digest[ 1], digest[ 2], digest[ 3], - digest[ 4], digest[ 5], digest[ 6], digest[ 7], - digest[ 8], digest[ 9], digest[10], digest[11], - digest[12], digest[13], digest[14], digest[15]); + unsigned char digest[16]; + + MD5_String2binary (string, digest); + sprintf (output, + "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + digest[0], digest[1], digest[2], digest[3], + digest[4], digest[5], digest[6], digest[7], + digest[8], digest[9], digest[10], digest[11], + digest[12], digest[13], digest[14], digest[15]); } - diff --git a/src/login_sql/md5calc.h b/src/login_sql/md5calc.h index 9bc554f..16c122d 100644 --- a/src/login_sql/md5calc.h +++ b/src/login_sql/md5calc.h @@ -1,7 +1,7 @@ #ifndef _MD5CALC_H_ #define _MD5CALC_H_ -void MD5_String(const char * string, char * output); -void MD5_String2binary(const char * string, char * output); +void MD5_String (const char *string, char *output); +void MD5_String2binary (const char *string, char *output); #endif diff --git a/src/login_sql/strlib.c b/src/login_sql/strlib.c index 7f6e197..5c87ef6 100644 --- a/src/login_sql/strlib.c +++ b/src/login_sql/strlib.c @@ -7,52 +7,58 @@ //----------------------------------------------- // string lib. -unsigned char* jstrescape (unsigned char* pt) { - //copy from here - unsigned char * ptr; - int i =0, j=0; +unsigned char *jstrescape (unsigned char *pt) +{ + //copy from here + unsigned char *ptr; + int i = 0, j = 0; - //copy string to temporary - CREATE(ptr, char, J_MAX_MALLOC_SIZE); - strcpy (ptr,pt); + //copy string to temporary + CREATE (ptr, char, J_MAX_MALLOC_SIZE); + strcpy (ptr, pt); - while (ptr[i] != '\0') { - switch (ptr[i]) { - case '\'': - pt[j++] = '\\'; - pt[j++] = ptr[i++]; - break; - case '\\': - pt[j++] = '\\'; - pt[j++] = ptr[i++]; - break; - default: - pt[j++] = ptr[i++]; - } - } - pt[j++] = '\0'; - free (ptr); - return (unsigned char*) &pt[0]; + while (ptr[i] != '\0') + { + switch (ptr[i]) + { + case '\'': + pt[j++] = '\\'; + pt[j++] = ptr[i++]; + break; + case '\\': + pt[j++] = '\\'; + pt[j++] = ptr[i++]; + break; + default: + pt[j++] = ptr[i++]; + } + } + pt[j++] = '\0'; + free (ptr); + return (unsigned char *) &pt[0]; } -unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt) { - //copy from here - int i =0, j=0; +unsigned char *jstrescapecpy (unsigned char *pt, unsigned char *spt) +{ + //copy from here + int i = 0, j = 0; - while (spt[i] != '\0') { - switch (spt[i]) { - case '\'': - pt[j++] = '\\'; - pt[j++] = spt[i++]; - break; - case '\\': - pt[j++] = '\\'; - pt[j++] = spt[i++]; - break; - default: - pt[j++] = spt[i++]; - } - } - pt[j++] = '\0'; - return (unsigned char*) &pt[0]; + while (spt[i] != '\0') + { + switch (spt[i]) + { + case '\'': + pt[j++] = '\\'; + pt[j++] = spt[i++]; + break; + case '\\': + pt[j++] = '\\'; + pt[j++] = spt[i++]; + break; + default: + pt[j++] = spt[i++]; + } + } + pt[j++] = '\0'; + return (unsigned char *) &pt[0]; } diff --git a/src/login_sql/strlib.h b/src/login_sql/strlib.h index ddf29ab..fadd30f 100644 --- a/src/login_sql/strlib.h +++ b/src/login_sql/strlib.h @@ -4,6 +4,6 @@ // String function library. // code by Jioh L. Jung (ziozzang@4wish.net) // This code is under license "BSD" -unsigned char* jstrescape (unsigned char* pt); -unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt); +unsigned char *jstrescape (unsigned char *pt); +unsigned char *jstrescapecpy (unsigned char *pt, unsigned char *spt); #endif diff --git a/src/login_sql/timer.h b/src/login_sql/timer.h index be9706a..8abc259 100644 --- a/src/login_sql/timer.h +++ b/src/login_sql/timer.h @@ -13,31 +13,33 @@ // Struct declaration -struct TimerData { - unsigned int tick; - int (*func)(int,unsigned int,int,int); - int id; - int data; - int type; - int interval; - int heap_pos; +struct TimerData +{ + unsigned int tick; + int (*func) (int, unsigned int, int, int); + int id; + int data; + int type; + int interval; + int heap_pos; }; // Function prototype declaration -unsigned int gettick_nocache(void); -unsigned int gettick(void); +unsigned int gettick_nocache (void); +unsigned int gettick (void); -int add_timer(unsigned int,int (*)(int,unsigned int,int,int),int,int); -int add_timer_interval(unsigned int,int (*)(int,unsigned int,int,int),int,int,int); -int delete_timer(int,int (*)(int,unsigned int,int,int)); +int add_timer (unsigned int, int (*)(int, unsigned int, int, int), int, int); +int add_timer_interval (unsigned int, int (*)(int, unsigned int, int, int), + int, int, int); +int delete_timer (int, int (*)(int, unsigned int, int, int)); -int addtick_timer(int tid,unsigned int tick); -struct TimerData *get_timer(int tid); +int addtick_timer (int tid, unsigned int tick); +struct TimerData *get_timer (int tid); -int do_timer(unsigned int tick); +int do_timer (unsigned int tick); -int add_timer_func_list(int (*)(int,unsigned int,int,int),char*); -char* search_timer_func_list(int (*)(int,unsigned int,int,int)); +int add_timer_func_list (int (*)(int, unsigned int, int, int), char *); +char *search_timer_func_list (int (*)(int, unsigned int, int, int)); -#endif // _TIMER_H_ +#endif // _TIMER_H_ diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 3668d98..40f4cfd 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -35,180 +35,180 @@ #define STATE_BLIND 0x10 -static char command_symbol = '@'; // first char of the commands (by [Yor]) +static char command_symbol = '@'; // first char of the commands (by [Yor]) -static char msg_table[1000][1024]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others) +static char msg_table[1000][1024]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others) #define ATCOMMAND_FUNC(x) int atcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message) -ATCOMMAND_FUNC(setup); -ATCOMMAND_FUNC(broadcast); -ATCOMMAND_FUNC(localbroadcast); -ATCOMMAND_FUNC(charwarp); -ATCOMMAND_FUNC(warp); -ATCOMMAND_FUNC(where); -ATCOMMAND_FUNC(goto); -ATCOMMAND_FUNC(jump); -ATCOMMAND_FUNC(who); -ATCOMMAND_FUNC(whogroup); -ATCOMMAND_FUNC(whomap); -ATCOMMAND_FUNC(whomapgroup); -ATCOMMAND_FUNC(whogm); // by Yor -ATCOMMAND_FUNC(save); -ATCOMMAND_FUNC(load); -ATCOMMAND_FUNC(speed); -ATCOMMAND_FUNC(storage); -ATCOMMAND_FUNC(guildstorage); -ATCOMMAND_FUNC(option); -ATCOMMAND_FUNC(hide); -ATCOMMAND_FUNC(die); -ATCOMMAND_FUNC(kill); -ATCOMMAND_FUNC(alive); -ATCOMMAND_FUNC(kami); -ATCOMMAND_FUNC(heal); -ATCOMMAND_FUNC(item); -ATCOMMAND_FUNC(itemreset); -ATCOMMAND_FUNC(itemcheck); -ATCOMMAND_FUNC(baselevelup); -ATCOMMAND_FUNC(joblevelup); -ATCOMMAND_FUNC(help); -ATCOMMAND_FUNC(gm); -ATCOMMAND_FUNC(pvpoff); -ATCOMMAND_FUNC(pvpon); -ATCOMMAND_FUNC(gvgoff); -ATCOMMAND_FUNC(gvgon); -ATCOMMAND_FUNC(model); -ATCOMMAND_FUNC(go); -ATCOMMAND_FUNC(spawn); -ATCOMMAND_FUNC(killmonster); -ATCOMMAND_FUNC(killmonster2); -ATCOMMAND_FUNC(refine); -ATCOMMAND_FUNC(produce); -ATCOMMAND_FUNC(memo); -ATCOMMAND_FUNC(gat); -ATCOMMAND_FUNC(packet); -ATCOMMAND_FUNC(statuspoint); -ATCOMMAND_FUNC(skillpoint); -ATCOMMAND_FUNC(zeny); -ATCOMMAND_FUNC(param); -ATCOMMAND_FUNC(guildlevelup); -ATCOMMAND_FUNC(recall); -ATCOMMAND_FUNC(recallall); -ATCOMMAND_FUNC(revive); -ATCOMMAND_FUNC(character_stats); -ATCOMMAND_FUNC(character_stats_all); -ATCOMMAND_FUNC(character_option); -ATCOMMAND_FUNC(character_save); -ATCOMMAND_FUNC(night); -ATCOMMAND_FUNC(day); -ATCOMMAND_FUNC(doom); -ATCOMMAND_FUNC(doommap); -ATCOMMAND_FUNC(raise); -ATCOMMAND_FUNC(raisemap); -ATCOMMAND_FUNC(character_baselevel); -ATCOMMAND_FUNC(character_joblevel); -ATCOMMAND_FUNC(kick); -ATCOMMAND_FUNC(kickall); -ATCOMMAND_FUNC(allskills); -ATCOMMAND_FUNC(questskill); -ATCOMMAND_FUNC(charquestskill); -ATCOMMAND_FUNC(lostskill); -ATCOMMAND_FUNC(charlostskill); -ATCOMMAND_FUNC(party); -ATCOMMAND_FUNC(guild); -ATCOMMAND_FUNC(charskreset); -ATCOMMAND_FUNC(charstreset); -ATCOMMAND_FUNC(charreset); -ATCOMMAND_FUNC(charstpoint); -ATCOMMAND_FUNC(charmodel); -ATCOMMAND_FUNC(charskpoint); -ATCOMMAND_FUNC(charzeny); -ATCOMMAND_FUNC(agitstart); -ATCOMMAND_FUNC(agitend); -ATCOMMAND_FUNC(reloaditemdb); -ATCOMMAND_FUNC(reloadmobdb); -ATCOMMAND_FUNC(reloadskilldb); -ATCOMMAND_FUNC(reloadscript); -ATCOMMAND_FUNC(reloadgmdb); // by Yor -ATCOMMAND_FUNC(mapexit); -ATCOMMAND_FUNC(idsearch); -ATCOMMAND_FUNC(mapinfo); -ATCOMMAND_FUNC(dye); //** by fritz -ATCOMMAND_FUNC(hair_style); //** by fritz -ATCOMMAND_FUNC(hair_color); //** by fritz -ATCOMMAND_FUNC(all_stats); //** by fritz -ATCOMMAND_FUNC(char_change_sex); // by Yor -ATCOMMAND_FUNC(char_block); // by Yor -ATCOMMAND_FUNC(char_ban); // by Yor -ATCOMMAND_FUNC(char_unblock); // by Yor -ATCOMMAND_FUNC(char_unban); // by Yor -ATCOMMAND_FUNC(mount_peco); // by Valaris -ATCOMMAND_FUNC(char_mount_peco); // by Yor -ATCOMMAND_FUNC(guildspy); // [Syrus22] -ATCOMMAND_FUNC(partyspy); // [Syrus22] -ATCOMMAND_FUNC(guildrecall); // by Yor -ATCOMMAND_FUNC(partyrecall); // by Yor -ATCOMMAND_FUNC(enablenpc); -ATCOMMAND_FUNC(disablenpc); -ATCOMMAND_FUNC(servertime); // by Yor -ATCOMMAND_FUNC(chardelitem); // by Yor -ATCOMMAND_FUNC(jail); // by Yor -ATCOMMAND_FUNC(unjail); // by Yor -ATCOMMAND_FUNC(disguise); // [Valaris] -ATCOMMAND_FUNC(undisguise); // by Yor -ATCOMMAND_FUNC(ignorelist); // by Yor -ATCOMMAND_FUNC(charignorelist); // by Yor -ATCOMMAND_FUNC(inall); // by Yor -ATCOMMAND_FUNC(exall); // by Yor -ATCOMMAND_FUNC(chardisguise); // Kalaspuff -ATCOMMAND_FUNC(charundisguise); // Kalaspuff -ATCOMMAND_FUNC(email); // by Yor -ATCOMMAND_FUNC(effect);//by Apple -ATCOMMAND_FUNC(character_item_list); // by Yor -ATCOMMAND_FUNC(character_storage_list); // by Yor -ATCOMMAND_FUNC(character_cart_list); // by Yor -ATCOMMAND_FUNC(addwarp); // by MouseJstr -ATCOMMAND_FUNC(follow); // by MouseJstr -ATCOMMAND_FUNC(skillon); // by MouseJstr -ATCOMMAND_FUNC(skilloff); // by MouseJstr -ATCOMMAND_FUNC(killer); // by MouseJstr -ATCOMMAND_FUNC(npcmove); // by MouseJstr -ATCOMMAND_FUNC(killable); // by MouseJstr -ATCOMMAND_FUNC(charkillable); // by MouseJstr -ATCOMMAND_FUNC(chareffect); // by MouseJstr -ATCOMMAND_FUNC(chardye); // by MouseJstr -ATCOMMAND_FUNC(charhairstyle); // by MouseJstr -ATCOMMAND_FUNC(charhaircolor); // by MouseJstr -ATCOMMAND_FUNC(dropall); // by MouseJstr -ATCOMMAND_FUNC(chardropall); // by MouseJstr -ATCOMMAND_FUNC(storeall); // by MouseJstr -ATCOMMAND_FUNC(charstoreall); // by MouseJstr -ATCOMMAND_FUNC(skillid); // by MouseJstr -ATCOMMAND_FUNC(useskill); // by MouseJstr -ATCOMMAND_FUNC(summon); -ATCOMMAND_FUNC(rain); -ATCOMMAND_FUNC(snow); -ATCOMMAND_FUNC(sakura); -ATCOMMAND_FUNC(fog); -ATCOMMAND_FUNC(leaves); -ATCOMMAND_FUNC(adjgmlvl); // by MouseJstr -ATCOMMAND_FUNC(adjcmdlvl); // by MouseJstr -ATCOMMAND_FUNC(trade); // by MouseJstr -ATCOMMAND_FUNC(unmute); // [Valaris] -ATCOMMAND_FUNC(char_wipe); // [Fate] -ATCOMMAND_FUNC(set_magic); // [Fate] -ATCOMMAND_FUNC(magic_info); // [Fate] -ATCOMMAND_FUNC(log); // [Fate] -ATCOMMAND_FUNC(tee); // [Fate] -ATCOMMAND_FUNC(invisible); // [Fate] -ATCOMMAND_FUNC(visible); // [Fate] -ATCOMMAND_FUNC(list_nearby); // [Fate] -ATCOMMAND_FUNC(iterate_forward_over_players); // [Fate] -ATCOMMAND_FUNC(iterate_backwards_over_players); // [Fate] -ATCOMMAND_FUNC(skillpool_info); // [Fate] -ATCOMMAND_FUNC(skillpool_focus); // [Fate] -ATCOMMAND_FUNC(skillpool_unfocus); // [Fate] -ATCOMMAND_FUNC(skill_learn); // [Fate] -ATCOMMAND_FUNC(wgm); +ATCOMMAND_FUNC (setup); +ATCOMMAND_FUNC (broadcast); +ATCOMMAND_FUNC (localbroadcast); +ATCOMMAND_FUNC (charwarp); +ATCOMMAND_FUNC (warp); +ATCOMMAND_FUNC (where); +ATCOMMAND_FUNC (goto); +ATCOMMAND_FUNC (jump); +ATCOMMAND_FUNC (who); +ATCOMMAND_FUNC (whogroup); +ATCOMMAND_FUNC (whomap); +ATCOMMAND_FUNC (whomapgroup); +ATCOMMAND_FUNC (whogm); // by Yor +ATCOMMAND_FUNC (save); +ATCOMMAND_FUNC (load); +ATCOMMAND_FUNC (speed); +ATCOMMAND_FUNC (storage); +ATCOMMAND_FUNC (guildstorage); +ATCOMMAND_FUNC (option); +ATCOMMAND_FUNC (hide); +ATCOMMAND_FUNC (die); +ATCOMMAND_FUNC (kill); +ATCOMMAND_FUNC (alive); +ATCOMMAND_FUNC (kami); +ATCOMMAND_FUNC (heal); +ATCOMMAND_FUNC (item); +ATCOMMAND_FUNC (itemreset); +ATCOMMAND_FUNC (itemcheck); +ATCOMMAND_FUNC (baselevelup); +ATCOMMAND_FUNC (joblevelup); +ATCOMMAND_FUNC (help); +ATCOMMAND_FUNC (gm); +ATCOMMAND_FUNC (pvpoff); +ATCOMMAND_FUNC (pvpon); +ATCOMMAND_FUNC (gvgoff); +ATCOMMAND_FUNC (gvgon); +ATCOMMAND_FUNC (model); +ATCOMMAND_FUNC (go); +ATCOMMAND_FUNC (spawn); +ATCOMMAND_FUNC (killmonster); +ATCOMMAND_FUNC (killmonster2); +ATCOMMAND_FUNC (refine); +ATCOMMAND_FUNC (produce); +ATCOMMAND_FUNC (memo); +ATCOMMAND_FUNC (gat); +ATCOMMAND_FUNC (packet); +ATCOMMAND_FUNC (statuspoint); +ATCOMMAND_FUNC (skillpoint); +ATCOMMAND_FUNC (zeny); +ATCOMMAND_FUNC (param); +ATCOMMAND_FUNC (guildlevelup); +ATCOMMAND_FUNC (recall); +ATCOMMAND_FUNC (recallall); +ATCOMMAND_FUNC (revive); +ATCOMMAND_FUNC (character_stats); +ATCOMMAND_FUNC (character_stats_all); +ATCOMMAND_FUNC (character_option); +ATCOMMAND_FUNC (character_save); +ATCOMMAND_FUNC (night); +ATCOMMAND_FUNC (day); +ATCOMMAND_FUNC (doom); +ATCOMMAND_FUNC (doommap); +ATCOMMAND_FUNC (raise); +ATCOMMAND_FUNC (raisemap); +ATCOMMAND_FUNC (character_baselevel); +ATCOMMAND_FUNC (character_joblevel); +ATCOMMAND_FUNC (kick); +ATCOMMAND_FUNC (kickall); +ATCOMMAND_FUNC (allskills); +ATCOMMAND_FUNC (questskill); +ATCOMMAND_FUNC (charquestskill); +ATCOMMAND_FUNC (lostskill); +ATCOMMAND_FUNC (charlostskill); +ATCOMMAND_FUNC (party); +ATCOMMAND_FUNC (guild); +ATCOMMAND_FUNC (charskreset); +ATCOMMAND_FUNC (charstreset); +ATCOMMAND_FUNC (charreset); +ATCOMMAND_FUNC (charstpoint); +ATCOMMAND_FUNC (charmodel); +ATCOMMAND_FUNC (charskpoint); +ATCOMMAND_FUNC (charzeny); +ATCOMMAND_FUNC (agitstart); +ATCOMMAND_FUNC (agitend); +ATCOMMAND_FUNC (reloaditemdb); +ATCOMMAND_FUNC (reloadmobdb); +ATCOMMAND_FUNC (reloadskilldb); +ATCOMMAND_FUNC (reloadscript); +ATCOMMAND_FUNC (reloadgmdb); // by Yor +ATCOMMAND_FUNC (mapexit); +ATCOMMAND_FUNC (idsearch); +ATCOMMAND_FUNC (mapinfo); +ATCOMMAND_FUNC (dye); //** by fritz +ATCOMMAND_FUNC (hair_style); //** by fritz +ATCOMMAND_FUNC (hair_color); //** by fritz +ATCOMMAND_FUNC (all_stats); //** by fritz +ATCOMMAND_FUNC (char_change_sex); // by Yor +ATCOMMAND_FUNC (char_block); // by Yor +ATCOMMAND_FUNC (char_ban); // by Yor +ATCOMMAND_FUNC (char_unblock); // by Yor +ATCOMMAND_FUNC (char_unban); // by Yor +ATCOMMAND_FUNC (mount_peco); // by Valaris +ATCOMMAND_FUNC (char_mount_peco); // by Yor +ATCOMMAND_FUNC (guildspy); // [Syrus22] +ATCOMMAND_FUNC (partyspy); // [Syrus22] +ATCOMMAND_FUNC (guildrecall); // by Yor +ATCOMMAND_FUNC (partyrecall); // by Yor +ATCOMMAND_FUNC (enablenpc); +ATCOMMAND_FUNC (disablenpc); +ATCOMMAND_FUNC (servertime); // by Yor +ATCOMMAND_FUNC (chardelitem); // by Yor +ATCOMMAND_FUNC (jail); // by Yor +ATCOMMAND_FUNC (unjail); // by Yor +ATCOMMAND_FUNC (disguise); // [Valaris] +ATCOMMAND_FUNC (undisguise); // by Yor +ATCOMMAND_FUNC (ignorelist); // by Yor +ATCOMMAND_FUNC (charignorelist); // by Yor +ATCOMMAND_FUNC (inall); // by Yor +ATCOMMAND_FUNC (exall); // by Yor +ATCOMMAND_FUNC (chardisguise); // Kalaspuff +ATCOMMAND_FUNC (charundisguise); // Kalaspuff +ATCOMMAND_FUNC (email); // by Yor +ATCOMMAND_FUNC (effect); //by Apple +ATCOMMAND_FUNC (character_item_list); // by Yor +ATCOMMAND_FUNC (character_storage_list); // by Yor +ATCOMMAND_FUNC (character_cart_list); // by Yor +ATCOMMAND_FUNC (addwarp); // by MouseJstr +ATCOMMAND_FUNC (follow); // by MouseJstr +ATCOMMAND_FUNC (skillon); // by MouseJstr +ATCOMMAND_FUNC (skilloff); // by MouseJstr +ATCOMMAND_FUNC (killer); // by MouseJstr +ATCOMMAND_FUNC (npcmove); // by MouseJstr +ATCOMMAND_FUNC (killable); // by MouseJstr +ATCOMMAND_FUNC (charkillable); // by MouseJstr +ATCOMMAND_FUNC (chareffect); // by MouseJstr +ATCOMMAND_FUNC (chardye); // by MouseJstr +ATCOMMAND_FUNC (charhairstyle); // by MouseJstr +ATCOMMAND_FUNC (charhaircolor); // by MouseJstr +ATCOMMAND_FUNC (dropall); // by MouseJstr +ATCOMMAND_FUNC (chardropall); // by MouseJstr +ATCOMMAND_FUNC (storeall); // by MouseJstr +ATCOMMAND_FUNC (charstoreall); // by MouseJstr +ATCOMMAND_FUNC (skillid); // by MouseJstr +ATCOMMAND_FUNC (useskill); // by MouseJstr +ATCOMMAND_FUNC (summon); +ATCOMMAND_FUNC (rain); +ATCOMMAND_FUNC (snow); +ATCOMMAND_FUNC (sakura); +ATCOMMAND_FUNC (fog); +ATCOMMAND_FUNC (leaves); +ATCOMMAND_FUNC (adjgmlvl); // by MouseJstr +ATCOMMAND_FUNC (adjcmdlvl); // by MouseJstr +ATCOMMAND_FUNC (trade); // by MouseJstr +ATCOMMAND_FUNC (unmute); // [Valaris] +ATCOMMAND_FUNC (char_wipe); // [Fate] +ATCOMMAND_FUNC (set_magic); // [Fate] +ATCOMMAND_FUNC (magic_info); // [Fate] +ATCOMMAND_FUNC (log); // [Fate] +ATCOMMAND_FUNC (tee); // [Fate] +ATCOMMAND_FUNC (invisible); // [Fate] +ATCOMMAND_FUNC (visible); // [Fate] +ATCOMMAND_FUNC (list_nearby); // [Fate] +ATCOMMAND_FUNC (iterate_forward_over_players); // [Fate] +ATCOMMAND_FUNC (iterate_backwards_over_players); // [Fate] +ATCOMMAND_FUNC (skillpool_info); // [Fate] +ATCOMMAND_FUNC (skillpool_focus); // [Fate] +ATCOMMAND_FUNC (skillpool_unfocus); // [Fate] +ATCOMMAND_FUNC (skill_learn); // [Fate] +ATCOMMAND_FUNC (wgm); /*========================================== *AtCommandInfo atcommand_info[]構造体の定義 @@ -218,352 +218,434 @@ ATCOMMAND_FUNC(wgm); // First char of commands is configured in atcommand_athena.conf. Leave @ in this list for default value. // to set default level, read atcommand_athena.conf first please. static AtCommandInfo atcommand_info[] = { - { AtCommand_Setup, "@setup", 40, atcommand_setup }, - { AtCommand_CharWarp, "@charwarp", 60, atcommand_charwarp }, - { AtCommand_Warp, "@warp", 40, atcommand_warp }, - { AtCommand_Where, "@where", 1, atcommand_where }, - { AtCommand_Goto, "@goto", 20, atcommand_goto }, - { AtCommand_Jump, "@jump", 40, atcommand_jump }, - { AtCommand_Who, "@who", 20, atcommand_who }, - { AtCommand_WhoGroup, "@whogroup", 20, atcommand_whogroup }, - { AtCommand_WhoMap, "@whomap", 20, atcommand_whomap }, - { AtCommand_WhoMapGroup, "@whomapgroup", 20, atcommand_whomapgroup }, - { AtCommand_WhoGM, "@whogm", 20, atcommand_whogm }, // by Yor - { AtCommand_Save, "@save", 40, atcommand_save }, - { AtCommand_Load, "@return", 40, atcommand_load }, - { AtCommand_Load, "@load", 40, atcommand_load }, - { AtCommand_Speed, "@speed", 40, atcommand_speed }, - { AtCommand_Storage, "@storage", 1, atcommand_storage }, - { AtCommand_GuildStorage, "@gstorage", 50, atcommand_guildstorage }, - { AtCommand_Option, "@option", 40, atcommand_option }, - { AtCommand_Hide, "@hide", 40, atcommand_hide }, // + /hide - { AtCommand_Die, "@die", 1, atcommand_die }, - { AtCommand_Kill, "@kill", 60, atcommand_kill }, - { AtCommand_Alive, "@alive", 60, atcommand_alive }, - { AtCommand_Kami, "@kami", 40, atcommand_kami }, - { AtCommand_Heal, "@heal", 40, atcommand_heal }, - { AtCommand_Item, "@item", 60, atcommand_item }, - { AtCommand_ItemReset, "@itemreset", 40, atcommand_itemreset }, - { AtCommand_ItemCheck, "@itemcheck", 60, atcommand_itemcheck }, - { AtCommand_BaseLevelUp, "@blvl", 60, atcommand_baselevelup }, - { AtCommand_JobLevelUp, "@jlvl", 60, atcommand_joblevelup }, - { AtCommand_Help, "@help", 20, atcommand_help }, - { AtCommand_GM, "@gm", 100, atcommand_gm }, - { AtCommand_PvPOff, "@pvpoff", 40, atcommand_pvpoff }, - { AtCommand_PvPOn, "@pvpon", 40, atcommand_pvpon }, - { AtCommand_GvGOff, "@gvgoff", 40, atcommand_gvgoff }, - { AtCommand_GvGOff, "@gpvpoff", 40, atcommand_gvgoff }, - { AtCommand_GvGOn, "@gvgon", 40, atcommand_gvgon }, - { AtCommand_GvGOn, "@gpvpon", 40, atcommand_gvgon }, - { AtCommand_Model, "@model", 20, atcommand_model }, - { AtCommand_Go, "@go", 10, atcommand_go }, - { AtCommand_Spawn, "@spawn", 50, atcommand_spawn }, - { AtCommand_KillMonster, "@killmonster", 60, atcommand_killmonster }, - { AtCommand_KillMonster2, "@killmonster2", 40, atcommand_killmonster2 }, - { AtCommand_Produce, "@produce", 60, atcommand_produce }, - { AtCommand_Memo, "@memo", 40, atcommand_memo }, - { AtCommand_GAT, "@gat", 99, atcommand_gat }, // debug function - { AtCommand_Packet, "@packet", 99, atcommand_packet }, // debug function - { AtCommand_StatusPoint, "@stpoint", 60, atcommand_statuspoint }, - { AtCommand_SkillPoint, "@skpoint", 60, atcommand_skillpoint }, - { AtCommand_Zeny, "@zeny", 60, atcommand_zeny }, - { AtCommand_Strength, "@str", 60, atcommand_param }, - { AtCommand_Agility, "@agi", 60, atcommand_param }, - { AtCommand_Vitality, "@vit", 60, atcommand_param }, - { AtCommand_Intelligence, "@int", 60, atcommand_param }, - { AtCommand_Dexterity, "@dex", 60, atcommand_param }, - { AtCommand_Luck, "@luk", 60, atcommand_param }, - { AtCommand_GuildLevelUp, "@guildlvl", 60, atcommand_guildlevelup }, - { AtCommand_Recall, "@recall", 60, atcommand_recall }, // + /recall - { AtCommand_Revive, "@revive", 60, atcommand_revive }, - { AtCommand_CharacterStats, "@charstats", 40, atcommand_character_stats }, - { AtCommand_CharacterStatsAll, "@charstatsall", 40, atcommand_character_stats_all }, - { AtCommand_CharacterOption, "@charoption", 60, atcommand_character_option }, - { AtCommand_CharacterSave, "@charsave", 60, atcommand_character_save }, - { AtCommand_Night, "@night", 80, atcommand_night }, - { AtCommand_Day, "@day", 80, atcommand_day }, - { AtCommand_Doom, "@doom", 80, atcommand_doom }, - { AtCommand_DoomMap, "@doommap", 80, atcommand_doommap }, - { AtCommand_Raise, "@raise", 80, atcommand_raise }, - { AtCommand_RaiseMap, "@raisemap", 80, atcommand_raisemap }, - { AtCommand_CharacterBaseLevel, "@charbaselvl", 60, atcommand_character_baselevel }, - { AtCommand_CharacterJobLevel, "@charjlvl", 60, atcommand_character_joblevel }, - { AtCommand_Kick, "@kick", 20, atcommand_kick }, // + right click menu for GM "(name) force to quit" - { AtCommand_KickAll, "@kickall", 99, atcommand_kickall }, - { AtCommand_AllSkills, "@allskills", 60, atcommand_allskills }, - { AtCommand_QuestSkill, "@questskill", 40, atcommand_questskill }, - { AtCommand_CharQuestSkill, "@charquestskill", 60, atcommand_charquestskill }, - { AtCommand_LostSkill, "@lostskill", 40, atcommand_lostskill }, - { AtCommand_CharLostSkill, "@charlostskill", 60, atcommand_charlostskill }, - { AtCommand_Party, "@party", 1, atcommand_party }, - { AtCommand_Guild, "@guild", 50, atcommand_guild }, - { AtCommand_AgitStart, "@agitstart", 60, atcommand_agitstart }, - { AtCommand_AgitEnd, "@agitend", 60, atcommand_agitend }, - { AtCommand_MapExit, "@mapexit", 99, atcommand_mapexit }, - { AtCommand_IDSearch, "@idsearch", 60, atcommand_idsearch }, - { AtCommand_MapMove, "@mapmove", 40, atcommand_warp }, // /mm command - { AtCommand_Broadcast, "@broadcast", 40, atcommand_broadcast }, // /b and /nb command - { AtCommand_LocalBroadcast, "@localbroadcast", 40, atcommand_localbroadcast }, // /lb and /nlb command - { AtCommand_RecallAll, "@recallall", 80, atcommand_recallall }, - { AtCommand_CharSkReset, "@charskreset", 60, atcommand_charskreset }, - { AtCommand_CharStReset, "@charstreset", 60, atcommand_charstreset }, - { AtCommand_ReloadItemDB, "@reloaditemdb", 99, atcommand_reloaditemdb }, // admin command - { AtCommand_ReloadMobDB, "@reloadmobdb", 99, atcommand_reloadmobdb }, // admin command - { AtCommand_ReloadSkillDB, "@reloadskilldb", 99, atcommand_reloadskilldb }, // admin command - { AtCommand_ReloadScript, "@reloadscript", 99, atcommand_reloadscript }, // admin command - { AtCommand_ReloadGMDB, "@reloadgmdb", 99, atcommand_reloadgmdb }, // admin command - { AtCommand_CharReset, "@charreset", 60, atcommand_charreset }, - { AtCommand_CharModel, "@charmodel", 50, atcommand_charmodel }, - { AtCommand_CharSKPoint, "@charskpoint", 60, atcommand_charskpoint }, - { AtCommand_CharSTPoint, "@charstpoint", 60, atcommand_charstpoint }, - { AtCommand_CharZeny, "@charzeny", 60, atcommand_charzeny }, - { AtCommand_MapInfo, "@mapinfo", 99, atcommand_mapinfo }, - { AtCommand_Dye, "@dye", 40, atcommand_dye }, // by fritz - { AtCommand_Dye, "@ccolor", 40, atcommand_dye }, // by fritz - { AtCommand_HairStyle, "@hairstyle", 40, atcommand_hair_style }, // by fritz - { AtCommand_HairColor, "@haircolor", 40, atcommand_hair_color }, // by fritz - { AtCommand_AllStats, "@allstats", 60, atcommand_all_stats }, // by fritz - { AtCommand_CharChangeSex, "@charchangesex", 60, atcommand_char_change_sex }, // by Yor - { AtCommand_CharBlock, "@block", 60, atcommand_char_block }, // by Yor - { AtCommand_CharUnBlock, "@unblock", 60, atcommand_char_unblock }, // by Yor - { AtCommand_CharBan, "@ban", 60, atcommand_char_ban }, // by Yor - { AtCommand_CharUnBan, "@unban", 60, atcommand_char_unban }, // by Yor - { AtCommand_MountPeco, "@mountpeco", 20, atcommand_mount_peco }, // by Valaris - { AtCommand_CharMountPeco, "@charmountpeco", 50, atcommand_char_mount_peco }, // by Yor - { AtCommand_GuildSpy, "@guildspy", 60, atcommand_guildspy }, // [Syrus22] - { AtCommand_PartySpy, "@partyspy", 60, atcommand_partyspy }, // [Syrus22] - { AtCommand_GuildRecall, "@guildrecall", 60, atcommand_guildrecall }, // by Yor - { AtCommand_PartyRecall, "@partyrecall", 60, atcommand_partyrecall }, // by Yor - { AtCommand_Enablenpc, "@enablenpc", 80, atcommand_enablenpc }, // [] - { AtCommand_Disablenpc, "@disablenpc", 80, atcommand_disablenpc }, // [] - { AtCommand_ServerTime, "@servertime", 0, atcommand_servertime }, // by Yor - { AtCommand_CharDelItem, "@chardelitem", 60, atcommand_chardelitem }, // by Yor - { AtCommand_ListNearby, "@listnearby", 40, atcommand_list_nearby }, // by Yor - { AtCommand_Jail, "@jail", 60, atcommand_jail }, // by Yor - { AtCommand_UnJail, "@unjail", 60, atcommand_unjail }, // by Yor - { AtCommand_Disguise, "@disguise", 20, atcommand_disguise }, // [Valaris] - { AtCommand_UnDisguise, "@undisguise", 20, atcommand_undisguise }, // by Yor - { AtCommand_IgnoreList, "@ignorelist", 0, atcommand_ignorelist }, // by Yor - { AtCommand_CharIgnoreList, "@charignorelist", 20, atcommand_charignorelist }, // by Yor - { AtCommand_IgnoreList, "@inall", 20, atcommand_inall }, // by Yor - { AtCommand_ExAll, "@exall", 20, atcommand_exall }, // by Yor - { AtCommand_CharDisguise, "@chardisguise", 60, atcommand_chardisguise }, // Kalaspuff - { AtCommand_CharUnDisguise, "@charundisguise", 60, atcommand_charundisguise }, // Kalaspuff - { AtCommand_EMail, "@email", 0, atcommand_email }, // by Yor - { AtCommand_Effect, "@effect", 40, atcommand_effect }, // by Apple - { AtCommand_Char_Item_List, "@charitemlist", 40, atcommand_character_item_list }, // by Yor - { AtCommand_Char_Storage_List, "@charstoragelist", 40, atcommand_character_storage_list }, // by Yor - { AtCommand_Char_Cart_List, "@charcartlist", 40, atcommand_character_cart_list }, // by Yor - { AtCommand_Follow, "@follow", 10, atcommand_follow }, // by MouseJstr - { AtCommand_AddWarp, "@addwarp", 20, atcommand_addwarp }, // by MouseJstr - { AtCommand_SkillOn, "@skillon", 20, atcommand_skillon }, // by MouseJstr - { AtCommand_SkillOff, "@skilloff", 20, atcommand_skilloff }, // by MouseJstr - { AtCommand_Killer, "@killer", 60, atcommand_killer }, // by MouseJstr - { AtCommand_NpcMove, "@npcmove", 20, atcommand_npcmove }, // by MouseJstr - { AtCommand_Killable, "@killable", 40, atcommand_killable }, // by MouseJstr - { AtCommand_CharKillable, "@charkillable", 40, atcommand_charkillable }, // by MouseJstr - { AtCommand_Chareffect, "@chareffect", 40, atcommand_chareffect }, // MouseJstr - //{ AtCommand_Chardye, "@chardye", 40, atcommand_chardye }, // MouseJstr - //{ AtCommand_Charhairstyle, "@charhairstyle", 40, atcommand_charhairstyle }, // MouseJstr - //{ AtCommand_Charhaircolor, "@charhaircolor", 40, atcommand_charhaircolor }, // MouseJstr - { AtCommand_Dropall, "@dropall", 40, atcommand_dropall }, // MouseJstr - { AtCommand_Chardropall, "@chardropall", 40, atcommand_chardropall }, // MouseJstr - { AtCommand_Storeall, "@storeall", 40, atcommand_storeall }, // MouseJstr - { AtCommand_Charstoreall, "@charstoreall", 40, atcommand_charstoreall }, // MouseJstr - { AtCommand_Skillid, "@skillid", 40, atcommand_skillid }, // MouseJstr - { AtCommand_Useskill, "@useskill", 40, atcommand_useskill }, // MouseJstr - { AtCommand_Rain, "@rain", 99, atcommand_rain }, - { AtCommand_Snow, "@snow", 99, atcommand_snow }, - { AtCommand_Sakura, "@sakura", 99, atcommand_sakura }, - { AtCommand_Fog, "@fog", 99, atcommand_fog }, - { AtCommand_Leaves, "@leaves", 99, atcommand_leaves }, - //{ AtCommand_Shuffle, "@shuffle", 99, atcommand_shuffle }, - //{ AtCommand_Maintenance, "@maintenance", 99, atcommand_maintenance }, - //{ AtCommand_Misceffect, "@misceffect", 60, atcommand_misceffect }, - { AtCommand_Summon, "@summon", 60, atcommand_summon }, - { AtCommand_AdjGmLvl, "@adjgmlvl", 99, atcommand_adjgmlvl }, - { AtCommand_AdjCmdLvl, "@adjcmdlvl", 99, atcommand_adjcmdlvl }, - { AtCommand_Trade, "@trade", 60, atcommand_trade }, - { AtCommand_UnMute, "@unmute", 60, atcommand_unmute }, // [Valaris] - { AtCommand_UnMute, "@charwipe", 60, atcommand_char_wipe }, // [Fate] - { AtCommand_SetMagic, "@setmagic", 99, atcommand_set_magic }, // [Fate] - { AtCommand_MagicInfo, "@magicinfo", 60, atcommand_magic_info }, // [Fate] - { AtCommand_Log, "@log", 60, atcommand_log }, // [Fate] - { AtCommand_Log, "@l", 60, atcommand_log }, // [Fate] - { AtCommand_Tee, "@tee", 60, atcommand_tee }, // [Fate] - { AtCommand_Tee, "@t", 60, atcommand_tee }, // [Fate] - { AtCommand_Invisible, "@invisible", 60, atcommand_invisible }, // [Fate] - { AtCommand_Visible, "@visible", 60, atcommand_visible }, // [Fate] - { AtCommand_IterateForward, "@hugo", 60, atcommand_iterate_forward_over_players }, // [Fate] - { AtCommand_IterateBackward, "@linus", 60, atcommand_iterate_backwards_over_players }, // [Fate] - { AtCommand_IterateBackward, "@sp-info", 40, atcommand_skillpool_info }, // [Fate] - { AtCommand_IterateBackward, "@sp-focus", 80, atcommand_skillpool_focus }, // [Fate] - { AtCommand_IterateBackward, "@sp-unfocus", 80, atcommand_skillpool_unfocus }, // [Fate] - { AtCommand_IterateBackward, "@skill-learn", 80, atcommand_skill_learn }, // [Fate] - { AtCommand_Wgm, "@wgm", 0, atcommand_wgm }, + {AtCommand_Setup, "@setup", 40, atcommand_setup}, + {AtCommand_CharWarp, "@charwarp", 60, atcommand_charwarp}, + {AtCommand_Warp, "@warp", 40, atcommand_warp}, + {AtCommand_Where, "@where", 1, atcommand_where}, + {AtCommand_Goto, "@goto", 20, atcommand_goto}, + {AtCommand_Jump, "@jump", 40, atcommand_jump}, + {AtCommand_Who, "@who", 20, atcommand_who}, + {AtCommand_WhoGroup, "@whogroup", 20, atcommand_whogroup}, + {AtCommand_WhoMap, "@whomap", 20, atcommand_whomap}, + {AtCommand_WhoMapGroup, "@whomapgroup", 20, atcommand_whomapgroup}, + {AtCommand_WhoGM, "@whogm", 20, atcommand_whogm}, // by Yor + {AtCommand_Save, "@save", 40, atcommand_save}, + {AtCommand_Load, "@return", 40, atcommand_load}, + {AtCommand_Load, "@load", 40, atcommand_load}, + {AtCommand_Speed, "@speed", 40, atcommand_speed}, + {AtCommand_Storage, "@storage", 1, atcommand_storage}, + {AtCommand_GuildStorage, "@gstorage", 50, atcommand_guildstorage}, + {AtCommand_Option, "@option", 40, atcommand_option}, + {AtCommand_Hide, "@hide", 40, atcommand_hide}, // + /hide + {AtCommand_Die, "@die", 1, atcommand_die}, + {AtCommand_Kill, "@kill", 60, atcommand_kill}, + {AtCommand_Alive, "@alive", 60, atcommand_alive}, + {AtCommand_Kami, "@kami", 40, atcommand_kami}, + {AtCommand_Heal, "@heal", 40, atcommand_heal}, + {AtCommand_Item, "@item", 60, atcommand_item}, + {AtCommand_ItemReset, "@itemreset", 40, atcommand_itemreset}, + {AtCommand_ItemCheck, "@itemcheck", 60, atcommand_itemcheck}, + {AtCommand_BaseLevelUp, "@blvl", 60, atcommand_baselevelup}, + {AtCommand_JobLevelUp, "@jlvl", 60, atcommand_joblevelup}, + {AtCommand_Help, "@help", 20, atcommand_help}, + {AtCommand_GM, "@gm", 100, atcommand_gm}, + {AtCommand_PvPOff, "@pvpoff", 40, atcommand_pvpoff}, + {AtCommand_PvPOn, "@pvpon", 40, atcommand_pvpon}, + {AtCommand_GvGOff, "@gvgoff", 40, atcommand_gvgoff}, + {AtCommand_GvGOff, "@gpvpoff", 40, atcommand_gvgoff}, + {AtCommand_GvGOn, "@gvgon", 40, atcommand_gvgon}, + {AtCommand_GvGOn, "@gpvpon", 40, atcommand_gvgon}, + {AtCommand_Model, "@model", 20, atcommand_model}, + {AtCommand_Go, "@go", 10, atcommand_go}, + {AtCommand_Spawn, "@spawn", 50, atcommand_spawn}, + {AtCommand_KillMonster, "@killmonster", 60, atcommand_killmonster}, + {AtCommand_KillMonster2, "@killmonster2", 40, atcommand_killmonster2}, + {AtCommand_Produce, "@produce", 60, atcommand_produce}, + {AtCommand_Memo, "@memo", 40, atcommand_memo}, + {AtCommand_GAT, "@gat", 99, atcommand_gat}, // debug function + {AtCommand_Packet, "@packet", 99, atcommand_packet}, // debug function + {AtCommand_StatusPoint, "@stpoint", 60, atcommand_statuspoint}, + {AtCommand_SkillPoint, "@skpoint", 60, atcommand_skillpoint}, + {AtCommand_Zeny, "@zeny", 60, atcommand_zeny}, + {AtCommand_Strength, "@str", 60, atcommand_param}, + {AtCommand_Agility, "@agi", 60, atcommand_param}, + {AtCommand_Vitality, "@vit", 60, atcommand_param}, + {AtCommand_Intelligence, "@int", 60, atcommand_param}, + {AtCommand_Dexterity, "@dex", 60, atcommand_param}, + {AtCommand_Luck, "@luk", 60, atcommand_param}, + {AtCommand_GuildLevelUp, "@guildlvl", 60, atcommand_guildlevelup}, + {AtCommand_Recall, "@recall", 60, atcommand_recall}, // + /recall + {AtCommand_Revive, "@revive", 60, atcommand_revive}, + {AtCommand_CharacterStats, "@charstats", 40, atcommand_character_stats}, + {AtCommand_CharacterStatsAll, "@charstatsall", 40, + atcommand_character_stats_all}, + {AtCommand_CharacterOption, "@charoption", 60, + atcommand_character_option}, + {AtCommand_CharacterSave, "@charsave", 60, atcommand_character_save}, + {AtCommand_Night, "@night", 80, atcommand_night}, + {AtCommand_Day, "@day", 80, atcommand_day}, + {AtCommand_Doom, "@doom", 80, atcommand_doom}, + {AtCommand_DoomMap, "@doommap", 80, atcommand_doommap}, + {AtCommand_Raise, "@raise", 80, atcommand_raise}, + {AtCommand_RaiseMap, "@raisemap", 80, atcommand_raisemap}, + {AtCommand_CharacterBaseLevel, "@charbaselvl", 60, + atcommand_character_baselevel}, + {AtCommand_CharacterJobLevel, "@charjlvl", 60, + atcommand_character_joblevel}, + {AtCommand_Kick, "@kick", 20, atcommand_kick}, // + right click menu for GM "(name) force to quit" + {AtCommand_KickAll, "@kickall", 99, atcommand_kickall}, + {AtCommand_AllSkills, "@allskills", 60, atcommand_allskills}, + {AtCommand_QuestSkill, "@questskill", 40, atcommand_questskill}, + {AtCommand_CharQuestSkill, "@charquestskill", 60, + atcommand_charquestskill}, + {AtCommand_LostSkill, "@lostskill", 40, atcommand_lostskill}, + {AtCommand_CharLostSkill, "@charlostskill", 60, atcommand_charlostskill}, + {AtCommand_Party, "@party", 1, atcommand_party}, + {AtCommand_Guild, "@guild", 50, atcommand_guild}, + {AtCommand_AgitStart, "@agitstart", 60, atcommand_agitstart}, + {AtCommand_AgitEnd, "@agitend", 60, atcommand_agitend}, + {AtCommand_MapExit, "@mapexit", 99, atcommand_mapexit}, + {AtCommand_IDSearch, "@idsearch", 60, atcommand_idsearch}, + {AtCommand_MapMove, "@mapmove", 40, atcommand_warp}, // /mm command + {AtCommand_Broadcast, "@broadcast", 40, atcommand_broadcast}, // /b and /nb command + {AtCommand_LocalBroadcast, "@localbroadcast", 40, atcommand_localbroadcast}, // /lb and /nlb command + {AtCommand_RecallAll, "@recallall", 80, atcommand_recallall}, + {AtCommand_CharSkReset, "@charskreset", 60, atcommand_charskreset}, + {AtCommand_CharStReset, "@charstreset", 60, atcommand_charstreset}, + {AtCommand_ReloadItemDB, "@reloaditemdb", 99, atcommand_reloaditemdb}, // admin command + {AtCommand_ReloadMobDB, "@reloadmobdb", 99, atcommand_reloadmobdb}, // admin command + {AtCommand_ReloadSkillDB, "@reloadskilldb", 99, atcommand_reloadskilldb}, // admin command + {AtCommand_ReloadScript, "@reloadscript", 99, atcommand_reloadscript}, // admin command + {AtCommand_ReloadGMDB, "@reloadgmdb", 99, atcommand_reloadgmdb}, // admin command + {AtCommand_CharReset, "@charreset", 60, atcommand_charreset}, + {AtCommand_CharModel, "@charmodel", 50, atcommand_charmodel}, + {AtCommand_CharSKPoint, "@charskpoint", 60, atcommand_charskpoint}, + {AtCommand_CharSTPoint, "@charstpoint", 60, atcommand_charstpoint}, + {AtCommand_CharZeny, "@charzeny", 60, atcommand_charzeny}, + {AtCommand_MapInfo, "@mapinfo", 99, atcommand_mapinfo}, + {AtCommand_Dye, "@dye", 40, atcommand_dye}, // by fritz + {AtCommand_Dye, "@ccolor", 40, atcommand_dye}, // by fritz + {AtCommand_HairStyle, "@hairstyle", 40, atcommand_hair_style}, // by fritz + {AtCommand_HairColor, "@haircolor", 40, atcommand_hair_color}, // by fritz + {AtCommand_AllStats, "@allstats", 60, atcommand_all_stats}, // by fritz + {AtCommand_CharChangeSex, "@charchangesex", 60, atcommand_char_change_sex}, // by Yor + {AtCommand_CharBlock, "@block", 60, atcommand_char_block}, // by Yor + {AtCommand_CharUnBlock, "@unblock", 60, atcommand_char_unblock}, // by Yor + {AtCommand_CharBan, "@ban", 60, atcommand_char_ban}, // by Yor + {AtCommand_CharUnBan, "@unban", 60, atcommand_char_unban}, // by Yor + {AtCommand_MountPeco, "@mountpeco", 20, atcommand_mount_peco}, // by Valaris + {AtCommand_CharMountPeco, "@charmountpeco", 50, atcommand_char_mount_peco}, // by Yor + {AtCommand_GuildSpy, "@guildspy", 60, atcommand_guildspy}, // [Syrus22] + {AtCommand_PartySpy, "@partyspy", 60, atcommand_partyspy}, // [Syrus22] + {AtCommand_GuildRecall, "@guildrecall", 60, atcommand_guildrecall}, // by Yor + {AtCommand_PartyRecall, "@partyrecall", 60, atcommand_partyrecall}, // by Yor + {AtCommand_Enablenpc, "@enablenpc", 80, atcommand_enablenpc}, // [] + {AtCommand_Disablenpc, "@disablenpc", 80, atcommand_disablenpc}, // [] + {AtCommand_ServerTime, "@servertime", 0, atcommand_servertime}, // by Yor + {AtCommand_CharDelItem, "@chardelitem", 60, atcommand_chardelitem}, // by Yor + {AtCommand_ListNearby, "@listnearby", 40, atcommand_list_nearby}, // by Yor + {AtCommand_Jail, "@jail", 60, atcommand_jail}, // by Yor + {AtCommand_UnJail, "@unjail", 60, atcommand_unjail}, // by Yor + {AtCommand_Disguise, "@disguise", 20, atcommand_disguise}, // [Valaris] + {AtCommand_UnDisguise, "@undisguise", 20, atcommand_undisguise}, // by Yor + {AtCommand_IgnoreList, "@ignorelist", 0, atcommand_ignorelist}, // by Yor + {AtCommand_CharIgnoreList, "@charignorelist", 20, atcommand_charignorelist}, // by Yor + {AtCommand_IgnoreList, "@inall", 20, atcommand_inall}, // by Yor + {AtCommand_ExAll, "@exall", 20, atcommand_exall}, // by Yor + {AtCommand_CharDisguise, "@chardisguise", 60, atcommand_chardisguise}, // Kalaspuff + {AtCommand_CharUnDisguise, "@charundisguise", 60, atcommand_charundisguise}, // Kalaspuff + {AtCommand_EMail, "@email", 0, atcommand_email}, // by Yor + {AtCommand_Effect, "@effect", 40, atcommand_effect}, // by Apple + {AtCommand_Char_Item_List, "@charitemlist", 40, atcommand_character_item_list}, // by Yor + {AtCommand_Char_Storage_List, "@charstoragelist", 40, atcommand_character_storage_list}, // by Yor + {AtCommand_Char_Cart_List, "@charcartlist", 40, atcommand_character_cart_list}, // by Yor + {AtCommand_Follow, "@follow", 10, atcommand_follow}, // by MouseJstr + {AtCommand_AddWarp, "@addwarp", 20, atcommand_addwarp}, // by MouseJstr + {AtCommand_SkillOn, "@skillon", 20, atcommand_skillon}, // by MouseJstr + {AtCommand_SkillOff, "@skilloff", 20, atcommand_skilloff}, // by MouseJstr + {AtCommand_Killer, "@killer", 60, atcommand_killer}, // by MouseJstr + {AtCommand_NpcMove, "@npcmove", 20, atcommand_npcmove}, // by MouseJstr + {AtCommand_Killable, "@killable", 40, atcommand_killable}, // by MouseJstr + {AtCommand_CharKillable, "@charkillable", 40, atcommand_charkillable}, // by MouseJstr + {AtCommand_Chareffect, "@chareffect", 40, atcommand_chareffect}, // MouseJstr + //{ AtCommand_Chardye, "@chardye", 40, atcommand_chardye }, // MouseJstr + //{ AtCommand_Charhairstyle, "@charhairstyle", 40, atcommand_charhairstyle }, // MouseJstr + //{ AtCommand_Charhaircolor, "@charhaircolor", 40, atcommand_charhaircolor }, // MouseJstr + {AtCommand_Dropall, "@dropall", 40, atcommand_dropall}, // MouseJstr + {AtCommand_Chardropall, "@chardropall", 40, atcommand_chardropall}, // MouseJstr + {AtCommand_Storeall, "@storeall", 40, atcommand_storeall}, // MouseJstr + {AtCommand_Charstoreall, "@charstoreall", 40, atcommand_charstoreall}, // MouseJstr + {AtCommand_Skillid, "@skillid", 40, atcommand_skillid}, // MouseJstr + {AtCommand_Useskill, "@useskill", 40, atcommand_useskill}, // MouseJstr + {AtCommand_Rain, "@rain", 99, atcommand_rain}, + {AtCommand_Snow, "@snow", 99, atcommand_snow}, + {AtCommand_Sakura, "@sakura", 99, atcommand_sakura}, + {AtCommand_Fog, "@fog", 99, atcommand_fog}, + {AtCommand_Leaves, "@leaves", 99, atcommand_leaves}, + //{ AtCommand_Shuffle, "@shuffle", 99, atcommand_shuffle }, + //{ AtCommand_Maintenance, "@maintenance", 99, atcommand_maintenance }, + //{ AtCommand_Misceffect, "@misceffect", 60, atcommand_misceffect }, + {AtCommand_Summon, "@summon", 60, atcommand_summon}, + {AtCommand_AdjGmLvl, "@adjgmlvl", 99, atcommand_adjgmlvl}, + {AtCommand_AdjCmdLvl, "@adjcmdlvl", 99, atcommand_adjcmdlvl}, + {AtCommand_Trade, "@trade", 60, atcommand_trade}, + {AtCommand_UnMute, "@unmute", 60, atcommand_unmute}, // [Valaris] + {AtCommand_UnMute, "@charwipe", 60, atcommand_char_wipe}, // [Fate] + {AtCommand_SetMagic, "@setmagic", 99, atcommand_set_magic}, // [Fate] + {AtCommand_MagicInfo, "@magicinfo", 60, atcommand_magic_info}, // [Fate] + {AtCommand_Log, "@log", 60, atcommand_log}, // [Fate] + {AtCommand_Log, "@l", 60, atcommand_log}, // [Fate] + {AtCommand_Tee, "@tee", 60, atcommand_tee}, // [Fate] + {AtCommand_Tee, "@t", 60, atcommand_tee}, // [Fate] + {AtCommand_Invisible, "@invisible", 60, atcommand_invisible}, // [Fate] + {AtCommand_Visible, "@visible", 60, atcommand_visible}, // [Fate] + {AtCommand_IterateForward, "@hugo", 60, atcommand_iterate_forward_over_players}, // [Fate] + {AtCommand_IterateBackward, "@linus", 60, atcommand_iterate_backwards_over_players}, // [Fate] + {AtCommand_IterateBackward, "@sp-info", 40, atcommand_skillpool_info}, // [Fate] + {AtCommand_IterateBackward, "@sp-focus", 80, atcommand_skillpool_focus}, // [Fate] + {AtCommand_IterateBackward, "@sp-unfocus", 80, atcommand_skillpool_unfocus}, // [Fate] + {AtCommand_IterateBackward, "@skill-learn", 80, atcommand_skill_learn}, // [Fate] + {AtCommand_Wgm, "@wgm", 0, atcommand_wgm}, // add new commands before this line - { AtCommand_Unknown, NULL, 1, NULL } + {AtCommand_Unknown, NULL, 1, NULL} }; /*==================================================== * This function return the name of the job (by [Yor]) *---------------------------------------------------- */ -char * job_name(int class) { - switch (class) { - case 0: return "Novice"; - case 1: return "Swordsman"; - case 2: return "Mage"; - case 3: return "Archer"; - case 4: return "Acolyte"; - case 5: return "Merchant"; - case 6: return "Thief"; - case 7: return "Knight"; - case 8: return "Priest"; - case 9: return "Wizard"; - case 10: return "Blacksmith"; - case 11: return "Hunter"; - case 12: return "Assassin"; - case 13: return "Knight 2"; - case 14: return "Crusader"; - case 15: return "Monk"; - case 16: return "Sage"; - case 17: return "Rogue"; - case 18: return "Alchemist"; - case 19: return "Bard"; - case 20: return "Dancer"; - case 21: return "Crusader 2"; - case 22: return "Wedding"; - case 23: return "Super Novice"; - case 4001: return "Novice High"; - case 4002: return "Swordsman High"; - case 4003: return "Mage High"; - case 4004: return "Archer High"; - case 4005: return "Acolyte High"; - case 4006: return "Merchant High"; - case 4007: return "Thief High"; - case 4008: return "Lord Knight"; - case 4009: return "High Priest"; - case 4010: return "High Wizard"; - case 4011: return "Whitesmith"; - case 4012: return "Sniper"; - case 4013: return "Assassin Cross"; - case 4014: return "Peko Knight"; - case 4015: return "Paladin"; - case 4016: return "Champion"; - case 4017: return "Professor"; - case 4018: return "Stalker"; - case 4019: return "Creator"; - case 4020: return "Clown"; - case 4021: return "Gypsy"; - case 4022: return "Peko Paladin"; - case 4023: return "Baby Novice"; - case 4024: return "Baby Swordsman"; - case 4025: return "Baby Mage"; - case 4026: return "Baby Archer"; - case 4027: return "Baby Acolyte"; - case 4028: return "Baby Merchant"; - case 4029: return "Baby Thief"; - case 4030: return "Baby Knight"; - case 4031: return "Baby Priest"; - case 4032: return "Baby Wizard"; - case 4033: return "Baby Blacksmith"; - case 4034: return "Baby Hunter"; - case 4035: return "Baby Assassin"; - case 4036: return "Baby Peco Knight"; - case 4037: return "Baby Crusader"; - case 4038: return "Baby Monk"; - case 4039: return "Baby Sage"; - case 4040: return "Baby Rogue"; - case 4041: return "Baby Alchemist"; - case 4042: return "Baby Bard"; - case 4043: return "Baby Dancer"; - case 4044: return "Baby Peco Crusader"; - case 4045: return "Super Baby"; - } - return "Unknown Job"; +char *job_name (int class) +{ + switch (class) + { + case 0: + return "Novice"; + case 1: + return "Swordsman"; + case 2: + return "Mage"; + case 3: + return "Archer"; + case 4: + return "Acolyte"; + case 5: + return "Merchant"; + case 6: + return "Thief"; + case 7: + return "Knight"; + case 8: + return "Priest"; + case 9: + return "Wizard"; + case 10: + return "Blacksmith"; + case 11: + return "Hunter"; + case 12: + return "Assassin"; + case 13: + return "Knight 2"; + case 14: + return "Crusader"; + case 15: + return "Monk"; + case 16: + return "Sage"; + case 17: + return "Rogue"; + case 18: + return "Alchemist"; + case 19: + return "Bard"; + case 20: + return "Dancer"; + case 21: + return "Crusader 2"; + case 22: + return "Wedding"; + case 23: + return "Super Novice"; + case 4001: + return "Novice High"; + case 4002: + return "Swordsman High"; + case 4003: + return "Mage High"; + case 4004: + return "Archer High"; + case 4005: + return "Acolyte High"; + case 4006: + return "Merchant High"; + case 4007: + return "Thief High"; + case 4008: + return "Lord Knight"; + case 4009: + return "High Priest"; + case 4010: + return "High Wizard"; + case 4011: + return "Whitesmith"; + case 4012: + return "Sniper"; + case 4013: + return "Assassin Cross"; + case 4014: + return "Peko Knight"; + case 4015: + return "Paladin"; + case 4016: + return "Champion"; + case 4017: + return "Professor"; + case 4018: + return "Stalker"; + case 4019: + return "Creator"; + case 4020: + return "Clown"; + case 4021: + return "Gypsy"; + case 4022: + return "Peko Paladin"; + case 4023: + return "Baby Novice"; + case 4024: + return "Baby Swordsman"; + case 4025: + return "Baby Mage"; + case 4026: + return "Baby Archer"; + case 4027: + return "Baby Acolyte"; + case 4028: + return "Baby Merchant"; + case 4029: + return "Baby Thief"; + case 4030: + return "Baby Knight"; + case 4031: + return "Baby Priest"; + case 4032: + return "Baby Wizard"; + case 4033: + return "Baby Blacksmith"; + case 4034: + return "Baby Hunter"; + case 4035: + return "Baby Assassin"; + case 4036: + return "Baby Peco Knight"; + case 4037: + return "Baby Crusader"; + case 4038: + return "Baby Monk"; + case 4039: + return "Baby Sage"; + case 4040: + return "Baby Rogue"; + case 4041: + return "Baby Alchemist"; + case 4042: + return "Baby Bard"; + case 4043: + return "Baby Dancer"; + case 4044: + return "Baby Peco Crusader"; + case 4045: + return "Super Baby"; + } + return "Unknown Job"; } //----------------------------------------------------------- // Return the message string of the specified number by [Yor] //----------------------------------------------------------- -char * msg_txt(int msg_number) { - if (msg_number >= 0 && msg_number < (int)(sizeof(msg_table) / sizeof(msg_table[0])) && - msg_table[msg_number] != NULL && msg_table[msg_number][0] != '\0') - return msg_table[msg_number]; +char *msg_txt (int msg_number) +{ + if (msg_number >= 0 + && msg_number < (int) (sizeof (msg_table) / sizeof (msg_table[0])) + && msg_table[msg_number] != NULL && msg_table[msg_number][0] != '\0') + return msg_table[msg_number]; - return "??"; + return "??"; } //------------------------------------------------------------ // E-mail check: return 0 (not correct) or 1 (valid). by [Yor] //------------------------------------------------------------ -int e_mail_check(unsigned char *email) { - char ch; - unsigned char* last_arobas; +int e_mail_check (unsigned char *email) +{ + char ch; + unsigned char *last_arobas; - // athena limits - if (strlen(email) < 3 || strlen(email) > 39) - return 0; + // athena limits + if (strlen (email) < 3 || strlen (email) > 39) + return 0; - // part of RFC limits (official reference of e-mail description) - if (strchr(email, '@') == NULL || email[strlen(email)-1] == '@') - return 0; + // part of RFC limits (official reference of e-mail description) + if (strchr (email, '@') == NULL || email[strlen (email) - 1] == '@') + return 0; - if (email[strlen(email)-1] == '.') - return 0; + if (email[strlen (email) - 1] == '.') + return 0; - last_arobas = strrchr(email, '@'); + last_arobas = strrchr (email, '@'); - if (strstr(last_arobas, "@.") != NULL || - strstr(last_arobas, "..") != NULL) - return 0; + if (strstr (last_arobas, "@.") != NULL || + strstr (last_arobas, "..") != NULL) + return 0; - for(ch = 1; ch < 32; ch++) { - if (strchr(last_arobas, ch) != NULL) { - return 0; - break; - } - } + for (ch = 1; ch < 32; ch++) + { + if (strchr (last_arobas, ch) != NULL) + { + return 0; + break; + } + } - if (strchr(last_arobas, ' ') != NULL || - strchr(last_arobas, ';') != NULL) - return 0; + if (strchr (last_arobas, ' ') != NULL || + strchr (last_arobas, ';') != NULL) + return 0; - // all correct - return 1; + // all correct + return 1; } /*========================================== * get_atcommand_level @コマンドの必要レベルを取得 *------------------------------------------ */ -int get_atcommand_level(const AtCommandType type) { - int i; +int get_atcommand_level (const AtCommandType type) +{ + int i; - for (i = 0; atcommand_info[i].type != AtCommand_None; i++) - if (atcommand_info[i].type == type) - return atcommand_info[i].level; + for (i = 0; atcommand_info[i].type != AtCommand_None; i++) + if (atcommand_info[i].type == type) + return atcommand_info[i].level; - return 100; // 100: command can not be used + return 100; // 100: command can not be used } - /*======================================== * At-command logging */ -void log_atcommand(struct map_session_data *sd, const char *fmt, ...) { - char message[512]; - va_list ap; +void log_atcommand (struct map_session_data *sd, const char *fmt, ...) +{ + char message[512]; + va_list ap; - va_start(ap, fmt); - vsnprintf(message, 511, fmt, ap); - va_end(ap); + va_start (ap, fmt); + vsnprintf (message, 511, fmt, ap); + va_end (ap); - if (pc_isGM(sd)) - gm_log("%s(%d,%d) %s : %s", map[sd->bl.m].name, sd->bl.x, - sd->bl.y, sd->status.name, message); + if (pc_isGM (sd)) + gm_log ("%s(%d,%d) %s : %s", map[sd->bl.m].name, sd->bl.x, + sd->bl.y, sd->status.name, message); } char *gm_logfile_name = NULL; @@ -571,264 +653,301 @@ char *gm_logfile_name = NULL; * Log a timestamped line to GM log file *------------------------------------------ */ -void gm_log(const char *fmt, ...) { - static int last_logfile_nr = 0; - static FILE *gm_logfile = NULL; - time_t time_v; - struct tm ctime; - int month, year, logfile_nr; - char message[512]; - va_list ap; +void gm_log (const char *fmt, ...) +{ + static int last_logfile_nr = 0; + static FILE *gm_logfile = NULL; + time_t time_v; + struct tm ctime; + int month, year, logfile_nr; + char message[512]; + va_list ap; - if (!gm_logfile_name) - return; + if (!gm_logfile_name) + return; - va_start(ap, fmt); - vsnprintf(message, 511, fmt, ap); - va_end(ap); + va_start (ap, fmt); + vsnprintf (message, 511, fmt, ap); + va_end (ap); - time(&time_v); - gmtime_r(&time_v, &ctime); + time (&time_v); + gmtime_r (&time_v, &ctime); - year = ctime.tm_year + 1900; - month = ctime.tm_mon + 1; - logfile_nr = (year * 12) + month; + year = ctime.tm_year + 1900; + month = ctime.tm_mon + 1; + logfile_nr = (year * 12) + month; - if (logfile_nr != last_logfile_nr) { - char *fullname = malloc(strlen(gm_logfile_name) + 10); - sprintf(fullname, "%s.%04d-%02d", gm_logfile_name, year, month); + if (logfile_nr != last_logfile_nr) + { + char *fullname = malloc (strlen (gm_logfile_name) + 10); + sprintf (fullname, "%s.%04d-%02d", gm_logfile_name, year, month); - if (gm_logfile) - fclose_(gm_logfile); + if (gm_logfile) + fclose_ (gm_logfile); - gm_logfile = fopen_(fullname, "a"); - free(fullname); + gm_logfile = fopen_ (fullname, "a"); + free (fullname); - if (!gm_logfile) { - perror("GM log file"); - gm_logfile_name = NULL; - } - last_logfile_nr = logfile_nr; - } + if (!gm_logfile) + { + perror ("GM log file"); + gm_logfile_name = NULL; + } + last_logfile_nr = logfile_nr; + } - fprintf(gm_logfile, "[%04d-%02d-%02d %02d:%02d:%02d] %s\n", - year, month, ctime.tm_mday, ctime.tm_hour, - ctime.tm_min, ctime.tm_sec, message); + fprintf (gm_logfile, "[%04d-%02d-%02d %02d:%02d:%02d] %s\n", + year, month, ctime.tm_mday, ctime.tm_hour, + ctime.tm_min, ctime.tm_sec, message); - fflush(gm_logfile); + fflush (gm_logfile); } - /*========================================== *is_atcommand @コマンドに存在するかどうか確認する *------------------------------------------ */ AtCommandType -is_atcommand(const int fd, struct map_session_data* sd, const char* message, int gmlvl) { - const char* str = message; - int s_flag = 0; - AtCommandInfo info; - AtCommandType type; - - nullpo_retr(AtCommand_None, sd); - - if (!message || !*message) - return AtCommand_None; - - memset(&info, 0, sizeof(info)); - str += strlen(sd->status.name); - while (*str && (isspace(*str) || (s_flag == 0 && *str == ':'))) { - if (*str == ':') - s_flag = 1; - str++; - } - if (!*str) - return AtCommand_None; - - type = atcommand(gmlvl > 0 ? gmlvl : pc_isGM(sd), str, &info); - if (type != AtCommand_None) { - char command[100]; - char output[200]; - const char* p = str; - memset(command, '\0', sizeof(command)); - memset(output, '\0', sizeof(output)); - while (*p && !isspace(*p)) - p++; - if (p - str >= sizeof(command)) // too long - return AtCommand_Unknown; - strncpy(command, str, p - str); - while (isspace(*p)) - p++; - - if (type == AtCommand_Unknown || info.proc == NULL) { - sprintf(output, msg_table[153], command); // %s is Unknown Command. - clif_displaymessage(fd, output); - } else { - if (info.proc(fd, sd, command, p) != 0) { - // Command can not be executed - sprintf(output, msg_table[154], command); // %s failed. - clif_displaymessage(fd, output); - } else { - if (get_atcommand_level(type) != 0) // Don't log level 0 commands - log_atcommand(sd, "%s %s", command, p); - } - } +is_atcommand (const int fd, struct map_session_data *sd, const char *message, + int gmlvl) +{ + const char *str = message; + int s_flag = 0; + AtCommandInfo info; + AtCommandType type; + + nullpo_retr (AtCommand_None, sd); + + if (!message || !*message) + return AtCommand_None; + + memset (&info, 0, sizeof (info)); + str += strlen (sd->status.name); + while (*str && (isspace (*str) || (s_flag == 0 && *str == ':'))) + { + if (*str == ':') + s_flag = 1; + str++; + } + if (!*str) + return AtCommand_None; + + type = atcommand (gmlvl > 0 ? gmlvl : pc_isGM (sd), str, &info); + if (type != AtCommand_None) + { + char command[100]; + char output[200]; + const char *p = str; + memset (command, '\0', sizeof (command)); + memset (output, '\0', sizeof (output)); + while (*p && !isspace (*p)) + p++; + if (p - str >= sizeof (command)) // too long + return AtCommand_Unknown; + strncpy (command, str, p - str); + while (isspace (*p)) + p++; + + if (type == AtCommand_Unknown || info.proc == NULL) + { + sprintf (output, msg_table[153], command); // %s is Unknown Command. + clif_displaymessage (fd, output); + } + else + { + if (info.proc (fd, sd, command, p) != 0) + { + // Command can not be executed + sprintf (output, msg_table[154], command); // %s failed. + clif_displaymessage (fd, output); + } + else + { + if (get_atcommand_level (type) != 0) // Don't log level 0 commands + log_atcommand (sd, "%s %s", command, p); + } + } - return info.type; - } + return info.type; + } - return AtCommand_None; + return AtCommand_None; } /*========================================== * *------------------------------------------ */ -AtCommandType atcommand(const int level, const char* message, struct AtCommandInfo* info) { - char* p = (char *)message; // it's 'char' and not 'const char' to have possibility to modify the first character if necessary - - if (!info) - return AtCommand_None; - if (battle_config.atc_gmonly != 0 && !level) // level = pc_isGM(sd) - return AtCommand_None; - if (!p || !*p) { - fprintf(stderr, "at command message is empty\n"); - return AtCommand_None; - } - - if (*p == command_symbol) { // check first char. - char command[101]; - int i = 0; - memset(info, 0, sizeof(AtCommandInfo)); - sscanf(p, "%100s", command); - command[sizeof(command)-1] = '\0'; - - while (atcommand_info[i].type != AtCommand_Unknown) { - if (strcmpi(command+1, atcommand_info[i].command+1) == 0 && level >= atcommand_info[i].level) { - p[0] = atcommand_info[i].command[0]; // set correct first symbol for after. - break; - } - i++; - } - - if (atcommand_info[i].type == AtCommand_Unknown) { - // doesn't return Unknown if player is normal player (display the text, not display: unknown command) - if (level == 0) - return AtCommand_None; - else - return AtCommand_Unknown; - } - memcpy(info, &atcommand_info[i], sizeof atcommand_info[i]); - } else { - return AtCommand_None; - } - - return info->type; +AtCommandType atcommand (const int level, const char *message, + struct AtCommandInfo * info) +{ + char *p = (char *) message; // it's 'char' and not 'const char' to have possibility to modify the first character if necessary + + if (!info) + return AtCommand_None; + if (battle_config.atc_gmonly != 0 && !level) // level = pc_isGM(sd) + return AtCommand_None; + if (!p || !*p) + { + fprintf (stderr, "at command message is empty\n"); + return AtCommand_None; + } + + if (*p == command_symbol) + { // check first char. + char command[101]; + int i = 0; + memset (info, 0, sizeof (AtCommandInfo)); + sscanf (p, "%100s", command); + command[sizeof (command) - 1] = '\0'; + + while (atcommand_info[i].type != AtCommand_Unknown) + { + if (strcmpi (command + 1, atcommand_info[i].command + 1) == 0 + && level >= atcommand_info[i].level) + { + p[0] = atcommand_info[i].command[0]; // set correct first symbol for after. + break; + } + i++; + } + + if (atcommand_info[i].type == AtCommand_Unknown) + { + // doesn't return Unknown if player is normal player (display the text, not display: unknown command) + if (level == 0) + return AtCommand_None; + else + return AtCommand_Unknown; + } + memcpy (info, &atcommand_info[i], sizeof atcommand_info[i]); + } + else + { + return AtCommand_None; + } + + return info->type; } /*========================================== * *------------------------------------------ */ -static int atkillmonster_sub(struct block_list *bl, va_list ap) { - int flag = va_arg(ap, int); +static int atkillmonster_sub (struct block_list *bl, va_list ap) +{ + int flag = va_arg (ap, int); - nullpo_retr(0, bl); + nullpo_retr (0, bl); - if (flag) - mob_damage(NULL, (struct mob_data *)bl, ((struct mob_data *)bl)->hp, 2); - else - mob_delete((struct mob_data *)bl); + if (flag) + mob_damage (NULL, (struct mob_data *) bl, + ((struct mob_data *) bl)->hp, 2); + else + mob_delete ((struct mob_data *) bl); - return 0; + return 0; } /*========================================== * Read Message Data *------------------------------------------ */ -int msg_config_read(const char *cfgName) { - int msg_number; - char line[1024], w1[1024], w2[1024]; - FILE *fp; +int msg_config_read (const char *cfgName) +{ + int msg_number; + char line[1024], w1[1024], w2[1024]; + FILE *fp; - if ((fp = fopen_(cfgName, "r")) == NULL) { - printf("Messages file not found: %s\n", cfgName); - return 1; - } + if ((fp = fopen_ (cfgName, "r")) == NULL) + { + printf ("Messages file not found: %s\n", cfgName); + return 1; + } - while(fgets(line, sizeof(line)-1, fp)) { - if (line[0] == '/' && line[1] == '/') - continue; - if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) { - if (strcmpi(w1, "import") == 0) { - msg_config_read(w2); - } else { - msg_number = atoi(w1); - if (msg_number >= 0 && msg_number < (int)(sizeof(msg_table) / sizeof(msg_table[0]))) - strcpy(msg_table[msg_number], w2); - // printf("message #%d: '%s'.\n", msg_number, msg_table[msg_number]); - } - } - } - fclose_(fp); + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) == 2) + { + if (strcmpi (w1, "import") == 0) + { + msg_config_read (w2); + } + else + { + msg_number = atoi (w1); + if (msg_number >= 0 + && msg_number < + (int) (sizeof (msg_table) / sizeof (msg_table[0]))) + strcpy (msg_table[msg_number], w2); + // printf("message #%d: '%s'.\n", msg_number, msg_table[msg_number]); + } + } + } + fclose_ (fp); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -static AtCommandInfo* get_atcommandinfo_byname(const char* name) { - int i; +static AtCommandInfo *get_atcommandinfo_byname (const char *name) +{ + int i; - for (i = 0; atcommand_info[i].type != AtCommand_Unknown; i++) - if (strcmpi(atcommand_info[i].command + 1, name) == 0) - return &atcommand_info[i]; + for (i = 0; atcommand_info[i].type != AtCommand_Unknown; i++) + if (strcmpi (atcommand_info[i].command + 1, name) == 0) + return &atcommand_info[i]; - return NULL; + return NULL; } /*========================================== * *------------------------------------------ */ -int atcommand_config_read(const char *cfgName) { - char line[1024], w1[1024], w2[1024]; - AtCommandInfo* p; - FILE* fp; - - if ((fp = fopen_(cfgName, "r")) == NULL) { - printf("At commands configuration file not found: %s\n", cfgName); - return 1; - } +int atcommand_config_read (const char *cfgName) +{ + char line[1024], w1[1024], w2[1024]; + AtCommandInfo *p; + FILE *fp; - while (fgets(line, sizeof(line)-1, fp)) { - if (line[0] == '/' && line[1] == '/') - continue; + if ((fp = fopen_ (cfgName, "r")) == NULL) + { + printf ("At commands configuration file not found: %s\n", cfgName); + return 1; + } - if (sscanf(line, "%1023[^:]:%1023s", w1, w2) != 2) - continue; - p = get_atcommandinfo_byname(w1); - if (p != NULL) { - p->level = atoi(w2); - if (p->level > 100) - p->level = 100; - else if (p->level < 0) - p->level = 0; - } + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + + if (sscanf (line, "%1023[^:]:%1023s", w1, w2) != 2) + continue; + p = get_atcommandinfo_byname (w1); + if (p != NULL) + { + p->level = atoi (w2); + if (p->level > 100) + p->level = 100; + else if (p->level < 0) + p->level = 0; + } - if (strcmpi(w1, "import") == 0) - atcommand_config_read(w2); - else if (strcmpi(w1, "command_symbol") == 0 && w2[0] > 31 && - w2[0] != '/' && // symbol of standard ragnarok GM commands - w2[0] != '%') // symbol of party chat speaking - command_symbol = w2[0]; - } - fclose_(fp); + if (strcmpi (w1, "import") == 0) + atcommand_config_read (w2); + else if (strcmpi (w1, "command_symbol") == 0 && w2[0] > 31 && w2[0] != '/' && // symbol of standard ragnarok GM commands + w2[0] != '%') // symbol of party chat speaking + command_symbol = w2[0]; + } + fclose_ (fp); - return 0; + return 0; } /*========================================== @@ -841,35 +960,36 @@ int atcommand_config_read(const char *cfgName) { * TAW Specific *------------------------------------------ */ -int atcommand_setup( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_setup (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char buf[256]; - char character[100]; - int level = 1; + char buf[256]; + char character[100]; + int level = 1; - memset(character, '\0', sizeof(character)); + memset (character, '\0', sizeof (character)); - if (!message || !*message || sscanf(message, "%d %99[^\n]", &level, character) < 2) { - clif_displaymessage(fd, "Usage: @setup <level> <char name>"); - return -1; - } - level--; + if (!message || !*message + || sscanf (message, "%d %99[^\n]", &level, character) < 2) + { + clif_displaymessage (fd, "Usage: @setup <level> <char name>"); + return -1; + } + level--; - snprintf(buf, 255, "-255 %s", character); - atcommand_character_baselevel(fd, sd, "@charbaselvl", buf); + snprintf (buf, 255, "-255 %s", character); + atcommand_character_baselevel (fd, sd, "@charbaselvl", buf); - snprintf(buf, 255, "%d %s", level, character); - atcommand_character_baselevel(fd, sd, "@charbaselvl", buf); + snprintf (buf, 255, "%d %s", level, character); + atcommand_character_baselevel (fd, sd, "@charbaselvl", buf); - snprintf(buf, 255, "+10 %s", character); - atcommand_character_joblevel(fd, sd, "@charjoblvl", buf); + snprintf (buf, 255, "+10 %s", character); + atcommand_character_joblevel (fd, sd, "@charjoblvl", buf); - snprintf(buf, 255, "018-1.gat 24 98 %s", character); - atcommand_charwarp(fd, sd, "@charwarp", buf); + snprintf (buf, 255, "018-1.gat 24 98 %s", character); + atcommand_charwarp (fd, sd, "@charwarp", buf); - return(0); + return (0); } @@ -877,1366 +997,1622 @@ int atcommand_setup( * @rura+ *------------------------------------------ */ -int atcommand_charwarp( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char map_name[100]; - char character[100]; - int x = 0, y = 0; - struct map_session_data *pl_sd; - int m; - - memset(map_name, '\0', sizeof(map_name)); - memset(character, '\0', sizeof(character)); - - if (!message || !*message || sscanf(message, "%99s %d %d %99[^\n]", map_name, &x, &y, character) < 4) { - clif_displaymessage(fd, "Usage: @charwarp/@rura+ <mapname> <x> <y> <char name>"); - return -1; - } - - if (x <= 0) - x = MRAND(399) + 1; - if (y <= 0) - y = MRAND(399) + 1; - if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat) - strcat(map_name, ".gat"); - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can rura+ only lower or same GM level - if (x > 0 && x < 400 && y > 0 && y < 400) { - m = map_mapname2mapid(map_name); - if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp someone to this map."); - return -1; - } - if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp this player from its actual map."); - return -1; - } - if (pc_setpos(pl_sd, map_name, x, y, 3) == 0) { - clif_displaymessage(pl_sd->fd, msg_table[0]); // Warped. - clif_displaymessage(fd, msg_table[15]); // Player warped (message sends to player too). - } else { - clif_displaymessage(fd, msg_table[1]); // Map not found. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[2]); // Coordinates out of range. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_charwarp (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char map_name[100]; + char character[100]; + int x = 0, y = 0; + struct map_session_data *pl_sd; + int m; + + memset (map_name, '\0', sizeof (map_name)); + memset (character, '\0', sizeof (character)); + + if (!message || !*message + || sscanf (message, "%99s %d %d %99[^\n]", map_name, &x, &y, + character) < 4) + { + clif_displaymessage (fd, + "Usage: @charwarp/@rura+ <mapname> <x> <y> <char name>"); + return -1; + } + + if (x <= 0) + x = MRAND (399) + 1; + if (y <= 0) + y = MRAND (399) + 1; + if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat) + strcat (map_name, ".gat"); + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can rura+ only lower or same GM level + if (x > 0 && x < 400 && y > 0 && y < 400) + { + m = map_mapname2mapid (map_name); + if (m >= 0 && map[m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp someone to this map."); + return -1; + } + if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp this player from its actual map."); + return -1; + } + if (pc_setpos (pl_sd, map_name, x, y, 3) == 0) + { + clif_displaymessage (pl_sd->fd, msg_table[0]); // Warped. + clif_displaymessage (fd, msg_table[15]); // Player warped (message sends to player too). + } + else + { + clif_displaymessage (fd, msg_table[1]); // Map not found. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[2]); // Coordinates out of range. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_warp(const int fd, struct map_session_data* sd, const char* command, const char* message) +int atcommand_warp (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char map_name[100]; - int x = 0, y = 0; - int m; - - memset(map_name, '\0', sizeof(map_name)); + char map_name[100]; + int x = 0, y = 0; + int m; - if (!message || !*message || sscanf(message, "%99s %d %d", map_name, &x, &y) < 1) { - clif_displaymessage(fd, "Please, enter a map (usage: @warp <mapname> <x> <y>)."); - return -1; - } + memset (map_name, '\0', sizeof (map_name)); - if (x <= 0) - x = MRAND(399) + 1; - if (y <= 0) - y = MRAND(399) + 1; - - if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat) - strcat(map_name, ".gat"); + if (!message || !*message + || sscanf (message, "%99s %d %d", map_name, &x, &y) < 1) + { + clif_displaymessage (fd, + "Please, enter a map (usage: @warp <mapname> <x> <y>)."); + return -1; + } - if (x > 0 && x < 400 && y > 0 && y < 400) { - m = map_mapname2mapid(map_name); - if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to this map."); - return -1; - } - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); - return -1; - } - if (pc_setpos(sd, map_name, x, y, 3) == 0) - clif_displaymessage(fd, msg_table[0]); // Warped. - else { - clif_displaymessage(fd, msg_table[1]); // Map not found. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[2]); // Coordinates out of range. - return -1; - } + if (x <= 0) + x = MRAND (399) + 1; + if (y <= 0) + y = MRAND (399) + 1; + + if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat) + strcat (map_name, ".gat"); + + if (x > 0 && x < 400 && y > 0 && y < 400) + { + m = map_mapname2mapid (map_name); + if (m >= 0 && map[m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp you to this map."); + return -1; + } + if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp you from your actual map."); + return -1; + } + if (pc_setpos (sd, map_name, x, y, 3) == 0) + clif_displaymessage (fd, msg_table[0]); // Warped. + else + { + clif_displaymessage (fd, msg_table[1]); // Map not found. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[2]); // Coordinates out of range. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_where(const int fd, struct map_session_data* sd, const char* command, const char* message) +int atcommand_where (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - char output[200]; - struct map_session_data *pl_sd; + char character[100]; + char output[200]; + struct map_session_data *pl_sd; - memset(character, '\0', sizeof(character)); - memset(output, '\0', sizeof(output)); + memset (character, '\0', sizeof (character)); + memset (output, '\0', sizeof (output)); - if (sscanf(message, "%99[^\n]", character) < 1) - strcpy(character, sd->status.name); + if (sscanf (message, "%99[^\n]", character) < 1) + strcpy (character, sd->status.name); - if ((pl_sd = map_nick2sd(character)) != NULL && - !((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pc_isGM(pl_sd) > pc_isGM(sd)))) { // you can look only lower or same level - sprintf(output, "%s: %s (%d,%d)", pl_sd->status.name, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y); - clif_displaymessage(fd, output); - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } + if ((pl_sd = map_nick2sd (character)) != NULL && + !((battle_config.hide_GM_session + || (pl_sd->status.option & OPTION_HIDE)) + && (pc_isGM (pl_sd) > pc_isGM (sd)))) + { // you can look only lower or same level + sprintf (output, "%s: %s (%d,%d)", pl_sd->status.name, pl_sd->mapname, + pl_sd->bl.x, pl_sd->bl.y); + clif_displaymessage (fd, output); + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_goto(const int fd, struct map_session_data* sd, const char* command, const char* message) +int atcommand_goto (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - char output[200]; - struct map_session_data *pl_sd; + char character[100]; + char output[200]; + struct map_session_data *pl_sd; - memset(character, '\0', sizeof(character)); - memset(output, '\0', sizeof(output)); + memset (character, '\0', sizeof (character)); + memset (output, '\0', sizeof (output)); - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @jumpto/@warpto/@goto <char name>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @jumpto/@warpto/@goto <char name>)."); + return -1; + } - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to the map of this player."); - return -1; - } - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); - return -1; - } - pc_setpos(sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3); - sprintf(output, msg_table[4], character); // Jump to %s - clif_displaymessage(fd, output); - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp you to the map of this player."); + return -1; + } + if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp you from your actual map."); + return -1; + } + pc_setpos (sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3); + sprintf (output, msg_table[4], character); // Jump to %s + clif_displaymessage (fd, output); + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_jump(const int fd, struct map_session_data* sd, const char* command, const char* message) +int atcommand_jump (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char output[200]; - int x = 0, y = 0; + char output[200]; + int x = 0, y = 0; - memset(output, '\0', sizeof(output)); + memset (output, '\0', sizeof (output)); - sscanf(message, "%d %d", &x, &y); + sscanf (message, "%d %d", &x, &y); - if (x <= 0) - x = MRAND(399) + 1; - if (y <= 0) - y = MRAND(399) + 1; - if (x > 0 && x < 400 && y > 0 && y < 400) { - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to your actual map."); - return -1; - } - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); - return -1; - } - pc_setpos(sd, sd->mapname, x, y, 3); - sprintf(output, msg_table[5], x, y); // Jump to %d %d - clif_displaymessage(fd, output); - } else { - clif_displaymessage(fd, msg_table[2]); // Coordinates out of range. - return -1; - } + if (x <= 0) + x = MRAND (399) + 1; + if (y <= 0) + y = MRAND (399) + 1; + if (x > 0 && x < 400 && y > 0 && y < 400) + { + if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp you to your actual map."); + return -1; + } + if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp you from your actual map."); + return -1; + } + pc_setpos (sd, sd->mapname, x, y, 3); + sprintf (output, msg_table[5], x, y); // Jump to %d %d + clif_displaymessage (fd, output); + } + else + { + clif_displaymessage (fd, msg_table[2]); // Coordinates out of range. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_who( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char output[200]; - struct map_session_data *pl_sd; - int i, j, count; - int pl_GM_level, GM_level; - char match_text[100]; - char player_name[24]; - - memset(output, '\0', sizeof(output)); - memset(match_text, '\0', sizeof(match_text)); - memset(player_name, '\0', sizeof(player_name)); - - if (sscanf(message, "%99[^\n]", match_text) < 1) - strcpy(match_text, ""); - for (j = 0; match_text[j]; j++) - match_text[j] = tolower(match_text[j]); - - count = 0; - GM_level = pc_isGM(sd); - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - pl_GM_level = pc_isGM(pl_sd); - if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level - memcpy(player_name, pl_sd->status.name, 24); - for (j = 0; player_name[j]; j++) - player_name[j] = tolower(player_name[j]); - if (strstr(player_name, match_text) != NULL) { // search with no case sensitive - if (pl_GM_level > 0) - sprintf(output, "Name: %s (GM:%d) | Location: %s %d %d", pl_sd->status.name, pl_GM_level, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y); - else - sprintf(output, "Name: %s | Location: %s %d %d", pl_sd->status.name, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y); - clif_displaymessage(fd, output); - count++; - } - } - } - } - - if (count == 0) - clif_displaymessage(fd, msg_table[28]); // No player found. - else if (count == 1) - clif_displaymessage(fd, msg_table[29]); // 1 player found. - else { - sprintf(output, msg_table[30], count); // %d players found. - clif_displaymessage(fd, output); - } - - return 0; +int atcommand_who (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char output[200]; + struct map_session_data *pl_sd; + int i, j, count; + int pl_GM_level, GM_level; + char match_text[100]; + char player_name[24]; + + memset (output, '\0', sizeof (output)); + memset (match_text, '\0', sizeof (match_text)); + memset (player_name, '\0', sizeof (player_name)); + + if (sscanf (message, "%99[^\n]", match_text) < 1) + strcpy (match_text, ""); + for (j = 0; match_text[j]; j++) + match_text[j] = tolower (match_text[j]); + + count = 0; + GM_level = pc_isGM (sd); + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + pl_GM_level = pc_isGM (pl_sd); + if (! + ((battle_config.hide_GM_session + || (pl_sd->status.option & OPTION_HIDE)) + && (pl_GM_level > GM_level))) + { // you can look only lower or same level + memcpy (player_name, pl_sd->status.name, 24); + for (j = 0; player_name[j]; j++) + player_name[j] = tolower (player_name[j]); + if (strstr (player_name, match_text) != NULL) + { // search with no case sensitive + if (pl_GM_level > 0) + sprintf (output, + "Name: %s (GM:%d) | Location: %s %d %d", + pl_sd->status.name, pl_GM_level, + pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y); + else + sprintf (output, "Name: %s | Location: %s %d %d", + pl_sd->status.name, pl_sd->mapname, + pl_sd->bl.x, pl_sd->bl.y); + clif_displaymessage (fd, output); + count++; + } + } + } + } + + if (count == 0) + clif_displaymessage (fd, msg_table[28]); // No player found. + else if (count == 1) + clif_displaymessage (fd, msg_table[29]); // 1 player found. + else + { + sprintf (output, msg_table[30], count); // %d players found. + clif_displaymessage (fd, output); + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_whogroup( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char temp0[100]; - char temp1[100]; - char output[200]; - struct map_session_data *pl_sd; - int i, j, count; - int pl_GM_level, GM_level; - char match_text[100]; - char player_name[24]; - struct guild *g; - struct party *p; - - memset(temp0, '\0', sizeof(temp0)); - memset(temp1, '\0', sizeof(temp1)); - memset(output, '\0', sizeof(output)); - memset(match_text, '\0', sizeof(match_text)); - memset(player_name, '\0', sizeof(player_name)); - - if (sscanf(message, "%99[^\n]", match_text) < 1) - strcpy(match_text, ""); - for (j = 0; match_text[j]; j++) - match_text[j] = tolower(match_text[j]); - - count = 0; - GM_level = pc_isGM(sd); - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - pl_GM_level = pc_isGM(pl_sd); - if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level - memcpy(player_name, pl_sd->status.name, 24); - for (j = 0; player_name[j]; j++) - player_name[j] = tolower(player_name[j]); - if (strstr(player_name, match_text) != NULL) { // search with no case sensitive - g = guild_search(pl_sd->status.guild_id); - if (g == NULL) - sprintf(temp1, "None"); - else - sprintf(temp1, "%s", g->name); - p = party_search(pl_sd->status.party_id); - if (p == NULL) - sprintf(temp0, "None"); - else - sprintf(temp0, "%s", p->name); - if (pl_GM_level > 0) - sprintf(output, "Name: %s (GM:%d) | Party: '%s' | Guild: '%s'", pl_sd->status.name, pl_GM_level, temp0, temp1); - else - sprintf(output, "Name: %s | Party: '%s' | Guild: '%s'", pl_sd->status.name, temp0, temp1); - clif_displaymessage(fd, output); - count++; - } - } - } - } - - if (count == 0) - clif_displaymessage(fd, msg_table[28]); // No player found. - else if (count == 1) - clif_displaymessage(fd, msg_table[29]); // 1 player found. - else { - sprintf(output, msg_table[30], count); // %d players found. - clif_displaymessage(fd, output); - } - - return 0; +int atcommand_whogroup (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char temp0[100]; + char temp1[100]; + char output[200]; + struct map_session_data *pl_sd; + int i, j, count; + int pl_GM_level, GM_level; + char match_text[100]; + char player_name[24]; + struct guild *g; + struct party *p; + + memset (temp0, '\0', sizeof (temp0)); + memset (temp1, '\0', sizeof (temp1)); + memset (output, '\0', sizeof (output)); + memset (match_text, '\0', sizeof (match_text)); + memset (player_name, '\0', sizeof (player_name)); + + if (sscanf (message, "%99[^\n]", match_text) < 1) + strcpy (match_text, ""); + for (j = 0; match_text[j]; j++) + match_text[j] = tolower (match_text[j]); + + count = 0; + GM_level = pc_isGM (sd); + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + pl_GM_level = pc_isGM (pl_sd); + if (! + ((battle_config.hide_GM_session + || (pl_sd->status.option & OPTION_HIDE)) + && (pl_GM_level > GM_level))) + { // you can look only lower or same level + memcpy (player_name, pl_sd->status.name, 24); + for (j = 0; player_name[j]; j++) + player_name[j] = tolower (player_name[j]); + if (strstr (player_name, match_text) != NULL) + { // search with no case sensitive + g = guild_search (pl_sd->status.guild_id); + if (g == NULL) + sprintf (temp1, "None"); + else + sprintf (temp1, "%s", g->name); + p = party_search (pl_sd->status.party_id); + if (p == NULL) + sprintf (temp0, "None"); + else + sprintf (temp0, "%s", p->name); + if (pl_GM_level > 0) + sprintf (output, + "Name: %s (GM:%d) | Party: '%s' | Guild: '%s'", + pl_sd->status.name, pl_GM_level, temp0, + temp1); + else + sprintf (output, + "Name: %s | Party: '%s' | Guild: '%s'", + pl_sd->status.name, temp0, temp1); + clif_displaymessage (fd, output); + count++; + } + } + } + } + + if (count == 0) + clif_displaymessage (fd, msg_table[28]); // No player found. + else if (count == 1) + clif_displaymessage (fd, msg_table[29]); // 1 player found. + else + { + sprintf (output, msg_table[30], count); // %d players found. + clif_displaymessage (fd, output); + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_whomap( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char output[200]; - struct map_session_data *pl_sd; - int i, count; - int pl_GM_level, GM_level; - int map_id; - char map_name[100]; - - memset(output, '\0', sizeof(output)); - memset(map_name, '\0', sizeof(map_name)); - - if (!message || !*message) - map_id = sd->bl.m; - else { - sscanf(message, "%99s", map_name); - if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat) - strcat(map_name, ".gat"); - if ((map_id = map_mapname2mapid(map_name)) < 0) - map_id = sd->bl.m; - } - - count = 0; - GM_level = pc_isGM(sd); - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - pl_GM_level = pc_isGM(pl_sd); - if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level - if (pl_sd->bl.m == map_id) { - if (pl_GM_level > 0) - sprintf(output, "Name: %s (GM:%d) | Location: %s %d %d", pl_sd->status.name, pl_GM_level, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y); - else - sprintf(output, "Name: %s | Location: %s %d %d", pl_sd->status.name, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y); - clif_displaymessage(fd, output); - count++; - } - } - } - } - - if (count == 0) - sprintf(output, msg_table[54], map[map_id].name); // No player found in map '%s'. - else if (count == 1) - sprintf(output, msg_table[55], map[map_id].name); // 1 player found in map '%s'. - else { - sprintf(output, msg_table[56], count, map[map_id].name); // %d players found in map '%s'. - } - clif_displaymessage(fd, output); - - return 0; +int atcommand_whomap (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char output[200]; + struct map_session_data *pl_sd; + int i, count; + int pl_GM_level, GM_level; + int map_id; + char map_name[100]; + + memset (output, '\0', sizeof (output)); + memset (map_name, '\0', sizeof (map_name)); + + if (!message || !*message) + map_id = sd->bl.m; + else + { + sscanf (message, "%99s", map_name); + if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat) + strcat (map_name, ".gat"); + if ((map_id = map_mapname2mapid (map_name)) < 0) + map_id = sd->bl.m; + } + + count = 0; + GM_level = pc_isGM (sd); + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + pl_GM_level = pc_isGM (pl_sd); + if (! + ((battle_config.hide_GM_session + || (pl_sd->status.option & OPTION_HIDE)) + && (pl_GM_level > GM_level))) + { // you can look only lower or same level + if (pl_sd->bl.m == map_id) + { + if (pl_GM_level > 0) + sprintf (output, + "Name: %s (GM:%d) | Location: %s %d %d", + pl_sd->status.name, pl_GM_level, + pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y); + else + sprintf (output, "Name: %s | Location: %s %d %d", + pl_sd->status.name, pl_sd->mapname, + pl_sd->bl.x, pl_sd->bl.y); + clif_displaymessage (fd, output); + count++; + } + } + } + } + + if (count == 0) + sprintf (output, msg_table[54], map[map_id].name); // No player found in map '%s'. + else if (count == 1) + sprintf (output, msg_table[55], map[map_id].name); // 1 player found in map '%s'. + else + { + sprintf (output, msg_table[56], count, map[map_id].name); // %d players found in map '%s'. + } + clif_displaymessage (fd, output); + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_whomapgroup( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char temp0[100]; - char temp1[100]; - char output[200]; - struct map_session_data *pl_sd; - int i, count; - int pl_GM_level, GM_level; - int map_id = 0; - char map_name[100]; - struct guild *g; - struct party *p; - - memset(temp0, '\0', sizeof(temp0)); - memset(temp1, '\0', sizeof(temp1)); - memset(output, '\0', sizeof(output)); - memset(map_name, '\0', sizeof(map_name)); - - if (!message || !*message) - map_id = sd->bl.m; - else { - sscanf(message, "%99s", map_name); - if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat) - strcat(map_name, ".gat"); - if ((map_id = map_mapname2mapid(map_name)) < 0) - map_id = sd->bl.m; - } - - count = 0; - GM_level = pc_isGM(sd); - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - pl_GM_level = pc_isGM(pl_sd); - if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level - if (pl_sd->bl.m == map_id) { - g = guild_search(pl_sd->status.guild_id); - if (g == NULL) - sprintf(temp1, "None"); - else - sprintf(temp1, "%s", g->name); - p = party_search(pl_sd->status.party_id); - if (p == NULL) - sprintf(temp0, "None"); - else - sprintf(temp0, "%s", p->name); - if (pl_GM_level > 0) - sprintf(output, "Name: %s (GM:%d) | Party: '%s' | Guild: '%s'", pl_sd->status.name, pl_GM_level, temp0, temp1); - else - sprintf(output, "Name: %s | Party: '%s' | Guild: '%s'", pl_sd->status.name, temp0, temp1); - clif_displaymessage(fd, output); - count++; - } - } - } - } - - if (count == 0) - sprintf(output, msg_table[54], map[map_id].name); // No player found in map '%s'. - else if (count == 1) - sprintf(output, msg_table[55], map[map_id].name); // 1 player found in map '%s'. - else { - sprintf(output, msg_table[56], count, map[map_id].name); // %d players found in map '%s'. - } - clif_displaymessage(fd, output); - - return 0; +int atcommand_whomapgroup (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char temp0[100]; + char temp1[100]; + char output[200]; + struct map_session_data *pl_sd; + int i, count; + int pl_GM_level, GM_level; + int map_id = 0; + char map_name[100]; + struct guild *g; + struct party *p; + + memset (temp0, '\0', sizeof (temp0)); + memset (temp1, '\0', sizeof (temp1)); + memset (output, '\0', sizeof (output)); + memset (map_name, '\0', sizeof (map_name)); + + if (!message || !*message) + map_id = sd->bl.m; + else + { + sscanf (message, "%99s", map_name); + if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat) + strcat (map_name, ".gat"); + if ((map_id = map_mapname2mapid (map_name)) < 0) + map_id = sd->bl.m; + } + + count = 0; + GM_level = pc_isGM (sd); + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + pl_GM_level = pc_isGM (pl_sd); + if (! + ((battle_config.hide_GM_session + || (pl_sd->status.option & OPTION_HIDE)) + && (pl_GM_level > GM_level))) + { // you can look only lower or same level + if (pl_sd->bl.m == map_id) + { + g = guild_search (pl_sd->status.guild_id); + if (g == NULL) + sprintf (temp1, "None"); + else + sprintf (temp1, "%s", g->name); + p = party_search (pl_sd->status.party_id); + if (p == NULL) + sprintf (temp0, "None"); + else + sprintf (temp0, "%s", p->name); + if (pl_GM_level > 0) + sprintf (output, + "Name: %s (GM:%d) | Party: '%s' | Guild: '%s'", + pl_sd->status.name, pl_GM_level, temp0, + temp1); + else + sprintf (output, + "Name: %s | Party: '%s' | Guild: '%s'", + pl_sd->status.name, temp0, temp1); + clif_displaymessage (fd, output); + count++; + } + } + } + } + + if (count == 0) + sprintf (output, msg_table[54], map[map_id].name); // No player found in map '%s'. + else if (count == 1) + sprintf (output, msg_table[55], map[map_id].name); // 1 player found in map '%s'. + else + { + sprintf (output, msg_table[56], count, map[map_id].name); // %d players found in map '%s'. + } + clif_displaymessage (fd, output); + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_whogm( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char temp0[100]; - char temp1[100]; - char output[200]; - struct map_session_data *pl_sd; - int i, j, count; - int pl_GM_level, GM_level; - char match_text[100]; - char player_name[24]; - struct guild *g; - struct party *p; - - memset(temp0, '\0', sizeof(temp0)); - memset(temp1, '\0', sizeof(temp1)); - memset(output, '\0', sizeof(output)); - memset(match_text, '\0', sizeof(match_text)); - memset(player_name, '\0', sizeof(player_name)); - - if (sscanf(message, "%99[^\n]", match_text) < 1) - strcpy(match_text, ""); - for (j = 0; match_text[j]; j++) - match_text[j] = tolower(match_text[j]); - - count = 0; - GM_level = pc_isGM(sd); - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - pl_GM_level = pc_isGM(pl_sd); - if (pl_GM_level > 0) { - if (!((battle_config.hide_GM_session || (pl_sd->status.option & OPTION_HIDE)) && (pl_GM_level > GM_level))) { // you can look only lower or same level - memcpy(player_name, pl_sd->status.name, 24); - for (j = 0; player_name[j]; j++) - player_name[j] = tolower(player_name[j]); - if (strstr(player_name, match_text) != NULL) { // search with no case sensitive - sprintf(output, "Name: %s (GM:%d) | Location: %s %d %d", pl_sd->status.name, pl_GM_level, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y); - clif_displaymessage(fd, output); - sprintf(output, " BLvl: %d | Job: %s (Lvl: %d)", pl_sd->status.base_level, job_name(pl_sd->status.class), pl_sd->status.job_level); - clif_displaymessage(fd, output); - g = guild_search(pl_sd->status.guild_id); - if (g == NULL) - sprintf(temp1, "None"); - else - sprintf(temp1, "%s", g->name); - p = party_search(pl_sd->status.party_id); - if (p == NULL) - sprintf(temp0, "None"); - else - sprintf(temp0, "%s", p->name); - sprintf(output, " Party: '%s' | Guild: '%s'", temp0, temp1); - clif_displaymessage(fd, output); - count++; - } - } - } - } - } - - if (count == 0) - clif_displaymessage(fd, msg_table[150]); // No GM found. - else if (count == 1) - clif_displaymessage(fd, msg_table[151]); // 1 GM found. - else { - sprintf(output, msg_table[152], count); // %d GMs found. - clif_displaymessage(fd, output); - } - - return 0; +int atcommand_whogm (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char temp0[100]; + char temp1[100]; + char output[200]; + struct map_session_data *pl_sd; + int i, j, count; + int pl_GM_level, GM_level; + char match_text[100]; + char player_name[24]; + struct guild *g; + struct party *p; + + memset (temp0, '\0', sizeof (temp0)); + memset (temp1, '\0', sizeof (temp1)); + memset (output, '\0', sizeof (output)); + memset (match_text, '\0', sizeof (match_text)); + memset (player_name, '\0', sizeof (player_name)); + + if (sscanf (message, "%99[^\n]", match_text) < 1) + strcpy (match_text, ""); + for (j = 0; match_text[j]; j++) + match_text[j] = tolower (match_text[j]); + + count = 0; + GM_level = pc_isGM (sd); + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + pl_GM_level = pc_isGM (pl_sd); + if (pl_GM_level > 0) + { + if (! + ((battle_config.hide_GM_session + || (pl_sd->status.option & OPTION_HIDE)) + && (pl_GM_level > GM_level))) + { // you can look only lower or same level + memcpy (player_name, pl_sd->status.name, 24); + for (j = 0; player_name[j]; j++) + player_name[j] = tolower (player_name[j]); + if (strstr (player_name, match_text) != NULL) + { // search with no case sensitive + sprintf (output, + "Name: %s (GM:%d) | Location: %s %d %d", + pl_sd->status.name, pl_GM_level, + pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y); + clif_displaymessage (fd, output); + sprintf (output, + " BLvl: %d | Job: %s (Lvl: %d)", + pl_sd->status.base_level, + job_name (pl_sd->status.class), + pl_sd->status.job_level); + clif_displaymessage (fd, output); + g = guild_search (pl_sd->status.guild_id); + if (g == NULL) + sprintf (temp1, "None"); + else + sprintf (temp1, "%s", g->name); + p = party_search (pl_sd->status.party_id); + if (p == NULL) + sprintf (temp0, "None"); + else + sprintf (temp0, "%s", p->name); + sprintf (output, " Party: '%s' | Guild: '%s'", + temp0, temp1); + clif_displaymessage (fd, output); + count++; + } + } + } + } + } + + if (count == 0) + clif_displaymessage (fd, msg_table[150]); // No GM found. + else if (count == 1) + clif_displaymessage (fd, msg_table[151]); // 1 GM found. + else + { + sprintf (output, msg_table[152], count); // %d GMs found. + clif_displaymessage (fd, output); + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_save( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_save (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - nullpo_retr(-1, sd); + nullpo_retr (-1, sd); - pc_setsavepoint(sd, sd->mapname, sd->bl.x, sd->bl.y); - pc_makesavestatus(sd); - chrif_save(sd); - clif_displaymessage(fd, msg_table[6]); // Character data respawn point saved. + pc_setsavepoint (sd, sd->mapname, sd->bl.x, sd->bl.y); + pc_makesavestatus (sd); + chrif_save (sd); + clif_displaymessage (fd, msg_table[6]); // Character data respawn point saved. - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_load( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_load (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int m; + int m; - m = map_mapname2mapid(sd->status.save_point.map); - if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to your save map."); - return -1; - } - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); - return -1; - } + m = map_mapname2mapid (sd->status.save_point.map); + if (m >= 0 && map[m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp you to your save map."); + return -1; + } + if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp you from your actual map."); + return -1; + } - pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, 0); - clif_displaymessage(fd, msg_table[7]); // Warping to respawn point. + pc_setpos (sd, sd->status.save_point.map, sd->status.save_point.x, + sd->status.save_point.y, 0); + clif_displaymessage (fd, msg_table[7]); // Warping to respawn point. - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_speed( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_speed (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char output[200]; - int speed; + char output[200]; + int speed; - memset(output, '\0', sizeof(output)); + memset (output, '\0', sizeof (output)); - if (!message || !*message) { - sprintf(output, "Please, enter a speed value (usage: @speed <%d-%d>).", MIN_WALK_SPEED, MAX_WALK_SPEED); - clif_displaymessage(fd, output); - return -1; - } + if (!message || !*message) + { + sprintf (output, + "Please, enter a speed value (usage: @speed <%d-%d>).", + MIN_WALK_SPEED, MAX_WALK_SPEED); + clif_displaymessage (fd, output); + return -1; + } - speed = atoi(message); - if (speed >= MIN_WALK_SPEED && speed <= MAX_WALK_SPEED) { - sd->speed = speed; - //sd->walktimer = x; - //この文を追加 by れ - clif_updatestatus(sd, SP_SPEED); - clif_displaymessage(fd, msg_table[8]); // Speed changed. - } else { - sprintf(output, "Please, enter a valid speed value (usage: @speed <%d-%d>).", MIN_WALK_SPEED, MAX_WALK_SPEED); - clif_displaymessage(fd, output); - return -1; - } + speed = atoi (message); + if (speed >= MIN_WALK_SPEED && speed <= MAX_WALK_SPEED) + { + sd->speed = speed; + //sd->walktimer = x; + //この文を追加 by れ + clif_updatestatus (sd, SP_SPEED); + clif_displaymessage (fd, msg_table[8]); // Speed changed. + } + else + { + sprintf (output, + "Please, enter a valid speed value (usage: @speed <%d-%d>).", + MIN_WALK_SPEED, MAX_WALK_SPEED); + clif_displaymessage (fd, output); + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_storage( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_storage (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct storage *stor; //changes from Freya/Yor - nullpo_retr(-1, sd); + struct storage *stor; //changes from Freya/Yor + nullpo_retr (-1, sd); - if (sd->state.storage_flag) { - clif_displaymessage(fd, msg_table[250]); - return -1; - } + if (sd->state.storage_flag) + { + clif_displaymessage (fd, msg_table[250]); + return -1; + } - if ((stor = account2storage2(sd->status.account_id)) != NULL && stor->storage_status == 1) { - clif_displaymessage(fd, msg_table[250]); - return -1; - } + if ((stor = account2storage2 (sd->status.account_id)) != NULL + && stor->storage_status == 1) + { + clif_displaymessage (fd, msg_table[250]); + return -1; + } - storage_storageopen(sd); + storage_storageopen (sd); - return 0; + return 0; } - /*========================================== * *------------------------------------------ */ -int atcommand_guildstorage( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_guildstorage (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct storage *stor; //changes from Freya/Yor - nullpo_retr(-1, sd); + struct storage *stor; //changes from Freya/Yor + nullpo_retr (-1, sd); - if (sd->status.guild_id > 0) { - if (sd->state.storage_flag) { - clif_displaymessage(fd, msg_table[251]); - return -1; - } - if ((stor = account2storage2(sd->status.account_id)) != NULL && stor->storage_status == 1) { - clif_displaymessage(fd, msg_table[251]); - return -1; - } - storage_guild_storageopen(sd); - } else { - clif_displaymessage(fd, msg_table[252]); - return -1; - } + if (sd->status.guild_id > 0) + { + if (sd->state.storage_flag) + { + clif_displaymessage (fd, msg_table[251]); + return -1; + } + if ((stor = account2storage2 (sd->status.account_id)) != NULL + && stor->storage_status == 1) + { + clif_displaymessage (fd, msg_table[251]); + return -1; + } + storage_guild_storageopen (sd); + } + else + { + clif_displaymessage (fd, msg_table[252]); + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_option( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - int param1 = 0, param2 = 0, param3 = 0; - nullpo_retr(-1, sd); - - if (!message || !*message || sscanf(message, "%d %d %d", ¶m1, ¶m2, ¶m3) < 1 || param1 < 0 || param2 < 0 || param3 < 0) { - clif_displaymessage(fd, "Please, enter at least a option (usage: @option <param1:0+> <param2:0+> <param3:0+>)."); - return -1; - } - - sd->opt1 = param1; - sd->opt2 = param2; - if (!(sd->status.option & CART_MASK) && param3 & CART_MASK) { - clif_cart_itemlist(sd); - clif_cart_equiplist(sd); - clif_updatestatus(sd, SP_CARTINFO); - } - sd->status.option = param3; - // fix pecopeco display - if (sd->status.class == 13 || sd->status.class == 21 || sd->status.class == 4014 || sd->status.class == 4022) { - if (!pc_isriding(sd)) { // sd have the new value... - if (sd->status.class == 13) - sd->status.class = sd->view_class = 7; - else if (sd->status.class == 21) - sd->status.class = sd->view_class = 14; - else if (sd->status.class == 4014) - sd->status.class = sd->view_class = 4008; - else if (sd->status.class == 4022) - sd->status.class = sd->view_class = 4015; - } - } else { - if (pc_isriding(sd)) { // sd have the new value... - if (sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] (code added by [Yor]) - sd->status.option &= ~0x0020; - } else { - if (sd->status.class == 7) - sd->status.class = sd->view_class = 13; - else if (sd->status.class == 14) - sd->status.class = sd->view_class = 21; - else if (sd->status.class == 4008) - sd->status.class = sd->view_class = 4014; - else if (sd->status.class == 4015) - sd->status.class = sd->view_class = 4022; - else - sd->status.option &= ~0x0020; - } - } - } - - clif_changeoption(&sd->bl); - pc_calcstatus(sd, 0); - clif_displaymessage(fd, msg_table[9]); // Options changed. - - return 0; +int atcommand_option (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + int param1 = 0, param2 = 0, param3 = 0; + nullpo_retr (-1, sd); + + if (!message || !*message + || sscanf (message, "%d %d %d", ¶m1, ¶m2, ¶m3) < 1 + || param1 < 0 || param2 < 0 || param3 < 0) + { + clif_displaymessage (fd, + "Please, enter at least a option (usage: @option <param1:0+> <param2:0+> <param3:0+>)."); + return -1; + } + + sd->opt1 = param1; + sd->opt2 = param2; + if (!(sd->status.option & CART_MASK) && param3 & CART_MASK) + { + clif_cart_itemlist (sd); + clif_cart_equiplist (sd); + clif_updatestatus (sd, SP_CARTINFO); + } + sd->status.option = param3; + // fix pecopeco display + if (sd->status.class == 13 || sd->status.class == 21 + || sd->status.class == 4014 || sd->status.class == 4022) + { + if (!pc_isriding (sd)) + { // sd have the new value... + if (sd->status.class == 13) + sd->status.class = sd->view_class = 7; + else if (sd->status.class == 21) + sd->status.class = sd->view_class = 14; + else if (sd->status.class == 4014) + sd->status.class = sd->view_class = 4008; + else if (sd->status.class == 4022) + sd->status.class = sd->view_class = 4015; + } + } + else + { + if (pc_isriding (sd)) + { // sd have the new value... + if (sd->disguise > 0) + { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] (code added by [Yor]) + sd->status.option &= ~0x0020; + } + else + { + if (sd->status.class == 7) + sd->status.class = sd->view_class = 13; + else if (sd->status.class == 14) + sd->status.class = sd->view_class = 21; + else if (sd->status.class == 4008) + sd->status.class = sd->view_class = 4014; + else if (sd->status.class == 4015) + sd->status.class = sd->view_class = 4022; + else + sd->status.option &= ~0x0020; + } + } + } + + clif_changeoption (&sd->bl); + pc_calcstatus (sd, 0); + clif_displaymessage (fd, msg_table[9]); // Options changed. + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_hide( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_hide (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - if (sd->status.option & OPTION_HIDE) { - sd->status.option &= ~OPTION_HIDE; - clif_displaymessage(fd, msg_table[10]); // Invisible: Off - } else { - sd->status.option |= OPTION_HIDE; - clif_displaymessage(fd, msg_table[11]); // Invisible: On - } - clif_changeoption(&sd->bl); + if (sd->status.option & OPTION_HIDE) + { + sd->status.option &= ~OPTION_HIDE; + clif_displaymessage (fd, msg_table[10]); // Invisible: Off + } + else + { + sd->status.option |= OPTION_HIDE; + clif_displaymessage (fd, msg_table[11]); // Invisible: On + } + clif_changeoption (&sd->bl); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_die( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_die (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - pc_damage(NULL, sd, sd->status.hp + 1); - clif_displaymessage(fd, msg_table[13]); // A pity! You've died. + pc_damage (NULL, sd, sd->status.hp + 1); + clif_displaymessage (fd, msg_table[13]); // A pity! You've died. - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_kill( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_kill (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - struct map_session_data *pl_sd; + char character[100]; + struct map_session_data *pl_sd; - memset(character, '\0', sizeof(character)); + memset (character, '\0', sizeof (character)); - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @kill <char name>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @kill <char name>)."); + return -1; + } - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kill only lower or same level - pc_damage(NULL, pl_sd, pl_sd->status.hp + 1); - clif_displaymessage(fd, msg_table[14]); // Character killed. - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can kill only lower or same level + pc_damage (NULL, pl_sd, pl_sd->status.hp + 1); + clif_displaymessage (fd, msg_table[14]); // Character killed. + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_alive( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_alive (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - sd->status.hp = sd->status.max_hp; - sd->status.sp = sd->status.max_sp; - pc_setstand(sd); - if (battle_config.pc_invincible_time > 0) - pc_setinvincibletimer(sd, battle_config.pc_invincible_time); - clif_updatestatus(sd, SP_HP); - clif_updatestatus(sd, SP_SP); - clif_resurrection(&sd->bl, 1); - clif_displaymessage(fd, msg_table[16]); // You've been revived! It's a miracle! + sd->status.hp = sd->status.max_hp; + sd->status.sp = sd->status.max_sp; + pc_setstand (sd); + if (battle_config.pc_invincible_time > 0) + pc_setinvincibletimer (sd, battle_config.pc_invincible_time); + clif_updatestatus (sd, SP_HP); + clif_updatestatus (sd, SP_SP); + clif_resurrection (&sd->bl, 1); + clif_displaymessage (fd, msg_table[16]); // You've been revived! It's a miracle! - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_kami( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_kami (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char output[200]; + char output[200]; - memset(output, '\0', sizeof(output)); + memset (output, '\0', sizeof (output)); - if (!message || !*message) { - clif_displaymessage(fd, "Please, enter a message (usage: @kami <message>)."); - return -1; - } + if (!message || !*message) + { + clif_displaymessage (fd, + "Please, enter a message (usage: @kami <message>)."); + return -1; + } - sscanf(message, "%199[^\n]", output); - intif_GMmessage(output, strlen(output) + 1, 0); + sscanf (message, "%199[^\n]", output); + intif_GMmessage (output, strlen (output) + 1, 0); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_heal( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_heal (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int hp = 0, sp = 0; // [Valaris] thanks to fov - - sscanf(message, "%d %d", &hp, &sp); + int hp = 0, sp = 0; // [Valaris] thanks to fov - if (hp == 0 && sp == 0) { - hp = sd->status.max_hp - sd->status.hp; - sp = sd->status.max_sp - sd->status.sp; - } else { - if (hp > 0 && (hp > sd->status.max_hp || hp > (sd->status.max_hp - sd->status.hp))) // fix positiv overflow - hp = sd->status.max_hp - sd->status.hp; - else if (hp < 0 && (hp < -sd->status.max_hp || hp < (1 - sd->status.hp))) // fix negativ overflow - hp = 1 - sd->status.hp; - if (sp > 0 && (sp > sd->status.max_sp || sp > (sd->status.max_sp - sd->status.sp))) // fix positiv overflow - sp = sd->status.max_sp - sd->status.sp; - else if (sp < 0 && (sp < -sd->status.max_sp || sp < (1 - sd->status.sp))) // fix negativ overflow - sp = 1 - sd->status.sp; - } + sscanf (message, "%d %d", &hp, &sp); - if (hp > 0) // display like heal - clif_heal(fd, SP_HP, hp); - else if (hp < 0) // display like damage - clif_damage(&sd->bl,&sd->bl, gettick(), 0, 0, -hp, 0 , 4, 0); - if (sp > 0) // no display when we lost SP - clif_heal(fd, SP_SP, sp); + if (hp == 0 && sp == 0) + { + hp = sd->status.max_hp - sd->status.hp; + sp = sd->status.max_sp - sd->status.sp; + } + else + { + if (hp > 0 && (hp > sd->status.max_hp || hp > (sd->status.max_hp - sd->status.hp))) // fix positiv overflow + hp = sd->status.max_hp - sd->status.hp; + else if (hp < 0 && (hp < -sd->status.max_hp || hp < (1 - sd->status.hp))) // fix negativ overflow + hp = 1 - sd->status.hp; + if (sp > 0 && (sp > sd->status.max_sp || sp > (sd->status.max_sp - sd->status.sp))) // fix positiv overflow + sp = sd->status.max_sp - sd->status.sp; + else if (sp < 0 && (sp < -sd->status.max_sp || sp < (1 - sd->status.sp))) // fix negativ overflow + sp = 1 - sd->status.sp; + } - if (hp != 0 || sp != 0) { - pc_heal(sd, hp, sp); - if (hp >= 0 && sp >= 0) - clif_displaymessage(fd, msg_table[17]); // HP, SP recovered. - else - clif_displaymessage(fd, msg_table[156]); // HP or/and SP modified. - } else { - clif_displaymessage(fd, msg_table[157]); // HP and SP are already with the good value. - return -1; - } + if (hp > 0) // display like heal + clif_heal (fd, SP_HP, hp); + else if (hp < 0) // display like damage + clif_damage (&sd->bl, &sd->bl, gettick (), 0, 0, -hp, 0, 4, 0); + if (sp > 0) // no display when we lost SP + clif_heal (fd, SP_SP, sp); + + if (hp != 0 || sp != 0) + { + pc_heal (sd, hp, sp); + if (hp >= 0 && sp >= 0) + clif_displaymessage (fd, msg_table[17]); // HP, SP recovered. + else + clif_displaymessage (fd, msg_table[156]); // HP or/and SP modified. + } + else + { + clif_displaymessage (fd, msg_table[157]); // HP and SP are already with the good value. + return -1; + } - return 0; + return 0; } /*========================================== * @item command (usage: @item <name/id_of_item> <quantity>) *------------------------------------------ */ -int atcommand_item( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_item (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char item_name[100]; - int number = 0, item_id, flag; - struct item item_tmp; - struct item_data *item_data; - int get_count, i; + char item_name[100]; + int number = 0, item_id, flag; + struct item item_tmp; + struct item_data *item_data; + int get_count, i; - memset(item_name, '\0', sizeof(item_name)); + memset (item_name, '\0', sizeof (item_name)); - if (!message || !*message || sscanf(message, "%99s %d", item_name, &number) < 1) { - clif_displaymessage(fd, "Please, enter an item name/id (usage: @item <item name or ID> [quantity])."); - return -1; - } - - if (number <= 0) - number = 1; - - item_id = 0; - if ((item_data = itemdb_searchname(item_name)) != NULL || - (item_data = itemdb_exists(atoi(item_name))) != NULL) - item_id = item_data->nameid; + if (!message || !*message + || sscanf (message, "%99s %d", item_name, &number) < 1) + { + clif_displaymessage (fd, + "Please, enter an item name/id (usage: @item <item name or ID> [quantity])."); + return -1; + } - if (item_id >= 500) { - get_count = number; - if (item_data->type == 4 || item_data->type == 5 || - item_data->type == 7 || item_data->type == 8) { - get_count = 1; - } - for (i = 0; i < number; i += get_count) { - memset(&item_tmp, 0, sizeof(item_tmp)); - item_tmp.nameid = item_id; - item_tmp.identify = 1; - if ((flag = pc_additem((struct map_session_data*)sd, &item_tmp, get_count))) - clif_additem((struct map_session_data*)sd, 0, 0, flag); - } - clif_displaymessage(fd, msg_table[18]); // Item created. - } else { - clif_displaymessage(fd, msg_table[19]); // Invalid item ID or name. - return -1; - } + if (number <= 0) + number = 1; + + item_id = 0; + if ((item_data = itemdb_searchname (item_name)) != NULL || + (item_data = itemdb_exists (atoi (item_name))) != NULL) + item_id = item_data->nameid; + + if (item_id >= 500) + { + get_count = number; + if (item_data->type == 4 || item_data->type == 5 || + item_data->type == 7 || item_data->type == 8) + { + get_count = 1; + } + for (i = 0; i < number; i += get_count) + { + memset (&item_tmp, 0, sizeof (item_tmp)); + item_tmp.nameid = item_id; + item_tmp.identify = 1; + if ((flag = + pc_additem ((struct map_session_data *) sd, &item_tmp, + get_count))) + clif_additem ((struct map_session_data *) sd, 0, 0, flag); + } + clif_displaymessage (fd, msg_table[18]); // Item created. + } + else + { + clif_displaymessage (fd, msg_table[19]); // Invalid item ID or name. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_itemreset( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_itemreset (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int i; + int i; - for (i = 0; i < MAX_INVENTORY; i++) { - if (sd->status.inventory[i].amount && sd->status.inventory[i].equip == 0) - pc_delitem(sd, i, sd->status.inventory[i].amount, 0); - } - clif_displaymessage(fd, msg_table[20]); // All of your items have been removed. + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].amount + && sd->status.inventory[i].equip == 0) + pc_delitem (sd, i, sd->status.inventory[i].amount, 0); + } + clif_displaymessage (fd, msg_table[20]); // All of your items have been removed. - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_itemcheck( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_itemcheck (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - pc_checkitem(sd); + pc_checkitem (sd); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_baselevelup( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - int level, i; - - if (!message || !*message || (level = atoi(message)) == 0) { - clif_displaymessage(fd, "Please, enter a level adjustement (usage: @blvl <number of levels>)."); - return -1; - } - - if (level > 0) { - if (sd->status.base_level == battle_config.maximum_level) { // check for max level by Valaris - clif_displaymessage(fd, msg_table[47]); // Base level can't go any higher. - return -1; - } // End Addition - if (level > battle_config.maximum_level || level > (battle_config.maximum_level - sd->status.base_level)) // fix positiv overflow - level = battle_config.maximum_level - sd->status.base_level; - for (i = 1; i <= level; i++) - sd->status.status_point += (sd->status.base_level + i + 14) / 4; - sd->status.base_level += level; - clif_updatestatus(sd, SP_BASELEVEL); - clif_updatestatus(sd, SP_NEXTBASEEXP); - clif_updatestatus(sd, SP_STATUSPOINT); - pc_calcstatus(sd, 0); - pc_heal(sd, sd->status.max_hp, sd->status.max_sp); - clif_misceffect(&sd->bl, 0); - clif_displaymessage(fd, msg_table[21]); // Base level raised. - } else { - if (sd->status.base_level == 1) { - clif_displaymessage(fd, msg_table[158]); // Base level can't go any lower. - return -1; - } - if (level < -battle_config.maximum_level || level < (1 - sd->status.base_level)) // fix negativ overflow - level = 1 - sd->status.base_level; - if (sd->status.status_point > 0) { - for (i = 0; i > level; i--) - sd->status.status_point -= (sd->status.base_level + i + 14) / 4; - if (sd->status.status_point < 0) - sd->status.status_point = 0; - clif_updatestatus(sd, SP_STATUSPOINT); - } // to add: remove status points from stats - sd->status.base_level += level; - clif_updatestatus(sd, SP_BASELEVEL); - clif_updatestatus(sd, SP_NEXTBASEEXP); - pc_calcstatus(sd, 0); - clif_displaymessage(fd, msg_table[22]); // Base level lowered. - } - - return 0; +int atcommand_baselevelup (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + int level, i; + + if (!message || !*message || (level = atoi (message)) == 0) + { + clif_displaymessage (fd, + "Please, enter a level adjustement (usage: @blvl <number of levels>)."); + return -1; + } + + if (level > 0) + { + if (sd->status.base_level == battle_config.maximum_level) + { // check for max level by Valaris + clif_displaymessage (fd, msg_table[47]); // Base level can't go any higher. + return -1; + } // End Addition + if (level > battle_config.maximum_level || level > (battle_config.maximum_level - sd->status.base_level)) // fix positiv overflow + level = battle_config.maximum_level - sd->status.base_level; + for (i = 1; i <= level; i++) + sd->status.status_point += (sd->status.base_level + i + 14) / 4; + sd->status.base_level += level; + clif_updatestatus (sd, SP_BASELEVEL); + clif_updatestatus (sd, SP_NEXTBASEEXP); + clif_updatestatus (sd, SP_STATUSPOINT); + pc_calcstatus (sd, 0); + pc_heal (sd, sd->status.max_hp, sd->status.max_sp); + clif_misceffect (&sd->bl, 0); + clif_displaymessage (fd, msg_table[21]); // Base level raised. + } + else + { + if (sd->status.base_level == 1) + { + clif_displaymessage (fd, msg_table[158]); // Base level can't go any lower. + return -1; + } + if (level < -battle_config.maximum_level || level < (1 - sd->status.base_level)) // fix negativ overflow + level = 1 - sd->status.base_level; + if (sd->status.status_point > 0) + { + for (i = 0; i > level; i--) + sd->status.status_point -= + (sd->status.base_level + i + 14) / 4; + if (sd->status.status_point < 0) + sd->status.status_point = 0; + clif_updatestatus (sd, SP_STATUSPOINT); + } // to add: remove status points from stats + sd->status.base_level += level; + clif_updatestatus (sd, SP_BASELEVEL); + clif_updatestatus (sd, SP_NEXTBASEEXP); + pc_calcstatus (sd, 0); + clif_displaymessage (fd, msg_table[22]); // Base level lowered. + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_joblevelup( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - int up_level = 50, level; - - if (!message || !*message || (level = atoi(message)) == 0) { - clif_displaymessage(fd, "Please, enter a level adjustement (usage: @jlvl <number of levels>)."); - return -1; - } - - if (sd->status.class == 0 || sd->status.class == 4001) - up_level -= 40; - else if ((sd->status.class > 4007 && sd->status.class < 4024) || sd->status.class == 23) - up_level += 20; - - if (level > 0) { - if (sd->status.job_level == up_level) { - clif_displaymessage(fd, msg_table[23]); // Job level can't go any higher. - return -1; - } - if (level > up_level || level > (up_level - sd->status.job_level)) // fix positiv overflow - level = up_level - sd->status.job_level; - sd->status.job_level += level; - clif_updatestatus(sd, SP_JOBLEVEL); - clif_updatestatus(sd, SP_NEXTJOBEXP); - sd->status.skill_point += level; - clif_updatestatus(sd, SP_SKILLPOINT); - pc_calcstatus(sd, 0); - clif_misceffect(&sd->bl, 1); - clif_displaymessage(fd, msg_table[24]); // Job level raised. - } else { - if (sd->status.job_level == 1) { - clif_displaymessage(fd, msg_table[159]); // Job level can't go any lower. - return -1; - } - if (level < -up_level || level < (1 - sd->status.job_level)) // fix negativ overflow - level = 1 - sd->status.job_level; - sd->status.job_level += level; - clif_updatestatus(sd, SP_JOBLEVEL); - clif_updatestatus(sd, SP_NEXTJOBEXP); - if (sd->status.skill_point > 0) { - sd->status.skill_point += level; - if (sd->status.skill_point < 0) - sd->status.skill_point = 0; - clif_updatestatus(sd, SP_SKILLPOINT); - } // to add: remove status points from skills - pc_calcstatus(sd, 0); - clif_displaymessage(fd, msg_table[25]); // Job level lowered. - } - - return 0; +int atcommand_joblevelup (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + int up_level = 50, level; + + if (!message || !*message || (level = atoi (message)) == 0) + { + clif_displaymessage (fd, + "Please, enter a level adjustement (usage: @jlvl <number of levels>)."); + return -1; + } + + if (sd->status.class == 0 || sd->status.class == 4001) + up_level -= 40; + else if ((sd->status.class > 4007 && sd->status.class < 4024) + || sd->status.class == 23) + up_level += 20; + + if (level > 0) + { + if (sd->status.job_level == up_level) + { + clif_displaymessage (fd, msg_table[23]); // Job level can't go any higher. + return -1; + } + if (level > up_level || level > (up_level - sd->status.job_level)) // fix positiv overflow + level = up_level - sd->status.job_level; + sd->status.job_level += level; + clif_updatestatus (sd, SP_JOBLEVEL); + clif_updatestatus (sd, SP_NEXTJOBEXP); + sd->status.skill_point += level; + clif_updatestatus (sd, SP_SKILLPOINT); + pc_calcstatus (sd, 0); + clif_misceffect (&sd->bl, 1); + clif_displaymessage (fd, msg_table[24]); // Job level raised. + } + else + { + if (sd->status.job_level == 1) + { + clif_displaymessage (fd, msg_table[159]); // Job level can't go any lower. + return -1; + } + if (level < -up_level || level < (1 - sd->status.job_level)) // fix negativ overflow + level = 1 - sd->status.job_level; + sd->status.job_level += level; + clif_updatestatus (sd, SP_JOBLEVEL); + clif_updatestatus (sd, SP_NEXTJOBEXP); + if (sd->status.skill_point > 0) + { + sd->status.skill_point += level; + if (sd->status.skill_point < 0) + sd->status.skill_point = 0; + clif_updatestatus (sd, SP_SKILLPOINT); + } // to add: remove status points from skills + pc_calcstatus (sd, 0); + clif_displaymessage (fd, msg_table[25]); // Job level lowered. + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_help( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char buf[2048], w1[2048], w2[2048]; - int i, gm_level; - FILE* fp; - - memset(buf, '\0', sizeof(buf)); - - if ((fp = fopen_(help_txt, "r")) != NULL) { - clif_displaymessage(fd, msg_table[26]); // Help commands: - gm_level = pc_isGM(sd); - while(fgets(buf, sizeof(buf) - 1, fp) != NULL) { - if (buf[0] == '/' && buf[1] == '/') - continue; - for (i = 0; buf[i] != '\0'; i++) { - if (buf[i] == '\r' || buf[i] == '\n') { - buf[i] = '\0'; - break; - } - } - if (sscanf(buf, "%2047[^:]:%2047[^\n]", w1, w2) < 2) - clif_displaymessage(fd, buf); - else if (gm_level >= atoi(w1)) - clif_displaymessage(fd, w2); - } - fclose_(fp); - } else { - clif_displaymessage(fd, msg_table[27]); // File help.txt not found. - return -1; - } +int atcommand_help (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char buf[2048], w1[2048], w2[2048]; + int i, gm_level; + FILE *fp; + + memset (buf, '\0', sizeof (buf)); + + if ((fp = fopen_ (help_txt, "r")) != NULL) + { + clif_displaymessage (fd, msg_table[26]); // Help commands: + gm_level = pc_isGM (sd); + while (fgets (buf, sizeof (buf) - 1, fp) != NULL) + { + if (buf[0] == '/' && buf[1] == '/') + continue; + for (i = 0; buf[i] != '\0'; i++) + { + if (buf[i] == '\r' || buf[i] == '\n') + { + buf[i] = '\0'; + break; + } + } + if (sscanf (buf, "%2047[^:]:%2047[^\n]", w1, w2) < 2) + clif_displaymessage (fd, buf); + else if (gm_level >= atoi (w1)) + clif_displaymessage (fd, w2); + } + fclose_ (fp); + } + else + { + clif_displaymessage (fd, msg_table[27]); // File help.txt not found. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_gm( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_gm (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char password[100]; + char password[100]; - memset(password, '\0', sizeof(password)); + memset (password, '\0', sizeof (password)); - if (!message || !*message || sscanf(message, "%99[^\n]", password) < 1) { - clif_displaymessage(fd, "Please, enter a password (usage: @gm <password>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", password) < 1) + { + clif_displaymessage (fd, + "Please, enter a password (usage: @gm <password>)."); + return -1; + } - if (pc_isGM(sd)) { // a GM can not use this function. only a normal player (become gm is not for gm!) - clif_displaymessage(fd, msg_table[50]); // You already have some GM powers. - return -1; - } else - chrif_changegm(sd->status.account_id, password, strlen(password) + 1); + if (pc_isGM (sd)) + { // a GM can not use this function. only a normal player (become gm is not for gm!) + clif_displaymessage (fd, msg_table[50]); // You already have some GM powers. + return -1; + } + else + chrif_changegm (sd->status.account_id, password, + strlen (password) + 1); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_pvpoff( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_pvpoff (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd; - int i; + struct map_session_data *pl_sd; + int i; - if (battle_config.pk_mode) { //disable command if server is in PK mode [Valaris] - clif_displaymessage(fd, msg_table[52]); // This option cannot be used in PK Mode. - return -1; - } + if (battle_config.pk_mode) + { //disable command if server is in PK mode [Valaris] + clif_displaymessage (fd, msg_table[52]); // This option cannot be used in PK Mode. + return -1; + } - if (map[sd->bl.m].flag.pvp) { - map[sd->bl.m].flag.pvp = 0; - clif_send0199(sd->bl.m, 0); - for (i = 0; i < fd_max; i++) { //人数分ループ - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - if (sd->bl.m == pl_sd->bl.m) { - clif_pvpset(pl_sd, 0, 0, 2); - if (pl_sd->pvp_timer != -1) { - delete_timer(pl_sd->pvp_timer, pc_calc_pvprank_timer); - pl_sd->pvp_timer = -1; - } - } - } - } - clif_displaymessage(fd, msg_table[31]); // PvP: Off. - } else { - clif_displaymessage(fd, msg_table[160]); // PvP is already Off. - return -1; - } + if (map[sd->bl.m].flag.pvp) + { + map[sd->bl.m].flag.pvp = 0; + clif_send0199 (sd->bl.m, 0); + for (i = 0; i < fd_max; i++) + { //人数分ループ + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + if (sd->bl.m == pl_sd->bl.m) + { + clif_pvpset (pl_sd, 0, 0, 2); + if (pl_sd->pvp_timer != -1) + { + delete_timer (pl_sd->pvp_timer, + pc_calc_pvprank_timer); + pl_sd->pvp_timer = -1; + } + } + } + } + clif_displaymessage (fd, msg_table[31]); // PvP: Off. + } + else + { + clif_displaymessage (fd, msg_table[160]); // PvP is already Off. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_pvpon( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_pvpon (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd; - int i; + struct map_session_data *pl_sd; + int i; - if (battle_config.pk_mode) { //disable command if server is in PK mode [Valaris] - clif_displaymessage(fd, msg_table[52]); // This option cannot be used in PK Mode. - return -1; - } + if (battle_config.pk_mode) + { //disable command if server is in PK mode [Valaris] + clif_displaymessage (fd, msg_table[52]); // This option cannot be used in PK Mode. + return -1; + } - if (!map[sd->bl.m].flag.pvp && !map[sd->bl.m].flag.nopvp) { - map[sd->bl.m].flag.pvp = 1; - clif_send0199(sd->bl.m, 1); - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - if (sd->bl.m == pl_sd->bl.m && pl_sd->pvp_timer == -1) { - pl_sd->pvp_timer = add_timer(gettick() + 200, - pc_calc_pvprank_timer, pl_sd->bl.id, 0); - pl_sd->pvp_rank = 0; - pl_sd->pvp_lastusers = 0; - pl_sd->pvp_point = 5; - } - } - } - clif_displaymessage(fd, msg_table[32]); // PvP: On. - } else { - clif_displaymessage(fd, msg_table[161]); // PvP is already On. - return -1; - } + if (!map[sd->bl.m].flag.pvp && !map[sd->bl.m].flag.nopvp) + { + map[sd->bl.m].flag.pvp = 1; + clif_send0199 (sd->bl.m, 1); + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + if (sd->bl.m == pl_sd->bl.m && pl_sd->pvp_timer == -1) + { + pl_sd->pvp_timer = add_timer (gettick () + 200, + pc_calc_pvprank_timer, + pl_sd->bl.id, 0); + pl_sd->pvp_rank = 0; + pl_sd->pvp_lastusers = 0; + pl_sd->pvp_point = 5; + } + } + } + clif_displaymessage (fd, msg_table[32]); // PvP: On. + } + else + { + clif_displaymessage (fd, msg_table[161]); // PvP is already On. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_gvgoff( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_gvgoff (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - if (map[sd->bl.m].flag.gvg) { - map[sd->bl.m].flag.gvg = 0; - clif_send0199(sd->bl.m, 0); - clif_displaymessage(fd, msg_table[33]); // GvG: Off. - } else { - clif_displaymessage(fd, msg_table[162]); // GvG is already Off. - return -1; - } + if (map[sd->bl.m].flag.gvg) + { + map[sd->bl.m].flag.gvg = 0; + clif_send0199 (sd->bl.m, 0); + clif_displaymessage (fd, msg_table[33]); // GvG: Off. + } + else + { + clif_displaymessage (fd, msg_table[162]); // GvG is already Off. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_gvgon( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_gvgon (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - if (!map[sd->bl.m].flag.gvg) { - map[sd->bl.m].flag.gvg = 1; - clif_send0199(sd->bl.m, 3); - clif_displaymessage(fd, msg_table[34]); // GvG: On. - } else { - clif_displaymessage(fd, msg_table[163]); // GvG is already On. - return -1; - } + if (!map[sd->bl.m].flag.gvg) + { + map[sd->bl.m].flag.gvg = 1; + clif_send0199 (sd->bl.m, 3); + clif_displaymessage (fd, msg_table[34]); // GvG: On. + } + else + { + clif_displaymessage (fd, msg_table[163]); // GvG is already On. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_model( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_model (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int hair_style = 0, hair_color = 0, cloth_color = 0; - char output[200]; + int hair_style = 0, hair_color = 0, cloth_color = 0; + char output[200]; - memset(output, '\0', sizeof(output)); + memset (output, '\0', sizeof (output)); - if (!message || !*message || sscanf(message, "%d %d %d", &hair_style, &hair_color, &cloth_color) < 1) { - sprintf(output, "Please, enter at least a value (usage: @model <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d>).", - MIN_HAIR_STYLE, MAX_HAIR_STYLE, MIN_HAIR_COLOR, MAX_HAIR_COLOR, MIN_CLOTH_COLOR, MAX_CLOTH_COLOR); - clif_displaymessage(fd, output); - return -1; - } + if (!message || !*message + || sscanf (message, "%d %d %d", &hair_style, &hair_color, + &cloth_color) < 1) + { + sprintf (output, + "Please, enter at least a value (usage: @model <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d>).", + MIN_HAIR_STYLE, MAX_HAIR_STYLE, MIN_HAIR_COLOR, + MAX_HAIR_COLOR, MIN_CLOTH_COLOR, MAX_CLOTH_COLOR); + clif_displaymessage (fd, output); + return -1; + } - if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE && - hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR && - cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) { - //服の色変更 - if (cloth_color != 0 && sd->status.sex == 1 && (sd->status.class == 12 || sd->status.class == 17)) { - //服の色未実装職の判定 - clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class. - return -1; - } else { - pc_changelook(sd, LOOK_HAIR, hair_style); - pc_changelook(sd, LOOK_HAIR_COLOR, hair_color); - pc_changelook(sd, LOOK_CLOTHES_COLOR, cloth_color); - clif_displaymessage(fd, msg_table[36]); // Appearence changed. - } - } else { - clif_displaymessage(fd, msg_table[37]); // An invalid number was specified. - return -1; - } + if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE && + hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR && + cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) + { + //服の色変更 + if (cloth_color != 0 && sd->status.sex == 1 + && (sd->status.class == 12 || sd->status.class == 17)) + { + //服の色未実装職の判定 + clif_displaymessage (fd, msg_table[35]); // You can't use this command with this class. + return -1; + } + else + { + pc_changelook (sd, LOOK_HAIR, hair_style); + pc_changelook (sd, LOOK_HAIR_COLOR, hair_color); + pc_changelook (sd, LOOK_CLOTHES_COLOR, cloth_color); + clif_displaymessage (fd, msg_table[36]); // Appearence changed. + } + } + else + { + clif_displaymessage (fd, msg_table[37]); // An invalid number was specified. + return -1; + } - return 0; + return 0; } /*========================================== * @dye && @ccolor *------------------------------------------ */ -int atcommand_dye(const int fd, struct map_session_data* sd, const char* command, const char* message) +int atcommand_dye (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int cloth_color = 0; - char output[200]; + int cloth_color = 0; + char output[200]; - memset(output, '\0', sizeof(output)); + memset (output, '\0', sizeof (output)); - if (!message || !*message || sscanf(message, "%d", &cloth_color) < 1) { - sprintf(output, "Please, enter a clothes color (usage: @dye/@ccolor <clothes color: %d-%d>).", MIN_CLOTH_COLOR, MAX_CLOTH_COLOR); - clif_displaymessage(fd, output); - return -1; - } + if (!message || !*message || sscanf (message, "%d", &cloth_color) < 1) + { + sprintf (output, + "Please, enter a clothes color (usage: @dye/@ccolor <clothes color: %d-%d>).", + MIN_CLOTH_COLOR, MAX_CLOTH_COLOR); + clif_displaymessage (fd, output); + return -1; + } - if (cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) { - if (cloth_color != 0 && sd->status.sex == 1 && (sd->status.class == 12 || sd->status.class == 17)) { - clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class. - return -1; - } else { - pc_changelook(sd, LOOK_CLOTHES_COLOR, cloth_color); - clif_displaymessage(fd, msg_table[36]); // Appearence changed. - } - } else { - clif_displaymessage(fd, msg_table[37]); // An invalid number was specified. - return -1; - } + if (cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) + { + if (cloth_color != 0 && sd->status.sex == 1 + && (sd->status.class == 12 || sd->status.class == 17)) + { + clif_displaymessage (fd, msg_table[35]); // You can't use this command with this class. + return -1; + } + else + { + pc_changelook (sd, LOOK_CLOTHES_COLOR, cloth_color); + clif_displaymessage (fd, msg_table[36]); // Appearence changed. + } + } + else + { + clif_displaymessage (fd, msg_table[37]); // An invalid number was specified. + return -1; + } - return 0; + return 0; } /*========================================== @@ -2244,43 +2620,54 @@ int atcommand_dye(const int fd, struct map_session_data* sd, const char* command *------------------------------------------ */ int -atcommand_chardye(const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_chardye (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - return 0; + return 0; } /*========================================== * @hairstyle && @hstyle *------------------------------------------ */ -int atcommand_hair_style(const int fd, struct map_session_data* sd, const char* command, const char* message) +int atcommand_hair_style (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int hair_style = 0; - char output[200]; + int hair_style = 0; + char output[200]; - memset(output, '\0', sizeof(output)); + memset (output, '\0', sizeof (output)); - if (!message || !*message || sscanf(message, "%d", &hair_style) < 1) { - sprintf(output, "Please, enter a hair style (usage: @hairstyle/@hstyle <hair ID: %d-%d>).", MIN_HAIR_STYLE, MAX_HAIR_STYLE); - clif_displaymessage(fd, output); - return -1; - } + if (!message || !*message || sscanf (message, "%d", &hair_style) < 1) + { + sprintf (output, + "Please, enter a hair style (usage: @hairstyle/@hstyle <hair ID: %d-%d>).", + MIN_HAIR_STYLE, MAX_HAIR_STYLE); + clif_displaymessage (fd, output); + return -1; + } - if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE) { - if (hair_style != 0 && sd->status.sex == 1 && (sd->status.class == 12 || sd->status.class == 17)) { - clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class. - return -1; - } else { - pc_changelook(sd, LOOK_HAIR, hair_style); - clif_displaymessage(fd, msg_table[36]); // Appearence changed. - } - } else { - clif_displaymessage(fd, msg_table[37]); // An invalid number was specified. - return -1; - } + if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE) + { + if (hair_style != 0 && sd->status.sex == 1 + && (sd->status.class == 12 || sd->status.class == 17)) + { + clif_displaymessage (fd, msg_table[35]); // You can't use this command with this class. + return -1; + } + else + { + pc_changelook (sd, LOOK_HAIR, hair_style); + clif_displaymessage (fd, msg_table[36]); // Appearence changed. + } + } + else + { + clif_displaymessage (fd, msg_table[37]); // An invalid number was specified. + return -1; + } - return 0; + return 0; } /*========================================== @@ -2288,43 +2675,54 @@ int atcommand_hair_style(const int fd, struct map_session_data* sd, const char* *------------------------------------------ */ int -atcommand_charhairstyle(const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_charhairstyle (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - return 0; + return 0; } /*========================================== * @haircolor && @hcolor *------------------------------------------ */ -int atcommand_hair_color(const int fd, struct map_session_data* sd, const char* command, const char* message) +int atcommand_hair_color (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int hair_color = 0; - char output[200]; + int hair_color = 0; + char output[200]; - memset(output, '\0', sizeof(output)); + memset (output, '\0', sizeof (output)); - if (!message || !*message || sscanf(message, "%d", &hair_color) < 1) { - sprintf(output, "Please, enter a hair color (usage: @haircolor/@hcolor <hair color: %d-%d>).", MIN_HAIR_COLOR, MAX_HAIR_COLOR); - clif_displaymessage(fd, output); - return -1; - } + if (!message || !*message || sscanf (message, "%d", &hair_color) < 1) + { + sprintf (output, + "Please, enter a hair color (usage: @haircolor/@hcolor <hair color: %d-%d>).", + MIN_HAIR_COLOR, MAX_HAIR_COLOR); + clif_displaymessage (fd, output); + return -1; + } - if (hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR) { - if (hair_color != 0 && sd->status.sex == 1 && (sd->status.class == 12 || sd->status.class == 17)) { - clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class. - return -1; - } else { - pc_changelook(sd, LOOK_HAIR_COLOR, hair_color); - clif_displaymessage(fd, msg_table[36]); // Appearence changed. - } - } else { - clif_displaymessage(fd, msg_table[37]); // An invalid number was specified. - return -1; - } + if (hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR) + { + if (hair_color != 0 && sd->status.sex == 1 + && (sd->status.class == 12 || sd->status.class == 17)) + { + clif_displaymessage (fd, msg_table[35]); // You can't use this command with this class. + return -1; + } + else + { + pc_changelook (sd, LOOK_HAIR_COLOR, hair_color); + clif_displaymessage (fd, msg_table[36]); // Appearence changed. + } + } + else + { + clif_displaymessage (fd, msg_table[37]); // An invalid number was specified. + return -1; + } - return 0; + return 0; } /*========================================== @@ -2332,673 +2730,820 @@ int atcommand_hair_color(const int fd, struct map_session_data* sd, const char* *------------------------------------------ */ int -atcommand_charhaircolor(const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_charhaircolor (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - return 0; + return 0; } /*========================================== * @go [city_number/city_name]: improved by [yor] to add city names and help *------------------------------------------ */ -int atcommand_go( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - int i; - int town; - char map_name[100]; - char output[200]; - int m; - - struct { char map[16]; int x, y; } data[] = { - { "prontera.gat", 156, 191 }, // 0=Prontera - { "morocc.gat", 156, 93 }, // 1=Morroc - { "geffen.gat", 119, 59 }, // 2=Geffen - { "payon.gat", 162, 233 }, // 3=Payon - { "alberta.gat", 192, 147 }, // 4=Alberta - { "izlude.gat", 128, 114 }, // 5=Izlude - { "aldebaran.gat",140, 131 }, // 6=Al de Baran - { "xmas.gat", 147, 134 }, // 7=Lutie - { "comodo.gat", 209, 143 }, // 8=Comodo - { "yuno.gat", 157, 51 }, // 9=Yuno - { "amatsu.gat", 198, 84 }, // 10=Amatsu - { "gonryun.gat", 160, 120 }, // 11=Gon Ryun - { "umbala.gat", 89, 157 }, // 12=Umbala - { "niflheim.gat", 21, 153 }, // 13=Niflheim - { "louyang.gat", 217, 40 }, // 14=Lou Yang - { "new_1-1.gat", 53, 111 }, // 15=Start point - { "sec_pri.gat", 23, 61 }, // 16=Prison - }; - - memset(map_name, '\0', sizeof(map_name)); - memset(output, '\0', sizeof(output)); - - // get the number - town = atoi(message); - - // if no value, display all value - if (!message || !*message || sscanf(message, "%99s", map_name) < 1 || town < -3 || town >= (int)(sizeof(data) / sizeof(data[0]))) { - clif_displaymessage(fd, msg_table[38]); // Invalid location number or name. - clif_displaymessage(fd, msg_table[82]); // Please, use one of this number/name: - clif_displaymessage(fd, "-3=(Memo point 2) 4=Alberta 11=Gon Ryun"); - clif_displaymessage(fd, "-2=(Memo point 1) 5=Izlude 12=Umbala"); - clif_displaymessage(fd, "-1=(Memo point 0) 6=Al de Baran 13=Niflheim"); - clif_displaymessage(fd, " 0=Prontera 7=Lutie 14=Lou Yang"); - clif_displaymessage(fd, " 1=Morroc 8=Comodo 15=Start point"); - clif_displaymessage(fd, " 2=Geffen 9=Yuno 16=Prison"); - clif_displaymessage(fd, " 3=Payon 10=Amatsu"); - return -1; - } else { - // get possible name of the city and add .gat if not in the name - map_name[sizeof(map_name)-1] = '\0'; - for (i = 0; map_name[i]; i++) - map_name[i] = tolower(map_name[i]); - if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat) - strcat(map_name, ".gat"); - // try to see if it's a name, and not a number (try a lot of possibilities, write errors and abbreviations too) - if (strncmp(map_name, "prontera.gat", 3) == 0) { // 3 first characters - town = 0; - } else if (strncmp(map_name, "morocc.gat", 3) == 0) { // 3 first characters - town = 1; - } else if (strncmp(map_name, "geffen.gat", 3) == 0) { // 3 first characters - town = 2; - } else if (strncmp(map_name, "payon.gat", 3) == 0 || // 3 first characters - strncmp(map_name, "paion.gat", 3) == 0) { // writing error (3 first characters) - town = 3; - } else if (strncmp(map_name, "alberta.gat", 3) == 0) { // 3 first characters - town = 4; - } else if (strncmp(map_name, "izlude.gat", 3) == 0 || // 3 first characters - strncmp(map_name, "islude.gat", 3) == 0) { // writing error (3 first characters) - town = 5; - } else if (strncmp(map_name, "aldebaran.gat", 3) == 0 || // 3 first characters - strcmp(map_name, "al.gat") == 0) { // al (de baran) - town = 6; - } else if (strncmp(map_name, "lutie.gat", 3) == 0 || // name of the city, not name of the map (3 first characters) - strcmp(map_name, "christmas.gat") == 0 || // name of the symbol - strncmp(map_name, "xmas.gat", 3) == 0 || // 3 first characters - strncmp(map_name, "x-mas.gat", 3) == 0) { // writing error (3 first characters) - town = 7; - } else if (strncmp(map_name, "comodo.gat", 3) == 0) { // 3 first characters - town = 8; - } else if (strncmp(map_name, "yuno.gat", 3) == 0) { // 3 first characters - town = 9; - } else if (strncmp(map_name, "amatsu.gat", 3) == 0 || // 3 first characters - strncmp(map_name, "ammatsu.gat", 3) == 0) { // writing error (3 first characters) - town = 10; - } else if (strncmp(map_name, "gonryun.gat", 3) == 0) { // 3 first characters - town = 11; - } else if (strncmp(map_name, "umbala.gat", 3) == 0) { // 3 first characters - town = 12; - } else if (strncmp(map_name, "niflheim.gat", 3) == 0) { // 3 first characters - town = 13; - } else if (strncmp(map_name, "louyang.gat", 3) == 0) { // 3 first characters - town = 14; - } else if (strncmp(map_name, "new_1-1.gat", 3) == 0 || // 3 first characters (or "newbies") - strncmp(map_name, "startpoint.gat", 3) == 0 || // name of the position (3 first characters) - strncmp(map_name, "begining.gat", 3) == 0) { // name of the position (3 first characters) - town = 15; - } else if (strncmp(map_name, "sec_pri.gat", 3) == 0 || // 3 first characters - strncmp(map_name, "prison.gat", 3) == 0 || // name of the position (3 first characters) - strncmp(map_name, "jails.gat", 3) == 0) { // name of the position - town = 16; - } - - if (town >= -3 && town <= -1) { - if (sd->status.memo_point[-town-1].map[0]) { - m = map_mapname2mapid(sd->status.memo_point[-town-1].map); - if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to this memo map."); - return -1; - } - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); - return -1; - } - if (pc_setpos(sd, sd->status.memo_point[-town-1].map, sd->status.memo_point[-town-1].x, sd->status.memo_point[-town-1].y, 3) == 0) { - clif_displaymessage(fd, msg_table[0]); // Warped. - } else { - clif_displaymessage(fd, msg_table[1]); // Map not found. - return -1; - } - } else { - sprintf(output, msg_table[164], -town-1); // Your memo point #%d doesn't exist. - clif_displaymessage(fd, output); - return -1; - } - } else if (town >= 0 && town < (int)(sizeof(data) / sizeof(data[0]))) { - m = map_mapname2mapid(data[town].map); - if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to this destination map."); - return -1; - } - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); - return -1; - } - if (pc_setpos(sd, data[town].map, data[town].x, data[town].y, 3) == 0) { - clif_displaymessage(fd, msg_table[0]); // Warped. - } else { - clif_displaymessage(fd, msg_table[1]); // Map not found. - return -1; - } - } else { // if you arrive here, you have an error in town variable when reading of names - clif_displaymessage(fd, msg_table[38]); // Invalid location number or name. - return -1; - } - } - - return 0; +int atcommand_go (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + int i; + int town; + char map_name[100]; + char output[200]; + int m; + + struct + { + char map[16]; + int x, y; + } data[] = + { + { + "prontera.gat", 156, 191}, // 0=Prontera + { + "morocc.gat", 156, 93}, // 1=Morroc + { + "geffen.gat", 119, 59}, // 2=Geffen + { + "payon.gat", 162, 233}, // 3=Payon + { + "alberta.gat", 192, 147}, // 4=Alberta + { + "izlude.gat", 128, 114}, // 5=Izlude + { + "aldebaran.gat", 140, 131}, // 6=Al de Baran + { + "xmas.gat", 147, 134}, // 7=Lutie + { + "comodo.gat", 209, 143}, // 8=Comodo + { + "yuno.gat", 157, 51}, // 9=Yuno + { + "amatsu.gat", 198, 84}, // 10=Amatsu + { + "gonryun.gat", 160, 120}, // 11=Gon Ryun + { + "umbala.gat", 89, 157}, // 12=Umbala + { + "niflheim.gat", 21, 153}, // 13=Niflheim + { + "louyang.gat", 217, 40}, // 14=Lou Yang + { + "new_1-1.gat", 53, 111}, // 15=Start point + { + "sec_pri.gat", 23, 61}, // 16=Prison + }; + + memset (map_name, '\0', sizeof (map_name)); + memset (output, '\0', sizeof (output)); + + // get the number + town = atoi (message); + + // if no value, display all value + if (!message || !*message || sscanf (message, "%99s", map_name) < 1 + || town < -3 || town >= (int) (sizeof (data) / sizeof (data[0]))) + { + clif_displaymessage (fd, msg_table[38]); // Invalid location number or name. + clif_displaymessage (fd, msg_table[82]); // Please, use one of this number/name: + clif_displaymessage (fd, + "-3=(Memo point 2) 4=Alberta 11=Gon Ryun"); + clif_displaymessage (fd, + "-2=(Memo point 1) 5=Izlude 12=Umbala"); + clif_displaymessage (fd, + "-1=(Memo point 0) 6=Al de Baran 13=Niflheim"); + clif_displaymessage (fd, + " 0=Prontera 7=Lutie 14=Lou Yang"); + clif_displaymessage (fd, + " 1=Morroc 8=Comodo 15=Start point"); + clif_displaymessage (fd, + " 2=Geffen 9=Yuno 16=Prison"); + clif_displaymessage (fd, " 3=Payon 10=Amatsu"); + return -1; + } + else + { + // get possible name of the city and add .gat if not in the name + map_name[sizeof (map_name) - 1] = '\0'; + for (i = 0; map_name[i]; i++) + map_name[i] = tolower (map_name[i]); + if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat) + strcat (map_name, ".gat"); + // try to see if it's a name, and not a number (try a lot of possibilities, write errors and abbreviations too) + if (strncmp (map_name, "prontera.gat", 3) == 0) + { // 3 first characters + town = 0; + } + else if (strncmp (map_name, "morocc.gat", 3) == 0) + { // 3 first characters + town = 1; + } + else if (strncmp (map_name, "geffen.gat", 3) == 0) + { // 3 first characters + town = 2; + } + else if (strncmp (map_name, "payon.gat", 3) == 0 || // 3 first characters + strncmp (map_name, "paion.gat", 3) == 0) + { // writing error (3 first characters) + town = 3; + } + else if (strncmp (map_name, "alberta.gat", 3) == 0) + { // 3 first characters + town = 4; + } + else if (strncmp (map_name, "izlude.gat", 3) == 0 || // 3 first characters + strncmp (map_name, "islude.gat", 3) == 0) + { // writing error (3 first characters) + town = 5; + } + else if (strncmp (map_name, "aldebaran.gat", 3) == 0 || // 3 first characters + strcmp (map_name, "al.gat") == 0) + { // al (de baran) + town = 6; + } + else if (strncmp (map_name, "lutie.gat", 3) == 0 || // name of the city, not name of the map (3 first characters) + strcmp (map_name, "christmas.gat") == 0 || // name of the symbol + strncmp (map_name, "xmas.gat", 3) == 0 || // 3 first characters + strncmp (map_name, "x-mas.gat", 3) == 0) + { // writing error (3 first characters) + town = 7; + } + else if (strncmp (map_name, "comodo.gat", 3) == 0) + { // 3 first characters + town = 8; + } + else if (strncmp (map_name, "yuno.gat", 3) == 0) + { // 3 first characters + town = 9; + } + else if (strncmp (map_name, "amatsu.gat", 3) == 0 || // 3 first characters + strncmp (map_name, "ammatsu.gat", 3) == 0) + { // writing error (3 first characters) + town = 10; + } + else if (strncmp (map_name, "gonryun.gat", 3) == 0) + { // 3 first characters + town = 11; + } + else if (strncmp (map_name, "umbala.gat", 3) == 0) + { // 3 first characters + town = 12; + } + else if (strncmp (map_name, "niflheim.gat", 3) == 0) + { // 3 first characters + town = 13; + } + else if (strncmp (map_name, "louyang.gat", 3) == 0) + { // 3 first characters + town = 14; + } + else if (strncmp (map_name, "new_1-1.gat", 3) == 0 || // 3 first characters (or "newbies") + strncmp (map_name, "startpoint.gat", 3) == 0 || // name of the position (3 first characters) + strncmp (map_name, "begining.gat", 3) == 0) + { // name of the position (3 first characters) + town = 15; + } + else if (strncmp (map_name, "sec_pri.gat", 3) == 0 || // 3 first characters + strncmp (map_name, "prison.gat", 3) == 0 || // name of the position (3 first characters) + strncmp (map_name, "jails.gat", 3) == 0) + { // name of the position + town = 16; + } + + if (town >= -3 && town <= -1) + { + if (sd->status.memo_point[-town - 1].map[0]) + { + m = map_mapname2mapid (sd->status.memo_point[-town - 1].map); + if (m >= 0 && map[m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp you to this memo map."); + return -1; + } + if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp you from your actual map."); + return -1; + } + if (pc_setpos + (sd, sd->status.memo_point[-town - 1].map, + sd->status.memo_point[-town - 1].x, + sd->status.memo_point[-town - 1].y, 3) == 0) + { + clif_displaymessage (fd, msg_table[0]); // Warped. + } + else + { + clif_displaymessage (fd, msg_table[1]); // Map not found. + return -1; + } + } + else + { + sprintf (output, msg_table[164], -town - 1); // Your memo point #%d doesn't exist. + clif_displaymessage (fd, output); + return -1; + } + } + else if (town >= 0 && town < (int) (sizeof (data) / sizeof (data[0]))) + { + m = map_mapname2mapid (data[town].map); + if (m >= 0 && map[m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp you to this destination map."); + return -1; + } + if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp you from your actual map."); + return -1; + } + if (pc_setpos (sd, data[town].map, data[town].x, data[town].y, 3) + == 0) + { + clif_displaymessage (fd, msg_table[0]); // Warped. + } + else + { + clif_displaymessage (fd, msg_table[1]); // Map not found. + return -1; + } + } + else + { // if you arrive here, you have an error in town variable when reading of names + clif_displaymessage (fd, msg_table[38]); // Invalid location number or name. + return -1; + } + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_spawn(const int fd, struct map_session_data* sd, const char* command, const char* message) { - char monster[100]; - char output[200]; - int mob_id; - int number = 0; - int x = 0, y = 0; - int count; - int i, j, k; - int mx, my, range; - - memset(monster, '\0', sizeof(monster)); - memset(output, '\0', sizeof(output)); - - if (!message || !*message || sscanf(message, "%99s %d %d %d", monster, &number, &x, &y) < 1) { - clif_displaymessage(fd, msg_table[143]); // Give a monster name/id please. - return -1; - } - - // If monster identifier/name argument is a name - if ((mob_id = mobdb_searchname(monster)) == 0) // check name first (to avoid possible name begining by a number) - mob_id = mobdb_checkid(atoi(monster)); - - if (mob_id == 0) { - clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name. - return -1; - } - - if (mob_id == 1288) { - clif_displaymessage(fd, msg_table[83]); // Cannot spawn emperium. - return -1; - } - - if (number <= 0) - number = 1; - - // If value of atcommand_spawn_quantity_limit directive is greater than or equal to 1 and quantity of monsters is greater than value of the directive - if (battle_config.atc_spawn_quantity_limit >= 1 && number > battle_config.atc_spawn_quantity_limit) - number = battle_config.atc_spawn_quantity_limit; - - if (battle_config.etc_log) - printf("%s monster='%s' id=%d count=%d (%d,%d)\n", command, monster, mob_id, number, x, y); - - count = 0; - range = sqrt(number) / 2; - range = range * 2 + 5; // calculation of an odd number (+ 4 area around) - for (i = 0; i < number; i++) { - j = 0; - k = 0; - while(j++ < 8 && k == 0) { // try 8 times to spawn the monster (needed for close area) - if (x <= 0) - mx = sd->bl.x + (MRAND(range) - (range / 2)); - else - mx = x; - if (y <= 0) - my = sd->bl.y + (MRAND(range) - (range / 2)); - else - my = y; - k = mob_once_spawn((struct map_session_data*)sd, "this", mx, my, "", mob_id, 1, ""); - } - count += (k != 0) ? 1 : 0; - } - - if (count != 0) - if (number == count) - clif_displaymessage(fd, msg_table[39]); // All monster summoned! - else { - sprintf(output, msg_table[240], count); // %d monster(s) summoned! - clif_displaymessage(fd, output); - } - else { - clif_displaymessage(fd, msg_table[40]); // Invalid monster ID or name. - return -1; - } - - return 0; +int atcommand_spawn (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char monster[100]; + char output[200]; + int mob_id; + int number = 0; + int x = 0, y = 0; + int count; + int i, j, k; + int mx, my, range; + + memset (monster, '\0', sizeof (monster)); + memset (output, '\0', sizeof (output)); + + if (!message || !*message + || sscanf (message, "%99s %d %d %d", monster, &number, &x, &y) < 1) + { + clif_displaymessage (fd, msg_table[143]); // Give a monster name/id please. + return -1; + } + + // If monster identifier/name argument is a name + if ((mob_id = mobdb_searchname (monster)) == 0) // check name first (to avoid possible name begining by a number) + mob_id = mobdb_checkid (atoi (monster)); + + if (mob_id == 0) + { + clif_displaymessage (fd, msg_table[40]); // Invalid monster ID or name. + return -1; + } + + if (mob_id == 1288) + { + clif_displaymessage (fd, msg_table[83]); // Cannot spawn emperium. + return -1; + } + + if (number <= 0) + number = 1; + + // If value of atcommand_spawn_quantity_limit directive is greater than or equal to 1 and quantity of monsters is greater than value of the directive + if (battle_config.atc_spawn_quantity_limit >= 1 + && number > battle_config.atc_spawn_quantity_limit) + number = battle_config.atc_spawn_quantity_limit; + + if (battle_config.etc_log) + printf ("%s monster='%s' id=%d count=%d (%d,%d)\n", command, monster, + mob_id, number, x, y); + + count = 0; + range = sqrt (number) / 2; + range = range * 2 + 5; // calculation of an odd number (+ 4 area around) + for (i = 0; i < number; i++) + { + j = 0; + k = 0; + while (j++ < 8 && k == 0) + { // try 8 times to spawn the monster (needed for close area) + if (x <= 0) + mx = sd->bl.x + (MRAND (range) - (range / 2)); + else + mx = x; + if (y <= 0) + my = sd->bl.y + (MRAND (range) - (range / 2)); + else + my = y; + k = mob_once_spawn ((struct map_session_data *) sd, "this", mx, + my, "", mob_id, 1, ""); + } + count += (k != 0) ? 1 : 0; + } + + if (count != 0) + if (number == count) + clif_displaymessage (fd, msg_table[39]); // All monster summoned! + else + { + sprintf (output, msg_table[240], count); // %d monster(s) summoned! + clif_displaymessage (fd, output); + } + else + { + clif_displaymessage (fd, msg_table[40]); // Invalid monster ID or name. + return -1; + } + + return 0; } /*========================================== * *------------------------------------------ */ -void atcommand_killmonster_sub( - const int fd, struct map_session_data* sd, const char* message, - const int drop) +void atcommand_killmonster_sub (const int fd, struct map_session_data *sd, + const char *message, const int drop) { - int map_id; - char map_name[100]; + int map_id; + char map_name[100]; - memset(map_name, '\0', sizeof(map_name)); + memset (map_name, '\0', sizeof (map_name)); - if (!message || !*message || sscanf(message, "%99s", map_name) < 1) - map_id = sd->bl.m; - else { - if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat) - strcat(map_name, ".gat"); - if ((map_id = map_mapname2mapid(map_name)) < 0) - map_id = sd->bl.m; - } + if (!message || !*message || sscanf (message, "%99s", map_name) < 1) + map_id = sd->bl.m; + else + { + if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat) + strcat (map_name, ".gat"); + if ((map_id = map_mapname2mapid (map_name)) < 0) + map_id = sd->bl.m; + } - map_foreachinarea(atkillmonster_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, BL_MOB, drop); + map_foreachinarea (atkillmonster_sub, map_id, 0, 0, map[map_id].xs, + map[map_id].ys, BL_MOB, drop); - clif_displaymessage(fd, msg_table[165]); // All monsters killed! + clif_displaymessage (fd, msg_table[165]); // All monsters killed! - return; + return; } /*========================================== * *------------------------------------------ */ -int atcommand_killmonster( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_killmonster (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - atcommand_killmonster_sub(fd, sd, message, 1); + atcommand_killmonster_sub (fd, sd, message, 1); - return 0; + return 0; } - /*========================================== * *------------------------------------------ */ -static int atlist_nearby_sub(struct block_list *bl, va_list ap) { - char buf[32]; - int fd = va_arg(ap, int); - nullpo_retr(0, bl); +static int atlist_nearby_sub (struct block_list *bl, va_list ap) +{ + char buf[32]; + int fd = va_arg (ap, int); + nullpo_retr (0, bl); - sprintf (buf, " - \"%s\"", ((struct map_session_data *)bl)->status.name); - clif_displaymessage(fd, buf); + sprintf (buf, " - \"%s\"", ((struct map_session_data *) bl)->status.name); + clif_displaymessage (fd, buf); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_list_nearby( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_list_nearby (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - clif_displaymessage(fd, "Nearby players:"); - map_foreachinarea(atlist_nearby_sub, sd->bl.m, sd->bl.x-1, sd->bl.y-1, sd->bl.x+1, sd->bl.x+1, BL_PC, fd); + clif_displaymessage (fd, "Nearby players:"); + map_foreachinarea (atlist_nearby_sub, sd->bl.m, sd->bl.x - 1, + sd->bl.y - 1, sd->bl.x + 1, sd->bl.x + 1, BL_PC, fd); - return 0; + return 0; } - /*========================================== * *------------------------------------------ */ -int atcommand_killmonster2( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_killmonster2 (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - atcommand_killmonster_sub(fd, sd, message, 0); + atcommand_killmonster_sub (fd, sd, message, 0); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_produce( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char item_name[100]; - int item_id, attribute = 0, star = 0; - int flag = 0; - struct item_data *item_data; - struct item tmp_item; - char output[200]; - - memset(output, '\0', sizeof(output)); - memset(item_name, '\0', sizeof(item_name)); - - if (!message || !*message || sscanf(message, "%99s %d %d", item_name, &attribute, &star) < 1) { - clif_displaymessage(fd, "Please, enter at least an item name/id (usage: @produce <equip name or equip ID> <element> <# of very's>)."); - return -1; - } - - item_id = 0; - if ((item_data = itemdb_searchname(item_name)) != NULL || - (item_data = itemdb_exists(atoi(item_name))) != NULL) - item_id = item_data->nameid; - - if (itemdb_exists(item_id) && - (item_id <= 500 || item_id > 1099) && - (item_id < 4001 || item_id > 4148) && - (item_id < 7001 || item_id > 10019) && - itemdb_isequip(item_id)) { - if (attribute < MIN_ATTRIBUTE || attribute > MAX_ATTRIBUTE) - attribute = ATTRIBUTE_NORMAL; - if (star < MIN_STAR || star > MAX_STAR) - star = 0; - memset(&tmp_item, 0, sizeof tmp_item); - tmp_item.nameid = item_id; - tmp_item.amount = 1; - tmp_item.identify = 1; - tmp_item.card[0] = 0x00ff; - tmp_item.card[1] = ((star * 5) << 8) + attribute; - *((unsigned long *)(&tmp_item.card[2])) = sd->char_id; - clif_produceeffect(sd, 0, item_id); // 製造エフェクトパケット - clif_misceffect(&sd->bl, 3); // 他人にも成功を通知 - if ((flag = pc_additem(sd, &tmp_item, 1))) - clif_additem(sd, 0, 0, flag); - } else { - if (battle_config.error_log) - printf("@produce NOT WEAPON [%d]\n", item_id); - if (item_id != 0 && itemdb_exists(item_id)) - sprintf(output, msg_table[169], item_id, item_data->name); // This item (%d: '%s') is not an equipment. - else - sprintf(output, msg_table[170]); // This item is not an equipment. - clif_displaymessage(fd, output); - return -1; - } - - return 0; +int atcommand_produce (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char item_name[100]; + int item_id, attribute = 0, star = 0; + int flag = 0; + struct item_data *item_data; + struct item tmp_item; + char output[200]; + + memset (output, '\0', sizeof (output)); + memset (item_name, '\0', sizeof (item_name)); + + if (!message || !*message + || sscanf (message, "%99s %d %d", item_name, &attribute, &star) < 1) + { + clif_displaymessage (fd, + "Please, enter at least an item name/id (usage: @produce <equip name or equip ID> <element> <# of very's>)."); + return -1; + } + + item_id = 0; + if ((item_data = itemdb_searchname (item_name)) != NULL || + (item_data = itemdb_exists (atoi (item_name))) != NULL) + item_id = item_data->nameid; + + if (itemdb_exists (item_id) && + (item_id <= 500 || item_id > 1099) && + (item_id < 4001 || item_id > 4148) && + (item_id < 7001 || item_id > 10019) && itemdb_isequip (item_id)) + { + if (attribute < MIN_ATTRIBUTE || attribute > MAX_ATTRIBUTE) + attribute = ATTRIBUTE_NORMAL; + if (star < MIN_STAR || star > MAX_STAR) + star = 0; + memset (&tmp_item, 0, sizeof tmp_item); + tmp_item.nameid = item_id; + tmp_item.amount = 1; + tmp_item.identify = 1; + tmp_item.card[0] = 0x00ff; + tmp_item.card[1] = ((star * 5) << 8) + attribute; + *((unsigned long *) (&tmp_item.card[2])) = sd->char_id; + clif_produceeffect (sd, 0, item_id); // 製造エフェクトパケット + clif_misceffect (&sd->bl, 3); // 他人にも成功を通知 + if ((flag = pc_additem (sd, &tmp_item, 1))) + clif_additem (sd, 0, 0, flag); + } + else + { + if (battle_config.error_log) + printf ("@produce NOT WEAPON [%d]\n", item_id); + if (item_id != 0 && itemdb_exists (item_id)) + sprintf (output, msg_table[169], item_id, item_data->name); // This item (%d: '%s') is not an equipment. + else + sprintf (output, msg_table[170]); // This item is not an equipment. + clif_displaymessage (fd, output); + return -1; + } + + return 0; } /*========================================== * Sub-function to display actual memo points *------------------------------------------ */ -void atcommand_memo_sub(struct map_session_data* sd) { - int i; - char output[200]; +void atcommand_memo_sub (struct map_session_data *sd) +{ + int i; + char output[200]; - memset(output, '\0', sizeof(output)); + memset (output, '\0', sizeof (output)); - clif_displaymessage(sd->fd, "Your actual memo positions are (except respawn point):"); - for (i = MIN_PORTAL_MEMO; i <= MAX_PORTAL_MEMO; i++) { - if (sd->status.memo_point[i].map[0]) - sprintf(output, "%d - %s (%d,%d)", i, sd->status.memo_point[i].map, sd->status.memo_point[i].x, sd->status.memo_point[i].y); - else - sprintf(output, msg_table[171], i); // %d - void - clif_displaymessage(sd->fd, output); - } + clif_displaymessage (sd->fd, + "Your actual memo positions are (except respawn point):"); + for (i = MIN_PORTAL_MEMO; i <= MAX_PORTAL_MEMO; i++) + { + if (sd->status.memo_point[i].map[0]) + sprintf (output, "%d - %s (%d,%d)", i, + sd->status.memo_point[i].map, sd->status.memo_point[i].x, + sd->status.memo_point[i].y); + else + sprintf (output, msg_table[171], i); // %d - void + clif_displaymessage (sd->fd, output); + } - return; + return; } /*========================================== * *------------------------------------------ */ -int atcommand_memo( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - int position = 0; - char output[200]; - - memset(output, '\0', sizeof(output)); - - if (!message || !*message || sscanf(message, "%d", &position) < 1) - atcommand_memo_sub(sd); - else { - if (position >= MIN_PORTAL_MEMO && position <= MAX_PORTAL_MEMO) { - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to memo this map."); - return -1; - } - if (sd->status.memo_point[position].map[0]) { - sprintf(output, msg_table[172], position, sd->status.memo_point[position].map, sd->status.memo_point[position].x, sd->status.memo_point[position].y); // You replace previous memo position %d - %s (%d,%d). - clif_displaymessage(fd, output); - } - memcpy(sd->status.memo_point[position].map, map[sd->bl.m].name, 24); - sd->status.memo_point[position].x = sd->bl.x; - sd->status.memo_point[position].y = sd->bl.y; - clif_skill_memo(sd, 0); - if (pc_checkskill(sd, AL_WARP) <= (position + 1)) - clif_displaymessage(fd, msg_table[173]); // Note: you don't have the 'Warp' skill level to use it. - atcommand_memo_sub(sd); - } else { - sprintf(output, "Please, enter a valid position (usage: @memo <memo_position:%d-%d>).", MIN_PORTAL_MEMO, MAX_PORTAL_MEMO); - clif_displaymessage(fd, output); - atcommand_memo_sub(sd); - return -1; - } - } - - return 0; +int atcommand_memo (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + int position = 0; + char output[200]; + + memset (output, '\0', sizeof (output)); + + if (!message || !*message || sscanf (message, "%d", &position) < 1) + atcommand_memo_sub (sd); + else + { + if (position >= MIN_PORTAL_MEMO && position <= MAX_PORTAL_MEMO) + { + if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to memo this map."); + return -1; + } + if (sd->status.memo_point[position].map[0]) + { + sprintf (output, msg_table[172], position, sd->status.memo_point[position].map, sd->status.memo_point[position].x, sd->status.memo_point[position].y); // You replace previous memo position %d - %s (%d,%d). + clif_displaymessage (fd, output); + } + memcpy (sd->status.memo_point[position].map, map[sd->bl.m].name, + 24); + sd->status.memo_point[position].x = sd->bl.x; + sd->status.memo_point[position].y = sd->bl.y; + clif_skill_memo (sd, 0); + if (pc_checkskill (sd, AL_WARP) <= (position + 1)) + clif_displaymessage (fd, msg_table[173]); // Note: you don't have the 'Warp' skill level to use it. + atcommand_memo_sub (sd); + } + else + { + sprintf (output, + "Please, enter a valid position (usage: @memo <memo_position:%d-%d>).", + MIN_PORTAL_MEMO, MAX_PORTAL_MEMO); + clif_displaymessage (fd, output); + atcommand_memo_sub (sd); + return -1; + } + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_gat( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_gat (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char output[200]; - int y; + char output[200]; + int y; - memset(output, '\0', sizeof(output)); + memset (output, '\0', sizeof (output)); - for (y = 2; y >= -2; y--) { - sprintf(output, "%s (x= %d, y= %d) %02X %02X %02X %02X %02X", - map[sd->bl.m].name, sd->bl.x - 2, sd->bl.y + y, - map_getcell(sd->bl.m, sd->bl.x - 2, sd->bl.y + y), - map_getcell(sd->bl.m, sd->bl.x - 1, sd->bl.y + y), - map_getcell(sd->bl.m, sd->bl.x, sd->bl.y + y), - map_getcell(sd->bl.m, sd->bl.x + 1, sd->bl.y + y), - map_getcell(sd->bl.m, sd->bl.x + 2, sd->bl.y + y)); - clif_displaymessage(fd, output); - } + for (y = 2; y >= -2; y--) + { + sprintf (output, "%s (x= %d, y= %d) %02X %02X %02X %02X %02X", + map[sd->bl.m].name, sd->bl.x - 2, sd->bl.y + y, + map_getcell (sd->bl.m, sd->bl.x - 2, sd->bl.y + y), + map_getcell (sd->bl.m, sd->bl.x - 1, sd->bl.y + y), + map_getcell (sd->bl.m, sd->bl.x, sd->bl.y + y), + map_getcell (sd->bl.m, sd->bl.x + 1, sd->bl.y + y), + map_getcell (sd->bl.m, sd->bl.x + 2, sd->bl.y + y)); + clif_displaymessage (fd, output); + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_packet( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_packet (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int x = 0, y = 0; + int x = 0, y = 0; - if (!message || !*message || sscanf(message, "%d %d", &x, &y) < 2) { - clif_displaymessage(fd, "Please, enter a status type/flag (usage: @packet <status type> <flag>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%d %d", &x, &y) < 2) + { + clif_displaymessage (fd, + "Please, enter a status type/flag (usage: @packet <status type> <flag>)."); + return -1; + } - clif_status_change(&sd->bl, x, y); + clif_status_change (&sd->bl, x, y); - return 0; + return 0; } /*========================================== * @stpoint (Rewritten by [Yor]) *------------------------------------------ */ -int atcommand_statuspoint( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_statuspoint (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int point, new_status_point; - - if (!message || !*message || (point = atoi(message)) == 0) { - clif_displaymessage(fd, "Please, enter a number (usage: @stpoint <number of points>)."); - return -1; - } + int point, new_status_point; - new_status_point = (int)sd->status.status_point + point; - if (point > 0 && (point > 0x7FFF || new_status_point > 0x7FFF)) // fix positiv overflow - new_status_point = 0x7FFF; - else if (point < 0 && (point < -0x7FFF || new_status_point < 0)) // fix negativ overflow - new_status_point = 0; + if (!message || !*message || (point = atoi (message)) == 0) + { + clif_displaymessage (fd, + "Please, enter a number (usage: @stpoint <number of points>)."); + return -1; + } - if (new_status_point != (int)sd->status.status_point) { - sd->status.status_point = (short)new_status_point; - clif_updatestatus(sd, SP_STATUSPOINT); - clif_displaymessage(fd, msg_table[174]); // Number of status points changed! - } else { - if (point < 0) - clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value. - else - clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value. - return -1; - } + new_status_point = (int) sd->status.status_point + point; + if (point > 0 && (point > 0x7FFF || new_status_point > 0x7FFF)) // fix positiv overflow + new_status_point = 0x7FFF; + else if (point < 0 && (point < -0x7FFF || new_status_point < 0)) // fix negativ overflow + new_status_point = 0; + + if (new_status_point != (int) sd->status.status_point) + { + sd->status.status_point = (short) new_status_point; + clif_updatestatus (sd, SP_STATUSPOINT); + clif_displaymessage (fd, msg_table[174]); // Number of status points changed! + } + else + { + if (point < 0) + clif_displaymessage (fd, msg_table[41]); // Impossible to decrease the number/value. + else + clif_displaymessage (fd, msg_table[149]); // Impossible to increase the number/value. + return -1; + } - return 0; + return 0; } /*========================================== * @skpoint (Rewritten by [Yor]) *------------------------------------------ */ -int atcommand_skillpoint( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_skillpoint (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int point, new_skill_point; + int point, new_skill_point; - if (!message || !*message || (point = atoi(message)) == 0) { - clif_displaymessage(fd, "Please, enter a number (usage: @skpoint <number of points>)."); - return -1; - } - - new_skill_point = (int)sd->status.skill_point + point; - if (point > 0 && (point > 0x7FFF || new_skill_point > 0x7FFF)) // fix positiv overflow - new_skill_point = 0x7FFF; - else if (point < 0 && (point < -0x7FFF || new_skill_point < 0)) // fix negativ overflow - new_skill_point = 0; + if (!message || !*message || (point = atoi (message)) == 0) + { + clif_displaymessage (fd, + "Please, enter a number (usage: @skpoint <number of points>)."); + return -1; + } - if (new_skill_point != (int)sd->status.skill_point) { - sd->status.skill_point = (short)new_skill_point; - clif_updatestatus(sd, SP_SKILLPOINT); - clif_displaymessage(fd, msg_table[175]); // Number of skill points changed! - } else { - if (point < 0) - clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value. - else - clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value. - return -1; - } + new_skill_point = (int) sd->status.skill_point + point; + if (point > 0 && (point > 0x7FFF || new_skill_point > 0x7FFF)) // fix positiv overflow + new_skill_point = 0x7FFF; + else if (point < 0 && (point < -0x7FFF || new_skill_point < 0)) // fix negativ overflow + new_skill_point = 0; + + if (new_skill_point != (int) sd->status.skill_point) + { + sd->status.skill_point = (short) new_skill_point; + clif_updatestatus (sd, SP_SKILLPOINT); + clif_displaymessage (fd, msg_table[175]); // Number of skill points changed! + } + else + { + if (point < 0) + clif_displaymessage (fd, msg_table[41]); // Impossible to decrease the number/value. + else + clif_displaymessage (fd, msg_table[149]); // Impossible to increase the number/value. + return -1; + } - return 0; + return 0; } /*========================================== * @zeny (Rewritten by [Yor]) *------------------------------------------ */ -int atcommand_zeny( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_zeny (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int zeny, new_zeny; - - if (!message || !*message || (zeny = atoi(message)) == 0) { - clif_displaymessage(fd, "Please, enter an amount (usage: @zeny <amount>)."); - return -1; - } + int zeny, new_zeny; - new_zeny = sd->status.zeny + zeny; - if (zeny > 0 && (zeny > MAX_ZENY || new_zeny > MAX_ZENY)) // fix positiv overflow - new_zeny = MAX_ZENY; - else if (zeny < 0 && (zeny < -MAX_ZENY || new_zeny < 0)) // fix negativ overflow - new_zeny = 0; + if (!message || !*message || (zeny = atoi (message)) == 0) + { + clif_displaymessage (fd, + "Please, enter an amount (usage: @zeny <amount>)."); + return -1; + } - if (new_zeny != sd->status.zeny) { - sd->status.zeny = new_zeny; - clif_updatestatus(sd, SP_ZENY); - clif_displaymessage(fd, msg_table[176]); // Number of zenys changed! - } else { - if (zeny < 0) - clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value. - else - clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value. - return -1; - } + new_zeny = sd->status.zeny + zeny; + if (zeny > 0 && (zeny > MAX_ZENY || new_zeny > MAX_ZENY)) // fix positiv overflow + new_zeny = MAX_ZENY; + else if (zeny < 0 && (zeny < -MAX_ZENY || new_zeny < 0)) // fix negativ overflow + new_zeny = 0; + + if (new_zeny != sd->status.zeny) + { + sd->status.zeny = new_zeny; + clif_updatestatus (sd, SP_ZENY); + clif_displaymessage (fd, msg_table[176]); // Number of zenys changed! + } + else + { + if (zeny < 0) + clif_displaymessage (fd, msg_table[41]); // Impossible to decrease the number/value. + else + clif_displaymessage (fd, msg_table[149]); // Impossible to increase the number/value. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_param( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - int i, index, value = 0, new_value; - const char* param[] = { "@str", "@agi", "@vit", "@int", "@dex", "@luk", NULL }; - short* status[] = { - &sd->status.str, &sd->status.agi, &sd->status.vit, - &sd->status.int_, &sd->status.dex, &sd->status.luk - }; - char output[200]; - - memset(output, '\0', sizeof(output)); - - if (!message || !*message || sscanf(message, "%d", &value) < 1 || value == 0) { - sprintf(output, "Please, enter a valid value (usage: @str,@agi,@vit,@int,@dex,@luk <+/-adjustement>)."); - clif_displaymessage(fd, output); - return -1; - } - - index = -1; - for (i = 0; param[i] != NULL; i++) { - if (strcmpi(command, param[i]) == 0) { - index = i; - break; - } - } - if (index < 0 || index > MAX_STATUS_TYPE) { // normaly impossible... - sprintf(output, "Please, enter a valid value (usage: @str,@agi,@vit,@int,@dex,@luk <+/-adjustement>)."); - clif_displaymessage(fd, output); - return -1; - } - - new_value = (int)*status[index] + value; - if (value > 0 && (value > battle_config.max_parameter || new_value > battle_config.max_parameter)) // fix positiv overflow - new_value = battle_config.max_parameter; - else if (value < 0 && (value < -battle_config.max_parameter || new_value < 1)) // fix negativ overflow - new_value = 1; - - if (new_value != (int)*status[index]) { - *status[index] = new_value; - clif_updatestatus(sd, SP_STR + index); - clif_updatestatus(sd, SP_USTR + index); - pc_calcstatus(sd, 0); - clif_displaymessage(fd, msg_table[42]); // Stat changed. - } else { - if (value < 0) - clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value. - else - clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value. - return -1; - } - - return 0; +int atcommand_param (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + int i, index, value = 0, new_value; + const char *param[] = + { "@str", "@agi", "@vit", "@int", "@dex", "@luk", NULL }; + short *status[] = { + &sd->status.str, &sd->status.agi, &sd->status.vit, + &sd->status.int_, &sd->status.dex, &sd->status.luk + }; + char output[200]; + + memset (output, '\0', sizeof (output)); + + if (!message || !*message || sscanf (message, "%d", &value) < 1 + || value == 0) + { + sprintf (output, + "Please, enter a valid value (usage: @str,@agi,@vit,@int,@dex,@luk <+/-adjustement>)."); + clif_displaymessage (fd, output); + return -1; + } + + index = -1; + for (i = 0; param[i] != NULL; i++) + { + if (strcmpi (command, param[i]) == 0) + { + index = i; + break; + } + } + if (index < 0 || index > MAX_STATUS_TYPE) + { // normaly impossible... + sprintf (output, + "Please, enter a valid value (usage: @str,@agi,@vit,@int,@dex,@luk <+/-adjustement>)."); + clif_displaymessage (fd, output); + return -1; + } + + new_value = (int) *status[index] + value; + if (value > 0 && (value > battle_config.max_parameter || new_value > battle_config.max_parameter)) // fix positiv overflow + new_value = battle_config.max_parameter; + else if (value < 0 && (value < -battle_config.max_parameter || new_value < 1)) // fix negativ overflow + new_value = 1; + + if (new_value != (int) *status[index]) + { + *status[index] = new_value; + clif_updatestatus (sd, SP_STR + index); + clif_updatestatus (sd, SP_USTR + index); + pc_calcstatus (sd, 0); + clif_displaymessage (fd, msg_table[42]); // Stat changed. + } + else + { + if (value < 0) + clif_displaymessage (fd, msg_table[41]); // Impossible to decrease the number/value. + else + clif_displaymessage (fd, msg_table[149]); // Impossible to increase the number/value. + return -1; + } + + return 0; } /*========================================== @@ -3006,229 +3551,281 @@ int atcommand_param( *------------------------------------------ */ //** Stat all by fritz (rewritten by [Yor]) -int atcommand_all_stats( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - int index, count, value = 0, new_value; - short* status[] = { - &sd->status.str, &sd->status.agi, &sd->status.vit, - &sd->status.int_, &sd->status.dex, &sd->status.luk - }; - - if (!message || !*message || sscanf(message, "%d", &value) < 1 || value == 0) - value = battle_config.max_parameter; - - count = 0; - for (index = 0; index < (int)(sizeof(status) / sizeof(status[0])); index++) { - - new_value = (int)*status[index] + value; - if (value > 0 && (value > battle_config.max_parameter || new_value > battle_config.max_parameter)) // fix positiv overflow - new_value = battle_config.max_parameter; - else if (value < 0 && (value < -battle_config.max_parameter || new_value < 1)) // fix negativ overflow - new_value = 1; - - if (new_value != (int)*status[index]) { - *status[index] = new_value; - clif_updatestatus(sd, SP_STR + index); - clif_updatestatus(sd, SP_USTR + index); - pc_calcstatus(sd, 0); - count++; - } - } - - if (count > 0) // if at least 1 stat modified - clif_displaymessage(fd, msg_table[84]); // All stats changed! - else { - if (value < 0) - clif_displaymessage(fd, msg_table[177]); // Impossible to decrease a stat. - else - clif_displaymessage(fd, msg_table[178]); // Impossible to increase a stat. - return -1; - } - - return 0; +int atcommand_all_stats (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + int index, count, value = 0, new_value; + short *status[] = { + &sd->status.str, &sd->status.agi, &sd->status.vit, + &sd->status.int_, &sd->status.dex, &sd->status.luk + }; + + if (!message || !*message || sscanf (message, "%d", &value) < 1 + || value == 0) + value = battle_config.max_parameter; + + count = 0; + for (index = 0; index < (int) (sizeof (status) / sizeof (status[0])); + index++) + { + + new_value = (int) *status[index] + value; + if (value > 0 && (value > battle_config.max_parameter || new_value > battle_config.max_parameter)) // fix positiv overflow + new_value = battle_config.max_parameter; + else if (value < 0 && (value < -battle_config.max_parameter || new_value < 1)) // fix negativ overflow + new_value = 1; + + if (new_value != (int) *status[index]) + { + *status[index] = new_value; + clif_updatestatus (sd, SP_STR + index); + clif_updatestatus (sd, SP_USTR + index); + pc_calcstatus (sd, 0); + count++; + } + } + + if (count > 0) // if at least 1 stat modified + clif_displaymessage (fd, msg_table[84]); // All stats changed! + else + { + if (value < 0) + clif_displaymessage (fd, msg_table[177]); // Impossible to decrease a stat. + else + clif_displaymessage (fd, msg_table[178]); // Impossible to increase a stat. + return -1; + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_guildlevelup( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_guildlevelup (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int level = 0; - short added_level; - struct guild *guild_info; - - if (!message || !*message || sscanf(message, "%d", &level) < 1 || level == 0) { - clif_displaymessage(fd, "Please, enter a valid level (usage: @guildlvl <# of levels>)."); - return -1; - } + int level = 0; + short added_level; + struct guild *guild_info; - if (sd->status.guild_id <= 0 || (guild_info = guild_search(sd->status.guild_id)) == NULL) { - clif_displaymessage(fd, msg_table[43]); // You're not in a guild. - return -1; - } - if (strcmp(sd->status.name, guild_info->master) != 0) { - clif_displaymessage(fd, msg_table[44]); // You're not the master of your guild. - return -1; - } + if (!message || !*message || sscanf (message, "%d", &level) < 1 + || level == 0) + { + clif_displaymessage (fd, + "Please, enter a valid level (usage: @guildlvl <# of levels>)."); + return -1; + } - added_level = (short)level; - if (level > 0 && (level > MAX_GUILDLEVEL || added_level > ((short)MAX_GUILDLEVEL - guild_info->guild_lv))) // fix positiv overflow - added_level = (short)MAX_GUILDLEVEL - guild_info->guild_lv; - else if (level < 0 && (level < -MAX_GUILDLEVEL || added_level < (1 - guild_info->guild_lv))) // fix negativ overflow - added_level = 1 - guild_info->guild_lv; + if (sd->status.guild_id <= 0 + || (guild_info = guild_search (sd->status.guild_id)) == NULL) + { + clif_displaymessage (fd, msg_table[43]); // You're not in a guild. + return -1; + } + if (strcmp (sd->status.name, guild_info->master) != 0) + { + clif_displaymessage (fd, msg_table[44]); // You're not the master of your guild. + return -1; + } - if (added_level != 0) { - intif_guild_change_basicinfo(guild_info->guild_id, GBI_GUILDLV, &added_level, 2); - clif_displaymessage(fd, msg_table[179]); // Guild level changed. - } else { - clif_displaymessage(fd, msg_table[45]); // Guild level change failed. - return -1; - } + added_level = (short) level; + if (level > 0 && (level > MAX_GUILDLEVEL || added_level > ((short) MAX_GUILDLEVEL - guild_info->guild_lv))) // fix positiv overflow + added_level = (short) MAX_GUILDLEVEL - guild_info->guild_lv; + else if (level < 0 && (level < -MAX_GUILDLEVEL || added_level < (1 - guild_info->guild_lv))) // fix negativ overflow + added_level = 1 - guild_info->guild_lv; + + if (added_level != 0) + { + intif_guild_change_basicinfo (guild_info->guild_id, GBI_GUILDLV, + &added_level, 2); + clif_displaymessage (fd, msg_table[179]); // Guild level changed. + } + else + { + clif_displaymessage (fd, msg_table[45]); // Guild level change failed. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_recall( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char character[100]; - char output[200]; - struct map_session_data *pl_sd; - - memset(character, '\0', sizeof(character)); - memset(output, '\0', sizeof(output)); - - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @recall <char name>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can recall only lower or same level - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp somenone to your actual map."); - return -1; - } - if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp this player from its actual map."); - return -1; - } - pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2); - sprintf(output, msg_table[46], character); // %s recalled! - clif_displaymessage(fd, output); - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_recall (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char character[100]; + char output[200]; + struct map_session_data *pl_sd; + + memset (character, '\0', sizeof (character)); + memset (output, '\0', sizeof (output)); + + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @recall <char name>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can recall only lower or same level + if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp somenone to your actual map."); + return -1; + } + if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp this player from its actual map."); + return -1; + } + pc_setpos (pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2); + sprintf (output, msg_table[46], character); // %s recalled! + clif_displaymessage (fd, output); + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_revive( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_revive (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - struct map_session_data *pl_sd; + char character[100]; + struct map_session_data *pl_sd; - memset(character, '\0', sizeof(character)); + memset (character, '\0', sizeof (character)); - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @revive <char name>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @revive <char name>)."); + return -1; + } - if ((pl_sd = map_nick2sd(character)) != NULL) { - pl_sd->status.hp = pl_sd->status.max_hp; - pc_setstand(pl_sd); - if (battle_config.pc_invincible_time > 0) - pc_setinvincibletimer(sd, battle_config.pc_invincible_time); - clif_updatestatus(pl_sd, SP_HP); - clif_updatestatus(pl_sd, SP_SP); - clif_resurrection(&pl_sd->bl, 1); - clif_displaymessage(fd, msg_table[51]); // Character revived. - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } + if ((pl_sd = map_nick2sd (character)) != NULL) + { + pl_sd->status.hp = pl_sd->status.max_hp; + pc_setstand (pl_sd); + if (battle_config.pc_invincible_time > 0) + pc_setinvincibletimer (sd, battle_config.pc_invincible_time); + clif_updatestatus (pl_sd, SP_HP); + clif_updatestatus (pl_sd, SP_SP); + clif_resurrection (&pl_sd->bl, 1); + clif_displaymessage (fd, msg_table[51]); // Character revived. + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_character_stats( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char character[100]; - char job_jobname[100]; - char output[200]; - struct map_session_data *pl_sd; - int i; - - memset(character, '\0', sizeof(character)); - memset(job_jobname, '\0', sizeof(job_jobname)); - memset(output, '\0', sizeof(output)); - - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @charstats <char name>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - struct { - const char* format; - int value; - } output_table[] = { - { "Base Level - %d", pl_sd->status.base_level }, - { job_jobname, pl_sd->status.job_level }, - { "Hp - %d", pl_sd->status.hp }, - { "MaxHp - %d", pl_sd->status.max_hp }, - { "Sp - %d", pl_sd->status.sp }, - { "MaxSp - %d", pl_sd->status.max_sp }, - { "Str - %3d", pl_sd->status.str }, - { "Agi - %3d", pl_sd->status.agi }, - { "Vit - %3d", pl_sd->status.vit }, - { "Int - %3d", pl_sd->status.int_ }, - { "Dex - %3d", pl_sd->status.dex }, - { "Luk - %3d", pl_sd->status.luk }, - { "Zeny - %d", pl_sd->status.zeny }, - { NULL, 0 } - }; - sprintf(job_jobname, "Job - %s %s", job_name(pl_sd->status.class), "(level %d)"); - sprintf(output, msg_table[53], pl_sd->status.name); // '%s' stats: - clif_displaymessage(fd, output); - for (i = 0; output_table[i].format != NULL; i++) { - sprintf(output, output_table[i].format, output_table[i].value); - clif_displaymessage(fd, output); - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_character_stats (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char character[100]; + char job_jobname[100]; + char output[200]; + struct map_session_data *pl_sd; + int i; + + memset (character, '\0', sizeof (character)); + memset (job_jobname, '\0', sizeof (job_jobname)); + memset (output, '\0', sizeof (output)); + + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @charstats <char name>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + struct + { + const char *format; + int value; + } output_table[] = + { + { + "Base Level - %d", pl_sd->status.base_level}, + { + job_jobname, pl_sd->status.job_level}, + { + "Hp - %d", pl_sd->status.hp}, + { + "MaxHp - %d", pl_sd->status.max_hp}, + { + "Sp - %d", pl_sd->status.sp}, + { + "MaxSp - %d", pl_sd->status.max_sp}, + { + "Str - %3d", pl_sd->status.str}, + { + "Agi - %3d", pl_sd->status.agi}, + { + "Vit - %3d", pl_sd->status.vit}, + { + "Int - %3d", pl_sd->status.int_}, + { + "Dex - %3d", pl_sd->status.dex}, + { + "Luk - %3d", pl_sd->status.luk}, + { + "Zeny - %d", pl_sd->status.zeny}, + { + NULL, 0} + }; + sprintf (job_jobname, "Job - %s %s", job_name (pl_sd->status.class), + "(level %d)"); + sprintf (output, msg_table[53], pl_sd->status.name); // '%s' stats: + clif_displaymessage (fd, output); + for (i = 0; output_table[i].format != NULL; i++) + { + sprintf (output, output_table[i].format, output_table[i].value); + clif_displaymessage (fd, output); + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== @@ -3236,145 +3833,183 @@ int atcommand_character_stats( *------------------------------------------ */ //** Character Stats All by fritz -int atcommand_character_stats_all(const int fd, struct map_session_data* sd, const char* command, const char* message) +int atcommand_character_stats_all (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char output[1024], gmlevel[1024]; - int i; - int count; - struct map_session_data *pl_sd; - - memset(output, '\0', sizeof(output)); - memset(gmlevel, '\0', sizeof(gmlevel)); - - count = 0; - for(i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - - if (pc_isGM(pl_sd) > 0) - sprintf(gmlevel, "| GM Lvl: %d", pc_isGM(pl_sd)); - else - sprintf(gmlevel, " "); + char output[1024], gmlevel[1024]; + int i; + int count; + struct map_session_data *pl_sd; - sprintf(output, "Name: %s | BLvl: %d | Job: %s (Lvl: %d) | HP: %d/%d | SP: %d/%d", pl_sd->status.name, pl_sd->status.base_level, job_name(pl_sd->status.class), pl_sd->status.job_level, pl_sd->status.hp, pl_sd->status.max_hp, pl_sd->status.sp, pl_sd->status.max_sp); - clif_displaymessage(fd, output); - sprintf(output, "STR: %d | AGI: %d | VIT: %d | INT: %d | DEX: %d | LUK: %d | Zeny: %d %s", pl_sd->status.str, pl_sd->status.agi, pl_sd->status.vit, pl_sd->status.int_, pl_sd->status.dex, pl_sd->status.luk, pl_sd->status.zeny, gmlevel); - clif_displaymessage(fd, output); - clif_displaymessage(fd, "--------"); - count++; - } - } + memset (output, '\0', sizeof (output)); + memset (gmlevel, '\0', sizeof (gmlevel)); + + count = 0; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + + if (pc_isGM (pl_sd) > 0) + sprintf (gmlevel, "| GM Lvl: %d", pc_isGM (pl_sd)); + else + sprintf (gmlevel, " "); + + sprintf (output, + "Name: %s | BLvl: %d | Job: %s (Lvl: %d) | HP: %d/%d | SP: %d/%d", + pl_sd->status.name, pl_sd->status.base_level, + job_name (pl_sd->status.class), pl_sd->status.job_level, + pl_sd->status.hp, pl_sd->status.max_hp, pl_sd->status.sp, + pl_sd->status.max_sp); + clif_displaymessage (fd, output); + sprintf (output, + "STR: %d | AGI: %d | VIT: %d | INT: %d | DEX: %d | LUK: %d | Zeny: %d %s", + pl_sd->status.str, pl_sd->status.agi, pl_sd->status.vit, + pl_sd->status.int_, pl_sd->status.dex, pl_sd->status.luk, + pl_sd->status.zeny, gmlevel); + clif_displaymessage (fd, output); + clif_displaymessage (fd, "--------"); + count++; + } + } - if (count == 0) - clif_displaymessage(fd, msg_table[28]); // No player found. - else if (count == 1) - clif_displaymessage(fd, msg_table[29]); // 1 player found. - else { - sprintf(output, msg_table[30], count); // %d players found. - clif_displaymessage(fd, output); - } + if (count == 0) + clif_displaymessage (fd, msg_table[28]); // No player found. + else if (count == 1) + clif_displaymessage (fd, msg_table[29]); // 1 player found. + else + { + sprintf (output, msg_table[30], count); // %d players found. + clif_displaymessage (fd, output); + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_character_option( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char character[100]; - int opt1 = 0, opt2 = 0, opt3 = 0; - struct map_session_data* pl_sd; - - memset(character, '\0', sizeof(character)); - - if (!message || !*message || sscanf(message, "%d %d %d %99[^\n]", &opt1, &opt2, &opt3, character) < 4 || opt1 < 0 || opt2 < 0 || opt3 < 0) { - clif_displaymessage(fd, "Please, enter valid options and a player name (usage: @charoption <param1> <param2> <param3> <charname>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change option only to lower or same level - pl_sd->opt1 = opt1; - pl_sd->opt2 = opt2; - pl_sd->status.option = opt3; - // fix pecopeco display - if (pl_sd->status.class == 13 || pl_sd->status.class == 21 || pl_sd->status.class == 4014 || pl_sd->status.class == 4022) { - if (!pc_isriding(pl_sd)) { // pl_sd have the new value... - if (pl_sd->status.class == 13) - pl_sd->status.class = pl_sd->view_class = 7; - else if (pl_sd->status.class == 21) - pl_sd->status.class = pl_sd->view_class = 14; - else if (pl_sd->status.class == 4014) - pl_sd->status.class = pl_sd->view_class = 4008; - else if (pl_sd->status.class == 4022) - pl_sd->status.class = pl_sd->view_class = 4015; - } - } else { - if (pc_isriding(pl_sd)) { // pl_sd have the new value... - if (pl_sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] (code added by [Yor]) - pl_sd->status.option &= ~0x0020; - } else { - if (pl_sd->status.class == 7) - pl_sd->status.class = pl_sd->view_class = 13; - else if (pl_sd->status.class == 14) - pl_sd->status.class = pl_sd->view_class = 21; - else if (pl_sd->status.class == 4008) - pl_sd->status.class = pl_sd->view_class = 4014; - else if (pl_sd->status.class == 4015) - pl_sd->status.class = pl_sd->view_class = 4022; - else - pl_sd->status.option &= ~0x0020; - } - } - } - clif_changeoption(&pl_sd->bl); - pc_calcstatus(pl_sd, 0); - clif_displaymessage(fd, msg_table[58]); // Character's options changed. - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_character_option (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char character[100]; + int opt1 = 0, opt2 = 0, opt3 = 0; + struct map_session_data *pl_sd; + + memset (character, '\0', sizeof (character)); + + if (!message || !*message + || sscanf (message, "%d %d %d %99[^\n]", &opt1, &opt2, &opt3, + character) < 4 || opt1 < 0 || opt2 < 0 || opt3 < 0) + { + clif_displaymessage (fd, + "Please, enter valid options and a player name (usage: @charoption <param1> <param2> <param3> <charname>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can change option only to lower or same level + pl_sd->opt1 = opt1; + pl_sd->opt2 = opt2; + pl_sd->status.option = opt3; + // fix pecopeco display + if (pl_sd->status.class == 13 || pl_sd->status.class == 21 + || pl_sd->status.class == 4014 || pl_sd->status.class == 4022) + { + if (!pc_isriding (pl_sd)) + { // pl_sd have the new value... + if (pl_sd->status.class == 13) + pl_sd->status.class = pl_sd->view_class = 7; + else if (pl_sd->status.class == 21) + pl_sd->status.class = pl_sd->view_class = 14; + else if (pl_sd->status.class == 4014) + pl_sd->status.class = pl_sd->view_class = 4008; + else if (pl_sd->status.class == 4022) + pl_sd->status.class = pl_sd->view_class = 4015; + } + } + else + { + if (pc_isriding (pl_sd)) + { // pl_sd have the new value... + if (pl_sd->disguise > 0) + { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] (code added by [Yor]) + pl_sd->status.option &= ~0x0020; + } + else + { + if (pl_sd->status.class == 7) + pl_sd->status.class = pl_sd->view_class = 13; + else if (pl_sd->status.class == 14) + pl_sd->status.class = pl_sd->view_class = 21; + else if (pl_sd->status.class == 4008) + pl_sd->status.class = pl_sd->view_class = 4014; + else if (pl_sd->status.class == 4015) + pl_sd->status.class = pl_sd->view_class = 4022; + else + pl_sd->status.option &= ~0x0020; + } + } + } + clif_changeoption (&pl_sd->bl); + pc_calcstatus (pl_sd, 0); + clif_displaymessage (fd, msg_table[58]); // Character's options changed. + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== * charchangesex command (usage: charchangesex <player_name>) *------------------------------------------ */ -int atcommand_char_change_sex( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_char_change_sex (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; + char character[100]; - memset(character, '\0', sizeof(character)); + memset (character, '\0', sizeof (character)); - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @charchangesex <name>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @charchangesex <name>)."); + return -1; + } - // check player name - if (strlen(character) < 4) { - clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters. - return -1; - } else if (strlen(character) > 23) { - clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum. - return -1; - } else { - chrif_char_ask_name(sd->status.account_id, character, 5, 0, 0, 0, 0, 0, 0); // type: 5 - changesex - clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it. - } + // check player name + if (strlen (character) < 4) + { + clif_displaymessage (fd, msg_table[86]); // Sorry, but a player name have at least 4 characters. + return -1; + } + else if (strlen (character) > 23) + { + clif_displaymessage (fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum. + return -1; + } + else + { + chrif_char_ask_name (sd->status.account_id, character, 5, 0, 0, 0, 0, 0, 0); // type: 5 - changesex + clif_displaymessage (fd, msg_table[88]); // Character name sends to char-server to ask it. + } - return 0; + return 0; } /*========================================== @@ -3382,32 +4017,38 @@ int atcommand_char_change_sex( * This command do a definitiv ban on a player *------------------------------------------ */ -int atcommand_char_block( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_char_block (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; + char character[100]; - memset(character, '\0', sizeof(character)); + memset (character, '\0', sizeof (character)); - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @block <name>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @block <name>)."); + return -1; + } - // check player name - if (strlen(character) < 4) { - clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters. - return -1; - } else if (strlen(character) > 23) { - clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum. - return -1; - } else { - chrif_char_ask_name(sd->status.account_id, character, 1, 0, 0, 0, 0, 0, 0); // type: 1 - block - clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it. - } + // check player name + if (strlen (character) < 4) + { + clif_displaymessage (fd, msg_table[86]); // Sorry, but a player name have at least 4 characters. + return -1; + } + else if (strlen (character) > 23) + { + clif_displaymessage (fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum. + return -1; + } + else + { + chrif_char_ask_name (sd->status.account_id, character, 1, 0, 0, 0, 0, 0, 0); // type: 1 - block + clif_displaymessage (fd, msg_table[88]); // Character name sends to char-server to ask it. + } - return 0; + return 0; } /*========================================== @@ -3426,1493 +4067,1761 @@ int atcommand_char_block( * this example adds 1 month and 1 second, and substracts 2 minutes and 6 years at the same time. *------------------------------------------ */ -int atcommand_char_ban( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char modif[100], character[100]; - char * modif_p; - int year, month, day, hour, minute, second, value; - - memset(modif, '\0', sizeof(modif)); - memset(character, '\0', sizeof(character)); - - if (!message || !*message || sscanf(message, "%s %99[^\n]", modif, character) < 2) { - clif_displaymessage(fd, "Please, enter ban time and a player name (usage: @charban/@ban/@banish/@charbanish <time> <name>)."); - return -1; - } - - modif[sizeof(modif)-1] = '\0'; - character[sizeof(character)-1] = '\0'; - - modif_p = modif; - year = month = day = hour = minute = second = 0; - while (modif_p[0] != '\0') { - value = atoi(modif_p); - if (value == 0) - modif_p++; - else { - if (modif_p[0] == '-' || modif_p[0] == '+') - modif_p++; - while (modif_p[0] >= '0' && modif_p[0] <= '9') - modif_p++; - if (modif_p[0] == 's') { - second = value; - modif_p++; - } else if (modif_p[0] == 'm' && modif_p[1] == 'n') { - minute = value; - modif_p = modif_p + 2; - } else if (modif_p[0] == 'h') { - hour = value; - modif_p++; - } else if (modif_p[0] == 'd' || modif_p[0] == 'j') { - day = value; - modif_p++; - } else if (modif_p[0] == 'm') { - month = value; - modif_p++; - } else if (modif_p[0] == 'y' || modif_p[0] == 'a') { - year = value; - modif_p++; - } else if (modif_p[0] != '\0') { - modif_p++; - } - } - } - if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 && second == 0) { - clif_displaymessage(fd, msg_table[85]); // Invalid time for ban command. - return -1; - } - - // check player name - if (strlen(character) < 4) { - clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters. - return -1; - } else if (strlen(character) > 23) { - clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum. - return -1; - } else { - chrif_char_ask_name(sd->status.account_id, character, 2, year, month, day, hour, minute, second); // type: 2 - ban - clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it. - } - - return 0; +int atcommand_char_ban (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char modif[100], character[100]; + char *modif_p; + int year, month, day, hour, minute, second, value; + + memset (modif, '\0', sizeof (modif)); + memset (character, '\0', sizeof (character)); + + if (!message || !*message + || sscanf (message, "%s %99[^\n]", modif, character) < 2) + { + clif_displaymessage (fd, + "Please, enter ban time and a player name (usage: @charban/@ban/@banish/@charbanish <time> <name>)."); + return -1; + } + + modif[sizeof (modif) - 1] = '\0'; + character[sizeof (character) - 1] = '\0'; + + modif_p = modif; + year = month = day = hour = minute = second = 0; + while (modif_p[0] != '\0') + { + value = atoi (modif_p); + if (value == 0) + modif_p++; + else + { + if (modif_p[0] == '-' || modif_p[0] == '+') + modif_p++; + while (modif_p[0] >= '0' && modif_p[0] <= '9') + modif_p++; + if (modif_p[0] == 's') + { + second = value; + modif_p++; + } + else if (modif_p[0] == 'm' && modif_p[1] == 'n') + { + minute = value; + modif_p = modif_p + 2; + } + else if (modif_p[0] == 'h') + { + hour = value; + modif_p++; + } + else if (modif_p[0] == 'd' || modif_p[0] == 'j') + { + day = value; + modif_p++; + } + else if (modif_p[0] == 'm') + { + month = value; + modif_p++; + } + else if (modif_p[0] == 'y' || modif_p[0] == 'a') + { + year = value; + modif_p++; + } + else if (modif_p[0] != '\0') + { + modif_p++; + } + } + } + if (year == 0 && month == 0 && day == 0 && hour == 0 && minute == 0 + && second == 0) + { + clif_displaymessage (fd, msg_table[85]); // Invalid time for ban command. + return -1; + } + + // check player name + if (strlen (character) < 4) + { + clif_displaymessage (fd, msg_table[86]); // Sorry, but a player name have at least 4 characters. + return -1; + } + else if (strlen (character) > 23) + { + clif_displaymessage (fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum. + return -1; + } + else + { + chrif_char_ask_name (sd->status.account_id, character, 2, year, month, day, hour, minute, second); // type: 2 - ban + clif_displaymessage (fd, msg_table[88]); // Character name sends to char-server to ask it. + } + + return 0; } /*========================================== * charunblock command (usage: charunblock <player_name>) *------------------------------------------ */ -int atcommand_char_unblock( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_char_unblock (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; + char character[100]; - memset(character, '\0', sizeof(character)); + memset (character, '\0', sizeof (character)); - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @charunblock <player_name>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @charunblock <player_name>)."); + return -1; + } - // check player name - if (strlen(character) < 4) { - clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters. - return -1; - } else if (strlen(character) > 23) { - clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum. - return -1; - } else { - // send answer to login server via char-server - chrif_char_ask_name(sd->status.account_id, character, 3, 0, 0, 0, 0, 0, 0); // type: 3 - unblock - clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it. - } + // check player name + if (strlen (character) < 4) + { + clif_displaymessage (fd, msg_table[86]); // Sorry, but a player name have at least 4 characters. + return -1; + } + else if (strlen (character) > 23) + { + clif_displaymessage (fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum. + return -1; + } + else + { + // send answer to login server via char-server + chrif_char_ask_name (sd->status.account_id, character, 3, 0, 0, 0, 0, 0, 0); // type: 3 - unblock + clif_displaymessage (fd, msg_table[88]); // Character name sends to char-server to ask it. + } - return 0; + return 0; } /*========================================== * charunban command (usage: charunban <player_name>) *------------------------------------------ */ -int atcommand_char_unban( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_char_unban (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; + char character[100]; - memset(character, '\0', sizeof(character)); + memset (character, '\0', sizeof (character)); - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @charunban <player_name>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @charunban <player_name>)."); + return -1; + } - // check player name - if (strlen(character) < 4) { - clif_displaymessage(fd, msg_table[86]); // Sorry, but a player name have at least 4 characters. - return -1; - } else if (strlen(character) > 23) { - clif_displaymessage(fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum. - return -1; - } else { - // send answer to login server via char-server - chrif_char_ask_name(sd->status.account_id, character, 4, 0, 0, 0, 0, 0, 0); // type: 4 - unban - clif_displaymessage(fd, msg_table[88]); // Character name sends to char-server to ask it. - } + // check player name + if (strlen (character) < 4) + { + clif_displaymessage (fd, msg_table[86]); // Sorry, but a player name have at least 4 characters. + return -1; + } + else if (strlen (character) > 23) + { + clif_displaymessage (fd, msg_table[87]); // Sorry, but a player name have 23 characters maximum. + return -1; + } + else + { + // send answer to login server via char-server + chrif_char_ask_name (sd->status.account_id, character, 4, 0, 0, 0, 0, 0, 0); // type: 4 - unban + clif_displaymessage (fd, msg_table[88]); // Character name sends to char-server to ask it. + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_character_save( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char map_name[100]; - char character[100]; - struct map_session_data* pl_sd; - int x = 0, y = 0; - int m; - - memset(map_name, '\0', sizeof(map_name)); - memset(character, '\0', sizeof(character)); - - if (!message || !*message || sscanf(message, "%99s %d %d %99[^\n]", map_name, &x, &y, character) < 4 || x < 0 || y < 0) { - clif_displaymessage(fd, "Please, enter a valid save point and a player name (usage: @charsave <map> <x> <y> <charname>)."); - return -1; - } - - if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat) - strcat(map_name, ".gat"); - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change save point only to lower or same gm level - m = map_mapname2mapid(map_name); - if (m < 0) { - clif_displaymessage(fd, msg_table[1]); // Map not found. - return -1; - } else { - if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to set this map as a save map."); - return -1; - } - pc_setsavepoint(pl_sd, map_name, x, y); - clif_displaymessage(fd, msg_table[57]); // Character's respawn point changed. - } - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_character_save (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char map_name[100]; + char character[100]; + struct map_session_data *pl_sd; + int x = 0, y = 0; + int m; + + memset (map_name, '\0', sizeof (map_name)); + memset (character, '\0', sizeof (character)); + + if (!message || !*message + || sscanf (message, "%99s %d %d %99[^\n]", map_name, &x, &y, + character) < 4 || x < 0 || y < 0) + { + clif_displaymessage (fd, + "Please, enter a valid save point and a player name (usage: @charsave <map> <x> <y> <charname>)."); + return -1; + } + + if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat) + strcat (map_name, ".gat"); + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can change save point only to lower or same gm level + m = map_mapname2mapid (map_name); + if (m < 0) + { + clif_displaymessage (fd, msg_table[1]); // Map not found. + return -1; + } + else + { + if (m >= 0 && map[m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to set this map as a save map."); + return -1; + } + pc_setsavepoint (pl_sd, map_name, x, y); + clif_displaymessage (fd, msg_table[57]); // Character's respawn point changed. + } + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_night( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_night (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd; - int i; - - if (night_flag != 1) { - night_flag = 1; // 0=day, 1=night [Yor] - for(i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - pl_sd->opt2 |= STATE_BLIND; - clif_changeoption(&pl_sd->bl); - clif_displaymessage(pl_sd->fd, msg_table[59]); // Night has fallen. - } - } - } else { - clif_displaymessage(fd, msg_table[89]); // Sorry, it's already the night. Impossible to execute the command. - return -1; - } + struct map_session_data *pl_sd; + int i; + + if (night_flag != 1) + { + night_flag = 1; // 0=day, 1=night [Yor] + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + pl_sd->opt2 |= STATE_BLIND; + clif_changeoption (&pl_sd->bl); + clif_displaymessage (pl_sd->fd, msg_table[59]); // Night has fallen. + } + } + } + else + { + clif_displaymessage (fd, msg_table[89]); // Sorry, it's already the night. Impossible to execute the command. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_day( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_day (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd; - int i; - - if (night_flag != 0) { - night_flag = 0; // 0=day, 1=night [Yor] - for(i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - pl_sd->opt2 &= ~STATE_BLIND; - clif_changeoption(&pl_sd->bl); - clif_displaymessage(pl_sd->fd, msg_table[60]); // Day has arrived. - } - } - } else { - clif_displaymessage(fd, msg_table[90]); // Sorry, it's already the day. Impossible to execute the command. - return -1; - } + struct map_session_data *pl_sd; + int i; + + if (night_flag != 0) + { + night_flag = 0; // 0=day, 1=night [Yor] + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + pl_sd->opt2 &= ~STATE_BLIND; + clif_changeoption (&pl_sd->bl); + clif_displaymessage (pl_sd->fd, msg_table[60]); // Day has arrived. + } + } + } + else + { + clif_displaymessage (fd, msg_table[90]); // Sorry, it's already the day. Impossible to execute the command. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_doom( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_doom (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd; - int i; - - for(i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && i != fd && - pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can doom only lower or same gm level - pc_damage(NULL, pl_sd, pl_sd->status.hp + 1); - clif_displaymessage(pl_sd->fd, msg_table[61]); // The holy messenger has given judgement. - } - } - clif_displaymessage(fd, msg_table[62]); // Judgement was made. + struct map_session_data *pl_sd; + int i; + + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth && i != fd + && pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can doom only lower or same gm level + pc_damage (NULL, pl_sd, pl_sd->status.hp + 1); + clif_displaymessage (pl_sd->fd, msg_table[61]); // The holy messenger has given judgement. + } + } + clif_displaymessage (fd, msg_table[62]); // Judgement was made. - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_doommap( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_doommap (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd; - int i; - - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && i != fd && sd->bl.m == pl_sd->bl.m && - pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can doom only lower or same gm level - pc_damage(NULL, pl_sd, pl_sd->status.hp + 1); - clif_displaymessage(pl_sd->fd, msg_table[61]); // The holy messenger has given judgement. - } - } - clif_displaymessage(fd, msg_table[62]); // Judgement was made. + struct map_session_data *pl_sd; + int i; + + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth && i != fd && sd->bl.m == pl_sd->bl.m + && pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can doom only lower or same gm level + pc_damage (NULL, pl_sd, pl_sd->status.hp + 1); + clif_displaymessage (pl_sd->fd, msg_table[61]); // The holy messenger has given judgement. + } + } + clif_displaymessage (fd, msg_table[62]); // Judgement was made. - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -static void atcommand_raise_sub(struct map_session_data* sd) +static void atcommand_raise_sub (struct map_session_data *sd) { - if (sd && sd->state.auth && pc_isdead(sd)) { - sd->status.hp = sd->status.max_hp; - sd->status.sp = sd->status.max_sp; - pc_setstand(sd); - clif_updatestatus(sd, SP_HP); - clif_updatestatus(sd, SP_SP); - clif_resurrection(&sd->bl, 1); - clif_displaymessage(sd->fd, msg_table[63]); // Mercy has been shown. - } + if (sd && sd->state.auth && pc_isdead (sd)) + { + sd->status.hp = sd->status.max_hp; + sd->status.sp = sd->status.max_sp; + pc_setstand (sd); + clif_updatestatus (sd, SP_HP); + clif_updatestatus (sd, SP_SP); + clif_resurrection (&sd->bl, 1); + clif_displaymessage (sd->fd, msg_table[63]); // Mercy has been shown. + } } /*========================================== * *------------------------------------------ */ -int atcommand_raise( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_raise (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int i; + int i; - for (i = 0; i < fd_max; i++) { - if (session[i]) - atcommand_raise_sub(session[i]->session_data); - } - clif_displaymessage(fd, msg_table[64]); // Mercy has been granted. + for (i = 0; i < fd_max; i++) + { + if (session[i]) + atcommand_raise_sub (session[i]->session_data); + } + clif_displaymessage (fd, msg_table[64]); // Mercy has been granted. - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_raisemap( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_raisemap (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd; - int i; + struct map_session_data *pl_sd; + int i; - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && sd->bl.m == pl_sd->bl.m) - atcommand_raise_sub(pl_sd); - } - clif_displaymessage(fd, msg_table[64]); // Mercy has been granted. + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth && sd->bl.m == pl_sd->bl.m) + atcommand_raise_sub (pl_sd); + } + clif_displaymessage (fd, msg_table[64]); // Mercy has been granted. - return 0; + return 0; } /*========================================== * atcommand_character_baselevel @charbaselvlで対象キャラのレベルを上げる *------------------------------------------ */ -int atcommand_character_baselevel( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - struct map_session_data *pl_sd; - char character[100]; - int level = 0, i; - - memset(character, '\0', sizeof(character)); - - if (!message || !*message || sscanf(message, "%d %99[^\n]", &level, character) < 2 || level == 0) { - clif_displaymessage(fd, "Please, enter a level adjustement and a player name (usage: @charblvl <#> <nickname>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change base level only lower or same gm level - - if (level > 0) { - if (pl_sd->status.base_level == battle_config.maximum_level) { // check for max level by Valaris - clif_displaymessage(fd, msg_table[91]); // Character's base level can't go any higher. - return 0; - } // End Addition - if (level > battle_config.maximum_level || level > (battle_config.maximum_level - pl_sd->status.base_level)) // fix positiv overflow - level = battle_config.maximum_level - pl_sd->status.base_level; - for (i = 1; i <= level; i++) - pl_sd->status.status_point += (pl_sd->status.base_level + i + 14) / 4; - pl_sd->status.base_level += level; - clif_updatestatus(pl_sd, SP_BASELEVEL); - clif_updatestatus(pl_sd, SP_NEXTBASEEXP); - clif_updatestatus(pl_sd, SP_STATUSPOINT); - pc_calcstatus(pl_sd, 0); - pc_heal(pl_sd, pl_sd->status.max_hp, pl_sd->status.max_sp); - clif_misceffect(&pl_sd->bl, 0); - clif_displaymessage(fd, msg_table[65]); // Character's base level raised. - } else { - if (pl_sd->status.base_level == 1) { - clif_displaymessage(fd, msg_table[193]); // Character's base level can't go any lower. - return -1; - } - if (level < -battle_config.maximum_level || level < (1 - pl_sd->status.base_level)) // fix negativ overflow - level = 1 - pl_sd->status.base_level; - if (pl_sd->status.status_point > 0) { - for (i = 0; i > level; i--) - pl_sd->status.status_point -= (pl_sd->status.base_level + i + 14) / 4; - if (pl_sd->status.status_point < 0) - pl_sd->status.status_point = 0; - clif_updatestatus(pl_sd, SP_STATUSPOINT); - } // to add: remove status points from stats - pl_sd->status.base_level += level; - pl_sd->status.base_exp = 0; - clif_updatestatus(pl_sd, SP_BASELEVEL); - clif_updatestatus(pl_sd, SP_NEXTBASEEXP); - clif_updatestatus(pl_sd, SP_BASEEXP); - pc_calcstatus(pl_sd, 0); - clif_displaymessage(fd, msg_table[66]); // Character's base level lowered. - } - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; //正常終了 +int atcommand_character_baselevel (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + struct map_session_data *pl_sd; + char character[100]; + int level = 0, i; + + memset (character, '\0', sizeof (character)); + + if (!message || !*message + || sscanf (message, "%d %99[^\n]", &level, character) < 2 + || level == 0) + { + clif_displaymessage (fd, + "Please, enter a level adjustement and a player name (usage: @charblvl <#> <nickname>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can change base level only lower or same gm level + + if (level > 0) + { + if (pl_sd->status.base_level == battle_config.maximum_level) + { // check for max level by Valaris + clif_displaymessage (fd, msg_table[91]); // Character's base level can't go any higher. + return 0; + } // End Addition + if (level > battle_config.maximum_level || level > (battle_config.maximum_level - pl_sd->status.base_level)) // fix positiv overflow + level = + battle_config.maximum_level - + pl_sd->status.base_level; + for (i = 1; i <= level; i++) + pl_sd->status.status_point += + (pl_sd->status.base_level + i + 14) / 4; + pl_sd->status.base_level += level; + clif_updatestatus (pl_sd, SP_BASELEVEL); + clif_updatestatus (pl_sd, SP_NEXTBASEEXP); + clif_updatestatus (pl_sd, SP_STATUSPOINT); + pc_calcstatus (pl_sd, 0); + pc_heal (pl_sd, pl_sd->status.max_hp, pl_sd->status.max_sp); + clif_misceffect (&pl_sd->bl, 0); + clif_displaymessage (fd, msg_table[65]); // Character's base level raised. + } + else + { + if (pl_sd->status.base_level == 1) + { + clif_displaymessage (fd, msg_table[193]); // Character's base level can't go any lower. + return -1; + } + if (level < -battle_config.maximum_level || level < (1 - pl_sd->status.base_level)) // fix negativ overflow + level = 1 - pl_sd->status.base_level; + if (pl_sd->status.status_point > 0) + { + for (i = 0; i > level; i--) + pl_sd->status.status_point -= + (pl_sd->status.base_level + i + 14) / 4; + if (pl_sd->status.status_point < 0) + pl_sd->status.status_point = 0; + clif_updatestatus (pl_sd, SP_STATUSPOINT); + } // to add: remove status points from stats + pl_sd->status.base_level += level; + pl_sd->status.base_exp = 0; + clif_updatestatus (pl_sd, SP_BASELEVEL); + clif_updatestatus (pl_sd, SP_NEXTBASEEXP); + clif_updatestatus (pl_sd, SP_BASEEXP); + pc_calcstatus (pl_sd, 0); + clif_displaymessage (fd, msg_table[66]); // Character's base level lowered. + } + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; //正常終了 } /*========================================== * atcommand_character_joblevel @charjoblvlで対象キャラのJobレベルを上げる *------------------------------------------ */ -int atcommand_character_joblevel( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - struct map_session_data *pl_sd; - char character[100]; - int max_level = 50, level = 0; - //転生や養子の場合の元の職業を算出する - struct pc_base_job pl_s_class; - - memset(character, '\0', sizeof(character)); - - if (!message || !*message || sscanf(message, "%d %99[^\n]", &level, character) < 2 || level == 0) { - clif_displaymessage(fd, "Please, enter a level adjustement and a player name (usage: @charjlvl <#> <nickname>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - pl_s_class = pc_calc_base_job(pl_sd->status.class); - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change job level only lower or same gm level - if (pl_s_class.job == 0) - max_level -= 40; - if ((pl_s_class.job == 23) || (pl_s_class.upper == 1 && pl_s_class.type == 2)) //スパノビと転生職はJobレベルの最高が70 - max_level += 20; - - if (level > 0) { - if (pl_sd->status.job_level == max_level) { - clif_displaymessage(fd, msg_table[67]); // Character's job level can't go any higher. - return -1; - } - if (pl_sd->status.job_level + level > max_level) - level = max_level - pl_sd->status.job_level; - pl_sd->status.job_level += level; - clif_updatestatus(pl_sd, SP_JOBLEVEL); - clif_updatestatus(pl_sd, SP_NEXTJOBEXP); - pl_sd->status.skill_point += level; - clif_updatestatus(pl_sd, SP_SKILLPOINT); - pc_calcstatus(pl_sd, 0); - clif_misceffect(&pl_sd->bl, 1); - clif_displaymessage(fd, msg_table[68]); // character's job level raised. - } else { - if (pl_sd->status.job_level == 1) { - clif_displaymessage(fd, msg_table[194]); // Character's job level can't go any lower. - return -1; - } - if (pl_sd->status.job_level + level < 1) - level = 1 - pl_sd->status.job_level; - pl_sd->status.job_level += level; - clif_updatestatus(pl_sd, SP_JOBLEVEL); - clif_updatestatus(pl_sd, SP_NEXTJOBEXP); - if (pl_sd->status.skill_point > 0) { - pl_sd->status.skill_point += level; - if (pl_sd->status.skill_point < 0) - pl_sd->status.skill_point = 0; - clif_updatestatus(pl_sd, SP_SKILLPOINT); - } // to add: remove status points from skills - pc_calcstatus(pl_sd, 0); - clif_displaymessage(fd, msg_table[69]); // Character's job level lowered. - } - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_character_joblevel (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + struct map_session_data *pl_sd; + char character[100]; + int max_level = 50, level = 0; + //転生や養子の場合の元の職業を算出する + struct pc_base_job pl_s_class; + + memset (character, '\0', sizeof (character)); + + if (!message || !*message + || sscanf (message, "%d %99[^\n]", &level, character) < 2 + || level == 0) + { + clif_displaymessage (fd, + "Please, enter a level adjustement and a player name (usage: @charjlvl <#> <nickname>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + pl_s_class = pc_calc_base_job (pl_sd->status.class); + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can change job level only lower or same gm level + if (pl_s_class.job == 0) + max_level -= 40; + if ((pl_s_class.job == 23) || (pl_s_class.upper == 1 && pl_s_class.type == 2)) //スパノビと転生職はJobレベルの最高が70 + max_level += 20; + + if (level > 0) + { + if (pl_sd->status.job_level == max_level) + { + clif_displaymessage (fd, msg_table[67]); // Character's job level can't go any higher. + return -1; + } + if (pl_sd->status.job_level + level > max_level) + level = max_level - pl_sd->status.job_level; + pl_sd->status.job_level += level; + clif_updatestatus (pl_sd, SP_JOBLEVEL); + clif_updatestatus (pl_sd, SP_NEXTJOBEXP); + pl_sd->status.skill_point += level; + clif_updatestatus (pl_sd, SP_SKILLPOINT); + pc_calcstatus (pl_sd, 0); + clif_misceffect (&pl_sd->bl, 1); + clif_displaymessage (fd, msg_table[68]); // character's job level raised. + } + else + { + if (pl_sd->status.job_level == 1) + { + clif_displaymessage (fd, msg_table[194]); // Character's job level can't go any lower. + return -1; + } + if (pl_sd->status.job_level + level < 1) + level = 1 - pl_sd->status.job_level; + pl_sd->status.job_level += level; + clif_updatestatus (pl_sd, SP_JOBLEVEL); + clif_updatestatus (pl_sd, SP_NEXTJOBEXP); + if (pl_sd->status.skill_point > 0) + { + pl_sd->status.skill_point += level; + if (pl_sd->status.skill_point < 0) + pl_sd->status.skill_point = 0; + clif_updatestatus (pl_sd, SP_SKILLPOINT); + } // to add: remove status points from skills + pc_calcstatus (pl_sd, 0); + clif_displaymessage (fd, msg_table[69]); // Character's job level lowered. + } + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_kick( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_kick (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd; - char character[100]; + struct map_session_data *pl_sd; + char character[100]; - memset(character, '\0', sizeof(character)); + memset (character, '\0', sizeof (character)); - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @kick <charname>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @kick <charname>)."); + return -1; + } - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) // you can kick only lower or same gm level - clif_GM_kick(sd, pl_sd, 1); - else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) // you can kick only lower or same gm level + clif_GM_kick (sd, pl_sd, 1); + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_kickall( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_kickall (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd; - int i; - - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && - pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kick only lower or same gm level - if (sd->status.account_id != pl_sd->status.account_id) - clif_GM_kick(sd, pl_sd, 0); - } - } + struct map_session_data *pl_sd; + int i; + + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth && pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can kick only lower or same gm level + if (sd->status.account_id != pl_sd->status.account_id) + clif_GM_kick (sd, pl_sd, 0); + } + } - clif_displaymessage(fd, msg_table[195]); // All players have been kicked! + clif_displaymessage (fd, msg_table[195]); // All players have been kicked! - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_allskills( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_allskills (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - pc_allskillup(sd); // all skills - sd->status.skill_point = 0; // 0 skill points - clif_updatestatus(sd, SP_SKILLPOINT); // update - clif_displaymessage(fd, msg_table[76]); // You have received all skills. + pc_allskillup (sd); // all skills + sd->status.skill_point = 0; // 0 skill points + clif_updatestatus (sd, SP_SKILLPOINT); // update + clif_displaymessage (fd, msg_table[76]); // You have received all skills. - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_questskill( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_questskill (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int skill_id; + int skill_id; - if (!message || !*message || (skill_id = atoi(message)) < 0) { - clif_displaymessage(fd, "Please, enter a quest skill number (usage: @questskill <#:0+>)."); - return -1; - } + if (!message || !*message || (skill_id = atoi (message)) < 0) + { + clif_displaymessage (fd, + "Please, enter a quest skill number (usage: @questskill <#:0+>)."); + return -1; + } - if (skill_id >= 0 && skill_id < MAX_SKILL_DB) { - if (skill_get_inf2(skill_id) & 0x01) { - if (pc_checkskill(sd, skill_id) == 0) { - pc_skill(sd, skill_id, 1, 0); - clif_displaymessage(fd, msg_table[70]); // You have learned the skill. - } else { - clif_displaymessage(fd, msg_table[196]); // You already have this quest skill. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[198]); // This skill number doesn't exist. - return -1; - } + if (skill_id >= 0 && skill_id < MAX_SKILL_DB) + { + if (skill_get_inf2 (skill_id) & 0x01) + { + if (pc_checkskill (sd, skill_id) == 0) + { + pc_skill (sd, skill_id, 1, 0); + clif_displaymessage (fd, msg_table[70]); // You have learned the skill. + } + else + { + clif_displaymessage (fd, msg_table[196]); // You already have this quest skill. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[198]); // This skill number doesn't exist. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_charquestskill( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char character[100]; - struct map_session_data *pl_sd; - int skill_id = 0; - - memset(character, '\0', sizeof(character)); - - if (!message || !*message || sscanf(message, "%d %99[^\n]", &skill_id, character) < 2 || skill_id < 0) { - clif_displaymessage(fd, "Please, enter a quest skill number and a player name (usage: @charquestskill <#:0+> <char_name>)."); - return -1; - } - - if (skill_id >= 0 && skill_id < MAX_SKILL_DB) { - if (skill_get_inf2(skill_id) & 0x01) { - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_checkskill(pl_sd, skill_id) == 0) { - pc_skill(pl_sd, skill_id, 1, 0); - clif_displaymessage(fd, msg_table[199]); // This player has learned the skill. - } else { - clif_displaymessage(fd, msg_table[200]); // This player already has this quest skill. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[198]); // This skill number doesn't exist. - return -1; - } - - return 0; +int atcommand_charquestskill (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char character[100]; + struct map_session_data *pl_sd; + int skill_id = 0; + + memset (character, '\0', sizeof (character)); + + if (!message || !*message + || sscanf (message, "%d %99[^\n]", &skill_id, character) < 2 + || skill_id < 0) + { + clif_displaymessage (fd, + "Please, enter a quest skill number and a player name (usage: @charquestskill <#:0+> <char_name>)."); + return -1; + } + + if (skill_id >= 0 && skill_id < MAX_SKILL_DB) + { + if (skill_get_inf2 (skill_id) & 0x01) + { + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_checkskill (pl_sd, skill_id) == 0) + { + pc_skill (pl_sd, skill_id, 1, 0); + clif_displaymessage (fd, msg_table[199]); // This player has learned the skill. + } + else + { + clif_displaymessage (fd, msg_table[200]); // This player already has this quest skill. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[198]); // This skill number doesn't exist. + return -1; + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_lostskill( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_lostskill (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int skill_id; + int skill_id; - if (!message || !*message || (skill_id = atoi(message)) < 0) { - clif_displaymessage(fd, "Please, enter a quest skill number (usage: @lostskill <#:0+>)."); - return -1; - } + if (!message || !*message || (skill_id = atoi (message)) < 0) + { + clif_displaymessage (fd, + "Please, enter a quest skill number (usage: @lostskill <#:0+>)."); + return -1; + } - if (skill_id >= 0 && skill_id < MAX_SKILL) { - if (skill_get_inf2(skill_id) & 0x01) { - if (pc_checkskill(sd, skill_id) > 0) { - sd->status.skill[skill_id].lv = 0; - sd->status.skill[skill_id].flags = 0; - clif_skillinfoblock(sd); - clif_displaymessage(fd, msg_table[71]); // You have forgotten the skill. - } else { - clif_displaymessage(fd, msg_table[201]); // You don't have this quest skill. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[198]); // This skill number doesn't exist. - return -1; - } + if (skill_id >= 0 && skill_id < MAX_SKILL) + { + if (skill_get_inf2 (skill_id) & 0x01) + { + if (pc_checkskill (sd, skill_id) > 0) + { + sd->status.skill[skill_id].lv = 0; + sd->status.skill[skill_id].flags = 0; + clif_skillinfoblock (sd); + clif_displaymessage (fd, msg_table[71]); // You have forgotten the skill. + } + else + { + clif_displaymessage (fd, msg_table[201]); // You don't have this quest skill. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[198]); // This skill number doesn't exist. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_charlostskill( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char character[100]; - struct map_session_data *pl_sd; - int skill_id = 0; - - memset(character, '\0', sizeof(character)); - - if (!message || !*message || sscanf(message, "%d %99[^\n]", &skill_id, character) < 2 || skill_id < 0) { - clif_displaymessage(fd, "Please, enter a quest skill number and a player name (usage: @charlostskill <#:0+> <char_name>)."); - return -1; - } - - if (skill_id >= 0 && skill_id < MAX_SKILL) { - if (skill_get_inf2(skill_id) & 0x01) { - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_checkskill(pl_sd, skill_id) > 0) { - pl_sd->status.skill[skill_id].lv = 0; - pl_sd->status.skill[skill_id].flags = 0; - clif_skillinfoblock(pl_sd); - clif_displaymessage(fd, msg_table[202]); // This player has forgotten the skill. - } else { - clif_displaymessage(fd, msg_table[203]); // This player doesn't have this quest skill. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[198]); // This skill number doesn't exist. - return -1; - } - - return 0; +int atcommand_charlostskill (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char character[100]; + struct map_session_data *pl_sd; + int skill_id = 0; + + memset (character, '\0', sizeof (character)); + + if (!message || !*message + || sscanf (message, "%d %99[^\n]", &skill_id, character) < 2 + || skill_id < 0) + { + clif_displaymessage (fd, + "Please, enter a quest skill number and a player name (usage: @charlostskill <#:0+> <char_name>)."); + return -1; + } + + if (skill_id >= 0 && skill_id < MAX_SKILL) + { + if (skill_get_inf2 (skill_id) & 0x01) + { + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_checkskill (pl_sd, skill_id) > 0) + { + pl_sd->status.skill[skill_id].lv = 0; + pl_sd->status.skill[skill_id].flags = 0; + clif_skillinfoblock (pl_sd); + clif_displaymessage (fd, msg_table[202]); // This player has forgotten the skill. + } + else + { + clif_displaymessage (fd, msg_table[203]); // This player doesn't have this quest skill. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[197]); // This skill number doesn't exist or isn't a quest skill. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[198]); // This skill number doesn't exist. + return -1; + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_party( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_party (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char party[100]; + char party[100]; - memset(party, '\0', sizeof(party)); + memset (party, '\0', sizeof (party)); - if (!message || !*message || sscanf(message, "%99[^\n]", party) < 1) { - clif_displaymessage(fd, "Please, enter a party name (usage: @party <party_name>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", party) < 1) + { + clif_displaymessage (fd, + "Please, enter a party name (usage: @party <party_name>)."); + return -1; + } - party_create(sd, party); + party_create (sd, party); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_guild( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_guild (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char guild[100]; - int prev; + char guild[100]; + int prev; - memset(guild, '\0', sizeof(guild)); + memset (guild, '\0', sizeof (guild)); - if (!message || !*message || sscanf(message, "%99[^\n]", guild) < 1) { - clif_displaymessage(fd, "Please, enter a guild name (usage: @guild <guild_name>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", guild) < 1) + { + clif_displaymessage (fd, + "Please, enter a guild name (usage: @guild <guild_name>)."); + return -1; + } - prev = battle_config.guild_emperium_check; - battle_config.guild_emperium_check = 0; - guild_create(sd, guild); - battle_config.guild_emperium_check = prev; + prev = battle_config.guild_emperium_check; + battle_config.guild_emperium_check = 0; + guild_create (sd, guild); + battle_config.guild_emperium_check = prev; - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_agitstart( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_agitstart (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - if (agit_flag == 1) { - clif_displaymessage(fd, msg_table[73]); // Already it has started siege warfare. - return -1; - } + if (agit_flag == 1) + { + clif_displaymessage (fd, msg_table[73]); // Already it has started siege warfare. + return -1; + } - agit_flag = 1; - guild_agit_start(); - clif_displaymessage(fd, msg_table[72]); // Guild siege warfare start! + agit_flag = 1; + guild_agit_start (); + clif_displaymessage (fd, msg_table[72]); // Guild siege warfare start! - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_agitend( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_agitend (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - if (agit_flag == 0) { - clif_displaymessage(fd, msg_table[75]); // Siege warfare hasn't started yet. - return -1; - } + if (agit_flag == 0) + { + clif_displaymessage (fd, msg_table[75]); // Siege warfare hasn't started yet. + return -1; + } - agit_flag = 0; - guild_agit_end(); - clif_displaymessage(fd, msg_table[74]); // Guild siege warfare end! + agit_flag = 0; + guild_agit_end (); + clif_displaymessage (fd, msg_table[74]); // Guild siege warfare end! - return 0; + return 0; } /*========================================== * @mapexitでマップサーバーを終了させる *------------------------------------------ */ -int atcommand_mapexit( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_mapexit (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd; - int i; - - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - if (sd->status.account_id != pl_sd->status.account_id) - clif_GM_kick(sd, pl_sd, 0); - } - } - clif_GM_kick(sd, sd, 0); + struct map_session_data *pl_sd; + int i; + + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + if (sd->status.account_id != pl_sd->status.account_id) + clif_GM_kick (sd, pl_sd, 0); + } + } + clif_GM_kick (sd, sd, 0); - runflag = 0; + runflag = 0; - return 0; + return 0; } /*========================================== * idsearch <part_of_name>: revrited by [Yor] *------------------------------------------ */ -int atcommand_idsearch( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_idsearch (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char item_name[100]; - char output[200]; - int i, match; - struct item_data *item; + char item_name[100]; + char output[200]; + int i, match; + struct item_data *item; - memset(item_name, '\0', sizeof(item_name)); - memset(output, '\0', sizeof(output)); + memset (item_name, '\0', sizeof (item_name)); + memset (output, '\0', sizeof (output)); - if (!message || !*message || sscanf(message, "%99s", item_name) < 0) { - clif_displaymessage(fd, "Please, enter a part of item name (usage: @idsearch <part_of_item_name>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99s", item_name) < 0) + { + clif_displaymessage (fd, + "Please, enter a part of item name (usage: @idsearch <part_of_item_name>)."); + return -1; + } - sprintf(output, msg_table[77], item_name); // The reference result of '%s' (name: id): - clif_displaymessage(fd, output); - match = 0; - for(i = 0; i < 20000; i++) { - if ((item = itemdb_exists(i)) != NULL && strstr(item->jname, item_name) != NULL) { - match++; - sprintf(output, msg_table[78], item->jname, item->nameid); // %s: %d - clif_displaymessage(fd, output); - } - } - sprintf(output, msg_table[79], match); // It is %d affair above. - clif_displaymessage(fd, output); + sprintf (output, msg_table[77], item_name); // The reference result of '%s' (name: id): + clif_displaymessage (fd, output); + match = 0; + for (i = 0; i < 20000; i++) + { + if ((item = itemdb_exists (i)) != NULL + && strstr (item->jname, item_name) != NULL) + { + match++; + sprintf (output, msg_table[78], item->jname, item->nameid); // %s: %d + clif_displaymessage (fd, output); + } + } + sprintf (output, msg_table[79], match); // It is %d affair above. + clif_displaymessage (fd, output); - return 0; + return 0; } /*========================================== * Character Skill Reset *------------------------------------------ */ -int atcommand_charskreset( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_charskreset (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - char output[200]; - struct map_session_data *pl_sd; + char character[100]; + char output[200]; + struct map_session_data *pl_sd; - memset(character, '\0', sizeof(character)); - memset(output, '\0', sizeof(output)); + memset (character, '\0', sizeof (character)); + memset (output, '\0', sizeof (output)); - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @charskreset <charname>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @charskreset <charname>)."); + return -1; + } - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset skill points only lower or same gm level - pc_resetskill(pl_sd); - sprintf(output, msg_table[206], character); // '%s' skill points reseted! - clif_displaymessage(fd, output); - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can reset skill points only lower or same gm level + pc_resetskill (pl_sd); + sprintf (output, msg_table[206], character); // '%s' skill points reseted! + clif_displaymessage (fd, output); + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } - return 0; + return 0; } /*========================================== * Character Stat Reset *------------------------------------------ */ -int atcommand_charstreset( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_charstreset (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - char output[200]; - struct map_session_data *pl_sd; + char character[100]; + char output[200]; + struct map_session_data *pl_sd; - memset(character, '\0', sizeof(character)); - memset(output, '\0', sizeof(output)); + memset (character, '\0', sizeof (character)); + memset (output, '\0', sizeof (output)); - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @charstreset <charname>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @charstreset <charname>)."); + return -1; + } - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset stats points only lower or same gm level - pc_resetstate(pl_sd); - sprintf(output, msg_table[207], character); // '%s' stats points reseted! - clif_displaymessage(fd, output); - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can reset stats points only lower or same gm level + pc_resetstate (pl_sd); + sprintf (output, msg_table[207], character); // '%s' stats points reseted! + clif_displaymessage (fd, output); + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } - return 0; + return 0; } /*========================================== * Character Reset *------------------------------------------ */ -int atcommand_charreset( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_charreset (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - char output[200]; - struct map_session_data *pl_sd; + char character[100]; + char output[200]; + struct map_session_data *pl_sd; - memset(character, '\0', sizeof(character)); - memset(output, '\0', sizeof(output)); + memset (character, '\0', sizeof (character)); + memset (output, '\0', sizeof (output)); - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @charreset <charname>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @charreset <charname>)."); + return -1; + } - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset a character only for lower or same GM level - pc_resetstate(pl_sd); - pc_resetskill(pl_sd); - pc_setglobalreg(pl_sd, "MAGIC_FLAGS", 0); // [Fate] Reset magic quest variables - pc_setglobalreg(pl_sd, "MAGIC_EXP", 0); // [Fate] Reset magic experience - sprintf(output, msg_table[208], character); // '%s' skill and stats points reseted! - clif_displaymessage(fd, output); - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can reset a character only for lower or same GM level + pc_resetstate (pl_sd); + pc_resetskill (pl_sd); + pc_setglobalreg (pl_sd, "MAGIC_FLAGS", 0); // [Fate] Reset magic quest variables + pc_setglobalreg (pl_sd, "MAGIC_EXP", 0); // [Fate] Reset magic experience + sprintf (output, msg_table[208], character); // '%s' skill and stats points reseted! + clif_displaymessage (fd, output); + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } - return 0; + return 0; } /*========================================== * Character Wipe *------------------------------------------ */ -int atcommand_char_wipe( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char character[100]; - char output[200]; - struct map_session_data *pl_sd; - - memset(character, '\0', sizeof(character)); - memset(output, '\0', sizeof(output)); - - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @charwipe <charname>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can reset a character only for lower or same GM level - int i; - - // Reset base level - pl_sd->status.base_level = 1; - pl_sd->status.base_exp = 0; - clif_updatestatus(pl_sd, SP_BASELEVEL); - clif_updatestatus(pl_sd, SP_NEXTBASEEXP); - clif_updatestatus(pl_sd, SP_BASEEXP); - - // Reset job level - pl_sd->status.job_level = 1; - pl_sd->status.job_exp = 0; - clif_updatestatus(pl_sd, SP_JOBLEVEL); - clif_updatestatus(pl_sd, SP_NEXTJOBEXP); - clif_updatestatus(pl_sd, SP_JOBEXP); - - // Zeny to 50 - pl_sd->status.zeny = 50; - clif_updatestatus(pl_sd, SP_ZENY); - - // Clear inventory - for (i = 0; i < MAX_INVENTORY; i++) { - if (sd->status.inventory[i].amount) { - if (sd->status.inventory[i].equip) - pc_unequipitem(pl_sd, i, 0); - pc_delitem(pl_sd, i, sd->status.inventory[i].amount, 0); - } - } +int atcommand_char_wipe (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char character[100]; + char output[200]; + struct map_session_data *pl_sd; + + memset (character, '\0', sizeof (character)); + memset (output, '\0', sizeof (output)); + + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @charwipe <charname>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can reset a character only for lower or same GM level + int i; + + // Reset base level + pl_sd->status.base_level = 1; + pl_sd->status.base_exp = 0; + clif_updatestatus (pl_sd, SP_BASELEVEL); + clif_updatestatus (pl_sd, SP_NEXTBASEEXP); + clif_updatestatus (pl_sd, SP_BASEEXP); + + // Reset job level + pl_sd->status.job_level = 1; + pl_sd->status.job_exp = 0; + clif_updatestatus (pl_sd, SP_JOBLEVEL); + clif_updatestatus (pl_sd, SP_NEXTJOBEXP); + clif_updatestatus (pl_sd, SP_JOBEXP); + + // Zeny to 50 + pl_sd->status.zeny = 50; + clif_updatestatus (pl_sd, SP_ZENY); + + // Clear inventory + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].amount) + { + if (sd->status.inventory[i].equip) + pc_unequipitem (pl_sd, i, 0); + pc_delitem (pl_sd, i, sd->status.inventory[i].amount, 0); + } + } + + // Give knife and shirt + struct item item; + item.nameid = 1201; // knife + item.identify = 1; + item.broken = 0; + pc_additem (pl_sd, &item, 1); + item.nameid = 1202; // shirt + pc_additem (pl_sd, &item, 1); + + // Reset stats and skills + pc_calcstatus (pl_sd, 0); + pc_resetstate (pl_sd); + pc_resetskill (pl_sd); + pc_setglobalreg (pl_sd, "MAGIC_FLAGS", 0); // [Fate] Reset magic quest variables + pc_setglobalreg (pl_sd, "MAGIC_EXP", 0); // [Fate] Reset magic experience + + sprintf (output, "%s: wiped.", character); // '%s' skill and stats points reseted! + clif_displaymessage (fd, output); + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } - // Give knife and shirt - struct item item; - item.nameid = 1201; // knife - item.identify = 1; - item.broken = 0; - pc_additem(pl_sd, &item, 1); - item.nameid = 1202; // shirt - pc_additem(pl_sd, &item, 1); - - // Reset stats and skills - pc_calcstatus(pl_sd, 0); - pc_resetstate(pl_sd); - pc_resetskill(pl_sd); - pc_setglobalreg(pl_sd, "MAGIC_FLAGS", 0); // [Fate] Reset magic quest variables - pc_setglobalreg(pl_sd, "MAGIC_EXP", 0); // [Fate] Reset magic experience - - sprintf(output, "%s: wiped.", character); // '%s' skill and stats points reseted! - clif_displaymessage(fd, output); - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; + return 0; } /*========================================== * Character Model by chbrules *------------------------------------------ */ -int atcommand_charmodel( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - int hair_style = 0, hair_color = 0, cloth_color = 0; - struct map_session_data *pl_sd; - char character[100]; - char output[200]; - - memset(character, '\0', sizeof(character)); - memset(output, '\0', sizeof(output)); - - if (!message || !*message || sscanf(message, "%d %d %d %99[^\n]", &hair_style, &hair_color, &cloth_color, character) < 4 || hair_style < 0 || hair_color < 0 || cloth_color < 0) { - sprintf(output, "Please, enter a valid model and a player name (usage: @charmodel <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d> <name>).", - MIN_HAIR_STYLE, MAX_HAIR_STYLE, MIN_HAIR_COLOR, MAX_HAIR_COLOR, MIN_CLOTH_COLOR, MAX_CLOTH_COLOR); - clif_displaymessage(fd, output); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE && - hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR && - cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) { - - if (cloth_color != 0 && - pl_sd->status.sex == 1 && - (pl_sd->status.class == 12 || pl_sd->status.class == 17)) { - clif_displaymessage(fd, msg_table[35]); // You can't use this command with this class. - return -1; - } else { - pc_changelook(pl_sd, LOOK_HAIR, hair_style); - pc_changelook(pl_sd, LOOK_HAIR_COLOR, hair_color); - pc_changelook(pl_sd, LOOK_CLOTHES_COLOR, cloth_color); - clif_displaymessage(fd, msg_table[36]); // Appearence changed. - } - } else { - clif_displaymessage(fd, msg_table[37]); // An invalid number was specified. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_charmodel (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + int hair_style = 0, hair_color = 0, cloth_color = 0; + struct map_session_data *pl_sd; + char character[100]; + char output[200]; + + memset (character, '\0', sizeof (character)); + memset (output, '\0', sizeof (output)); + + if (!message || !*message + || sscanf (message, "%d %d %d %99[^\n]", &hair_style, &hair_color, + &cloth_color, character) < 4 || hair_style < 0 + || hair_color < 0 || cloth_color < 0) + { + sprintf (output, + "Please, enter a valid model and a player name (usage: @charmodel <hair ID: %d-%d> <hair color: %d-%d> <clothes color: %d-%d> <name>).", + MIN_HAIR_STYLE, MAX_HAIR_STYLE, MIN_HAIR_COLOR, + MAX_HAIR_COLOR, MIN_CLOTH_COLOR, MAX_CLOTH_COLOR); + clif_displaymessage (fd, output); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (hair_style >= MIN_HAIR_STYLE && hair_style <= MAX_HAIR_STYLE && + hair_color >= MIN_HAIR_COLOR && hair_color <= MAX_HAIR_COLOR && + cloth_color >= MIN_CLOTH_COLOR && cloth_color <= MAX_CLOTH_COLOR) + { + + if (cloth_color != 0 && + pl_sd->status.sex == 1 && + (pl_sd->status.class == 12 || pl_sd->status.class == 17)) + { + clif_displaymessage (fd, msg_table[35]); // You can't use this command with this class. + return -1; + } + else + { + pc_changelook (pl_sd, LOOK_HAIR, hair_style); + pc_changelook (pl_sd, LOOK_HAIR_COLOR, hair_color); + pc_changelook (pl_sd, LOOK_CLOTHES_COLOR, cloth_color); + clif_displaymessage (fd, msg_table[36]); // Appearence changed. + } + } + else + { + clif_displaymessage (fd, msg_table[37]); // An invalid number was specified. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== * Character Skill Point (Rewritten by [Yor]) *------------------------------------------ */ -int atcommand_charskpoint( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - struct map_session_data *pl_sd; - char character[100]; - int new_skill_point; - int point = 0; - - memset(character, '\0', sizeof(character)); - - if (!message || !*message || sscanf(message, "%d %99[^\n]", &point, character) < 2 || point == 0) { - clif_displaymessage(fd, "Please, enter a number and a player name (usage: @charskpoint <amount> <name>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - new_skill_point = (int)pl_sd->status.skill_point + point; - if (point > 0 && (point > 0x7FFF || new_skill_point > 0x7FFF)) // fix positiv overflow - new_skill_point = 0x7FFF; - else if (point < 0 && (point < -0x7FFF || new_skill_point < 0)) // fix negativ overflow - new_skill_point = 0; - if (new_skill_point != (int)pl_sd->status.skill_point) { - pl_sd->status.skill_point = new_skill_point; - clif_updatestatus(pl_sd, SP_SKILLPOINT); - clif_displaymessage(fd, msg_table[209]); // Character's number of skill points changed! - } else { - if (point < 0) - clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value. - else - clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_charskpoint (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + struct map_session_data *pl_sd; + char character[100]; + int new_skill_point; + int point = 0; + + memset (character, '\0', sizeof (character)); + + if (!message || !*message + || sscanf (message, "%d %99[^\n]", &point, character) < 2 + || point == 0) + { + clif_displaymessage (fd, + "Please, enter a number and a player name (usage: @charskpoint <amount> <name>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + new_skill_point = (int) pl_sd->status.skill_point + point; + if (point > 0 && (point > 0x7FFF || new_skill_point > 0x7FFF)) // fix positiv overflow + new_skill_point = 0x7FFF; + else if (point < 0 && (point < -0x7FFF || new_skill_point < 0)) // fix negativ overflow + new_skill_point = 0; + if (new_skill_point != (int) pl_sd->status.skill_point) + { + pl_sd->status.skill_point = new_skill_point; + clif_updatestatus (pl_sd, SP_SKILLPOINT); + clif_displaymessage (fd, msg_table[209]); // Character's number of skill points changed! + } + else + { + if (point < 0) + clif_displaymessage (fd, msg_table[41]); // Impossible to decrease the number/value. + else + clif_displaymessage (fd, msg_table[149]); // Impossible to increase the number/value. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== * Character Status Point (rewritten by [Yor]) *------------------------------------------ */ -int atcommand_charstpoint( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - struct map_session_data *pl_sd; - char character[100]; - int new_status_point; - int point = 0; - - memset(character, '\0', sizeof(character)); - - if (!message || !*message || sscanf(message, "%d %99[^\n]", &point, character) < 2 || point == 0) { - clif_displaymessage(fd, "Please, enter a number and a player name (usage: @charstpoint <amount> <name>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - new_status_point = (int)pl_sd->status.status_point + point; - if (point > 0 && (point > 0x7FFF || new_status_point > 0x7FFF)) // fix positiv overflow - new_status_point = 0x7FFF; - else if (point < 0 && (point < -0x7FFF || new_status_point < 0)) // fix negativ overflow - new_status_point = 0; - if (new_status_point != (int)pl_sd->status.status_point) { - pl_sd->status.status_point = new_status_point; - clif_updatestatus(pl_sd, SP_STATUSPOINT); - clif_displaymessage(fd, msg_table[210]); // Character's number of status points changed! - } else { - if (point < 0) - clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value. - else - clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_charstpoint (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + struct map_session_data *pl_sd; + char character[100]; + int new_status_point; + int point = 0; + + memset (character, '\0', sizeof (character)); + + if (!message || !*message + || sscanf (message, "%d %99[^\n]", &point, character) < 2 + || point == 0) + { + clif_displaymessage (fd, + "Please, enter a number and a player name (usage: @charstpoint <amount> <name>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + new_status_point = (int) pl_sd->status.status_point + point; + if (point > 0 && (point > 0x7FFF || new_status_point > 0x7FFF)) // fix positiv overflow + new_status_point = 0x7FFF; + else if (point < 0 && (point < -0x7FFF || new_status_point < 0)) // fix negativ overflow + new_status_point = 0; + if (new_status_point != (int) pl_sd->status.status_point) + { + pl_sd->status.status_point = new_status_point; + clif_updatestatus (pl_sd, SP_STATUSPOINT); + clif_displaymessage (fd, msg_table[210]); // Character's number of status points changed! + } + else + { + if (point < 0) + clif_displaymessage (fd, msg_table[41]); // Impossible to decrease the number/value. + else + clif_displaymessage (fd, msg_table[149]); // Impossible to increase the number/value. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== * Character Zeny Point (Rewritten by [Yor]) *------------------------------------------ */ -int atcommand_charzeny( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_charzeny (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd; - char character[100]; - int zeny = 0, new_zeny; + struct map_session_data *pl_sd; + char character[100]; + int zeny = 0, new_zeny; - memset(character, '\0', sizeof(character)); + memset (character, '\0', sizeof (character)); - if (!message || !*message || sscanf(message, "%d %99[^\n]", &zeny, character) < 2 || zeny == 0) { - clif_displaymessage(fd, "Please, enter a number and a player name (usage: @charzeny <zeny> <name>)."); - return -1; - } + if (!message || !*message + || sscanf (message, "%d %99[^\n]", &zeny, character) < 2 || zeny == 0) + { + clif_displaymessage (fd, + "Please, enter a number and a player name (usage: @charzeny <zeny> <name>)."); + return -1; + } - if ((pl_sd = map_nick2sd(character)) != NULL) { - new_zeny = pl_sd->status.zeny + zeny; - if (zeny > 0 && (zeny > MAX_ZENY || new_zeny > MAX_ZENY)) // fix positiv overflow - new_zeny = MAX_ZENY; - else if (zeny < 0 && (zeny < -MAX_ZENY || new_zeny < 0)) // fix negativ overflow - new_zeny = 0; - if (new_zeny != pl_sd->status.zeny) { - pl_sd->status.zeny = new_zeny; - clif_updatestatus(pl_sd, SP_ZENY); - clif_displaymessage(fd, msg_table[211]); // Character's number of zenys changed! - } else { - if (zeny < 0) - clif_displaymessage(fd, msg_table[41]); // Impossible to decrease the number/value. - else - clif_displaymessage(fd, msg_table[149]); // Impossible to increase the number/value. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } + if ((pl_sd = map_nick2sd (character)) != NULL) + { + new_zeny = pl_sd->status.zeny + zeny; + if (zeny > 0 && (zeny > MAX_ZENY || new_zeny > MAX_ZENY)) // fix positiv overflow + new_zeny = MAX_ZENY; + else if (zeny < 0 && (zeny < -MAX_ZENY || new_zeny < 0)) // fix negativ overflow + new_zeny = 0; + if (new_zeny != pl_sd->status.zeny) + { + pl_sd->status.zeny = new_zeny; + clif_updatestatus (pl_sd, SP_ZENY); + clif_displaymessage (fd, msg_table[211]); // Character's number of zenys changed! + } + else + { + if (zeny < 0) + clif_displaymessage (fd, msg_table[41]); // Impossible to decrease the number/value. + else + clif_displaymessage (fd, msg_table[149]); // Impossible to increase the number/value. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } - return 0; + return 0; } /*========================================== * Recall All Characters Online To Your Location *------------------------------------------ */ -int atcommand_recallall( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_recallall (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd; - int i; - int count; - char output[200]; + struct map_session_data *pl_sd; + int i; + int count; + char output[200]; - memset(output, '\0', sizeof(output)); + memset (output, '\0', sizeof (output)); - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp somenone to your actual map."); - return -1; - } + if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp somenone to your actual map."); + return -1; + } - count = 0; - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && sd->status.account_id != pl_sd->status.account_id && - pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can recall only lower or same level - if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) - count++; - else - pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2); - } - } + count = 0; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth + && sd->status.account_id != pl_sd->status.account_id + && pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can recall only lower or same level + if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + count++; + else + pc_setpos (pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2); + } + } - clif_displaymessage(fd, msg_table[92]); // All characters recalled! - if (count) { - sprintf(output, "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", count); - clif_displaymessage(fd, output); - } + clif_displaymessage (fd, msg_table[92]); // All characters recalled! + if (count) + { + sprintf (output, + "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", + count); + clif_displaymessage (fd, output); + } - return 0; + return 0; } /*========================================== * Recall online characters of a guild to your location *------------------------------------------ */ -int atcommand_guildrecall( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - struct map_session_data *pl_sd; - int i; - char guild_name[100]; - char output[200]; - struct guild *g; - int count; - - memset(guild_name, '\0', sizeof(guild_name)); - memset(output, '\0', sizeof(output)); - - if (!message || !*message || sscanf(message, "%99[^\n]", guild_name) < 1) { - clif_displaymessage(fd, "Please, enter a guild name/id (usage: @guildrecall <guild_name/id>)."); - return -1; - } - - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp somenone to your actual map."); - return -1; - } - - if ((g = guild_searchname(guild_name)) != NULL || // name first to avoid error when name begin with a number - (g = guild_search(atoi(message))) != NULL) { - count = 0; - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && - sd->status.account_id != pl_sd->status.account_id && - pl_sd->status.guild_id == g->guild_id) { - if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) - count++; - else - pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2); - } - } - sprintf(output, msg_table[93], g->name); // All online characters of the %s guild are near you. - clif_displaymessage(fd, output); - if (count) { - sprintf(output, "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", count); - clif_displaymessage(fd, output); - } - } else { - clif_displaymessage(fd, msg_table[94]); // Incorrect name/ID, or no one from the guild is online. - return -1; - } - - return 0; +int atcommand_guildrecall (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + struct map_session_data *pl_sd; + int i; + char guild_name[100]; + char output[200]; + struct guild *g; + int count; + + memset (guild_name, '\0', sizeof (guild_name)); + memset (output, '\0', sizeof (output)); + + if (!message || !*message || sscanf (message, "%99[^\n]", guild_name) < 1) + { + clif_displaymessage (fd, + "Please, enter a guild name/id (usage: @guildrecall <guild_name/id>)."); + return -1; + } + + if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp somenone to your actual map."); + return -1; + } + + if ((g = guild_searchname (guild_name)) != NULL || // name first to avoid error when name begin with a number + (g = guild_search (atoi (message))) != NULL) + { + count = 0; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth + && sd->status.account_id != pl_sd->status.account_id + && pl_sd->status.guild_id == g->guild_id) + { + if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + count++; + else + pc_setpos (pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2); + } + } + sprintf (output, msg_table[93], g->name); // All online characters of the %s guild are near you. + clif_displaymessage (fd, output); + if (count) + { + sprintf (output, + "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", + count); + clif_displaymessage (fd, output); + } + } + else + { + clif_displaymessage (fd, msg_table[94]); // Incorrect name/ID, or no one from the guild is online. + return -1; + } + + return 0; } /*========================================== * Recall online characters of a party to your location *------------------------------------------ */ -int atcommand_partyrecall( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - int i; - struct map_session_data *pl_sd; - char party_name[100]; - char output[200]; - struct party *p; - int count; - - memset(party_name, '\0', sizeof(party_name)); - memset(output, '\0', sizeof(output)); - - if (!message || !*message || sscanf(message, "%99[^\n]", party_name) < 1) { - clif_displaymessage(fd, "Please, enter a party name/id (usage: @partyrecall <party_name/id>)."); - return -1; - } - - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp somenone to your actual map."); - return -1; - } - - if ((p = party_searchname(party_name)) != NULL || // name first to avoid error when name begin with a number - (p = party_search(atoi(message))) != NULL) { - count = 0; - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && - sd->status.account_id != pl_sd->status.account_id && - pl_sd->status.party_id == p->party_id) { - if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) - count++; - else - pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2); - } - } - sprintf(output, msg_table[95], p->name); // All online characters of the %s party are near you. - clif_displaymessage(fd, output); - if (count) { - sprintf(output, "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", count); - clif_displaymessage(fd, output); - } - } else { - clif_displaymessage(fd, msg_table[96]); // Incorrect name or ID, or no one from the party is online. - return -1; - } - - return 0; +int atcommand_partyrecall (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + int i; + struct map_session_data *pl_sd; + char party_name[100]; + char output[200]; + struct party *p; + int count; + + memset (party_name, '\0', sizeof (party_name)); + memset (output, '\0', sizeof (output)); + + if (!message || !*message || sscanf (message, "%99[^\n]", party_name) < 1) + { + clif_displaymessage (fd, + "Please, enter a party name/id (usage: @partyrecall <party_name/id>)."); + return -1; + } + + if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp somenone to your actual map."); + return -1; + } + + if ((p = party_searchname (party_name)) != NULL || // name first to avoid error when name begin with a number + (p = party_search (atoi (message))) != NULL) + { + count = 0; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth + && sd->status.account_id != pl_sd->status.account_id + && pl_sd->status.party_id == p->party_id) + { + if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarp + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + count++; + else + pc_setpos (pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2); + } + } + sprintf (output, msg_table[95], p->name); // All online characters of the %s party are near you. + clif_displaymessage (fd, output); + if (count) + { + sprintf (output, + "Because you are not authorised to warp from some maps, %d player(s) have not been recalled.", + count); + clif_displaymessage (fd, output); + } + } + else + { + clif_displaymessage (fd, msg_table[96]); // Incorrect name or ID, or no one from the party is online. + return -1; + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_reloaditemdb( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_reloaditemdb (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - itemdb_reload(); - clif_displaymessage(fd, msg_table[97]); // Item database reloaded. + itemdb_reload (); + clif_displaymessage (fd, msg_table[97]); // Item database reloaded. - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_reloadmobdb( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_reloadmobdb (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - mob_reload(); - clif_displaymessage(fd, msg_table[98]); // Monster database reloaded. + mob_reload (); + clif_displaymessage (fd, msg_table[98]); // Monster database reloaded. - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_reloadskilldb( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_reloadskilldb (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - skill_reload(); - clif_displaymessage(fd, msg_table[99]); // Skill database reloaded. + skill_reload (); + clif_displaymessage (fd, msg_table[99]); // Skill database reloaded. - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_reloadscript( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_reloadscript (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - do_init_npc(); - do_init_script(); + do_init_npc (); + do_init_script (); - npc_event_do_oninit(); + npc_event_do_oninit (); - clif_displaymessage(fd, msg_table[100]); // Scripts reloaded. + clif_displaymessage (fd, msg_table[100]); // Scripts reloaded. - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_reloadgmdb( // by [Yor] - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_reloadgmdb ( // by [Yor] + const int fd, struct map_session_data *sd, + const char *command, const char *message) { - chrif_reloadGMdb(); + chrif_reloadGMdb (); - clif_displaymessage(fd, msg_table[101]); // Login-server asked to reload GM accounts and their level. + clif_displaymessage (fd, msg_table[101]); // Login-server asked to reload GM accounts and their level. - return 0; + return 0; } /*========================================== @@ -4924,416 +5833,513 @@ int atcommand_reloadgmdb( // by [Yor] * 3 = Shows the shops/chats in that map (not implemented) *------------------------------------------ */ -int atcommand_mapinfo( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - struct map_session_data *pl_sd; - struct npc_data *nd = NULL; - struct chat_data *cd = NULL; - char output[200], map_name[100]; - char direction[12]; - int m_id, i, chat_num, list = 0; - - memset(output, '\0', sizeof(output)); - memset(map_name, '\0', sizeof(map_name)); - memset(direction, '\0', sizeof(direction)); - - sscanf(message, "%d %99[^\n]", &list, map_name); - - if (list < 0 || list > 3) { - clif_displaymessage(fd, "Please, enter at least a valid list number (usage: @mapinfo <0-3> [map])."); - return -1; - } - - if (map_name[0] == '\0') - strcpy(map_name, sd->mapname); - if (strstr(map_name, ".gat") == NULL && strstr(map_name, ".afm") == NULL && strlen(map_name) < 13) // 16 - 4 (.gat) - strcat(map_name, ".gat"); - - if ((m_id = map_mapname2mapid(map_name)) < 0) { - clif_displaymessage(fd, msg_table[1]); // Map not found. - return -1; - } - - clif_displaymessage(fd, "------ Map Info ------"); - sprintf(output, "Map Name: %s", map_name); - clif_displaymessage(fd, output); - sprintf(output, "Players In Map: %d", map[m_id].users); - clif_displaymessage(fd, output); - sprintf(output, "NPCs In Map: %d", map[m_id].npc_num); - clif_displaymessage(fd, output); - chat_num = 0; - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && - (cd = (struct chat_data*)map_id2bl(pl_sd->chatID))) { - chat_num++; - } - } - sprintf(output, "Chats In Map: %d", chat_num); - clif_displaymessage(fd, output); - clif_displaymessage(fd, "------ Map Flags ------"); - sprintf(output, "Player vs Player: %s | No Guild: %s | No Party: %s", - (map[m_id].flag.pvp) ? "True" : "False", - (map[m_id].flag.pvp_noguild) ? "True" : "False", - (map[m_id].flag.pvp_noparty) ? "True" : "False"); - clif_displaymessage(fd, output); - sprintf(output, "Guild vs Guild: %s | No Party: %s", (map[m_id].flag.gvg) ? "True" : "False", (map[m_id].flag.gvg_noparty) ? "True" : "False"); - clif_displaymessage(fd, output); - sprintf(output, "No Dead Branch: %s", (map[m_id].flag.nobranch) ? "True" : "False"); - clif_displaymessage(fd, output); - sprintf(output, "No Memo: %s", (map[m_id].flag.nomemo) ? "True" : "False"); - clif_displaymessage(fd, output); - sprintf(output, "No Penalty: %s", (map[m_id].flag.nopenalty) ? "True" : "False"); - clif_displaymessage(fd, output); - sprintf(output, "No Return: %s", (map[m_id].flag.noreturn) ? "True" : "False"); - clif_displaymessage(fd, output); - sprintf(output, "No Save: %s", (map[m_id].flag.nosave) ? "True" : "False"); - clif_displaymessage(fd, output); - sprintf(output, "No Teleport: %s", (map[m_id].flag.noteleport) ? "True" : "False"); - clif_displaymessage(fd, output); - sprintf(output, "No Monster Teleport: %s", (map[m_id].flag.monster_noteleport) ? "True" : "False"); - clif_displaymessage(fd, output); - sprintf(output, "No Zeny Penalty: %s", (map[m_id].flag.nozenypenalty) ? "True" : "False"); - clif_displaymessage(fd, output); - - switch (list) { - case 0: - // Do nothing. It's list 0, no additional display. - break; - case 1: - clif_displaymessage(fd, "----- Players in Map -----"); - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && strcmp(pl_sd->mapname, map_name) == 0) { - sprintf(output, "Player '%s' (session #%d) | Location: %d,%d", - pl_sd->status.name, i, pl_sd->bl.x, pl_sd->bl.y); - clif_displaymessage(fd, output); - } - } - break; - case 2: - clif_displaymessage(fd, "----- NPCs in Map -----"); - for (i = 0; i < map[m_id].npc_num;) { - nd = map[m_id].npc[i]; - switch(nd->dir) { - case 0: strcpy(direction, "North"); break; - case 1: strcpy(direction, "North West"); break; - case 2: strcpy(direction, "West"); break; - case 3: strcpy(direction, "South West"); break; - case 4: strcpy(direction, "South"); break; - case 5: strcpy(direction, "South East"); break; - case 6: strcpy(direction, "East"); break; - case 7: strcpy(direction, "North East"); break; - case 9: strcpy(direction, "North"); break; - default: strcpy(direction, "Unknown"); break; - } - sprintf(output, "NPC %d: %s | Direction: %s | Sprite: %d | Location: %d %d", - ++i, nd->name, direction, nd->class, nd->bl.x, nd->bl.y); - clif_displaymessage(fd, output); - } - break; - case 3: - clif_displaymessage(fd, "----- Chats in Map -----"); - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth && - (cd = (struct chat_data*)map_id2bl(pl_sd->chatID)) && - strcmp(pl_sd->mapname, map_name) == 0 && - cd->usersd[0] == pl_sd) { - sprintf(output, "Chat %d: %s | Player: %s | Location: %d %d", - i, cd->title, pl_sd->status.name, cd->bl.x, cd->bl.y); - clif_displaymessage(fd, output); - sprintf(output, " Users: %d/%d | Password: %s | Public: %s", - cd->users, cd->limit, cd->pass, (cd->pub) ? "Yes" : "No"); - clif_displaymessage(fd, output); - } - } - break; - default: // normally impossible to arrive here - clif_displaymessage(fd, "Please, enter at least a valid list number (usage: @mapinfo <0-3> [map])."); - return -1; - break; - } - - return 0; +int atcommand_mapinfo (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + struct map_session_data *pl_sd; + struct npc_data *nd = NULL; + struct chat_data *cd = NULL; + char output[200], map_name[100]; + char direction[12]; + int m_id, i, chat_num, list = 0; + + memset (output, '\0', sizeof (output)); + memset (map_name, '\0', sizeof (map_name)); + memset (direction, '\0', sizeof (direction)); + + sscanf (message, "%d %99[^\n]", &list, map_name); + + if (list < 0 || list > 3) + { + clif_displaymessage (fd, + "Please, enter at least a valid list number (usage: @mapinfo <0-3> [map])."); + return -1; + } + + if (map_name[0] == '\0') + strcpy (map_name, sd->mapname); + if (strstr (map_name, ".gat") == NULL && strstr (map_name, ".afm") == NULL && strlen (map_name) < 13) // 16 - 4 (.gat) + strcat (map_name, ".gat"); + + if ((m_id = map_mapname2mapid (map_name)) < 0) + { + clif_displaymessage (fd, msg_table[1]); // Map not found. + return -1; + } + + clif_displaymessage (fd, "------ Map Info ------"); + sprintf (output, "Map Name: %s", map_name); + clif_displaymessage (fd, output); + sprintf (output, "Players In Map: %d", map[m_id].users); + clif_displaymessage (fd, output); + sprintf (output, "NPCs In Map: %d", map[m_id].npc_num); + clif_displaymessage (fd, output); + chat_num = 0; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth + && (cd = (struct chat_data *) map_id2bl (pl_sd->chatID))) + { + chat_num++; + } + } + sprintf (output, "Chats In Map: %d", chat_num); + clif_displaymessage (fd, output); + clif_displaymessage (fd, "------ Map Flags ------"); + sprintf (output, "Player vs Player: %s | No Guild: %s | No Party: %s", + (map[m_id].flag.pvp) ? "True" : "False", + (map[m_id].flag.pvp_noguild) ? "True" : "False", + (map[m_id].flag.pvp_noparty) ? "True" : "False"); + clif_displaymessage (fd, output); + sprintf (output, "Guild vs Guild: %s | No Party: %s", + (map[m_id].flag.gvg) ? "True" : "False", + (map[m_id].flag.gvg_noparty) ? "True" : "False"); + clif_displaymessage (fd, output); + sprintf (output, "No Dead Branch: %s", + (map[m_id].flag.nobranch) ? "True" : "False"); + clif_displaymessage (fd, output); + sprintf (output, "No Memo: %s", + (map[m_id].flag.nomemo) ? "True" : "False"); + clif_displaymessage (fd, output); + sprintf (output, "No Penalty: %s", + (map[m_id].flag.nopenalty) ? "True" : "False"); + clif_displaymessage (fd, output); + sprintf (output, "No Return: %s", + (map[m_id].flag.noreturn) ? "True" : "False"); + clif_displaymessage (fd, output); + sprintf (output, "No Save: %s", + (map[m_id].flag.nosave) ? "True" : "False"); + clif_displaymessage (fd, output); + sprintf (output, "No Teleport: %s", + (map[m_id].flag.noteleport) ? "True" : "False"); + clif_displaymessage (fd, output); + sprintf (output, "No Monster Teleport: %s", + (map[m_id].flag.monster_noteleport) ? "True" : "False"); + clif_displaymessage (fd, output); + sprintf (output, "No Zeny Penalty: %s", + (map[m_id].flag.nozenypenalty) ? "True" : "False"); + clif_displaymessage (fd, output); + + switch (list) + { + case 0: + // Do nothing. It's list 0, no additional display. + break; + case 1: + clif_displaymessage (fd, "----- Players in Map -----"); + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth + && strcmp (pl_sd->mapname, map_name) == 0) + { + sprintf (output, + "Player '%s' (session #%d) | Location: %d,%d", + pl_sd->status.name, i, pl_sd->bl.x, pl_sd->bl.y); + clif_displaymessage (fd, output); + } + } + break; + case 2: + clif_displaymessage (fd, "----- NPCs in Map -----"); + for (i = 0; i < map[m_id].npc_num;) + { + nd = map[m_id].npc[i]; + switch (nd->dir) + { + case 0: + strcpy (direction, "North"); + break; + case 1: + strcpy (direction, "North West"); + break; + case 2: + strcpy (direction, "West"); + break; + case 3: + strcpy (direction, "South West"); + break; + case 4: + strcpy (direction, "South"); + break; + case 5: + strcpy (direction, "South East"); + break; + case 6: + strcpy (direction, "East"); + break; + case 7: + strcpy (direction, "North East"); + break; + case 9: + strcpy (direction, "North"); + break; + default: + strcpy (direction, "Unknown"); + break; + } + sprintf (output, + "NPC %d: %s | Direction: %s | Sprite: %d | Location: %d %d", + ++i, nd->name, direction, nd->class, nd->bl.x, + nd->bl.y); + clif_displaymessage (fd, output); + } + break; + case 3: + clif_displaymessage (fd, "----- Chats in Map -----"); + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth + && (cd = (struct chat_data *) map_id2bl (pl_sd->chatID)) + && strcmp (pl_sd->mapname, map_name) == 0 + && cd->usersd[0] == pl_sd) + { + sprintf (output, + "Chat %d: %s | Player: %s | Location: %d %d", i, + cd->title, pl_sd->status.name, cd->bl.x, + cd->bl.y); + clif_displaymessage (fd, output); + sprintf (output, + " Users: %d/%d | Password: %s | Public: %s", + cd->users, cd->limit, cd->pass, + (cd->pub) ? "Yes" : "No"); + clif_displaymessage (fd, output); + } + } + break; + default: // normally impossible to arrive here + clif_displaymessage (fd, + "Please, enter at least a valid list number (usage: @mapinfo <0-3> [map])."); + return -1; + break; + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_mount_peco( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - if (sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] - clif_displaymessage(fd, msg_table[212]); // Cannot mount a Peco while in disguise. - return -1; - } - - if (!pc_isriding(sd)) { // if actually no peco - if (sd->status.class == 7 || sd->status.class == 14 || sd->status.class == 4008 || sd->status.class == 4015) { - if (sd->status.class == 7) - sd->status.class = sd->view_class = 13; - else if (sd->status.class == 14) - sd->status.class = sd->view_class = 21; - else if (sd->status.class == 4008) - sd->status.class = sd->view_class = 4014; - else if (sd->status.class == 4015) - sd->status.class = sd->view_class = 4022; - pc_setoption(sd, sd->status.option | 0x0020); - clif_displaymessage(fd, msg_table[102]); // Mounted Peco. - } else { - clif_displaymessage(fd, msg_table[213]); // You can not mount a peco with your job. - return -1; - } - } else { - if (sd->status.class == 13) - sd->status.class = sd->view_class = 7; - else if (sd->status.class == 21) - sd->status.class = sd->view_class = 14; - else if (sd->status.class == 4014) - sd->status.class = sd->view_class = 4008; - else if (sd->status.class == 4022) - sd->status.class = sd->view_class = 4015; - pc_setoption(sd, sd->status.option & ~0x0020); - clif_displaymessage(fd, msg_table[214]); // Unmounted Peco. - } - - return 0; +int atcommand_mount_peco (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + if (sd->disguise > 0) + { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] + clif_displaymessage (fd, msg_table[212]); // Cannot mount a Peco while in disguise. + return -1; + } + + if (!pc_isriding (sd)) + { // if actually no peco + if (sd->status.class == 7 || sd->status.class == 14 + || sd->status.class == 4008 || sd->status.class == 4015) + { + if (sd->status.class == 7) + sd->status.class = sd->view_class = 13; + else if (sd->status.class == 14) + sd->status.class = sd->view_class = 21; + else if (sd->status.class == 4008) + sd->status.class = sd->view_class = 4014; + else if (sd->status.class == 4015) + sd->status.class = sd->view_class = 4022; + pc_setoption (sd, sd->status.option | 0x0020); + clif_displaymessage (fd, msg_table[102]); // Mounted Peco. + } + else + { + clif_displaymessage (fd, msg_table[213]); // You can not mount a peco with your job. + return -1; + } + } + else + { + if (sd->status.class == 13) + sd->status.class = sd->view_class = 7; + else if (sd->status.class == 21) + sd->status.class = sd->view_class = 14; + else if (sd->status.class == 4014) + sd->status.class = sd->view_class = 4008; + else if (sd->status.class == 4022) + sd->status.class = sd->view_class = 4015; + pc_setoption (sd, sd->status.option & ~0x0020); + clif_displaymessage (fd, msg_table[214]); // Unmounted Peco. + } + + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_char_mount_peco( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char character[100]; - struct map_session_data *pl_sd; - - memset(character, '\0', sizeof(character)); - - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @charmountpeco <char_name>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pl_sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] - clif_displaymessage(fd, msg_table[215]); // This player cannot mount a Peco while in disguise. - return -1; - } - - if (!pc_isriding(pl_sd)) { // if actually no peco - if (pl_sd->status.class == 7 || pl_sd->status.class == 14 || pl_sd->status.class == 4008 || pl_sd->status.class == 4015) { - if (pl_sd->status.class == 7) - pl_sd->status.class = pl_sd->view_class = 13; - else if (pl_sd->status.class == 14) - pl_sd->status.class = pl_sd->view_class = 21; - else if (pl_sd->status.class == 4008) - pl_sd->status.class = pl_sd->view_class = 4014; - else if (pl_sd->status.class == 4015) - pl_sd->status.class = pl_sd->view_class = 4022; - pc_setoption(pl_sd, pl_sd->status.option | 0x0020); - clif_displaymessage(fd, msg_table[216]); // Now, this player mounts a peco. - } else { - clif_displaymessage(fd, msg_table[217]); // This player can not mount a peco with his/her job. - return -1; - } - } else { - if (pl_sd->status.class == 13) - pl_sd->status.class = pl_sd->view_class = 7; - else if (pl_sd->status.class == 21) - pl_sd->status.class = pl_sd->view_class = 14; - else if (pl_sd->status.class == 4014) - pl_sd->status.class = pl_sd->view_class = 4008; - else if (pl_sd->status.class == 4022) - pl_sd->status.class = pl_sd->view_class = 4015; - pc_setoption(pl_sd, pl_sd->status.option & ~0x0020); - clif_displaymessage(fd, msg_table[218]); // Now, this player has not more peco. - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_char_mount_peco (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char character[100]; + struct map_session_data *pl_sd; + + memset (character, '\0', sizeof (character)); + + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @charmountpeco <char_name>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pl_sd->disguise > 0) + { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] + clif_displaymessage (fd, msg_table[215]); // This player cannot mount a Peco while in disguise. + return -1; + } + + if (!pc_isriding (pl_sd)) + { // if actually no peco + if (pl_sd->status.class == 7 || pl_sd->status.class == 14 + || pl_sd->status.class == 4008 || pl_sd->status.class == 4015) + { + if (pl_sd->status.class == 7) + pl_sd->status.class = pl_sd->view_class = 13; + else if (pl_sd->status.class == 14) + pl_sd->status.class = pl_sd->view_class = 21; + else if (pl_sd->status.class == 4008) + pl_sd->status.class = pl_sd->view_class = 4014; + else if (pl_sd->status.class == 4015) + pl_sd->status.class = pl_sd->view_class = 4022; + pc_setoption (pl_sd, pl_sd->status.option | 0x0020); + clif_displaymessage (fd, msg_table[216]); // Now, this player mounts a peco. + } + else + { + clif_displaymessage (fd, msg_table[217]); // This player can not mount a peco with his/her job. + return -1; + } + } + else + { + if (pl_sd->status.class == 13) + pl_sd->status.class = pl_sd->view_class = 7; + else if (pl_sd->status.class == 21) + pl_sd->status.class = pl_sd->view_class = 14; + else if (pl_sd->status.class == 4014) + pl_sd->status.class = pl_sd->view_class = 4008; + else if (pl_sd->status.class == 4022) + pl_sd->status.class = pl_sd->view_class = 4015; + pc_setoption (pl_sd, pl_sd->status.option & ~0x0020); + clif_displaymessage (fd, msg_table[218]); // Now, this player has not more peco. + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== *Spy Commands by Syrus22 *------------------------------------------ */ -int atcommand_guildspy( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_guildspy (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char guild_name[100]; - char output[200]; - struct guild *g; + char guild_name[100]; + char output[200]; + struct guild *g; - memset(guild_name, '\0', sizeof(guild_name)); - memset(output, '\0', sizeof(output)); + memset (guild_name, '\0', sizeof (guild_name)); + memset (output, '\0', sizeof (output)); - if (!message || !*message || sscanf(message, "%99[^\n]", guild_name) < 1) { - clif_displaymessage(fd, "Please, enter a guild name/id (usage: @guildspy <guild_name/id>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", guild_name) < 1) + { + clif_displaymessage (fd, + "Please, enter a guild name/id (usage: @guildspy <guild_name/id>)."); + return -1; + } - if ((g = guild_searchname(guild_name)) != NULL || // name first to avoid error when name begin with a number - (g = guild_search(atoi(message))) != NULL) { - if (sd->guildspy == g->guild_id) { - sd->guildspy = 0; - sprintf(output, msg_table[103], g->name); // No longer spying on the %s guild. - clif_displaymessage(fd, output); - } else { - sd->guildspy = g->guild_id; - sprintf(output, msg_table[104], g->name); // Spying on the %s guild. - clif_displaymessage(fd, output); - } - } else { - clif_displaymessage(fd, msg_table[94]); // Incorrect name/ID, or no one from the guild is online. - return -1; - } + if ((g = guild_searchname (guild_name)) != NULL || // name first to avoid error when name begin with a number + (g = guild_search (atoi (message))) != NULL) + { + if (sd->guildspy == g->guild_id) + { + sd->guildspy = 0; + sprintf (output, msg_table[103], g->name); // No longer spying on the %s guild. + clif_displaymessage (fd, output); + } + else + { + sd->guildspy = g->guild_id; + sprintf (output, msg_table[104], g->name); // Spying on the %s guild. + clif_displaymessage (fd, output); + } + } + else + { + clif_displaymessage (fd, msg_table[94]); // Incorrect name/ID, or no one from the guild is online. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_partyspy( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_partyspy (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char party_name[100]; - char output[200]; - struct party *p; + char party_name[100]; + char output[200]; + struct party *p; - memset(party_name, '\0', sizeof(party_name)); - memset(output, '\0', sizeof(output)); + memset (party_name, '\0', sizeof (party_name)); + memset (output, '\0', sizeof (output)); - if (!message || !*message || sscanf(message, "%99[^\n]", party_name) < 1) { - clif_displaymessage(fd, "Please, enter a party name/id (usage: @partyspy <party_name/id>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", party_name) < 1) + { + clif_displaymessage (fd, + "Please, enter a party name/id (usage: @partyspy <party_name/id>)."); + return -1; + } - if ((p = party_searchname(party_name)) != NULL || // name first to avoid error when name begin with a number - (p = party_search(atoi(message))) != NULL) { - if (sd->partyspy == p->party_id) { - sd->partyspy = 0; - sprintf(output, msg_table[105], p->name); // No longer spying on the %s party. - clif_displaymessage(fd, output); - } else { - sd->partyspy = p->party_id; - sprintf(output, msg_table[106], p->name); // Spying on the %s party. - clif_displaymessage(fd, output); - } - } else { - clif_displaymessage(fd, msg_table[96]); // Incorrect name or ID, or no one from the party is online. - return -1; - } + if ((p = party_searchname (party_name)) != NULL || // name first to avoid error when name begin with a number + (p = party_search (atoi (message))) != NULL) + { + if (sd->partyspy == p->party_id) + { + sd->partyspy = 0; + sprintf (output, msg_table[105], p->name); // No longer spying on the %s party. + clif_displaymessage (fd, output); + } + else + { + sd->partyspy = p->party_id; + sprintf (output, msg_table[106], p->name); // Spying on the %s party. + clif_displaymessage (fd, output); + } + } + else + { + clif_displaymessage (fd, msg_table[96]); // Incorrect name or ID, or no one from the party is online. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_enablenpc(const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_enablenpc (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char NPCname[100]; + char NPCname[100]; - memset(NPCname, '\0', sizeof(NPCname)); + memset (NPCname, '\0', sizeof (NPCname)); - if (!message || !*message || sscanf(message, "%99[^\n]", NPCname) < 1) { - clif_displaymessage(fd, "Please, enter a NPC name (usage: @npcon <NPC_name>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", NPCname) < 1) + { + clif_displaymessage (fd, + "Please, enter a NPC name (usage: @npcon <NPC_name>)."); + return -1; + } - if (npc_name2id(NPCname) != NULL) { - npc_enable(NPCname, 1); - clif_displaymessage(fd, msg_table[110]); // Npc Enabled. - } else { - clif_displaymessage(fd, msg_table[111]); // This NPC doesn't exist. - return -1; - } + if (npc_name2id (NPCname) != NULL) + { + npc_enable (NPCname, 1); + clif_displaymessage (fd, msg_table[110]); // Npc Enabled. + } + else + { + clif_displaymessage (fd, msg_table[111]); // This NPC doesn't exist. + return -1; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_disablenpc(const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_disablenpc (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char NPCname[100]; + char NPCname[100]; - memset(NPCname, '\0', sizeof(NPCname)); + memset (NPCname, '\0', sizeof (NPCname)); - if (!message || !*message || sscanf(message, "%99[^\n]", NPCname) < 1) { - clif_displaymessage(fd, "Please, enter a NPC name (usage: @npcoff <NPC_name>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", NPCname) < 1) + { + clif_displaymessage (fd, + "Please, enter a NPC name (usage: @npcoff <NPC_name>)."); + return -1; + } - if (npc_name2id(NPCname) != NULL) { - npc_enable(NPCname, 0); - clif_displaymessage(fd, msg_table[112]); // Npc Disabled. - } else { - clif_displaymessage(fd, msg_table[111]); // This NPC doesn't exist. - return -1; - } + if (npc_name2id (NPCname) != NULL) + { + npc_enable (NPCname, 0); + clif_displaymessage (fd, msg_table[112]); // Npc Disabled. + } + else + { + clif_displaymessage (fd, msg_table[111]); // This NPC doesn't exist. + return -1; + } - return 0; + return 0; } /*========================================== * time in txt for time command (by [Yor]) *------------------------------------------ */ -char * txt_time(unsigned int duration) { - int days, hours, minutes, seconds; - char temp[256]; - static char temp1[256]; +char *txt_time (unsigned int duration) +{ + int days, hours, minutes, seconds; + char temp[256]; + static char temp1[256]; - memset(temp, '\0', sizeof(temp)); - memset(temp1, '\0', sizeof(temp1)); + memset (temp, '\0', sizeof (temp)); + memset (temp1, '\0', sizeof (temp1)); - if (duration < 0) - duration = 0; + if (duration < 0) + duration = 0; - days = duration / (60 * 60 * 24); - duration = duration - (60 * 60 * 24 * days); - hours = duration / (60 * 60); - duration = duration - (60 * 60 * hours); - minutes = duration / 60; - seconds = duration - (60 * minutes); + days = duration / (60 * 60 * 24); + duration = duration - (60 * 60 * 24 * days); + hours = duration / (60 * 60); + duration = duration - (60 * 60 * hours); + minutes = duration / 60; + seconds = duration - (60 * minutes); - if (days < 2) - sprintf(temp, msg_table[219], days); // %d day - else - sprintf(temp, msg_table[220], days); // %d days - if (hours < 2) - sprintf(temp1, msg_table[221], temp, hours); // %s %d hour - else - sprintf(temp1, msg_table[222], temp, hours); // %s %d hours - if (minutes < 2) - sprintf(temp, msg_table[223], temp1, minutes); // %s %d minute - else - sprintf(temp, msg_table[224], temp1, minutes); // %s %d minutes - if (seconds < 2) - sprintf(temp1, msg_table[225], temp, seconds); // %s and %d second - else - sprintf(temp1, msg_table[226], temp, seconds); // %s and %d seconds + if (days < 2) + sprintf (temp, msg_table[219], days); // %d day + else + sprintf (temp, msg_table[220], days); // %d days + if (hours < 2) + sprintf (temp1, msg_table[221], temp, hours); // %s %d hour + else + sprintf (temp1, msg_table[222], temp, hours); // %s %d hours + if (minutes < 2) + sprintf (temp, msg_table[223], temp1, minutes); // %s %d minute + else + sprintf (temp, msg_table[224], temp1, minutes); // %s %d minutes + if (seconds < 2) + sprintf (temp1, msg_table[225], temp, seconds); // %s and %d second + else + sprintf (temp1, msg_table[226], temp, seconds); // %s and %d seconds - return temp1; + return temp1; } /*========================================== @@ -5341,73 +6347,83 @@ char * txt_time(unsigned int duration) { * Calculation management of GM modification (@day/@night GM commands) is done *------------------------------------------ */ -int atcommand_servertime(const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - struct TimerData * timer_data; - struct TimerData * timer_data2; - time_t time_server; // variable for number of seconds (used with time() function) - struct tm *datetime; // variable for time in structure ->tm_mday, ->tm_sec, ... - char temp[256]; - - memset(temp, '\0', sizeof(temp)); - - time(&time_server); // get time in seconds since 1/1/1970 - datetime = gmtime(&time_server); // convert seconds in structure - // like sprintf, but only for date/time (Sunday, November 02 2003 15:12:52) - strftime(temp, sizeof(temp)-1, msg_table[230], datetime); // Server time (normal time): %A, %B %d %Y %X. - clif_displaymessage(fd, temp); - - if (battle_config.night_duration == 0 && battle_config.day_duration == 0) { - if (night_flag == 0) - clif_displaymessage(fd, msg_table[231]); // Game time: The game is in permanent daylight. - else - clif_displaymessage(fd, msg_table[232]); // Game time: The game is in permanent night. - } else if (battle_config.night_duration == 0) - if (night_flag == 1) { // we start with night - timer_data = get_timer(day_timer_tid); - sprintf(temp, msg_table[233], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in night for %s. - clif_displaymessage(fd, temp); - clif_displaymessage(fd, msg_table[234]); // Game time: After, the game will be in permanent daylight. - } else - clif_displaymessage(fd, msg_table[231]); // Game time: The game is in permanent daylight. - else if (battle_config.day_duration == 0) - if (night_flag == 0) { // we start with day - timer_data = get_timer(night_timer_tid); - sprintf(temp, msg_table[235], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in daylight for %s. - clif_displaymessage(fd, temp); - clif_displaymessage(fd, msg_table[236]); // Game time: After, the game will be in permanent night. - } else - clif_displaymessage(fd, msg_table[232]); // Game time: The game is in permanent night. - else { - if (night_flag == 0) { - timer_data = get_timer(night_timer_tid); - timer_data2 = get_timer(day_timer_tid); - sprintf(temp, msg_table[235], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in daylight for %s. - clif_displaymessage(fd, temp); - if (timer_data->tick > timer_data2->tick) - sprintf(temp, msg_table[237], txt_time((timer_data->interval - abs(timer_data->tick - timer_data2->tick)) / 1000)); // Game time: After, the game will be in night for %s. - else - sprintf(temp, msg_table[237], txt_time(abs(timer_data->tick - timer_data2->tick) / 1000)); // Game time: After, the game will be in night for %s. - clif_displaymessage(fd, temp); - sprintf(temp, msg_table[238], txt_time(timer_data->interval / 1000)); // Game time: A day cycle has a normal duration of %s. - clif_displaymessage(fd, temp); - } else { - timer_data = get_timer(day_timer_tid); - timer_data2 = get_timer(night_timer_tid); - sprintf(temp, msg_table[233], txt_time((timer_data->tick - gettick()) / 1000)); // Game time: The game is actualy in night for %s. - clif_displaymessage(fd, temp); - if (timer_data->tick > timer_data2->tick) - sprintf(temp, msg_table[239], txt_time((timer_data->interval - abs(timer_data->tick - timer_data2->tick)) / 1000)); // Game time: After, the game will be in daylight for %s. - else - sprintf(temp, msg_table[239], txt_time(abs(timer_data->tick - timer_data2->tick) / 1000)); // Game time: After, the game will be in daylight for %s. - clif_displaymessage(fd, temp); - sprintf(temp, msg_table[238], txt_time(timer_data->interval / 1000)); // Game time: A day cycle has a normal duration of %s. - clif_displaymessage(fd, temp); - } - } - - return 0; +int atcommand_servertime (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + struct TimerData *timer_data; + struct TimerData *timer_data2; + time_t time_server; // variable for number of seconds (used with time() function) + struct tm *datetime; // variable for time in structure ->tm_mday, ->tm_sec, ... + char temp[256]; + + memset (temp, '\0', sizeof (temp)); + + time (&time_server); // get time in seconds since 1/1/1970 + datetime = gmtime (&time_server); // convert seconds in structure + // like sprintf, but only for date/time (Sunday, November 02 2003 15:12:52) + strftime (temp, sizeof (temp) - 1, msg_table[230], datetime); // Server time (normal time): %A, %B %d %Y %X. + clif_displaymessage (fd, temp); + + if (battle_config.night_duration == 0 && battle_config.day_duration == 0) + { + if (night_flag == 0) + clif_displaymessage (fd, msg_table[231]); // Game time: The game is in permanent daylight. + else + clif_displaymessage (fd, msg_table[232]); // Game time: The game is in permanent night. + } + else if (battle_config.night_duration == 0) + if (night_flag == 1) + { // we start with night + timer_data = get_timer (day_timer_tid); + sprintf (temp, msg_table[233], txt_time ((timer_data->tick - gettick ()) / 1000)); // Game time: The game is actualy in night for %s. + clif_displaymessage (fd, temp); + clif_displaymessage (fd, msg_table[234]); // Game time: After, the game will be in permanent daylight. + } + else + clif_displaymessage (fd, msg_table[231]); // Game time: The game is in permanent daylight. + else if (battle_config.day_duration == 0) + if (night_flag == 0) + { // we start with day + timer_data = get_timer (night_timer_tid); + sprintf (temp, msg_table[235], txt_time ((timer_data->tick - gettick ()) / 1000)); // Game time: The game is actualy in daylight for %s. + clif_displaymessage (fd, temp); + clif_displaymessage (fd, msg_table[236]); // Game time: After, the game will be in permanent night. + } + else + clif_displaymessage (fd, msg_table[232]); // Game time: The game is in permanent night. + else + { + if (night_flag == 0) + { + timer_data = get_timer (night_timer_tid); + timer_data2 = get_timer (day_timer_tid); + sprintf (temp, msg_table[235], txt_time ((timer_data->tick - gettick ()) / 1000)); // Game time: The game is actualy in daylight for %s. + clif_displaymessage (fd, temp); + if (timer_data->tick > timer_data2->tick) + sprintf (temp, msg_table[237], txt_time ((timer_data->interval - abs (timer_data->tick - timer_data2->tick)) / 1000)); // Game time: After, the game will be in night for %s. + else + sprintf (temp, msg_table[237], txt_time (abs (timer_data->tick - timer_data2->tick) / 1000)); // Game time: After, the game will be in night for %s. + clif_displaymessage (fd, temp); + sprintf (temp, msg_table[238], txt_time (timer_data->interval / 1000)); // Game time: A day cycle has a normal duration of %s. + clif_displaymessage (fd, temp); + } + else + { + timer_data = get_timer (day_timer_tid); + timer_data2 = get_timer (night_timer_tid); + sprintf (temp, msg_table[233], txt_time ((timer_data->tick - gettick ()) / 1000)); // Game time: The game is actualy in night for %s. + clif_displaymessage (fd, temp); + if (timer_data->tick > timer_data2->tick) + sprintf (temp, msg_table[239], txt_time ((timer_data->interval - abs (timer_data->tick - timer_data2->tick)) / 1000)); // Game time: After, the game will be in daylight for %s. + else + sprintf (temp, msg_table[239], txt_time (abs (timer_data->tick - timer_data2->tick) / 1000)); // Game time: After, the game will be in daylight for %s. + clif_displaymessage (fd, temp); + sprintf (temp, msg_table[238], txt_time (timer_data->interval / 1000)); // Game time: A day cycle has a normal duration of %s. + clif_displaymessage (fd, temp); + } + } + + return 0; } /*========================================== @@ -5417,66 +6433,83 @@ int atcommand_servertime(const int fd, struct map_session_data* sd, * Inspired from a old command created by RoVeRT *------------------------------------------ */ -int atcommand_chardelitem(const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - struct map_session_data *pl_sd; - char character[100]; - char item_name[100]; - int i, number = 0, item_id, item_position, count; - char output[200]; - struct item_data *item_data; - - memset(character, '\0', sizeof(character)); - memset(item_name, '\0', sizeof(item_name)); - memset(output, '\0', sizeof(output)); - - if (!message || !*message || sscanf(message, "%s %d %99[^\n]", item_name, &number, character) < 3 || number < 1) { - clif_displaymessage(fd, "Please, enter an item name/id, a quantity and a player name (usage: @chardelitem <item_name_or_ID> <quantity> <player>)."); - return -1; - } - - item_id = 0; - if ((item_data = itemdb_searchname(item_name)) != NULL || - (item_data = itemdb_exists(atoi(item_name))) != NULL) - item_id = item_data->nameid; - - if (item_id > 500) { - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can kill only lower or same level - item_position = pc_search_inventory(pl_sd, item_id); - if (item_position >= 0) { - count = 0; - for(i = 0; i < number && item_position >= 0; i++) { - pc_delitem(pl_sd, item_position, 1, 0); - count++; - item_position = pc_search_inventory(pl_sd, item_id); // for next loop - } - sprintf(output, msg_table[113], count); // %d item(s) removed by a GM. - clif_displaymessage(pl_sd->fd, output); - if (number == count) - sprintf(output, msg_table[114], count); // %d item(s) removed from the player. - else - sprintf(output, msg_table[115], count, count, number); // %d item(s) removed. Player had only %d on %d items. - clif_displaymessage(fd, output); - } else { - clif_displaymessage(fd, msg_table[116]); // Character does not have the item. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[19]); // Invalid item ID or name. - return -1; - } - - return 0; +int atcommand_chardelitem (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + struct map_session_data *pl_sd; + char character[100]; + char item_name[100]; + int i, number = 0, item_id, item_position, count; + char output[200]; + struct item_data *item_data; + + memset (character, '\0', sizeof (character)); + memset (item_name, '\0', sizeof (item_name)); + memset (output, '\0', sizeof (output)); + + if (!message || !*message + || sscanf (message, "%s %d %99[^\n]", item_name, &number, + character) < 3 || number < 1) + { + clif_displaymessage (fd, + "Please, enter an item name/id, a quantity and a player name (usage: @chardelitem <item_name_or_ID> <quantity> <player>)."); + return -1; + } + + item_id = 0; + if ((item_data = itemdb_searchname (item_name)) != NULL || + (item_data = itemdb_exists (atoi (item_name))) != NULL) + item_id = item_data->nameid; + + if (item_id > 500) + { + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can kill only lower or same level + item_position = pc_search_inventory (pl_sd, item_id); + if (item_position >= 0) + { + count = 0; + for (i = 0; i < number && item_position >= 0; i++) + { + pc_delitem (pl_sd, item_position, 1, 0); + count++; + item_position = pc_search_inventory (pl_sd, item_id); // for next loop + } + sprintf (output, msg_table[113], count); // %d item(s) removed by a GM. + clif_displaymessage (pl_sd->fd, output); + if (number == count) + sprintf (output, msg_table[114], count); // %d item(s) removed from the player. + else + sprintf (output, msg_table[115], count, count, number); // %d item(s) removed. Player had only %d on %d items. + clif_displaymessage (fd, output); + } + else + { + clif_displaymessage (fd, msg_table[116]); // Character does not have the item. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[19]); // Invalid item ID or name. + return -1; + } + + return 0; } /*========================================== @@ -5484,51 +6517,62 @@ int atcommand_chardelitem(const int fd, struct map_session_data* sd, * Special warp! No check with nowarp and nowarpto flag *------------------------------------------ */ -int atcommand_jail( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char character[100]; - struct map_session_data *pl_sd; - int x, y; - - memset(character, '\0', sizeof(character)); - - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @jail <char_name>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can jail only lower or same GM - switch(MRAND(2)) { - case 0: - x = 24; - y = 75; - break; - default: - x = 49; - y = 75; - break; - } - if (pc_setpos(pl_sd, "sec_pri.gat", x, y, 3) == 0) { - pc_setsavepoint(pl_sd, "sec_pri.gat", x, y); // Save Char Respawn Point in the jail room [Lupus] - clif_displaymessage(pl_sd->fd, msg_table[117]); // GM has send you in jails. - clif_displaymessage(fd, msg_table[118]); // Player warped in jails. - } else { - clif_displaymessage(fd, msg_table[1]); // Map not found. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_jail (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char character[100]; + struct map_session_data *pl_sd; + int x, y; + + memset (character, '\0', sizeof (character)); + + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @jail <char_name>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can jail only lower or same GM + switch (MRAND (2)) + { + case 0: + x = 24; + y = 75; + break; + default: + x = 49; + y = 75; + break; + } + if (pc_setpos (pl_sd, "sec_pri.gat", x, y, 3) == 0) + { + pc_setsavepoint (pl_sd, "sec_pri.gat", x, y); // Save Char Respawn Point in the jail room [Lupus] + clif_displaymessage (pl_sd->fd, msg_table[117]); // GM has send you in jails. + clif_displaymessage (fd, msg_table[118]); // Player warped in jails. + } + else + { + clif_displaymessage (fd, msg_table[1]); // Map not found. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== @@ -5536,512 +6580,609 @@ int atcommand_jail( * Special warp! No check with nowarp and nowarpto flag *------------------------------------------ */ -int atcommand_unjail( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_unjail (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - struct map_session_data *pl_sd; + char character[100]; + struct map_session_data *pl_sd; - memset(character, '\0', sizeof(character)); + memset (character, '\0', sizeof (character)); - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @unjail/@discharge <char_name>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @unjail/@discharge <char_name>)."); + return -1; + } - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can jail only lower or same GM - if (pl_sd->bl.m != map_mapname2mapid("sec_pri.gat")) { - clif_displaymessage(fd, msg_table[119]); // This player is not in jails. - return -1; - } else if (pc_setpos(pl_sd, "prontera.gat", 156, 191, 3) == 0) { - pc_setsavepoint(pl_sd, "prontera.gat", 156, 191); // Save char respawn point in Prontera - clif_displaymessage(pl_sd->fd, msg_table[120]); // GM has discharge you. - clif_displaymessage(fd, msg_table[121]); // Player warped to Prontera. - } else { - clif_displaymessage(fd, msg_table[1]); // Map not found. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can jail only lower or same GM + if (pl_sd->bl.m != map_mapname2mapid ("sec_pri.gat")) + { + clif_displaymessage (fd, msg_table[119]); // This player is not in jails. + return -1; + } + else if (pc_setpos (pl_sd, "prontera.gat", 156, 191, 3) == 0) + { + pc_setsavepoint (pl_sd, "prontera.gat", 156, 191); // Save char respawn point in Prontera + clif_displaymessage (pl_sd->fd, msg_table[120]); // GM has discharge you. + clif_displaymessage (fd, msg_table[121]); // Player warped to Prontera. + } + else + { + clif_displaymessage (fd, msg_table[1]); // Map not found. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } - return 0; + return 0; } /*========================================== * @disguise <mob_id> by [Valaris] (simplified by [Yor]) *------------------------------------------ */ -int atcommand_disguise( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_disguise (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int mob_id; - - if (!message || !*message) { - clif_displaymessage(fd, "Please, enter a Monster/NPC name/id (usage: @disguise <monster_name_or_monster_ID>)."); - return -1; - } + int mob_id; - if ((mob_id = mobdb_searchname(message)) == 0) // check name first (to avoid possible name begining by a number) - mob_id = atoi(message); + if (!message || !*message) + { + clif_displaymessage (fd, + "Please, enter a Monster/NPC name/id (usage: @disguise <monster_name_or_monster_ID>)."); + return -1; + } - if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC - (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC - (mob_id >= 813 && mob_id <= 834) || // NPC - (mob_id > 1000 && mob_id < 1521)) { // monsters - if (pc_isriding(sd)) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] - clif_displaymessage(fd, msg_table[227]); // Cannot wear disguise while riding a Peco. - return -1; - } - sd->disguiseflag = 1; // set to override items with disguise script [Valaris] - sd->disguise = mob_id; - pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3); - clif_displaymessage(fd, msg_table[122]); // Disguise applied. - } else { - clif_displaymessage(fd, msg_table[123]); // Monster/NPC name/id hasn't been found. - return -1; - } + if ((mob_id = mobdb_searchname (message)) == 0) // check name first (to avoid possible name begining by a number) + mob_id = atoi (message); + + if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC + (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC + (mob_id >= 813 && mob_id <= 834) || // NPC + (mob_id > 1000 && mob_id < 1521)) + { // monsters + if (pc_isriding (sd)) + { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] + clif_displaymessage (fd, msg_table[227]); // Cannot wear disguise while riding a Peco. + return -1; + } + sd->disguiseflag = 1; // set to override items with disguise script [Valaris] + sd->disguise = mob_id; + pc_setpos (sd, sd->mapname, sd->bl.x, sd->bl.y, 3); + clif_displaymessage (fd, msg_table[122]); // Disguise applied. + } + else + { + clif_displaymessage (fd, msg_table[123]); // Monster/NPC name/id hasn't been found. + return -1; + } - return 0; + return 0; } /*========================================== * @undisguise by [Yor] *------------------------------------------ */ -int atcommand_undisguise( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_undisguise (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - if (sd->disguise) { - clif_clearchar(&sd->bl, 9); - sd->disguise = 0; - pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3); - clif_displaymessage(fd, msg_table[124]); // Undisguise applied. - } else { - clif_displaymessage(fd, msg_table[125]); // You're not disguised. - return -1; - } + if (sd->disguise) + { + clif_clearchar (&sd->bl, 9); + sd->disguise = 0; + pc_setpos (sd, sd->mapname, sd->bl.x, sd->bl.y, 3); + clif_displaymessage (fd, msg_table[124]); // Undisguise applied. + } + else + { + clif_displaymessage (fd, msg_table[125]); // You're not disguised. + return -1; + } - return 0; + return 0; } /*========================================== * @broadcast by [Valaris] *------------------------------------------ */ -int atcommand_broadcast( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_broadcast (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char output[200]; + char output[200]; - memset(output, '\0', sizeof(output)); + memset (output, '\0', sizeof (output)); - if (!message || !*message) { - clif_displaymessage(fd, "Please, enter a message (usage: @broadcast <message>)."); - return -1; - } + if (!message || !*message) + { + clif_displaymessage (fd, + "Please, enter a message (usage: @broadcast <message>)."); + return -1; + } - snprintf(output, 199, "%s : %s", sd->status.name, message); - intif_GMmessage(output, strlen(output) + 1, 0); + snprintf (output, 199, "%s : %s", sd->status.name, message); + intif_GMmessage (output, strlen (output) + 1, 0); - return 0; + return 0; } /*========================================== * @localbroadcast by [Valaris] *------------------------------------------ */ -int atcommand_localbroadcast( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_localbroadcast (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char output[200]; + char output[200]; - memset(output, '\0', sizeof(output)); + memset (output, '\0', sizeof (output)); - if (!message || !*message) { - clif_displaymessage(fd, "Please, enter a message (usage: @localbroadcast <message>)."); - return -1; - } + if (!message || !*message) + { + clif_displaymessage (fd, + "Please, enter a message (usage: @localbroadcast <message>)."); + return -1; + } - snprintf(output, 199, "%s : %s", sd->status.name, message); + snprintf (output, 199, "%s : %s", sd->status.name, message); - clif_GMmessage(&sd->bl, output, strlen(output) + 1, 1); // 1: ALL_SAMEMAP + clif_GMmessage (&sd->bl, output, strlen (output) + 1, 1); // 1: ALL_SAMEMAP - return 0; + return 0; } /*========================================== * @ignorelist by [Yor] *------------------------------------------ */ -int atcommand_ignorelist( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_ignorelist (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char output[200]; - int count; - int i; + char output[200]; + int count; + int i; - memset(output, '\0', sizeof(output)); + memset (output, '\0', sizeof (output)); - count = 0; - for(i = 0; i < (int)(sizeof(sd->ignore) / sizeof(sd->ignore[0])); i++) - if (sd->ignore[i].name[0]) - count++; + count = 0; + for (i = 0; i < (int) (sizeof (sd->ignore) / sizeof (sd->ignore[0])); i++) + if (sd->ignore[i].name[0]) + count++; - if (sd->ignoreAll == 0) - if (count == 0) - clif_displaymessage(fd, msg_table[126]); // You accept any wisp (no wisper is refused). - else { - sprintf(output, msg_table[127], count); // You accept any wisp, except thoses from %d player(s): - clif_displaymessage(fd, output); - } - else - if (count == 0) - clif_displaymessage(fd, msg_table[128]); // You refuse all wisps (no specifical wisper is refused). - else { - sprintf(output, msg_table[129], count); // You refuse all wisps, AND refuse wisps from %d player(s): - clif_displaymessage(fd, output); - } + if (sd->ignoreAll == 0) + if (count == 0) + clif_displaymessage (fd, msg_table[126]); // You accept any wisp (no wisper is refused). + else + { + sprintf (output, msg_table[127], count); // You accept any wisp, except thoses from %d player(s): + clif_displaymessage (fd, output); + } + else if (count == 0) + clif_displaymessage (fd, msg_table[128]); // You refuse all wisps (no specifical wisper is refused). + else + { + sprintf (output, msg_table[129], count); // You refuse all wisps, AND refuse wisps from %d player(s): + clif_displaymessage (fd, output); + } - if (count > 0) - for(i = 0; i < (int)(sizeof(sd->ignore) / sizeof(sd->ignore[0])); i++) - if (sd->ignore[i].name[0]) - clif_displaymessage(fd, sd->ignore[i].name); + if (count > 0) + for (i = 0; i < (int) (sizeof (sd->ignore) / sizeof (sd->ignore[0])); + i++) + if (sd->ignore[i].name[0]) + clif_displaymessage (fd, sd->ignore[i].name); - return 0; + return 0; } /*========================================== * @charignorelist <player_name> by [Yor] *------------------------------------------ */ -int atcommand_charignorelist( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char character[100]; - struct map_session_data *pl_sd; - char output[200]; - int count; - int i; - - memset(character, '\0', sizeof(character)); - memset(output, '\0', sizeof(output)); - - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @charignorelist <char name>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - count = 0; - for(i = 0; i < (int)(sizeof(pl_sd->ignore) / sizeof(pl_sd->ignore[0])); i++) - if (pl_sd->ignore[i].name[0]) - count++; - - if (pl_sd->ignoreAll == 0) - if (count == 0) { - sprintf(output, msg_table[130], pl_sd->status.name); // '%s' accept any wisp (no wisper is refused). - clif_displaymessage(fd, output); - } else { - sprintf(output, msg_table[131], pl_sd->status.name, count); // '%s' accept any wisp, except thoses from %d player(s): - clif_displaymessage(fd, output); - } - else - if (count == 0) { - sprintf(output, msg_table[132], pl_sd->status.name); // '%s' refuse all wisps (no specifical wisper is refused). - clif_displaymessage(fd, output); - } else { - sprintf(output, msg_table[133], pl_sd->status.name, count); // '%s' refuse all wisps, AND refuse wisps from %d player(s): - clif_displaymessage(fd, output); - } - - if (count > 0) - for(i = 0; i < (int)(sizeof(pl_sd->ignore) / sizeof(pl_sd->ignore[0])); i++) - if (pl_sd->ignore[i].name[0]) - clif_displaymessage(fd, pl_sd->ignore[i].name); - - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_charignorelist (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char character[100]; + struct map_session_data *pl_sd; + char output[200]; + int count; + int i; + + memset (character, '\0', sizeof (character)); + memset (output, '\0', sizeof (output)); + + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @charignorelist <char name>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + count = 0; + for (i = 0; + i < (int) (sizeof (pl_sd->ignore) / sizeof (pl_sd->ignore[0])); + i++) + if (pl_sd->ignore[i].name[0]) + count++; + + if (pl_sd->ignoreAll == 0) + if (count == 0) + { + sprintf (output, msg_table[130], pl_sd->status.name); // '%s' accept any wisp (no wisper is refused). + clif_displaymessage (fd, output); + } + else + { + sprintf (output, msg_table[131], pl_sd->status.name, count); // '%s' accept any wisp, except thoses from %d player(s): + clif_displaymessage (fd, output); + } + else if (count == 0) + { + sprintf (output, msg_table[132], pl_sd->status.name); // '%s' refuse all wisps (no specifical wisper is refused). + clif_displaymessage (fd, output); + } + else + { + sprintf (output, msg_table[133], pl_sd->status.name, count); // '%s' refuse all wisps, AND refuse wisps from %d player(s): + clif_displaymessage (fd, output); + } + + if (count > 0) + for (i = 0; + i < + (int) (sizeof (pl_sd->ignore) / sizeof (pl_sd->ignore[0])); + i++) + if (pl_sd->ignore[i].name[0]) + clif_displaymessage (fd, pl_sd->ignore[i].name); + + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== * @inall <player_name> by [Yor] *------------------------------------------ */ -int atcommand_inall( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char character[100]; - char output[200]; - struct map_session_data *pl_sd; - - memset(character, '\0', sizeof(character)); - memset(output, '\0', sizeof(output)); - - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @inall <char name>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change wisp option only to lower or same level - if (pl_sd->ignoreAll == 0) { - sprintf(output, msg_table[134], pl_sd->status.name); // '%s' already accepts all wispers. - clif_displaymessage(fd, output); - return -1; - } else { - pl_sd->ignoreAll = 0; - sprintf(output, msg_table[135], pl_sd->status.name); // '%s' now accepts all wispers. - clif_displaymessage(fd, output); - // message to player - clif_displaymessage(pl_sd->fd, msg_table[136]); // A GM has authorised all wispers for you. - WFIFOW(pl_sd->fd,0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail - WFIFOB(pl_sd->fd,2) = 1; - WFIFOB(pl_sd->fd,3) = 0; // success - WFIFOSET(pl_sd->fd, 4); // packet_len_table[0x0d2] - } - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_inall (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char character[100]; + char output[200]; + struct map_session_data *pl_sd; + + memset (character, '\0', sizeof (character)); + memset (output, '\0', sizeof (output)); + + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @inall <char name>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can change wisp option only to lower or same level + if (pl_sd->ignoreAll == 0) + { + sprintf (output, msg_table[134], pl_sd->status.name); // '%s' already accepts all wispers. + clif_displaymessage (fd, output); + return -1; + } + else + { + pl_sd->ignoreAll = 0; + sprintf (output, msg_table[135], pl_sd->status.name); // '%s' now accepts all wispers. + clif_displaymessage (fd, output); + // message to player + clif_displaymessage (pl_sd->fd, msg_table[136]); // A GM has authorised all wispers for you. + WFIFOW (pl_sd->fd, 0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail + WFIFOB (pl_sd->fd, 2) = 1; + WFIFOB (pl_sd->fd, 3) = 0; // success + WFIFOSET (pl_sd->fd, 4); // packet_len_table[0x0d2] + } + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== * @exall <player_name> by [Yor] *------------------------------------------ */ -int atcommand_exall( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char character[100]; - char output[200]; - struct map_session_data *pl_sd; - - memset(character, '\0', sizeof(character)); - memset(output, '\0', sizeof(output)); - - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @exall <char name>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change wisp option only to lower or same level - if (pl_sd->ignoreAll == 1) { - sprintf(output, msg_table[137], pl_sd->status.name); // '%s' already blocks all wispers. - clif_displaymessage(fd, output); - return -1; - } else { - pl_sd->ignoreAll = 1; - sprintf(output, msg_table[138], pl_sd->status.name); // '%s' blocks now all wispers. - clif_displaymessage(fd, output); - // message to player - clif_displaymessage(pl_sd->fd, msg_table[139]); // A GM has blocked all wispers for you. - WFIFOW(pl_sd->fd,0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail - WFIFOB(pl_sd->fd,2) = 0; - WFIFOB(pl_sd->fd,3) = 0; // success - WFIFOSET(pl_sd->fd,4); // packet_len_table[0x0d2] - } - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_exall (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char character[100]; + char output[200]; + struct map_session_data *pl_sd; + + memset (character, '\0', sizeof (character)); + memset (output, '\0', sizeof (output)); + + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @exall <char name>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can change wisp option only to lower or same level + if (pl_sd->ignoreAll == 1) + { + sprintf (output, msg_table[137], pl_sd->status.name); // '%s' already blocks all wispers. + clif_displaymessage (fd, output); + return -1; + } + else + { + pl_sd->ignoreAll = 1; + sprintf (output, msg_table[138], pl_sd->status.name); // '%s' blocks now all wispers. + clif_displaymessage (fd, output); + // message to player + clif_displaymessage (pl_sd->fd, msg_table[139]); // A GM has blocked all wispers for you. + WFIFOW (pl_sd->fd, 0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail + WFIFOB (pl_sd->fd, 2) = 0; + WFIFOB (pl_sd->fd, 3) = 0; // success + WFIFOSET (pl_sd->fd, 4); // packet_len_table[0x0d2] + } + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== * @chardisguise <mob_id> <character> by Kalaspuff (based off Valaris' and Yor's work) *------------------------------------------ */ -int atcommand_chardisguise( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - int mob_id; - char character[100]; - char mob_name[100]; - struct map_session_data* pl_sd; - - memset(character, '\0', sizeof(character)); - memset(mob_name, '\0', sizeof(mob_name)); - - if (!message || !*message || sscanf(message, "%s %99[^\n]", mob_name, character) < 2) { - clif_displaymessage(fd, "Please, enter a Monster/NPC name/id and a player name (usage: @chardisguise <monster_name_or_monster_ID> <char name>)."); - return -1; - } - - if ((mob_id = mobdb_searchname(mob_name)) == 0) // check name first (to avoid possible name begining by a number) - mob_id = atoi(mob_name); - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can disguise only lower or same level - if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC - (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC - (mob_id >= 813 && mob_id <= 834) || // NPC - (mob_id > 1000 && mob_id < 1521)) { // monsters - if (pc_isriding(pl_sd)) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] - clif_displaymessage(fd, msg_table[228]); // Character cannot wear disguise while riding a Peco. - return -1; - } - pl_sd->disguiseflag = 1; // set to override items with disguise script [Valaris] - pl_sd->disguise = mob_id; - pc_setpos(pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3); - clif_displaymessage(fd, msg_table[140]); // Character's disguise applied. - } else { - clif_displaymessage(fd, msg_table[123]); // Monster/NPC name/id hasn't been found. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +int atcommand_chardisguise (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + int mob_id; + char character[100]; + char mob_name[100]; + struct map_session_data *pl_sd; + + memset (character, '\0', sizeof (character)); + memset (mob_name, '\0', sizeof (mob_name)); + + if (!message || !*message + || sscanf (message, "%s %99[^\n]", mob_name, character) < 2) + { + clif_displaymessage (fd, + "Please, enter a Monster/NPC name/id and a player name (usage: @chardisguise <monster_name_or_monster_ID> <char name>)."); + return -1; + } + + if ((mob_id = mobdb_searchname (mob_name)) == 0) // check name first (to avoid possible name begining by a number) + mob_id = atoi (mob_name); + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can disguise only lower or same level + if ((mob_id >= 46 && mob_id <= 125) || (mob_id >= 700 && mob_id <= 718) || // NPC + (mob_id >= 721 && mob_id <= 755) || (mob_id >= 757 && mob_id <= 811) || // NPC + (mob_id >= 813 && mob_id <= 834) || // NPC + (mob_id > 1000 && mob_id < 1521)) + { // monsters + if (pc_isriding (pl_sd)) + { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] + clif_displaymessage (fd, msg_table[228]); // Character cannot wear disguise while riding a Peco. + return -1; + } + pl_sd->disguiseflag = 1; // set to override items with disguise script [Valaris] + pl_sd->disguise = mob_id; + pc_setpos (pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, + 3); + clif_displaymessage (fd, msg_table[140]); // Character's disguise applied. + } + else + { + clif_displaymessage (fd, msg_table[123]); // Monster/NPC name/id hasn't been found. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== * @charundisguise <character> by Kalaspuff (based off Yor's work) *------------------------------------------ */ -int atcommand_charundisguise( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_charundisguise (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - struct map_session_data* pl_sd; + char character[100]; + struct map_session_data *pl_sd; - memset(character, '\0', sizeof(character)); + memset (character, '\0', sizeof (character)); - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @charundisguise <char name>)."); - return -1; - } + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @charundisguise <char name>)."); + return -1; + } - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can undisguise only lower or same level - if (pl_sd->disguise) { - clif_clearchar(&pl_sd->bl, 9); - pl_sd->disguise = 0; - pc_setpos(pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3); - clif_displaymessage(fd, msg_table[141]); // Character's undisguise applied. - } else { - clif_displaymessage(fd, msg_table[142]); // Character is not disguised. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can undisguise only lower or same level + if (pl_sd->disguise) + { + clif_clearchar (&pl_sd->bl, 9); + pl_sd->disguise = 0; + pc_setpos (pl_sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, + 3); + clif_displaymessage (fd, msg_table[141]); // Character's undisguise applied. + } + else + { + clif_displaymessage (fd, msg_table[142]); // Character is not disguised. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } - return 0; + return 0; } /*========================================== * @email <actual@email> <new@email> by [Yor] *------------------------------------------ */ -int atcommand_email( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_email (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char actual_email[100]; - char new_email[100]; + char actual_email[100]; + char new_email[100]; - memset(actual_email, '\0', sizeof(actual_email)); - memset(new_email, '\0', sizeof(new_email)); + memset (actual_email, '\0', sizeof (actual_email)); + memset (new_email, '\0', sizeof (new_email)); - if (!message || !*message || sscanf(message, "%99s %99s", actual_email, new_email) < 2) { - clif_displaymessage(fd, "Please enter 2 emails (usage: @email <actual@email> <new@email>)."); - return -1; - } + if (!message || !*message + || sscanf (message, "%99s %99s", actual_email, new_email) < 2) + { + clif_displaymessage (fd, + "Please enter 2 emails (usage: @email <actual@email> <new@email>)."); + return -1; + } - if (e_mail_check(actual_email) == 0) { - clif_displaymessage(fd, msg_table[144]); // Invalid actual email. If you have default e-mail, give a@a.com. - return -1; - } else if (e_mail_check(new_email) == 0) { - clif_displaymessage(fd, msg_table[145]); // Invalid new email. Please enter a real e-mail. - return -1; - } else if (strcmpi(new_email, "a@a.com") == 0) { - clif_displaymessage(fd, msg_table[146]); // New email must be a real e-mail. - return -1; - } else if (strcmpi(actual_email, new_email) == 0) { - clif_displaymessage(fd, msg_table[147]); // New email must be different of the actual e-mail. - return -1; - } else { - chrif_changeemail(sd->status.account_id, actual_email, new_email); - clif_displaymessage(fd, msg_table[148]); // Information sended to login-server via char-server. - } + if (e_mail_check (actual_email) == 0) + { + clif_displaymessage (fd, msg_table[144]); // Invalid actual email. If you have default e-mail, give a@a.com. + return -1; + } + else if (e_mail_check (new_email) == 0) + { + clif_displaymessage (fd, msg_table[145]); // Invalid new email. Please enter a real e-mail. + return -1; + } + else if (strcmpi (new_email, "a@a.com") == 0) + { + clif_displaymessage (fd, msg_table[146]); // New email must be a real e-mail. + return -1; + } + else if (strcmpi (actual_email, new_email) == 0) + { + clif_displaymessage (fd, msg_table[147]); // New email must be different of the actual e-mail. + return -1; + } + else + { + chrif_changeemail (sd->status.account_id, actual_email, new_email); + clif_displaymessage (fd, msg_table[148]); // Information sended to login-server via char-server. + } - return 0; + return 0; } /*========================================== *@effect *------------------------------------------ */ -int atcommand_effect( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_effect (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd; - int type = 0, flag = 0, i; + struct map_session_data *pl_sd; + int type = 0, flag = 0, i; - if (!message || !*message || sscanf(message, "%d %d", &type,&flag) < 2) { - clif_displaymessage(fd, "Please, enter at least a option (usage: @effect <type+>)."); - return -1; - } - if(flag <=0){ - clif_specialeffect(&sd->bl, type, flag); - clif_displaymessage(fd, msg_table[229]); // Your effect has changed. - } - else{ - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - clif_specialeffect(&pl_sd->bl, type, flag); - clif_displaymessage(pl_sd->fd, msg_table[229]); // Your effect has changed. - } - } - } + if (!message || !*message || sscanf (message, "%d %d", &type, &flag) < 2) + { + clif_displaymessage (fd, + "Please, enter at least a option (usage: @effect <type+>)."); + return -1; + } + if (flag <= 0) + { + clif_specialeffect (&sd->bl, type, flag); + clif_displaymessage (fd, msg_table[229]); // Your effect has changed. + } + else + { + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + clif_specialeffect (&pl_sd->bl, type, flag); + clif_displaymessage (pl_sd->fd, msg_table[229]); // Your effect has changed. + } + } + } - return 0; + return 0; } /*========================================== @@ -6049,112 +7190,151 @@ int atcommand_effect( *------------------------------------------ */ int -atcommand_character_item_list( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - struct map_session_data *pl_sd; - struct item_data *item_data, *item_temp; - int i, j, equip, count, counter, counter2; - char character[100], output[200], equipstr[100], outputtmp[200]; - - memset(character, '\0', sizeof(character)); - memset(output, '\0', sizeof(output)); - memset(equipstr, '\0', sizeof(equipstr)); - memset(outputtmp, '\0', sizeof(outputtmp)); - - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @charitemlist <char name>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can look items only lower or same level - counter = 0; - count = 0; - for (i = 0; i < MAX_INVENTORY; i++) { - if (pl_sd->status.inventory[i].nameid > 0 && (item_data = itemdb_search(pl_sd->status.inventory[i].nameid)) != NULL) { - counter = counter + pl_sd->status.inventory[i].amount; - count++; - if (count == 1) { - sprintf(output, "------ Items list of '%s' ------", pl_sd->status.name); - clif_displaymessage(fd, output); - } - if ((equip = pl_sd->status.inventory[i].equip)) { - strcpy(equipstr, "| equiped: "); - if (equip & 4) - strcat(equipstr, "robe/gargment, "); - if (equip & 8) - strcat(equipstr, "left accessory, "); - if (equip & 16) - strcat(equipstr, "body/armor, "); - if ((equip & 34) == 2) - strcat(equipstr, "right hand, "); - if ((equip & 34) == 32) - strcat(equipstr, "left hand, "); - if ((equip & 34) == 34) - strcat(equipstr, "both hands, "); - if (equip & 64) - strcat(equipstr, "feet, "); - if (equip & 128) - strcat(equipstr, "right accessory, "); - if ((equip & 769) == 1) - strcat(equipstr, "lower head, "); - if ((equip & 769) == 256) - strcat(equipstr, "top head, "); - if ((equip & 769) == 257) - strcat(equipstr, "lower/top head, "); - if ((equip & 769) == 512) - strcat(equipstr, "mid head, "); - if ((equip & 769) == 512) - strcat(equipstr, "lower/mid head, "); - if ((equip & 769) == 769) - strcat(equipstr, "lower/mid/top head, "); - // remove final ', ' - equipstr[strlen(equipstr) - 2] = '\0'; - } else - memset(equipstr, '\0', sizeof(equipstr)); - if (sd->status.inventory[i].refine) - sprintf(output, "%d %s %+d (%s %+d, id: %d) %s", pl_sd->status.inventory[i].amount, item_data->name, pl_sd->status.inventory[i].refine, item_data->jname, pl_sd->status.inventory[i].refine, pl_sd->status.inventory[i].nameid, equipstr); - else - sprintf(output, "%d %s (%s, id: %d) %s", pl_sd->status.inventory[i].amount, item_data->name, item_data->jname, pl_sd->status.inventory[i].nameid, equipstr); - clif_displaymessage(fd, output); - memset(output, '\0', sizeof(output)); - counter2 = 0; - for (j = 0; j < item_data->slot; j++) { - if (pl_sd->status.inventory[i].card[j]) { - if ((item_temp = itemdb_search(pl_sd->status.inventory[i].card[j])) != NULL) { - if (output[0] == '\0') - sprintf(outputtmp, " -> (card(s): #%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname); - else - sprintf(outputtmp, "#%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname); - strcat(output, outputtmp); - } - } - } - if (output[0] != '\0') { - output[strlen(output) - 2] = ')'; - output[strlen(output) - 1] = '\0'; - clif_displaymessage(fd, output); - } - } - } - if (count == 0) - clif_displaymessage(fd, "No item found on this player."); - else { - sprintf(output, "%d item(s) found in %d kind(s) of items.", counter, count); - clif_displaymessage(fd, output); - } - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +atcommand_character_item_list (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + struct map_session_data *pl_sd; + struct item_data *item_data, *item_temp; + int i, j, equip, count, counter, counter2; + char character[100], output[200], equipstr[100], outputtmp[200]; + + memset (character, '\0', sizeof (character)); + memset (output, '\0', sizeof (output)); + memset (equipstr, '\0', sizeof (equipstr)); + memset (outputtmp, '\0', sizeof (outputtmp)); + + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @charitemlist <char name>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can look items only lower or same level + counter = 0; + count = 0; + for (i = 0; i < MAX_INVENTORY; i++) + { + if (pl_sd->status.inventory[i].nameid > 0 + && (item_data = + itemdb_search (pl_sd->status.inventory[i].nameid)) != + NULL) + { + counter = counter + pl_sd->status.inventory[i].amount; + count++; + if (count == 1) + { + sprintf (output, "------ Items list of '%s' ------", + pl_sd->status.name); + clif_displaymessage (fd, output); + } + if ((equip = pl_sd->status.inventory[i].equip)) + { + strcpy (equipstr, "| equiped: "); + if (equip & 4) + strcat (equipstr, "robe/gargment, "); + if (equip & 8) + strcat (equipstr, "left accessory, "); + if (equip & 16) + strcat (equipstr, "body/armor, "); + if ((equip & 34) == 2) + strcat (equipstr, "right hand, "); + if ((equip & 34) == 32) + strcat (equipstr, "left hand, "); + if ((equip & 34) == 34) + strcat (equipstr, "both hands, "); + if (equip & 64) + strcat (equipstr, "feet, "); + if (equip & 128) + strcat (equipstr, "right accessory, "); + if ((equip & 769) == 1) + strcat (equipstr, "lower head, "); + if ((equip & 769) == 256) + strcat (equipstr, "top head, "); + if ((equip & 769) == 257) + strcat (equipstr, "lower/top head, "); + if ((equip & 769) == 512) + strcat (equipstr, "mid head, "); + if ((equip & 769) == 512) + strcat (equipstr, "lower/mid head, "); + if ((equip & 769) == 769) + strcat (equipstr, "lower/mid/top head, "); + // remove final ', ' + equipstr[strlen (equipstr) - 2] = '\0'; + } + else + memset (equipstr, '\0', sizeof (equipstr)); + if (sd->status.inventory[i].refine) + sprintf (output, "%d %s %+d (%s %+d, id: %d) %s", + pl_sd->status.inventory[i].amount, + item_data->name, + pl_sd->status.inventory[i].refine, + item_data->jname, + pl_sd->status.inventory[i].refine, + pl_sd->status.inventory[i].nameid, equipstr); + else + sprintf (output, "%d %s (%s, id: %d) %s", + pl_sd->status.inventory[i].amount, + item_data->name, item_data->jname, + pl_sd->status.inventory[i].nameid, equipstr); + clif_displaymessage (fd, output); + memset (output, '\0', sizeof (output)); + counter2 = 0; + for (j = 0; j < item_data->slot; j++) + { + if (pl_sd->status.inventory[i].card[j]) + { + if ((item_temp = + itemdb_search (pl_sd->status. + inventory[i].card[j])) != + NULL) + { + if (output[0] == '\0') + sprintf (outputtmp, + " -> (card(s): #%d %s (%s), ", + ++counter2, item_temp->name, + item_temp->jname); + else + sprintf (outputtmp, "#%d %s (%s), ", + ++counter2, item_temp->name, + item_temp->jname); + strcat (output, outputtmp); + } + } + } + if (output[0] != '\0') + { + output[strlen (output) - 2] = ')'; + output[strlen (output) - 1] = '\0'; + clif_displaymessage (fd, output); + } + } + } + if (count == 0) + clif_displaymessage (fd, "No item found on this player."); + else + { + sprintf (output, "%d item(s) found in %d kind(s) of items.", + counter, count); + clif_displaymessage (fd, output); + } + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== @@ -6162,83 +7342,125 @@ atcommand_character_item_list( *------------------------------------------ */ int -atcommand_character_storage_list( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - struct storage *stor; - struct map_session_data *pl_sd; - struct item_data *item_data, *item_temp; - int i, j, count, counter, counter2; - char character[100], output[200], outputtmp[200]; - - memset(character, '\0', sizeof(character)); - memset(output, '\0', sizeof(output)); - memset(outputtmp, '\0', sizeof(outputtmp)); - - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @charitemlist <char name>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can look items only lower or same level - if((stor = account2storage2(pl_sd->status.account_id)) != NULL) { - counter = 0; - count = 0; - for (i = 0; i < MAX_STORAGE; i++) { - if (stor->storage_[i].nameid > 0 && (item_data = itemdb_search(stor->storage_[i].nameid)) != NULL) { - counter = counter + stor->storage_[i].amount; - count++; - if (count == 1) { - sprintf(output, "------ Storage items list of '%s' ------", pl_sd->status.name); - clif_displaymessage(fd, output); - } - if (stor->storage_[i].refine) - sprintf(output, "%d %s %+d (%s %+d, id: %d)", stor->storage_[i].amount, item_data->name, stor->storage_[i].refine, item_data->jname, stor->storage_[i].refine, stor->storage_[i].nameid); - else - sprintf(output, "%d %s (%s, id: %d)", stor->storage_[i].amount, item_data->name, item_data->jname, stor->storage_[i].nameid); - clif_displaymessage(fd, output); - memset(output, '\0', sizeof(output)); - counter2 = 0; - for (j = 0; j < item_data->slot; j++) { - if (stor->storage_[i].card[j]) { - if ((item_temp = itemdb_search(stor->storage_[i].card[j])) != NULL) { - if (output[0] == '\0') - sprintf(outputtmp, " -> (card(s): #%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname); - else - sprintf(outputtmp, "#%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname); - strcat(output, outputtmp); - } - } - } - if (output[0] != '\0') { - output[strlen(output) - 2] = ')'; - output[strlen(output) - 1] = '\0'; - clif_displaymessage(fd, output); - } - } - } - if (count == 0) - clif_displaymessage(fd, "No item found in the storage of this player."); - else { - sprintf(output, "%d item(s) found in %d kind(s) of items.", counter, count); - clif_displaymessage(fd, output); - } - } else { - clif_displaymessage(fd, "This player has no storage."); - return -1; - } - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +atcommand_character_storage_list (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + struct storage *stor; + struct map_session_data *pl_sd; + struct item_data *item_data, *item_temp; + int i, j, count, counter, counter2; + char character[100], output[200], outputtmp[200]; + + memset (character, '\0', sizeof (character)); + memset (output, '\0', sizeof (output)); + memset (outputtmp, '\0', sizeof (outputtmp)); + + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @charitemlist <char name>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can look items only lower or same level + if ((stor = account2storage2 (pl_sd->status.account_id)) != NULL) + { + counter = 0; + count = 0; + for (i = 0; i < MAX_STORAGE; i++) + { + if (stor->storage_[i].nameid > 0 + && (item_data = + itemdb_search (stor->storage_[i].nameid)) != NULL) + { + counter = counter + stor->storage_[i].amount; + count++; + if (count == 1) + { + sprintf (output, + "------ Storage items list of '%s' ------", + pl_sd->status.name); + clif_displaymessage (fd, output); + } + if (stor->storage_[i].refine) + sprintf (output, "%d %s %+d (%s %+d, id: %d)", + stor->storage_[i].amount, + item_data->name, + stor->storage_[i].refine, + item_data->jname, + stor->storage_[i].refine, + stor->storage_[i].nameid); + else + sprintf (output, "%d %s (%s, id: %d)", + stor->storage_[i].amount, + item_data->name, item_data->jname, + stor->storage_[i].nameid); + clif_displaymessage (fd, output); + memset (output, '\0', sizeof (output)); + counter2 = 0; + for (j = 0; j < item_data->slot; j++) + { + if (stor->storage_[i].card[j]) + { + if ((item_temp = + itemdb_search (stor-> + storage_[i].card[j])) != + NULL) + { + if (output[0] == '\0') + sprintf (outputtmp, + " -> (card(s): #%d %s (%s), ", + ++counter2, item_temp->name, + item_temp->jname); + else + sprintf (outputtmp, "#%d %s (%s), ", + ++counter2, item_temp->name, + item_temp->jname); + strcat (output, outputtmp); + } + } + } + if (output[0] != '\0') + { + output[strlen (output) - 2] = ')'; + output[strlen (output) - 1] = '\0'; + clif_displaymessage (fd, output); + } + } + } + if (count == 0) + clif_displaymessage (fd, + "No item found in the storage of this player."); + else + { + sprintf (output, + "%d item(s) found in %d kind(s) of items.", + counter, count); + clif_displaymessage (fd, output); + } + } + else + { + clif_displaymessage (fd, "This player has no storage."); + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== @@ -6246,77 +7468,114 @@ atcommand_character_storage_list( *------------------------------------------ */ int -atcommand_character_cart_list( - const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - struct map_session_data *pl_sd; - struct item_data *item_data, *item_temp; - int i, j, count, counter, counter2; - char character[100], output[200], outputtmp[200]; - - memset(character, '\0', sizeof(character)); - memset(output, '\0', sizeof(output)); - memset(outputtmp, '\0', sizeof(outputtmp)); - - if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) { - clif_displaymessage(fd, "Please, enter a player name (usage: @charitemlist <char name>)."); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can look items only lower or same level - counter = 0; - count = 0; - for (i = 0; i < MAX_CART; i++) { - if (pl_sd->status.cart[i].nameid > 0 && (item_data = itemdb_search(pl_sd->status.cart[i].nameid)) != NULL) { - counter = counter + pl_sd->status.cart[i].amount; - count++; - if (count == 1) { - sprintf(output, "------ Cart items list of '%s' ------", pl_sd->status.name); - clif_displaymessage(fd, output); - } - if (pl_sd->status.cart[i].refine) - sprintf(output, "%d %s %+d (%s %+d, id: %d)", pl_sd->status.cart[i].amount, item_data->name, pl_sd->status.cart[i].refine, item_data->jname, pl_sd->status.cart[i].refine, pl_sd->status.cart[i].nameid); - else - sprintf(output, "%d %s (%s, id: %d)", pl_sd->status.cart[i].amount, item_data->name, item_data->jname, pl_sd->status.cart[i].nameid); - clif_displaymessage(fd, output); - memset(output, '\0', sizeof(output)); - counter2 = 0; - for (j = 0; j < item_data->slot; j++) { - if (pl_sd->status.cart[i].card[j]) { - if ((item_temp = itemdb_search(pl_sd->status.cart[i].card[j])) != NULL) { - if (output[0] == '\0') - sprintf(outputtmp, " -> (card(s): #%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname); - else - sprintf(outputtmp, "#%d %s (%s), ", ++counter2, item_temp->name, item_temp->jname); - strcat(output, outputtmp); - } - } - } - if (output[0] != '\0') { - output[strlen(output) - 2] = ')'; - output[strlen(output) - 1] = '\0'; - clif_displaymessage(fd, output); - } - } - } - if (count == 0) - clif_displaymessage(fd, "No item found in the cart of this player."); - else { - sprintf(output, "%d item(s) found in %d kind(s) of items.", counter, count); - clif_displaymessage(fd, output); - } - } else { - clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. - return -1; - } - } else { - clif_displaymessage(fd, msg_table[3]); // Character not found. - return -1; - } - - return 0; +atcommand_character_cart_list (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + struct map_session_data *pl_sd; + struct item_data *item_data, *item_temp; + int i, j, count, counter, counter2; + char character[100], output[200], outputtmp[200]; + + memset (character, '\0', sizeof (character)); + memset (output, '\0', sizeof (output)); + memset (outputtmp, '\0', sizeof (outputtmp)); + + if (!message || !*message || sscanf (message, "%99[^\n]", character) < 1) + { + clif_displaymessage (fd, + "Please, enter a player name (usage: @charitemlist <char name>)."); + return -1; + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (pc_isGM (sd) >= pc_isGM (pl_sd)) + { // you can look items only lower or same level + counter = 0; + count = 0; + for (i = 0; i < MAX_CART; i++) + { + if (pl_sd->status.cart[i].nameid > 0 + && (item_data = + itemdb_search (pl_sd->status.cart[i].nameid)) != NULL) + { + counter = counter + pl_sd->status.cart[i].amount; + count++; + if (count == 1) + { + sprintf (output, + "------ Cart items list of '%s' ------", + pl_sd->status.name); + clif_displaymessage (fd, output); + } + if (pl_sd->status.cart[i].refine) + sprintf (output, "%d %s %+d (%s %+d, id: %d)", + pl_sd->status.cart[i].amount, + item_data->name, + pl_sd->status.cart[i].refine, + item_data->jname, + pl_sd->status.cart[i].refine, + pl_sd->status.cart[i].nameid); + else + sprintf (output, "%d %s (%s, id: %d)", + pl_sd->status.cart[i].amount, + item_data->name, item_data->jname, + pl_sd->status.cart[i].nameid); + clif_displaymessage (fd, output); + memset (output, '\0', sizeof (output)); + counter2 = 0; + for (j = 0; j < item_data->slot; j++) + { + if (pl_sd->status.cart[i].card[j]) + { + if ((item_temp = + itemdb_search (pl_sd->status. + cart[i].card[j])) != NULL) + { + if (output[0] == '\0') + sprintf (outputtmp, + " -> (card(s): #%d %s (%s), ", + ++counter2, item_temp->name, + item_temp->jname); + else + sprintf (outputtmp, "#%d %s (%s), ", + ++counter2, item_temp->name, + item_temp->jname); + strcat (output, outputtmp); + } + } + } + if (output[0] != '\0') + { + output[strlen (output) - 2] = ')'; + output[strlen (output) - 1] = '\0'; + clif_displaymessage (fd, output); + } + } + } + if (count == 0) + clif_displaymessage (fd, + "No item found in the cart of this player."); + else + { + sprintf (output, "%d item(s) found in %d kind(s) of items.", + counter, count); + clif_displaymessage (fd, output); + } + } + else + { + clif_displaymessage (fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player. + return -1; + } + } + else + { + clif_displaymessage (fd, msg_table[3]); // Character not found. + return -1; + } + + return 0; } /*========================================== @@ -6325,18 +7584,17 @@ atcommand_character_cart_list( *------------------------------------------ */ int -atcommand_killer( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_killer (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - sd->special_state.killer = !sd->special_state.killer; + sd->special_state.killer = !sd->special_state.killer; - if(sd->special_state.killer) - clif_displaymessage(fd, msg_table[241]); - else - clif_displaymessage(fd, msg_table[242]); + if (sd->special_state.killer) + clif_displaymessage (fd, msg_table[241]); + else + clif_displaymessage (fd, msg_table[242]); - return 0; + return 0; } /*========================================== @@ -6345,18 +7603,17 @@ atcommand_killer( *------------------------------------------ */ int -atcommand_killable( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_killable (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - sd->special_state.killable = !sd->special_state.killable; + sd->special_state.killable = !sd->special_state.killable; - if(sd->special_state.killable) - clif_displaymessage(fd, msg_table[242]); - else - clif_displaymessage(fd, msg_table[241]); + if (sd->special_state.killable) + clif_displaymessage (fd, msg_table[242]); + else + clif_displaymessage (fd, msg_table[241]); - return 0; + return 0; } /*========================================== @@ -6365,42 +7622,39 @@ atcommand_killable( *------------------------------------------ */ int -atcommand_charkillable( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_charkillable (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd = NULL; + struct map_session_data *pl_sd = NULL; - if (!message || !*message) - return -1; + if (!message || !*message) + return -1; - if((pl_sd=map_nick2sd((char *) message)) == NULL) - return -1; + if ((pl_sd = map_nick2sd ((char *) message)) == NULL) + return -1; - pl_sd->special_state.killable = !pl_sd->special_state.killable; + pl_sd->special_state.killable = !pl_sd->special_state.killable; - if(pl_sd->special_state.killable) - clif_displaymessage(fd, "The player is now killable"); - else - clif_displaymessage(fd, "The player is no longer killable"); + if (pl_sd->special_state.killable) + clif_displaymessage (fd, "The player is now killable"); + else + clif_displaymessage (fd, "The player is no longer killable"); - return 0; + return 0; } - /*========================================== * @skillon by MouseJstr * turn skills on for the map *------------------------------------------ */ int -atcommand_skillon( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_skillon (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - map[sd->bl.m].flag.noskill = 0; - clif_displaymessage(fd, msg_table[244]); - return 0; + map[sd->bl.m].flag.noskill = 0; + clif_displaymessage (fd, msg_table[244]); + return 0; } /*========================================== @@ -6409,13 +7663,12 @@ atcommand_skillon( *------------------------------------------ */ int -atcommand_skilloff( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_skilloff (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - map[sd->bl.m].flag.noskill = 1; - clif_displaymessage(fd, msg_table[243]); - return 0; + map[sd->bl.m].flag.noskill = 1; + clif_displaymessage (fd, msg_table[243]); + return 0; } /*========================================== @@ -6425,34 +7678,34 @@ atcommand_skilloff( *------------------------------------------ */ int -atcommand_npcmove(const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_npcmove (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - int x = 0, y = 0; - struct npc_data *nd = 0; - - if( sd == NULL ) - return -1; + char character[100]; + int x = 0, y = 0; + struct npc_data *nd = 0; - if (!message || !*message) - return -1; + if (sd == NULL) + return -1; + + if (!message || !*message) + return -1; - memset(character, '\0', sizeof character); + memset (character, '\0', sizeof character); - if (sscanf(message, "%d %d %99[^\n]", &x, &y, character) < 3) - return -1; + if (sscanf (message, "%d %d %99[^\n]", &x, &y, character) < 3) + return -1; - nd=npc_name2id(character); - if (nd==NULL) - return -1; + nd = npc_name2id (character); + if (nd == NULL) + return -1; - npc_enable(character, 0); - nd->bl.x = x; - nd->bl.y = y; - npc_enable(character, 1); + npc_enable (character, 0); + nd->bl.x = x; + nd->bl.y = y; + npc_enable (character, 1); - return 0; + return 0; } /*========================================== @@ -6462,30 +7715,30 @@ atcommand_npcmove(const int fd, struct map_session_data* sd, *------------------------------------------ */ int -atcommand_addwarp(const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_addwarp (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char w1[64], w3[64], w4[64]; - char map[30], output[200]; - int x,y,ret; + char w1[64], w3[64], w4[64]; + char map[30], output[200]; + int x, y, ret; - if (!message || !*message) - return -1; + if (!message || !*message) + return -1; - if (sscanf(message, "%99s %d %d[^\n]", map, &x, &y ) < 3) - return -1; + if (sscanf (message, "%99s %d %d[^\n]", map, &x, &y) < 3) + return -1; - sprintf(w1,"%s,%d,%d", sd->mapname, sd->bl.x, sd->bl.y); - sprintf(w3,"%s%d%d%d%d", map,sd->bl.x, sd->bl.y, x, y); - sprintf(w4,"1,1,%s.gat,%d,%d", map, x, y); + sprintf (w1, "%s,%d,%d", sd->mapname, sd->bl.x, sd->bl.y); + sprintf (w3, "%s%d%d%d%d", map, sd->bl.x, sd->bl.y, x, y); + sprintf (w4, "1,1,%s.gat,%d,%d", map, x, y); - ret = npc_parse_warp(w1, "warp", w3, w4); + ret = npc_parse_warp (w1, "warp", w3, w4); - sprintf(output, "New warp NPC => %s",w3); + sprintf (output, "New warp NPC => %s", w3); - clif_displaymessage(fd, output); + clif_displaymessage (fd, output); - return ret; + return ret; } /*========================================== @@ -6495,31 +7748,30 @@ atcommand_addwarp(const int fd, struct map_session_data* sd, *------------------------------------------ */ int -atcommand_follow(const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_follow (const int fd, struct map_session_data *sd, + const char *command, const char *message) { #if 0 - struct map_session_data *pl_sd = NULL; - - if (!message || !*message) - return -1; - if((pl_sd=map_nick2sd((char *) message)) != NULL) - pc_follow(sd, pl_sd->bl.id); - else - return 1; + struct map_session_data *pl_sd = NULL; + + if (!message || !*message) + return -1; + if ((pl_sd = map_nick2sd ((char *) message)) != NULL) + pc_follow (sd, pl_sd->bl.id); + else + return 1; #endif - /* - * Command disabled - it's incompatible with the TMW - * client. - */ - clif_displaymessage(fd, "@follow command not available"); + /* + * Command disabled - it's incompatible with the TMW + * client. + */ + clif_displaymessage (fd, "@follow command not available"); - return 0; + return 0; } - /*========================================== * @chareffect by [MouseJstr] * @@ -6527,26 +7779,29 @@ atcommand_follow(const int fd, struct map_session_data* sd, *------------------------------------------ */ int -atcommand_chareffect(const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_chareffect (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd = NULL; - char target[255]; - int type = 0; + struct map_session_data *pl_sd = NULL; + char target[255]; + int type = 0; - if (!message || !*message || sscanf(message, "%d %s", &type, target) != 2) { - clif_displaymessage(fd, "usage: @chareffect <type+> <target>."); - return -1; - } + if (!message || !*message + || sscanf (message, "%d %s", &type, target) != 2) + { + clif_displaymessage (fd, "usage: @chareffect <type+> <target>."); + return -1; + } - if((pl_sd=map_nick2sd((char *) target)) == NULL) - return -1; + if ((pl_sd = map_nick2sd ((char *) target)) == NULL) + return -1; - clif_specialeffect(&pl_sd->bl, type, 0); - clif_displaymessage(fd, msg_table[229]); // Your effect has changed. + clif_specialeffect (&pl_sd->bl, type, 0); + clif_displaymessage (fd, msg_table[229]); // Your effect has changed. - return 0; + return 0; } + /*========================================== * @dropall by [MouseJstr] * @@ -6554,19 +7809,22 @@ atcommand_chareffect(const int fd, struct map_session_data* sd, *------------------------------------------ */ int -atcommand_dropall(const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - int i; - for (i = 0; i < MAX_INVENTORY; i++) { - if (sd->status.inventory[i].amount) { - if(sd->status.inventory[i].equip != 0) - pc_unequipitem(sd, i, 0); - pc_dropitem(sd, i, sd->status.inventory[i].amount); - } - } - return 0; +atcommand_dropall (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + int i; + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].amount) + { + if (sd->status.inventory[i].equip != 0) + pc_unequipitem (sd, i, 0); + pc_dropitem (sd, i, sd->status.inventory[i].amount); + } + } + return 0; } + /*========================================== * @chardropall by [MouseJstr] * @@ -6575,30 +7833,33 @@ atcommand_dropall(const int fd, struct map_session_data* sd, *------------------------------------------ */ int -atcommand_chardropall(const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_chardropall (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int i; - struct map_session_data *pl_sd = NULL; + int i; + struct map_session_data *pl_sd = NULL; - if (!message || !*message) - return -1; - if((pl_sd=map_nick2sd((char *) message)) == NULL) - return -1; - for (i = 0; i < MAX_INVENTORY; i++) { - if (pl_sd->status.inventory[i].amount) { - if(pl_sd->status.inventory[i].equip != 0) - pc_unequipitem(pl_sd, i, 0); - pc_dropitem(pl_sd, i, pl_sd->status.inventory[i].amount); - } - } + if (!message || !*message) + return -1; + if ((pl_sd = map_nick2sd ((char *) message)) == NULL) + return -1; + for (i = 0; i < MAX_INVENTORY; i++) + { + if (pl_sd->status.inventory[i].amount) + { + if (pl_sd->status.inventory[i].equip != 0) + pc_unequipitem (pl_sd, i, 0); + pc_dropitem (pl_sd, i, pl_sd->status.inventory[i].amount); + } + } - clif_displaymessage(pl_sd->fd, "Ever play 52 card pickup?"); - clif_displaymessage(fd, "It is done"); - //clif_displaymessage(fd, "It is offical.. your a jerk"); + clif_displaymessage (pl_sd->fd, "Ever play 52 card pickup?"); + clif_displaymessage (fd, "It is done"); + //clif_displaymessage(fd, "It is offical.. your a jerk"); - return 0; + return 0; } + /*========================================== * @storeall by [MouseJstr] * @@ -6607,35 +7868,40 @@ atcommand_chardropall(const int fd, struct map_session_data* sd, *------------------------------------------ */ int -atcommand_storeall(const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - int i; - nullpo_retr(-1, sd); - - if (sd->state.storage_flag != 1) - { //Open storage. - switch (storage_storageopen(sd)) { - case 2: //Try again - clif_displaymessage(fd, "run this command again.."); - return 0; - case 1: //Failure - clif_displaymessage(fd, "You can't open the storage currently."); - return 1; - } - } - for (i = 0; i < MAX_INVENTORY; i++) { - if (sd->status.inventory[i].amount) { - if(sd->status.inventory[i].equip != 0) - pc_unequipitem(sd, i, 0); - storage_storageadd(sd, i, sd->status.inventory[i].amount); - } - } - storage_storageclose(sd); - - clif_displaymessage(fd, "It is done"); - return 0; +atcommand_storeall (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + int i; + nullpo_retr (-1, sd); + + if (sd->state.storage_flag != 1) + { //Open storage. + switch (storage_storageopen (sd)) + { + case 2: //Try again + clif_displaymessage (fd, "run this command again.."); + return 0; + case 1: //Failure + clif_displaymessage (fd, + "You can't open the storage currently."); + return 1; + } + } + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].amount) + { + if (sd->status.inventory[i].equip != 0) + pc_unequipitem (sd, i, 0); + storage_storageadd (sd, i, sd->status.inventory[i].amount); + } + } + storage_storageclose (sd); + + clif_displaymessage (fd, "It is done"); + return 0; } + /*========================================== * @charstoreall by [MouseJstr] * @@ -6643,39 +7909,46 @@ atcommand_storeall(const int fd, struct map_session_data* sd, *------------------------------------------ */ int -atcommand_charstoreall(const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_charstoreall (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int i; - struct map_session_data *pl_sd = NULL; + int i; + struct map_session_data *pl_sd = NULL; - if (!message || !*message) - return -1; - if((pl_sd=map_nick2sd((char *) message)) == NULL) - return -1; + if (!message || !*message) + return -1; + if ((pl_sd = map_nick2sd ((char *) message)) == NULL) + return -1; - if (storage_storageopen(pl_sd) == 1) { - clif_displaymessage(fd, "Had to open the characters storage window..."); - clif_displaymessage(fd, "run this command again.."); - return 0; - } - for (i = 0; i < MAX_INVENTORY; i++) { - if (pl_sd->status.inventory[i].amount) { - if(pl_sd->status.inventory[i].equip != 0) - pc_unequipitem(pl_sd, i, 0); - storage_storageadd(pl_sd, i, sd->status.inventory[i].amount); - } - } - storage_storageclose(pl_sd); + if (storage_storageopen (pl_sd) == 1) + { + clif_displaymessage (fd, + "Had to open the characters storage window..."); + clif_displaymessage (fd, "run this command again.."); + return 0; + } + for (i = 0; i < MAX_INVENTORY; i++) + { + if (pl_sd->status.inventory[i].amount) + { + if (pl_sd->status.inventory[i].equip != 0) + pc_unequipitem (pl_sd, i, 0); + storage_storageadd (pl_sd, i, sd->status.inventory[i].amount); + } + } + storage_storageclose (pl_sd); - clif_displaymessage(pl_sd->fd, "Everything you own has been put away for safe keeping."); - clif_displaymessage(pl_sd->fd, "go to the nearest kafka to retrieve it.."); - clif_displaymessage(pl_sd->fd, " -- the management"); + clif_displaymessage (pl_sd->fd, + "Everything you own has been put away for safe keeping."); + clif_displaymessage (pl_sd->fd, + "go to the nearest kafka to retrieve it.."); + clif_displaymessage (pl_sd->fd, " -- the management"); - clif_displaymessage(fd, "It is done"); + clif_displaymessage (fd, "It is done"); - return 0; + return 0; } + /*========================================== * @skillid by [MouseJstr] * @@ -6683,24 +7956,28 @@ atcommand_charstoreall(const int fd, struct map_session_data* sd, *------------------------------------------ */ int -atcommand_skillid(const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - int skillen = 0, idx = 0; - if (!message || !*message) - return -1; - skillen = strlen(message); - while (skill_names[idx].id != 0) { - if ((strnicmp(skill_names[idx].name, message, skillen) == 0) || - (strnicmp(skill_names[idx].desc, message, skillen) == 0)) { - char output[255]; - sprintf(output, "skill %d: %s", skill_names[idx].id, skill_names[idx].desc); - clif_displaymessage(fd, output); - } - idx++; +atcommand_skillid (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + int skillen = 0, idx = 0; + if (!message || !*message) + return -1; + skillen = strlen (message); + while (skill_names[idx].id != 0) + { + if ((strnicmp (skill_names[idx].name, message, skillen) == 0) || + (strnicmp (skill_names[idx].desc, message, skillen) == 0)) + { + char output[255]; + sprintf (output, "skill %d: %s", skill_names[idx].id, + skill_names[idx].desc); + clif_displaymessage (fd, output); } - return 0; + idx++; + } + return 0; } + /*========================================== * @useskill by [MouseJstr] * @@ -6708,71 +7985,74 @@ atcommand_skillid(const int fd, struct map_session_data* sd, *------------------------------------------ */ int -atcommand_useskill(const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_useskill (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd = NULL; - int skillnum; - int skilllv; - int inf; - char target[255]; + struct map_session_data *pl_sd = NULL; + int skillnum; + int skilllv; + int inf; + char target[255]; - if (!message || !*message) - return -1; - if(sscanf(message, "%d %d %s", &skillnum, &skilllv, target) != 3) { - clif_displaymessage(fd, "Usage: @useskill <skillnum> <skillv> <target>"); - return -1; - } - if((pl_sd=map_nick2sd(target)) == NULL) { - return -1; - } + if (!message || !*message) + return -1; + if (sscanf (message, "%d %d %s", &skillnum, &skilllv, target) != 3) + { + clif_displaymessage (fd, + "Usage: @useskill <skillnum> <skillv> <target>"); + return -1; + } + if ((pl_sd = map_nick2sd (target)) == NULL) + { + return -1; + } - inf = skill_get_inf(skillnum); + inf = skill_get_inf (skillnum); - if ((inf == 2) || (inf == 1)) - skill_use_pos(sd, pl_sd->bl.x, pl_sd->bl.y, skillnum, skilllv); - else - skill_use_id(sd, pl_sd->bl.id, skillnum, skilllv); + if ((inf == 2) || (inf == 1)) + skill_use_pos (sd, pl_sd->bl.x, pl_sd->bl.y, skillnum, skilllv); + else + skill_use_id (sd, pl_sd->bl.id, skillnum, skilllv); - return 0; + return 0; } + /*========================================== * It is made to rain. *------------------------------------------ */ int -atcommand_rain( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_rain (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int effno = 0; - effno = 161; - nullpo_retr(-1, sd); - if (effno < 0 || map[sd->bl.m].flag.rain) - return -1; + int effno = 0; + effno = 161; + nullpo_retr (-1, sd); + if (effno < 0 || map[sd->bl.m].flag.rain) + return -1; - map[sd->bl.m].flag.rain=1; - clif_specialeffect(&sd->bl,effno,2); - return 0; + map[sd->bl.m].flag.rain = 1; + clif_specialeffect (&sd->bl, effno, 2); + return 0; } + /*========================================== * It is made to snow. *------------------------------------------ */ int -atcommand_snow( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_snow (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int effno = 0; - effno = 162; - nullpo_retr(-1, sd); - if (effno < 0 || map[sd->bl.m].flag.snow) - return -1; + int effno = 0; + effno = 162; + nullpo_retr (-1, sd); + if (effno < 0 || map[sd->bl.m].flag.snow) + return -1; - map[sd->bl.m].flag.snow=1; - clif_specialeffect(&sd->bl,effno,2); - return 0; + map[sd->bl.m].flag.snow = 1; + clif_specialeffect (&sd->bl, effno, 2); + return 0; } /*========================================== @@ -6780,19 +8060,18 @@ atcommand_snow( *------------------------------------------ */ int -atcommand_sakura( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_sakura (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int effno = 0; - effno = 163; - nullpo_retr(-1, sd); - if (effno < 0 || map[sd->bl.m].flag.sakura) - return -1; + int effno = 0; + effno = 163; + nullpo_retr (-1, sd); + if (effno < 0 || map[sd->bl.m].flag.sakura) + return -1; - map[sd->bl.m].flag.sakura=1; - clif_specialeffect(&sd->bl,effno,2); - return 0; + map[sd->bl.m].flag.sakura = 1; + clif_specialeffect (&sd->bl, effno, 2); + return 0; } /*========================================== @@ -6800,20 +8079,19 @@ atcommand_sakura( *------------------------------------------ */ int -atcommand_fog( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_fog (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int effno = 0; - effno = 233; - nullpo_retr(-1, sd); - if (effno < 0 || map[sd->bl.m].flag.fog) - return -1; - - map[sd->bl.m].flag.fog=1; - clif_specialeffect(&sd->bl,effno,2); + int effno = 0; + effno = 233; + nullpo_retr (-1, sd); + if (effno < 0 || map[sd->bl.m].flag.fog) + return -1; - return 0; + map[sd->bl.m].flag.fog = 1; + clif_specialeffect (&sd->bl, effno, 2); + + return 0; } /*========================================== @@ -6821,61 +8099,62 @@ atcommand_fog( *------------------------------------------ */ int -atcommand_leaves( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_leaves (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int effno = 0; - effno = 333; - nullpo_retr(-1, sd); - if (effno < 0 || map[sd->bl.m].flag.leaves) - return -1; + int effno = 0; + effno = 333; + nullpo_retr (-1, sd); + if (effno < 0 || map[sd->bl.m].flag.leaves) + return -1; - map[sd->bl.m].flag.leaves=1; - clif_specialeffect(&sd->bl,effno,2); - return 0; + map[sd->bl.m].flag.leaves = 1; + clif_specialeffect (&sd->bl, effno, 2); + return 0; } /*========================================== * *------------------------------------------ */ -int atcommand_summon(const int fd, struct map_session_data* sd, const char* command, const char* message) +int atcommand_summon (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char name[100]; - int mob_id = 0; - int x = 0; - int y = 0; - int id = 0; - struct mob_data *md; - unsigned int tick=gettick(); - - nullpo_retr(-1, sd); + char name[100]; + int mob_id = 0; + int x = 0; + int y = 0; + int id = 0; + struct mob_data *md; + unsigned int tick = gettick (); + + nullpo_retr (-1, sd); - if (!message || !*message) - return -1; - if (sscanf(message, "%99s", name) < 1) - return -1; - - if ((mob_id = atoi(name)) == 0) - mob_id = mobdb_searchname(name); - if(mob_id == 0) - return -1; + if (!message || !*message) + return -1; + if (sscanf (message, "%99s", name) < 1) + return -1; - x = sd->bl.x + (MRAND(10) - 5); - y = sd->bl.y + (MRAND(10) - 5); + if ((mob_id = atoi (name)) == 0) + mob_id = mobdb_searchname (name); + if (mob_id == 0) + return -1; - id = mob_once_spawn(sd,"this", x, y, "--ja--", mob_id, 1, ""); - if((md=(struct mob_data *)map_id2bl(id))){ - md->master_id=sd->bl.id; - md->state.special_mob_ai=1; - md->mode=mob_db[md->class].mode|0x04; - md->deletetimer=add_timer(tick+60000,mob_timer_delete,id,0); - clif_misceffect(&md->bl,344); - } - clif_skill_poseffect(&sd->bl,AM_CALLHOMUN,1,x,y,tick); + x = sd->bl.x + (MRAND (10) - 5); + y = sd->bl.y + (MRAND (10) - 5); + + id = mob_once_spawn (sd, "this", x, y, "--ja--", mob_id, 1, ""); + if ((md = (struct mob_data *) map_id2bl (id))) + { + md->master_id = sd->bl.id; + md->state.special_mob_ai = 1; + md->mode = mob_db[md->class].mode | 0x04; + md->deletetimer = add_timer (tick + 60000, mob_timer_delete, id, 0); + clif_misceffect (&md->bl, 344); + } + clif_skill_poseffect (&sd->bl, AM_CALLHOMUN, 1, x, y, tick); - return 0; + return 0; } /*========================================== @@ -6888,26 +8167,27 @@ int atcommand_summon(const int fd, struct map_session_data* sd, const char* comm *------------------------------------------ */ int -atcommand_adjcmdlvl( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_adjcmdlvl (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int i, newlev; + int i, newlev; char cmd[100]; - if (!message || !*message || sscanf(message, "%d %s", &newlev, cmd) != 2) { - clif_displaymessage(fd, "usage: @adjcmdlvl <lvl> <command>."); + if (!message || !*message || sscanf (message, "%d %s", &newlev, cmd) != 2) + { + clif_displaymessage (fd, "usage: @adjcmdlvl <lvl> <command>."); return -1; } for (i = 0; atcommand_info[i].type != AtCommand_None; i++) - if (strcmpi(cmd, atcommand_info[i].command+1) == 0) { + if (strcmpi (cmd, atcommand_info[i].command + 1) == 0) + { atcommand_info[i].level = newlev; - clif_displaymessage(fd, "@command level changed."); + clif_displaymessage (fd, "@command level changed."); return 0; } - clif_displaymessage(fd, "@command not found."); + clif_displaymessage (fd, "@command not found."); return -1; } @@ -6921,28 +8201,28 @@ atcommand_adjcmdlvl( *------------------------------------------ */ int -atcommand_adjgmlvl( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_adjgmlvl (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - int newlev; + int newlev; char user[100]; struct map_session_data *pl_sd; - if (!message || !*message || sscanf(message, "%d %s", &newlev, user) != 2) { - clif_displaymessage(fd, "usage: @adjgmlvl <lvl> <user>."); + if (!message || !*message + || sscanf (message, "%d %s", &newlev, user) != 2) + { + clif_displaymessage (fd, "usage: @adjgmlvl <lvl> <user>."); return -1; } - if((pl_sd=map_nick2sd((char *) user)) == NULL) + if ((pl_sd = map_nick2sd ((char *) user)) == NULL) return -1; - pc_set_gm_level(pl_sd->status.account_id, newlev); + pc_set_gm_level (pl_sd->status.account_id, newlev); return 0; } - /*========================================== * @trade by [MouseJstr] * @@ -6953,365 +8233,405 @@ atcommand_adjgmlvl( *------------------------------------------ */ int -atcommand_trade( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_trade (const int fd, struct map_session_data *sd, + const char *command, const char *message) { struct map_session_data *pl_sd = NULL; if (!message || !*message) return -1; - if((pl_sd=map_nick2sd((char *) message)) != NULL) { - trade_traderequest(sd, pl_sd->bl.id); + if ((pl_sd = map_nick2sd ((char *) message)) != NULL) + { + trade_traderequest (sd, pl_sd->bl.id); return 0; } return -1; } - /*=========================== * @unmute [Valaris] *=========================== */ -int atcommand_unmute( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_unmute (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - struct map_session_data *pl_sd = NULL; - if (!message || !*message) - return -1; + struct map_session_data *pl_sd = NULL; + if (!message || !*message) + return -1; - if((pl_sd=map_nick2sd((char *) message)) != NULL) { - if(pl_sd->sc_data[SC_NOCHAT].timer!=-1) { - skill_status_change_end(&pl_sd->bl,SC_NOCHAT,-1); - clif_displaymessage(sd->fd,"Player unmuted"); - } - else - clif_displaymessage(sd->fd,"Player is not muted"); - } + if ((pl_sd = map_nick2sd ((char *) message)) != NULL) + { + if (pl_sd->sc_data[SC_NOCHAT].timer != -1) + { + skill_status_change_end (&pl_sd->bl, SC_NOCHAT, -1); + clif_displaymessage (sd->fd, "Player unmuted"); + } + else + clif_displaymessage (sd->fd, "Player is not muted"); + } - return 0; + return 0; } /* Magic atcommands by Fate */ static int magic_base = TMW_MAGIC; #define magic_skills_nr 6 -static char *magic_skill_names[magic_skills_nr] = {"magic", "life", "war", "transmute", "nature", "astral"}; +static char *magic_skill_names[magic_skills_nr] = + { "magic", "life", "war", "transmute", "nature", "astral" }; int -atcommand_magic_info(const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_magic_info (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - char buf[200]; - struct map_session_data *pl_sd; + char character[100]; + char buf[200]; + struct map_session_data *pl_sd; - memset(character, '\0', sizeof(character)); + memset (character, '\0', sizeof (character)); - if (!message || !*message || sscanf(message, "%99s", character) < 1) { - clif_displaymessage(fd, "Usage: @magicinfo <char_name>"); - return -1; - } + if (!message || !*message || sscanf (message, "%99s", character) < 1) + { + clif_displaymessage (fd, "Usage: @magicinfo <char_name>"); + return -1; + } - if ((pl_sd = map_nick2sd(character)) != NULL) { - int i; + if ((pl_sd = map_nick2sd (character)) != NULL) + { + int i; - sprintf(buf, "`%s' has the following magic skills:", character); - clif_displaymessage(fd, buf); + sprintf (buf, "`%s' has the following magic skills:", character); + clif_displaymessage (fd, buf); - for (i = 0; i < magic_skills_nr; i++) { - sprintf(buf, "%d in %s", pl_sd->status.skill[i + magic_base].lv, magic_skill_names[i]); - if (pl_sd->status.skill[i + magic_base].id == i + magic_base) - clif_displaymessage(fd, buf); - } + for (i = 0; i < magic_skills_nr; i++) + { + sprintf (buf, "%d in %s", pl_sd->status.skill[i + magic_base].lv, + magic_skill_names[i]); + if (pl_sd->status.skill[i + magic_base].id == i + magic_base) + clif_displaymessage (fd, buf); + } - return 0; - } else - clif_displaymessage(fd, "Character not found."); + return 0; + } + else + clif_displaymessage (fd, "Character not found."); - return -1; + return -1; } -static void -set_skill(struct map_session_data* sd, int i, int level) +static void set_skill (struct map_session_data *sd, int i, int level) { - sd->status.skill[i].id = level? i : 0; - sd->status.skill[i].lv = level; + sd->status.skill[i].id = level ? i : 0; + sd->status.skill[i].lv = level; } int -atcommand_set_magic(const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char character[100]; - char magic_type[20]; - int skill_index = -1; // 0: all - int value; - struct map_session_data *pl_sd; - - memset(character, '\0', sizeof(character)); - - if (!message || !*message || sscanf(message, "%19s %i %99s", magic_type, &value, character) < 1) { - clif_displaymessage(fd, "Usage: @setmagic <school> <value> <char-name>, where <school> is either `magic', one of the school names, or `all'."); - return -1; - } - - if (!strcasecmp("all", magic_type)) - skill_index = 0; - else { - int i; - for (i = 0; i < magic_skills_nr; i++) { - if (!strcasecmp(magic_skill_names[i], magic_type)) { - skill_index = i + magic_base; - break; - } - } - } +atcommand_set_magic (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char character[100]; + char magic_type[20]; + int skill_index = -1; // 0: all + int value; + struct map_session_data *pl_sd; - if (skill_index == -1) { - clif_displaymessage(fd, "Incorrect school of magic. Use `magic', `nature', `life', `war', `transmute', `ether', or `all'."); - return -1; - } + memset (character, '\0', sizeof (character)); - if ((pl_sd = map_nick2sd(character)) != NULL) { - int i; - if (skill_index == 0) - for (i = 0; i < magic_skills_nr; i++) - set_skill(pl_sd, i + magic_base, value); - else - set_skill(pl_sd, skill_index, value); + if (!message || !*message + || sscanf (message, "%19s %i %99s", magic_type, &value, + character) < 1) + { + clif_displaymessage (fd, + "Usage: @setmagic <school> <value> <char-name>, where <school> is either `magic', one of the school names, or `all'."); + return -1; + } - clif_skillinfoblock(pl_sd); - return 0; - } else - clif_displaymessage(fd, "Character not found."); + if (!strcasecmp ("all", magic_type)) + skill_index = 0; + else + { + int i; + for (i = 0; i < magic_skills_nr; i++) + { + if (!strcasecmp (magic_skill_names[i], magic_type)) + { + skill_index = i + magic_base; + break; + } + } + } + if (skill_index == -1) + { + clif_displaymessage (fd, + "Incorrect school of magic. Use `magic', `nature', `life', `war', `transmute', `ether', or `all'."); return -1; -} + } + + if ((pl_sd = map_nick2sd (character)) != NULL) + { + int i; + if (skill_index == 0) + for (i = 0; i < magic_skills_nr; i++) + set_skill (pl_sd, i + magic_base, value); + else + set_skill (pl_sd, skill_index, value); + clif_skillinfoblock (pl_sd); + return 0; + } + else + clif_displaymessage (fd, "Character not found."); + return -1; +} int -atcommand_log(const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_log (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - return 0; // only used for (implicit) logging + return 0; // only used for (implicit) logging } int -atcommand_tee(const int fd, struct map_session_data* sd, - const char* command, const char* message) -{ - char *data = malloc(strlen(message) + 28); - strcpy(data, sd->status.name); - strcat(data, " : "); - strcat(data, message); - clif_message(&sd->bl, data); - return 0; +atcommand_tee (const int fd, struct map_session_data *sd, + const char *command, const char *message) +{ + char *data = malloc (strlen (message) + 28); + strcpy (data, sd->status.name); + strcat (data, " : "); + strcat (data, message); + clif_message (&sd->bl, data); + return 0; } int -atcommand_invisible(const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_invisible (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - pc_invisibility(sd, 1); - return 0; + pc_invisibility (sd, 1); + return 0; } int -atcommand_visible(const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_visible (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - pc_invisibility(sd, 0); - return 0; + pc_invisibility (sd, 0); + return 0; } - - -int atcommand_jump_iterate( - const int fd, struct map_session_data* sd, - const char* command, const char* message, - struct map_session_data *(*get_start)(), - struct map_session_data *(*get_next)(struct map_session_data *current) - ) +int atcommand_jump_iterate (const int fd, struct map_session_data *sd, + const char *command, const char *message, + struct map_session_data *(*get_start) (), + struct map_session_data *(*get_next) (struct + map_session_data + * current)) { - char output[200]; - struct map_session_data *pl_sd; + char output[200]; + struct map_session_data *pl_sd; - memset(output, '\0', sizeof(output)); + memset (output, '\0', sizeof (output)); - pl_sd = (struct map_session_data*)map_id2bl(sd->followtarget); + pl_sd = (struct map_session_data *) map_id2bl (sd->followtarget); - if (pl_sd) - pl_sd = get_next(pl_sd); + if (pl_sd) + pl_sd = get_next (pl_sd); - if (!pl_sd) - pl_sd = get_start(); + if (!pl_sd) + pl_sd = get_start (); - if (pl_sd == sd) { - pl_sd = get_next(pl_sd); - if (!pl_sd) - pl_sd = get_start(); - } + if (pl_sd == sd) + { + pl_sd = get_next (pl_sd); + if (!pl_sd) + pl_sd = get_start (); + } - if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to the map of this player."); - return -1; - } - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); - return -1; - } - pc_setpos(sd, map[pl_sd->bl.m].name, pl_sd->bl.x, pl_sd->bl.y, 3); - sprintf(output, msg_table[4], pl_sd->status.name); // Jump to %s - clif_displaymessage(fd, output); + if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp you to the map of this player."); + return -1; + } + if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp + && battle_config.any_warp_GM_min_level > pc_isGM (sd)) + { + clif_displaymessage (fd, + "You are not authorised to warp you from your actual map."); + return -1; + } + pc_setpos (sd, map[pl_sd->bl.m].name, pl_sd->bl.x, pl_sd->bl.y, 3); + sprintf (output, msg_table[4], pl_sd->status.name); // Jump to %s + clif_displaymessage (fd, output); - sd->followtarget = pl_sd->bl.id; + sd->followtarget = pl_sd->bl.id; - return 0; + return 0; } int -atcommand_iterate_forward_over_players( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_iterate_forward_over_players (const int fd, + struct map_session_data *sd, + const char *command, + const char *message) { - return atcommand_jump_iterate(fd, sd, command, message, - map_get_first_session, map_get_next_session); + return atcommand_jump_iterate (fd, sd, command, message, + map_get_first_session, + map_get_next_session); } int -atcommand_iterate_backwards_over_players( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +atcommand_iterate_backwards_over_players (const int fd, + struct map_session_data *sd, + const char *command, + const char *message) { - return atcommand_jump_iterate(fd, sd, command, message, - map_get_last_session, map_get_prev_session); + return atcommand_jump_iterate (fd, sd, command, message, + map_get_last_session, + map_get_prev_session); } -int atcommand_wgm( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_wgm (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - tmw_GmHackMsg("%s: %s", sd->status.name, message); - if (!pc_isGM(sd)) - clif_displaymessage(fd, "Message sent."); + tmw_GmHackMsg ("%s: %s", sd->status.name, message); + if (!pc_isGM (sd)) + clif_displaymessage (fd, "Message sent."); - return 0; + return 0; } -int atcommand_skillpool_info( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_skillpool_info (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - struct map_session_data *pl_sd; - - if (!message || !*message || sscanf(message, "%99s", character) < 1) { - clif_displaymessage(fd, "Usage: @sp-info <char_name>"); - return -1; - } - - if ((pl_sd = map_nick2sd(character)) != NULL) { - char buf[200]; - int pool_skills[MAX_SKILL_POOL]; - int pool_skills_nr = skill_pool(pl_sd, pool_skills); - int i; + char character[100]; + struct map_session_data *pl_sd; - sprintf(buf, "Active skills %d out of %d for %s:", pool_skills_nr, skill_pool_max(pl_sd), character); - clif_displaymessage(fd, buf); - for (i = 0; i < pool_skills_nr; ++i) { - sprintf(buf, " - %s [%d]: power %d", skill_name(pool_skills[i]), pool_skills[i], skill_power(pl_sd, pool_skills[i])); - clif_displaymessage(fd, buf); - } + if (!message || !*message || sscanf (message, "%99s", character) < 1) + { + clif_displaymessage (fd, "Usage: @sp-info <char_name>"); + return -1; + } - sprintf(buf, "Learned skills out of %d for %s:", skill_pool_skills_size, character); - clif_displaymessage(fd, buf); + if ((pl_sd = map_nick2sd (character)) != NULL) + { + char buf[200]; + int pool_skills[MAX_SKILL_POOL]; + int pool_skills_nr = skill_pool (pl_sd, pool_skills); + int i; + + sprintf (buf, "Active skills %d out of %d for %s:", pool_skills_nr, + skill_pool_max (pl_sd), character); + clif_displaymessage (fd, buf); + for (i = 0; i < pool_skills_nr; ++i) + { + sprintf (buf, " - %s [%d]: power %d", skill_name (pool_skills[i]), + pool_skills[i], skill_power (pl_sd, pool_skills[i])); + clif_displaymessage (fd, buf); + } - for (i = 0; i < skill_pool_skills_size; ++i) { - char *name = skill_name(skill_pool_skills[i]); - int lvl = pl_sd->status.skill[skill_pool_skills[i]].lv; + sprintf (buf, "Learned skills out of %d for %s:", + skill_pool_skills_size, character); + clif_displaymessage (fd, buf); - if (lvl) { - sprintf(buf, " - %s [%d]: lvl %d", name, skill_pool_skills[i], lvl); - clif_displaymessage(fd, buf); - } - } + for (i = 0; i < skill_pool_skills_size; ++i) + { + char *name = skill_name (skill_pool_skills[i]); + int lvl = pl_sd->status.skill[skill_pool_skills[i]].lv; - } else - clif_displaymessage(fd, "Character not found."); + if (lvl) + { + sprintf (buf, " - %s [%d]: lvl %d", name, + skill_pool_skills[i], lvl); + clif_displaymessage (fd, buf); + } + } + } + else + clif_displaymessage (fd, "Character not found."); - return 0; + return 0; } -int atcommand_skillpool_focus( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_skillpool_focus (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - int skill; - struct map_session_data *pl_sd; + char character[100]; + int skill; + struct map_session_data *pl_sd; - if (!message || !*message || sscanf(message, "%d %99[^\n]", &skill, character) < 1) { - clif_displaymessage(fd, "Usage: @sp-focus <skill-nr> <char_name>"); - return -1; - } + if (!message || !*message + || sscanf (message, "%d %99[^\n]", &skill, character) < 1) + { + clif_displaymessage (fd, "Usage: @sp-focus <skill-nr> <char_name>"); + return -1; + } - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (skill_pool_activate(pl_sd, skill)) - clif_displaymessage(fd, "Activation failed."); - else - clif_displaymessage(fd, "Activation successful."); - } else - clif_displaymessage(fd, "Character not found."); + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (skill_pool_activate (pl_sd, skill)) + clif_displaymessage (fd, "Activation failed."); + else + clif_displaymessage (fd, "Activation successful."); + } + else + clif_displaymessage (fd, "Character not found."); - return 0; + return 0; } -int atcommand_skillpool_unfocus( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_skillpool_unfocus (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - int skill; - struct map_session_data *pl_sd; + char character[100]; + int skill; + struct map_session_data *pl_sd; - if (!message || !*message || sscanf(message, "%d %99[^\n]", &skill, character) < 1) { - clif_displaymessage(fd, "Usage: @sp-unfocus <skill-nr> <char_name>"); - return -1; - } + if (!message || !*message + || sscanf (message, "%d %99[^\n]", &skill, character) < 1) + { + clif_displaymessage (fd, "Usage: @sp-unfocus <skill-nr> <char_name>"); + return -1; + } - if ((pl_sd = map_nick2sd(character)) != NULL) { - if (skill_pool_deactivate(pl_sd, skill)) - clif_displaymessage(fd, "Deactivation failed."); - else - clif_displaymessage(fd, "Deactivation successful."); - } else - clif_displaymessage(fd, "Character not found."); + if ((pl_sd = map_nick2sd (character)) != NULL) + { + if (skill_pool_deactivate (pl_sd, skill)) + clif_displaymessage (fd, "Deactivation failed."); + else + clif_displaymessage (fd, "Deactivation successful."); + } + else + clif_displaymessage (fd, "Character not found."); - return 0; + return 0; } -int atcommand_skill_learn( - const int fd, struct map_session_data* sd, - const char* command, const char* message) +int atcommand_skill_learn (const int fd, struct map_session_data *sd, + const char *command, const char *message) { - char character[100]; - int skill, level; - struct map_session_data *pl_sd; + char character[100]; + int skill, level; + struct map_session_data *pl_sd; - if (!message || !*message || sscanf(message, "%d %d %99[^\n]", &skill, &level, character) < 1) { - clif_displaymessage(fd, "Usage: @skill-learn <skill-nr> <level> <char_name>"); - return -1; - } + if (!message || !*message + || sscanf (message, "%d %d %99[^\n]", &skill, &level, character) < 1) + { + clif_displaymessage (fd, + "Usage: @skill-learn <skill-nr> <level> <char_name>"); + return -1; + } - if ((pl_sd = map_nick2sd(character)) != NULL) { - set_skill(pl_sd, skill, level); - clif_skillinfoblock(pl_sd); - } else - clif_displaymessage(fd, "Character not found."); + if ((pl_sd = map_nick2sd (character)) != NULL) + { + set_skill (pl_sd, skill, level); + clif_skillinfoblock (pl_sd); + } + else + clif_displaymessage (fd, "Character not found."); - return 0; + return 0; } diff --git a/src/map/atcommand.h b/src/map/atcommand.h index 5e72b1f..afb7db5 100644 --- a/src/map/atcommand.h +++ b/src/map/atcommand.h @@ -4,218 +4,221 @@ #include "map.h" -enum AtCommandType { - AtCommand_None = -1, - AtCommand_Broadcast = 0, - AtCommand_Setup, - AtCommand_LocalBroadcast, - AtCommand_MapMove, - AtCommand_ResetState, - AtCommand_CharWarp, - AtCommand_Warp, - AtCommand_Where, - AtCommand_Goto, - AtCommand_Jump, - AtCommand_Who, - AtCommand_WhoGroup, - AtCommand_WhoMap, - AtCommand_WhoMapGroup, - AtCommand_WhoGM, - AtCommand_Save, - AtCommand_Load, - AtCommand_Speed, - AtCommand_Storage, - AtCommand_GuildStorage, - AtCommand_Option, - AtCommand_Hide, - AtCommand_Die, - AtCommand_Kill, - AtCommand_Alive, - AtCommand_Kami, - AtCommand_KamiB, - AtCommand_Heal, - AtCommand_Item, - AtCommand_ItemReset, - AtCommand_ItemCheck, - AtCommand_BaseLevelUp, - AtCommand_JobLevelUp, - AtCommand_Help, - AtCommand_GM, - AtCommand_PvPOff, - AtCommand_PvPOn, - AtCommand_GvGOff, - AtCommand_GvGOn, - AtCommand_Model, - AtCommand_Go, - AtCommand_Spawn, - AtCommand_Monster, - AtCommand_KillMonster, - AtCommand_KillMonster2, - AtCommand_Produce, - AtCommand_Memo, - AtCommand_GAT, - AtCommand_Packet, - AtCommand_StatusPoint, - AtCommand_SkillPoint, - AtCommand_Zeny, - AtCommand_Param, - AtCommand_Strength, - AtCommand_Agility, - AtCommand_Vitality, - AtCommand_Intelligence, - AtCommand_Dexterity, - AtCommand_Luck, - AtCommand_GuildLevelUp, - AtCommand_Recall, - AtCommand_Revive, - AtCommand_CharacterStats, - AtCommand_CharacterStatsAll, - AtCommand_CharacterOption, - AtCommand_CharacterSave, - AtCommand_CharacterLoad, - AtCommand_Night, - AtCommand_Day, - AtCommand_Doom, - AtCommand_DoomMap, - AtCommand_Raise, - AtCommand_RaiseMap, - AtCommand_CharacterBaseLevel, - AtCommand_CharacterJobLevel, - AtCommand_Kick, - AtCommand_KickAll, - AtCommand_AllSkills, - AtCommand_QuestSkill, - AtCommand_CharQuestSkill, - AtCommand_LostSkill, - AtCommand_CharLostSkill, - AtCommand_Party, - AtCommand_Guild, - AtCommand_AgitStart, - AtCommand_AgitEnd, - AtCommand_MapExit, - AtCommand_IDSearch, - AtCommand_CharSkReset, - AtCommand_CharStReset, - AtCommand_CharReset, - //by chbrules - AtCommand_CharModel, - AtCommand_CharSKPoint, - AtCommand_CharSTPoint, - AtCommand_CharZeny, - AtCommand_RecallAll, - AtCommand_ReloadItemDB, - AtCommand_ReloadMobDB, - AtCommand_ReloadSkillDB, - AtCommand_ReloadScript, - AtCommand_ReloadGMDB, - AtCommand_MapInfo, - AtCommand_Dye, - AtCommand_HairStyle, - AtCommand_HairColor, - AtCommand_AllStats, - AtCommand_CharChangeSex, // by Yor - AtCommand_CharBlock, // by Yor - AtCommand_CharBan, // by Yor - AtCommand_CharUnBlock, // by Yor - AtCommand_CharUnBan, // by Yor - AtCommand_MountPeco, // by Valaris - AtCommand_CharMountPeco, // by Yor - AtCommand_GuildSpy, // [Syrus22] - AtCommand_PartySpy, // [Syrus22] - AtCommand_GuildRecall, // by Yor - AtCommand_PartyRecall, // by Yor - AtCommand_Enablenpc, - AtCommand_Disablenpc, - AtCommand_ServerTime, // by Yor - AtCommand_CharDelItem, // by Yor - AtCommand_Jail, // by Yor - AtCommand_UnJail, // by Yor - AtCommand_Disguise, // [Valaris] - AtCommand_UnDisguise, // by Yor - AtCommand_IgnoreList, // by Yor - AtCommand_CharIgnoreList, // by Yor - AtCommand_InAll, // by Yor - AtCommand_ExAll, // by Yor - AtCommand_CharDisguise, // Kalaspuff - AtCommand_CharUnDisguise, // Kalaspuff - AtCommand_EMail, // by Yor - AtCommand_Hatch, - AtCommand_Effect, // by Apple - AtCommand_Char_Item_List, // by Yor - AtCommand_Char_Storage_List, // by Yor - AtCommand_Char_Cart_List, // by Yor - AtCommand_AddWarp, // by MouseJstr - AtCommand_Follow, // by MouseJstr - AtCommand_SkillOn, // by MouseJstr - AtCommand_SkillOff, // by MouseJstr - AtCommand_Killer, // by MouseJstr - AtCommand_NpcMove, // by MouseJstr - AtCommand_Killable, // by MouseJstr - AtCommand_CharKillable, // by MouseJstr - AtCommand_Chareffect, // by MouseJstr - AtCommand_Chardye, // by MouseJstr - AtCommand_Charhairstyle, // by MouseJstr - AtCommand_Charhaircolor, // by MouseJstr - AtCommand_Dropall, // by MouseJstr - AtCommand_Chardropall, // by MouseJstr - AtCommand_Storeall, // by MouseJstr - AtCommand_Charstoreall, // by MouseJstr - AtCommand_Skillid, // by MouseJstr - AtCommand_Useskill, // by MouseJstr - AtCommand_Summon, - AtCommand_Rain, - AtCommand_Snow, - AtCommand_Sakura, - AtCommand_Fog, - AtCommand_Leaves, - AtCommand_AdjGmLvl, - AtCommand_AdjCmdLvl, - AtCommand_Trade, - AtCommand_UnMute, - AtCommand_CharWipe, - AtCommand_SetMagic, - AtCommand_MagicInfo, - AtCommand_Log, - AtCommand_Tee, - AtCommand_Invisible, - AtCommand_Visible, - AtCommand_IterateForward, - AtCommand_IterateBackward, - AtCommand_Wgm, - AtCommand_ListNearby, // [fate] - // end - AtCommand_Unknown, - AtCommand_MAX +enum AtCommandType +{ + AtCommand_None = -1, + AtCommand_Broadcast = 0, + AtCommand_Setup, + AtCommand_LocalBroadcast, + AtCommand_MapMove, + AtCommand_ResetState, + AtCommand_CharWarp, + AtCommand_Warp, + AtCommand_Where, + AtCommand_Goto, + AtCommand_Jump, + AtCommand_Who, + AtCommand_WhoGroup, + AtCommand_WhoMap, + AtCommand_WhoMapGroup, + AtCommand_WhoGM, + AtCommand_Save, + AtCommand_Load, + AtCommand_Speed, + AtCommand_Storage, + AtCommand_GuildStorage, + AtCommand_Option, + AtCommand_Hide, + AtCommand_Die, + AtCommand_Kill, + AtCommand_Alive, + AtCommand_Kami, + AtCommand_KamiB, + AtCommand_Heal, + AtCommand_Item, + AtCommand_ItemReset, + AtCommand_ItemCheck, + AtCommand_BaseLevelUp, + AtCommand_JobLevelUp, + AtCommand_Help, + AtCommand_GM, + AtCommand_PvPOff, + AtCommand_PvPOn, + AtCommand_GvGOff, + AtCommand_GvGOn, + AtCommand_Model, + AtCommand_Go, + AtCommand_Spawn, + AtCommand_Monster, + AtCommand_KillMonster, + AtCommand_KillMonster2, + AtCommand_Produce, + AtCommand_Memo, + AtCommand_GAT, + AtCommand_Packet, + AtCommand_StatusPoint, + AtCommand_SkillPoint, + AtCommand_Zeny, + AtCommand_Param, + AtCommand_Strength, + AtCommand_Agility, + AtCommand_Vitality, + AtCommand_Intelligence, + AtCommand_Dexterity, + AtCommand_Luck, + AtCommand_GuildLevelUp, + AtCommand_Recall, + AtCommand_Revive, + AtCommand_CharacterStats, + AtCommand_CharacterStatsAll, + AtCommand_CharacterOption, + AtCommand_CharacterSave, + AtCommand_CharacterLoad, + AtCommand_Night, + AtCommand_Day, + AtCommand_Doom, + AtCommand_DoomMap, + AtCommand_Raise, + AtCommand_RaiseMap, + AtCommand_CharacterBaseLevel, + AtCommand_CharacterJobLevel, + AtCommand_Kick, + AtCommand_KickAll, + AtCommand_AllSkills, + AtCommand_QuestSkill, + AtCommand_CharQuestSkill, + AtCommand_LostSkill, + AtCommand_CharLostSkill, + AtCommand_Party, + AtCommand_Guild, + AtCommand_AgitStart, + AtCommand_AgitEnd, + AtCommand_MapExit, + AtCommand_IDSearch, + AtCommand_CharSkReset, + AtCommand_CharStReset, + AtCommand_CharReset, + //by chbrules + AtCommand_CharModel, + AtCommand_CharSKPoint, + AtCommand_CharSTPoint, + AtCommand_CharZeny, + AtCommand_RecallAll, + AtCommand_ReloadItemDB, + AtCommand_ReloadMobDB, + AtCommand_ReloadSkillDB, + AtCommand_ReloadScript, + AtCommand_ReloadGMDB, + AtCommand_MapInfo, + AtCommand_Dye, + AtCommand_HairStyle, + AtCommand_HairColor, + AtCommand_AllStats, + AtCommand_CharChangeSex, // by Yor + AtCommand_CharBlock, // by Yor + AtCommand_CharBan, // by Yor + AtCommand_CharUnBlock, // by Yor + AtCommand_CharUnBan, // by Yor + AtCommand_MountPeco, // by Valaris + AtCommand_CharMountPeco, // by Yor + AtCommand_GuildSpy, // [Syrus22] + AtCommand_PartySpy, // [Syrus22] + AtCommand_GuildRecall, // by Yor + AtCommand_PartyRecall, // by Yor + AtCommand_Enablenpc, + AtCommand_Disablenpc, + AtCommand_ServerTime, // by Yor + AtCommand_CharDelItem, // by Yor + AtCommand_Jail, // by Yor + AtCommand_UnJail, // by Yor + AtCommand_Disguise, // [Valaris] + AtCommand_UnDisguise, // by Yor + AtCommand_IgnoreList, // by Yor + AtCommand_CharIgnoreList, // by Yor + AtCommand_InAll, // by Yor + AtCommand_ExAll, // by Yor + AtCommand_CharDisguise, // Kalaspuff + AtCommand_CharUnDisguise, // Kalaspuff + AtCommand_EMail, // by Yor + AtCommand_Hatch, + AtCommand_Effect, // by Apple + AtCommand_Char_Item_List, // by Yor + AtCommand_Char_Storage_List, // by Yor + AtCommand_Char_Cart_List, // by Yor + AtCommand_AddWarp, // by MouseJstr + AtCommand_Follow, // by MouseJstr + AtCommand_SkillOn, // by MouseJstr + AtCommand_SkillOff, // by MouseJstr + AtCommand_Killer, // by MouseJstr + AtCommand_NpcMove, // by MouseJstr + AtCommand_Killable, // by MouseJstr + AtCommand_CharKillable, // by MouseJstr + AtCommand_Chareffect, // by MouseJstr + AtCommand_Chardye, // by MouseJstr + AtCommand_Charhairstyle, // by MouseJstr + AtCommand_Charhaircolor, // by MouseJstr + AtCommand_Dropall, // by MouseJstr + AtCommand_Chardropall, // by MouseJstr + AtCommand_Storeall, // by MouseJstr + AtCommand_Charstoreall, // by MouseJstr + AtCommand_Skillid, // by MouseJstr + AtCommand_Useskill, // by MouseJstr + AtCommand_Summon, + AtCommand_Rain, + AtCommand_Snow, + AtCommand_Sakura, + AtCommand_Fog, + AtCommand_Leaves, + AtCommand_AdjGmLvl, + AtCommand_AdjCmdLvl, + AtCommand_Trade, + AtCommand_UnMute, + AtCommand_CharWipe, + AtCommand_SetMagic, + AtCommand_MagicInfo, + AtCommand_Log, + AtCommand_Tee, + AtCommand_Invisible, + AtCommand_Visible, + AtCommand_IterateForward, + AtCommand_IterateBackward, + AtCommand_Wgm, + AtCommand_ListNearby, // [fate] + // end + AtCommand_Unknown, + AtCommand_MAX }; typedef enum AtCommandType AtCommandType; -typedef struct AtCommandInfo { - AtCommandType type; - const char* command; - int level; - int (*proc)(const int, struct map_session_data*, - const char* command, const char* message); +typedef struct AtCommandInfo +{ + AtCommandType type; + const char *command; + int level; + int (*proc) (const int, struct map_session_data *, + const char *command, const char *message); } AtCommandInfo; -AtCommandType is_atcommand(const int fd, struct map_session_data* sd, const char* message, int gmlvl); +AtCommandType is_atcommand (const int fd, struct map_session_data *sd, + const char *message, int gmlvl); -AtCommandType atcommand(const int level, const char* message, AtCommandInfo* info); -int get_atcommand_level(const AtCommandType type); +AtCommandType atcommand (const int level, const char *message, + AtCommandInfo * info); +int get_atcommand_level (const AtCommandType type); -char * msg_txt(int msg_number); // [Yor] +char *msg_txt (int msg_number); // [Yor] -int atcommand_item(const int fd, struct map_session_data* sd, const char* command, const char* message); // [Valaris] -int atcommand_warp(const int fd, struct map_session_data* sd, const char* command, const char* message); // [Yor] -int atcommand_spawn(const int fd, struct map_session_data* sd, const char* command, const char* message); // [Valaris] -int atcommand_goto(const int fd, struct map_session_data* sd, const char* command, const char* message); // [Yor] -int atcommand_recall(const int fd, struct map_session_data* sd, const char* command, const char* message); // [Yor] +int atcommand_item (const int fd, struct map_session_data *sd, const char *command, const char *message); // [Valaris] +int atcommand_warp (const int fd, struct map_session_data *sd, const char *command, const char *message); // [Yor] +int atcommand_spawn (const int fd, struct map_session_data *sd, const char *command, const char *message); // [Valaris] +int atcommand_goto (const int fd, struct map_session_data *sd, const char *command, const char *message); // [Yor] +int atcommand_recall (const int fd, struct map_session_data *sd, const char *command, const char *message); // [Yor] -int atcommand_config_read(const char *cfgName); -int msg_config_read(const char *cfgName); +int atcommand_config_read (const char *cfgName); +int msg_config_read (const char *cfgName); -void log_atcommand(struct map_session_data *sd, const char *fmt, ...); -void gm_log(const char *fmt, ...); +void log_atcommand (struct map_session_data *sd, const char *fmt, ...); +void gm_log (const char *fmt, ...); #endif - diff --git a/src/map/battle.c b/src/map/battle.c index 177c63e..579ea55 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -24,7 +24,7 @@ #include "memwatch.h" #endif -int attr_fix_table[4][10][10]; +int attr_fix_table[4][10][10]; struct Battle_Config battle_config; @@ -33,13 +33,13 @@ struct Battle_Config battle_config; * 戻りは整数で0以上 *------------------------------------------ */ -static int distance(int x0,int y0,int x1,int y1) +static int distance (int x0, int y0, int x1, int y1) { - int dx,dy; + int dx, dy; - dx=abs(x0-x1); - dy=abs(y0-y1); - return dx>dy ? dx : dy; + dx = abs (x0 - x1); + dy = abs (y0 - y1); + return dx > dy ? dx : dy; } /*========================================== @@ -47,311 +47,359 @@ static int distance(int x0,int y0,int x1,int y1) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_counttargeted(struct block_list *bl,struct block_list *src,int target_lv) +int battle_counttargeted (struct block_list *bl, struct block_list *src, + int target_lv) { - nullpo_retr(0, bl); - if(bl->type == BL_PC) - return pc_counttargeted((struct map_session_data *)bl,src,target_lv); - else if(bl->type == BL_MOB) - return mob_counttargeted((struct mob_data *)bl,src,target_lv); - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_PC) + return pc_counttargeted ((struct map_session_data *) bl, src, + target_lv); + else if (bl->type == BL_MOB) + return mob_counttargeted ((struct mob_data *) bl, src, target_lv); + return 0; } + /*========================================== * 対象のClassを返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_class(struct block_list *bl) +int battle_get_class (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - return ((struct mob_data *)bl)->class; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return ((struct map_session_data *)bl)->status.class; - else - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + return ((struct mob_data *) bl)->class; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return ((struct map_session_data *) bl)->status.class; + else + return 0; } + /*========================================== * 対象の方向を返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_dir(struct block_list *bl) +int battle_get_dir (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - return ((struct mob_data *)bl)->dir; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return ((struct map_session_data *)bl)->dir; - else - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + return ((struct mob_data *) bl)->dir; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return ((struct map_session_data *) bl)->dir; + else + return 0; } + /*========================================== * 対象のレベルを返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_lv(struct block_list *bl) +int battle_get_lv (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - return ((struct mob_data *)bl)->stats[MOB_LV]; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return ((struct map_session_data *)bl)->status.base_level; - else - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + return ((struct mob_data *) bl)->stats[MOB_LV]; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return ((struct map_session_data *) bl)->status.base_level; + else + return 0; } + /*========================================== * 対象の射程を返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_range(struct block_list *bl) +int battle_get_range (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - return mob_db[((struct mob_data *)bl)->class].range; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return ((struct map_session_data *)bl)->attackrange; - else - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + return mob_db[((struct mob_data *) bl)->class].range; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return ((struct map_session_data *) bl)->attackrange; + else + return 0; } + /*========================================== * 対象のHPを返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_hp(struct block_list *bl) +int battle_get_hp (struct block_list *bl) { - nullpo_retr(1, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - return ((struct mob_data *)bl)->hp; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return ((struct map_session_data *)bl)->status.hp; - else - return 1; + nullpo_retr (1, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + return ((struct mob_data *) bl)->hp; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return ((struct map_session_data *) bl)->status.hp; + else + return 1; } + /*========================================== * 対象のMHPを返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_max_hp(struct block_list *bl) +int battle_get_max_hp (struct block_list *bl) { - nullpo_retr(1, bl); - if(bl->type==BL_PC && ((struct map_session_data *)bl)) - return ((struct map_session_data *)bl)->status.max_hp; - else { - struct status_change *sc_data=battle_get_sc_data(bl); - int max_hp=1; - if(bl->type==BL_MOB && ((struct mob_data*)bl)) { - max_hp = ((struct mob_data*)bl)->stats[MOB_MAX_HP]; - if(mob_db[((struct mob_data*)bl)->class].mexp > 0) { - if(battle_config.mvp_hp_rate != 100) - max_hp = (max_hp * battle_config.mvp_hp_rate)/100; - } - else { - if(battle_config.monster_hp_rate != 100) - max_hp = (max_hp * battle_config.monster_hp_rate)/100; - } - } - if(sc_data) { - if(sc_data[SC_APPLEIDUN].timer!=-1) - max_hp += ((5+sc_data[SC_APPLEIDUN].val1*2+((sc_data[SC_APPLEIDUN].val2+1)>>1) - +sc_data[SC_APPLEIDUN].val3/10) * max_hp)/100; - } - if(max_hp < 1) max_hp = 1; - return max_hp; - } - return 1; + nullpo_retr (1, bl); + if (bl->type == BL_PC && ((struct map_session_data *) bl)) + return ((struct map_session_data *) bl)->status.max_hp; + else + { + struct status_change *sc_data = battle_get_sc_data (bl); + int max_hp = 1; + if (bl->type == BL_MOB && ((struct mob_data *) bl)) + { + max_hp = ((struct mob_data *) bl)->stats[MOB_MAX_HP]; + if (mob_db[((struct mob_data *) bl)->class].mexp > 0) + { + if (battle_config.mvp_hp_rate != 100) + max_hp = (max_hp * battle_config.mvp_hp_rate) / 100; + } + else + { + if (battle_config.monster_hp_rate != 100) + max_hp = (max_hp * battle_config.monster_hp_rate) / 100; + } + } + if (sc_data) + { + if (sc_data[SC_APPLEIDUN].timer != -1) + max_hp += + ((5 + sc_data[SC_APPLEIDUN].val1 * 2 + + ((sc_data[SC_APPLEIDUN].val2 + 1) >> 1) + + sc_data[SC_APPLEIDUN].val3 / 10) * max_hp) / 100; + } + if (max_hp < 1) + max_hp = 1; + return max_hp; + } + return 1; } + /*========================================== * 対象のStrを返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_str(struct block_list *bl) +int battle_get_str (struct block_list *bl) { - int str=0; - struct status_change *sc_data; - - nullpo_retr(0, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_MOB && ((struct mob_data *)bl)) - str = ((struct mob_data *)bl)->stats[MOB_STR]; - else if(bl->type==BL_PC && ((struct map_session_data *)bl)) - return ((struct map_session_data *)bl)->paramc[0]; - - if(sc_data) { - if(sc_data[SC_LOUD].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC) - str += 4; - if( sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC){ // ブレッシング - int race=battle_get_race(bl); - if(battle_check_undead(race,battle_get_elem_type(bl)) || race==6 ) str >>= 1; // 悪 魔/不死 - else str += sc_data[SC_BLESSING].val1; // その他 - } - if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // トゥルーサイト - str += 5; - } - if(str < 0) str = 0; - return str; + int str = 0; + struct status_change *sc_data; + + nullpo_retr (0, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_MOB && ((struct mob_data *) bl)) + str = ((struct mob_data *) bl)->stats[MOB_STR]; + else if (bl->type == BL_PC && ((struct map_session_data *) bl)) + return ((struct map_session_data *) bl)->paramc[0]; + + if (sc_data) + { + if (sc_data[SC_LOUD].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 + && bl->type != BL_PC) + str += 4; + if (sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC) + { // ブレッシング + int race = battle_get_race (bl); + if (battle_check_undead (race, battle_get_elem_type (bl)) + || race == 6) + str >>= 1; // 悪 魔/不死 + else + str += sc_data[SC_BLESSING].val1; // その他 + } + if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト + str += 5; + } + if (str < 0) + str = 0; + return str; } + /*========================================== * 対象のAgiを返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_agi(struct block_list *bl) +int battle_get_agi (struct block_list *bl) { - int agi=0; - struct status_change *sc_data; - - nullpo_retr(0, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - agi=((struct mob_data *)bl)->stats[MOB_AGI]; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - agi=((struct map_session_data *)bl)->paramc[1]; - - if(sc_data) { - if( sc_data[SC_INCREASEAGI].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1 && - bl->type != BL_PC) // 速度増加(PCはpc.cで) - agi += 2+sc_data[SC_INCREASEAGI].val1; - - if(sc_data[SC_CONCENTRATE].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC) - agi += agi*(2+sc_data[SC_CONCENTRATE].val1)/100; - - if(sc_data[SC_DECREASEAGI].timer!=-1) // 速度減少 - agi -= 2+sc_data[SC_DECREASEAGI].val1; - - if(sc_data[SC_QUAGMIRE].timer!=-1 ) // クァグマイア - agi >>= 1; - if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // トゥルーサイト - agi += 5; - } - if(agi < 0) agi = 0; - return agi; + int agi = 0; + struct status_change *sc_data; + + nullpo_retr (0, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + agi = ((struct mob_data *) bl)->stats[MOB_AGI]; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + agi = ((struct map_session_data *) bl)->paramc[1]; + + if (sc_data) + { + if (sc_data[SC_INCREASEAGI].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1 && bl->type != BL_PC) // 速度増加(PCはpc.cで) + agi += 2 + sc_data[SC_INCREASEAGI].val1; + + if (sc_data[SC_CONCENTRATE].timer != -1 + && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC) + agi += agi * (2 + sc_data[SC_CONCENTRATE].val1) / 100; + + if (sc_data[SC_DECREASEAGI].timer != -1) // 速度減少 + agi -= 2 + sc_data[SC_DECREASEAGI].val1; + + if (sc_data[SC_QUAGMIRE].timer != -1) // クァグマイア + agi >>= 1; + if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト + agi += 5; + } + if (agi < 0) + agi = 0; + return agi; } + /*========================================== * 対象のVitを返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_vit(struct block_list *bl) +int battle_get_vit (struct block_list *bl) { - int vit=0; - struct status_change *sc_data; - - nullpo_retr(0, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - vit=((struct mob_data *)bl)->stats[MOB_VIT]; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - vit=((struct map_session_data *)bl)->paramc[2]; - if(sc_data) { - if(sc_data[SC_STRIPARMOR].timer != -1 && bl->type!=BL_PC) - vit = vit*60/100; - if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // トゥルーサイト - vit += 5; - } - - if(vit < 0) vit = 0; - return vit; + int vit = 0; + struct status_change *sc_data; + + nullpo_retr (0, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + vit = ((struct mob_data *) bl)->stats[MOB_VIT]; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + vit = ((struct map_session_data *) bl)->paramc[2]; + if (sc_data) + { + if (sc_data[SC_STRIPARMOR].timer != -1 && bl->type != BL_PC) + vit = vit * 60 / 100; + if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト + vit += 5; + } + + if (vit < 0) + vit = 0; + return vit; } + /*========================================== * 対象のIntを返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_int(struct block_list *bl) +int battle_get_int (struct block_list *bl) { - int int_=0; - struct status_change *sc_data; - - nullpo_retr(0, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - int_=((struct mob_data *)bl)->stats[MOB_INT]; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - int_=((struct map_session_data *)bl)->paramc[3]; - - if(sc_data) { - if( sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC){ // ブレッシング - int race=battle_get_race(bl); - if(battle_check_undead(race,battle_get_elem_type(bl)) || race==6 ) int_ >>= 1; // 悪 魔/不死 - else int_ += sc_data[SC_BLESSING].val1; // その他 - } - if( sc_data[SC_STRIPHELM].timer != -1 && bl->type != BL_PC) - int_ = int_*60/100; - if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // トゥルーサイト - int_ += 5; - } - if(int_ < 0) int_ = 0; - return int_; + int int_ = 0; + struct status_change *sc_data; + + nullpo_retr (0, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + int_ = ((struct mob_data *) bl)->stats[MOB_INT]; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + int_ = ((struct map_session_data *) bl)->paramc[3]; + + if (sc_data) + { + if (sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC) + { // ブレッシング + int race = battle_get_race (bl); + if (battle_check_undead (race, battle_get_elem_type (bl)) + || race == 6) + int_ >>= 1; // 悪 魔/不死 + else + int_ += sc_data[SC_BLESSING].val1; // その他 + } + if (sc_data[SC_STRIPHELM].timer != -1 && bl->type != BL_PC) + int_ = int_ * 60 / 100; + if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト + int_ += 5; + } + if (int_ < 0) + int_ = 0; + return int_; } + /*========================================== * 対象のDexを返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_dex(struct block_list *bl) +int battle_get_dex (struct block_list *bl) { - int dex=0; - struct status_change *sc_data; - - nullpo_retr(0, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - dex=((struct mob_data *)bl)->stats[MOB_DEX]; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - dex=((struct map_session_data *)bl)->paramc[4]; - - if(sc_data) { - if(sc_data[SC_CONCENTRATE].timer!=-1 && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC) - dex += dex*(2+sc_data[SC_CONCENTRATE].val1)/100; - - if( sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC){ // ブレッシング - int race=battle_get_race(bl); - if(battle_check_undead(race,battle_get_elem_type(bl)) || race==6 ) dex >>= 1; // 悪 魔/不死 - else dex += sc_data[SC_BLESSING].val1; // その他 - } - - if(sc_data[SC_QUAGMIRE].timer!=-1 ) // クァグマイア - dex >>= 1; - if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // トゥルーサイト - dex += 5; - } - if(dex < 0) dex = 0; - return dex; + int dex = 0; + struct status_change *sc_data; + + nullpo_retr (0, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + dex = ((struct mob_data *) bl)->stats[MOB_DEX]; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + dex = ((struct map_session_data *) bl)->paramc[4]; + + if (sc_data) + { + if (sc_data[SC_CONCENTRATE].timer != -1 + && sc_data[SC_QUAGMIRE].timer == -1 && bl->type != BL_PC) + dex += dex * (2 + sc_data[SC_CONCENTRATE].val1) / 100; + + if (sc_data[SC_BLESSING].timer != -1 && bl->type != BL_PC) + { // ブレッシング + int race = battle_get_race (bl); + if (battle_check_undead (race, battle_get_elem_type (bl)) + || race == 6) + dex >>= 1; // 悪 魔/不死 + else + dex += sc_data[SC_BLESSING].val1; // その他 + } + + if (sc_data[SC_QUAGMIRE].timer != -1) // クァグマイア + dex >>= 1; + if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト + dex += 5; + } + if (dex < 0) + dex = 0; + return dex; } + /*========================================== * 対象のLukを返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_luk(struct block_list *bl) +int battle_get_luk (struct block_list *bl) { - int luk=0; - struct status_change *sc_data; - - nullpo_retr(0, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - luk=((struct mob_data *)bl)->stats[MOB_LUK]; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - luk=((struct map_session_data *)bl)->paramc[5]; - - if(sc_data) { - if(sc_data[SC_GLORIA].timer!=-1 && bl->type != BL_PC) // グロリア(PCはpc.cで) - luk += 30; - if(sc_data[SC_CURSE].timer!=-1 ) // 呪い - luk=0; - if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // トゥルーサイト - luk += 5; - } - if(luk < 0) luk = 0; - return luk; + int luk = 0; + struct status_change *sc_data; + + nullpo_retr (0, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + luk = ((struct mob_data *) bl)->stats[MOB_LUK]; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + luk = ((struct map_session_data *) bl)->paramc[5]; + + if (sc_data) + { + if (sc_data[SC_GLORIA].timer != -1 && bl->type != BL_PC) // グロリア(PCはpc.cで) + luk += 30; + if (sc_data[SC_CURSE].timer != -1) // 呪い + luk = 0; + if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト + luk += 5; + } + if (luk < 0) + luk = 0; + return luk; } /*========================================== @@ -359,2131 +407,2551 @@ int battle_get_luk(struct block_list *bl) * 戻りは整数で1以上 *------------------------------------------ */ -int battle_get_flee(struct block_list *bl) +int battle_get_flee (struct block_list *bl) { - int flee=1; - struct status_change *sc_data; - - nullpo_retr(1, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_PC && (struct map_session_data *)bl) - flee=((struct map_session_data *)bl)->flee; - else - flee=battle_get_agi(bl) + battle_get_lv(bl); - - if(sc_data) { - if(sc_data[SC_WHISTLE].timer!=-1 && bl->type != BL_PC) - flee += flee*(sc_data[SC_WHISTLE].val1+sc_data[SC_WHISTLE].val2 - +(sc_data[SC_WHISTLE].val3>>16))/100; - if(sc_data[SC_BLIND].timer!=-1 && bl->type != BL_PC) - flee -= flee*25/100; - if(sc_data[SC_WINDWALK].timer!=-1 && bl->type != BL_PC) // ウィンドウォーク - flee += flee*(sc_data[SC_WINDWALK].val2)/100; - if(sc_data[SC_SPIDERWEB].timer!=-1 && bl->type != BL_PC) //スパイダーウェブ - flee -= flee*50/100; - - if (battle_is_unarmed(bl)) - flee += (skill_power_bl(bl, TMW_BRAWLING) >> 3); // +25 for 200 - flee += skill_power_bl(bl, TMW_SPEED) >> 3; - } - if(flee < 1) flee = 1; - return flee; + int flee = 1; + struct status_change *sc_data; + + nullpo_retr (1, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + flee = ((struct map_session_data *) bl)->flee; + else + flee = battle_get_agi (bl) + battle_get_lv (bl); + + if (sc_data) + { + if (sc_data[SC_WHISTLE].timer != -1 && bl->type != BL_PC) + flee += + flee * (sc_data[SC_WHISTLE].val1 + sc_data[SC_WHISTLE].val2 + + (sc_data[SC_WHISTLE].val3 >> 16)) / 100; + if (sc_data[SC_BLIND].timer != -1 && bl->type != BL_PC) + flee -= flee * 25 / 100; + if (sc_data[SC_WINDWALK].timer != -1 && bl->type != BL_PC) // ウィンドウォーク + flee += flee * (sc_data[SC_WINDWALK].val2) / 100; + if (sc_data[SC_SPIDERWEB].timer != -1 && bl->type != BL_PC) //スパイダーウェブ + flee -= flee * 50 / 100; + + if (battle_is_unarmed (bl)) + flee += (skill_power_bl (bl, TMW_BRAWLING) >> 3); // +25 for 200 + flee += skill_power_bl (bl, TMW_SPEED) >> 3; + } + if (flee < 1) + flee = 1; + return flee; } + /*========================================== * 対象のHitを返す(汎用) * 戻りは整数で1以上 *------------------------------------------ */ -int battle_get_hit(struct block_list *bl) +int battle_get_hit (struct block_list *bl) { - int hit=1; - struct status_change *sc_data; - - nullpo_retr(1, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_PC && (struct map_session_data *)bl) - hit=((struct map_session_data *)bl)->hit; - else - hit=battle_get_dex(bl) + battle_get_lv(bl); - - if(sc_data) { - if(sc_data[SC_HUMMING].timer!=-1 && bl->type != BL_PC) // - hit += hit*(sc_data[SC_HUMMING].val1*2+sc_data[SC_HUMMING].val2 - +sc_data[SC_HUMMING].val3)/100; - if(sc_data[SC_BLIND].timer!=-1 && bl->type != BL_PC) // 呪い - hit -= hit*25/100; - if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) // トゥルーサイト - hit += 3*(sc_data[SC_TRUESIGHT].val1); - if(sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) //コンセントレーション - hit += (hit*(10*(sc_data[SC_CONCENTRATION].val1)))/100; - - if (battle_is_unarmed(bl)) - hit += (skill_power_bl(bl, TMW_BRAWLING) >> 4); // +12 for 200 - } - if(hit < 1) hit = 1; - return hit; + int hit = 1; + struct status_change *sc_data; + + nullpo_retr (1, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + hit = ((struct map_session_data *) bl)->hit; + else + hit = battle_get_dex (bl) + battle_get_lv (bl); + + if (sc_data) + { + if (sc_data[SC_HUMMING].timer != -1 && bl->type != BL_PC) // + hit += + hit * (sc_data[SC_HUMMING].val1 * 2 + + sc_data[SC_HUMMING].val2 + + sc_data[SC_HUMMING].val3) / 100; + if (sc_data[SC_BLIND].timer != -1 && bl->type != BL_PC) // 呪い + hit -= hit * 25 / 100; + if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) // トゥルーサイト + hit += 3 * (sc_data[SC_TRUESIGHT].val1); + if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC) //コンセントレーション + hit += (hit * (10 * (sc_data[SC_CONCENTRATION].val1))) / 100; + + if (battle_is_unarmed (bl)) + hit += (skill_power_bl (bl, TMW_BRAWLING) >> 4); // +12 for 200 + } + if (hit < 1) + hit = 1; + return hit; } + /*========================================== * 対象の完全回避を返す(汎用) * 戻りは整数で1以上 *------------------------------------------ */ -int battle_get_flee2(struct block_list *bl) +int battle_get_flee2 (struct block_list *bl) { - int flee2=1; - struct status_change *sc_data; - - nullpo_retr(1, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_PC && (struct map_session_data *)bl){ - flee2 = battle_get_luk(bl) + 10; - flee2 += ((struct map_session_data *)bl)->flee2 - (((struct map_session_data *)bl)->paramc[5] + 10); - } - else - flee2=battle_get_luk(bl)+1; - - if(sc_data) { - if(sc_data[SC_WHISTLE].timer!=-1 && bl->type != BL_PC) - flee2 += (sc_data[SC_WHISTLE].val1+sc_data[SC_WHISTLE].val2 - +(sc_data[SC_WHISTLE].val3&0xffff))*10; - - if (battle_is_unarmed(bl)) - flee2 += (skill_power_bl(bl, TMW_BRAWLING) >> 3); // +25 for 200 - flee2 += skill_power_bl(bl, TMW_SPEED) >> 3; - } - if(flee2 < 1) flee2 = 1; - return flee2; + int flee2 = 1; + struct status_change *sc_data; + + nullpo_retr (1, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + { + flee2 = battle_get_luk (bl) + 10; + flee2 += + ((struct map_session_data *) bl)->flee2 - + (((struct map_session_data *) bl)->paramc[5] + 10); + } + else + flee2 = battle_get_luk (bl) + 1; + + if (sc_data) + { + if (sc_data[SC_WHISTLE].timer != -1 && bl->type != BL_PC) + flee2 += (sc_data[SC_WHISTLE].val1 + sc_data[SC_WHISTLE].val2 + + (sc_data[SC_WHISTLE].val3 & 0xffff)) * 10; + + if (battle_is_unarmed (bl)) + flee2 += (skill_power_bl (bl, TMW_BRAWLING) >> 3); // +25 for 200 + flee2 += skill_power_bl (bl, TMW_SPEED) >> 3; + } + if (flee2 < 1) + flee2 = 1; + return flee2; } + /*========================================== * 対象のクリティカルを返す(汎用) * 戻りは整数で1以上 *------------------------------------------ */ -int battle_get_critical(struct block_list *bl) +int battle_get_critical (struct block_list *bl) { - int critical=1; - struct status_change *sc_data; - - nullpo_retr(1, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_PC && (struct map_session_data *)bl){ - critical = battle_get_luk(bl)*2 + 10; - critical += ((struct map_session_data *)bl)->critical - ((((struct map_session_data *)bl)->paramc[5]*3) + 10); - } - else - critical=battle_get_luk(bl)*3 + 1; - - if(sc_data) { - if(sc_data[SC_FORTUNE].timer!=-1 && bl->type != BL_PC) - critical += (10+sc_data[SC_FORTUNE].val1+sc_data[SC_FORTUNE].val2 - +sc_data[SC_FORTUNE].val3)*10; - if(sc_data[SC_EXPLOSIONSPIRITS].timer!=-1 && bl->type != BL_PC) - critical += sc_data[SC_EXPLOSIONSPIRITS].val2; - if(sc_data[SC_TRUESIGHT].timer!=-1 && bl->type != BL_PC) //トゥルーサイト - critical += critical*sc_data[SC_TRUESIGHT].val1/100; - } - if(critical < 1) critical = 1; - return critical; + int critical = 1; + struct status_change *sc_data; + + nullpo_retr (1, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + { + critical = battle_get_luk (bl) * 2 + 10; + critical += + ((struct map_session_data *) bl)->critical - + ((((struct map_session_data *) bl)->paramc[5] * 3) + 10); + } + else + critical = battle_get_luk (bl) * 3 + 1; + + if (sc_data) + { + if (sc_data[SC_FORTUNE].timer != -1 && bl->type != BL_PC) + critical += + (10 + sc_data[SC_FORTUNE].val1 + sc_data[SC_FORTUNE].val2 + + sc_data[SC_FORTUNE].val3) * 10; + if (sc_data[SC_EXPLOSIONSPIRITS].timer != -1 && bl->type != BL_PC) + critical += sc_data[SC_EXPLOSIONSPIRITS].val2; + if (sc_data[SC_TRUESIGHT].timer != -1 && bl->type != BL_PC) //トゥルーサイト + critical += critical * sc_data[SC_TRUESIGHT].val1 / 100; + } + if (critical < 1) + critical = 1; + return critical; } + /*========================================== * base_atkの取得 * 戻りは整数で1以上 *------------------------------------------ */ -int battle_get_baseatk(struct block_list *bl) +int battle_get_baseatk (struct block_list *bl) { - struct status_change *sc_data; - int batk=1; - - nullpo_retr(1, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_PC && (struct map_session_data *)bl) - batk = ((struct map_session_data *)bl)->base_atk; //設定されているbase_atk - else { //それ以外なら - int str,dstr; - str = battle_get_str(bl); //STR - dstr = str/10; - batk = dstr*dstr + str; //base_atkを計算する - } - if(sc_data) { //状態異常あり - if(sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC) //PCでプロボック(SM_PROVOKE)状態 - batk = batk*(100+2*sc_data[SC_PROVOKE].val1)/100; //base_atk増加 - if(sc_data[SC_CURSE].timer!=-1 ) //呪われていたら - batk -= batk*25/100; //base_atkが25%減少 - if(sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) //コンセントレーション - batk += batk*(5*sc_data[SC_CONCENTRATION].val1)/100; - } - if(batk < 1) batk = 1; //base_atkは最低でも1 - return batk; + struct status_change *sc_data; + int batk = 1; + + nullpo_retr (1, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + batk = ((struct map_session_data *) bl)->base_atk; //設定されているbase_atk + else + { //それ以外なら + int str, dstr; + str = battle_get_str (bl); //STR + dstr = str / 10; + batk = dstr * dstr + str; //base_atkを計算する + } + if (sc_data) + { //状態異常あり + if (sc_data[SC_PROVOKE].timer != -1 && bl->type != BL_PC) //PCでプロボック(SM_PROVOKE)状態 + batk = batk * (100 + 2 * sc_data[SC_PROVOKE].val1) / 100; //base_atk増加 + if (sc_data[SC_CURSE].timer != -1) //呪われていたら + batk -= batk * 25 / 100; //base_atkが25%減少 + if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC) //コンセントレーション + batk += batk * (5 * sc_data[SC_CONCENTRATION].val1) / 100; + } + if (batk < 1) + batk = 1; //base_atkは最低でも1 + return batk; } + /*========================================== * 対象のAtkを返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_atk(struct block_list *bl) +int battle_get_atk (struct block_list *bl) { - struct status_change *sc_data; - int atk=0; - - nullpo_retr(0, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_PC && (struct map_session_data *)bl) - atk = ((struct map_session_data*)bl)->watk; - else if(bl->type==BL_MOB && (struct mob_data *)bl) - atk = ((struct mob_data*)bl)->stats[MOB_ATK1]; - - if(sc_data) { - if(sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC) - atk = atk*(100+2*sc_data[SC_PROVOKE].val1)/100; - if(sc_data[SC_CURSE].timer!=-1 ) - atk -= atk*25/100; - if(sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) //コンセントレーション - atk += atk*(5*sc_data[SC_CONCENTRATION].val1)/100; - } - if(atk < 0) atk = 0; - return atk; + struct status_change *sc_data; + int atk = 0; + + nullpo_retr (0, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + atk = ((struct map_session_data *) bl)->watk; + else if (bl->type == BL_MOB && (struct mob_data *) bl) + atk = ((struct mob_data *) bl)->stats[MOB_ATK1]; + + if (sc_data) + { + if (sc_data[SC_PROVOKE].timer != -1 && bl->type != BL_PC) + atk = atk * (100 + 2 * sc_data[SC_PROVOKE].val1) / 100; + if (sc_data[SC_CURSE].timer != -1) + atk -= atk * 25 / 100; + if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC) //コンセントレーション + atk += atk * (5 * sc_data[SC_CONCENTRATION].val1) / 100; + } + if (atk < 0) + atk = 0; + return atk; } + /*========================================== * 対象の左手Atkを返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_atk_(struct block_list *bl) +int battle_get_atk_ (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_PC && (struct map_session_data *)bl){ - int atk=((struct map_session_data*)bl)->watk_; - - if(((struct map_session_data *)bl)->sc_data[SC_CURSE].timer!=-1 ) - atk -= atk*25/100; - return atk; - } - else - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + { + int atk = ((struct map_session_data *) bl)->watk_; + + if (((struct map_session_data *) bl)->sc_data[SC_CURSE].timer != -1) + atk -= atk * 25 / 100; + return atk; + } + else + return 0; } + /*========================================== * 対象のAtk2を返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_atk2(struct block_list *bl) +int battle_get_atk2 (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_PC && (struct map_session_data *)bl) - return ((struct map_session_data*)bl)->watk2; - else { - struct status_change *sc_data=battle_get_sc_data(bl); - int atk2=0; - if(bl->type==BL_MOB && (struct mob_data *)bl) - atk2 = ((struct mob_data*)bl)->stats[MOB_ATK2]; - if(sc_data) { - if( sc_data[SC_IMPOSITIO].timer!=-1) - atk2 += sc_data[SC_IMPOSITIO].val1*5; - if( sc_data[SC_PROVOKE].timer!=-1 ) - atk2 = atk2*(100+2*sc_data[SC_PROVOKE].val1)/100; - if( sc_data[SC_CURSE].timer!=-1 ) - atk2 -= atk2*25/100; - if(sc_data[SC_DRUMBATTLE].timer!=-1) - atk2 += sc_data[SC_DRUMBATTLE].val2; - if(sc_data[SC_NIBELUNGEN].timer!=-1 && (battle_get_element(bl)/10) >= 8 ) - atk2 += sc_data[SC_NIBELUNGEN].val2; - if(sc_data[SC_STRIPWEAPON].timer!=-1) - atk2 = atk2*90/100; - if(sc_data[SC_CONCENTRATION].timer!=-1) //コンセントレーション - atk2 += atk2*(5*sc_data[SC_CONCENTRATION].val1)/100; - } - - if(atk2 < 0) atk2 = 0; - return atk2; - } - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + return ((struct map_session_data *) bl)->watk2; + else + { + struct status_change *sc_data = battle_get_sc_data (bl); + int atk2 = 0; + if (bl->type == BL_MOB && (struct mob_data *) bl) + atk2 = ((struct mob_data *) bl)->stats[MOB_ATK2]; + if (sc_data) + { + if (sc_data[SC_IMPOSITIO].timer != -1) + atk2 += sc_data[SC_IMPOSITIO].val1 * 5; + if (sc_data[SC_PROVOKE].timer != -1) + atk2 = atk2 * (100 + 2 * sc_data[SC_PROVOKE].val1) / 100; + if (sc_data[SC_CURSE].timer != -1) + atk2 -= atk2 * 25 / 100; + if (sc_data[SC_DRUMBATTLE].timer != -1) + atk2 += sc_data[SC_DRUMBATTLE].val2; + if (sc_data[SC_NIBELUNGEN].timer != -1 + && (battle_get_element (bl) / 10) >= 8) + atk2 += sc_data[SC_NIBELUNGEN].val2; + if (sc_data[SC_STRIPWEAPON].timer != -1) + atk2 = atk2 * 90 / 100; + if (sc_data[SC_CONCENTRATION].timer != -1) //コンセントレーション + atk2 += atk2 * (5 * sc_data[SC_CONCENTRATION].val1) / 100; + } + + if (atk2 < 0) + atk2 = 0; + return atk2; + } + return 0; } + /*========================================== * 対象の左手Atk2を返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_atk_2(struct block_list *bl) +int battle_get_atk_2 (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_PC) - return ((struct map_session_data*)bl)->watk_2; - else - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_PC) + return ((struct map_session_data *) bl)->watk_2; + else + return 0; } + /*========================================== * 対象のMAtk1を返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_matk1(struct block_list *bl) +int battle_get_matk1 (struct block_list *bl) { - struct status_change *sc_data; - nullpo_retr(0, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_MOB){ - int matk,int_=battle_get_int(bl); - matk = int_+(int_/5)*(int_/5); - - if(sc_data) - if(sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC) - matk = matk*(100+2*sc_data[SC_MINDBREAKER].val1)/100; - return matk; - } - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return ((struct map_session_data *)bl)->matk1; - else - return 0; + struct status_change *sc_data; + nullpo_retr (0, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_MOB) + { + int matk, int_ = battle_get_int (bl); + matk = int_ + (int_ / 5) * (int_ / 5); + + if (sc_data) + if (sc_data[SC_MINDBREAKER].timer != -1 && bl->type != BL_PC) + matk = matk * (100 + 2 * sc_data[SC_MINDBREAKER].val1) / 100; + return matk; + } + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return ((struct map_session_data *) bl)->matk1; + else + return 0; } + /*========================================== * 対象のMAtk2を返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_matk2(struct block_list *bl) +int battle_get_matk2 (struct block_list *bl) { - struct status_change *sc_data=battle_get_sc_data(bl); - nullpo_retr(0, bl); - if(bl->type==BL_MOB){ - int matk,int_=battle_get_int(bl); - matk = int_+(int_/7)*(int_/7); - - if(sc_data) - if(sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC) - matk = matk*(100+2*sc_data[SC_MINDBREAKER].val1)/100; - return matk; - } - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return ((struct map_session_data *)bl)->matk2; - else - return 0; + struct status_change *sc_data = battle_get_sc_data (bl); + nullpo_retr (0, bl); + if (bl->type == BL_MOB) + { + int matk, int_ = battle_get_int (bl); + matk = int_ + (int_ / 7) * (int_ / 7); + + if (sc_data) + if (sc_data[SC_MINDBREAKER].timer != -1 && bl->type != BL_PC) + matk = matk * (100 + 2 * sc_data[SC_MINDBREAKER].val1) / 100; + return matk; + } + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return ((struct map_session_data *) bl)->matk2; + else + return 0; } + /*========================================== * 対象のDefを返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_def(struct block_list *bl) +int battle_get_def (struct block_list *bl) { - struct status_change *sc_data; - int def=0,skilltimer=-1,skillid=0; - - nullpo_retr(0, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_PC && (struct map_session_data *)bl){ - def = ((struct map_session_data *)bl)->def; - skilltimer = ((struct map_session_data *)bl)->skilltimer; - skillid = ((struct map_session_data *)bl)->skillid; - } - else if(bl->type==BL_MOB && (struct mob_data *)bl) { - def = ((struct mob_data *)bl)->stats[MOB_DEF]; - skilltimer = ((struct mob_data *)bl)->skilltimer; - skillid = ((struct mob_data *)bl)->skillid; - } - - if(def < 1000000) { - if(sc_data) { - //キーピング時はDEF100 - if( sc_data[SC_KEEPING].timer!=-1) - def = 100; - //プロボック時は減算 - if( sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC) - def = (def*(100 - 6*sc_data[SC_PROVOKE].val1)+50)/100; - //戦太鼓の響き時は加算 - if( sc_data[SC_DRUMBATTLE].timer!=-1 && bl->type != BL_PC) - def += sc_data[SC_DRUMBATTLE].val3; - //毒にかかっている時は減算 - if(sc_data[SC_POISON].timer!=-1 && bl->type != BL_PC) - def = def*75/100; - //ストリップシールド時は減算 - if(sc_data[SC_STRIPSHIELD].timer!=-1 && bl->type != BL_PC) - def = def*85/100; - //シグナムクルシス時は減算 - if(sc_data[SC_SIGNUMCRUCIS].timer!=-1 && bl->type != BL_PC) - def = def * (100 - sc_data[SC_SIGNUMCRUCIS].val2)/100; - //永遠の混沌時はDEF0になる - if(sc_data[SC_ETERNALCHAOS].timer!=-1 && bl->type != BL_PC) - def = 0; - //凍結、石化時は右シフト - if(sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0)) - def >>= 1; - //コンセントレーション時は減算 - if( sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) - def = (def*(100 - 5*sc_data[SC_CONCENTRATION].val1))/100; - } - //詠唱中は詠唱時減算率に基づいて減算 - if(skilltimer != -1) { - int def_rate = skill_get_castdef(skillid); - if(def_rate != 0) - def = (def * (100 - def_rate))/100; - } - } - if(def < 0) def = 0; - return def; + struct status_change *sc_data; + int def = 0, skilltimer = -1, skillid = 0; + + nullpo_retr (0, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + { + def = ((struct map_session_data *) bl)->def; + skilltimer = ((struct map_session_data *) bl)->skilltimer; + skillid = ((struct map_session_data *) bl)->skillid; + } + else if (bl->type == BL_MOB && (struct mob_data *) bl) + { + def = ((struct mob_data *) bl)->stats[MOB_DEF]; + skilltimer = ((struct mob_data *) bl)->skilltimer; + skillid = ((struct mob_data *) bl)->skillid; + } + + if (def < 1000000) + { + if (sc_data) + { + //キーピング時はDEF100 + if (sc_data[SC_KEEPING].timer != -1) + def = 100; + //プロボック時は減算 + if (sc_data[SC_PROVOKE].timer != -1 && bl->type != BL_PC) + def = (def * (100 - 6 * sc_data[SC_PROVOKE].val1) + 50) / 100; + //戦太鼓の響き時は加算 + if (sc_data[SC_DRUMBATTLE].timer != -1 && bl->type != BL_PC) + def += sc_data[SC_DRUMBATTLE].val3; + //毒にかかっている時は減算 + if (sc_data[SC_POISON].timer != -1 && bl->type != BL_PC) + def = def * 75 / 100; + //ストリップシールド時は減算 + if (sc_data[SC_STRIPSHIELD].timer != -1 && bl->type != BL_PC) + def = def * 85 / 100; + //シグナムクルシス時は減算 + if (sc_data[SC_SIGNUMCRUCIS].timer != -1 && bl->type != BL_PC) + def = def * (100 - sc_data[SC_SIGNUMCRUCIS].val2) / 100; + //永遠の混沌時はDEF0になる + if (sc_data[SC_ETERNALCHAOS].timer != -1 && bl->type != BL_PC) + def = 0; + //凍結、石化時は右シフト + if (sc_data[SC_FREEZE].timer != -1 + || (sc_data[SC_STONE].timer != -1 + && sc_data[SC_STONE].val2 == 0)) + def >>= 1; + //コンセントレーション時は減算 + if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC) + def = + (def * (100 - 5 * sc_data[SC_CONCENTRATION].val1)) / 100; + } + //詠唱中は詠唱時減算率に基づいて減算 + if (skilltimer != -1) + { + int def_rate = skill_get_castdef (skillid); + if (def_rate != 0) + def = (def * (100 - def_rate)) / 100; + } + } + if (def < 0) + def = 0; + return def; } + /*========================================== * 対象のMDefを返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_mdef(struct block_list *bl) +int battle_get_mdef (struct block_list *bl) { - struct status_change *sc_data; - int mdef=0; - - nullpo_retr(0, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_PC && (struct map_session_data *)bl) - mdef = ((struct map_session_data *)bl)->mdef; - else if(bl->type==BL_MOB && (struct mob_data *)bl) - mdef = ((struct mob_data *)bl)->stats[MOB_MDEF]; - - if(mdef < 1000000) { - if(sc_data) { - //バリアー状態時はMDEF100 - if(mdef < 90 && sc_data[SC_MBARRIER].timer != -1) { - mdef += sc_data[SC_MBARRIER].val1; - if (mdef > 90) - mdef = 90; - } - if(sc_data[SC_BARRIER].timer != -1) - mdef = 100; - //凍結、石化時は1.25倍 - if(sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0)) - mdef = mdef*125/100; - if( sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC) - mdef -= (mdef*6*sc_data[SC_MINDBREAKER].val1)/100; - } - } - if(mdef < 0) mdef = 0; - return mdef; + struct status_change *sc_data; + int mdef = 0; + + nullpo_retr (0, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + mdef = ((struct map_session_data *) bl)->mdef; + else if (bl->type == BL_MOB && (struct mob_data *) bl) + mdef = ((struct mob_data *) bl)->stats[MOB_MDEF]; + + if (mdef < 1000000) + { + if (sc_data) + { + //バリアー状態時はMDEF100 + if (mdef < 90 && sc_data[SC_MBARRIER].timer != -1) + { + mdef += sc_data[SC_MBARRIER].val1; + if (mdef > 90) + mdef = 90; + } + if (sc_data[SC_BARRIER].timer != -1) + mdef = 100; + //凍結、石化時は1.25倍 + if (sc_data[SC_FREEZE].timer != -1 + || (sc_data[SC_STONE].timer != -1 + && sc_data[SC_STONE].val2 == 0)) + mdef = mdef * 125 / 100; + if (sc_data[SC_MINDBREAKER].timer != -1 && bl->type != BL_PC) + mdef -= (mdef * 6 * sc_data[SC_MINDBREAKER].val1) / 100; + } + } + if (mdef < 0) + mdef = 0; + return mdef; } + /*========================================== * 対象のDef2を返す(汎用) * 戻りは整数で1以上 *------------------------------------------ */ -int battle_get_def2(struct block_list *bl) +int battle_get_def2 (struct block_list *bl) { - struct status_change *sc_data; - int def2=1; - - nullpo_retr(1, bl); - sc_data=battle_get_sc_data(bl); - if(bl->type==BL_PC) - def2 = ((struct map_session_data *)bl)->def2; - else if(bl->type==BL_MOB) - def2 = ((struct mob_data *)bl)->stats[MOB_VIT]; - - if(sc_data) { - if( sc_data[SC_ANGELUS].timer!=-1 && bl->type != BL_PC) - def2 = def2*(110+5*sc_data[SC_ANGELUS].val1)/100; - if( sc_data[SC_PROVOKE].timer!=-1 && bl->type != BL_PC) - def2 = (def2*(100 - 6*sc_data[SC_PROVOKE].val1)+50)/100; - if(sc_data[SC_POISON].timer!=-1 && bl->type != BL_PC) - def2 = def2*75/100; - //コンセントレーション時は減算 - if( sc_data[SC_CONCENTRATION].timer!=-1 && bl->type != BL_PC) - def2 = def2*(100 - 5*sc_data[SC_CONCENTRATION].val1)/100; - } - if(def2 < 1) def2 = 1; - return def2; + struct status_change *sc_data; + int def2 = 1; + + nullpo_retr (1, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_PC) + def2 = ((struct map_session_data *) bl)->def2; + else if (bl->type == BL_MOB) + def2 = ((struct mob_data *) bl)->stats[MOB_VIT]; + + if (sc_data) + { + if (sc_data[SC_ANGELUS].timer != -1 && bl->type != BL_PC) + def2 = def2 * (110 + 5 * sc_data[SC_ANGELUS].val1) / 100; + if (sc_data[SC_PROVOKE].timer != -1 && bl->type != BL_PC) + def2 = (def2 * (100 - 6 * sc_data[SC_PROVOKE].val1) + 50) / 100; + if (sc_data[SC_POISON].timer != -1 && bl->type != BL_PC) + def2 = def2 * 75 / 100; + //コンセントレーション時は減算 + if (sc_data[SC_CONCENTRATION].timer != -1 && bl->type != BL_PC) + def2 = def2 * (100 - 5 * sc_data[SC_CONCENTRATION].val1) / 100; + } + if (def2 < 1) + def2 = 1; + return def2; } + /*========================================== * 対象のMDef2を返す(汎用) * 戻りは整数で0以上 *------------------------------------------ */ -int battle_get_mdef2(struct block_list *bl) +int battle_get_mdef2 (struct block_list *bl) { - int mdef2=0; - struct status_change *sc_data=battle_get_sc_data(bl); - - nullpo_retr(0, bl); - if(bl->type==BL_MOB) - mdef2 = ((struct mob_data *)bl)->stats[MOB_INT] + (((struct mob_data *)bl)->stats[MOB_VIT]>>1); - else if(bl->type==BL_PC) - mdef2 = ((struct map_session_data *)bl)->mdef2 + (((struct map_session_data *)bl)->paramc[2]>>1); - if(sc_data) { - if( sc_data[SC_MINDBREAKER].timer!=-1 && bl->type != BL_PC) - mdef2 -= (mdef2*6*sc_data[SC_MINDBREAKER].val1)/100; - } - if(mdef2 < 0) mdef2 = 0; - return mdef2; + int mdef2 = 0; + struct status_change *sc_data = battle_get_sc_data (bl); + + nullpo_retr (0, bl); + if (bl->type == BL_MOB) + mdef2 = + ((struct mob_data *) bl)->stats[MOB_INT] + + (((struct mob_data *) bl)->stats[MOB_VIT] >> 1); + else if (bl->type == BL_PC) + mdef2 = + ((struct map_session_data *) bl)->mdef2 + + (((struct map_session_data *) bl)->paramc[2] >> 1); + if (sc_data) + { + if (sc_data[SC_MINDBREAKER].timer != -1 && bl->type != BL_PC) + mdef2 -= (mdef2 * 6 * sc_data[SC_MINDBREAKER].val1) / 100; + } + if (mdef2 < 0) + mdef2 = 0; + return mdef2; } + /*========================================== * 対象のSpeed(移動速度)を返す(汎用) * 戻りは整数で1以上 * Speedは小さいほうが移動速度が速い *------------------------------------------ */ -int battle_get_speed(struct block_list *bl) +int battle_get_speed (struct block_list *bl) { - nullpo_retr(1000, bl); - if(bl->type==BL_PC && (struct map_session_data *)bl) - return ((struct map_session_data *)bl)->speed; - else { - struct status_change *sc_data=battle_get_sc_data(bl); - int speed = 1000; - if(bl->type==BL_MOB && (struct mob_data *)bl) - speed = ((struct mob_data *)bl)->stats[MOB_SPEED]; - - if(sc_data) { - //速度増加時は25%減算 - if(sc_data[SC_INCREASEAGI].timer!=-1 && sc_data[SC_DONTFORGETME].timer == -1) - speed -= speed*25/100; - //速度減少時は25%加算 - if(sc_data[SC_DECREASEAGI].timer!=-1) - speed = speed*125/100; - //クァグマイア時は50%加算 - if(sc_data[SC_QUAGMIRE].timer!=-1) - speed = speed*3/2; - //私を忘れないで…時は加算 - if(sc_data[SC_DONTFORGETME].timer!=-1) - speed = speed*(100+sc_data[SC_DONTFORGETME].val1*2 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3&0xffff))/100; - //金剛時は25%加算 - if(sc_data[SC_STEELBODY].timer!=-1) - speed = speed*125/100; - //ディフェンダー時は加算 - if(sc_data[SC_DEFENDER].timer!=-1) - speed = (speed * (155 - sc_data[SC_DEFENDER].val1*5)) / 100; - //踊り状態は4倍遅い - if(sc_data[SC_DANCING].timer!=-1 ) - speed*=4; - //呪い時は450加算 - if(sc_data[SC_CURSE].timer!=-1) - speed = speed + 450; - //ウィンドウォーク時はLv*2%減算 - if(sc_data[SC_WINDWALK].timer!=-1) - speed -= (speed*(sc_data[SC_WINDWALK].val1*2))/100; - } - if(speed < 1) speed = 1; - return speed; - } - - return 1000; + nullpo_retr (1000, bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + return ((struct map_session_data *) bl)->speed; + else + { + struct status_change *sc_data = battle_get_sc_data (bl); + int speed = 1000; + if (bl->type == BL_MOB && (struct mob_data *) bl) + speed = ((struct mob_data *) bl)->stats[MOB_SPEED]; + + if (sc_data) + { + //速度増加時は25%減算 + if (sc_data[SC_INCREASEAGI].timer != -1 + && sc_data[SC_DONTFORGETME].timer == -1) + speed -= speed * 25 / 100; + //速度減少時は25%加算 + if (sc_data[SC_DECREASEAGI].timer != -1) + speed = speed * 125 / 100; + //クァグマイア時は50%加算 + if (sc_data[SC_QUAGMIRE].timer != -1) + speed = speed * 3 / 2; + //私を忘れないで…時は加算 + if (sc_data[SC_DONTFORGETME].timer != -1) + speed = + speed * (100 + sc_data[SC_DONTFORGETME].val1 * 2 + + sc_data[SC_DONTFORGETME].val2 + + (sc_data[SC_DONTFORGETME].val3 & 0xffff)) / 100; + //金剛時は25%加算 + if (sc_data[SC_STEELBODY].timer != -1) + speed = speed * 125 / 100; + //ディフェンダー時は加算 + if (sc_data[SC_DEFENDER].timer != -1) + speed = (speed * (155 - sc_data[SC_DEFENDER].val1 * 5)) / 100; + //踊り状態は4倍遅い + if (sc_data[SC_DANCING].timer != -1) + speed *= 4; + //呪い時は450加算 + if (sc_data[SC_CURSE].timer != -1) + speed = speed + 450; + //ウィンドウォーク時はLv*2%減算 + if (sc_data[SC_WINDWALK].timer != -1) + speed -= (speed * (sc_data[SC_WINDWALK].val1 * 2)) / 100; + } + if (speed < 1) + speed = 1; + return speed; + } + + return 1000; } + /*========================================== * 対象のaDelay(攻撃時ディレイ)を返す(汎用) * aDelayは小さいほうが攻撃速度が速い *------------------------------------------ */ -int battle_get_adelay(struct block_list *bl) +int battle_get_adelay (struct block_list *bl) { - nullpo_retr(4000, bl); - if(bl->type==BL_PC && (struct map_session_data *)bl) - return (((struct map_session_data *)bl)->aspd<<1); - else { - struct status_change *sc_data=battle_get_sc_data(bl); - int adelay=4000,aspd_rate = 100,i; - if(bl->type==BL_MOB && (struct mob_data *)bl) - adelay = ((struct mob_data *)bl)->stats[MOB_ADELAY]; - - if(sc_data) { - //ツーハンドクイッケン使用時でクァグマイアでも私を忘れないで…でもない時は3割減算 - if(sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ - aspd_rate -= 30; - //アドレナリンラッシュ使用時でツーハンドクイッケンでもクァグマイアでも私を忘れないで…でもない時は - if(sc_data[SC_ADRENALINE].timer != -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 && - sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) { // アドレナリンラッシュ - //使用者とパーティメンバーで格差が出る設定でなければ3割減算 - if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly) - aspd_rate -= 30; - //そうでなければ2.5割減算 - else - aspd_rate -= 25; - } - //スピアクィッケン時は減算 - if(sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 && - sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // スピアクィッケン - aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2; - //夕日のアサシンクロス時は減算 - if(sc_data[SC_ASSNCROS].timer!=-1 && // 夕陽のアサシンクロス - sc_data[SC_TWOHANDQUICKEN].timer==-1 && sc_data[SC_ADRENALINE].timer==-1 && sc_data[SC_SPEARSQUICKEN].timer==-1 && - sc_data[SC_DONTFORGETME].timer == -1) - aspd_rate -= 5+sc_data[SC_ASSNCROS].val1+sc_data[SC_ASSNCROS].val2+sc_data[SC_ASSNCROS].val3; - //私を忘れないで…時は加算 - if(sc_data[SC_DONTFORGETME].timer!=-1) // 私を忘れないで - aspd_rate += sc_data[SC_DONTFORGETME].val1*3 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3>>16); - //金剛時25%加算 - if(sc_data[SC_STEELBODY].timer!=-1) // 金剛 - aspd_rate += 25; - //増速ポーション使用時は減算 - if(sc_data[i=SC_SPEEDPOTION2].timer!=-1 || sc_data[i=SC_SPEEDPOTION1].timer!=-1 || sc_data[i=SC_SPEEDPOTION0].timer!=-1) - aspd_rate -= sc_data[i].val1; - // Fate's `haste' spell works the same as the above - if (sc_data[SC_HASTE].timer != -1) - aspd_rate -= sc_data[SC_HASTE].val1; - //ディフェンダー時は加算 - if(sc_data[SC_DEFENDER].timer != -1) - adelay += (1100 - sc_data[SC_DEFENDER].val1*100); - } - - if(aspd_rate != 100) - adelay = adelay*aspd_rate/100; - if(adelay < battle_config.monster_max_aspd<<1) adelay = battle_config.monster_max_aspd<<1; - return adelay; - } - return 4000; + nullpo_retr (4000, bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + return (((struct map_session_data *) bl)->aspd << 1); + else + { + struct status_change *sc_data = battle_get_sc_data (bl); + int adelay = 4000, aspd_rate = 100, i; + if (bl->type == BL_MOB && (struct mob_data *) bl) + adelay = ((struct mob_data *) bl)->stats[MOB_ADELAY]; + + if (sc_data) + { + //ツーハンドクイッケン使用時でクァグマイアでも私を忘れないで…でもない時は3割減算 + if (sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ + aspd_rate -= 30; + //アドレナリンラッシュ使用時でツーハンドクイッケンでもクァグマイアでも私を忘れないで…でもない時は + if (sc_data[SC_ADRENALINE].timer != -1 + && sc_data[SC_TWOHANDQUICKEN].timer == -1 + && sc_data[SC_QUAGMIRE].timer == -1 + && sc_data[SC_DONTFORGETME].timer == -1) + { // アドレナリンラッシュ + //使用者とパーティメンバーで格差が出る設定でなければ3割減算 + if (sc_data[SC_ADRENALINE].val2 + || !battle_config.party_skill_penaly) + aspd_rate -= 30; + //そうでなければ2.5割減算 + else + aspd_rate -= 25; + } + //スピアクィッケン時は減算 + if (sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // スピアクィッケン + aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2; + //夕日のアサシンクロス時は減算 + if (sc_data[SC_ASSNCROS].timer != -1 && // 夕陽のアサシンクロス + sc_data[SC_TWOHANDQUICKEN].timer == -1 + && sc_data[SC_ADRENALINE].timer == -1 + && sc_data[SC_SPEARSQUICKEN].timer == -1 + && sc_data[SC_DONTFORGETME].timer == -1) + aspd_rate -= + 5 + sc_data[SC_ASSNCROS].val1 + + sc_data[SC_ASSNCROS].val2 + sc_data[SC_ASSNCROS].val3; + //私を忘れないで…時は加算 + if (sc_data[SC_DONTFORGETME].timer != -1) // 私を忘れないで + aspd_rate += + sc_data[SC_DONTFORGETME].val1 * 3 + + sc_data[SC_DONTFORGETME].val2 + + (sc_data[SC_DONTFORGETME].val3 >> 16); + //金剛時25%加算 + if (sc_data[SC_STEELBODY].timer != -1) // 金剛 + aspd_rate += 25; + //増速ポーション使用時は減算 + if (sc_data[i = SC_SPEEDPOTION2].timer != -1 + || sc_data[i = SC_SPEEDPOTION1].timer != -1 + || sc_data[i = SC_SPEEDPOTION0].timer != -1) + aspd_rate -= sc_data[i].val1; + // Fate's `haste' spell works the same as the above + if (sc_data[SC_HASTE].timer != -1) + aspd_rate -= sc_data[SC_HASTE].val1; + //ディフェンダー時は加算 + if (sc_data[SC_DEFENDER].timer != -1) + adelay += (1100 - sc_data[SC_DEFENDER].val1 * 100); + } + + if (aspd_rate != 100) + adelay = adelay * aspd_rate / 100; + if (adelay < battle_config.monster_max_aspd << 1) + adelay = battle_config.monster_max_aspd << 1; + return adelay; + } + return 4000; } -int battle_get_amotion(struct block_list *bl) + +int battle_get_amotion (struct block_list *bl) { - nullpo_retr(2000, bl); - if(bl->type==BL_PC && (struct map_session_data *)bl) - return ((struct map_session_data *)bl)->amotion; - else { - struct status_change *sc_data=battle_get_sc_data(bl); - int amotion=2000,aspd_rate = 100,i; - if(bl->type==BL_MOB && (struct mob_data *)bl) - amotion = mob_db[((struct mob_data *)bl)->class].amotion; - - if(sc_data) { - if(sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ - aspd_rate -= 30; - if(sc_data[SC_ADRENALINE].timer != -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 && - sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) { // アドレナリンラッシュ - if(sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly) - aspd_rate -= 30; - else - aspd_rate -= 25; - } - if(sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 && - sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // スピアクィッケン - aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2; - if(sc_data[SC_ASSNCROS].timer!=-1 && // 夕陽のアサシンクロス - sc_data[SC_TWOHANDQUICKEN].timer==-1 && sc_data[SC_ADRENALINE].timer==-1 && sc_data[SC_SPEARSQUICKEN].timer==-1 && - sc_data[SC_DONTFORGETME].timer == -1) - aspd_rate -= 5+sc_data[SC_ASSNCROS].val1+sc_data[SC_ASSNCROS].val2+sc_data[SC_ASSNCROS].val3; - if(sc_data[SC_DONTFORGETME].timer!=-1) // 私を忘れないで - aspd_rate += sc_data[SC_DONTFORGETME].val1*3 + sc_data[SC_DONTFORGETME].val2 + (sc_data[SC_DONTFORGETME].val3>>16); - if(sc_data[SC_STEELBODY].timer!=-1) // 金剛 - aspd_rate += 25; - if(sc_data[i=SC_SPEEDPOTION2].timer!=-1 || sc_data[i=SC_SPEEDPOTION1].timer!=-1 || sc_data[i=SC_SPEEDPOTION0].timer!=-1) - aspd_rate -= sc_data[i].val1; - if (sc_data[SC_HASTE].timer != -1) - aspd_rate -= sc_data[SC_HASTE].val1; - if(sc_data[SC_DEFENDER].timer != -1) - amotion += (550 - sc_data[SC_DEFENDER].val1*50); - } - - if(aspd_rate != 100) - amotion = amotion*aspd_rate/100; - if(amotion < battle_config.monster_max_aspd) amotion = battle_config.monster_max_aspd; - return amotion; - } - return 2000; + nullpo_retr (2000, bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + return ((struct map_session_data *) bl)->amotion; + else + { + struct status_change *sc_data = battle_get_sc_data (bl); + int amotion = 2000, aspd_rate = 100, i; + if (bl->type == BL_MOB && (struct mob_data *) bl) + amotion = mob_db[((struct mob_data *) bl)->class].amotion; + + if (sc_data) + { + if (sc_data[SC_TWOHANDQUICKEN].timer != -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // 2HQ + aspd_rate -= 30; + if (sc_data[SC_ADRENALINE].timer != -1 + && sc_data[SC_TWOHANDQUICKEN].timer == -1 + && sc_data[SC_QUAGMIRE].timer == -1 + && sc_data[SC_DONTFORGETME].timer == -1) + { // アドレナリンラッシュ + if (sc_data[SC_ADRENALINE].val2 + || !battle_config.party_skill_penaly) + aspd_rate -= 30; + else + aspd_rate -= 25; + } + if (sc_data[SC_SPEARSQUICKEN].timer != -1 && sc_data[SC_ADRENALINE].timer == -1 && sc_data[SC_TWOHANDQUICKEN].timer == -1 && sc_data[SC_QUAGMIRE].timer == -1 && sc_data[SC_DONTFORGETME].timer == -1) // スピアクィッケン + aspd_rate -= sc_data[SC_SPEARSQUICKEN].val2; + if (sc_data[SC_ASSNCROS].timer != -1 && // 夕陽のアサシンクロス + sc_data[SC_TWOHANDQUICKEN].timer == -1 + && sc_data[SC_ADRENALINE].timer == -1 + && sc_data[SC_SPEARSQUICKEN].timer == -1 + && sc_data[SC_DONTFORGETME].timer == -1) + aspd_rate -= + 5 + sc_data[SC_ASSNCROS].val1 + + sc_data[SC_ASSNCROS].val2 + sc_data[SC_ASSNCROS].val3; + if (sc_data[SC_DONTFORGETME].timer != -1) // 私を忘れないで + aspd_rate += + sc_data[SC_DONTFORGETME].val1 * 3 + + sc_data[SC_DONTFORGETME].val2 + + (sc_data[SC_DONTFORGETME].val3 >> 16); + if (sc_data[SC_STEELBODY].timer != -1) // 金剛 + aspd_rate += 25; + if (sc_data[i = SC_SPEEDPOTION2].timer != -1 + || sc_data[i = SC_SPEEDPOTION1].timer != -1 + || sc_data[i = SC_SPEEDPOTION0].timer != -1) + aspd_rate -= sc_data[i].val1; + if (sc_data[SC_HASTE].timer != -1) + aspd_rate -= sc_data[SC_HASTE].val1; + if (sc_data[SC_DEFENDER].timer != -1) + amotion += (550 - sc_data[SC_DEFENDER].val1 * 50); + } + + if (aspd_rate != 100) + amotion = amotion * aspd_rate / 100; + if (amotion < battle_config.monster_max_aspd) + amotion = battle_config.monster_max_aspd; + return amotion; + } + return 2000; } -int battle_get_dmotion(struct block_list *bl) + +int battle_get_dmotion (struct block_list *bl) { - int ret; - struct status_change *sc_data; - - nullpo_retr(0, bl); - sc_data = battle_get_sc_data(bl); - if(bl->type==BL_MOB && (struct mob_data *)bl){ - ret=mob_db[((struct mob_data *)bl)->class].dmotion; - if(battle_config.monster_damage_delay_rate != 100) - ret = ret*battle_config.monster_damage_delay_rate/400; - } - else if(bl->type==BL_PC && (struct map_session_data *)bl){ - ret=((struct map_session_data *)bl)->dmotion; - if(battle_config.pc_damage_delay_rate != 100) - ret = ret*battle_config.pc_damage_delay_rate/400; - } - else - return 2000; - - if((sc_data && sc_data[SC_ENDURE].timer!=-1) || - (bl->type == BL_PC && ((struct map_session_data *)bl)->special_state.infinite_endure)) - ret=0; - - return ret; + int ret; + struct status_change *sc_data; + + nullpo_retr (0, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + { + ret = mob_db[((struct mob_data *) bl)->class].dmotion; + if (battle_config.monster_damage_delay_rate != 100) + ret = ret * battle_config.monster_damage_delay_rate / 400; + } + else if (bl->type == BL_PC && (struct map_session_data *) bl) + { + ret = ((struct map_session_data *) bl)->dmotion; + if (battle_config.pc_damage_delay_rate != 100) + ret = ret * battle_config.pc_damage_delay_rate / 400; + } + else + return 2000; + + if ((sc_data && sc_data[SC_ENDURE].timer != -1) || + (bl->type == BL_PC + && ((struct map_session_data *) bl)->special_state.infinite_endure)) + ret = 0; + + return ret; } -int battle_get_element(struct block_list *bl) + +int battle_get_element (struct block_list *bl) { - int ret = 20; - struct status_change *sc_data; - - nullpo_retr(ret, bl); - sc_data = battle_get_sc_data(bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) // 10の位=Lv*2、1の位=属性 - ret=((struct mob_data *)bl)->def_ele; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - ret=20+((struct map_session_data *)bl)->def_ele; // 防御属性Lv1 - - if(sc_data) { - if( sc_data[SC_BENEDICTIO].timer!=-1 ) // 聖体降福 - ret=26; - if( sc_data[SC_FREEZE].timer!=-1 ) // 凍結 - ret=21; - if( sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0) - ret=22; - } - - return ret; + int ret = 20; + struct status_change *sc_data; + + nullpo_retr (ret, bl); + sc_data = battle_get_sc_data (bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) // 10の位=Lv*2、1の位=属性 + ret = ((struct mob_data *) bl)->def_ele; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + ret = 20 + ((struct map_session_data *) bl)->def_ele; // 防御属性Lv1 + + if (sc_data) + { + if (sc_data[SC_BENEDICTIO].timer != -1) // 聖体降福 + ret = 26; + if (sc_data[SC_FREEZE].timer != -1) // 凍結 + ret = 21; + if (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0) + ret = 22; + } + + return ret; } -int battle_get_attack_element(struct block_list *bl) + +int battle_get_attack_element (struct block_list *bl) { - int ret = 0; - struct status_change *sc_data=battle_get_sc_data(bl); - - nullpo_retr(0, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - ret=0; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - ret=((struct map_session_data *)bl)->atk_ele; - - if(sc_data) { - if( sc_data[SC_FROSTWEAPON].timer!=-1) // フロストウェポン - ret=1; - if( sc_data[SC_SEISMICWEAPON].timer!=-1) // サイズミックウェポン - ret=2; - if( sc_data[SC_FLAMELAUNCHER].timer!=-1) // フレームランチャー - ret=3; - if( sc_data[SC_LIGHTNINGLOADER].timer!=-1) // ライトニングローダー - ret=4; - if( sc_data[SC_ENCPOISON].timer!=-1) // エンチャントポイズン - ret=5; - if( sc_data[SC_ASPERSIO].timer!=-1) // アスペルシオ - ret=6; - } - - return ret; + int ret = 0; + struct status_change *sc_data = battle_get_sc_data (bl); + + nullpo_retr (0, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + ret = 0; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + ret = ((struct map_session_data *) bl)->atk_ele; + + if (sc_data) + { + if (sc_data[SC_FROSTWEAPON].timer != -1) // フロストウェポン + ret = 1; + if (sc_data[SC_SEISMICWEAPON].timer != -1) // サイズミックウェポン + ret = 2; + if (sc_data[SC_FLAMELAUNCHER].timer != -1) // フレームランチャー + ret = 3; + if (sc_data[SC_LIGHTNINGLOADER].timer != -1) // ライトニングローダー + ret = 4; + if (sc_data[SC_ENCPOISON].timer != -1) // エンチャントポイズン + ret = 5; + if (sc_data[SC_ASPERSIO].timer != -1) // アスペルシオ + ret = 6; + } + + return ret; } -int battle_get_attack_element2(struct block_list *bl) + +int battle_get_attack_element2 (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_PC && (struct map_session_data *)bl) { - int ret = ((struct map_session_data *)bl)->atk_ele_; - struct status_change *sc_data = ((struct map_session_data *)bl)->sc_data; - - if(sc_data) { - if( sc_data[SC_FROSTWEAPON].timer!=-1) // フロストウェポン - ret=1; - if( sc_data[SC_SEISMICWEAPON].timer!=-1) // サイズミックウェポン - ret=2; - if( sc_data[SC_FLAMELAUNCHER].timer!=-1) // フレームランチャー - ret=3; - if( sc_data[SC_LIGHTNINGLOADER].timer!=-1) // ライトニングローダー - ret=4; - if( sc_data[SC_ENCPOISON].timer!=-1) // エンチャントポイズン - ret=5; - if( sc_data[SC_ASPERSIO].timer!=-1) // アスペルシオ - ret=6; - } - return ret; - } - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + { + int ret = ((struct map_session_data *) bl)->atk_ele_; + struct status_change *sc_data = + ((struct map_session_data *) bl)->sc_data; + + if (sc_data) + { + if (sc_data[SC_FROSTWEAPON].timer != -1) // フロストウェポン + ret = 1; + if (sc_data[SC_SEISMICWEAPON].timer != -1) // サイズミックウェポン + ret = 2; + if (sc_data[SC_FLAMELAUNCHER].timer != -1) // フレームランチャー + ret = 3; + if (sc_data[SC_LIGHTNINGLOADER].timer != -1) // ライトニングローダー + ret = 4; + if (sc_data[SC_ENCPOISON].timer != -1) // エンチャントポイズン + ret = 5; + if (sc_data[SC_ASPERSIO].timer != -1) // アスペルシオ + ret = 6; + } + return ret; + } + return 0; } -int battle_get_party_id(struct block_list *bl) + +int battle_get_party_id (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_PC && (struct map_session_data *)bl) - return ((struct map_session_data *)bl)->status.party_id; - else if(bl->type==BL_MOB && (struct mob_data *)bl){ - struct mob_data *md=(struct mob_data *)bl; - if( md->master_id>0 ) - return -md->master_id; - return -md->bl.id; - } - else if(bl->type==BL_SKILL && (struct skill_unit *)bl) - return ((struct skill_unit *)bl)->group->party_id; - else - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + return ((struct map_session_data *) bl)->status.party_id; + else if (bl->type == BL_MOB && (struct mob_data *) bl) + { + struct mob_data *md = (struct mob_data *) bl; + if (md->master_id > 0) + return -md->master_id; + return -md->bl.id; + } + else if (bl->type == BL_SKILL && (struct skill_unit *) bl) + return ((struct skill_unit *) bl)->group->party_id; + else + return 0; } -int battle_get_guild_id(struct block_list *bl) + +int battle_get_guild_id (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_PC && (struct map_session_data *)bl) - return ((struct map_session_data *)bl)->status.guild_id; - else if(bl->type==BL_MOB && (struct mob_data *)bl) - return ((struct mob_data *)bl)->class; - else if(bl->type==BL_SKILL && (struct skill_unit *)bl) - return ((struct skill_unit *)bl)->group->guild_id; - else - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_PC && (struct map_session_data *) bl) + return ((struct map_session_data *) bl)->status.guild_id; + else if (bl->type == BL_MOB && (struct mob_data *) bl) + return ((struct mob_data *) bl)->class; + else if (bl->type == BL_SKILL && (struct skill_unit *) bl) + return ((struct skill_unit *) bl)->group->guild_id; + else + return 0; } -int battle_get_race(struct block_list *bl) + +int battle_get_race (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - return mob_db[((struct mob_data *)bl)->class].race; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return 7; - else - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + return mob_db[((struct mob_data *) bl)->class].race; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return 7; + else + return 0; } -int battle_get_size(struct block_list *bl) + +int battle_get_size (struct block_list *bl) { - nullpo_retr(1, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - return mob_db[((struct mob_data *)bl)->class].size; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return 1; - else - return 1; + nullpo_retr (1, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + return mob_db[((struct mob_data *) bl)->class].size; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return 1; + else + return 1; } -int battle_get_mode(struct block_list *bl) + +int battle_get_mode (struct block_list *bl) { - nullpo_retr(0x01, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - return mob_db[((struct mob_data *)bl)->class].mode; - else - return 0x01; // とりあえず動くということで1 + nullpo_retr (0x01, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + return mob_db[((struct mob_data *) bl)->class].mode; + else + return 0x01; // とりあえず動くということで1 } -int battle_get_mexp(struct block_list *bl) +int battle_get_mexp (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) { - const struct mob_data *mob = (struct mob_data *) bl; - const int retval = (mob_db[mob->class].mexp * (int) (mob->stats[MOB_XP_BONUS])) >> MOB_XP_BONUS_SHIFT; - fprintf(stderr, "Modifier of %x: -> %d\n", mob->stats[MOB_XP_BONUS], retval); - return retval; - } - else - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + { + const struct mob_data *mob = (struct mob_data *) bl; + const int retval = + (mob_db[mob->class].mexp * + (int) (mob->stats[MOB_XP_BONUS])) >> MOB_XP_BONUS_SHIFT; + fprintf (stderr, "Modifier of %x: -> %d\n", mob->stats[MOB_XP_BONUS], + retval); + return retval; + } + else + return 0; } -int battle_get_stat(int stat_id /* SP_VIT or similar */, struct block_list *bl) +int battle_get_stat (int stat_id /* SP_VIT or similar */ , + struct block_list *bl) { - switch (stat_id) { - case SP_STR: return battle_get_str(bl); - case SP_AGI: return battle_get_agi(bl); - case SP_DEX: return battle_get_dex(bl); - case SP_VIT: return battle_get_vit(bl); - case SP_INT: return battle_get_int(bl); - case SP_LUK: return battle_get_luk(bl); + switch (stat_id) + { + case SP_STR: + return battle_get_str (bl); + case SP_AGI: + return battle_get_agi (bl); + case SP_DEX: + return battle_get_dex (bl); + case SP_VIT: + return battle_get_vit (bl); + case SP_INT: + return battle_get_int (bl); + case SP_LUK: + return battle_get_luk (bl); default: - return 0; - } + return 0; + } } - // StatusChange系の所得 -struct status_change *battle_get_sc_data(struct block_list *bl) +struct status_change *battle_get_sc_data (struct block_list *bl) { - nullpo_retr(NULL, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - return ((struct mob_data*)bl)->sc_data; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return ((struct map_session_data*)bl)->sc_data; - return NULL; + nullpo_retr (NULL, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + return ((struct mob_data *) bl)->sc_data; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return ((struct map_session_data *) bl)->sc_data; + return NULL; } -short *battle_get_sc_count(struct block_list *bl) + +short *battle_get_sc_count (struct block_list *bl) { - nullpo_retr(NULL, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - return &((struct mob_data*)bl)->sc_count; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return &((struct map_session_data*)bl)->sc_count; - return NULL; + nullpo_retr (NULL, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + return &((struct mob_data *) bl)->sc_count; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return &((struct map_session_data *) bl)->sc_count; + return NULL; } -short *battle_get_opt1(struct block_list *bl) + +short *battle_get_opt1 (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - return &((struct mob_data*)bl)->opt1; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return &((struct map_session_data*)bl)->opt1; - else if(bl->type==BL_NPC && (struct npc_data *)bl) - return &((struct npc_data*)bl)->opt1; - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + return &((struct mob_data *) bl)->opt1; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return &((struct map_session_data *) bl)->opt1; + else if (bl->type == BL_NPC && (struct npc_data *) bl) + return &((struct npc_data *) bl)->opt1; + return 0; } -short *battle_get_opt2(struct block_list *bl) + +short *battle_get_opt2 (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - return &((struct mob_data*)bl)->opt2; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return &((struct map_session_data*)bl)->opt2; - else if(bl->type==BL_NPC && (struct npc_data *)bl) - return &((struct npc_data*)bl)->opt2; - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + return &((struct mob_data *) bl)->opt2; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return &((struct map_session_data *) bl)->opt2; + else if (bl->type == BL_NPC && (struct npc_data *) bl) + return &((struct npc_data *) bl)->opt2; + return 0; } -short *battle_get_opt3(struct block_list *bl) + +short *battle_get_opt3 (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - return &((struct mob_data*)bl)->opt3; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return &((struct map_session_data*)bl)->opt3; - else if(bl->type==BL_NPC && (struct npc_data *)bl) - return &((struct npc_data*)bl)->opt3; - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + return &((struct mob_data *) bl)->opt3; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return &((struct map_session_data *) bl)->opt3; + else if (bl->type == BL_NPC && (struct npc_data *) bl) + return &((struct npc_data *) bl)->opt3; + return 0; } -short *battle_get_option(struct block_list *bl) + +short *battle_get_option (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_MOB && (struct mob_data *)bl) - return &((struct mob_data*)bl)->option; - else if(bl->type==BL_PC && (struct map_session_data *)bl) - return &((struct map_session_data*)bl)->status.option; - else if(bl->type==BL_NPC && (struct npc_data *)bl) - return &((struct npc_data*)bl)->option; - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_MOB && (struct mob_data *) bl) + return &((struct mob_data *) bl)->option; + else if (bl->type == BL_PC && (struct map_session_data *) bl) + return &((struct map_session_data *) bl)->status.option; + else if (bl->type == BL_NPC && (struct npc_data *) bl) + return &((struct npc_data *) bl)->option; + return 0; } //------------------------------------------------------------------- // ダメージの遅延 -struct battle_delay_damage_ { - struct block_list *src,*target; - int damage; - int flag; +struct battle_delay_damage_ +{ + struct block_list *src, *target; + int damage; + int flag; }; -int battle_delay_damage_sub(int tid,unsigned int tick,int id,int data) +int battle_delay_damage_sub (int tid, unsigned int tick, int id, int data) { - struct battle_delay_damage_ *dat=(struct battle_delay_damage_ *)data; - if( dat && map_id2bl(id)==dat->src && dat->target->prev!=NULL) - battle_damage(dat->src,dat->target,dat->damage,dat->flag); - free(dat); - return 0; + struct battle_delay_damage_ *dat = (struct battle_delay_damage_ *) data; + if (dat && map_id2bl (id) == dat->src && dat->target->prev != NULL) + battle_damage (dat->src, dat->target, dat->damage, dat->flag); + free (dat); + return 0; } -int battle_delay_damage(unsigned int tick,struct block_list *src,struct block_list *target,int damage,int flag) -{ - struct battle_delay_damage_ *dat = (struct battle_delay_damage_*)aCalloc(1,sizeof(struct battle_delay_damage_)); - - nullpo_retr(0, src); - nullpo_retr(0, target); - - dat->src=src; - dat->target=target; - dat->damage=damage; - dat->flag=flag; - add_timer(tick,battle_delay_damage_sub,src->id,(int)dat); - return 0; +int battle_delay_damage (unsigned int tick, struct block_list *src, + struct block_list *target, int damage, int flag) +{ + struct battle_delay_damage_ *dat = + (struct battle_delay_damage_ *) aCalloc (1, + sizeof (struct + battle_delay_damage_)); + + nullpo_retr (0, src); + nullpo_retr (0, target); + + dat->src = src; + dat->target = target; + dat->damage = damage; + dat->flag = flag; + add_timer (tick, battle_delay_damage_sub, src->id, (int) dat); + return 0; } // 実際にHPを操作 -int battle_damage(struct block_list *bl,struct block_list *target,int damage,int flag) -{ - struct map_session_data *sd=NULL; - struct status_change *sc_data=battle_get_sc_data(target); - short *sc_count; - int i; - - nullpo_retr(0, target); //blはNULLで呼ばれることがあるので他でチェック - - if(damage==0) - return 0; - - if(target->prev == NULL) - return 0; - - if(bl) { - if(bl->prev==NULL) - return 0; - - if(bl->type==BL_PC) - sd=(struct map_session_data *)bl; - } - - if(damage<0) - return battle_heal(bl,target,-damage,0,flag); - - if(!flag && (sc_count=battle_get_sc_count(target))!=NULL && *sc_count>0){ - // 凍結、石化、睡眠を消去 - if(sc_data[SC_FREEZE].timer!=-1) - skill_status_change_end(target,SC_FREEZE,-1); - if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0) - skill_status_change_end(target,SC_STONE,-1); - if(sc_data[SC_SLEEP].timer!=-1) - skill_status_change_end(target,SC_SLEEP,-1); - } - - if(target->type==BL_MOB){ // MOB - struct mob_data *md=(struct mob_data *)target; - if(md && md->skilltimer!=-1 && md->state.skillcastcancel) // 詠唱妨害 - skill_castcancel(target,0); - return mob_damage(bl,md,damage,0); - } - else if(target->type==BL_PC){ // PC - - struct map_session_data *tsd=(struct map_session_data *)target; - - if(tsd && tsd->sc_data && tsd->sc_data[SC_DEVOTION].val1){ // ディボーションをかけられている - struct map_session_data *md = map_id2sd(tsd->sc_data[SC_DEVOTION].val1); - if(md && skill_devotion3(&md->bl,target->id)){ - skill_devotion(md,target->id); - } - else if(md && bl) - for(i=0;i<5;i++) - if(md->dev.val1[i] == target->id){ - clif_damage(bl,&md->bl, gettick(), 0, 0, - damage, 0 , 0, 0); - pc_damage(&md->bl,md,damage); - - return 0; - } - } - - if(tsd && tsd->skilltimer!=-1){ // 詠唱妨害 - // フェンカードや妨害されないスキルかの検査 - if( (!tsd->special_state.no_castcancel || map[bl->m].flag.gvg) && tsd->state.skillcastcancel && - !tsd->special_state.no_castcancel2) - skill_castcancel(target,0); - } - - return pc_damage(bl,tsd,damage); - - } - else if(target->type==BL_SKILL) - return skill_unit_ondamaged((struct skill_unit *)target,bl,damage,gettick()); - return 0; -} -int battle_heal(struct block_list *bl,struct block_list *target,int hp,int sp,int flag) +int battle_damage (struct block_list *bl, struct block_list *target, + int damage, int flag) { - nullpo_retr(0, target); //blはNULLで呼ばれることがあるので他でチェック + struct map_session_data *sd = NULL; + struct status_change *sc_data = battle_get_sc_data (target); + short *sc_count; + int i; + + nullpo_retr (0, target); //blはNULLで呼ばれることがあるので他でチェック + + if (damage == 0) + return 0; + + if (target->prev == NULL) + return 0; + + if (bl) + { + if (bl->prev == NULL) + return 0; + + if (bl->type == BL_PC) + sd = (struct map_session_data *) bl; + } + + if (damage < 0) + return battle_heal (bl, target, -damage, 0, flag); + + if (!flag && (sc_count = battle_get_sc_count (target)) != NULL + && *sc_count > 0) + { + // 凍結、石化、睡眠を消去 + if (sc_data[SC_FREEZE].timer != -1) + skill_status_change_end (target, SC_FREEZE, -1); + if (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0) + skill_status_change_end (target, SC_STONE, -1); + if (sc_data[SC_SLEEP].timer != -1) + skill_status_change_end (target, SC_SLEEP, -1); + } + + if (target->type == BL_MOB) + { // MOB + struct mob_data *md = (struct mob_data *) target; + if (md && md->skilltimer != -1 && md->state.skillcastcancel) // 詠唱妨害 + skill_castcancel (target, 0); + return mob_damage (bl, md, damage, 0); + } + else if (target->type == BL_PC) + { // PC + + struct map_session_data *tsd = (struct map_session_data *) target; + + if (tsd && tsd->sc_data && tsd->sc_data[SC_DEVOTION].val1) + { // ディボーションをかけられている + struct map_session_data *md = + map_id2sd (tsd->sc_data[SC_DEVOTION].val1); + if (md && skill_devotion3 (&md->bl, target->id)) + { + skill_devotion (md, target->id); + } + else if (md && bl) + for (i = 0; i < 5; i++) + if (md->dev.val1[i] == target->id) + { + clif_damage (bl, &md->bl, gettick (), 0, 0, + damage, 0, 0, 0); + pc_damage (&md->bl, md, damage); + + return 0; + } + } + + if (tsd && tsd->skilltimer != -1) + { // 詠唱妨害 + // フェンカードや妨害されないスキルかの検査 + if ((!tsd->special_state.no_castcancel || map[bl->m].flag.gvg) + && tsd->state.skillcastcancel + && !tsd->special_state.no_castcancel2) + skill_castcancel (target, 0); + } - if( target->type ==BL_PC && pc_isdead((struct map_session_data *)target) ) - return 0; - if(hp==0 && sp==0) - return 0; + return pc_damage (bl, tsd, damage); - if(hp<0) - return battle_damage(bl,target,-hp,flag); + } + else if (target->type == BL_SKILL) + return skill_unit_ondamaged ((struct skill_unit *) target, bl, damage, + gettick ()); + return 0; +} - if(target->type==BL_MOB) - return mob_heal((struct mob_data *)target,hp); - else if(target->type==BL_PC) - return pc_heal((struct map_session_data *)target,hp,sp); - return 0; +int battle_heal (struct block_list *bl, struct block_list *target, int hp, + int sp, int flag) +{ + nullpo_retr (0, target); //blはNULLで呼ばれることがあるので他でチェック + + if (target->type == BL_PC + && pc_isdead ((struct map_session_data *) target)) + return 0; + if (hp == 0 && sp == 0) + return 0; + + if (hp < 0) + return battle_damage (bl, target, -hp, flag); + + if (target->type == BL_MOB) + return mob_heal ((struct mob_data *) target, hp); + else if (target->type == BL_PC) + return pc_heal ((struct map_session_data *) target, hp, sp); + return 0; } // 攻撃停止 -int battle_stopattack(struct block_list *bl) +int battle_stopattack (struct block_list *bl) { - nullpo_retr(0, bl); - if(bl->type==BL_MOB) - return mob_stopattack((struct mob_data*)bl); - else if(bl->type==BL_PC) - return pc_stopattack((struct map_session_data*)bl); - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_MOB) + return mob_stopattack ((struct mob_data *) bl); + else if (bl->type == BL_PC) + return pc_stopattack ((struct map_session_data *) bl); + return 0; } + // 移動停止 -int battle_stopwalking(struct block_list *bl,int type) +int battle_stopwalking (struct block_list *bl, int type) { - nullpo_retr(0, bl); - if(bl->type==BL_MOB) - return mob_stop_walking((struct mob_data*)bl,type); - else if(bl->type==BL_PC) - return pc_stop_walking((struct map_session_data*)bl,type); - return 0; + nullpo_retr (0, bl); + if (bl->type == BL_MOB) + return mob_stop_walking ((struct mob_data *) bl, type); + else if (bl->type == BL_PC) + return pc_stop_walking ((struct map_session_data *) bl, type); + return 0; } - /*========================================== * ダメージの属性修正 *------------------------------------------ */ -int battle_attr_fix(int damage,int atk_elem,int def_elem) +int battle_attr_fix (int damage, int atk_elem, int def_elem) { - int def_type= def_elem%10, def_lv=def_elem/10/2; - - if( atk_elem<0 || atk_elem>9 || def_type<0 || def_type>9 || - def_lv<1 || def_lv>4){ // 属 性値がおかしいのでとりあえずそのまま返す - if(battle_config.error_log) - printf("battle_attr_fix: unknown attr type: atk=%d def_type=%d def_lv=%d\n",atk_elem,def_type,def_lv); - return damage; - } - - return damage*attr_fix_table[def_lv-1][atk_elem][def_type]/100; + int def_type = def_elem % 10, def_lv = def_elem / 10 / 2; + + if (atk_elem < 0 || atk_elem > 9 || def_type < 0 || def_type > 9 || + def_lv < 1 || def_lv > 4) + { // 属 性値がおかしいのでとりあえずそのまま返す + if (battle_config.error_log) + printf + ("battle_attr_fix: unknown attr type: atk=%d def_type=%d def_lv=%d\n", + atk_elem, def_type, def_lv); + return damage; + } + + return damage * attr_fix_table[def_lv - 1][atk_elem][def_type] / 100; } - /*========================================== * ダメージ最終計算 *------------------------------------------ */ -int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,int div_,int skill_num,int skill_lv,int flag) +int battle_calc_damage (struct block_list *src, struct block_list *bl, + int damage, int div_, int skill_num, int skill_lv, + int flag) { - struct map_session_data *sd=NULL; - struct mob_data *md=NULL; - struct status_change *sc_data,*sc; - short *sc_count; - int class; - - nullpo_retr(0, bl); - - class = battle_get_class(bl); - if(bl->type==BL_MOB) md=(struct mob_data *)bl; - else sd=(struct map_session_data *)bl; - - sc_data=battle_get_sc_data(bl); - sc_count=battle_get_sc_count(bl); - - if(sc_count!=NULL && *sc_count>0){ - - if(sc_data[SC_SAFETYWALL].timer!=-1 && damage>0 && flag&BF_WEAPON && flag&BF_SHORT && skill_num != NPC_GUIDEDATTACK){ - // セーフティウォール - struct skill_unit *unit=(struct skill_unit*)sc_data[SC_SAFETYWALL].val2; - if( unit && unit->alive && (--unit->group->val2)<=0 ) - skill_delunit(unit); - skill_unit_move(bl,gettick(),1); // 重ね掛けチェック - damage=0; - } - if(sc_data[SC_PNEUMA].timer!=-1 && damage>0 && flag&BF_WEAPON && flag&BF_LONG && skill_num != NPC_GUIDEDATTACK){ - // ニューマ - damage=0; - } - - if(sc_data[SC_ROKISWEIL].timer!=-1 && damage>0 && - flag&BF_MAGIC ){ - // ニューマ - damage=0; - } - - if(sc_data[SC_AETERNA].timer!=-1 && damage>0){ // レックスエーテルナ - damage<<=1; - skill_status_change_end( bl,SC_AETERNA,-1 ); - } - - //属性場のダメージ増加 - if(sc_data[SC_VOLCANO].timer!=-1){ // ボルケーノ - if(flag&BF_SKILL && skill_get_pl(skill_num)==3) - damage += damage*sc_data[SC_VOLCANO].val4/100; - else if(!flag&BF_SKILL && battle_get_attack_element(bl)==3) - damage += damage*sc_data[SC_VOLCANO].val4/100; - } - - if(sc_data[SC_VIOLENTGALE].timer!=-1){ // バイオレントゲイル - if(flag&BF_SKILL && skill_get_pl(skill_num)==4) - damage += damage*sc_data[SC_VIOLENTGALE].val4/100; - else if(!flag&BF_SKILL && battle_get_attack_element(bl)==4) - damage += damage*sc_data[SC_VIOLENTGALE].val4/100; - } - - if(sc_data[SC_DELUGE].timer!=-1){ // デリュージ - if(flag&BF_SKILL && skill_get_pl(skill_num)==1) - damage += damage*sc_data[SC_DELUGE].val4/100; - else if(!flag&BF_SKILL && battle_get_attack_element(bl)==1) - damage += damage*sc_data[SC_DELUGE].val4/100; - } - - if(sc_data[SC_ENERGYCOAT].timer!=-1 && damage>0 && flag&BF_WEAPON){ // エナジーコート - if(sd){ - if(sd->status.sp>0){ - int per = sd->status.sp * 5 / (sd->status.max_sp + 1); - sd->status.sp -= sd->status.sp * (per * 5 + 10) / 1000; - if( sd->status.sp < 0 ) sd->status.sp = 0; - damage -= damage * ((per+1) * 6) / 100; - clif_updatestatus(sd,SP_SP); - } - if(sd->status.sp<=0) - skill_status_change_end( bl,SC_ENERGYCOAT,-1 ); - } - else - damage -= damage * (sc_data[SC_ENERGYCOAT].val1 * 6) / 100; - } - - if(sc_data[SC_KYRIE].timer!=-1 && damage > 0){ // キリエエレイソン - sc=&sc_data[SC_KYRIE]; - sc->val2-=damage; - if(flag&BF_WEAPON){ - if(sc->val2>=0) damage=0; - else damage=-sc->val2; - } - if((--sc->val3)<=0 || (sc->val2<=0) || skill_num == AL_HOLYLIGHT) - skill_status_change_end(bl, SC_KYRIE, -1); - } - - if(sc_data[SC_BASILICA].timer!=-1 && damage > 0){ - // ニューマ - damage=0; - } - if(sc_data[SC_LANDPROTECTOR].timer!=-1 && damage>0 && flag&BF_MAGIC){ - // ニューマ - damage=0; - } - - if(sc_data[SC_AUTOGUARD].timer != -1 && damage > 0 && flag&BF_WEAPON) { - if(MRAND(100) < sc_data[SC_AUTOGUARD].val2) { - damage = 0; - clif_skill_nodamage(bl,bl,CR_AUTOGUARD,sc_data[SC_AUTOGUARD].val1,1); - if(sd) - sd->canmove_tick = gettick() + 300; - else if(md) - md->canmove_tick = gettick() + 300; - } - } + struct map_session_data *sd = NULL; + struct mob_data *md = NULL; + struct status_change *sc_data, *sc; + short *sc_count; + int class; + + nullpo_retr (0, bl); + + class = battle_get_class (bl); + if (bl->type == BL_MOB) + md = (struct mob_data *) bl; + else + sd = (struct map_session_data *) bl; + + sc_data = battle_get_sc_data (bl); + sc_count = battle_get_sc_count (bl); + + if (sc_count != NULL && *sc_count > 0) + { + + if (sc_data[SC_SAFETYWALL].timer != -1 && damage > 0 + && flag & BF_WEAPON && flag & BF_SHORT + && skill_num != NPC_GUIDEDATTACK) + { + // セーフティウォール + struct skill_unit *unit = + (struct skill_unit *) sc_data[SC_SAFETYWALL].val2; + if (unit && unit->alive && (--unit->group->val2) <= 0) + skill_delunit (unit); + skill_unit_move (bl, gettick (), 1); // 重ね掛けチェック + damage = 0; + } + if (sc_data[SC_PNEUMA].timer != -1 && damage > 0 && flag & BF_WEAPON + && flag & BF_LONG && skill_num != NPC_GUIDEDATTACK) + { + // ニューマ + damage = 0; + } + + if (sc_data[SC_ROKISWEIL].timer != -1 && damage > 0 && + flag & BF_MAGIC) + { + // ニューマ + damage = 0; + } + + if (sc_data[SC_AETERNA].timer != -1 && damage > 0) + { // レックスエーテルナ + damage <<= 1; + skill_status_change_end (bl, SC_AETERNA, -1); + } + + //属性場のダメージ増加 + if (sc_data[SC_VOLCANO].timer != -1) + { // ボルケーノ + if (flag & BF_SKILL && skill_get_pl (skill_num) == 3) + damage += damage * sc_data[SC_VOLCANO].val4 / 100; + else if (!flag & BF_SKILL && battle_get_attack_element (bl) == 3) + damage += damage * sc_data[SC_VOLCANO].val4 / 100; + } + + if (sc_data[SC_VIOLENTGALE].timer != -1) + { // バイオレントゲイル + if (flag & BF_SKILL && skill_get_pl (skill_num) == 4) + damage += damage * sc_data[SC_VIOLENTGALE].val4 / 100; + else if (!flag & BF_SKILL && battle_get_attack_element (bl) == 4) + damage += damage * sc_data[SC_VIOLENTGALE].val4 / 100; + } + + if (sc_data[SC_DELUGE].timer != -1) + { // デリュージ + if (flag & BF_SKILL && skill_get_pl (skill_num) == 1) + damage += damage * sc_data[SC_DELUGE].val4 / 100; + else if (!flag & BF_SKILL && battle_get_attack_element (bl) == 1) + damage += damage * sc_data[SC_DELUGE].val4 / 100; + } + + if (sc_data[SC_ENERGYCOAT].timer != -1 && damage > 0 + && flag & BF_WEAPON) + { // エナジーコート + if (sd) + { + if (sd->status.sp > 0) + { + int per = sd->status.sp * 5 / (sd->status.max_sp + 1); + sd->status.sp -= sd->status.sp * (per * 5 + 10) / 1000; + if (sd->status.sp < 0) + sd->status.sp = 0; + damage -= damage * ((per + 1) * 6) / 100; + clif_updatestatus (sd, SP_SP); + } + if (sd->status.sp <= 0) + skill_status_change_end (bl, SC_ENERGYCOAT, -1); + } + else + damage -= damage * (sc_data[SC_ENERGYCOAT].val1 * 6) / 100; + } + + if (sc_data[SC_KYRIE].timer != -1 && damage > 0) + { // キリエエレイソン + sc = &sc_data[SC_KYRIE]; + sc->val2 -= damage; + if (flag & BF_WEAPON) + { + if (sc->val2 >= 0) + damage = 0; + else + damage = -sc->val2; + } + if ((--sc->val3) <= 0 || (sc->val2 <= 0) + || skill_num == AL_HOLYLIGHT) + skill_status_change_end (bl, SC_KYRIE, -1); + } + + if (sc_data[SC_BASILICA].timer != -1 && damage > 0) + { + // ニューマ + damage = 0; + } + if (sc_data[SC_LANDPROTECTOR].timer != -1 && damage > 0 + && flag & BF_MAGIC) + { + // ニューマ + damage = 0; + } + + if (sc_data[SC_AUTOGUARD].timer != -1 && damage > 0 + && flag & BF_WEAPON) + { + if (MRAND (100) < sc_data[SC_AUTOGUARD].val2) + { + damage = 0; + clif_skill_nodamage (bl, bl, CR_AUTOGUARD, + sc_data[SC_AUTOGUARD].val1, 1); + if (sd) + sd->canmove_tick = gettick () + 300; + else if (md) + md->canmove_tick = gettick () + 300; + } + } // -- moonsoul (chance to block attacks with new Lord Knight skill parrying) // - if(sc_data[SC_PARRYING].timer != -1 && damage > 0 && flag&BF_WEAPON) { - if(MRAND(100) < sc_data[SC_PARRYING].val2) { - damage = 0; - clif_skill_nodamage(bl,bl,LK_PARRYING,sc_data[SC_PARRYING].val1,1); - } - } - // リジェクトソード - if(sc_data[SC_REJECTSWORD].timer!=-1 && damage > 0 && flag&BF_WEAPON && - ((src->type==BL_PC && ((struct map_session_data *)src)->status.weapon == (1 || 2 || 3)) || src->type==BL_MOB )){ - if(MRAND(100) < (10+5*sc_data[SC_REJECTSWORD].val1)){ //反射確率は10+5*Lv - damage = damage*50/100; - battle_damage(bl,src,damage,0); - //ダメージを与えたのは良いんだが、ここからどうして表示するんだかわかんねぇ - //エフェクトもこれでいいのかわかんねぇ - clif_skill_nodamage(bl,bl,ST_REJECTSWORD,sc_data[SC_REJECTSWORD].val1,1); - if((--sc_data[SC_REJECTSWORD].val2)<=0) - skill_status_change_end(bl, SC_REJECTSWORD, -1); - } - } - } - - if(class == 1288 || class == 1287 || class == 1286 || class == 1285) { -// if(class == 1288) { - if(class == 1288 && flag&BF_SKILL) - damage=0; - if(src->type == BL_PC) { - struct guild *g=guild_search(((struct map_session_data *)src)->status.guild_id); - struct guild_castle *gc=guild_mapname2gc(map[bl->m].name); - if(!((struct map_session_data *)src)->status.guild_id) - damage=0; - if(gc && agit_flag==0 && class != 1288) // guardians cannot be damaged during non-woe [Valaris] - damage=0; // end woe check [Valaris] - if(g == NULL) - damage=0;//ギルド未加入ならダメージ無し - else if((gc != NULL) && guild_isallied(g, gc)) - damage=0;//自占領ギルドのエンペならダメージ無し - else if(g && guild_checkskill(g,GD_APPROVAL) <= 0) - damage=0;//正規ギルド承認がないとダメージ無し - else if (battle_config.guild_max_castles != 0 && guild_checkcastles(g)>=battle_config.guild_max_castles) - damage = 0; // [MouseJstr] - } - else damage = 0; - } - - if(map[bl->m].flag.gvg && damage > 0) { //GvG - if(flag&BF_WEAPON) { - if(flag&BF_SHORT) - damage=damage*battle_config.gvg_short_damage_rate/100; - if(flag&BF_LONG) - damage=damage*battle_config.gvg_long_damage_rate/100; - } - if(flag&BF_MAGIC) - damage = damage*battle_config.gvg_magic_damage_rate/100; - if(flag&BF_MISC) - damage=damage*battle_config.gvg_misc_damage_rate/100; - if(damage < 1) damage = 1; - } - - if(battle_config.skill_min_damage || flag&BF_MISC) { - if(div_ < 255) { - if(damage > 0 && damage < div_) - damage = div_; - } - else if(damage > 0 && damage < 3) - damage = 3; - } - - if( md!=NULL && md->hp>0 && damage > 0 ) // 反撃などのMOBスキル判定 - mobskill_event(md,flag); - - return damage; + if (sc_data[SC_PARRYING].timer != -1 && damage > 0 + && flag & BF_WEAPON) + { + if (MRAND (100) < sc_data[SC_PARRYING].val2) + { + damage = 0; + clif_skill_nodamage (bl, bl, LK_PARRYING, + sc_data[SC_PARRYING].val1, 1); + } + } + // リジェクトソード + if (sc_data[SC_REJECTSWORD].timer != -1 && damage > 0 + && flag & BF_WEAPON + && + ((src->type == BL_PC + && ((struct map_session_data *) src)->status.weapon == (1 || 2 + || 3)) + || src->type == BL_MOB)) + { + if (MRAND (100) < (10 + 5 * sc_data[SC_REJECTSWORD].val1)) + { //反射確率は10+5*Lv + damage = damage * 50 / 100; + battle_damage (bl, src, damage, 0); + //ダメージを与えたのは良いんだが、ここからどうして表示するんだかわかんねぇ + //エフェクトもこれでいいのかわかんねぇ + clif_skill_nodamage (bl, bl, ST_REJECTSWORD, + sc_data[SC_REJECTSWORD].val1, 1); + if ((--sc_data[SC_REJECTSWORD].val2) <= 0) + skill_status_change_end (bl, SC_REJECTSWORD, -1); + } + } + } + + if (class == 1288 || class == 1287 || class == 1286 || class == 1285) + { +// if(class == 1288) { + if (class == 1288 && flag & BF_SKILL) + damage = 0; + if (src->type == BL_PC) + { + struct guild *g = + guild_search (((struct map_session_data *) src)-> + status.guild_id); + struct guild_castle *gc = guild_mapname2gc (map[bl->m].name); + if (!((struct map_session_data *) src)->status.guild_id) + damage = 0; + if (gc && agit_flag == 0 && class != 1288) // guardians cannot be damaged during non-woe [Valaris] + damage = 0; // end woe check [Valaris] + if (g == NULL) + damage = 0; //ギルド未加入ならダメージ無し + else if ((gc != NULL) && guild_isallied (g, gc)) + damage = 0; //自占領ギルドのエンペならダメージ無し + else if (g && guild_checkskill (g, GD_APPROVAL) <= 0) + damage = 0; //正規ギルド承認がないとダメージ無し + else if (battle_config.guild_max_castles != 0 + && guild_checkcastles (g) >= + battle_config.guild_max_castles) + damage = 0; // [MouseJstr] + } + else + damage = 0; + } + + if (map[bl->m].flag.gvg && damage > 0) + { //GvG + if (flag & BF_WEAPON) + { + if (flag & BF_SHORT) + damage = damage * battle_config.gvg_short_damage_rate / 100; + if (flag & BF_LONG) + damage = damage * battle_config.gvg_long_damage_rate / 100; + } + if (flag & BF_MAGIC) + damage = damage * battle_config.gvg_magic_damage_rate / 100; + if (flag & BF_MISC) + damage = damage * battle_config.gvg_misc_damage_rate / 100; + if (damage < 1) + damage = 1; + } + + if (battle_config.skill_min_damage || flag & BF_MISC) + { + if (div_ < 255) + { + if (damage > 0 && damage < div_) + damage = div_; + } + else if (damage > 0 && damage < 3) + damage = 3; + } + + if (md != NULL && md->hp > 0 && damage > 0) // 反撃などのMOBスキル判定 + mobskill_event (md, flag); + + return damage; } /*========================================== * 修練ダメージ *------------------------------------------ */ -int battle_addmastery(struct map_session_data *sd,struct block_list *target,int dmg,int type) +int battle_addmastery (struct map_session_data *sd, struct block_list *target, + int dmg, int type) { - int damage,skill; - int race=battle_get_race(target); - int weapon; - damage = 0; - - nullpo_retr(0, sd); - - // デーモンベイン(+3 〜 +30) vs 不死 or 悪魔 (死人は含めない?) - if((skill = pc_checkskill(sd,AL_DEMONBANE)) > 0 && (battle_check_undead(race,battle_get_elem_type(target)) || race==6) ) - damage += (skill * 3); - - // ビーストベイン(+4 〜 +40) vs 動物 or 昆虫 - if((skill = pc_checkskill(sd,HT_BEASTBANE)) > 0 && (race==2 || race==4) ) - damage += (skill * 4); - - if(type == 0) - weapon = sd->weapontype1; - else - weapon = sd->weapontype2; - switch(weapon) - { - case 0x01: // 短剣 (Updated By AppleGirl) - case 0x02: // 1HS - { - // 剣修練(+4 〜 +40) 片手剣 短剣含む - if((skill = pc_checkskill(sd,SM_SWORD)) > 0) { - damage += (skill * 4); - } - break; - } - case 0x03: // 2HS - { - // 両手剣修練(+4 〜 +40) 両手剣 - if((skill = pc_checkskill(sd,SM_TWOHAND)) > 0) { - damage += (skill * 4); - } - break; - } - case 0x04: // 1HL - { - // 槍修練(+4 〜 +40,+5 〜 +50) 槍 - if((skill = pc_checkskill(sd,KN_SPEARMASTERY)) > 0) { - if(!pc_isriding(sd)) - damage += (skill * 4); // ペコに乗ってない - else - damage += (skill * 5); // ペコに乗ってる - } - break; - } - case 0x05: // 2HL - { - // 槍修練(+4 〜 +40,+5 〜 +50) 槍 - if((skill = pc_checkskill(sd,KN_SPEARMASTERY)) > 0) { - if(!pc_isriding(sd)) - damage += (skill * 4); // ペコに乗ってない - else - damage += (skill * 5); // ペコに乗ってる - } - break; - } - case 0x06: // 片手斧 - { - if((skill = pc_checkskill(sd,AM_AXEMASTERY)) > 0) { - damage += (skill * 3); - } - break; - } - case 0x07: // Axe by Tato - { - if((skill = pc_checkskill(sd,AM_AXEMASTERY)) > 0) { - damage += (skill * 3); - } - break; - } - case 0x08: // メイス - { - // メイス修練(+3 〜 +30) メイス - if((skill = pc_checkskill(sd,PR_MACEMASTERY)) > 0) { - damage += (skill * 3); - } - break; - } - case 0x09: // なし? - break; - case 0x0a: // 杖 - break; - case 0x0b: // 弓 - break; - case 0x00: // 素手 - case 0x0c: // Knuckles - { - // 鉄拳(+3 〜 +30) 素手,ナックル - if((skill = pc_checkskill(sd,MO_IRONHAND)) > 0) { - damage += (skill * 3); - } - break; - } - case 0x0d: // Musical Instrument - { - // 楽器の練習(+3 〜 +30) 楽器 - if((skill = pc_checkskill(sd,BA_MUSICALLESSON)) > 0) { - damage += (skill * 3); - } - break; - } - case 0x0e: // Dance Mastery - { - // Dance Lesson Skill Effect(+3 damage for every lvl = +30) 鞭 - if((skill = pc_checkskill(sd,DC_DANCINGLESSON)) > 0) { - damage += (skill * 3); - } - break; - } - case 0x0f: // Book - { - // Advance Book Skill Effect(+3 damage for every lvl = +30) { - if((skill = pc_checkskill(sd,SA_ADVANCEDBOOK)) > 0) { - damage += (skill * 3); - } - break; - } - case 0x10: // Katars - { - // カタール修練(+3 〜 +30) カタール - if((skill = pc_checkskill(sd,AS_KATAR)) > 0) { - //ソニックブロー時は別処理(1撃に付き1/8適応) - damage += (skill * 3); - } - break; - } - } - damage = dmg + damage; - return (damage); + int damage, skill; + int race = battle_get_race (target); + int weapon; + damage = 0; + + nullpo_retr (0, sd); + + // デーモンベイン(+3 〜 +30) vs 不死 or 悪魔 (死人は含めない?) + if ((skill = pc_checkskill (sd, AL_DEMONBANE)) > 0 + && (battle_check_undead (race, battle_get_elem_type (target)) + || race == 6)) + damage += (skill * 3); + + // ビーストベイン(+4 〜 +40) vs 動物 or 昆虫 + if ((skill = pc_checkskill (sd, HT_BEASTBANE)) > 0 + && (race == 2 || race == 4)) + damage += (skill * 4); + + if (type == 0) + weapon = sd->weapontype1; + else + weapon = sd->weapontype2; + switch (weapon) + { + case 0x01: // 短剣 (Updated By AppleGirl) + case 0x02: // 1HS + { + // 剣修練(+4 〜 +40) 片手剣 短剣含む + if ((skill = pc_checkskill (sd, SM_SWORD)) > 0) + { + damage += (skill * 4); + } + break; + } + case 0x03: // 2HS + { + // 両手剣修練(+4 〜 +40) 両手剣 + if ((skill = pc_checkskill (sd, SM_TWOHAND)) > 0) + { + damage += (skill * 4); + } + break; + } + case 0x04: // 1HL + { + // 槍修練(+4 〜 +40,+5 〜 +50) 槍 + if ((skill = pc_checkskill (sd, KN_SPEARMASTERY)) > 0) + { + if (!pc_isriding (sd)) + damage += (skill * 4); // ペコに乗ってない + else + damage += (skill * 5); // ペコに乗ってる + } + break; + } + case 0x05: // 2HL + { + // 槍修練(+4 〜 +40,+5 〜 +50) 槍 + if ((skill = pc_checkskill (sd, KN_SPEARMASTERY)) > 0) + { + if (!pc_isriding (sd)) + damage += (skill * 4); // ペコに乗ってない + else + damage += (skill * 5); // ペコに乗ってる + } + break; + } + case 0x06: // 片手斧 + { + if ((skill = pc_checkskill (sd, AM_AXEMASTERY)) > 0) + { + damage += (skill * 3); + } + break; + } + case 0x07: // Axe by Tato + { + if ((skill = pc_checkskill (sd, AM_AXEMASTERY)) > 0) + { + damage += (skill * 3); + } + break; + } + case 0x08: // メイス + { + // メイス修練(+3 〜 +30) メイス + if ((skill = pc_checkskill (sd, PR_MACEMASTERY)) > 0) + { + damage += (skill * 3); + } + break; + } + case 0x09: // なし? + break; + case 0x0a: // 杖 + break; + case 0x0b: // 弓 + break; + case 0x00: // 素手 + case 0x0c: // Knuckles + { + // 鉄拳(+3 〜 +30) 素手,ナックル + if ((skill = pc_checkskill (sd, MO_IRONHAND)) > 0) + { + damage += (skill * 3); + } + break; + } + case 0x0d: // Musical Instrument + { + // 楽器の練習(+3 〜 +30) 楽器 + if ((skill = pc_checkskill (sd, BA_MUSICALLESSON)) > 0) + { + damage += (skill * 3); + } + break; + } + case 0x0e: // Dance Mastery + { + // Dance Lesson Skill Effect(+3 damage for every lvl = +30) 鞭 + if ((skill = pc_checkskill (sd, DC_DANCINGLESSON)) > 0) + { + damage += (skill * 3); + } + break; + } + case 0x0f: // Book + { + // Advance Book Skill Effect(+3 damage for every lvl = +30) { + if ((skill = pc_checkskill (sd, SA_ADVANCEDBOOK)) > 0) + { + damage += (skill * 3); + } + break; + } + case 0x10: // Katars + { + // カタール修練(+3 〜 +30) カタール + if ((skill = pc_checkskill (sd, AS_KATAR)) > 0) + { + //ソニックブロー時は別処理(1撃に付き1/8適応) + damage += (skill * 3); + } + break; + } + } + damage = dmg + damage; + return (damage); } -static struct Damage battle_calc_mob_weapon_attack( - struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag) +static struct Damage battle_calc_mob_weapon_attack (struct block_list *src, + struct block_list *target, + int skill_num, + int skill_lv, int wflag) { - struct map_session_data *tsd=NULL; - struct mob_data* md=(struct mob_data *)src,*tmd=NULL; - int hitrate,flee,cri = 0,atkmin,atkmax; - int luk,target_count = 1; - int def1 = battle_get_def(target); - int def2 = battle_get_def2(target); - int t_vit = battle_get_vit(target); - struct Damage wd; - int damage,damage2=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv); - int flag,skill,ac_flag = 0,dmg_lv = 0; - int t_mode=0,t_race=0,t_size=1,s_race=0,s_ele=0; - struct status_change *sc_data,*t_sc_data; - short *sc_count; - short *option, *opt1, *opt2; - - //return前の処理があるので情報出力部のみ変更 - if( src == NULL || target == NULL || md == NULL ){ - nullpo_info(NLP_MARK); - memset(&wd,0,sizeof(wd)); - return wd; - } - - s_race=battle_get_race(src); - s_ele=battle_get_attack_element(src); - sc_data=battle_get_sc_data(src); - sc_count=battle_get_sc_count(src); - option=battle_get_option(src); - opt1=battle_get_opt1(src); - opt2=battle_get_opt2(src); - - // ターゲット - if(target->type==BL_PC) - tsd=(struct map_session_data *)target; - else if(target->type==BL_MOB) - tmd=(struct mob_data *)target; - t_race=battle_get_race( target ); - t_size=battle_get_size( target ); - t_mode=battle_get_mode( target ); - t_sc_data=battle_get_sc_data( target ); - - if((skill_num == 0 || (target->type == BL_PC && battle_config.pc_auto_counter_type&2) || - (target->type == BL_MOB && battle_config.monster_auto_counter_type&2)) && skill_lv >= 0) { - if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1) { - int dir = map_calc_dir(src,target->x,target->y),t_dir = battle_get_dir(target); - int dist = distance(src->x,src->y,target->x,target->y); - if(dist <= 0 || map_check_dir(dir,t_dir) ) { - memset(&wd,0,sizeof(wd)); - t_sc_data[SC_AUTOCOUNTER].val3 = 0; - t_sc_data[SC_AUTOCOUNTER].val4 = 1; - if(sc_data && sc_data[SC_AUTOCOUNTER].timer == -1) { - int range = battle_get_range(target); - if((target->type == BL_PC && ((struct map_session_data *)target)->status.weapon != 11 && dist <= range+1) || - (target->type == BL_MOB && range <= 3 && dist <= range+1) ) - t_sc_data[SC_AUTOCOUNTER].val3 = src->id; - } - return wd; - } - else ac_flag = 1; - } - } - flag=BF_SHORT|BF_WEAPON|BF_NORMAL; // 攻撃の種類の設定 - - // 回避率計算、回避判定は後で - flee = battle_get_flee(target); - if(battle_config.agi_penaly_type > 0 || battle_config.vit_penaly_type > 0) - target_count += battle_counttargeted(target,src,battle_config.agi_penaly_count_lv); - if(battle_config.agi_penaly_type > 0) { - if(target_count >= battle_config.agi_penaly_count) { - if(battle_config.agi_penaly_type == 1) - flee = (flee * (100 - (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num))/100; - else if(battle_config.agi_penaly_type == 2) - flee -= (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num; - if(flee < 1) flee = 1; - } - } - hitrate=battle_get_hit(src) - flee + 80; - - type=0; // normal - div_ = 1; // single attack - - luk=battle_get_luk(src); - - if(battle_config.enemy_str) - damage = battle_get_baseatk(src); - else - damage = 0; - if(skill_num==HW_MAGICCRASHER){ /* マジッククラッシャーはMATKで殴る */ - atkmin = battle_get_matk1(src); - atkmax = battle_get_matk2(src); - }else{ - atkmin = battle_get_atk(src); - atkmax = battle_get_atk2(src); - } - if(mob_db[md->class].range>3 ) - flag=(flag&~BF_RANGEMASK)|BF_LONG; - - if(atkmin > atkmax) atkmin = atkmax; - - if(sc_data != NULL && sc_data[SC_MAXIMIZEPOWER].timer!=-1 ){ // マキシマイズパワー - atkmin=atkmax; - } - - cri = battle_get_critical(src); - cri -= battle_get_luk(target) * 3; - if(battle_config.enemy_critical_rate != 100) { - cri = cri*battle_config.enemy_critical_rate/100; - if(cri < 1) - cri = 1; - } - if(t_sc_data != NULL && t_sc_data[SC_SLEEP].timer!=-1 ) // 睡眠中はクリティカルが倍に - cri <<=1; - - if(ac_flag) cri = 1000; - - if(skill_num == KN_AUTOCOUNTER) { - if(!(battle_config.monster_auto_counter_type&1)) - cri = 1000; - else - cri <<= 1; - } - - if(tsd && tsd->critical_def) - cri = cri * (100 - tsd->critical_def) / 100; - - if((skill_num == 0 || skill_num == KN_AUTOCOUNTER) && skill_lv >= 0 && battle_config.enemy_critical && (MRAND(1000)) < cri) // 判定(スキルの場合は無視) - // 敵の判定 - { - damage += atkmax; - type = 0x0a; - } - else { - int vitbonusmax; - - if(atkmax > atkmin) - damage += atkmin + MRAND((atkmax-atkmin + 1)); - else - damage += atkmin ; - // スキル修正1(攻撃力倍化系) - // オーバートラスト(+5% 〜 +25%),他攻撃系スキルの場合ここで補正 - // バッシュ,マグナムブレイク, - // ボーリングバッシュ,スピアブーメラン,ブランディッシュスピア,スピアスタッブ, - // メマーナイト,カートレボリューション - // ダブルストレイフィング,アローシャワー,チャージアロー, - // ソニックブロー - if(sc_data){ //状態異常中のダメージ追加 - if(sc_data[SC_OVERTHRUST].timer!=-1) // オーバートラスト - damage += damage*(5*sc_data[SC_OVERTHRUST].val1)/100; - if(sc_data[SC_TRUESIGHT].timer!=-1) // トゥルーサイト - damage += damage*(2*sc_data[SC_TRUESIGHT].val1)/100; - if(sc_data[SC_BERSERK].timer!=-1) // バーサーク - damage += damage*50/100; - } - - if(skill_num>0){ - int i; - if( (i=skill_get_pl(skill_num))>0 ) - s_ele=i; - - flag=(flag&~BF_SKILLMASK)|BF_SKILL; - switch( skill_num ){ - case SM_BASH: // バッシュ - damage = damage*(100+ 30*skill_lv)/100; - hitrate = (hitrate*(100+5*skill_lv))/100; - break; - case SM_MAGNUM: // マグナムブレイク - damage = damage*(5*skill_lv +(wflag)?65:115 )/100; - break; - case MC_MAMMONITE: // メマーナイト - damage = damage*(100+ 50*skill_lv)/100; - break; - case AC_DOUBLE: // ダブルストレイフィング - damage = damage*(180+ 20*skill_lv)/100; - div_=2; - flag=(flag&~BF_RANGEMASK)|BF_LONG; - break; - case AC_SHOWER: // アローシャワー - damage = damage*(75 + 5*skill_lv)/100; - flag=(flag&~BF_RANGEMASK)|BF_LONG; - break; - case AC_CHARGEARROW: // チャージアロー - damage = damage*150/100; - flag=(flag&~BF_RANGEMASK)|BF_LONG; - break; - case KN_PIERCE: // ピアース - damage = damage*(100+ 10*skill_lv)/100; - hitrate=hitrate*(100+5*skill_lv)/100; - div_=t_size+1; - damage*=div_; - break; - case KN_SPEARSTAB: // スピアスタブ - damage = damage*(100+ 15*skill_lv)/100; - break; - case KN_SPEARBOOMERANG: // スピアブーメラン - damage = damage*(100+ 50*skill_lv)/100; - flag=(flag&~BF_RANGEMASK)|BF_LONG; - break; - case KN_BRANDISHSPEAR: // ブランディッシュスピア - damage = damage*(100+ 20*skill_lv)/100; - if(skill_lv>3 && wflag==1) damage2+=damage/2; - if(skill_lv>6 && wflag==1) damage2+=damage/4; - if(skill_lv>9 && wflag==1) damage2+=damage/8; - if(skill_lv>6 && wflag==2) damage2+=damage/2; - if(skill_lv>9 && wflag==2) damage2+=damage/4; - if(skill_lv>9 && wflag==3) damage2+=damage/2; - damage +=damage2; - blewcount=0; - break; - case KN_BOWLINGBASH: // ボウリングバッシュ - damage = damage*(100+ 50*skill_lv)/100; - blewcount=0; - break; - case KN_AUTOCOUNTER: - if(battle_config.monster_auto_counter_type&1) - hitrate += 20; - else - hitrate = 1000000; - flag=(flag&~BF_SKILLMASK)|BF_NORMAL; - break; - case AS_SONICBLOW: // ソニックブロウ - damage = damage*(300+ 50*skill_lv)/100; - div_=8; - break; - case TF_SPRINKLESAND: // 砂まき - damage = damage*125/100; - break; - case MC_CARTREVOLUTION: // カートレボリューション - damage = (damage*150)/100; - break; - // 以下MOB - case NPC_COMBOATTACK: // 多段攻撃 - div_=skill_get_num(skill_num,skill_lv); - damage *= div_; - break; - case NPC_RANDOMATTACK: // ランダムATK攻撃 - damage = damage*(MPRAND(50, 150))/100; - break; - // 属性攻撃(適当) - case NPC_WATERATTACK: - case NPC_GROUNDATTACK: - case NPC_FIREATTACK: - case NPC_WINDATTACK: - case NPC_POISONATTACK: - case NPC_HOLYATTACK: - case NPC_DARKNESSATTACK: - case NPC_TELEKINESISATTACK: - damage = damage*(100+25*(skill_lv-1))/100; - break; - case NPC_GUIDEDATTACK: - hitrate = 1000000; - break; - case NPC_RANGEATTACK: - flag=(flag&~BF_RANGEMASK)|BF_LONG; - break; - case NPC_PIERCINGATT: - flag=(flag&~BF_RANGEMASK)|BF_SHORT; - break; - case RG_BACKSTAP: // バックスタブ - damage = damage*(300+ 40*skill_lv)/100; - hitrate = 1000000; - break; - case RG_RAID: // サプライズアタック - damage = damage*(100+ 40*skill_lv)/100; - break; - case RG_INTIMIDATE: // インティミデイト - damage = damage*(100+ 30*skill_lv)/100; - break; - case CR_SHIELDCHARGE: // シールドチャージ - damage = damage*(100+ 20*skill_lv)/100; - flag=(flag&~BF_RANGEMASK)|BF_SHORT; - s_ele = 0; - break; - case CR_SHIELDBOOMERANG: // シールドブーメラン - damage = damage*(100+ 30*skill_lv)/100; - flag=(flag&~BF_RANGEMASK)|BF_LONG; - s_ele = 0; - break; - case CR_HOLYCROSS: // ホーリークロス - damage = damage*(100+ 35*skill_lv)/100; - div_=2; - break; - case CR_GRANDCROSS: - hitrate= 1000000; - break; - case AM_DEMONSTRATION: // デモンストレーション - damage = damage*(100+ 20*skill_lv)/100; - damage2 = damage2*(100+ 20*skill_lv)/100; - break; - case AM_ACIDTERROR: // アシッドテラー - damage = damage*(100+ 40*skill_lv)/100; - damage2 = damage2*(100+ 40*skill_lv)/100; - break; - case MO_FINGEROFFENSIVE: //指弾 - damage = damage * (100 + 50 * skill_lv) / 100; - div_ = 1; - break; - case MO_INVESTIGATE: // 発 勁 - if(def1 < 1000000) - damage = damage*(100+ 75*skill_lv)/100 * (def1 + def2)/100; - hitrate = 1000000; - s_ele = 0; - break; - case MO_EXTREMITYFIST: // 阿修羅覇鳳拳 - damage = damage * 8 + 250 + (skill_lv * 150); - hitrate = 1000000; - s_ele = 0; - break; - case MO_CHAINCOMBO: // 連打掌 - damage = damage*(150+ 50*skill_lv)/100; - div_=4; - break; - case BA_MUSICALSTRIKE: // ミュージカルストライク - damage = damage*(100+ 50 * skill_lv)/100; - flag=(flag&~BF_RANGEMASK)|BF_LONG; - break; - case DC_THROWARROW: // 矢撃ち - damage = damage*(100+ 50 * skill_lv)/100; - flag=(flag&~BF_RANGEMASK)|BF_LONG; - break; - case MO_COMBOFINISH: // 猛龍拳 - damage = damage*(240+ 60*skill_lv)/100; - break; - case CH_TIGERFIST: // 伏虎拳 - damage = damage*(100+ 20*skill_lv)/100; - break; - case CH_CHAINCRUSH: // 連柱崩撃 - damage = damage*(100+ 20*skill_lv)/100; - div_=skill_get_num(skill_num,skill_lv); - break; - case CH_PALMSTRIKE: // 猛虎硬派山 - damage = damage*(50+ 100*skill_lv)/100; - break; - case LK_SPIRALPIERCE: /* スパイラルピアース */ - damage = damage*(100+ 50*skill_lv)/100; //増加量が分からないので適当に - div_=5; - if(tsd) - tsd->canmove_tick = gettick() + 1000; - else if(tmd) - tmd->canmove_tick = gettick() + 1000; - break; - case LK_HEADCRUSH: /* ヘッドクラッシュ */ - damage = damage*(100+ 20*skill_lv)/100; - break; - case LK_JOINTBEAT: /* ジョイントビート */ - damage = damage*(50+ 10*skill_lv)/100; - break; - case ASC_METEORASSAULT: /* メテオアサルト */ - damage = damage*(40+ 40*skill_lv)/100; - break; - case SN_SHARPSHOOTING: /* シャープシューティング */ - damage += damage*(30*skill_lv)/100; - break; - case CG_ARROWVULCAN: /* アローバルカン */ - damage = damage*(160+40*skill_lv)/100; - div_=9; - break; - case AS_SPLASHER: /* ベナムスプラッシャー */ - damage = damage*(200+20*skill_lv)/100; - break; - } - } - - if( skill_num!=NPC_CRITICALSLASH ){ - // 対 象の防御力によるダメージの減少 - // ディバインプロテクション(ここでいいのかな?) - if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000) { //DEF, VIT無視 - int t_def; - target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penaly_count_lv); - if(battle_config.vit_penaly_type > 0) { - if(target_count >= battle_config.vit_penaly_count) { - if(battle_config.vit_penaly_type == 1) { - def1 = (def1 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; - def2 = (def2 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; - t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; - } - else if(battle_config.vit_penaly_type == 2) { - def1 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; - def2 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; - t_vit -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; - } - if(def1 < 0) def1 = 0; - if(def2 < 1) def2 = 1; - if(t_vit < 1) t_vit = 1; - } - } - t_def = def2*8/10; - if(battle_check_undead(s_race,battle_get_elem_type(src)) || s_race==6) - if(tsd && (skill=pc_checkskill(tsd,AL_DP)) > 0 ) - t_def += skill*3; - - vitbonusmax = (t_vit/20)*(t_vit/20)-1; - if(battle_config.monster_defense_type) { - damage = damage - (def1 * battle_config.monster_defense_type) - t_def - ((vitbonusmax < 1)?0: MRAND((vitbonusmax+1)) ); - } - else{ - damage = damage * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: MRAND((vitbonusmax+1)) ); - } - } - } - } - - // 0未満だった場合1に補正 - if(damage<1) damage=1; - - // 回避修正 - if(hitrate < 1000000) - hitrate = ( (hitrate>95)?95: ((hitrate<5)?5:hitrate) ); - if( hitrate < 1000000 && // 必中攻撃 - (t_sc_data != NULL && (t_sc_data[SC_SLEEP].timer!=-1 || // 睡眠は必中 - t_sc_data[SC_STAN].timer!=-1 || // スタンは必中 - t_sc_data[SC_FREEZE].timer!=-1 || (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0) ) ) ) // 凍結は必中 - hitrate = 1000000; - if(type == 0 && MRAND(100) >= hitrate) { - damage = damage2 = 0; - dmg_lv = ATK_FLEE; - } else { - dmg_lv = ATK_DEF; - } - - if(tsd){ - int cardfix=100,i; - cardfix=cardfix*(100-tsd->subele[s_ele])/100; // 属 性によるダメージ耐性 - cardfix=cardfix*(100-tsd->subrace[s_race])/100; // 種族によるダメージ耐性 - if(mob_db[md->class].mode & 0x20) - cardfix=cardfix*(100-tsd->subrace[10])/100; - else - cardfix=cardfix*(100-tsd->subrace[11])/100; - for(i=0;i<tsd->add_def_class_count;i++) { - if(tsd->add_def_classid[i] == md->class) { - cardfix=cardfix*(100-tsd->add_def_classrate[i])/100; - break; - } - } - if(flag&BF_LONG) - cardfix=cardfix*(100-tsd->long_attack_def_rate)/100; - if(flag&BF_SHORT) - cardfix=cardfix*(100-tsd->near_attack_def_rate)/100; - damage=damage*cardfix/100; - } - if(t_sc_data) { - int cardfix=100; - if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG) - cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100; - if(cardfix != 100) - damage=damage*cardfix/100; - } - if(t_sc_data && t_sc_data[SC_ASSUMPTIO].timer != -1){ //アシャンプティオ - if(!map[target->m].flag.pvp) - damage=damage/3; - else - damage=damage/2; - } - - if(damage < 0) damage = 0; - - // 属 性の適用 - if (!((battle_config.mob_ghostring_fix == 1) && - (battle_get_element(target) == 8) && - (target->type==BL_PC))) // [MouseJstr] - if(skill_num != 0 || s_ele != 0 || !battle_config.mob_attack_attr_none) - damage=battle_attr_fix(damage, s_ele, battle_get_element(target) ); - - if(sc_data && sc_data[SC_AURABLADE].timer!=-1) /* オーラブレード 必中 */ - damage += sc_data[SC_AURABLADE].val1 * 10; - if(skill_num==PA_PRESSURE) /* プレッシャー 必中? */ - damage = 700+100*skill_lv; - - // インベナム修正 - if(skill_num==TF_POISON){ - damage = battle_attr_fix(damage + 15*skill_lv, s_ele, battle_get_element(target) ); - } - if(skill_num==MC_CARTREVOLUTION){ - damage = battle_attr_fix(damage, 0, battle_get_element(target) ); - } - - // 完全回避の判定 - if(skill_num == 0 && skill_lv >= 0 && tsd!=NULL && MRAND(1000) < battle_get_flee2(target) ){ - damage=0; - type=0x0b; - dmg_lv = ATK_LUCKY; - } - - if(battle_config.enemy_perfect_flee) { - if(skill_num == 0 && skill_lv >= 0 && tmd!=NULL && MRAND(1000) < battle_get_flee2(target) ){ - damage=0; - type=0x0b; - dmg_lv = ATK_LUCKY; - } - } - -// if(def1 >= 1000000 && damage > 0) - if(t_mode&0x40 && damage > 0) - damage = 1; - - if( tsd && tsd->special_state.no_weapon_damage) - damage = 0; - - if(skill_num != CR_GRANDCROSS) - damage=battle_calc_damage(src,target,damage,div_,skill_num,skill_lv,flag); - - wd.damage=damage; - wd.damage2=0; - wd.type=type; - wd.div_=div_; - wd.amotion=battle_get_amotion(src); - if(skill_num == KN_AUTOCOUNTER) - wd.amotion >>= 1; - wd.dmotion=battle_get_dmotion(target); - wd.blewcount=blewcount; - wd.flag=flag; - wd.dmg_lv=dmg_lv; - return wd; -} - + struct map_session_data *tsd = NULL; + struct mob_data *md = (struct mob_data *) src, *tmd = NULL; + int hitrate, flee, cri = 0, atkmin, atkmax; + int luk, target_count = 1; + int def1 = battle_get_def (target); + int def2 = battle_get_def2 (target); + int t_vit = battle_get_vit (target); + struct Damage wd; + int damage, damage2 = 0, type, div_, blewcount = + skill_get_blewcount (skill_num, skill_lv); + int flag, skill, ac_flag = 0, dmg_lv = 0; + int t_mode = 0, t_race = 0, t_size = 1, s_race = 0, s_ele = 0; + struct status_change *sc_data, *t_sc_data; + short *sc_count; + short *option, *opt1, *opt2; + + //return前の処理があるので情報出力部のみ変更 + if (src == NULL || target == NULL || md == NULL) + { + nullpo_info (NLP_MARK); + memset (&wd, 0, sizeof (wd)); + return wd; + } + + s_race = battle_get_race (src); + s_ele = battle_get_attack_element (src); + sc_data = battle_get_sc_data (src); + sc_count = battle_get_sc_count (src); + option = battle_get_option (src); + opt1 = battle_get_opt1 (src); + opt2 = battle_get_opt2 (src); + + // ターゲット + if (target->type == BL_PC) + tsd = (struct map_session_data *) target; + else if (target->type == BL_MOB) + tmd = (struct mob_data *) target; + t_race = battle_get_race (target); + t_size = battle_get_size (target); + t_mode = battle_get_mode (target); + t_sc_data = battle_get_sc_data (target); + + if ((skill_num == 0 + || (target->type == BL_PC && battle_config.pc_auto_counter_type & 2) + || (target->type == BL_MOB + && battle_config.monster_auto_counter_type & 2)) + && skill_lv >= 0) + { + if (skill_num != CR_GRANDCROSS && t_sc_data + && t_sc_data[SC_AUTOCOUNTER].timer != -1) + { + int dir = map_calc_dir (src, target->x, target->y), t_dir = + battle_get_dir (target); + int dist = distance (src->x, src->y, target->x, target->y); + if (dist <= 0 || map_check_dir (dir, t_dir)) + { + memset (&wd, 0, sizeof (wd)); + t_sc_data[SC_AUTOCOUNTER].val3 = 0; + t_sc_data[SC_AUTOCOUNTER].val4 = 1; + if (sc_data && sc_data[SC_AUTOCOUNTER].timer == -1) + { + int range = battle_get_range (target); + if ((target->type == BL_PC + && ((struct map_session_data *) target)-> + status.weapon != 11 && dist <= range + 1) + || (target->type == BL_MOB && range <= 3 + && dist <= range + 1)) + t_sc_data[SC_AUTOCOUNTER].val3 = src->id; + } + return wd; + } + else + ac_flag = 1; + } + } + flag = BF_SHORT | BF_WEAPON | BF_NORMAL; // 攻撃の種類の設定 + + // 回避率計算、回避判定は後で + flee = battle_get_flee (target); + if (battle_config.agi_penaly_type > 0 + || battle_config.vit_penaly_type > 0) + target_count += + battle_counttargeted (target, src, + battle_config.agi_penaly_count_lv); + if (battle_config.agi_penaly_type > 0) + { + if (target_count >= battle_config.agi_penaly_count) + { + if (battle_config.agi_penaly_type == 1) + flee = + (flee * + (100 - + (target_count - + (battle_config.agi_penaly_count - + 1)) * battle_config.agi_penaly_num)) / 100; + else if (battle_config.agi_penaly_type == 2) + flee -= + (target_count - + (battle_config.agi_penaly_count - + 1)) * battle_config.agi_penaly_num; + if (flee < 1) + flee = 1; + } + } + hitrate = battle_get_hit (src) - flee + 80; + + type = 0; // normal + div_ = 1; // single attack + + luk = battle_get_luk (src); + + if (battle_config.enemy_str) + damage = battle_get_baseatk (src); + else + damage = 0; + if (skill_num == HW_MAGICCRASHER) + { /* マジッククラッシャーはMATKで殴る */ + atkmin = battle_get_matk1 (src); + atkmax = battle_get_matk2 (src); + } + else + { + atkmin = battle_get_atk (src); + atkmax = battle_get_atk2 (src); + } + if (mob_db[md->class].range > 3) + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + + if (atkmin > atkmax) + atkmin = atkmax; + + if (sc_data != NULL && sc_data[SC_MAXIMIZEPOWER].timer != -1) + { // マキシマイズパワー + atkmin = atkmax; + } + + cri = battle_get_critical (src); + cri -= battle_get_luk (target) * 3; + if (battle_config.enemy_critical_rate != 100) + { + cri = cri * battle_config.enemy_critical_rate / 100; + if (cri < 1) + cri = 1; + } + if (t_sc_data != NULL && t_sc_data[SC_SLEEP].timer != -1) // 睡眠中はクリティカルが倍に + cri <<= 1; + + if (ac_flag) + cri = 1000; + + if (skill_num == KN_AUTOCOUNTER) + { + if (!(battle_config.monster_auto_counter_type & 1)) + cri = 1000; + else + cri <<= 1; + } + + if (tsd && tsd->critical_def) + cri = cri * (100 - tsd->critical_def) / 100; + + if ((skill_num == 0 || skill_num == KN_AUTOCOUNTER) && skill_lv >= 0 && battle_config.enemy_critical && (MRAND (1000)) < cri) // 判定(スキルの場合は無視) + // 敵の判定 + { + damage += atkmax; + type = 0x0a; + } + else + { + int vitbonusmax; + + if (atkmax > atkmin) + damage += atkmin + MRAND ((atkmax - atkmin + 1)); + else + damage += atkmin; + // スキル修正1(攻撃力倍化系) + // オーバートラスト(+5% 〜 +25%),他攻撃系スキルの場合ここで補正 + // バッシュ,マグナムブレイク, + // ボーリングバッシュ,スピアブーメラン,ブランディッシュスピア,スピアスタッブ, + // メマーナイト,カートレボリューション + // ダブルストレイフィング,アローシャワー,チャージアロー, + // ソニックブロー + if (sc_data) + { //状態異常中のダメージ追加 + if (sc_data[SC_OVERTHRUST].timer != -1) // オーバートラスト + damage += damage * (5 * sc_data[SC_OVERTHRUST].val1) / 100; + if (sc_data[SC_TRUESIGHT].timer != -1) // トゥルーサイト + damage += damage * (2 * sc_data[SC_TRUESIGHT].val1) / 100; + if (sc_data[SC_BERSERK].timer != -1) // バーサーク + damage += damage * 50 / 100; + } -int -battle_is_unarmed(struct block_list *bl) -{ - if (!bl) - return 0; - if (bl->type == BL_PC) { - struct map_session_data *sd = (struct map_session_data *) bl; + if (skill_num > 0) + { + int i; + if ((i = skill_get_pl (skill_num)) > 0) + s_ele = i; + + flag = (flag & ~BF_SKILLMASK) | BF_SKILL; + switch (skill_num) + { + case SM_BASH: // バッシュ + damage = damage * (100 + 30 * skill_lv) / 100; + hitrate = (hitrate * (100 + 5 * skill_lv)) / 100; + break; + case SM_MAGNUM: // マグナムブレイク + damage = + damage * (5 * skill_lv + (wflag) ? 65 : 115) / 100; + break; + case MC_MAMMONITE: // メマーナイト + damage = damage * (100 + 50 * skill_lv) / 100; + break; + case AC_DOUBLE: // ダブルストレイフィング + damage = damage * (180 + 20 * skill_lv) / 100; + div_ = 2; + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + break; + case AC_SHOWER: // アローシャワー + damage = damage * (75 + 5 * skill_lv) / 100; + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + break; + case AC_CHARGEARROW: // チャージアロー + damage = damage * 150 / 100; + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + break; + case KN_PIERCE: // ピアース + damage = damage * (100 + 10 * skill_lv) / 100; + hitrate = hitrate * (100 + 5 * skill_lv) / 100; + div_ = t_size + 1; + damage *= div_; + break; + case KN_SPEARSTAB: // スピアスタブ + damage = damage * (100 + 15 * skill_lv) / 100; + break; + case KN_SPEARBOOMERANG: // スピアブーメラン + damage = damage * (100 + 50 * skill_lv) / 100; + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + break; + case KN_BRANDISHSPEAR: // ブランディッシュスピア + damage = damage * (100 + 20 * skill_lv) / 100; + if (skill_lv > 3 && wflag == 1) + damage2 += damage / 2; + if (skill_lv > 6 && wflag == 1) + damage2 += damage / 4; + if (skill_lv > 9 && wflag == 1) + damage2 += damage / 8; + if (skill_lv > 6 && wflag == 2) + damage2 += damage / 2; + if (skill_lv > 9 && wflag == 2) + damage2 += damage / 4; + if (skill_lv > 9 && wflag == 3) + damage2 += damage / 2; + damage += damage2; + blewcount = 0; + break; + case KN_BOWLINGBASH: // ボウリングバッシュ + damage = damage * (100 + 50 * skill_lv) / 100; + blewcount = 0; + break; + case KN_AUTOCOUNTER: + if (battle_config.monster_auto_counter_type & 1) + hitrate += 20; + else + hitrate = 1000000; + flag = (flag & ~BF_SKILLMASK) | BF_NORMAL; + break; + case AS_SONICBLOW: // ソニックブロウ + damage = damage * (300 + 50 * skill_lv) / 100; + div_ = 8; + break; + case TF_SPRINKLESAND: // 砂まき + damage = damage * 125 / 100; + break; + case MC_CARTREVOLUTION: // カートレボリューション + damage = (damage * 150) / 100; + break; + // 以下MOB + case NPC_COMBOATTACK: // 多段攻撃 + div_ = skill_get_num (skill_num, skill_lv); + damage *= div_; + break; + case NPC_RANDOMATTACK: // ランダムATK攻撃 + damage = damage * (MPRAND (50, 150)) / 100; + break; + // 属性攻撃(適当) + case NPC_WATERATTACK: + case NPC_GROUNDATTACK: + case NPC_FIREATTACK: + case NPC_WINDATTACK: + case NPC_POISONATTACK: + case NPC_HOLYATTACK: + case NPC_DARKNESSATTACK: + case NPC_TELEKINESISATTACK: + damage = damage * (100 + 25 * (skill_lv - 1)) / 100; + break; + case NPC_GUIDEDATTACK: + hitrate = 1000000; + break; + case NPC_RANGEATTACK: + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + break; + case NPC_PIERCINGATT: + flag = (flag & ~BF_RANGEMASK) | BF_SHORT; + break; + case RG_BACKSTAP: // バックスタブ + damage = damage * (300 + 40 * skill_lv) / 100; + hitrate = 1000000; + break; + case RG_RAID: // サプライズアタック + damage = damage * (100 + 40 * skill_lv) / 100; + break; + case RG_INTIMIDATE: // インティミデイト + damage = damage * (100 + 30 * skill_lv) / 100; + break; + case CR_SHIELDCHARGE: // シールドチャージ + damage = damage * (100 + 20 * skill_lv) / 100; + flag = (flag & ~BF_RANGEMASK) | BF_SHORT; + s_ele = 0; + break; + case CR_SHIELDBOOMERANG: // シールドブーメラン + damage = damage * (100 + 30 * skill_lv) / 100; + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + s_ele = 0; + break; + case CR_HOLYCROSS: // ホーリークロス + damage = damage * (100 + 35 * skill_lv) / 100; + div_ = 2; + break; + case CR_GRANDCROSS: + hitrate = 1000000; + break; + case AM_DEMONSTRATION: // デモンストレーション + damage = damage * (100 + 20 * skill_lv) / 100; + damage2 = damage2 * (100 + 20 * skill_lv) / 100; + break; + case AM_ACIDTERROR: // アシッドテラー + damage = damage * (100 + 40 * skill_lv) / 100; + damage2 = damage2 * (100 + 40 * skill_lv) / 100; + break; + case MO_FINGEROFFENSIVE: //指弾 + damage = damage * (100 + 50 * skill_lv) / 100; + div_ = 1; + break; + case MO_INVESTIGATE: // 発 勁 + if (def1 < 1000000) + damage = + damage * (100 + 75 * skill_lv) / 100 * (def1 + + def2) / + 100; + hitrate = 1000000; + s_ele = 0; + break; + case MO_EXTREMITYFIST: // 阿修羅覇鳳拳 + damage = damage * 8 + 250 + (skill_lv * 150); + hitrate = 1000000; + s_ele = 0; + break; + case MO_CHAINCOMBO: // 連打掌 + damage = damage * (150 + 50 * skill_lv) / 100; + div_ = 4; + break; + case BA_MUSICALSTRIKE: // ミュージカルストライク + damage = damage * (100 + 50 * skill_lv) / 100; + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + break; + case DC_THROWARROW: // 矢撃ち + damage = damage * (100 + 50 * skill_lv) / 100; + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + break; + case MO_COMBOFINISH: // 猛龍拳 + damage = damage * (240 + 60 * skill_lv) / 100; + break; + case CH_TIGERFIST: // 伏虎拳 + damage = damage * (100 + 20 * skill_lv) / 100; + break; + case CH_CHAINCRUSH: // 連柱崩撃 + damage = damage * (100 + 20 * skill_lv) / 100; + div_ = skill_get_num (skill_num, skill_lv); + break; + case CH_PALMSTRIKE: // 猛虎硬派山 + damage = damage * (50 + 100 * skill_lv) / 100; + break; + case LK_SPIRALPIERCE: /* スパイラルピアース */ + damage = damage * (100 + 50 * skill_lv) / 100; //増加量が分からないので適当に + div_ = 5; + if (tsd) + tsd->canmove_tick = gettick () + 1000; + else if (tmd) + tmd->canmove_tick = gettick () + 1000; + break; + case LK_HEADCRUSH: /* ヘッドクラッシュ */ + damage = damage * (100 + 20 * skill_lv) / 100; + break; + case LK_JOINTBEAT: /* ジョイントビート */ + damage = damage * (50 + 10 * skill_lv) / 100; + break; + case ASC_METEORASSAULT: /* メテオアサルト */ + damage = damage * (40 + 40 * skill_lv) / 100; + break; + case SN_SHARPSHOOTING: /* シャープシューティング */ + damage += damage * (30 * skill_lv) / 100; + break; + case CG_ARROWVULCAN: /* アローバルカン */ + damage = damage * (160 + 40 * skill_lv) / 100; + div_ = 9; + break; + case AS_SPLASHER: /* ベナムスプラッシャー */ + damage = damage * (200 + 20 * skill_lv) / 100; + break; + } + } - return (sd->equip_index[EQUIP_SHIELD] == -1 - && sd->equip_index[EQUIP_WEAPON] == -1); - } else - return 0; + if (skill_num != NPC_CRITICALSLASH) + { + // 対 象の防御力によるダメージの減少 + // ディバインプロテクション(ここでいいのかな?) + if (skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST + && skill_num != KN_AUTOCOUNTER && def1 < 1000000) + { //DEF, VIT無視 + int t_def; + target_count = + 1 + battle_counttargeted (target, src, + battle_config.vit_penaly_count_lv); + if (battle_config.vit_penaly_type > 0) + { + if (target_count >= battle_config.vit_penaly_count) + { + if (battle_config.vit_penaly_type == 1) + { + def1 = + (def1 * + (100 - + (target_count - + (battle_config.vit_penaly_count - + 1)) * battle_config.vit_penaly_num)) / + 100; + def2 = + (def2 * + (100 - + (target_count - + (battle_config.vit_penaly_count - + 1)) * battle_config.vit_penaly_num)) / + 100; + t_vit = + (t_vit * + (100 - + (target_count - + (battle_config.vit_penaly_count - + 1)) * battle_config.vit_penaly_num)) / + 100; + } + else if (battle_config.vit_penaly_type == 2) + { + def1 -= + (target_count - + (battle_config.vit_penaly_count - + 1)) * battle_config.vit_penaly_num; + def2 -= + (target_count - + (battle_config.vit_penaly_count - + 1)) * battle_config.vit_penaly_num; + t_vit -= + (target_count - + (battle_config.vit_penaly_count - + 1)) * battle_config.vit_penaly_num; + } + if (def1 < 0) + def1 = 0; + if (def2 < 1) + def2 = 1; + if (t_vit < 1) + t_vit = 1; + } + } + t_def = def2 * 8 / 10; + if (battle_check_undead (s_race, battle_get_elem_type (src)) + || s_race == 6) + if (tsd && (skill = pc_checkskill (tsd, AL_DP)) > 0) + t_def += skill * 3; + + vitbonusmax = (t_vit / 20) * (t_vit / 20) - 1; + if (battle_config.monster_defense_type) + { + damage = + damage - (def1 * battle_config.monster_defense_type) - + t_def - + ((vitbonusmax < 1) ? 0 : MRAND ((vitbonusmax + 1))); + } + else + { + damage = + damage * (100 - def1) / 100 - t_def - + ((vitbonusmax < 1) ? 0 : MRAND ((vitbonusmax + 1))); + } + } + } + } + + // 0未満だった場合1に補正 + if (damage < 1) + damage = 1; + + // 回避修正 + if (hitrate < 1000000) + hitrate = ((hitrate > 95) ? 95 : ((hitrate < 5) ? 5 : hitrate)); + if (hitrate < 1000000 && // 必中攻撃 + (t_sc_data != NULL && (t_sc_data[SC_SLEEP].timer != -1 || // 睡眠は必中 + t_sc_data[SC_STAN].timer != -1 || // スタンは必中 + t_sc_data[SC_FREEZE].timer != -1 || (t_sc_data[SC_STONE].timer != -1 && t_sc_data[SC_STONE].val2 == 0)))) // 凍結は必中 + hitrate = 1000000; + if (type == 0 && MRAND (100) >= hitrate) + { + damage = damage2 = 0; + dmg_lv = ATK_FLEE; + } + else + { + dmg_lv = ATK_DEF; + } + + if (tsd) + { + int cardfix = 100, i; + cardfix = cardfix * (100 - tsd->subele[s_ele]) / 100; // 属 性によるダメージ耐性 + cardfix = cardfix * (100 - tsd->subrace[s_race]) / 100; // 種族によるダメージ耐性 + if (mob_db[md->class].mode & 0x20) + cardfix = cardfix * (100 - tsd->subrace[10]) / 100; + else + cardfix = cardfix * (100 - tsd->subrace[11]) / 100; + for (i = 0; i < tsd->add_def_class_count; i++) + { + if (tsd->add_def_classid[i] == md->class) + { + cardfix = cardfix * (100 - tsd->add_def_classrate[i]) / 100; + break; + } + } + if (flag & BF_LONG) + cardfix = cardfix * (100 - tsd->long_attack_def_rate) / 100; + if (flag & BF_SHORT) + cardfix = cardfix * (100 - tsd->near_attack_def_rate) / 100; + damage = damage * cardfix / 100; + } + if (t_sc_data) + { + int cardfix = 100; + if (t_sc_data[SC_DEFENDER].timer != -1 && flag & BF_LONG) + cardfix = cardfix * (100 - t_sc_data[SC_DEFENDER].val2) / 100; + if (cardfix != 100) + damage = damage * cardfix / 100; + } + if (t_sc_data && t_sc_data[SC_ASSUMPTIO].timer != -1) + { //アシャンプティオ + if (!map[target->m].flag.pvp) + damage = damage / 3; + else + damage = damage / 2; + } + + if (damage < 0) + damage = 0; + + // 属 性の適用 + if (!((battle_config.mob_ghostring_fix == 1) && (battle_get_element (target) == 8) && (target->type == BL_PC))) // [MouseJstr] + if (skill_num != 0 || s_ele != 0 + || !battle_config.mob_attack_attr_none) + damage = + battle_attr_fix (damage, s_ele, battle_get_element (target)); + + if (sc_data && sc_data[SC_AURABLADE].timer != -1) /* オーラブレード 必中 */ + damage += sc_data[SC_AURABLADE].val1 * 10; + if (skill_num == PA_PRESSURE) /* プレッシャー 必中? */ + damage = 700 + 100 * skill_lv; + + // インベナム修正 + if (skill_num == TF_POISON) + { + damage = + battle_attr_fix (damage + 15 * skill_lv, s_ele, + battle_get_element (target)); + } + if (skill_num == MC_CARTREVOLUTION) + { + damage = battle_attr_fix (damage, 0, battle_get_element (target)); + } + + // 完全回避の判定 + if (skill_num == 0 && skill_lv >= 0 && tsd != NULL + && MRAND (1000) < battle_get_flee2 (target)) + { + damage = 0; + type = 0x0b; + dmg_lv = ATK_LUCKY; + } + + if (battle_config.enemy_perfect_flee) + { + if (skill_num == 0 && skill_lv >= 0 && tmd != NULL + && MRAND (1000) < battle_get_flee2 (target)) + { + damage = 0; + type = 0x0b; + dmg_lv = ATK_LUCKY; + } + } + +// if(def1 >= 1000000 && damage > 0) + if (t_mode & 0x40 && damage > 0) + damage = 1; + + if (tsd && tsd->special_state.no_weapon_damage) + damage = 0; + + if (skill_num != CR_GRANDCROSS) + damage = + battle_calc_damage (src, target, damage, div_, skill_num, + skill_lv, flag); + + wd.damage = damage; + wd.damage2 = 0; + wd.type = type; + wd.div_ = div_; + wd.amotion = battle_get_amotion (src); + if (skill_num == KN_AUTOCOUNTER) + wd.amotion >>= 1; + wd.dmotion = battle_get_dmotion (target); + wd.blewcount = blewcount; + wd.flag = flag; + wd.dmg_lv = dmg_lv; + return wd; } +int battle_is_unarmed (struct block_list *bl) +{ + if (!bl) + return 0; + if (bl->type == BL_PC) + { + struct map_session_data *sd = (struct map_session_data *) bl; + + return (sd->equip_index[EQUIP_SHIELD] == -1 + && sd->equip_index[EQUIP_WEAPON] == -1); + } + else + return 0; +} /* * ========================================================================= * PCの武器による攻撃 *------------------------------------------------------------------------- */ -static struct Damage battle_calc_pc_weapon_attack( - struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag) +static struct Damage battle_calc_pc_weapon_attack (struct block_list *src, + struct block_list *target, + int skill_num, + int skill_lv, int wflag) { - struct map_session_data *sd=(struct map_session_data *)src,*tsd=NULL; - struct mob_data *tmd=NULL; - int hitrate,flee,cri = 0,atkmin,atkmax; - int dex,luk,target_count = 1; - int def1 = battle_get_def(target); - int def2 = battle_get_def2(target); - int t_vit = battle_get_vit(target); - struct Damage wd; - int damage,damage2,damage3=0,damage4=0,type,div_,blewcount=skill_get_blewcount(skill_num,skill_lv); - int flag,skill,dmg_lv = 0; - int t_mode=0,t_race=0,t_size=1,s_race=7,s_ele=0; - struct status_change *sc_data,*t_sc_data; - short *sc_count; - short *option, *opt1, *opt2; - int atkmax_=0, atkmin_=0, s_ele_; //二刀流用 - int watk,watk_,cardfix,t_ele; - int da=0,i,t_class,ac_flag = 0; - int idef_flag=0,idef_flag_=0; - int target_distance; - - //return前の処理があるので情報出力部のみ変更 - if( src == NULL || target == NULL || sd == NULL ){ - nullpo_info(NLP_MARK); - memset(&wd,0,sizeof(wd)); - return wd; - } - - // アタッカー - s_race=battle_get_race(src); //種族 - s_ele=battle_get_attack_element(src); //属性 - s_ele_=battle_get_attack_element2(src); //左手属性 - sc_data=battle_get_sc_data(src); //ステータス異常 - sc_count=battle_get_sc_count(src); //ステータス異常の数 - option=battle_get_option(src); //鷹とかペコとかカートとか - opt1=battle_get_opt1(src); //石化、凍結、スタン、睡眠、暗闇 - opt2=battle_get_opt2(src); //毒、呪い、沈黙、暗闇? - - if(skill_num != CR_GRANDCROSS) //グランドクロスでないなら - sd->state.attack_type = BF_WEAPON; //攻撃タイプは武器攻撃 - - // ターゲット - if(target->type==BL_PC) //対象がPCなら - tsd=(struct map_session_data *)target; //tsdに代入(tmdはNULL) - else if(target->type==BL_MOB) //対象がMobなら - tmd=(struct mob_data *)target; //tmdに代入(tsdはNULL) - t_race=battle_get_race( target ); //対象の種族 - t_ele=battle_get_elem_type(target); //対象の属性 - t_size=battle_get_size( target ); //対象のサイズ - t_mode=battle_get_mode( target ); //対象のMode - t_sc_data=battle_get_sc_data( target ); //対象のステータス異常 + struct map_session_data *sd = (struct map_session_data *) src, *tsd = + NULL; + struct mob_data *tmd = NULL; + int hitrate, flee, cri = 0, atkmin, atkmax; + int dex, luk, target_count = 1; + int def1 = battle_get_def (target); + int def2 = battle_get_def2 (target); + int t_vit = battle_get_vit (target); + struct Damage wd; + int damage, damage2, damage3 = 0, damage4 = 0, type, div_, blewcount = + skill_get_blewcount (skill_num, skill_lv); + int flag, skill, dmg_lv = 0; + int t_mode = 0, t_race = 0, t_size = 1, s_race = 7, s_ele = 0; + struct status_change *sc_data, *t_sc_data; + short *sc_count; + short *option, *opt1, *opt2; + int atkmax_ = 0, atkmin_ = 0, s_ele_; //二刀流用 + int watk, watk_, cardfix, t_ele; + int da = 0, i, t_class, ac_flag = 0; + int idef_flag = 0, idef_flag_ = 0; + int target_distance; + + //return前の処理があるので情報出力部のみ変更 + if (src == NULL || target == NULL || sd == NULL) + { + nullpo_info (NLP_MARK); + memset (&wd, 0, sizeof (wd)); + return wd; + } + + // アタッカー + s_race = battle_get_race (src); //種族 + s_ele = battle_get_attack_element (src); //属性 + s_ele_ = battle_get_attack_element2 (src); //左手属性 + sc_data = battle_get_sc_data (src); //ステータス異常 + sc_count = battle_get_sc_count (src); //ステータス異常の数 + option = battle_get_option (src); //鷹とかペコとかカートとか + opt1 = battle_get_opt1 (src); //石化、凍結、スタン、睡眠、暗闇 + opt2 = battle_get_opt2 (src); //毒、呪い、沈黙、暗闇? + + if (skill_num != CR_GRANDCROSS) //グランドクロスでないなら + sd->state.attack_type = BF_WEAPON; //攻撃タイプは武器攻撃 + + // ターゲット + if (target->type == BL_PC) //対象がPCなら + tsd = (struct map_session_data *) target; //tsdに代入(tmdはNULL) + else if (target->type == BL_MOB) //対象がMobなら + tmd = (struct mob_data *) target; //tmdに代入(tsdはNULL) + t_race = battle_get_race (target); //対象の種族 + t_ele = battle_get_elem_type (target); //対象の属性 + t_size = battle_get_size (target); //対象のサイズ + t_mode = battle_get_mode (target); //対象のMode + t_sc_data = battle_get_sc_data (target); //対象のステータス異常 //オートカウンター処理ここから - if((skill_num == 0 || (target->type == BL_PC && battle_config.pc_auto_counter_type&2) || - (target->type == BL_MOB && battle_config.monster_auto_counter_type&2)) && skill_lv >= 0) { - if(skill_num != CR_GRANDCROSS && t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1) { //グランドクロスでなく、対象がオートカウンター状態の場合 - int dir = map_calc_dir(src,target->x,target->y),t_dir = battle_get_dir(target); - int dist = distance(src->x,src->y,target->x,target->y); - if(dist <= 0 || map_check_dir(dir,t_dir) ) { //対象との距離が0以下、または対象の正面? - memset(&wd,0,sizeof(wd)); - t_sc_data[SC_AUTOCOUNTER].val3 = 0; - t_sc_data[SC_AUTOCOUNTER].val4 = 1; - if(sc_data && sc_data[SC_AUTOCOUNTER].timer == -1) { //自分がオートカウンター状態 - int range = battle_get_range(target); - if((target->type == BL_PC && ((struct map_session_data *)target)->status.weapon != 11 && dist <= range+1) || //対象がPCで武器が弓矢でなく射程内 - (target->type == BL_MOB && range <= 3 && dist <= range+1) ) //または対象がMobで射程が3以下で射程内 - t_sc_data[SC_AUTOCOUNTER].val3 = src->id; - } - return wd; //ダメージ構造体を返して終了 - } - else ac_flag = 1; - } - } + if ((skill_num == 0 + || (target->type == BL_PC && battle_config.pc_auto_counter_type & 2) + || (target->type == BL_MOB + && battle_config.monster_auto_counter_type & 2)) + && skill_lv >= 0) + { + if (skill_num != CR_GRANDCROSS && t_sc_data + && t_sc_data[SC_AUTOCOUNTER].timer != -1) + { //グランドクロスでなく、対象がオートカウンター状態の場合 + int dir = map_calc_dir (src, target->x, target->y), t_dir = + battle_get_dir (target); + int dist = distance (src->x, src->y, target->x, target->y); + if (dist <= 0 || map_check_dir (dir, t_dir)) + { //対象との距離が0以下、または対象の正面? + memset (&wd, 0, sizeof (wd)); + t_sc_data[SC_AUTOCOUNTER].val3 = 0; + t_sc_data[SC_AUTOCOUNTER].val4 = 1; + if (sc_data && sc_data[SC_AUTOCOUNTER].timer == -1) + { //自分がオートカウンター状態 + int range = battle_get_range (target); + if ((target->type == BL_PC && ((struct map_session_data *) target)->status.weapon != 11 && dist <= range + 1) || //対象がPCで武器が弓矢でなく射程内 + (target->type == BL_MOB && range <= 3 && dist <= range + 1)) //または対象がMobで射程が3以下で射程内 + t_sc_data[SC_AUTOCOUNTER].val3 = src->id; + } + return wd; //ダメージ構造体を返して終了 + } + else + ac_flag = 1; + } + } //オートカウンター処理ここまで - flag=BF_SHORT|BF_WEAPON|BF_NORMAL; // 攻撃の種類の設定 - - // 回避率計算、回避判定は後で - flee = battle_get_flee(target); - if(battle_config.agi_penaly_type > 0 || battle_config.vit_penaly_type > 0) //AGI、VITペナルティ設定が有効 - target_count += battle_counttargeted(target,src,battle_config.agi_penaly_count_lv); //対象の数を算出 - if(battle_config.agi_penaly_type > 0) { - if(target_count >= battle_config.agi_penaly_count) { //ペナルティ設定より対象が多い - if(battle_config.agi_penaly_type == 1) //回避率がagi_penaly_num%ずつ減少 - flee = (flee * (100 - (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num))/100; - else if(battle_config.agi_penaly_type == 2) //回避率がagi_penaly_num分減少 - flee -= (target_count - (battle_config.agi_penaly_count - 1))*battle_config.agi_penaly_num; - if(flee < 1) flee = 1; //回避率は最低でも1 - } - } - hitrate=battle_get_hit(src) - flee + 80; //命中率計算 - - { // [fate] Reduce hit chance by distance - int dx = abs(src->x - target->x); - int dy = abs(src->y - target->y); - int malus_dist; - - target_distance = MAX(dx, dy); - malus_dist = MAX(0, target_distance - (skill_power(sd, AC_OWL) / 75)); - hitrate -= (malus_dist * (malus_dist + 1)); + flag = BF_SHORT | BF_WEAPON | BF_NORMAL; // 攻撃の種類の設定 + + // 回避率計算、回避判定は後で + flee = battle_get_flee (target); + if (battle_config.agi_penaly_type > 0 || battle_config.vit_penaly_type > 0) //AGI、VITペナルティ設定が有効 + target_count += battle_counttargeted (target, src, battle_config.agi_penaly_count_lv); //対象の数を算出 + if (battle_config.agi_penaly_type > 0) + { + if (target_count >= battle_config.agi_penaly_count) + { //ペナルティ設定より対象が多い + if (battle_config.agi_penaly_type == 1) //回避率がagi_penaly_num%ずつ減少 + flee = + (flee * + (100 - + (target_count - + (battle_config.agi_penaly_count - + 1)) * battle_config.agi_penaly_num)) / 100; + else if (battle_config.agi_penaly_type == 2) //回避率がagi_penaly_num分減少 + flee -= + (target_count - + (battle_config.agi_penaly_count - + 1)) * battle_config.agi_penaly_num; + if (flee < 1) + flee = 1; //回避率は最低でも1 } - - dex=battle_get_dex(src); //DEX - luk=battle_get_luk(src); //LUK - watk = battle_get_atk(src); //ATK - watk_ = battle_get_atk_(src); //ATK左手 - - type=0; // normal - div_ = 1; // single attack - - if(skill_num==HW_MAGICCRASHER){ /* マジッククラッシャーはMATKで殴る */ - damage = damage2 = battle_get_matk1(src); //damega,damega2初登場、base_atkの取得 - }else{ - damage = damage2 = battle_get_baseatk(&sd->bl); //damega,damega2初登場、base_atkの取得 - } - if (sd->attackrange > 2) { // [fate] ranged weapon? - const int range_damage_bonus = 80; // up to 31.25% bonus for long-range hit - damage = damage * (256 + ((range_damage_bonus * target_distance) / sd->attackrange)) >> 8; - damage2 = damage2 * (256 + ((range_damage_bonus * target_distance) / sd->attackrange)) >> 8; + } + hitrate = battle_get_hit (src) - flee + 80; //命中率計算 + + { // [fate] Reduce hit chance by distance + int dx = abs (src->x - target->x); + int dy = abs (src->y - target->y); + int malus_dist; + + target_distance = MAX (dx, dy); + malus_dist = + MAX (0, target_distance - (skill_power (sd, AC_OWL) / 75)); + hitrate -= (malus_dist * (malus_dist + 1)); + } + + dex = battle_get_dex (src); //DEX + luk = battle_get_luk (src); //LUK + watk = battle_get_atk (src); //ATK + watk_ = battle_get_atk_ (src); //ATK左手 + + type = 0; // normal + div_ = 1; // single attack + + if (skill_num == HW_MAGICCRASHER) + { /* マジッククラッシャーはMATKで殴る */ + damage = damage2 = battle_get_matk1 (src); //damega,damega2初登場、base_atkの取得 + } + else + { + damage = damage2 = battle_get_baseatk (&sd->bl); //damega,damega2初登場、base_atkの取得 + } + if (sd->attackrange > 2) + { // [fate] ranged weapon? + const int range_damage_bonus = 80; // up to 31.25% bonus for long-range hit + damage = + damage * (256 + + ((range_damage_bonus * target_distance) / + sd->attackrange)) >> 8; + damage2 = + damage2 * (256 + + ((range_damage_bonus * target_distance) / + sd->attackrange)) >> 8; + } + + atkmin = atkmin_ = dex; //最低ATKはDEXで初期化? + sd->state.arrow_atk = 0; //arrow_atk初期化 + if (sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]]) + atkmin = + atkmin * (80 + + sd->inventory_data[sd->equip_index[9]]->wlv * 20) / 100; + if (sd->equip_index[8] >= 0 && sd->inventory_data[sd->equip_index[8]]) + atkmin_ = + atkmin_ * (80 + + sd->inventory_data[sd->equip_index[8]]->wlv * 20) / + 100; + if (sd->status.weapon == 11) + { //武器が弓矢の場合 + atkmin = watk * ((atkmin < watk) ? atkmin : watk) / 100; //弓用最低ATK計算 + flag = (flag & ~BF_RANGEMASK) | BF_LONG; //遠距離攻撃フラグを有効 + if (sd->arrow_ele > 0) //属性矢なら属性を矢の属性に変更 + s_ele = sd->arrow_ele; + sd->state.arrow_atk = 1; //arrow_atk有効化 + } + + // サイズ修正 + // ペコ騎乗していて、槍で攻撃した場合は中型のサイズ修正を100にする + // ウェポンパーフェクション,ドレイクC + if (((sd->special_state.no_sizefix) + || (pc_isriding (sd) + && (sd->status.weapon == 4 || sd->status.weapon == 5) + && t_size == 1) || skill_num == MO_EXTREMITYFIST)) + { //ペコ騎乗していて、槍で中型を攻撃 + atkmax = watk; + atkmax_ = watk_; + } + else + { + atkmax = (watk * sd->atkmods[t_size]) / 100; + atkmin = (atkmin * sd->atkmods[t_size]) / 100; + atkmax_ = (watk_ * sd->atkmods_[t_size]) / 100; + atkmin_ = (atkmin_ * sd->atkmods[t_size]) / 100; + } + if ((sc_data != NULL && sc_data[SC_WEAPONPERFECTION].timer != -1) + || (sd->special_state.no_sizefix)) + { // ウェポンパーフェクション || ドレイクカード + atkmax = watk; + atkmax_ = watk_; + } + + if (atkmin > atkmax && !(sd->state.arrow_atk)) + atkmin = atkmax; //弓は最低が上回る場合あり + if (atkmin_ > atkmax_) + atkmin_ = atkmax_; + + if (sc_data != NULL && sc_data[SC_MAXIMIZEPOWER].timer != -1) + { // マキシマイズパワー + atkmin = atkmax; + atkmin_ = atkmax_; + } + + //ダブルアタック判定 + if (sd->weapontype1 == 0x01) + { + if (skill_num == 0 && skill_lv >= 0 + && (skill = pc_checkskill (sd, TF_DOUBLE)) > 0) + da = (MRAND (100) < (skill * 5)) ? 1 : 0; + } + + //三段掌 + if (skill_num == 0 && skill_lv >= 0 + && (skill = pc_checkskill (sd, MO_TRIPLEATTACK)) > 0 + && sd->status.weapon <= 16 && !sd->state.arrow_atk) + { + da = (MRAND (100) < (30 - skill)) ? 2 : 0; + } + + if (sd->double_rate > 0 && da == 0 && skill_num == 0 && skill_lv >= 0) + da = (MRAND (100) < sd->double_rate) ? 1 : 0; + + // 過剰精錬ボーナス + if (sd->overrefine > 0) + damage += MPRAND (1, sd->overrefine); + if (sd->overrefine_ > 0) + damage2 += MPRAND (1, sd->overrefine_); + + if (da == 0) + { //ダブルアタックが発動していない + // クリティカル計算 + cri = battle_get_critical (src); + + if (sd->state.arrow_atk) + cri += sd->arrow_cri; + if (sd->status.weapon == 16) + // カタールの場合、クリティカルを倍に + cri <<= 1; + cri -= battle_get_luk (target) * 3; + if (t_sc_data != NULL && t_sc_data[SC_SLEEP].timer != -1) // 睡眠中はクリティカルが倍に + cri <<= 1; + if (ac_flag) + cri = 1000; + + if (skill_num == KN_AUTOCOUNTER) + { + if (!(battle_config.pc_auto_counter_type & 1)) + cri = 1000; + else + cri <<= 1; } - atkmin = atkmin_ = dex; //最低ATKはDEXで初期化? - sd->state.arrow_atk = 0; //arrow_atk初期化 - if(sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]]) - atkmin = atkmin*(80 + sd->inventory_data[sd->equip_index[9]]->wlv*20)/100; - if(sd->equip_index[8] >= 0 && sd->inventory_data[sd->equip_index[8]]) - atkmin_ = atkmin_*(80 + sd->inventory_data[sd->equip_index[8]]->wlv*20)/100; - if(sd->status.weapon == 11) { //武器が弓矢の場合 - atkmin = watk * ((atkmin<watk)? atkmin:watk)/100; //弓用最低ATK計算 - flag=(flag&~BF_RANGEMASK)|BF_LONG; //遠距離攻撃フラグを有効 - if(sd->arrow_ele > 0) //属性矢なら属性を矢の属性に変更 - s_ele = sd->arrow_ele; - sd->state.arrow_atk = 1; //arrow_atk有効化 - } - - // サイズ修正 - // ペコ騎乗していて、槍で攻撃した場合は中型のサイズ修正を100にする - // ウェポンパーフェクション,ドレイクC - if(((sd->special_state.no_sizefix) || (pc_isriding(sd) && (sd->status.weapon==4 || sd->status.weapon==5) && t_size==1) || skill_num == MO_EXTREMITYFIST)){ //ペコ騎乗していて、槍で中型を攻撃 - atkmax = watk; - atkmax_ = watk_; - } else { - atkmax = (watk * sd->atkmods[ t_size ]) / 100; - atkmin = (atkmin * sd->atkmods[ t_size ]) / 100; - atkmax_ = (watk_ * sd->atkmods_[ t_size ]) / 100; - atkmin_ = (atkmin_ * sd->atkmods[ t_size ]) / 100; - } - if( (sc_data != NULL && sc_data[SC_WEAPONPERFECTION].timer!=-1) || (sd->special_state.no_sizefix)) { // ウェポンパーフェクション || ドレイクカード - atkmax = watk; - atkmax_ = watk_; - } - - if(atkmin > atkmax && !(sd->state.arrow_atk)) atkmin = atkmax; //弓は最低が上回る場合あり - if(atkmin_ > atkmax_) atkmin_ = atkmax_; - - if(sc_data != NULL && sc_data[SC_MAXIMIZEPOWER].timer!=-1 ){ // マキシマイズパワー - atkmin=atkmax; - atkmin_=atkmax_; - } - - //ダブルアタック判定 - if(sd->weapontype1 == 0x01) { - if(skill_num == 0 && skill_lv >= 0 && (skill = pc_checkskill(sd,TF_DOUBLE)) > 0) - da = (MRAND(100) < (skill*5)) ? 1:0; - } - - //三段掌 - if(skill_num == 0 && skill_lv >= 0 && (skill = pc_checkskill(sd,MO_TRIPLEATTACK)) > 0 && sd->status.weapon <= 16 && !sd->state.arrow_atk) { - da = (MRAND(100) < (30 - skill)) ? 2:0; - } - - if(sd->double_rate > 0 && da == 0 && skill_num == 0 && skill_lv >= 0) - da = (MRAND(100) < sd->double_rate) ? 1:0; - - // 過剰精錬ボーナス - if(sd->overrefine>0 ) - damage+=MPRAND(1, sd->overrefine); - if(sd->overrefine_>0 ) - damage2+=MPRAND(1, sd->overrefine_); - - if(da == 0){ //ダブルアタックが発動していない - // クリティカル計算 - cri = battle_get_critical(src); - - if(sd->state.arrow_atk) - cri += sd->arrow_cri; - if(sd->status.weapon == 16) - // カタールの場合、クリティカルを倍に - cri <<=1; - cri -= battle_get_luk(target) * 3; - if(t_sc_data != NULL && t_sc_data[SC_SLEEP].timer!=-1 ) // 睡眠中はクリティカルが倍に - cri <<=1; - if(ac_flag) cri = 1000; - - if(skill_num == KN_AUTOCOUNTER) { - if(!(battle_config.pc_auto_counter_type&1)) - cri = 1000; - else - cri <<= 1; - } - - if(skill_num == SN_SHARPSHOOTING && MRAND(100) < 50) - cri = 1000; - } - - if(tsd && tsd->critical_def) - cri = cri * (100-tsd->critical_def) / 100; - - if(da == 0 && (skill_num==0 || skill_num == KN_AUTOCOUNTER || skill_num == SN_SHARPSHOOTING) && skill_lv >= 0 && //ダブルアタックが発動していない - (MRAND(1000)) < cri) // 判定(スキルの場合は無視) - { - damage += atkmax; - damage2 += atkmax_; - if(sd->atk_rate != 100) { - damage = (damage * sd->atk_rate)/100; - damage2 = (damage2 * sd->atk_rate)/100; - } - if(sd->state.arrow_atk) - damage += sd->arrow_atk; - type = 0x0a; + if (skill_num == SN_SHARPSHOOTING && MRAND (100) < 50) + cri = 1000; + } + + if (tsd && tsd->critical_def) + cri = cri * (100 - tsd->critical_def) / 100; + + if (da == 0 && (skill_num == 0 || skill_num == KN_AUTOCOUNTER || skill_num == SN_SHARPSHOOTING) && skill_lv >= 0 && //ダブルアタックが発動していない + (MRAND (1000)) < cri) // 判定(スキルの場合は無視) + { + damage += atkmax; + damage2 += atkmax_; + if (sd->atk_rate != 100) + { + damage = (damage * sd->atk_rate) / 100; + damage2 = (damage2 * sd->atk_rate) / 100; + } + if (sd->state.arrow_atk) + damage += sd->arrow_atk; + type = 0x0a; /* if(def1 < 1000000) { if(sd->def_ratio_atk_ele & (1<<t_ele) || sd->def_ratio_atk_race & (1<<t_race)) { @@ -2515,1668 +2983,2203 @@ static struct Damage battle_calc_pc_weapon_attack( } } }*/ - } - else { - int vitbonusmax; - - if(atkmax > atkmin) - damage += atkmin + MRAND((atkmax-atkmin + 1)); - else - damage += atkmin ; - if(atkmax_ > atkmin_) - damage2 += atkmin_ + MRAND((atkmax_-atkmin_ + 1)); - else - damage2 += atkmin_ ; - if(sd->atk_rate != 100) { - damage = (damage * sd->atk_rate)/100; - damage2 = (damage2 * sd->atk_rate)/100; - } - - if(sd->state.arrow_atk) { - if(sd->arrow_atk > 0) - damage += MRAND((sd->arrow_atk+1)); - hitrate += sd->arrow_hit; - } - - if(skill_num != MO_INVESTIGATE && def1 < 1000000) { - if(sd->def_ratio_atk_ele & (1<<t_ele) || sd->def_ratio_atk_race & (1<<t_race)) { - damage = (damage * (def1 + def2))/100; - idef_flag = 1; - } - if(sd->def_ratio_atk_ele_ & (1<<t_ele) || sd->def_ratio_atk_race_ & (1<<t_race)) { - damage2 = (damage2 * (def1 + def2))/100; - idef_flag_ = 1; - } - if(t_mode & 0x20) { - if(!idef_flag && sd->def_ratio_atk_race & (1<<10)) { - damage = (damage * (def1 + def2))/100; - idef_flag = 1; - } - if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<10)) { - damage2 = (damage2 * (def1 + def2))/100; - idef_flag_ = 1; - } - } - else { - if(!idef_flag && sd->def_ratio_atk_race & (1<<11)) { - damage = (damage * (def1 + def2))/100; - idef_flag = 1; - } - if(!idef_flag_ && sd->def_ratio_atk_race_ & (1<<11)) { - damage2 = (damage2 * (def1 + def2))/100; - idef_flag_ = 1; - } - } - } - - // スキル修正1(攻撃力倍化系) - // オーバートラスト(+5% 〜 +25%),他攻撃系スキルの場合ここで補正 - // バッシュ,マグナムブレイク, - // ボーリングバッシュ,スピアブーメラン,ブランディッシュスピア,スピアスタッブ, - // メマーナイト,カートレボリューション - // ダブルストレイフィング,アローシャワー,チャージアロー, - // ソニックブロー - if(sc_data){ //状態異常中のダメージ追加 - if(sc_data[SC_OVERTHRUST].timer!=-1){ // オーバートラスト - damage += damage*(5*sc_data[SC_OVERTHRUST].val1)/100; - damage2 += damage2*(5*sc_data[SC_OVERTHRUST].val1)/100; - } - if(sc_data[SC_TRUESIGHT].timer!=-1){ // トゥルーサイト - damage += damage*(2*sc_data[SC_TRUESIGHT].val1)/100; - damage2 += damage2*(2*sc_data[SC_TRUESIGHT].val1)/100; - } - if(sc_data[SC_BERSERK].timer!=-1){ // バーサーク - damage += damage*50/100; - damage2 += damage2*50/100; - } - } - - if(skill_num>0){ - int i; - if( (i=skill_get_pl(skill_num))>0 ) - s_ele=s_ele_=i; - - flag=(flag&~BF_SKILLMASK)|BF_SKILL; - switch( skill_num ){ - case SM_BASH: // バッシュ - damage = damage*(100+ 30*skill_lv)/100; - damage2 = damage2*(100+ 30*skill_lv)/100; - hitrate = (hitrate*(100+5*skill_lv))/100; - break; - case SM_MAGNUM: // マグナムブレイク - damage = damage*(5*skill_lv +(wflag)?65:115 )/100; - damage2 = damage2*(5*skill_lv +(wflag)?65:115 )/100; - break; - case MC_MAMMONITE: // メマーナイト - damage = damage*(100+ 50*skill_lv)/100; - damage2 = damage2*(100+ 50*skill_lv)/100; - break; - case AC_DOUBLE: // ダブルストレイフィング - if(!sd->state.arrow_atk && sd->arrow_atk > 0) { - int arr = MRAND((sd->arrow_atk+1)); - damage += arr; - damage2 += arr; - } - damage = damage*(180+ 20*skill_lv)/100; - damage2 = damage2*(180+ 20*skill_lv)/100; - div_=2; - if(sd->arrow_ele > 0) { - s_ele = sd->arrow_ele; - s_ele_ = sd->arrow_ele; - } - flag=(flag&~BF_RANGEMASK)|BF_LONG; - sd->state.arrow_atk = 1; - break; - case AC_SHOWER: // アローシャワー - if(!sd->state.arrow_atk && sd->arrow_atk > 0) { - int arr = MRAND((sd->arrow_atk+1)); - damage += arr; - damage2 += arr; - } - damage = damage*(75 + 5*skill_lv)/100; - damage2 = damage2*(75 + 5*skill_lv)/100; - if(sd->arrow_ele > 0) { - s_ele = sd->arrow_ele; - s_ele_ = sd->arrow_ele; - } - flag=(flag&~BF_RANGEMASK)|BF_LONG; - sd->state.arrow_atk = 1; - break; - case AC_CHARGEARROW: // チャージアロー - if(!sd->state.arrow_atk && sd->arrow_atk > 0) { - int arr = MRAND((sd->arrow_atk+1)); - damage += arr; - damage2 += arr; - } - damage = damage*150/100; - damage2 = damage2*150/100; - if(sd->arrow_ele > 0) { - s_ele = sd->arrow_ele; - s_ele_ = sd->arrow_ele; - } - flag=(flag&~BF_RANGEMASK)|BF_LONG; - sd->state.arrow_atk = 1; - break; - case KN_PIERCE: // ピアース - damage = damage*(100+ 10*skill_lv)/100; - damage2 = damage2*(100+ 10*skill_lv)/100; - hitrate=hitrate*(100+5*skill_lv)/100; - div_=t_size+1; - damage*=div_; - damage2*=div_; - break; - case KN_SPEARSTAB: // スピアスタブ - damage = damage*(100+ 15*skill_lv)/100; - damage2 = damage2*(100+ 15*skill_lv)/100; - break; - case KN_SPEARBOOMERANG: // スピアブーメラン - damage = damage*(100+ 50*skill_lv)/100; - damage2 = damage2*(100+ 50*skill_lv)/100; - flag=(flag&~BF_RANGEMASK)|BF_LONG; - break; - case KN_BRANDISHSPEAR: // ブランディッシュスピア - damage = damage*(100+ 20*skill_lv)/100; - damage2 = damage2*(100+ 20*skill_lv)/100; - if(skill_lv>3 && wflag==1) damage3+=damage/2; - if(skill_lv>6 && wflag==1) damage3+=damage/4; - if(skill_lv>9 && wflag==1) damage3+=damage/8; - if(skill_lv>6 && wflag==2) damage3+=damage/2; - if(skill_lv>9 && wflag==2) damage3+=damage/4; - if(skill_lv>9 && wflag==3) damage3+=damage/2; - damage +=damage3; - if(skill_lv>3 && wflag==1) damage4+=damage2/2; - if(skill_lv>6 && wflag==1) damage4+=damage2/4; - if(skill_lv>9 && wflag==1) damage4+=damage2/8; - if(skill_lv>6 && wflag==2) damage4+=damage2/2; - if(skill_lv>9 && wflag==2) damage4+=damage2/4; - if(skill_lv>9 && wflag==3) damage4+=damage2/2; - damage2 +=damage4; - blewcount=0; - break; - case KN_BOWLINGBASH: // ボウリングバッシュ - damage = damage*(100+ 50*skill_lv)/100; - damage2 = damage2*(100+ 50*skill_lv)/100; - blewcount=0; - break; - case KN_AUTOCOUNTER: - if(battle_config.pc_auto_counter_type&1) - hitrate += 20; - else - hitrate = 1000000; - flag=(flag&~BF_SKILLMASK)|BF_NORMAL; - break; - case AS_SONICBLOW: // ソニックブロウ - hitrate+=30; // hitrate +30, thanks to midas - damage = damage*(300+ 50*skill_lv)/100; - damage2 = damage2*(300+ 50*skill_lv)/100; - div_=8; - break; - case TF_SPRINKLESAND: // 砂まき - damage = damage*125/100; - damage2 = damage2*125/100; - break; - case MC_CARTREVOLUTION: // カートレボリューション - if(sd->cart_max_weight > 0 && sd->cart_weight > 0) { - damage = (damage*(150 + pc_checkskill(sd,BS_WEAPONRESEARCH) + (sd->cart_weight*100/sd->cart_max_weight) ) )/100; - damage2 = (damage2*(150 + pc_checkskill(sd,BS_WEAPONRESEARCH) + (sd->cart_weight*100/sd->cart_max_weight) ) )/100; - } - else { - damage = (damage*150)/100; - damage2 = (damage2*150)/100; - } - break; - // 以下MOB - case NPC_COMBOATTACK: // 多段攻撃 - div_=skill_get_num(skill_num,skill_lv); - damage *= div_; - damage2 *= div_; - break; - case NPC_RANDOMATTACK: // ランダムATK攻撃 - damage = damage*(MPRAND(50, 150))/100; - damage2 = damage2*(MPRAND(50, 150))/100; - break; - // 属性攻撃(適当) - case NPC_WATERATTACK: - case NPC_GROUNDATTACK: - case NPC_FIREATTACK: - case NPC_WINDATTACK: - case NPC_POISONATTACK: - case NPC_HOLYATTACK: - case NPC_DARKNESSATTACK: - case NPC_TELEKINESISATTACK: - damage = damage*(100+25*skill_lv)/100; - damage2 = damage2*(100+25*skill_lv)/100; - break; - case NPC_GUIDEDATTACK: - hitrate = 1000000; - break; - case NPC_RANGEATTACK: - flag=(flag&~BF_RANGEMASK)|BF_LONG; - break; - case NPC_PIERCINGATT: - flag=(flag&~BF_RANGEMASK)|BF_SHORT; - break; - case RG_BACKSTAP: // バックスタブ - if(battle_config.backstab_bow_penalty == 1 && sd->status.weapon == 11){ - damage = (damage*(300+ 40*skill_lv)/100)/2; - damage2 = (damage2*(300+ 40*skill_lv)/100)/2; - }else{ - damage = damage*(300+ 40*skill_lv)/100; - damage2 = damage2*(300+ 40*skill_lv)/100; - } - hitrate = 1000000; - break; - case RG_RAID: // サプライズアタック - damage = damage*(100+ 40*skill_lv)/100; - damage2 = damage2*(100+ 40*skill_lv)/100; - break; - case RG_INTIMIDATE: // インティミデイト - damage = damage*(100+ 30*skill_lv)/100; - damage2 = damage2*(100+ 30*skill_lv)/100; - break; - case CR_SHIELDCHARGE: // シールドチャージ - damage = damage*(100+ 20*skill_lv)/100; - damage2 = damage2*(100+ 20*skill_lv)/100; - flag=(flag&~BF_RANGEMASK)|BF_SHORT; - s_ele = 0; - break; - case CR_SHIELDBOOMERANG: // シールドブーメラン - damage = damage*(100+ 30*skill_lv)/100; - damage2 = damage2*(100+ 30*skill_lv)/100; - flag=(flag&~BF_RANGEMASK)|BF_LONG; - s_ele = 0; - break; - case CR_HOLYCROSS: // ホーリークロス - damage = damage*(100+ 35*skill_lv)/100; - damage2 = damage2*(100+ 35*skill_lv)/100; - div_=2; - break; - case CR_GRANDCROSS: - hitrate= 1000000; - break; - case AM_DEMONSTRATION: // デモンストレーション - damage = damage*(100+ 20*skill_lv)/100; - damage2 = damage2*(100+ 20*skill_lv)/100; - break; - case AM_ACIDTERROR: // アシッドテラー - damage = damage*(100+ 40*skill_lv)/100; - damage2 = damage2*(100+ 40*skill_lv)/100; - break; - case MO_FINGEROFFENSIVE: //指弾 - if(battle_config.finger_offensive_type == 0) { - damage = damage * (100 + 50 * skill_lv) / 100 * sd->spiritball_old; - damage2 = damage2 * (100 + 50 * skill_lv) / 100 * sd->spiritball_old; - div_ = sd->spiritball_old; - } - else { - damage = damage * (100 + 50 * skill_lv) / 100; - damage2 = damage2 * (100 + 50 * skill_lv) / 100; - div_ = 1; - } - break; - case MO_INVESTIGATE: // 発 勁 - if(def1 < 1000000) { - damage = damage*(100+ 75*skill_lv)/100 * (def1 + def2)/100; - damage2 = damage2*(100+ 75*skill_lv)/100 * (def1 + def2)/100; - } - hitrate = 1000000; - s_ele = 0; - s_ele_ = 0; - break; - case MO_EXTREMITYFIST: // 阿修羅覇鳳拳 - damage = damage * (8 + ((sd->status.sp)/10)) + 250 + (skill_lv * 150); - damage2 = damage2 * (8 + ((sd->status.sp)/10)) + 250 + (skill_lv * 150); - sd->status.sp = 0; - clif_updatestatus(sd,SP_SP); - hitrate = 1000000; - s_ele = 0; - s_ele_ = 0; - break; - case MO_CHAINCOMBO: // 連打掌 - damage = damage*(150+ 50*skill_lv)/100; - damage2 = damage2*(150+ 50*skill_lv)/100; - div_=4; - break; - case MO_COMBOFINISH: // 猛龍拳 - damage = damage*(240+ 60*skill_lv)/100; - damage2 = damage2*(240+ 60*skill_lv)/100; - break; - case BA_MUSICALSTRIKE: // ミュージカルストライク - if(!sd->state.arrow_atk && sd->arrow_atk > 0) { - int arr = MRAND((sd->arrow_atk+1)); - damage += arr; - damage2 += arr; - } - damage = damage*(100+ 50 * skill_lv)/100; - damage2 = damage2*(100+ 50 * skill_lv)/100; - if(sd->arrow_ele > 0) { - s_ele = sd->arrow_ele; - s_ele_ = sd->arrow_ele; - } - flag=(flag&~BF_RANGEMASK)|BF_LONG; - sd->state.arrow_atk = 1; - break; - case DC_THROWARROW: // 矢撃ち - if(!sd->state.arrow_atk && sd->arrow_atk > 0) { - int arr = MRAND((sd->arrow_atk+1)); - damage += arr; - damage2 += arr; - } - damage = damage*(100+ 50 * skill_lv)/100; - damage2 = damage2*(100+ 50 * skill_lv)/100; - if(sd->arrow_ele > 0) { - s_ele = sd->arrow_ele; - s_ele_ = sd->arrow_ele; - } - flag=(flag&~BF_RANGEMASK)|BF_LONG; - sd->state.arrow_atk = 1; - break; - case CH_TIGERFIST: // 伏虎拳 - damage = damage*(100+ 20*skill_lv)/100; - damage2 = damage2*(100+ 20*skill_lv)/100; - break; - case CH_CHAINCRUSH: // 連柱崩撃 - damage = damage*(100+ 20*skill_lv)/100; - damage2 = damage2*(100+ 20*skill_lv)/100; - div_=skill_get_num(skill_num,skill_lv); - break; - case CH_PALMSTRIKE: // 猛虎硬派山 - damage = damage*(50+ 100*skill_lv)/100; - damage2 = damage2*(50+ 100*skill_lv)/100; - break; - case LK_SPIRALPIERCE: /* スパイラルピアース */ - damage = damage*(100+ 50*skill_lv)/100; //増加量が分からないので適当に - damage2 = damage2*(100+ 50*skill_lv)/100; //増加量が分からないので適当に - div_=5; - if(tsd) - tsd->canmove_tick = gettick() + 1000; - else if(tmd) - tmd->canmove_tick = gettick() + 1000; - break; - case LK_HEADCRUSH: /* ヘッドクラッシュ */ - damage = damage*(100+ 20*skill_lv)/100; - damage2 = damage2*(100+ 20*skill_lv)/100; - break; - case LK_JOINTBEAT: /* ジョイントビート */ - damage = damage*(50+ 10*skill_lv)/100; - damage2 = damage2*(50+ 10*skill_lv)/100; - break; - case ASC_METEORASSAULT: /* メテオアサルト */ - damage = damage*(40+ 40*skill_lv)/100; - damage2 = damage2*(40+ 40*skill_lv)/100; - break; - case SN_SHARPSHOOTING: /* シャープシューティング */ - damage += damage*(30*skill_lv)/100; - damage2 += damage2*(30*skill_lv)/100; - break; - case CG_ARROWVULCAN: /* アローバルカン */ - damage = damage*(160+40*skill_lv)/100; - damage2 = damage2*(160+40*skill_lv)/100; - div_=9; - break; - case AS_SPLASHER: /* ベナムスプラッシャー */ - damage = damage*(200+20*skill_lv+20*pc_checkskill(sd,AS_POISONREACT))/100; - damage2 = damage2*(200+20*skill_lv+20*pc_checkskill(sd,AS_POISONREACT))/100; - break; - case PA_SACRIFICE: - if(sd){ - int hp, mhp, damage3; - hp = battle_get_hp(src); - mhp = battle_get_max_hp(src); - damage3 = mhp*((skill_lv/2)+(50/100))/100; - damage = (((skill_lv*15)+90)/100)*damage3/100; - damage2 = (((skill_lv*15)+90)/100)*damage3/100; - } - break; - case ASC_BREAKER: // -- moonsoul (special damage for ASC_BREAKER skill) - if(sd){ - int damage3; - int mdef1=battle_get_mdef(target); - int mdef2=battle_get_mdef2(target); - int imdef_flag=0; - - damage = ((damage * 5) + (skill_lv * battle_get_int(src) * 5) + MRAND(500) + 500) /2; - damage2 = ((damage2 * 5) + (skill_lv * battle_get_int(src) * 5) + MRAND(500) + 500) /2; - damage3 = damage; - hitrate = 1000000; - - if(sd->ignore_mdef_ele & (1<<t_ele) || sd->ignore_mdef_race & (1<<t_race)) - imdef_flag = 1; - if(t_mode & 0x20) { - if(sd->ignore_mdef_race & (1<<10)) - imdef_flag = 1; - } - else { - if(sd->ignore_mdef_race & (1<<11)) - imdef_flag = 1; - } - if(!imdef_flag){ - if(battle_config.magic_defense_type) { - damage3 = damage3 - (mdef1 * battle_config.magic_defense_type) - mdef2; - } - else{ - damage3 = (damage3*(100-mdef1))/100 - mdef2; - } - } - - if(damage3<1) - damage3=1; - - damage3=battle_attr_fix(damage2,s_ele_, battle_get_element(target) ); - } - break; - } - } - if(da == 2) { //三段掌が発動しているか - type = 0x08; - div_ = 255; //三段掌用に… - damage = damage * (100 + 20 * pc_checkskill(sd, MO_TRIPLEATTACK)) / 100; - } - - if( skill_num!=NPC_CRITICALSLASH ){ - // 対 象の防御力によるダメージの減少 - // ディバインプロテクション(ここでいいのかな?) - if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && def1 < 1000000) { //DEF, VIT無視 - int t_def; - target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penaly_count_lv); - if(battle_config.vit_penaly_type > 0) { - if(target_count >= battle_config.vit_penaly_count) { - if(battle_config.vit_penaly_type == 1) { - def1 = (def1 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; - def2 = (def2 * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; - t_vit = (t_vit * (100 - (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num))/100; - } - else if(battle_config.vit_penaly_type == 2) { - def1 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; - def2 -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; - t_vit -= (target_count - (battle_config.vit_penaly_count - 1))*battle_config.vit_penaly_num; - } - if(def1 < 0) def1 = 0; - if(def2 < 1) def2 = 1; - if(t_vit < 1) t_vit = 1; - } - } - t_def = def2*8/10; - vitbonusmax = (t_vit/20)*(t_vit/20)-1; - if(sd->ignore_def_ele & (1<<t_ele) || sd->ignore_def_race & (1<<t_race)) - idef_flag = 1; - if(sd->ignore_def_ele_ & (1<<t_ele) || sd->ignore_def_race_ & (1<<t_race)) - idef_flag_ = 1; - if(t_mode & 0x20) { - if(sd->ignore_def_race & (1<<10)) - idef_flag = 1; - if(sd->ignore_def_race_ & (1<<10)) - idef_flag_ = 1; - } - else { - if(sd->ignore_def_race & (1<<11)) - idef_flag = 1; - if(sd->ignore_def_race_ & (1<<11)) - idef_flag_ = 1; - } + } + else + { + int vitbonusmax; + + if (atkmax > atkmin) + damage += atkmin + MRAND ((atkmax - atkmin + 1)); + else + damage += atkmin; + if (atkmax_ > atkmin_) + damage2 += atkmin_ + MRAND ((atkmax_ - atkmin_ + 1)); + else + damage2 += atkmin_; + if (sd->atk_rate != 100) + { + damage = (damage * sd->atk_rate) / 100; + damage2 = (damage2 * sd->atk_rate) / 100; + } - if(!idef_flag){ - if(battle_config.player_defense_type) { - damage = damage - (def1 * battle_config.player_defense_type) - t_def - ((vitbonusmax < 1)?0: MRAND((vitbonusmax+1)) ); - } - else{ - damage = damage * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: MRAND((vitbonusmax+1)) ); - } - } - if(!idef_flag_){ - if(battle_config.player_defense_type) { - damage2 = damage2 - (def1 * battle_config.player_defense_type) - t_def - ((vitbonusmax < 1)?0: MRAND((vitbonusmax+1)) ); - } - else{ - damage2 = damage2 * (100 - def1) /100 - t_def - ((vitbonusmax < 1)?0: MRAND((vitbonusmax+1)) ); - } - } - } - } - } - // 精錬ダメージの追加 - if( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST) { //DEF, VIT無視 - damage += battle_get_atk2(src); - damage2 += battle_get_atk_2(src); - } - if(skill_num == CR_SHIELDBOOMERANG) { - if(sd->equip_index[8] >= 0) { - int index = sd->equip_index[8]; - if(sd->inventory_data[index] && sd->inventory_data[index]->type == 5) { - damage += sd->inventory_data[index]->weight/10; - damage += sd->status.inventory[index].refine * pc_getrefinebonus(0,1); - } - } - } - if(skill_num == LK_SPIRALPIERCE) { /* スパイラルピアース */ - if(sd->equip_index[9] >= 0) { //重量で追加ダメージらしいのでシールドブーメランを参考に追加 - int index = sd->equip_index[9]; - if(sd->inventory_data[index] && sd->inventory_data[index]->type == 4) { - damage += (int)(double)(sd->inventory_data[index]->weight*(0.8*skill_lv*4/10)); - damage += sd->status.inventory[index].refine * pc_getrefinebonus(0,1); - } - } - } - - // 0未満だった場合1に補正 - if(damage<1) damage=1; - if(damage2<1) damage2=1; - - // スキル修正2(修練系) - // 修練ダメージ(右手のみ) ソニックブロー時は別処理(1撃に付き1/8適応) - if( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != CR_GRANDCROSS) { //修練ダメージ無視 - damage = battle_addmastery(sd,target,damage,0); - damage2 = battle_addmastery(sd,target,damage2,1); - } - - if(sd->perfect_hit > 0) { - if(MRAND(100) < sd->perfect_hit) - hitrate = 1000000; - } - - // 回避修正 - hitrate = (hitrate<5)?5:hitrate; - if( hitrate < 1000000 && // 必中攻撃 - (t_sc_data != NULL && (t_sc_data[SC_SLEEP].timer!=-1 || // 睡眠は必中 - t_sc_data[SC_STAN].timer!=-1 || // スタンは必中 - t_sc_data[SC_FREEZE].timer!=-1 || (t_sc_data[SC_STONE].timer!=-1 && t_sc_data[SC_STONE].val2==0) ) ) ) // 凍結は必中 - hitrate = 1000000; - if(type == 0 && MRAND(100) >= hitrate) { - damage = damage2 = 0; - dmg_lv = ATK_FLEE; - } else { - dmg_lv = ATK_DEF; - } - // スキル修正3(武器研究) - if( (skill=pc_checkskill(sd,BS_WEAPONRESEARCH)) > 0) { - damage+= skill*2; - damage2+= skill*2; - } - //Advanced Katar Research by zanetheinsane - if(sd->weapontype1 == 0x10 || sd->weapontype2 == 0x10){ - if((skill = pc_checkskill(sd,ASC_KATAR)) > 0) { - damage += (damage*((skill*2)+10)) / 100 ; - } - } + if (sd->state.arrow_atk) + { + if (sd->arrow_atk > 0) + damage += MRAND ((sd->arrow_atk + 1)); + hitrate += sd->arrow_hit; + } + + if (skill_num != MO_INVESTIGATE && def1 < 1000000) + { + if (sd->def_ratio_atk_ele & (1 << t_ele) + || sd->def_ratio_atk_race & (1 << t_race)) + { + damage = (damage * (def1 + def2)) / 100; + idef_flag = 1; + } + if (sd->def_ratio_atk_ele_ & (1 << t_ele) + || sd->def_ratio_atk_race_ & (1 << t_race)) + { + damage2 = (damage2 * (def1 + def2)) / 100; + idef_flag_ = 1; + } + if (t_mode & 0x20) + { + if (!idef_flag && sd->def_ratio_atk_race & (1 << 10)) + { + damage = (damage * (def1 + def2)) / 100; + idef_flag = 1; + } + if (!idef_flag_ && sd->def_ratio_atk_race_ & (1 << 10)) + { + damage2 = (damage2 * (def1 + def2)) / 100; + idef_flag_ = 1; + } + } + else + { + if (!idef_flag && sd->def_ratio_atk_race & (1 << 11)) + { + damage = (damage * (def1 + def2)) / 100; + idef_flag = 1; + } + if (!idef_flag_ && sd->def_ratio_atk_race_ & (1 << 11)) + { + damage2 = (damage2 * (def1 + def2)) / 100; + idef_flag_ = 1; + } + } + } + + // スキル修正1(攻撃力倍化系) + // オーバートラスト(+5% 〜 +25%),他攻撃系スキルの場合ここで補正 + // バッシュ,マグナムブレイク, + // ボーリングバッシュ,スピアブーメラン,ブランディッシュスピア,スピアスタッブ, + // メマーナイト,カートレボリューション + // ダブルストレイフィング,アローシャワー,チャージアロー, + // ソニックブロー + if (sc_data) + { //状態異常中のダメージ追加 + if (sc_data[SC_OVERTHRUST].timer != -1) + { // オーバートラスト + damage += damage * (5 * sc_data[SC_OVERTHRUST].val1) / 100; + damage2 += damage2 * (5 * sc_data[SC_OVERTHRUST].val1) / 100; + } + if (sc_data[SC_TRUESIGHT].timer != -1) + { // トゥルーサイト + damage += damage * (2 * sc_data[SC_TRUESIGHT].val1) / 100; + damage2 += damage2 * (2 * sc_data[SC_TRUESIGHT].val1) / 100; + } + if (sc_data[SC_BERSERK].timer != -1) + { // バーサーク + damage += damage * 50 / 100; + damage2 += damage2 * 50 / 100; + } + } + + if (skill_num > 0) + { + int i; + if ((i = skill_get_pl (skill_num)) > 0) + s_ele = s_ele_ = i; + + flag = (flag & ~BF_SKILLMASK) | BF_SKILL; + switch (skill_num) + { + case SM_BASH: // バッシュ + damage = damage * (100 + 30 * skill_lv) / 100; + damage2 = damage2 * (100 + 30 * skill_lv) / 100; + hitrate = (hitrate * (100 + 5 * skill_lv)) / 100; + break; + case SM_MAGNUM: // マグナムブレイク + damage = + damage * (5 * skill_lv + (wflag) ? 65 : 115) / 100; + damage2 = + damage2 * (5 * skill_lv + (wflag) ? 65 : 115) / 100; + break; + case MC_MAMMONITE: // メマーナイト + damage = damage * (100 + 50 * skill_lv) / 100; + damage2 = damage2 * (100 + 50 * skill_lv) / 100; + break; + case AC_DOUBLE: // ダブルストレイフィング + if (!sd->state.arrow_atk && sd->arrow_atk > 0) + { + int arr = MRAND ((sd->arrow_atk + 1)); + damage += arr; + damage2 += arr; + } + damage = damage * (180 + 20 * skill_lv) / 100; + damage2 = damage2 * (180 + 20 * skill_lv) / 100; + div_ = 2; + if (sd->arrow_ele > 0) + { + s_ele = sd->arrow_ele; + s_ele_ = sd->arrow_ele; + } + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + sd->state.arrow_atk = 1; + break; + case AC_SHOWER: // アローシャワー + if (!sd->state.arrow_atk && sd->arrow_atk > 0) + { + int arr = MRAND ((sd->arrow_atk + 1)); + damage += arr; + damage2 += arr; + } + damage = damage * (75 + 5 * skill_lv) / 100; + damage2 = damage2 * (75 + 5 * skill_lv) / 100; + if (sd->arrow_ele > 0) + { + s_ele = sd->arrow_ele; + s_ele_ = sd->arrow_ele; + } + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + sd->state.arrow_atk = 1; + break; + case AC_CHARGEARROW: // チャージアロー + if (!sd->state.arrow_atk && sd->arrow_atk > 0) + { + int arr = MRAND ((sd->arrow_atk + 1)); + damage += arr; + damage2 += arr; + } + damage = damage * 150 / 100; + damage2 = damage2 * 150 / 100; + if (sd->arrow_ele > 0) + { + s_ele = sd->arrow_ele; + s_ele_ = sd->arrow_ele; + } + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + sd->state.arrow_atk = 1; + break; + case KN_PIERCE: // ピアース + damage = damage * (100 + 10 * skill_lv) / 100; + damage2 = damage2 * (100 + 10 * skill_lv) / 100; + hitrate = hitrate * (100 + 5 * skill_lv) / 100; + div_ = t_size + 1; + damage *= div_; + damage2 *= div_; + break; + case KN_SPEARSTAB: // スピアスタブ + damage = damage * (100 + 15 * skill_lv) / 100; + damage2 = damage2 * (100 + 15 * skill_lv) / 100; + break; + case KN_SPEARBOOMERANG: // スピアブーメラン + damage = damage * (100 + 50 * skill_lv) / 100; + damage2 = damage2 * (100 + 50 * skill_lv) / 100; + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + break; + case KN_BRANDISHSPEAR: // ブランディッシュスピア + damage = damage * (100 + 20 * skill_lv) / 100; + damage2 = damage2 * (100 + 20 * skill_lv) / 100; + if (skill_lv > 3 && wflag == 1) + damage3 += damage / 2; + if (skill_lv > 6 && wflag == 1) + damage3 += damage / 4; + if (skill_lv > 9 && wflag == 1) + damage3 += damage / 8; + if (skill_lv > 6 && wflag == 2) + damage3 += damage / 2; + if (skill_lv > 9 && wflag == 2) + damage3 += damage / 4; + if (skill_lv > 9 && wflag == 3) + damage3 += damage / 2; + damage += damage3; + if (skill_lv > 3 && wflag == 1) + damage4 += damage2 / 2; + if (skill_lv > 6 && wflag == 1) + damage4 += damage2 / 4; + if (skill_lv > 9 && wflag == 1) + damage4 += damage2 / 8; + if (skill_lv > 6 && wflag == 2) + damage4 += damage2 / 2; + if (skill_lv > 9 && wflag == 2) + damage4 += damage2 / 4; + if (skill_lv > 9 && wflag == 3) + damage4 += damage2 / 2; + damage2 += damage4; + blewcount = 0; + break; + case KN_BOWLINGBASH: // ボウリングバッシュ + damage = damage * (100 + 50 * skill_lv) / 100; + damage2 = damage2 * (100 + 50 * skill_lv) / 100; + blewcount = 0; + break; + case KN_AUTOCOUNTER: + if (battle_config.pc_auto_counter_type & 1) + hitrate += 20; + else + hitrate = 1000000; + flag = (flag & ~BF_SKILLMASK) | BF_NORMAL; + break; + case AS_SONICBLOW: // ソニックブロウ + hitrate += 30; // hitrate +30, thanks to midas + damage = damage * (300 + 50 * skill_lv) / 100; + damage2 = damage2 * (300 + 50 * skill_lv) / 100; + div_ = 8; + break; + case TF_SPRINKLESAND: // 砂まき + damage = damage * 125 / 100; + damage2 = damage2 * 125 / 100; + break; + case MC_CARTREVOLUTION: // カートレボリューション + if (sd->cart_max_weight > 0 && sd->cart_weight > 0) + { + damage = + (damage * + (150 + pc_checkskill (sd, BS_WEAPONRESEARCH) + + (sd->cart_weight * 100 / + sd->cart_max_weight))) / 100; + damage2 = + (damage2 * + (150 + pc_checkskill (sd, BS_WEAPONRESEARCH) + + (sd->cart_weight * 100 / + sd->cart_max_weight))) / 100; + } + else + { + damage = (damage * 150) / 100; + damage2 = (damage2 * 150) / 100; + } + break; + // 以下MOB + case NPC_COMBOATTACK: // 多段攻撃 + div_ = skill_get_num (skill_num, skill_lv); + damage *= div_; + damage2 *= div_; + break; + case NPC_RANDOMATTACK: // ランダムATK攻撃 + damage = damage * (MPRAND (50, 150)) / 100; + damage2 = damage2 * (MPRAND (50, 150)) / 100; + break; + // 属性攻撃(適当) + case NPC_WATERATTACK: + case NPC_GROUNDATTACK: + case NPC_FIREATTACK: + case NPC_WINDATTACK: + case NPC_POISONATTACK: + case NPC_HOLYATTACK: + case NPC_DARKNESSATTACK: + case NPC_TELEKINESISATTACK: + damage = damage * (100 + 25 * skill_lv) / 100; + damage2 = damage2 * (100 + 25 * skill_lv) / 100; + break; + case NPC_GUIDEDATTACK: + hitrate = 1000000; + break; + case NPC_RANGEATTACK: + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + break; + case NPC_PIERCINGATT: + flag = (flag & ~BF_RANGEMASK) | BF_SHORT; + break; + case RG_BACKSTAP: // バックスタブ + if (battle_config.backstab_bow_penalty == 1 + && sd->status.weapon == 11) + { + damage = (damage * (300 + 40 * skill_lv) / 100) / 2; + damage2 = (damage2 * (300 + 40 * skill_lv) / 100) / 2; + } + else + { + damage = damage * (300 + 40 * skill_lv) / 100; + damage2 = damage2 * (300 + 40 * skill_lv) / 100; + } + hitrate = 1000000; + break; + case RG_RAID: // サプライズアタック + damage = damage * (100 + 40 * skill_lv) / 100; + damage2 = damage2 * (100 + 40 * skill_lv) / 100; + break; + case RG_INTIMIDATE: // インティミデイト + damage = damage * (100 + 30 * skill_lv) / 100; + damage2 = damage2 * (100 + 30 * skill_lv) / 100; + break; + case CR_SHIELDCHARGE: // シールドチャージ + damage = damage * (100 + 20 * skill_lv) / 100; + damage2 = damage2 * (100 + 20 * skill_lv) / 100; + flag = (flag & ~BF_RANGEMASK) | BF_SHORT; + s_ele = 0; + break; + case CR_SHIELDBOOMERANG: // シールドブーメラン + damage = damage * (100 + 30 * skill_lv) / 100; + damage2 = damage2 * (100 + 30 * skill_lv) / 100; + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + s_ele = 0; + break; + case CR_HOLYCROSS: // ホーリークロス + damage = damage * (100 + 35 * skill_lv) / 100; + damage2 = damage2 * (100 + 35 * skill_lv) / 100; + div_ = 2; + break; + case CR_GRANDCROSS: + hitrate = 1000000; + break; + case AM_DEMONSTRATION: // デモンストレーション + damage = damage * (100 + 20 * skill_lv) / 100; + damage2 = damage2 * (100 + 20 * skill_lv) / 100; + break; + case AM_ACIDTERROR: // アシッドテラー + damage = damage * (100 + 40 * skill_lv) / 100; + damage2 = damage2 * (100 + 40 * skill_lv) / 100; + break; + case MO_FINGEROFFENSIVE: //指弾 + if (battle_config.finger_offensive_type == 0) + { + damage = + damage * (100 + + 50 * skill_lv) / 100 * + sd->spiritball_old; + damage2 = + damage2 * (100 + + 50 * skill_lv) / 100 * + sd->spiritball_old; + div_ = sd->spiritball_old; + } + else + { + damage = damage * (100 + 50 * skill_lv) / 100; + damage2 = damage2 * (100 + 50 * skill_lv) / 100; + div_ = 1; + } + break; + case MO_INVESTIGATE: // 発 勁 + if (def1 < 1000000) + { + damage = + damage * (100 + 75 * skill_lv) / 100 * (def1 + + def2) / + 100; + damage2 = + damage2 * (100 + 75 * skill_lv) / 100 * (def1 + + def2) / + 100; + } + hitrate = 1000000; + s_ele = 0; + s_ele_ = 0; + break; + case MO_EXTREMITYFIST: // 阿修羅覇鳳拳 + damage = + damage * (8 + ((sd->status.sp) / 10)) + 250 + + (skill_lv * 150); + damage2 = + damage2 * (8 + ((sd->status.sp) / 10)) + 250 + + (skill_lv * 150); + sd->status.sp = 0; + clif_updatestatus (sd, SP_SP); + hitrate = 1000000; + s_ele = 0; + s_ele_ = 0; + break; + case MO_CHAINCOMBO: // 連打掌 + damage = damage * (150 + 50 * skill_lv) / 100; + damage2 = damage2 * (150 + 50 * skill_lv) / 100; + div_ = 4; + break; + case MO_COMBOFINISH: // 猛龍拳 + damage = damage * (240 + 60 * skill_lv) / 100; + damage2 = damage2 * (240 + 60 * skill_lv) / 100; + break; + case BA_MUSICALSTRIKE: // ミュージカルストライク + if (!sd->state.arrow_atk && sd->arrow_atk > 0) + { + int arr = MRAND ((sd->arrow_atk + 1)); + damage += arr; + damage2 += arr; + } + damage = damage * (100 + 50 * skill_lv) / 100; + damage2 = damage2 * (100 + 50 * skill_lv) / 100; + if (sd->arrow_ele > 0) + { + s_ele = sd->arrow_ele; + s_ele_ = sd->arrow_ele; + } + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + sd->state.arrow_atk = 1; + break; + case DC_THROWARROW: // 矢撃ち + if (!sd->state.arrow_atk && sd->arrow_atk > 0) + { + int arr = MRAND ((sd->arrow_atk + 1)); + damage += arr; + damage2 += arr; + } + damage = damage * (100 + 50 * skill_lv) / 100; + damage2 = damage2 * (100 + 50 * skill_lv) / 100; + if (sd->arrow_ele > 0) + { + s_ele = sd->arrow_ele; + s_ele_ = sd->arrow_ele; + } + flag = (flag & ~BF_RANGEMASK) | BF_LONG; + sd->state.arrow_atk = 1; + break; + case CH_TIGERFIST: // 伏虎拳 + damage = damage * (100 + 20 * skill_lv) / 100; + damage2 = damage2 * (100 + 20 * skill_lv) / 100; + break; + case CH_CHAINCRUSH: // 連柱崩撃 + damage = damage * (100 + 20 * skill_lv) / 100; + damage2 = damage2 * (100 + 20 * skill_lv) / 100; + div_ = skill_get_num (skill_num, skill_lv); + break; + case CH_PALMSTRIKE: // 猛虎硬派山 + damage = damage * (50 + 100 * skill_lv) / 100; + damage2 = damage2 * (50 + 100 * skill_lv) / 100; + break; + case LK_SPIRALPIERCE: /* スパイラルピアース */ + damage = damage * (100 + 50 * skill_lv) / 100; //増加量が分からないので適当に + damage2 = damage2 * (100 + 50 * skill_lv) / 100; //増加量が分からないので適当に + div_ = 5; + if (tsd) + tsd->canmove_tick = gettick () + 1000; + else if (tmd) + tmd->canmove_tick = gettick () + 1000; + break; + case LK_HEADCRUSH: /* ヘッドクラッシュ */ + damage = damage * (100 + 20 * skill_lv) / 100; + damage2 = damage2 * (100 + 20 * skill_lv) / 100; + break; + case LK_JOINTBEAT: /* ジョイントビート */ + damage = damage * (50 + 10 * skill_lv) / 100; + damage2 = damage2 * (50 + 10 * skill_lv) / 100; + break; + case ASC_METEORASSAULT: /* メテオアサルト */ + damage = damage * (40 + 40 * skill_lv) / 100; + damage2 = damage2 * (40 + 40 * skill_lv) / 100; + break; + case SN_SHARPSHOOTING: /* シャープシューティング */ + damage += damage * (30 * skill_lv) / 100; + damage2 += damage2 * (30 * skill_lv) / 100; + break; + case CG_ARROWVULCAN: /* アローバルカン */ + damage = damage * (160 + 40 * skill_lv) / 100; + damage2 = damage2 * (160 + 40 * skill_lv) / 100; + div_ = 9; + break; + case AS_SPLASHER: /* ベナムスプラッシャー */ + damage = + damage * (200 + 20 * skill_lv + + 20 * pc_checkskill (sd, + AS_POISONREACT)) / 100; + damage2 = + damage2 * (200 + 20 * skill_lv + + 20 * pc_checkskill (sd, + AS_POISONREACT)) / 100; + break; + case PA_SACRIFICE: + if (sd) + { + int hp, mhp, damage3; + hp = battle_get_hp (src); + mhp = battle_get_max_hp (src); + damage3 = mhp * ((skill_lv / 2) + (50 / 100)) / 100; + damage = + (((skill_lv * 15) + 90) / 100) * damage3 / 100; + damage2 = + (((skill_lv * 15) + 90) / 100) * damage3 / 100; + } + break; + case ASC_BREAKER: // -- moonsoul (special damage for ASC_BREAKER skill) + if (sd) + { + int damage3; + int mdef1 = battle_get_mdef (target); + int mdef2 = battle_get_mdef2 (target); + int imdef_flag = 0; + + damage = + ((damage * 5) + + (skill_lv * battle_get_int (src) * 5) + + MRAND (500) + 500) / 2; + damage2 = + ((damage2 * 5) + + (skill_lv * battle_get_int (src) * 5) + + MRAND (500) + 500) / 2; + damage3 = damage; + hitrate = 1000000; + + if (sd->ignore_mdef_ele & (1 << t_ele) + || sd->ignore_mdef_race & (1 << t_race)) + imdef_flag = 1; + if (t_mode & 0x20) + { + if (sd->ignore_mdef_race & (1 << 10)) + imdef_flag = 1; + } + else + { + if (sd->ignore_mdef_race & (1 << 11)) + imdef_flag = 1; + } + if (!imdef_flag) + { + if (battle_config.magic_defense_type) + { + damage3 = + damage3 - + (mdef1 * + battle_config.magic_defense_type) - + mdef2; + } + else + { + damage3 = + (damage3 * (100 - mdef1)) / 100 - mdef2; + } + } + + if (damage3 < 1) + damage3 = 1; + + damage3 = + battle_attr_fix (damage2, s_ele_, + battle_get_element (target)); + } + break; + } + } + if (da == 2) + { //三段掌が発動しているか + type = 0x08; + div_ = 255; //三段掌用に… + damage = + damage * (100 + + 20 * pc_checkskill (sd, MO_TRIPLEATTACK)) / 100; + } + + if (skill_num != NPC_CRITICALSLASH) + { + // 対 象の防御力によるダメージの減少 + // ディバインプロテクション(ここでいいのかな?) + if (skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST + && skill_num != KN_AUTOCOUNTER && def1 < 1000000) + { //DEF, VIT無視 + int t_def; + target_count = + 1 + battle_counttargeted (target, src, + battle_config.vit_penaly_count_lv); + if (battle_config.vit_penaly_type > 0) + { + if (target_count >= battle_config.vit_penaly_count) + { + if (battle_config.vit_penaly_type == 1) + { + def1 = + (def1 * + (100 - + (target_count - + (battle_config.vit_penaly_count - + 1)) * battle_config.vit_penaly_num)) / + 100; + def2 = + (def2 * + (100 - + (target_count - + (battle_config.vit_penaly_count - + 1)) * battle_config.vit_penaly_num)) / + 100; + t_vit = + (t_vit * + (100 - + (target_count - + (battle_config.vit_penaly_count - + 1)) * battle_config.vit_penaly_num)) / + 100; + } + else if (battle_config.vit_penaly_type == 2) + { + def1 -= + (target_count - + (battle_config.vit_penaly_count - + 1)) * battle_config.vit_penaly_num; + def2 -= + (target_count - + (battle_config.vit_penaly_count - + 1)) * battle_config.vit_penaly_num; + t_vit -= + (target_count - + (battle_config.vit_penaly_count - + 1)) * battle_config.vit_penaly_num; + } + if (def1 < 0) + def1 = 0; + if (def2 < 1) + def2 = 1; + if (t_vit < 1) + t_vit = 1; + } + } + t_def = def2 * 8 / 10; + vitbonusmax = (t_vit / 20) * (t_vit / 20) - 1; + if (sd->ignore_def_ele & (1 << t_ele) + || sd->ignore_def_race & (1 << t_race)) + idef_flag = 1; + if (sd->ignore_def_ele_ & (1 << t_ele) + || sd->ignore_def_race_ & (1 << t_race)) + idef_flag_ = 1; + if (t_mode & 0x20) + { + if (sd->ignore_def_race & (1 << 10)) + idef_flag = 1; + if (sd->ignore_def_race_ & (1 << 10)) + idef_flag_ = 1; + } + else + { + if (sd->ignore_def_race & (1 << 11)) + idef_flag = 1; + if (sd->ignore_def_race_ & (1 << 11)) + idef_flag_ = 1; + } + + if (!idef_flag) + { + if (battle_config.player_defense_type) + { + damage = + damage - + (def1 * battle_config.player_defense_type) - + t_def - + ((vitbonusmax < + 1) ? 0 : MRAND ((vitbonusmax + 1))); + } + else + { + damage = + damage * (100 - def1) / 100 - t_def - + ((vitbonusmax < + 1) ? 0 : MRAND ((vitbonusmax + 1))); + } + } + if (!idef_flag_) + { + if (battle_config.player_defense_type) + { + damage2 = + damage2 - + (def1 * battle_config.player_defense_type) - + t_def - + ((vitbonusmax < + 1) ? 0 : MRAND ((vitbonusmax + 1))); + } + else + { + damage2 = + damage2 * (100 - def1) / 100 - t_def - + ((vitbonusmax < + 1) ? 0 : MRAND ((vitbonusmax + 1))); + } + } + } + } + } + // 精錬ダメージの追加 + if (skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST) + { //DEF, VIT無視 + damage += battle_get_atk2 (src); + damage2 += battle_get_atk_2 (src); + } + if (skill_num == CR_SHIELDBOOMERANG) + { + if (sd->equip_index[8] >= 0) + { + int index = sd->equip_index[8]; + if (sd->inventory_data[index] + && sd->inventory_data[index]->type == 5) + { + damage += sd->inventory_data[index]->weight / 10; + damage += + sd->status.inventory[index].refine * pc_getrefinebonus (0, + 1); + } + } + } + if (skill_num == LK_SPIRALPIERCE) + { /* スパイラルピアース */ + if (sd->equip_index[9] >= 0) + { //重量で追加ダメージらしいのでシールドブーメランを参考に追加 + int index = sd->equip_index[9]; + if (sd->inventory_data[index] + && sd->inventory_data[index]->type == 4) + { + damage += + (int) (double) (sd->inventory_data[index]->weight * + (0.8 * skill_lv * 4 / 10)); + damage += + sd->status.inventory[index].refine * pc_getrefinebonus (0, + 1); + } + } + } + + // 0未満だった場合1に補正 + if (damage < 1) + damage = 1; + if (damage2 < 1) + damage2 = 1; + + // スキル修正2(修練系) + // 修練ダメージ(右手のみ) ソニックブロー時は別処理(1撃に付き1/8適応) + if (skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST + && skill_num != CR_GRANDCROSS) + { //修練ダメージ無視 + damage = battle_addmastery (sd, target, damage, 0); + damage2 = battle_addmastery (sd, target, damage2, 1); + } + + if (sd->perfect_hit > 0) + { + if (MRAND (100) < sd->perfect_hit) + hitrate = 1000000; + } + + // 回避修正 + hitrate = (hitrate < 5) ? 5 : hitrate; + if (hitrate < 1000000 && // 必中攻撃 + (t_sc_data != NULL && (t_sc_data[SC_SLEEP].timer != -1 || // 睡眠は必中 + t_sc_data[SC_STAN].timer != -1 || // スタンは必中 + t_sc_data[SC_FREEZE].timer != -1 || (t_sc_data[SC_STONE].timer != -1 && t_sc_data[SC_STONE].val2 == 0)))) // 凍結は必中 + hitrate = 1000000; + if (type == 0 && MRAND (100) >= hitrate) + { + damage = damage2 = 0; + dmg_lv = ATK_FLEE; + } + else + { + dmg_lv = ATK_DEF; + } + // スキル修正3(武器研究) + if ((skill = pc_checkskill (sd, BS_WEAPONRESEARCH)) > 0) + { + damage += skill * 2; + damage2 += skill * 2; + } + //Advanced Katar Research by zanetheinsane + if (sd->weapontype1 == 0x10 || sd->weapontype2 == 0x10) + { + if ((skill = pc_checkskill (sd, ASC_KATAR)) > 0) + { + damage += (damage * ((skill * 2) + 10)) / 100; + } + } //スキルによるダメージ補正ここまで //カードによるダメージ追加処理ここから - cardfix=100; - if(!sd->state.arrow_atk) { //弓矢以外 - if(!battle_config.left_cardfix_to_right) { //左手カード補正設定無し - cardfix=cardfix*(100+sd->addrace[t_race])/100; // 種族によるダメージ修正 - cardfix=cardfix*(100+sd->addele[t_ele])/100; // 属性によるダメージ修正 - cardfix=cardfix*(100+sd->addsize[t_size])/100; // サイズによるダメージ修正 - } - else { - cardfix=cardfix*(100+sd->addrace[t_race]+sd->addrace_[t_race])/100; // 種族によるダメージ修正(左手による追加あり) - cardfix=cardfix*(100+sd->addele[t_ele]+sd->addele_[t_ele])/100; // 属性によるダメージ修正(左手による追加あり) - cardfix=cardfix*(100+sd->addsize[t_size]+sd->addsize_[t_size])/100; // サイズによるダメージ修正(左手による追加あり) - } - } - else { //弓矢 - cardfix=cardfix*(100+sd->addrace[t_race]+sd->arrow_addrace[t_race])/100; // 種族によるダメージ修正(弓矢による追加あり) - cardfix=cardfix*(100+sd->addele[t_ele]+sd->arrow_addele[t_ele])/100; // 属性によるダメージ修正(弓矢による追加あり) - cardfix=cardfix*(100+sd->addsize[t_size]+sd->arrow_addsize[t_size])/100; // サイズによるダメージ修正(弓矢による追加あり) - } - if(t_mode & 0x20) { //ボス - if(!sd->state.arrow_atk) { //弓矢攻撃以外なら - if(!battle_config.left_cardfix_to_right) //左手カード補正設定無し - cardfix=cardfix*(100+sd->addrace[10])/100; //ボスモンスターに追加ダメージ - else //左手カード補正設定あり - cardfix=cardfix*(100+sd->addrace[10]+sd->addrace_[10])/100; //ボスモンスターに追加ダメージ(左手による追加あり) - } - else //弓矢攻撃 - cardfix=cardfix*(100+sd->addrace[10]+sd->arrow_addrace[10])/100; //ボスモンスターに追加ダメージ(弓矢による追加あり) - } - else { //ボスじゃない - if(!sd->state.arrow_atk) { //弓矢攻撃以外 - if(!battle_config.left_cardfix_to_right) //左手カード補正設定無し - cardfix=cardfix*(100+sd->addrace[11])/100; //ボス以外モンスターに追加ダメージ - else //左手カード補正設定あり - cardfix=cardfix*(100+sd->addrace[11]+sd->addrace_[11])/100; //ボス以外モンスターに追加ダメージ(左手による追加あり) - } - else - cardfix=cardfix*(100+sd->addrace[11]+sd->arrow_addrace[11])/100; //ボス以外モンスターに追加ダメージ(弓矢による追加あり) - } - //特定Class用補正処理(少女の日記→ボンゴン用?) - t_class = battle_get_class(target); - for(i=0;i<sd->add_damage_class_count;i++) { - if(sd->add_damage_classid[i] == t_class) { - cardfix=cardfix*(100+sd->add_damage_classrate[i])/100; - break; - } - } - if(skill_num != CR_GRANDCROSS || !battle_config.gx_cardfix) - damage=damage*cardfix/100; //カード補正によるダメージ増加 + cardfix = 100; + if (!sd->state.arrow_atk) + { //弓矢以外 + if (!battle_config.left_cardfix_to_right) + { //左手カード補正設定無し + cardfix = cardfix * (100 + sd->addrace[t_race]) / 100; // 種族によるダメージ修正 + cardfix = cardfix * (100 + sd->addele[t_ele]) / 100; // 属性によるダメージ修正 + cardfix = cardfix * (100 + sd->addsize[t_size]) / 100; // サイズによるダメージ修正 + } + else + { + cardfix = cardfix * (100 + sd->addrace[t_race] + sd->addrace_[t_race]) / 100; // 種族によるダメージ修正(左手による追加あり) + cardfix = cardfix * (100 + sd->addele[t_ele] + sd->addele_[t_ele]) / 100; // 属性によるダメージ修正(左手による追加あり) + cardfix = cardfix * (100 + sd->addsize[t_size] + sd->addsize_[t_size]) / 100; // サイズによるダメージ修正(左手による追加あり) + } + } + else + { //弓矢 + cardfix = cardfix * (100 + sd->addrace[t_race] + sd->arrow_addrace[t_race]) / 100; // 種族によるダメージ修正(弓矢による追加あり) + cardfix = cardfix * (100 + sd->addele[t_ele] + sd->arrow_addele[t_ele]) / 100; // 属性によるダメージ修正(弓矢による追加あり) + cardfix = cardfix * (100 + sd->addsize[t_size] + sd->arrow_addsize[t_size]) / 100; // サイズによるダメージ修正(弓矢による追加あり) + } + if (t_mode & 0x20) + { //ボス + if (!sd->state.arrow_atk) + { //弓矢攻撃以外なら + if (!battle_config.left_cardfix_to_right) //左手カード補正設定無し + cardfix = cardfix * (100 + sd->addrace[10]) / 100; //ボスモンスターに追加ダメージ + else //左手カード補正設定あり + cardfix = cardfix * (100 + sd->addrace[10] + sd->addrace_[10]) / 100; //ボスモンスターに追加ダメージ(左手による追加あり) + } + else //弓矢攻撃 + cardfix = cardfix * (100 + sd->addrace[10] + sd->arrow_addrace[10]) / 100; //ボスモンスターに追加ダメージ(弓矢による追加あり) + } + else + { //ボスじゃない + if (!sd->state.arrow_atk) + { //弓矢攻撃以外 + if (!battle_config.left_cardfix_to_right) //左手カード補正設定無し + cardfix = cardfix * (100 + sd->addrace[11]) / 100; //ボス以外モンスターに追加ダメージ + else //左手カード補正設定あり + cardfix = cardfix * (100 + sd->addrace[11] + sd->addrace_[11]) / 100; //ボス以外モンスターに追加ダメージ(左手による追加あり) + } + else + cardfix = cardfix * (100 + sd->addrace[11] + sd->arrow_addrace[11]) / 100; //ボス以外モンスターに追加ダメージ(弓矢による追加あり) + } + //特定Class用補正処理(少女の日記→ボンゴン用?) + t_class = battle_get_class (target); + for (i = 0; i < sd->add_damage_class_count; i++) + { + if (sd->add_damage_classid[i] == t_class) + { + cardfix = cardfix * (100 + sd->add_damage_classrate[i]) / 100; + break; + } + } + if (skill_num != CR_GRANDCROSS || !battle_config.gx_cardfix) + damage = damage * cardfix / 100; //カード補正によるダメージ増加 //カードによるダメージ増加処理ここまで //カードによるダメージ追加処理(左手)ここから - cardfix=100; - if(!battle_config.left_cardfix_to_right) { //左手カード補正設定無し - cardfix=cardfix*(100+sd->addrace_[t_race])/100; // 種族によるダメージ修正左手 - cardfix=cardfix*(100+sd->addele_[t_ele])/100; // 属 性によるダメージ修正左手 - cardfix=cardfix*(100+sd->addsize_[t_size])/100; // サイズによるダメージ修正左手 - if(t_mode & 0x20) //ボス - cardfix=cardfix*(100+sd->addrace_[10])/100; //ボスモンスターに追加ダメージ左手 - else - cardfix=cardfix*(100+sd->addrace_[11])/100; //ボス以外モンスターに追加ダメージ左手 - } - //特定Class用補正処理左手(少女の日記→ボンゴン用?) - for(i=0;i<sd->add_damage_class_count_;i++) { - if(sd->add_damage_classid_[i] == t_class) { - cardfix=cardfix*(100+sd->add_damage_classrate_[i])/100; - break; - } - } - if(skill_num != CR_GRANDCROSS) damage2=damage2*cardfix/100; //カード補正による左手ダメージ増加 + cardfix = 100; + if (!battle_config.left_cardfix_to_right) + { //左手カード補正設定無し + cardfix = cardfix * (100 + sd->addrace_[t_race]) / 100; // 種族によるダメージ修正左手 + cardfix = cardfix * (100 + sd->addele_[t_ele]) / 100; // 属 性によるダメージ修正左手 + cardfix = cardfix * (100 + sd->addsize_[t_size]) / 100; // サイズによるダメージ修正左手 + if (t_mode & 0x20) //ボス + cardfix = cardfix * (100 + sd->addrace_[10]) / 100; //ボスモンスターに追加ダメージ左手 + else + cardfix = cardfix * (100 + sd->addrace_[11]) / 100; //ボス以外モンスターに追加ダメージ左手 + } + //特定Class用補正処理左手(少女の日記→ボンゴン用?) + for (i = 0; i < sd->add_damage_class_count_; i++) + { + if (sd->add_damage_classid_[i] == t_class) + { + cardfix = cardfix * (100 + sd->add_damage_classrate_[i]) / 100; + break; + } + } + if (skill_num != CR_GRANDCROSS) + damage2 = damage2 * cardfix / 100; //カード補正による左手ダメージ増加 //カードによるダメージ増加処理(左手)ここまで // -- moonsoul (cardfix for magic damage portion of ASC_BREAKER) - if(skill_num == ASC_BREAKER) - damage3 = damage3 * cardfix / 100; + if (skill_num == ASC_BREAKER) + damage3 = damage3 * cardfix / 100; //カードによるダメージ減衰処理ここから - if(tsd){ //対象がPCの場合 - cardfix=100; - cardfix=cardfix*(100-tsd->subrace[s_race])/100; // 種族によるダメージ耐性 - cardfix=cardfix*(100-tsd->subele[s_ele])/100; // 属性によるダメージ耐性 - if(battle_get_mode(src) & 0x20) - cardfix=cardfix*(100-tsd->subrace[10])/100; //ボスからの攻撃はダメージ減少 - else - cardfix=cardfix*(100-tsd->subrace[11])/100; //ボス以外からの攻撃はダメージ減少 - //特定Class用補正処理左手(少女の日記→ボンゴン用?) - for(i=0;i<tsd->add_def_class_count;i++) { - if(tsd->add_def_classid[i] == sd->status.class) { - cardfix=cardfix*(100-tsd->add_def_classrate[i])/100; - break; - } - } - if(flag&BF_LONG) - cardfix=cardfix*(100-tsd->long_attack_def_rate)/100; //遠距離攻撃はダメージ減少(ホルンCとか) - if(flag&BF_SHORT) - cardfix=cardfix*(100-tsd->near_attack_def_rate)/100; //近距離攻撃はダメージ減少(該当無し?) - damage=damage*cardfix/100; //カード補正によるダメージ減少 - damage2=damage2*cardfix/100; //カード補正による左手ダメージ減少 - } + if (tsd) + { //対象がPCの場合 + cardfix = 100; + cardfix = cardfix * (100 - tsd->subrace[s_race]) / 100; // 種族によるダメージ耐性 + cardfix = cardfix * (100 - tsd->subele[s_ele]) / 100; // 属性によるダメージ耐性 + if (battle_get_mode (src) & 0x20) + cardfix = cardfix * (100 - tsd->subrace[10]) / 100; //ボスからの攻撃はダメージ減少 + else + cardfix = cardfix * (100 - tsd->subrace[11]) / 100; //ボス以外からの攻撃はダメージ減少 + //特定Class用補正処理左手(少女の日記→ボンゴン用?) + for (i = 0; i < tsd->add_def_class_count; i++) + { + if (tsd->add_def_classid[i] == sd->status.class) + { + cardfix = cardfix * (100 - tsd->add_def_classrate[i]) / 100; + break; + } + } + if (flag & BF_LONG) + cardfix = cardfix * (100 - tsd->long_attack_def_rate) / 100; //遠距離攻撃はダメージ減少(ホルンCとか) + if (flag & BF_SHORT) + cardfix = cardfix * (100 - tsd->near_attack_def_rate) / 100; //近距離攻撃はダメージ減少(該当無し?) + damage = damage * cardfix / 100; //カード補正によるダメージ減少 + damage2 = damage2 * cardfix / 100; //カード補正による左手ダメージ減少 + } //カードによるダメージ減衰処理ここまで //対象にステータス異常がある場合のダメージ減算処理ここから - if(t_sc_data) { - cardfix=100; - if(t_sc_data[SC_DEFENDER].timer != -1 && flag&BF_LONG) //ディフェンダー状態で遠距離攻撃 - cardfix=cardfix*(100-t_sc_data[SC_DEFENDER].val2)/100; //ディフェンダーによる減衰 - if(cardfix != 100) { - damage=damage*cardfix/100; //ディフェンダー補正によるダメージ減少 - damage2=damage2*cardfix/100; //ディフェンダー補正による左手ダメージ減少 - } - if(t_sc_data[SC_ASSUMPTIO].timer != -1){ //アスムプティオ - if(!map[target->m].flag.pvp){ - damage=damage/3; - damage2=damage2/3; - }else{ - damage=damage/2; - damage2=damage2/2; - } - } - } + if (t_sc_data) + { + cardfix = 100; + if (t_sc_data[SC_DEFENDER].timer != -1 && flag & BF_LONG) //ディフェンダー状態で遠距離攻撃 + cardfix = cardfix * (100 - t_sc_data[SC_DEFENDER].val2) / 100; //ディフェンダーによる減衰 + if (cardfix != 100) + { + damage = damage * cardfix / 100; //ディフェンダー補正によるダメージ減少 + damage2 = damage2 * cardfix / 100; //ディフェンダー補正による左手ダメージ減少 + } + if (t_sc_data[SC_ASSUMPTIO].timer != -1) + { //アスムプティオ + if (!map[target->m].flag.pvp) + { + damage = damage / 3; + damage2 = damage2 / 3; + } + else + { + damage = damage / 2; + damage2 = damage2 / 2; + } + } + } //対象にステータス異常がある場合のダメージ減算処理ここまで - if(damage < 0) damage = 0; - if(damage2 < 0) damage2 = 0; - - // 属 性の適用 - damage=battle_attr_fix(damage,s_ele, battle_get_element(target) ); - damage2=battle_attr_fix(damage2,s_ele_, battle_get_element(target) ); - - // 星のかけら、気球の適用 - damage += sd->star; - damage2 += sd->star_; - damage += sd->spiritball*3; - damage2 += sd->spiritball*3; - - if(sc_data && sc_data[SC_AURABLADE].timer!=-1){ /* オーラブレード 必中 */ - damage += sc_data[SC_AURABLADE].val1 * 10; - damage2 += sc_data[SC_AURABLADE].val1 * 10; - } - if(skill_num==PA_PRESSURE){ /* プレッシャー 必中? */ - damage = 700+100*skill_lv; - damage2 = 700+100*skill_lv; - } - - // >二刀流の左右ダメージ計算誰かやってくれぇぇぇぇえええ! - // >map_session_data に左手ダメージ(atk,atk2)追加して - // >pc_calcstatus()でやるべきかな? - // map_session_data に左手武器(atk,atk2,ele,star,atkmods)追加して - // pc_calcstatus()でデータを入力しています - - //左手のみ武器装備 - if(sd->weapontype1 == 0 && sd->weapontype2 > 0) { - damage = damage2; - damage2 = 0; - } - // 右手、左手修練の適用 - if(sd->status.weapon > 16) {// 二刀流か? - int dmg = damage, dmg2 = damage2; - // 右手修練(60% 〜 100%) 右手全般 - skill = pc_checkskill(sd,AS_RIGHT); - damage = damage * (50 + (skill * 10))/100; - if(dmg > 0 && damage < 1) damage = 1; - // 左手修練(40% 〜 80%) 左手全般 - skill = pc_checkskill(sd,AS_LEFT); - damage2 = damage2 * (30 + (skill * 10))/100; - if(dmg2 > 0 && damage2 < 1) damage2 = 1; - } - else //二刀流でなければ左手ダメージは0 - damage2 = 0; - - // 右手,短剣のみ - if(da == 1) { //ダブルアタックが発動しているか - div_ = 2; - damage += damage; - type = 0x08; - } - - if(sd->status.weapon == 16) { - // カタール追撃ダメージ - skill = pc_checkskill(sd,TF_DOUBLE); - damage2 = damage * (1 + (skill * 2))/100; - if(damage > 0 && damage2 < 1) damage2 = 1; - } - - // インベナム修正 - if(skill_num==TF_POISON){ - damage = battle_attr_fix(damage + 15*skill_lv, s_ele, battle_get_element(target) ); - } - if(skill_num==MC_CARTREVOLUTION){ - damage = battle_attr_fix(damage, 0, battle_get_element(target) ); - } - - // 完全回避の判定 - if(skill_num == 0 && skill_lv >= 0 && tsd!=NULL && div_ < 255 && MRAND(1000) < battle_get_flee2(target) ){ - damage=damage2=0; - type=0x0b; - dmg_lv = ATK_LUCKY; - } - - // 対象が完全回避をする設定がONなら - if(battle_config.enemy_perfect_flee) { - if(skill_num == 0 && skill_lv >= 0 && tmd!=NULL && div_ < 255 && MRAND(1000) < battle_get_flee2(target) ) { - damage=damage2=0; - type=0x0b; - dmg_lv = ATK_LUCKY; - } - } - - //MobのModeに頑強フラグが立っているときの処理 - if(t_mode&0x40){ - if(damage > 0) - damage = 1; - if(damage2 > 0) - damage2 = 1; - } - - //bNoWeaponDamage(設定アイテム無し?)でグランドクロスじゃない場合はダメージが0 - if( tsd && tsd->special_state.no_weapon_damage && skill_num != CR_GRANDCROSS) - damage = damage2 = 0; - - if(skill_num != CR_GRANDCROSS && (damage > 0 || damage2 > 0) ) { - if(damage2<1) // ダメージ最終修正 - damage=battle_calc_damage(src,target,damage,div_,skill_num,skill_lv,flag); - else if(damage<1) // 右手がミス? - damage2=battle_calc_damage(src,target,damage2,div_,skill_num,skill_lv,flag); - else { // 両 手/カタールの場合はちょっと計算ややこしい - int d1=damage+damage2,d2=damage2; - damage=battle_calc_damage(src,target,damage+damage2,div_,skill_num,skill_lv,flag); - damage2=(d2*100/d1)*damage/100; - if(damage > 1 && damage2 < 1) damage2=1; - damage-=damage2; - } - } - - /* For executioner card [Valaris] */ - if(src->type == BL_PC && sd->random_attack_increase_add > 0 && sd->random_attack_increase_per > 0 && skill_num == 0 ){ - if(MRAND(100) < sd->random_attack_increase_per){ - if(damage >0) damage*=sd->random_attack_increase_add/100; - if(damage2 >0) damage2*=sd->random_attack_increase_add/100; - } - } - /* End addition */ + if (damage < 0) + damage = 0; + if (damage2 < 0) + damage2 = 0; + + // 属 性の適用 + damage = battle_attr_fix (damage, s_ele, battle_get_element (target)); + damage2 = battle_attr_fix (damage2, s_ele_, battle_get_element (target)); + + // 星のかけら、気球の適用 + damage += sd->star; + damage2 += sd->star_; + damage += sd->spiritball * 3; + damage2 += sd->spiritball * 3; + + if (sc_data && sc_data[SC_AURABLADE].timer != -1) + { /* オーラブレード 必中 */ + damage += sc_data[SC_AURABLADE].val1 * 10; + damage2 += sc_data[SC_AURABLADE].val1 * 10; + } + if (skill_num == PA_PRESSURE) + { /* プレッシャー 必中? */ + damage = 700 + 100 * skill_lv; + damage2 = 700 + 100 * skill_lv; + } + + // >二刀流の左右ダメージ計算誰かやってくれぇぇぇぇえええ! + // >map_session_data に左手ダメージ(atk,atk2)追加して + // >pc_calcstatus()でやるべきかな? + // map_session_data に左手武器(atk,atk2,ele,star,atkmods)追加して + // pc_calcstatus()でデータを入力しています + + //左手のみ武器装備 + if (sd->weapontype1 == 0 && sd->weapontype2 > 0) + { + damage = damage2; + damage2 = 0; + } + // 右手、左手修練の適用 + if (sd->status.weapon > 16) + { // 二刀流か? + int dmg = damage, dmg2 = damage2; + // 右手修練(60% 〜 100%) 右手全般 + skill = pc_checkskill (sd, AS_RIGHT); + damage = damage * (50 + (skill * 10)) / 100; + if (dmg > 0 && damage < 1) + damage = 1; + // 左手修練(40% 〜 80%) 左手全般 + skill = pc_checkskill (sd, AS_LEFT); + damage2 = damage2 * (30 + (skill * 10)) / 100; + if (dmg2 > 0 && damage2 < 1) + damage2 = 1; + } + else //二刀流でなければ左手ダメージは0 + damage2 = 0; + + // 右手,短剣のみ + if (da == 1) + { //ダブルアタックが発動しているか + div_ = 2; + damage += damage; + type = 0x08; + } + + if (sd->status.weapon == 16) + { + // カタール追撃ダメージ + skill = pc_checkskill (sd, TF_DOUBLE); + damage2 = damage * (1 + (skill * 2)) / 100; + if (damage > 0 && damage2 < 1) + damage2 = 1; + } + + // インベナム修正 + if (skill_num == TF_POISON) + { + damage = + battle_attr_fix (damage + 15 * skill_lv, s_ele, + battle_get_element (target)); + } + if (skill_num == MC_CARTREVOLUTION) + { + damage = battle_attr_fix (damage, 0, battle_get_element (target)); + } + + // 完全回避の判定 + if (skill_num == 0 && skill_lv >= 0 && tsd != NULL && div_ < 255 + && MRAND (1000) < battle_get_flee2 (target)) + { + damage = damage2 = 0; + type = 0x0b; + dmg_lv = ATK_LUCKY; + } + + // 対象が完全回避をする設定がONなら + if (battle_config.enemy_perfect_flee) + { + if (skill_num == 0 && skill_lv >= 0 && tmd != NULL && div_ < 255 + && MRAND (1000) < battle_get_flee2 (target)) + { + damage = damage2 = 0; + type = 0x0b; + dmg_lv = ATK_LUCKY; + } + } + + //MobのModeに頑強フラグが立っているときの処理 + if (t_mode & 0x40) + { + if (damage > 0) + damage = 1; + if (damage2 > 0) + damage2 = 1; + } + + //bNoWeaponDamage(設定アイテム無し?)でグランドクロスじゃない場合はダメージが0 + if (tsd && tsd->special_state.no_weapon_damage + && skill_num != CR_GRANDCROSS) + damage = damage2 = 0; + + if (skill_num != CR_GRANDCROSS && (damage > 0 || damage2 > 0)) + { + if (damage2 < 1) // ダメージ最終修正 + damage = + battle_calc_damage (src, target, damage, div_, skill_num, + skill_lv, flag); + else if (damage < 1) // 右手がミス? + damage2 = + battle_calc_damage (src, target, damage2, div_, skill_num, + skill_lv, flag); + else + { // 両 手/カタールの場合はちょっと計算ややこしい + int d1 = damage + damage2, d2 = damage2; + damage = + battle_calc_damage (src, target, damage + damage2, div_, + skill_num, skill_lv, flag); + damage2 = (d2 * 100 / d1) * damage / 100; + if (damage > 1 && damage2 < 1) + damage2 = 1; + damage -= damage2; + } + } + + /* For executioner card [Valaris] */ + if (src->type == BL_PC && sd->random_attack_increase_add > 0 + && sd->random_attack_increase_per > 0 && skill_num == 0) + { + if (MRAND (100) < sd->random_attack_increase_per) + { + if (damage > 0) + damage *= sd->random_attack_increase_add / 100; + if (damage2 > 0) + damage2 *= sd->random_attack_increase_add / 100; + } + } + /* End addition */ // -- moonsoul (final combination of phys, mag damage for ASC_BREAKER) - if(skill_num == ASC_BREAKER) { - damage += damage3; - damage2 += damage3; - } - - wd.damage=damage; - wd.damage2=damage2; - wd.type=type; - wd.div_=div_; - wd.amotion=battle_get_amotion(src); - if(skill_num == KN_AUTOCOUNTER) - wd.amotion >>= 1; - wd.dmotion=battle_get_dmotion(target); - wd.blewcount=blewcount; - wd.flag=flag; - wd.dmg_lv=dmg_lv; - - return wd; + if (skill_num == ASC_BREAKER) + { + damage += damage3; + damage2 += damage3; + } + + wd.damage = damage; + wd.damage2 = damage2; + wd.type = type; + wd.div_ = div_; + wd.amotion = battle_get_amotion (src); + if (skill_num == KN_AUTOCOUNTER) + wd.amotion >>= 1; + wd.dmotion = battle_get_dmotion (target); + wd.blewcount = blewcount; + wd.flag = flag; + wd.dmg_lv = dmg_lv; + + return wd; } /*========================================== * 武器ダメージ計算 *------------------------------------------ */ -struct Damage battle_calc_weapon_attack( - struct block_list *src,struct block_list *target,int skill_num,int skill_lv,int wflag) +struct Damage battle_calc_weapon_attack (struct block_list *src, + struct block_list *target, + int skill_num, int skill_lv, + int wflag) { - struct Damage wd; - - //return前の処理があるので情報出力部のみ変更 - if (src == NULL || target == NULL) { - nullpo_info(NLP_MARK); - memset(&wd,0,sizeof(wd)); - return wd; - } - - else if(src->type == BL_PC) - wd = battle_calc_pc_weapon_attack(src,target,skill_num,skill_lv,wflag); // weapon breaking [Valaris] - else if(src->type == BL_MOB) - wd = battle_calc_mob_weapon_attack(src,target,skill_num,skill_lv,wflag); - else - memset(&wd,0,sizeof(wd)); - - if(battle_config.equipment_breaking && src->type==BL_PC && (wd.damage > 0 || wd.damage2 > 0)) { - struct map_session_data *sd=(struct map_session_data *)src; - if(sd->status.weapon && sd->status.weapon!=11) { - int breakrate=1; - if(target->type == BL_PC && sd->sc_data[SC_MELTDOWN].timer!=-1){ - breakrate+=100*sd->sc_data[SC_MELTDOWN].val1; - if(MRAND(10000) < breakrate*battle_config.equipment_break_rate/100 || breakrate >= 10000) - pc_breakweapon((struct map_session_data *)target); - } - if(sd->sc_data[SC_OVERTHRUST].timer!=-1) - breakrate+=20*sd->sc_data[SC_OVERTHRUST].val1; - if(wd.type==0x0a) - breakrate*=2; - if(MRAND(10000) < breakrate*battle_config.equipment_break_rate/100 || breakrate >= 10000) { - pc_breakweapon(sd); - memset(&wd,0,sizeof(wd)); - } - } - } - - if (battle_config.equipment_breaking && target->type == BL_PC && (wd.damage > 0 || wd.damage2 > 0)) { - int breakrate=1; - if(src->type==BL_PC && ((struct map_session_data *)src)->sc_data[SC_MELTDOWN].timer!=-1) breakrate+=70*((struct map_session_data *)src)->sc_data[SC_MELTDOWN].val1; - if (wd.type==0x0a) - breakrate*=2; - if (MRAND(10000) < breakrate*battle_config.equipment_break_rate/100 || breakrate >= 10000) { - pc_breakarmor((struct map_session_data *)target); - } - } - - return wd; + struct Damage wd; + + //return前の処理があるので情報出力部のみ変更 + if (src == NULL || target == NULL) + { + nullpo_info (NLP_MARK); + memset (&wd, 0, sizeof (wd)); + return wd; + } + + else if (src->type == BL_PC) + wd = battle_calc_pc_weapon_attack (src, target, skill_num, skill_lv, wflag); // weapon breaking [Valaris] + else if (src->type == BL_MOB) + wd = battle_calc_mob_weapon_attack (src, target, skill_num, skill_lv, + wflag); + else + memset (&wd, 0, sizeof (wd)); + + if (battle_config.equipment_breaking && src->type == BL_PC + && (wd.damage > 0 || wd.damage2 > 0)) + { + struct map_session_data *sd = (struct map_session_data *) src; + if (sd->status.weapon && sd->status.weapon != 11) + { + int breakrate = 1; + if (target->type == BL_PC && sd->sc_data[SC_MELTDOWN].timer != -1) + { + breakrate += 100 * sd->sc_data[SC_MELTDOWN].val1; + if (MRAND (10000) < + breakrate * battle_config.equipment_break_rate / 100 + || breakrate >= 10000) + pc_breakweapon ((struct map_session_data *) target); + } + if (sd->sc_data[SC_OVERTHRUST].timer != -1) + breakrate += 20 * sd->sc_data[SC_OVERTHRUST].val1; + if (wd.type == 0x0a) + breakrate *= 2; + if (MRAND (10000) < + breakrate * battle_config.equipment_break_rate / 100 + || breakrate >= 10000) + { + pc_breakweapon (sd); + memset (&wd, 0, sizeof (wd)); + } + } + } + + if (battle_config.equipment_breaking && target->type == BL_PC + && (wd.damage > 0 || wd.damage2 > 0)) + { + int breakrate = 1; + if (src->type == BL_PC + && ((struct map_session_data *) src)-> + sc_data[SC_MELTDOWN].timer != -1) + breakrate += + 70 * + ((struct map_session_data *) src)->sc_data[SC_MELTDOWN].val1; + if (wd.type == 0x0a) + breakrate *= 2; + if (MRAND (10000) < + breakrate * battle_config.equipment_break_rate / 100 + || breakrate >= 10000) + { + pc_breakarmor ((struct map_session_data *) target); + } + } + + return wd; } /*========================================== * 魔法ダメージ計算 *------------------------------------------ */ -struct Damage battle_calc_magic_attack( - struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag) - { - int mdef1=battle_get_mdef(target); - int mdef2=battle_get_mdef2(target); - int matk1,matk2,damage=0,div_=1,blewcount=skill_get_blewcount(skill_num,skill_lv),rdamage = 0; - struct Damage md; - int aflag; - int normalmagic_flag=1; - int ele=0,race=7,t_ele=0,t_race=7,t_mode = 0,cardfix,t_class,i; - struct map_session_data *sd=NULL,*tsd=NULL; - struct mob_data *tmd = NULL; - - - //return前の処理があるので情報出力部のみ変更 - if( bl == NULL || target == NULL ){ - nullpo_info(NLP_MARK); - memset(&md,0,sizeof(md)); - return md; - } - - matk1=battle_get_matk1(bl); - matk2=battle_get_matk2(bl); - ele = skill_get_pl(skill_num); - race = battle_get_race(bl); - t_ele = battle_get_elem_type(target); - t_race = battle_get_race(target); - t_mode = battle_get_mode(target); +struct Damage battle_calc_magic_attack (struct block_list *bl, + struct block_list *target, + int skill_num, int skill_lv, int flag) +{ + int mdef1 = battle_get_mdef (target); + int mdef2 = battle_get_mdef2 (target); + int matk1, matk2, damage = 0, div_ = 1, blewcount = + skill_get_blewcount (skill_num, skill_lv), rdamage = 0; + struct Damage md; + int aflag; + int normalmagic_flag = 1; + int ele = 0, race = 7, t_ele = 0, t_race = 7, t_mode = + 0, cardfix, t_class, i; + struct map_session_data *sd = NULL, *tsd = NULL; + struct mob_data *tmd = NULL; + + //return前の処理があるので情報出力部のみ変更 + if (bl == NULL || target == NULL) + { + nullpo_info (NLP_MARK); + memset (&md, 0, sizeof (md)); + return md; + } + + matk1 = battle_get_matk1 (bl); + matk2 = battle_get_matk2 (bl); + ele = skill_get_pl (skill_num); + race = battle_get_race (bl); + t_ele = battle_get_elem_type (target); + t_race = battle_get_race (target); + t_mode = battle_get_mode (target); #define MATK_FIX( a,b ) { matk1=matk1*(a)/(b); matk2=matk2*(a)/(b); } - if( bl->type==BL_PC && (sd=(struct map_session_data *)bl) ){ - sd->state.attack_type = BF_MAGIC; - if(sd->matk_rate != 100) - MATK_FIX(sd->matk_rate,100); - sd->state.arrow_atk = 0; - } - if( target->type==BL_PC ) - tsd=(struct map_session_data *)target; - else if( target->type==BL_MOB ) - tmd=(struct mob_data *)target; - - aflag=BF_MAGIC|BF_LONG|BF_SKILL; - - if(skill_num > 0){ - switch(skill_num){ // 基本ダメージ計算(スキルごとに処理) - // ヒールor聖体 - case AL_HEAL: - case PR_BENEDICTIO: - damage = skill_calc_heal(bl,skill_lv)/2; - normalmagic_flag=0; - break; - case PR_ASPERSIO: /* アスペルシオ */ - damage = 40; //固定ダメージ - normalmagic_flag=0; - break; - case PR_SANCTUARY: // サンクチュアリ - damage = (skill_lv>6)?388:skill_lv*50; - normalmagic_flag=0; - blewcount|=0x10000; - break; - case ALL_RESURRECTION: - case PR_TURNUNDEAD: // 攻撃リザレクションとターンアンデッド - if(target->type != BL_PC && battle_check_undead(t_race,t_ele)){ - int hp, mhp, thres; - hp = battle_get_hp(target); - mhp = battle_get_max_hp(target); - thres = (skill_lv * 20) + battle_get_luk(bl)+ - battle_get_int(bl) + battle_get_lv(bl)+ - ((200 - hp * 200 / mhp)); - if(thres > 700) thres = 700; -// if(battle_config.battle_log) -// printf("ターンアンデッド! 確率%d ‰(千分率)\n", thres); - if(MRAND(1000) < thres && !(t_mode&0x20)) // 成功 - damage = hp; - else // 失敗 - damage = battle_get_lv(bl) + battle_get_int(bl) + skill_lv * 10; - } - normalmagic_flag=0; - break; - - case MG_NAPALMBEAT: // ナパームビート(分散計算込み) - MATK_FIX(70+ skill_lv*10,100); - if(flag>0){ - MATK_FIX(1,flag); - }else { - if(battle_config.error_log) - printf("battle_calc_magic_attack(): napam enemy count=0 !\n"); - } - break; - case MG_FIREBALL: // ファイヤーボール - { - const int drate[]={100,90,70}; - if(flag>2) - matk1=matk2=0; - else - MATK_FIX( (95+skill_lv*5)*drate[flag] ,10000 ); - } - break; - case MG_FIREWALL: // ファイヤーウォール + if (bl->type == BL_PC && (sd = (struct map_session_data *) bl)) + { + sd->state.attack_type = BF_MAGIC; + if (sd->matk_rate != 100) + MATK_FIX (sd->matk_rate, 100); + sd->state.arrow_atk = 0; + } + if (target->type == BL_PC) + tsd = (struct map_session_data *) target; + else if (target->type == BL_MOB) + tmd = (struct mob_data *) target; + + aflag = BF_MAGIC | BF_LONG | BF_SKILL; + + if (skill_num > 0) + { + switch (skill_num) + { // 基本ダメージ計算(スキルごとに処理) + // ヒールor聖体 + case AL_HEAL: + case PR_BENEDICTIO: + damage = skill_calc_heal (bl, skill_lv) / 2; + normalmagic_flag = 0; + break; + case PR_ASPERSIO: /* アスペルシオ */ + damage = 40; //固定ダメージ + normalmagic_flag = 0; + break; + case PR_SANCTUARY: // サンクチュアリ + damage = (skill_lv > 6) ? 388 : skill_lv * 50; + normalmagic_flag = 0; + blewcount |= 0x10000; + break; + case ALL_RESURRECTION: + case PR_TURNUNDEAD: // 攻撃リザレクションとターンアンデッド + if (target->type != BL_PC + && battle_check_undead (t_race, t_ele)) + { + int hp, mhp, thres; + hp = battle_get_hp (target); + mhp = battle_get_max_hp (target); + thres = (skill_lv * 20) + battle_get_luk (bl) + + battle_get_int (bl) + battle_get_lv (bl) + + ((200 - hp * 200 / mhp)); + if (thres > 700) + thres = 700; +// if(battle_config.battle_log) +// printf("ターンアンデッド! 確率%d ‰(千分率)\n", thres); + if (MRAND (1000) < thres && !(t_mode & 0x20)) // 成功 + damage = hp; + else // 失敗 + damage = + battle_get_lv (bl) + battle_get_int (bl) + + skill_lv * 10; + } + normalmagic_flag = 0; + break; + + case MG_NAPALMBEAT: // ナパームビート(分散計算込み) + MATK_FIX (70 + skill_lv * 10, 100); + if (flag > 0) + { + MATK_FIX (1, flag); + } + else + { + if (battle_config.error_log) + printf + ("battle_calc_magic_attack(): napam enemy count=0 !\n"); + } + break; + case MG_FIREBALL: // ファイヤーボール + { + const int drate[] = { 100, 90, 70 }; + if (flag > 2) + matk1 = matk2 = 0; + else + MATK_FIX ((95 + skill_lv * 5) * drate[flag], 10000); + } + break; + case MG_FIREWALL: // ファイヤーウォール /* if( (t_ele!=3 && !battle_check_undead(t_race,t_ele)) || target->type==BL_PC ) //PCは火属性でも飛ぶ?そもそもダメージ受ける? blewcount |= 0x10000; else blewcount = 0; */ - if((t_ele==3 || battle_check_undead(t_race,t_ele)) && target->type!=BL_PC) - blewcount = 0; - else - blewcount |= 0x10000; - MATK_FIX( 1,2 ); - break; - case MG_THUNDERSTORM: // サンダーストーム - MATK_FIX( 80,100 ); - break; - case MG_FROSTDIVER: // フロストダイバ - MATK_FIX( 100+skill_lv*10, 100); - break; - case WZ_FROSTNOVA: // フロストダイバ - MATK_FIX( ((100+skill_lv*10)*(2/3)), 100); - break; - case WZ_FIREPILLAR: // ファイヤーピラー - if(mdef1 < 1000000) - mdef1=mdef2=0; // MDEF無視 - MATK_FIX( 1,5 ); - matk1+=50; - matk2+=50; - break; - case WZ_SIGHTRASHER: - MATK_FIX( 100+skill_lv*20, 100); - break; - case WZ_METEOR: - case WZ_JUPITEL: // ユピテルサンダー - break; - case WZ_VERMILION: // ロードオブバーミリオン - MATK_FIX( skill_lv*20+80, 100 ); - break; - case WZ_WATERBALL: // ウォーターボール - matk1+= skill_lv*30; - matk2+= skill_lv*30; - break; - case WZ_STORMGUST: // ストームガスト - MATK_FIX( skill_lv*40+100 ,100 ); - blewcount|=0x10000; - break; - case AL_HOLYLIGHT: // ホーリーライト - MATK_FIX( 125,100 ); - break; - case AL_RUWACH: - MATK_FIX( 145,100 ); - break; - case HW_NAPALMVULCAN: // ナパームビート(分散計算込み) - MATK_FIX(70+ skill_lv*10,100); - if(flag>0){ - MATK_FIX(1,flag); - }else { - if(battle_config.error_log) - printf("battle_calc_magic_attack(): napalmvulcan enemy count=0 !\n"); - } - break; - } - } - - if(normalmagic_flag){ // 一般魔法ダメージ計算 - int imdef_flag=0; - if(matk1>matk2) - damage= matk2+MRAND((matk1-matk2+1)); - else - damage= matk2; - if(sd) { - if(sd->ignore_mdef_ele & (1<<t_ele) || sd->ignore_mdef_race & (1<<t_race)) - imdef_flag = 1; - if(t_mode & 0x20) { - if(sd->ignore_mdef_race & (1<<10)) - imdef_flag = 1; - } - else { - if(sd->ignore_mdef_race & (1<<11)) - imdef_flag = 1; - } - } - if(!imdef_flag){ - if(battle_config.magic_defense_type) { - damage = damage - (mdef1 * battle_config.magic_defense_type) - mdef2; - } - else{ - damage = (damage*(100-mdef1))/100 - mdef2; - } - } - - if(damage<1) - damage=1; - } - - if(sd) { - cardfix=100; - cardfix=cardfix*(100+sd->magic_addrace[t_race])/100; - cardfix=cardfix*(100+sd->magic_addele[t_ele])/100; - if(t_mode & 0x20) - cardfix=cardfix*(100+sd->magic_addrace[10])/100; - else - cardfix=cardfix*(100+sd->magic_addrace[11])/100; - t_class = battle_get_class(target); - for(i=0;i<sd->add_magic_damage_class_count;i++) { - if(sd->add_magic_damage_classid[i] == t_class) { - cardfix=cardfix*(100+sd->add_magic_damage_classrate[i])/100; - break; - } - } - damage=damage*cardfix/100; - } - - if( tsd ){ - int s_class = battle_get_class(bl); - cardfix=100; - cardfix=cardfix*(100-tsd->subele[ele])/100; // 属 性によるダメージ耐性 - cardfix=cardfix*(100-tsd->subrace[race])/100; // 種族によるダメージ耐性 - cardfix=cardfix*(100-tsd->magic_subrace[race])/100; - if(battle_get_mode(bl) & 0x20) - cardfix=cardfix*(100-tsd->magic_subrace[10])/100; - else - cardfix=cardfix*(100-tsd->magic_subrace[11])/100; - for(i=0;i<tsd->add_mdef_class_count;i++) { - if(tsd->add_mdef_classid[i] == s_class) { - cardfix=cardfix*(100-tsd->add_mdef_classrate[i])/100; - break; - } - } - cardfix=cardfix*(100-tsd->magic_def_rate)/100; - damage=damage*cardfix/100; - } - if(damage < 0) damage = 0; - - damage=battle_attr_fix(damage, ele, battle_get_element(target) ); // 属 性修正 - - if(skill_num == CR_GRANDCROSS) { // グランドクロス - struct Damage wd; - wd=battle_calc_weapon_attack(bl,target,skill_num,skill_lv,flag); - damage = (damage + wd.damage) * (100 + 40*skill_lv)/100; - if(battle_config.gx_dupele) damage=battle_attr_fix(damage, ele, battle_get_element(target) ); //属性2回かかる - if(bl==target) damage=damage/2; //反動は半分 - } - - div_=skill_get_num( skill_num,skill_lv ); - - if(div_>1 && skill_num != WZ_VERMILION) - damage*=div_; - -// if(mdef1 >= 1000000 && damage > 0) - if(t_mode&0x40 && damage > 0) - damage = 1; - - if( tsd && tsd->special_state.no_magic_damage) { - if (battle_config.gtb_pvp_only != 0) { // [MouseJstr] - if ((map[target->m].flag.pvp || map[target->m].flag.gvg) && target->type==BL_PC) - damage = (damage * (100 - battle_config.gtb_pvp_only)) / 100; - } else - damage=0; // 黄 金蟲カード(魔法ダメージ0) + if ((t_ele == 3 || battle_check_undead (t_race, t_ele)) + && target->type != BL_PC) + blewcount = 0; + else + blewcount |= 0x10000; + MATK_FIX (1, 2); + break; + case MG_THUNDERSTORM: // サンダーストーム + MATK_FIX (80, 100); + break; + case MG_FROSTDIVER: // フロストダイバ + MATK_FIX (100 + skill_lv * 10, 100); + break; + case WZ_FROSTNOVA: // フロストダイバ + MATK_FIX (((100 + skill_lv * 10) * (2 / 3)), 100); + break; + case WZ_FIREPILLAR: // ファイヤーピラー + if (mdef1 < 1000000) + mdef1 = mdef2 = 0; // MDEF無視 + MATK_FIX (1, 5); + matk1 += 50; + matk2 += 50; + break; + case WZ_SIGHTRASHER: + MATK_FIX (100 + skill_lv * 20, 100); + break; + case WZ_METEOR: + case WZ_JUPITEL: // ユピテルサンダー + break; + case WZ_VERMILION: // ロードオブバーミリオン + MATK_FIX (skill_lv * 20 + 80, 100); + break; + case WZ_WATERBALL: // ウォーターボール + matk1 += skill_lv * 30; + matk2 += skill_lv * 30; + break; + case WZ_STORMGUST: // ストームガスト + MATK_FIX (skill_lv * 40 + 100, 100); + blewcount |= 0x10000; + break; + case AL_HOLYLIGHT: // ホーリーライト + MATK_FIX (125, 100); + break; + case AL_RUWACH: + MATK_FIX (145, 100); + break; + case HW_NAPALMVULCAN: // ナパームビート(分散計算込み) + MATK_FIX (70 + skill_lv * 10, 100); + if (flag > 0) + { + MATK_FIX (1, flag); + } + else + { + if (battle_config.error_log) + printf + ("battle_calc_magic_attack(): napalmvulcan enemy count=0 !\n"); + } + break; + } + } + + if (normalmagic_flag) + { // 一般魔法ダメージ計算 + int imdef_flag = 0; + if (matk1 > matk2) + damage = matk2 + MRAND ((matk1 - matk2 + 1)); + else + damage = matk2; + if (sd) + { + if (sd->ignore_mdef_ele & (1 << t_ele) + || sd->ignore_mdef_race & (1 << t_race)) + imdef_flag = 1; + if (t_mode & 0x20) + { + if (sd->ignore_mdef_race & (1 << 10)) + imdef_flag = 1; + } + else + { + if (sd->ignore_mdef_race & (1 << 11)) + imdef_flag = 1; + } + } + if (!imdef_flag) + { + if (battle_config.magic_defense_type) + { + damage = + damage - (mdef1 * battle_config.magic_defense_type) - + mdef2; + } + else + { + damage = (damage * (100 - mdef1)) / 100 - mdef2; + } } - damage=battle_calc_damage(bl,target,damage,div_,skill_num,skill_lv,aflag); // 最終修正 - - /* magic_damage_return by [AppleGirl] and [Valaris] */ - if( target->type==BL_PC && tsd && tsd->magic_damage_return > 0 ){ - rdamage += damage * tsd->magic_damage_return / 100; - if(rdamage < 1) rdamage = 1; - clif_damage(target,bl,gettick(),0,0,rdamage,0,0,0); - battle_damage(target,bl,rdamage,0); - } - /* end magic_damage_return */ - - md.damage=damage; - md.div_=div_; - md.amotion=battle_get_amotion(bl); - md.dmotion=battle_get_dmotion(target); - md.damage2=0; - md.type=0; - md.blewcount=blewcount; - md.flag=aflag; - - return md; + if (damage < 1) + damage = 1; + } + + if (sd) + { + cardfix = 100; + cardfix = cardfix * (100 + sd->magic_addrace[t_race]) / 100; + cardfix = cardfix * (100 + sd->magic_addele[t_ele]) / 100; + if (t_mode & 0x20) + cardfix = cardfix * (100 + sd->magic_addrace[10]) / 100; + else + cardfix = cardfix * (100 + sd->magic_addrace[11]) / 100; + t_class = battle_get_class (target); + for (i = 0; i < sd->add_magic_damage_class_count; i++) + { + if (sd->add_magic_damage_classid[i] == t_class) + { + cardfix = + cardfix * (100 + sd->add_magic_damage_classrate[i]) / 100; + break; + } + } + damage = damage * cardfix / 100; + } + + if (tsd) + { + int s_class = battle_get_class (bl); + cardfix = 100; + cardfix = cardfix * (100 - tsd->subele[ele]) / 100; // 属 性によるダメージ耐性 + cardfix = cardfix * (100 - tsd->subrace[race]) / 100; // 種族によるダメージ耐性 + cardfix = cardfix * (100 - tsd->magic_subrace[race]) / 100; + if (battle_get_mode (bl) & 0x20) + cardfix = cardfix * (100 - tsd->magic_subrace[10]) / 100; + else + cardfix = cardfix * (100 - tsd->magic_subrace[11]) / 100; + for (i = 0; i < tsd->add_mdef_class_count; i++) + { + if (tsd->add_mdef_classid[i] == s_class) + { + cardfix = cardfix * (100 - tsd->add_mdef_classrate[i]) / 100; + break; + } + } + cardfix = cardfix * (100 - tsd->magic_def_rate) / 100; + damage = damage * cardfix / 100; + } + if (damage < 0) + damage = 0; + + damage = battle_attr_fix (damage, ele, battle_get_element (target)); // 属 性修正 + + if (skill_num == CR_GRANDCROSS) + { // グランドクロス + struct Damage wd; + wd = battle_calc_weapon_attack (bl, target, skill_num, skill_lv, + flag); + damage = (damage + wd.damage) * (100 + 40 * skill_lv) / 100; + if (battle_config.gx_dupele) + damage = battle_attr_fix (damage, ele, battle_get_element (target)); //属性2回かかる + if (bl == target) + damage = damage / 2; //反動は半分 + } + + div_ = skill_get_num (skill_num, skill_lv); + + if (div_ > 1 && skill_num != WZ_VERMILION) + damage *= div_; + +// if(mdef1 >= 1000000 && damage > 0) + if (t_mode & 0x40 && damage > 0) + damage = 1; + + if (tsd && tsd->special_state.no_magic_damage) + { + if (battle_config.gtb_pvp_only != 0) + { // [MouseJstr] + if ((map[target->m].flag.pvp || map[target->m].flag.gvg) + && target->type == BL_PC) + damage = (damage * (100 - battle_config.gtb_pvp_only)) / 100; + } + else + damage = 0; // 黄 金蟲カード(魔法ダメージ0) + } + + damage = battle_calc_damage (bl, target, damage, div_, skill_num, skill_lv, aflag); // 最終修正 + + /* magic_damage_return by [AppleGirl] and [Valaris] */ + if (target->type == BL_PC && tsd && tsd->magic_damage_return > 0) + { + rdamage += damage * tsd->magic_damage_return / 100; + if (rdamage < 1) + rdamage = 1; + clif_damage (target, bl, gettick (), 0, 0, rdamage, 0, 0, 0); + battle_damage (target, bl, rdamage, 0); + } + /* end magic_damage_return */ + + md.damage = damage; + md.div_ = div_; + md.amotion = battle_get_amotion (bl); + md.dmotion = battle_get_dmotion (target); + md.damage2 = 0; + md.type = 0; + md.blewcount = blewcount; + md.flag = aflag; + + return md; } /*========================================== * その他ダメージ計算 *------------------------------------------ */ -struct Damage battle_calc_misc_attack( - struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag) +struct Damage battle_calc_misc_attack (struct block_list *bl, + struct block_list *target, + int skill_num, int skill_lv, int flag) { - int int_=battle_get_int(bl); -// int luk=battle_get_luk(bl); - int dex=battle_get_dex(bl); - int skill,ele,race,cardfix; - struct map_session_data *sd=NULL,*tsd=NULL; - int damage=0,div_=1,blewcount=skill_get_blewcount(skill_num,skill_lv); - struct Damage md; - int damagefix=1; - - int aflag=BF_MISC|BF_LONG|BF_SKILL; - - //return前の処理があるので情報出力部のみ変更 - if( bl == NULL || target == NULL ){ - nullpo_info(NLP_MARK); - memset(&md,0,sizeof(md)); - return md; - } - - if( bl->type == BL_PC && (sd=(struct map_session_data *)bl) ) { - sd->state.attack_type = BF_MISC; - sd->state.arrow_atk = 0; - } - - if( target->type==BL_PC ) - tsd=(struct map_session_data *)target; - - switch(skill_num){ - - case HT_LANDMINE: // ランドマイン - damage=skill_lv*(dex+75)*(100+int_)/100; - break; - - case HT_BLASTMINE: // ブラストマイン - damage=skill_lv*(dex/2+50)*(100+int_)/100; - break; - - case HT_CLAYMORETRAP: // クレイモアートラップ - damage=skill_lv*(dex/2+75)*(100+int_)/100; - break; - - case HT_BLITZBEAT: // ブリッツビート - if( sd==NULL || (skill = pc_checkskill(sd,HT_STEELCROW)) <= 0) - skill=0; - damage=(dex/10+int_/2+skill*3+40)*2; - if(flag > 1) - damage /= flag; - break; - - case TF_THROWSTONE: // 石投げ - damage=30; - damagefix=0; - break; - - case BA_DISSONANCE: // 不協和音 - damage=(skill_lv)*20+pc_checkskill(sd,BA_MUSICALLESSON)*3; - break; - - case NPC_SELFDESTRUCTION: // 自爆 - damage=battle_get_hp(bl)-(bl==target?1:0); - damagefix=0; - break; - - case NPC_SMOKING: // タバコを吸う - damage=3; - damagefix=0; - break; - - case NPC_DARKBREATH: - { - struct status_change *sc_data = battle_get_sc_data(target); - int hitrate=battle_get_hit(bl) - battle_get_flee(target) + 80; - hitrate = ( (hitrate>95)?95: ((hitrate<5)?5:hitrate) ); - if(sc_data && (sc_data[SC_SLEEP].timer!=-1 || sc_data[SC_STAN].timer!=-1 || - sc_data[SC_FREEZE].timer!=-1 || (sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0) ) ) - hitrate = 1000000; - if(MRAND(100) < hitrate) { - damage = 500 + (skill_lv-1)*1000 + MRAND(1000); - if(damage > 9999) damage = 9999; - } - } - break; - case SN_FALCONASSAULT: /* ファルコンアサルト */ - skill = pc_checkskill(sd,HT_BLITZBEAT); - damage=(100+50*skill_lv+(dex/10+int_/2+skill*3+40)*2); - break; - } - - ele = skill_get_pl(skill_num); - race = battle_get_race(bl); - - if(damagefix){ - if(damage<1 && skill_num != NPC_DARKBREATH) - damage=1; - - if( tsd ){ - cardfix=100; - cardfix=cardfix*(100-tsd->subele[ele])/100; // 属性によるダメージ耐性 - cardfix=cardfix*(100-tsd->subrace[race])/100; // 種族によるダメージ耐性 - cardfix=cardfix*(100-tsd->misc_def_rate)/100; - damage=damage*cardfix/100; - } - if(damage < 0) damage = 0; - damage=battle_attr_fix(damage, ele, battle_get_element(target) ); // 属性修正 - } - - div_=skill_get_num( skill_num,skill_lv ); - if(div_>1) - damage*=div_; - - if(damage > 0 && (damage < div_ || (battle_get_def(target) >= 1000000 && battle_get_mdef(target) >= 1000000) ) ) { - damage = div_; - } - - damage=battle_calc_damage(bl,target,damage,div_,skill_num,skill_lv,aflag); // 最終修正 - - md.damage=damage; - md.div_=div_; - md.amotion=battle_get_amotion(bl); - md.dmotion=battle_get_dmotion(target); - md.damage2=0; - md.type=0; - md.blewcount=blewcount; - md.flag=aflag; - return md; + int int_ = battle_get_int (bl); +// int luk=battle_get_luk(bl); + int dex = battle_get_dex (bl); + int skill, ele, race, cardfix; + struct map_session_data *sd = NULL, *tsd = NULL; + int damage = 0, div_ = 1, blewcount = + skill_get_blewcount (skill_num, skill_lv); + struct Damage md; + int damagefix = 1; + + int aflag = BF_MISC | BF_LONG | BF_SKILL; + + //return前の処理があるので情報出力部のみ変更 + if (bl == NULL || target == NULL) + { + nullpo_info (NLP_MARK); + memset (&md, 0, sizeof (md)); + return md; + } + + if (bl->type == BL_PC && (sd = (struct map_session_data *) bl)) + { + sd->state.attack_type = BF_MISC; + sd->state.arrow_atk = 0; + } + + if (target->type == BL_PC) + tsd = (struct map_session_data *) target; + + switch (skill_num) + { + + case HT_LANDMINE: // ランドマイン + damage = skill_lv * (dex + 75) * (100 + int_) / 100; + break; + + case HT_BLASTMINE: // ブラストマイン + damage = skill_lv * (dex / 2 + 50) * (100 + int_) / 100; + break; + + case HT_CLAYMORETRAP: // クレイモアートラップ + damage = skill_lv * (dex / 2 + 75) * (100 + int_) / 100; + break; + + case HT_BLITZBEAT: // ブリッツビート + if (sd == NULL || (skill = pc_checkskill (sd, HT_STEELCROW)) <= 0) + skill = 0; + damage = (dex / 10 + int_ / 2 + skill * 3 + 40) * 2; + if (flag > 1) + damage /= flag; + break; + + case TF_THROWSTONE: // 石投げ + damage = 30; + damagefix = 0; + break; + + case BA_DISSONANCE: // 不協和音 + damage = + (skill_lv) * 20 + pc_checkskill (sd, BA_MUSICALLESSON) * 3; + break; + + case NPC_SELFDESTRUCTION: // 自爆 + damage = battle_get_hp (bl) - (bl == target ? 1 : 0); + damagefix = 0; + break; + + case NPC_SMOKING: // タバコを吸う + damage = 3; + damagefix = 0; + break; + + case NPC_DARKBREATH: + { + struct status_change *sc_data = battle_get_sc_data (target); + int hitrate = + battle_get_hit (bl) - battle_get_flee (target) + 80; + hitrate = ((hitrate > 95) ? 95 : ((hitrate < 5) ? 5 : hitrate)); + if (sc_data + && (sc_data[SC_SLEEP].timer != -1 + || sc_data[SC_STAN].timer != -1 + || sc_data[SC_FREEZE].timer != -1 + || (sc_data[SC_STONE].timer != -1 + && sc_data[SC_STONE].val2 == 0))) + hitrate = 1000000; + if (MRAND (100) < hitrate) + { + damage = 500 + (skill_lv - 1) * 1000 + MRAND (1000); + if (damage > 9999) + damage = 9999; + } + } + break; + case SN_FALCONASSAULT: /* ファルコンアサルト */ + skill = pc_checkskill (sd, HT_BLITZBEAT); + damage = + (100 + 50 * skill_lv + + (dex / 10 + int_ / 2 + skill * 3 + 40) * 2); + break; + } + + ele = skill_get_pl (skill_num); + race = battle_get_race (bl); + + if (damagefix) + { + if (damage < 1 && skill_num != NPC_DARKBREATH) + damage = 1; + + if (tsd) + { + cardfix = 100; + cardfix = cardfix * (100 - tsd->subele[ele]) / 100; // 属性によるダメージ耐性 + cardfix = cardfix * (100 - tsd->subrace[race]) / 100; // 種族によるダメージ耐性 + cardfix = cardfix * (100 - tsd->misc_def_rate) / 100; + damage = damage * cardfix / 100; + } + if (damage < 0) + damage = 0; + damage = battle_attr_fix (damage, ele, battle_get_element (target)); // 属性修正 + } + + div_ = skill_get_num (skill_num, skill_lv); + if (div_ > 1) + damage *= div_; + + if (damage > 0 + && (damage < div_ + || (battle_get_def (target) >= 1000000 + && battle_get_mdef (target) >= 1000000))) + { + damage = div_; + } + + damage = battle_calc_damage (bl, target, damage, div_, skill_num, skill_lv, aflag); // 最終修正 + + md.damage = damage; + md.div_ = div_; + md.amotion = battle_get_amotion (bl); + md.dmotion = battle_get_dmotion (target); + md.damage2 = 0; + md.type = 0; + md.blewcount = blewcount; + md.flag = aflag; + return md; } + /*========================================== * ダメージ計算一括処理用 *------------------------------------------ */ -struct Damage battle_calc_attack( int attack_type, - struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag) +struct Damage battle_calc_attack (int attack_type, + struct block_list *bl, + struct block_list *target, int skill_num, + int skill_lv, int flag) { - struct Damage d; - memset(&d, 0, sizeof(d)); - - switch(attack_type){ - case BF_WEAPON: - return battle_calc_weapon_attack(bl,target,skill_num,skill_lv,flag); - case BF_MAGIC: - return battle_calc_magic_attack(bl,target,skill_num,skill_lv,flag); - case BF_MISC: - return battle_calc_misc_attack(bl,target,skill_num,skill_lv,flag); - default: - if(battle_config.error_log) - printf("battle_calc_attack: unknwon attack type ! %d\n",attack_type); - break; - } - return d; + struct Damage d; + memset (&d, 0, sizeof (d)); + + switch (attack_type) + { + case BF_WEAPON: + return battle_calc_weapon_attack (bl, target, skill_num, skill_lv, + flag); + case BF_MAGIC: + return battle_calc_magic_attack (bl, target, skill_num, skill_lv, + flag); + case BF_MISC: + return battle_calc_misc_attack (bl, target, skill_num, skill_lv, + flag); + default: + if (battle_config.error_log) + printf ("battle_calc_attack: unknwon attack type ! %d\n", + attack_type); + break; + } + return d; } + /*========================================== * 通常攻撃処理まとめ *------------------------------------------ */ -int battle_weapon_attack( struct block_list *src,struct block_list *target, - unsigned int tick,int flag) +int battle_weapon_attack (struct block_list *src, struct block_list *target, + unsigned int tick, int flag) { - struct map_session_data *sd=NULL; - struct status_change *sc_data = battle_get_sc_data(src),*t_sc_data=battle_get_sc_data(target); - short *opt1; - int race = 7, ele = 0; - int damage,rdamage = 0; - struct Damage wd; - - nullpo_retr(0, src); - nullpo_retr(0, target); - - if(src->type == BL_PC) - sd = (struct map_session_data *)src; - - if(src->prev == NULL || target->prev == NULL) - return 0; - if(src->type == BL_PC && pc_isdead(sd)) - return 0; - if(target->type == BL_PC && pc_isdead((struct map_session_data *)target)) - return 0; - - opt1=battle_get_opt1(src); - if(opt1 && *opt1 > 0) { - battle_stopattack(src); - return 0; - } - if(sc_data && sc_data[SC_BLADESTOP].timer!=-1){ - battle_stopattack(src); - return 0; - } - - race = battle_get_race(target); - ele = battle_get_elem_type(target); - if(battle_check_target(src,target,BCT_ENEMY) > 0 && - battle_check_range(src,target,0)){ - // 攻撃対象となりうるので攻撃 - if(sd && sd->status.weapon == 11) { - if(sd->equip_index[10] >= 0) { - if(battle_config.arrow_decrement) - pc_delitem(sd,sd->equip_index[10],1,0); - } - else { - clif_arrow_fail(sd,0); - return 0; - } - } - if(flag&0x8000) { - if(sd && battle_config.pc_attack_direction_change) - sd->dir = sd->head_dir = map_calc_dir(src, target->x,target->y ); - else if(src->type == BL_MOB && battle_config.monster_attack_direction_change) - ((struct mob_data *)src)->dir = map_calc_dir(src, target->x,target->y ); - wd=battle_calc_weapon_attack(src,target,KN_AUTOCOUNTER,flag&0xff,0); - } - else - wd=battle_calc_weapon_attack(src,target,0,0,0); - - // significantly increase injuries for hasted characters - if (wd.damage > 0 - && (t_sc_data[SC_HASTE].timer != -1)) { - wd.damage = (wd.damage * (16 + t_sc_data[SC_HASTE].val1)) >> 4; - } + struct map_session_data *sd = NULL; + struct status_change *sc_data = battle_get_sc_data (src), *t_sc_data = + battle_get_sc_data (target); + short *opt1; + int race = 7, ele = 0; + int damage, rdamage = 0; + struct Damage wd; + + nullpo_retr (0, src); + nullpo_retr (0, target); + + if (src->type == BL_PC) + sd = (struct map_session_data *) src; + + if (src->prev == NULL || target->prev == NULL) + return 0; + if (src->type == BL_PC && pc_isdead (sd)) + return 0; + if (target->type == BL_PC + && pc_isdead ((struct map_session_data *) target)) + return 0; + + opt1 = battle_get_opt1 (src); + if (opt1 && *opt1 > 0) + { + battle_stopattack (src); + return 0; + } + if (sc_data && sc_data[SC_BLADESTOP].timer != -1) + { + battle_stopattack (src); + return 0; + } + + race = battle_get_race (target); + ele = battle_get_elem_type (target); + if (battle_check_target (src, target, BCT_ENEMY) > 0 && + battle_check_range (src, target, 0)) + { + // 攻撃対象となりうるので攻撃 + if (sd && sd->status.weapon == 11) + { + if (sd->equip_index[10] >= 0) + { + if (battle_config.arrow_decrement) + pc_delitem (sd, sd->equip_index[10], 1, 0); + } + else + { + clif_arrow_fail (sd, 0); + return 0; + } + } + if (flag & 0x8000) + { + if (sd && battle_config.pc_attack_direction_change) + sd->dir = sd->head_dir = + map_calc_dir (src, target->x, target->y); + else if (src->type == BL_MOB + && battle_config.monster_attack_direction_change) + ((struct mob_data *) src)->dir = + map_calc_dir (src, target->x, target->y); + wd = battle_calc_weapon_attack (src, target, KN_AUTOCOUNTER, + flag & 0xff, 0); + } + else + wd = battle_calc_weapon_attack (src, target, 0, 0, 0); + + // significantly increase injuries for hasted characters + if (wd.damage > 0 && (t_sc_data[SC_HASTE].timer != -1)) + { + wd.damage = (wd.damage * (16 + t_sc_data[SC_HASTE].val1)) >> 4; + } - if (wd.damage > 0 - && t_sc_data[SC_PHYS_SHIELD].timer != -1 && target->type == BL_PC) { - int reduction = t_sc_data[SC_PHYS_SHIELD].val1; - if (reduction > wd.damage) - reduction = wd.damage; + if (wd.damage > 0 + && t_sc_data[SC_PHYS_SHIELD].timer != -1 && target->type == BL_PC) + { + int reduction = t_sc_data[SC_PHYS_SHIELD].val1; + if (reduction > wd.damage) + reduction = wd.damage; - wd.damage -= reduction; - MAP_LOG_PC(((struct map_session_data *)target), "MAGIC-ABSORB-DMG %d", reduction); + wd.damage -= reduction; + MAP_LOG_PC (((struct map_session_data *) target), + "MAGIC-ABSORB-DMG %d", reduction); + } + + if ((damage = wd.damage + wd.damage2) > 0 && src != target) + { + if (wd.flag & BF_SHORT) + { + if (target->type == BL_PC) + { + struct map_session_data *tsd = + (struct map_session_data *) target; + if (tsd && tsd->short_weapon_damage_return > 0) + { + rdamage += + damage * tsd->short_weapon_damage_return / 100; + if (rdamage < 1) + rdamage = 1; + } + } + if (t_sc_data && t_sc_data[SC_REFLECTSHIELD].timer != -1) + { + rdamage += + damage * t_sc_data[SC_REFLECTSHIELD].val2 / 100; + if (rdamage < 1) + rdamage = 1; } + } + else if (wd.flag & BF_LONG) + { + if (target->type == BL_PC) + { + struct map_session_data *tsd = + (struct map_session_data *) target; + if (tsd && tsd->long_weapon_damage_return > 0) + { + rdamage += + damage * tsd->long_weapon_damage_return / 100; + if (rdamage < 1) + rdamage = 1; + } + } + } - if((damage = wd.damage + wd.damage2) > 0 && src != target) { - if(wd.flag&BF_SHORT) { - if(target->type == BL_PC) { - struct map_session_data *tsd = (struct map_session_data *)target; - if(tsd && tsd->short_weapon_damage_return > 0) { - rdamage += damage * tsd->short_weapon_damage_return / 100; - if(rdamage < 1) rdamage = 1; - } - } - if(t_sc_data && t_sc_data[SC_REFLECTSHIELD].timer != -1) { - rdamage += damage * t_sc_data[SC_REFLECTSHIELD].val2 / 100; - if(rdamage < 1) rdamage = 1; - } - } - else if(wd.flag&BF_LONG) { - if(target->type == BL_PC) { - struct map_session_data *tsd = (struct map_session_data *)target; - if(tsd && tsd->long_weapon_damage_return > 0) { - rdamage += damage * tsd->long_weapon_damage_return / 100; - if(rdamage < 1) rdamage = 1; - } - } - } + if (rdamage > 0) + clif_damage (src, src, tick, wd.amotion, 0, rdamage, 1, 4, 0); + } - if(rdamage > 0) - clif_damage(src,src,tick, wd.amotion,0,rdamage,1,4,0); - } + if (wd.div_ == 255 && sd) + { //三段掌 + int delay = + 1000 - 4 * battle_get_agi (src) - 2 * battle_get_dex (src); + int skilllv; + if (wd.damage + wd.damage2 < battle_get_hp (target)) + { + if ((skilllv = pc_checkskill (sd, MO_CHAINCOMBO)) > 0) + delay += 300 * battle_config.combo_delay_rate / 100; //追加ディレイをconfにより調整 + + skill_status_change_start (src, SC_COMBO, MO_TRIPLEATTACK, + skilllv, 0, 0, delay, 0); + } + sd->attackabletime = sd->canmove_tick = tick + delay; + clif_combo_delay (src, delay); + clif_skill_damage (src, target, tick, wd.amotion, wd.dmotion, + wd.damage, 3, MO_TRIPLEATTACK, + pc_checkskill (sd, MO_TRIPLEATTACK), -1); + } + else + { + clif_damage (src, target, tick, wd.amotion, wd.dmotion, + wd.damage, wd.div_, wd.type, wd.damage2); + //二刀流左手とカタール追撃のミス表示(無理やり〜) + if (sd && sd->status.weapon >= 16 && wd.damage2 == 0) + clif_damage (src, target, tick + 10, wd.amotion, wd.dmotion, + 0, 1, 0, 0); + } + if (sd && sd->splash_range > 0 && (wd.damage > 0 || wd.damage2 > 0)) + skill_castend_damage_id (src, target, 0, -1, tick, 0); + map_freeblock_lock (); + + if (src->type == BL_PC) + { + int weapon_index = sd->equip_index[9]; + int weapon = 0; + if (sd->inventory_data[weapon_index] + && sd->status.inventory[weapon_index].equip & 0x2) + weapon = sd->inventory_data[weapon_index]->nameid; + + MAP_LOG ("PC%d %d:%d,%d WPNDMG %s%d %d FOR %d WPN %d", + sd->status.char_id, src->m, src->x, src->y, + (target->type == BL_PC) ? "PC" : "MOB", + (target->type == + BL_PC) ? ((struct map_session_data *) target)-> + status.char_id : target->id, + (target->type == + BL_PC) ? 0 : ((struct mob_data *) target)->class, + wd.damage + wd.damage2, weapon); + } - if (wd.div_ == 255 && sd) { //三段掌 - int delay = 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src); - int skilllv; - if(wd.damage+wd.damage2 < battle_get_hp(target)) { - if((skilllv = pc_checkskill(sd, MO_CHAINCOMBO)) > 0) - delay += 300 * battle_config.combo_delay_rate /100; //追加ディレイをconfにより調整 + if (target->type == BL_PC) + { + struct map_session_data *sd2 = (struct map_session_data *) target; + MAP_LOG ("PC%d %d:%d,%d WPNINJURY %s%d %d FOR %d", + sd2->status.char_id, target->m, target->x, target->y, + (src->type == BL_PC) ? "PC" : "MOB", + (src->type == + BL_PC) ? ((struct map_session_data *) src)-> + status.char_id : src->id, + (src->type == + BL_PC) ? 0 : ((struct mob_data *) src)->class, + wd.damage + wd.damage2); + } - skill_status_change_start(src,SC_COMBO,MO_TRIPLEATTACK,skilllv,0,0,delay,0); - } - sd->attackabletime = sd->canmove_tick = tick + delay; - clif_combo_delay(src,delay); - clif_skill_damage(src , target , tick , wd.amotion , wd.dmotion , - wd.damage , 3 , MO_TRIPLEATTACK, pc_checkskill(sd,MO_TRIPLEATTACK) , -1 ); - } - else { - clif_damage(src,target,tick, wd.amotion, wd.dmotion, - wd.damage, wd.div_ , wd.type, wd.damage2); - //二刀流左手とカタール追撃のミス表示(無理やり〜) - if(sd && sd->status.weapon >= 16 && wd.damage2 == 0) - clif_damage(src,target,tick+10, wd.amotion, wd.dmotion,0, 1, 0, 0); - } - if(sd && sd->splash_range > 0 && (wd.damage > 0 || wd.damage2 > 0) ) - skill_castend_damage_id(src,target,0,-1,tick,0); - map_freeblock_lock(); - - if (src->type == BL_PC) { - int weapon_index = sd->equip_index[9]; - int weapon = 0; - if (sd->inventory_data[weapon_index] && sd->status.inventory[weapon_index].equip & 0x2) - weapon = sd->inventory_data[weapon_index]->nameid; - - MAP_LOG("PC%d %d:%d,%d WPNDMG %s%d %d FOR %d WPN %d", - sd->status.char_id, src->m, src->x, src->y, - (target->type == BL_PC)? "PC" : "MOB", - (target->type == BL_PC)? ((struct map_session_data *) target)->status.char_id : target->id, - (target->type == BL_PC)? 0 : ((struct mob_data *)target)->class, - wd.damage+wd.damage2, - weapon - ); + battle_damage (src, target, (wd.damage + wd.damage2), 0); + if (target->prev != NULL && + (target->type != BL_PC + || (target->type == BL_PC + && !pc_isdead ((struct map_session_data *) target)))) + { + if (wd.damage > 0 || wd.damage2 > 0) + { + skill_additional_effect (src, target, 0, 0, BF_WEAPON, tick); + if (sd) + { + if (sd->weapon_coma_ele[ele] > 0 + && MRAND (10000) < sd->weapon_coma_ele[ele]) + battle_damage (src, target, + battle_get_max_hp (target), 1); + if (sd->weapon_coma_race[race] > 0 + && MRAND (10000) < sd->weapon_coma_race[race]) + battle_damage (src, target, + battle_get_max_hp (target), 1); + if (battle_get_mode (target) & 0x20) + { + if (sd->weapon_coma_race[10] > 0 + && MRAND (10000) < sd->weapon_coma_race[10]) + battle_damage (src, target, + battle_get_max_hp (target), 1); + } + else + { + if (sd->weapon_coma_race[11] > 0 + && MRAND (10000) < sd->weapon_coma_race[11]) + battle_damage (src, target, + battle_get_max_hp (target), 1); + } } - - if (target->type == BL_PC) { - struct map_session_data *sd2 = (struct map_session_data *) target; - MAP_LOG("PC%d %d:%d,%d WPNINJURY %s%d %d FOR %d", - sd2->status.char_id, target->m, target->x, target->y, - (src->type == BL_PC)? "PC" : "MOB", - (src->type == BL_PC)? ((struct map_session_data *) src)->status.char_id : src->id, - (src->type == BL_PC)? 0 : ((struct mob_data *)src)->class, - wd.damage+wd.damage2); + } + } + if (sc_data && sc_data[SC_AUTOSPELL].timer != -1 + && MRAND (100) < sc_data[SC_AUTOSPELL].val4) + { + int skilllv = sc_data[SC_AUTOSPELL].val3, i, f = 0; + i = MRAND (100); + if (i >= 50) + skilllv -= 2; + else if (i >= 15) + skilllv--; + if (skilllv < 1) + skilllv = 1; + if (sd) + { + int sp = skill_get_sp (sc_data[SC_AUTOSPELL].val2, + skilllv) * 2 / 3; + if (sd->status.sp >= sp) + { + if ((i = skill_get_inf (sc_data[SC_AUTOSPELL].val2) == 2) + || i == 32) + f = skill_castend_pos2 (src, target->x, target->y, + sc_data[SC_AUTOSPELL].val2, + skilllv, tick, flag); + else + { + switch (skill_get_nk (sc_data[SC_AUTOSPELL].val2)) + { + case 0: + case 2: + f = skill_castend_damage_id (src, target, + sc_data + [SC_AUTOSPELL].val2, + skilllv, tick, + flag); + break; + case 1: /* 支援系 */ + if ((sc_data[SC_AUTOSPELL].val2 == AL_HEAL + || (sc_data[SC_AUTOSPELL].val2 == + ALL_RESURRECTION + && target->type != BL_PC)) + && battle_check_undead (race, ele)) + f = skill_castend_damage_id (src, target, + sc_data + [SC_AUTOSPELL].val2, + skilllv, + tick, flag); + else + f = skill_castend_nodamage_id (src, + target, + sc_data + [SC_AUTOSPELL].val2, + skilllv, + tick, + flag); + break; + } + } + if (!f) + pc_heal (sd, 0, -sp); + } + } + else + { + if ((i = skill_get_inf (sc_data[SC_AUTOSPELL].val2) == 2) + || i == 32) + skill_castend_pos2 (src, target->x, target->y, + sc_data[SC_AUTOSPELL].val2, skilllv, + tick, flag); + else + { + switch (skill_get_nk (sc_data[SC_AUTOSPELL].val2)) + { + case 0: + case 2: + skill_castend_damage_id (src, target, + sc_data + [SC_AUTOSPELL].val2, + skilllv, tick, flag); + break; + case 1: /* 支援系 */ + if ((sc_data[SC_AUTOSPELL].val2 == AL_HEAL + || (sc_data[SC_AUTOSPELL].val2 == + ALL_RESURRECTION + && target->type != BL_PC)) + && battle_check_undead (race, ele)) + skill_castend_damage_id (src, target, + sc_data + [SC_AUTOSPELL].val2, + skilllv, tick, flag); + else + skill_castend_nodamage_id (src, target, + sc_data + [SC_AUTOSPELL].val2, + skilllv, tick, + flag); + break; + } + } + } + } + if (sd) + { + if (sd->autospell_id > 0 && sd->autospell_lv > 0 + && MRAND (100) < sd->autospell_rate) + { + int skilllv = sd->autospell_lv, i, f = 0, sp; + i = MRAND (100); + if (i >= 50) + skilllv -= 2; + else if (i >= 15) + skilllv--; + if (skilllv < 1) + skilllv = 1; + sp = skill_get_sp (sd->autospell_id, skilllv) * 2 / 3; + if (sd->status.sp >= sp) + { + if ((i = skill_get_inf (sd->autospell_id) == 2) + || i == 32) + f = skill_castend_pos2 (src, target->x, target->y, + sd->autospell_id, skilllv, + tick, flag); + else + { + switch (skill_get_nk (sd->autospell_id)) + { + case 0: + case 2: + f = skill_castend_damage_id (src, target, + sd->autospell_id, + skilllv, tick, + flag); + break; + case 1: /* 支援系 */ + if ((sd->autospell_id == AL_HEAL + || (sd->autospell_id == ALL_RESURRECTION + && target->type != BL_PC)) + && battle_check_undead (race, ele)) + f = skill_castend_damage_id (src, target, + sd->autospell_id, + skilllv, + tick, flag); + else + f = skill_castend_nodamage_id (src, + target, + sd->autospell_id, + skilllv, + tick, + flag); + break; + } + } + if (!f) + pc_heal (sd, 0, -sp); + } + } + if (wd.flag & BF_WEAPON && src != target + && (wd.damage > 0 || wd.damage2 > 0)) + { + int hp = 0, sp = 0; + if (sd->hp_drain_rate && sd->hp_drain_per > 0 && wd.damage > 0 + && MRAND (100) < sd->hp_drain_rate) + { + hp += (wd.damage * sd->hp_drain_per) / 100; + if (sd->hp_drain_rate > 0 && hp < 1) + hp = 1; + else if (sd->hp_drain_rate < 0 && hp > -1) + hp = -1; + } + if (sd->hp_drain_rate_ && sd->hp_drain_per_ > 0 + && wd.damage2 > 0 && MRAND (100) < sd->hp_drain_rate_) + { + hp += (wd.damage2 * sd->hp_drain_per_) / 100; + if (sd->hp_drain_rate_ > 0 && hp < 1) + hp = 1; + else if (sd->hp_drain_rate_ < 0 && hp > -1) + hp = -1; + } + if (sd->sp_drain_rate && sd->sp_drain_per > 0 && wd.damage > 0 + && MRAND (100) < sd->sp_drain_rate) + { + sp += (wd.damage * sd->sp_drain_per) / 100; + if (sd->sp_drain_rate > 0 && sp < 1) + sp = 1; + else if (sd->sp_drain_rate < 0 && sp > -1) + sp = -1; } + if (sd->sp_drain_rate_ && sd->sp_drain_per_ > 0 + && wd.damage2 > 0 && MRAND (100) < sd->sp_drain_rate_) + { + sp += (wd.damage2 * sd->sp_drain_per_) / 100; + if (sd->sp_drain_rate_ > 0 && sp < 1) + sp = 1; + else if (sd->sp_drain_rate_ < 0 && sp > -1) + sp = -1; + } + if (hp || sp) + pc_heal (sd, hp, sp); + } + } - battle_damage(src,target,(wd.damage+wd.damage2),0); - if(target->prev != NULL && - (target->type != BL_PC || (target->type == BL_PC && !pc_isdead((struct map_session_data *)target) ) ) ) { - if(wd.damage > 0 || wd.damage2 > 0) { - skill_additional_effect(src,target,0,0,BF_WEAPON,tick); - if(sd) { - if(sd->weapon_coma_ele[ele] > 0 && MRAND(10000) < sd->weapon_coma_ele[ele]) - battle_damage(src,target,battle_get_max_hp(target),1); - if(sd->weapon_coma_race[race] > 0 && MRAND(10000) < sd->weapon_coma_race[race]) - battle_damage(src,target,battle_get_max_hp(target),1); - if(battle_get_mode(target) & 0x20) { - if(sd->weapon_coma_race[10] > 0 && MRAND(10000) < sd->weapon_coma_race[10]) - battle_damage(src,target,battle_get_max_hp(target),1); - } - else { - if(sd->weapon_coma_race[11] > 0 && MRAND(10000) < sd->weapon_coma_race[11]) - battle_damage(src,target,battle_get_max_hp(target),1); - } - } - } - } - if(sc_data && sc_data[SC_AUTOSPELL].timer != -1 && MRAND(100) < sc_data[SC_AUTOSPELL].val4) { - int skilllv=sc_data[SC_AUTOSPELL].val3,i,f=0; - i = MRAND(100); - if(i >= 50) skilllv -= 2; - else if(i >= 15) skilllv--; - if(skilllv < 1) skilllv = 1; - if(sd) { - int sp = skill_get_sp(sc_data[SC_AUTOSPELL].val2,skilllv)*2/3; - if(sd->status.sp >= sp) { - if((i=skill_get_inf(sc_data[SC_AUTOSPELL].val2) == 2) || i == 32) - f = skill_castend_pos2(src,target->x,target->y,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag); - else { - switch( skill_get_nk(sc_data[SC_AUTOSPELL].val2) ) { - case 0: case 2: - f = skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag); - break; - case 1:/* 支援系 */ - if((sc_data[SC_AUTOSPELL].val2==AL_HEAL || (sc_data[SC_AUTOSPELL].val2==ALL_RESURRECTION && target->type != BL_PC)) && battle_check_undead(race,ele)) - f = skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag); - else - f = skill_castend_nodamage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag); - break; - } - } - if(!f) pc_heal(sd,0,-sp); - } - } - else { - if((i=skill_get_inf(sc_data[SC_AUTOSPELL].val2) == 2) || i == 32) - skill_castend_pos2(src,target->x,target->y,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag); - else { - switch( skill_get_nk(sc_data[SC_AUTOSPELL].val2) ) { - case 0: case 2: - skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag); - break; - case 1:/* 支援系 */ - if((sc_data[SC_AUTOSPELL].val2==AL_HEAL || (sc_data[SC_AUTOSPELL].val2==ALL_RESURRECTION && target->type != BL_PC)) && battle_check_undead(race,ele)) - skill_castend_damage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag); - else - skill_castend_nodamage_id(src,target,sc_data[SC_AUTOSPELL].val2,skilllv,tick,flag); - break; - } - } - } - } - if(sd) { - if(sd->autospell_id > 0 && sd->autospell_lv > 0 && MRAND(100) < sd->autospell_rate) { - int skilllv=sd->autospell_lv,i,f=0,sp; - i = MRAND(100); - if(i >= 50) skilllv -= 2; - else if(i >= 15) skilllv--; - if(skilllv < 1) skilllv = 1; - sp = skill_get_sp(sd->autospell_id,skilllv)*2/3; - if(sd->status.sp >= sp) { - if((i=skill_get_inf(sd->autospell_id) == 2) || i == 32) - f = skill_castend_pos2(src,target->x,target->y,sd->autospell_id,skilllv,tick,flag); - else { - switch( skill_get_nk(sd->autospell_id) ) { - case 0: case 2: - f = skill_castend_damage_id(src,target,sd->autospell_id,skilllv,tick,flag); - break; - case 1:/* 支援系 */ - if((sd->autospell_id==AL_HEAL || (sd->autospell_id==ALL_RESURRECTION && target->type != BL_PC)) && battle_check_undead(race,ele)) - f = skill_castend_damage_id(src,target,sd->autospell_id,skilllv,tick,flag); - else - f = skill_castend_nodamage_id(src,target,sd->autospell_id,skilllv,tick,flag); - break; - } - } - if(!f) pc_heal(sd,0,-sp); - } - } - if(wd.flag&BF_WEAPON && src != target && (wd.damage > 0 || wd.damage2 > 0)) { - int hp = 0,sp = 0; - if(sd->hp_drain_rate && sd->hp_drain_per > 0 && wd.damage > 0 && MRAND(100) < sd->hp_drain_rate) { - hp += (wd.damage * sd->hp_drain_per)/100; - if(sd->hp_drain_rate > 0 && hp < 1) hp = 1; - else if(sd->hp_drain_rate < 0 && hp > -1) hp = -1; - } - if(sd->hp_drain_rate_ && sd->hp_drain_per_ > 0 && wd.damage2 > 0 && MRAND(100) < sd->hp_drain_rate_) { - hp += (wd.damage2 * sd->hp_drain_per_)/100; - if(sd->hp_drain_rate_ > 0 && hp < 1) hp = 1; - else if(sd->hp_drain_rate_ < 0 && hp > -1) hp = -1; - } - if(sd->sp_drain_rate && sd->sp_drain_per > 0 && wd.damage > 0 && MRAND(100) < sd->sp_drain_rate) { - sp += (wd.damage * sd->sp_drain_per)/100; - if(sd->sp_drain_rate > 0 && sp < 1) sp = 1; - else if(sd->sp_drain_rate < 0 && sp > -1) sp = -1; - } - if(sd->sp_drain_rate_ && sd->sp_drain_per_ > 0 && wd.damage2 > 0 && MRAND(100) < sd->sp_drain_rate_) { - sp += (wd.damage2 * sd->sp_drain_per_)/100; - if(sd->sp_drain_rate_ > 0 && sp < 1) sp = 1; - else if(sd->sp_drain_rate_ < 0 && sp > -1) sp = -1; - } - if(hp || sp) pc_heal(sd,hp,sp); - } - } - - if(rdamage > 0) - battle_damage(target,src,rdamage,0); - if(t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1 && t_sc_data[SC_AUTOCOUNTER].val4 > 0) { - if(t_sc_data[SC_AUTOCOUNTER].val3 == src->id) - battle_weapon_attack(target,src,tick,0x8000|t_sc_data[SC_AUTOCOUNTER].val1); - skill_status_change_end(target,SC_AUTOCOUNTER,-1); - } - if(t_sc_data && t_sc_data[SC_BLADESTOP_WAIT].timer != -1){ - int lv = t_sc_data[SC_BLADESTOP_WAIT].val1; - skill_status_change_end(target,SC_BLADESTOP_WAIT,-1); - skill_status_change_start(src,SC_BLADESTOP,lv,1,(int)src,(int)target,skill_get_time2(MO_BLADESTOP,lv),0); - skill_status_change_start(target,SC_BLADESTOP,lv,2,(int)target,(int)src,skill_get_time2(MO_BLADESTOP,lv),0); - } - if(t_sc_data && t_sc_data[SC_SPLASHER].timer!=-1) //殴ったので対象のベナムスプラッシャー状態を解除 - skill_status_change_end(target,SC_SPLASHER,-1); - - map_freeblock_unlock(); - } - return wd.dmg_lv; + if (rdamage > 0) + battle_damage (target, src, rdamage, 0); + if (t_sc_data && t_sc_data[SC_AUTOCOUNTER].timer != -1 + && t_sc_data[SC_AUTOCOUNTER].val4 > 0) + { + if (t_sc_data[SC_AUTOCOUNTER].val3 == src->id) + battle_weapon_attack (target, src, tick, + 0x8000 | + t_sc_data[SC_AUTOCOUNTER].val1); + skill_status_change_end (target, SC_AUTOCOUNTER, -1); + } + if (t_sc_data && t_sc_data[SC_BLADESTOP_WAIT].timer != -1) + { + int lv = t_sc_data[SC_BLADESTOP_WAIT].val1; + skill_status_change_end (target, SC_BLADESTOP_WAIT, -1); + skill_status_change_start (src, SC_BLADESTOP, lv, 1, (int) src, + (int) target, + skill_get_time2 (MO_BLADESTOP, lv), 0); + skill_status_change_start (target, SC_BLADESTOP, lv, 2, + (int) target, (int) src, + skill_get_time2 (MO_BLADESTOP, lv), 0); + } + if (t_sc_data && t_sc_data[SC_SPLASHER].timer != -1) //殴ったので対象のベナムスプラッシャー状態を解除 + skill_status_change_end (target, SC_SPLASHER, -1); + + map_freeblock_unlock (); + } + return wd.dmg_lv; } -int battle_check_undead(int race,int element) +int battle_check_undead (int race, int element) { - if(battle_config.undead_detect_type == 0) { - if(element == 9) - return 1; - } - else if(battle_config.undead_detect_type == 1) { - if(race == 1) - return 1; - } - else { - if(element == 9 || race == 1) - return 1; - } - return 0; + if (battle_config.undead_detect_type == 0) + { + if (element == 9) + return 1; + } + else if (battle_config.undead_detect_type == 1) + { + if (race == 1) + return 1; + } + else + { + if (element == 9 || race == 1) + return 1; + } + return 0; } /*========================================== @@ -4188,202 +5191,238 @@ int battle_check_undead(int race,int element) * = 0x50000:パーティーじゃないか判定(ret:1=パーティでない) *------------------------------------------ */ -int battle_check_target( struct block_list *src, struct block_list *target,int flag) +int battle_check_target (struct block_list *src, struct block_list *target, + int flag) { - int s_p,s_g,t_p,t_g; - struct block_list *ss=src; - - nullpo_retr(0, src); - nullpo_retr(0, target); - - if( flag&0x40000 ){ // 反転フラグ - int ret=battle_check_target(src,target,flag&0x30000); - if(ret!=-1) - return !ret; - return -1; - } - - if( flag&0x20000 ){ - if( target->type==BL_MOB || target->type==BL_PC ) - return 1; - else - return -1; - } - - if(src->type == BL_SKILL && target->type == BL_SKILL) // 対象がスキルユニットなら無条件肯定 - return -1; - - if(target->type == BL_PC && ((struct map_session_data *)target)->invincible_timer != -1) - return -1; - - if(target->type == BL_SKILL) { - switch(((struct skill_unit *)target)->group->unit_id){ - case 0x8d: - case 0x8f: - case 0x98: - return 0; - break; - } - } - - // スキルユニットの場合、親を求める - if( src->type==BL_SKILL) { - int inf2 = skill_get_inf2(((struct skill_unit *)src)->group->skill_id); - if( (ss=map_id2bl( ((struct skill_unit *)src)->group->src_id))==NULL ) - return -1; - if(ss->prev == NULL) - return -1; - if(inf2&0x80 && - (map[src->m].flag.pvp || pc_iskiller((struct map_session_data *)src, (struct map_session_data *)target)) && // [MouseJstr] - !(target->type == BL_PC && pc_isinvisible((struct map_session_data *)target))) - return 0; - if(ss == target) { - if(inf2&0x100) - return 0; - if(inf2&0x200) - return -1; - } - } - // Mobでmaster_idがあってspecial_mob_aiなら、召喚主を求める - if( src->type==BL_MOB ){ - struct mob_data *md=(struct mob_data *)src; - if(md && md->master_id>0){ - if(md->master_id==target->id) // 主なら肯定 - return 1; - if(md->state.special_mob_ai){ - if(target->type==BL_MOB){ //special_mob_aiで対象がMob - struct mob_data *tmd=(struct mob_data *)target; - if(tmd){ - if(tmd->master_id != md->master_id) //召喚主が一緒でなければ否定 - return 0; - else{ //召喚主が一緒なので肯定したいけど自爆は否定 - if(md->state.special_mob_ai>2) - return 0; - else - return 1; - } - } - } - } - if((ss=map_id2bl(md->master_id))==NULL) - return -1; - } - } + int s_p, s_g, t_p, t_g; + struct block_list *ss = src; + + nullpo_retr (0, src); + nullpo_retr (0, target); + + if (flag & 0x40000) + { // 反転フラグ + int ret = battle_check_target (src, target, flag & 0x30000); + if (ret != -1) + return !ret; + return -1; + } + + if (flag & 0x20000) + { + if (target->type == BL_MOB || target->type == BL_PC) + return 1; + else + return -1; + } + + if (src->type == BL_SKILL && target->type == BL_SKILL) // 対象がスキルユニットなら無条件肯定 + return -1; + + if (target->type == BL_PC + && ((struct map_session_data *) target)->invincible_timer != -1) + return -1; + + if (target->type == BL_SKILL) + { + switch (((struct skill_unit *) target)->group->unit_id) + { + case 0x8d: + case 0x8f: + case 0x98: + return 0; + break; + } + } + + // スキルユニットの場合、親を求める + if (src->type == BL_SKILL) + { + int inf2 = + skill_get_inf2 (((struct skill_unit *) src)->group->skill_id); + if ((ss = + map_id2bl (((struct skill_unit *) src)->group->src_id)) == NULL) + return -1; + if (ss->prev == NULL) + return -1; + if (inf2 & 0x80 && (map[src->m].flag.pvp || pc_iskiller ((struct map_session_data *) src, (struct map_session_data *) target)) && // [MouseJstr] + !(target->type == BL_PC + && pc_isinvisible ((struct map_session_data *) target))) + return 0; + if (ss == target) + { + if (inf2 & 0x100) + return 0; + if (inf2 & 0x200) + return -1; + } + } + // Mobでmaster_idがあってspecial_mob_aiなら、召喚主を求める + if (src->type == BL_MOB) + { + struct mob_data *md = (struct mob_data *) src; + if (md && md->master_id > 0) + { + if (md->master_id == target->id) // 主なら肯定 + return 1; + if (md->state.special_mob_ai) + { + if (target->type == BL_MOB) + { //special_mob_aiで対象がMob + struct mob_data *tmd = (struct mob_data *) target; + if (tmd) + { + if (tmd->master_id != md->master_id) //召喚主が一緒でなければ否定 + return 0; + else + { //召喚主が一緒なので肯定したいけど自爆は否定 + if (md->state.special_mob_ai > 2) + return 0; + else + return 1; + } + } + } + } + if ((ss = map_id2bl (md->master_id)) == NULL) + return -1; + } + } - if( src==target || ss==target ) // 同じなら肯定 - return 1; + if (src == target || ss == target) // 同じなら肯定 + return 1; - if(target->type == BL_PC && pc_isinvisible((struct map_session_data *)target)) - return -1; + if (target->type == BL_PC + && pc_isinvisible ((struct map_session_data *) target)) + return -1; - if( src->prev==NULL || // 死んでるならエラー - (src->type==BL_PC && pc_isdead((struct map_session_data *)src) ) ) - return -1; + if (src->prev == NULL || // 死んでるならエラー + (src->type == BL_PC && pc_isdead ((struct map_session_data *) src))) + return -1; - if( (ss->type == BL_PC && target->type==BL_MOB) || - (ss->type == BL_MOB && target->type==BL_PC) ) - return 0; // PCvsMOBなら否定 + if ((ss->type == BL_PC && target->type == BL_MOB) || + (ss->type == BL_MOB && target->type == BL_PC)) + return 0; // PCvsMOBなら否定 - s_p=battle_get_party_id(ss); - s_g=battle_get_guild_id(ss); + s_p = battle_get_party_id (ss); + s_g = battle_get_guild_id (ss); - t_p=battle_get_party_id(target); - t_g=battle_get_guild_id(target); + t_p = battle_get_party_id (target); + t_g = battle_get_guild_id (target); - if(flag&0x10000) { - if(s_p && t_p && s_p == t_p) // 同じパーティなら肯定(味方) - return 1; - else // パーティ検索なら同じパーティじゃない時点で否定 - return 0; - } + if (flag & 0x10000) + { + if (s_p && t_p && s_p == t_p) // 同じパーティなら肯定(味方) + return 1; + else // パーティ検索なら同じパーティじゃない時点で否定 + return 0; + } - if(ss->type == BL_MOB && s_g > 0 && t_g > 0 && s_g == t_g ) // 同じギルド/mobクラスなら肯定(味方) - return 1; + if (ss->type == BL_MOB && s_g > 0 && t_g > 0 && s_g == t_g) // 同じギルド/mobクラスなら肯定(味方) + return 1; //printf("ss:%d src:%d target:%d flag:0x%x %d %d ",ss->id,src->id,target->id,flag,src->type,target->type); //printf("p:%d %d g:%d %d\n",s_p,t_p,s_g,t_g); - if( ss->type==BL_PC && target->type==BL_PC) { // 両方PVPモードなら否定(敵) - struct skill_unit *su=NULL; - if(src->type==BL_SKILL) - su=(struct skill_unit *)src; - if(map[ss->m].flag.pvp || pc_iskiller((struct map_session_data *)ss, (struct map_session_data*)target)) { // [MouseJstr] - if(su && su->group->target_flag==BCT_NOENEMY) - return 1; - else if(battle_config.pk_mode && (((struct map_session_data*)ss)->status.class==0 || ((struct map_session_data*)target)->status.class==0)) - return 1; // prevent novice engagement in pk_mode [Valaris] - else if(map[ss->m].flag.pvp_noparty && s_p > 0 && t_p > 0 && s_p == t_p) - return 1; - else if(map[ss->m].flag.pvp_noguild && s_g > 0 && t_g > 0 && s_g == t_g) - return 1; - return 0; - } - if(map[src->m].flag.gvg) { - struct guild *g=NULL; - if(su && su->group->target_flag==BCT_NOENEMY) - return 1; - if( s_g > 0 && s_g == t_g) - return 1; - if(map[src->m].flag.gvg_noparty && s_p > 0 && t_p > 0 && s_p == t_p) - return 1; - if((g = guild_search(s_g))) { - int i; - for(i=0;i<MAX_GUILDALLIANCE;i++){ - if(g->alliance[i].guild_id > 0 && g->alliance[i].guild_id == t_g) { - if(g->alliance[i].opposition) - return 0;//敵対ギルドなら無条件に敵 - else - return 1;//同盟ギルドなら無条件に味方 - } - } - } - return 0; - } - } + if (ss->type == BL_PC && target->type == BL_PC) + { // 両方PVPモードなら否定(敵) + struct skill_unit *su = NULL; + if (src->type == BL_SKILL) + su = (struct skill_unit *) src; + if (map[ss->m].flag.pvp + || pc_iskiller ((struct map_session_data *) ss, + (struct map_session_data *) target)) + { // [MouseJstr] + if (su && su->group->target_flag == BCT_NOENEMY) + return 1; + else if (battle_config.pk_mode + && (((struct map_session_data *) ss)->status.class == 0 + || ((struct map_session_data *) target)-> + status.class == 0)) + return 1; // prevent novice engagement in pk_mode [Valaris] + else if (map[ss->m].flag.pvp_noparty && s_p > 0 && t_p > 0 + && s_p == t_p) + return 1; + else if (map[ss->m].flag.pvp_noguild && s_g > 0 && t_g > 0 + && s_g == t_g) + return 1; + return 0; + } + if (map[src->m].flag.gvg) + { + struct guild *g = NULL; + if (su && su->group->target_flag == BCT_NOENEMY) + return 1; + if (s_g > 0 && s_g == t_g) + return 1; + if (map[src->m].flag.gvg_noparty && s_p > 0 && t_p > 0 + && s_p == t_p) + return 1; + if ((g = guild_search (s_g))) + { + int i; + for (i = 0; i < MAX_GUILDALLIANCE; i++) + { + if (g->alliance[i].guild_id > 0 + && g->alliance[i].guild_id == t_g) + { + if (g->alliance[i].opposition) + return 0; //敵対ギルドなら無条件に敵 + else + return 1; //同盟ギルドなら無条件に味方 + } + } + } + return 0; + } + } - return 1; // 該当しないので無関係人物(まあ敵じゃないので味方) + return 1; // 該当しないので無関係人物(まあ敵じゃないので味方) } + /*========================================== * 射程判定 *------------------------------------------ */ -int battle_check_range(struct block_list *src,struct block_list *bl,int range) +int battle_check_range (struct block_list *src, struct block_list *bl, + int range) { - int dx,dy; - struct walkpath_data wpd; - int arange; + int dx, dy; + struct walkpath_data wpd; + int arange; - nullpo_retr(0, src); - nullpo_retr(0, bl); + nullpo_retr (0, src); + nullpo_retr (0, bl); - dx=abs(bl->x-src->x); - dy=abs(bl->y-src->y); - arange=((dx>dy)?dx:dy); + dx = abs (bl->x - src->x); + dy = abs (bl->y - src->y); + arange = ((dx > dy) ? dx : dy); - if(src->m != bl->m) // 違うマップ - return 0; + if (src->m != bl->m) // 違うマップ + return 0; - if( range>0 && range < arange ) // 遠すぎる - return 0; + if (range > 0 && range < arange) // 遠すぎる + return 0; - if( arange<2 ) // 同じマスか隣接 - return 1; + if (arange < 2) // 同じマスか隣接 + return 1; -// if(bl->type == BL_SKILL && ((struct skill_unit *)bl)->group->unit_id == 0x8d) -// return 1; +// if(bl->type == BL_SKILL && ((struct skill_unit *)bl)->group->unit_id == 0x8d) +// return 1; - // 障害物判定 - wpd.path_len=0; - wpd.path_pos=0; - wpd.path_half=0; - if(path_search(&wpd,src->m,src->x,src->y,bl->x,bl->y,0x10001)!=-1) - return 1; + // 障害物判定 + wpd.path_len = 0; + wpd.path_pos = 0; + wpd.path_half = 0; + if (path_search (&wpd, src->m, src->x, src->y, bl->x, bl->y, 0x10001) != + -1) + return 1; - dx=(dx>0)?1:((dx<0)?-1:0); - dy=(dy>0)?1:((dy<0)?-1:0); - return (path_search(&wpd,src->m,src->x+dx,src->y+dy, - bl->x-dx,bl->y-dy,0x10001)!=-1)?1:0; + dx = (dx > 0) ? 1 : ((dx < 0) ? -1 : 0); + dy = (dy > 0) ? 1 : ((dy < 0) ? -1 : 0); + return (path_search (&wpd, src->m, src->x + dx, src->y + dy, + bl->x - dx, bl->y - dy, 0x10001) != -1) ? 1 : 0; } /*========================================== @@ -4391,634 +5430,887 @@ int battle_check_range(struct block_list *src,struct block_list *bl,int range) * on/off, english, fran軋is, deutsch, espaol *------------------------------------------ */ -int battle_config_switch(const char *str) { - if (strcmpi(str, "on") == 0 || strcmpi(str, "yes") == 0 || strcmpi(str, "oui") == 0 || strcmpi(str, "ja") == 0 || strcmpi(str, "si") == 0) - return 1; - if (strcmpi(str, "off") == 0 || strcmpi(str, "no") == 0 || strcmpi(str, "non") == 0 || strcmpi(str, "nein") == 0) - return 0; - return atoi(str); +int battle_config_switch (const char *str) +{ + if (strcmpi (str, "on") == 0 || strcmpi (str, "yes") == 0 + || strcmpi (str, "oui") == 0 || strcmpi (str, "ja") == 0 + || strcmpi (str, "si") == 0) + return 1; + if (strcmpi (str, "off") == 0 || strcmpi (str, "no") == 0 + || strcmpi (str, "non") == 0 || strcmpi (str, "nein") == 0) + return 0; + return atoi (str); } + /*========================================== * 設定ファイルを読み込む *------------------------------------------ */ -int battle_config_read(const char *cfgName) +int battle_config_read (const char *cfgName) { - int i; - char line[1024], w1[1024], w2[1024]; - FILE *fp; - static int count = 0; - - if ((count++) == 0) { - battle_config.warp_point_debug=0; - battle_config.enemy_critical=0; - battle_config.enemy_critical_rate=100; - battle_config.enemy_str=1; - battle_config.enemy_perfect_flee=0; - battle_config.cast_rate=100; - battle_config.delay_rate=100; - battle_config.delay_dependon_dex=0; - battle_config.sdelay_attack_enable=0; - battle_config.left_cardfix_to_right=0; - battle_config.pc_skill_add_range=0; - battle_config.skill_out_range_consume=1; - battle_config.mob_skill_add_range=0; - battle_config.pc_damage_delay=1; - battle_config.pc_damage_delay_rate=100; - battle_config.defnotenemy=1; - battle_config.random_monster_checklv=1; - battle_config.attr_recover=1; - battle_config.flooritem_lifetime=LIFETIME_FLOORITEM*1000; - battle_config.item_auto_get=0; - battle_config.drop_pickup_safety_zone = 20; - battle_config.item_first_get_time=3000; - battle_config.item_second_get_time=1000; - battle_config.item_third_get_time=1000; - battle_config.mvp_item_first_get_time=10000; - battle_config.mvp_item_second_get_time=10000; - battle_config.mvp_item_third_get_time=2000; - - battle_config.drop_rate0item=0; - battle_config.base_exp_rate=100; - battle_config.job_exp_rate=100; - battle_config.pvp_exp=1; - battle_config.gtb_pvp_only=0; - battle_config.death_penalty_type=0; - battle_config.death_penalty_base=0; - battle_config.death_penalty_job=0; - battle_config.zeny_penalty=0; - battle_config.restart_hp_rate=0; - battle_config.restart_sp_rate=0; - battle_config.mvp_item_rate=100; - battle_config.mvp_exp_rate=100; - battle_config.mvp_hp_rate=100; - battle_config.monster_hp_rate=100; - battle_config.monster_max_aspd=199; - battle_config.atc_gmonly=0; - battle_config.gm_allskill=0; - battle_config.gm_allequip=0; - battle_config.gm_skilluncond=0; - battle_config.guild_max_castles=0; - battle_config.skillfree = 0; - battle_config.skillup_limit = 0; - battle_config.wp_rate=100; - battle_config.pp_rate=100; - battle_config.monster_active_enable=1; - battle_config.monster_damage_delay_rate=100; - battle_config.monster_loot_type=0; - battle_config.mob_skill_use=1; - battle_config.mob_count_rate=100; - battle_config.quest_skill_learn=0; - battle_config.quest_skill_reset=1; - battle_config.basic_skill_check=1; - battle_config.guild_emperium_check=1; - battle_config.guild_exp_limit=50; - battle_config.pc_invincible_time = 5000; - battle_config.skill_min_damage=0; - battle_config.finger_offensive_type=0; - battle_config.heal_exp=0; - battle_config.resurrection_exp=0; - battle_config.shop_exp=0; - battle_config.combo_delay_rate=100; - battle_config.item_check=1; - battle_config.wedding_modifydisplay=0; - battle_config.natural_healhp_interval=6000; - battle_config.natural_healsp_interval=8000; - battle_config.natural_heal_skill_interval=10000; - battle_config.natural_heal_weight_rate=50; - battle_config.itemheal_regeneration_factor = 1; - battle_config.item_name_override_grffile=1; - battle_config.arrow_decrement=1; - battle_config.max_aspd = 199; - battle_config.max_hp = 32500; - battle_config.max_sp = 32500; - battle_config.max_lv = 99; // [MouseJstr] - battle_config.max_parameter = 99; - battle_config.max_cart_weight = 8000; - battle_config.pc_skill_log = 0; - battle_config.mob_skill_log = 0; - battle_config.battle_log = 0; - battle_config.save_log = 0; - battle_config.error_log = 1; - battle_config.etc_log = 1; - battle_config.save_clothcolor = 0; - battle_config.undead_detect_type = 0; - battle_config.pc_auto_counter_type = 1; - battle_config.monster_auto_counter_type = 1; - battle_config.agi_penaly_type = 0; - battle_config.agi_penaly_count = 3; - battle_config.agi_penaly_num = 0; - battle_config.agi_penaly_count_lv = ATK_FLEE; - battle_config.vit_penaly_type = 0; - battle_config.vit_penaly_count = 3; - battle_config.vit_penaly_num = 0; - battle_config.vit_penaly_count_lv = ATK_DEF; - battle_config.player_defense_type = 0; - battle_config.monster_defense_type = 0; - battle_config.magic_defense_type = 0; - battle_config.pc_skill_reiteration = 0; - battle_config.monster_skill_reiteration = 0; - battle_config.pc_skill_nofootset = 0; - battle_config.monster_skill_nofootset = 0; - battle_config.pc_cloak_check_type = 0; - battle_config.monster_cloak_check_type = 0; - battle_config.gvg_short_damage_rate = 100; - battle_config.gvg_long_damage_rate = 100; - battle_config.gvg_magic_damage_rate = 100; - battle_config.gvg_misc_damage_rate = 100; - battle_config.gvg_eliminate_time = 7000; - battle_config.mob_changetarget_byskill = 0; - battle_config.pc_attack_direction_change = 1; - battle_config.monster_attack_direction_change = 1; - battle_config.pc_undead_nofreeze = 0; - battle_config.pc_land_skill_limit = 1; - battle_config.monster_land_skill_limit = 1; - battle_config.party_skill_penaly = 1; - battle_config.monster_class_change_full_recover = 0; - battle_config.produce_item_name_input = 1; - battle_config.produce_potion_name_input = 1; - battle_config.making_arrow_name_input = 1; - battle_config.holywater_name_input = 1; - battle_config.display_delay_skill_fail = 1; - battle_config.chat_warpportal = 0; - battle_config.mob_warpportal = 0; - battle_config.dead_branch_active = 0; - battle_config.show_steal_in_same_party = 0; - battle_config.enable_upper_class = 0; - battle_config.pc_attack_attr_none = 0; - battle_config.mob_attack_attr_none = 1; - battle_config.mob_ghostring_fix = 0; - battle_config.gx_allhit = 0; - battle_config.gx_cardfix = 0; - battle_config.gx_dupele = 1; - battle_config.gx_disptype = 1; - battle_config.player_skill_partner_check = 1; - battle_config.hide_GM_session = 0; - battle_config.unit_movement_type = 0; - battle_config.invite_request_check = 1; - battle_config.skill_removetrap_type = 0; - battle_config.disp_experience = 0; - battle_config.item_rate_common = 100; - battle_config.item_rate_equip = 100; - battle_config.item_rate_card = 100; - battle_config.item_rate_heal = 100; // Added by Valaris - battle_config.item_rate_use = 100; // End - battle_config.item_drop_common_min=1; // Added by TyrNemesis^ - battle_config.item_drop_common_max=10000; - battle_config.item_drop_equip_min=1; - battle_config.item_drop_equip_max=10000; - battle_config.item_drop_card_min=1; - battle_config.item_drop_card_max=10000; - battle_config.item_drop_mvp_min=1; - battle_config.item_drop_mvp_max=10000; // End Addition - battle_config.item_drop_heal_min=1; // Added by Valaris - battle_config.item_drop_heal_max=10000; - battle_config.item_drop_use_min=1; - battle_config.item_drop_use_max=10000; // End - battle_config.prevent_logout = 1; // Added by RoVeRT - battle_config.maximum_level = 255; // Added by Valaris - battle_config.drops_by_luk = 0; // [Valaris] - battle_config.equipment_breaking = 0; // [Valaris] - battle_config.equipment_break_rate = 100; // [Valaris] - battle_config.pk_mode = 0; // [Valaris] - battle_config.multi_level_up = 0; // [Valaris] - battle_config.backstab_bow_penalty = 0; // Akaru - battle_config.night_at_start = 0; // added by [Yor] - battle_config.day_duration = 2*60*60*1000; // added by [Yor] (2 hours) - battle_config.night_duration = 30*60*1000; // added by [Yor] (30 minutes) - battle_config.show_mob_hp = 0; // [Valaris] - battle_config.hack_info_GM_level = 60; // added by [Yor] (default: 60, GM level) - battle_config.any_warp_GM_min_level = 20; // added by [Yor] - battle_config.packet_ver_flag = 63; // added by [Yor] - battle_config.min_hair_style = 0; - battle_config.max_hair_style = 20; - battle_config.min_hair_color = 0; - battle_config.max_hair_color = 9; - battle_config.min_cloth_color = 0; - battle_config.max_cloth_color = 4; - - battle_config.castrate_dex_scale = 150; - - battle_config.area_size = 14; - - battle_config.chat_lame_penalty = 2; - battle_config.chat_spam_threshold = 10; - battle_config.chat_spam_flood = 10; - battle_config.chat_spam_ban = 1; - battle_config.chat_spam_warn = 8; - battle_config.chat_maxline = 255; - - battle_config.trade_spam_threshold = 10; - battle_config.trade_spam_flood = 10; - battle_config.trade_spam_ban = 0; - battle_config.trade_spam_warn = 8; - - battle_config.sit_spam_threshold = 1; - battle_config.sit_spam_flood = 15; - battle_config.sit_spam_ban = 0; - battle_config.sit_spam_warn = 3; - } - - fp = fopen_(cfgName,"r"); - if (fp == NULL) { - printf("file not found: %s\n", cfgName); - return 1; - } - while(fgets(line,1020,fp)){ - const struct { - char str[128]; - int *val; - } data[] = { - { "warp_point_debug", &battle_config.warp_point_debug }, - { "enemy_critical", &battle_config.enemy_critical }, - { "enemy_critical_rate", &battle_config.enemy_critical_rate }, - { "enemy_str", &battle_config.enemy_str }, - { "enemy_perfect_flee", &battle_config.enemy_perfect_flee }, - { "casting_rate", &battle_config.cast_rate }, - { "delay_rate", &battle_config.delay_rate }, - { "delay_dependon_dex", &battle_config.delay_dependon_dex }, - { "skill_delay_attack_enable", &battle_config.sdelay_attack_enable }, - { "left_cardfix_to_right", &battle_config.left_cardfix_to_right }, - { "player_skill_add_range", &battle_config.pc_skill_add_range }, - { "skill_out_range_consume", &battle_config.skill_out_range_consume }, - { "monster_skill_add_range", &battle_config.mob_skill_add_range }, - { "player_damage_delay", &battle_config.pc_damage_delay }, - { "player_damage_delay_rate", &battle_config.pc_damage_delay_rate }, - { "defunit_not_enemy", &battle_config.defnotenemy }, - { "random_monster_checklv", &battle_config.random_monster_checklv }, - { "attribute_recover", &battle_config.attr_recover }, - { "flooritem_lifetime", &battle_config.flooritem_lifetime }, - { "item_auto_get", &battle_config.item_auto_get }, - { "drop_pickup_safety_zone", &battle_config.drop_pickup_safety_zone }, - { "item_first_get_time", &battle_config.item_first_get_time }, - { "item_second_get_time", &battle_config.item_second_get_time }, - { "item_third_get_time", &battle_config.item_third_get_time }, - { "mvp_item_first_get_time", &battle_config.mvp_item_first_get_time }, - { "mvp_item_second_get_time", &battle_config.mvp_item_second_get_time }, - { "mvp_item_third_get_time", &battle_config.mvp_item_third_get_time }, - { "item_rate", &battle_config.item_rate }, - { "drop_rate0item", &battle_config.drop_rate0item }, - { "base_exp_rate", &battle_config.base_exp_rate }, - { "job_exp_rate", &battle_config.job_exp_rate }, - { "pvp_exp", &battle_config.pvp_exp }, - { "gtb_pvp_only", &battle_config.gtb_pvp_only }, - { "guild_max_castles", &battle_config.guild_max_castles }, - { "death_penalty_type", &battle_config.death_penalty_type }, - { "death_penalty_base", &battle_config.death_penalty_base }, - { "death_penalty_job", &battle_config.death_penalty_job }, - { "zeny_penalty", &battle_config.zeny_penalty }, - { "restart_hp_rate", &battle_config.restart_hp_rate }, - { "restart_sp_rate", &battle_config.restart_sp_rate }, - { "mvp_hp_rate", &battle_config.mvp_hp_rate }, - { "mvp_item_rate", &battle_config.mvp_item_rate }, - { "mvp_exp_rate", &battle_config.mvp_exp_rate }, - { "monster_hp_rate", &battle_config.monster_hp_rate }, - { "monster_max_aspd", &battle_config.monster_max_aspd }, - { "atcommand_gm_only", &battle_config.atc_gmonly }, - { "atcommand_spawn_quantity_limit", &battle_config.atc_spawn_quantity_limit }, - { "gm_all_skill", &battle_config.gm_allskill }, - { "gm_all_skill_add_abra", &battle_config.gm_allskill_addabra }, - { "gm_all_equipment", &battle_config.gm_allequip }, - { "gm_skill_unconditional", &battle_config.gm_skilluncond }, - { "player_skillfree", &battle_config.skillfree }, - { "player_skillup_limit", &battle_config.skillup_limit }, - { "weapon_produce_rate", &battle_config.wp_rate }, - { "potion_produce_rate", &battle_config.pp_rate }, - { "monster_active_enable", &battle_config.monster_active_enable }, - { "monster_damage_delay_rate", &battle_config.monster_damage_delay_rate}, - { "monster_loot_type", &battle_config.monster_loot_type }, - { "mob_skill_use", &battle_config.mob_skill_use }, - { "mob_count_rate", &battle_config.mob_count_rate }, - { "quest_skill_learn", &battle_config.quest_skill_learn }, - { "quest_skill_reset", &battle_config.quest_skill_reset }, - { "basic_skill_check", &battle_config.basic_skill_check }, - { "guild_emperium_check", &battle_config.guild_emperium_check }, - { "guild_exp_limit", &battle_config.guild_exp_limit }, - { "player_invincible_time", &battle_config.pc_invincible_time }, - { "skill_min_damage", &battle_config.skill_min_damage }, - { "finger_offensive_type", &battle_config.finger_offensive_type }, - { "heal_exp", &battle_config.heal_exp }, - { "resurrection_exp", &battle_config.resurrection_exp }, - { "shop_exp", &battle_config.shop_exp }, - { "combo_delay_rate", &battle_config.combo_delay_rate }, - { "item_check", &battle_config.item_check }, - { "wedding_modifydisplay", &battle_config.wedding_modifydisplay }, - { "natural_healhp_interval", &battle_config.natural_healhp_interval }, - { "natural_healsp_interval", &battle_config.natural_healsp_interval }, - { "natural_heal_skill_interval", &battle_config.natural_heal_skill_interval}, - { "natural_heal_weight_rate", &battle_config.natural_heal_weight_rate }, - { "itemheal_regeneration_factor", &battle_config.itemheal_regeneration_factor }, - { "item_name_override_grffile", &battle_config.item_name_override_grffile}, - { "arrow_decrement", &battle_config.arrow_decrement }, - { "max_aspd", &battle_config.max_aspd }, - { "max_hp", &battle_config.max_hp }, - { "max_sp", &battle_config.max_sp }, - { "max_lv", &battle_config.max_lv }, - { "max_parameter", &battle_config.max_parameter }, - { "max_cart_weight", &battle_config.max_cart_weight }, - { "player_skill_log", &battle_config.pc_skill_log }, - { "monster_skill_log", &battle_config.mob_skill_log }, - { "battle_log", &battle_config.battle_log }, - { "save_log", &battle_config.save_log }, - { "error_log", &battle_config.error_log }, - { "etc_log", &battle_config.etc_log }, - { "save_clothcolor", &battle_config.save_clothcolor }, - { "undead_detect_type", &battle_config.undead_detect_type }, - { "player_auto_counter_type", &battle_config.pc_auto_counter_type }, - { "monster_auto_counter_type", &battle_config.monster_auto_counter_type}, - { "agi_penaly_type", &battle_config.agi_penaly_type }, - { "agi_penaly_count", &battle_config.agi_penaly_count }, - { "agi_penaly_num", &battle_config.agi_penaly_num }, - { "agi_penaly_count_lv", &battle_config.agi_penaly_count_lv }, - { "vit_penaly_type", &battle_config.vit_penaly_type }, - { "vit_penaly_count", &battle_config.vit_penaly_count }, - { "vit_penaly_num", &battle_config.vit_penaly_num }, - { "vit_penaly_count_lv", &battle_config.vit_penaly_count_lv }, - { "player_defense_type", &battle_config.player_defense_type }, - { "monster_defense_type", &battle_config.monster_defense_type }, - { "magic_defense_type", &battle_config.magic_defense_type }, - { "player_skill_reiteration", &battle_config.pc_skill_reiteration }, - { "monster_skill_reiteration", &battle_config.monster_skill_reiteration}, - { "player_skill_nofootset", &battle_config.pc_skill_nofootset }, - { "monster_skill_nofootset", &battle_config.monster_skill_nofootset }, - { "player_cloak_check_type", &battle_config.pc_cloak_check_type }, - { "monster_cloak_check_type", &battle_config.monster_cloak_check_type }, - { "gvg_short_attack_damage_rate", &battle_config.gvg_short_damage_rate }, - { "gvg_long_attack_damage_rate", &battle_config.gvg_long_damage_rate }, - { "gvg_magic_attack_damage_rate", &battle_config.gvg_magic_damage_rate }, - { "gvg_misc_attack_damage_rate", &battle_config.gvg_misc_damage_rate }, - { "gvg_eliminate_time", &battle_config.gvg_eliminate_time }, - { "mob_changetarget_byskill", &battle_config.mob_changetarget_byskill}, - { "player_attack_direction_change", &battle_config.pc_attack_direction_change }, - { "monster_attack_direction_change", &battle_config.monster_attack_direction_change }, - { "player_land_skill_limit", &battle_config.pc_land_skill_limit }, - { "monster_land_skill_limit", &battle_config.monster_land_skill_limit}, - { "party_skill_penaly", &battle_config.party_skill_penaly }, - { "monster_class_change_full_recover", &battle_config.monster_class_change_full_recover }, - { "produce_item_name_input", &battle_config.produce_item_name_input }, - { "produce_potion_name_input", &battle_config.produce_potion_name_input}, - { "making_arrow_name_input", &battle_config.making_arrow_name_input }, - { "holywater_name_input", &battle_config.holywater_name_input }, - { "display_delay_skill_fail", &battle_config.display_delay_skill_fail }, - { "chat_warpportal", &battle_config.chat_warpportal }, - { "mob_warpportal", &battle_config.mob_warpportal }, - { "dead_branch_active", &battle_config.dead_branch_active }, - { "show_steal_in_same_party", &battle_config.show_steal_in_same_party }, - { "enable_upper_class", &battle_config.enable_upper_class }, - { "mob_attack_attr_none", &battle_config.mob_attack_attr_none }, - { "mob_ghostring_fix", &battle_config.mob_ghostring_fix }, - { "pc_attack_attr_none", &battle_config.pc_attack_attr_none }, - { "gx_allhit", &battle_config.gx_allhit }, - { "gx_cardfix", &battle_config.gx_cardfix }, - { "gx_dupele", &battle_config.gx_dupele }, - { "gx_disptype", &battle_config.gx_disptype }, - { "player_skill_partner_check", &battle_config.player_skill_partner_check}, - { "hide_GM_session", &battle_config.hide_GM_session }, - { "unit_movement_type", &battle_config.unit_movement_type }, - { "invite_request_check", &battle_config.invite_request_check }, - { "skill_removetrap_type", &battle_config.skill_removetrap_type }, - { "disp_experience", &battle_config.disp_experience }, - { "castle_defense_rate", &battle_config.castle_defense_rate }, - { "riding_weight", &battle_config.riding_weight }, - { "item_rate_common", &battle_config.item_rate_common }, // Added by RoVeRT - { "item_rate_equip", &battle_config.item_rate_equip }, - { "item_rate_card", &battle_config.item_rate_card }, // End Addition - { "item_rate_heal", &battle_config.item_rate_heal }, // Added by Valaris - { "item_rate_use", &battle_config.item_rate_use }, // End - { "item_drop_common_min", &battle_config.item_drop_common_min }, // Added by TyrNemesis^ - { "item_drop_common_max", &battle_config.item_drop_common_max }, - { "item_drop_equip_min", &battle_config.item_drop_equip_min }, - { "item_drop_equip_max", &battle_config.item_drop_equip_max }, - { "item_drop_card_min", &battle_config.item_drop_card_min }, - { "item_drop_card_max", &battle_config.item_drop_card_max }, - { "item_drop_mvp_min", &battle_config.item_drop_mvp_min }, - { "item_drop_mvp_max", &battle_config.item_drop_mvp_max }, // End Addition - { "prevent_logout", &battle_config.prevent_logout }, // Added by RoVeRT - { "alchemist_summon_reward", &battle_config.alchemist_summon_reward }, // [Valaris] - { "maximum_level", &battle_config.maximum_level }, // [Valaris] - { "drops_by_luk", &battle_config.drops_by_luk }, // [Valaris] - { "monsters_ignore_gm", &battle_config.monsters_ignore_gm }, // [Valaris] - { "equipment_breaking", &battle_config.equipment_breaking }, // [Valaris] - { "equipment_break_rate", &battle_config.equipment_break_rate }, // [Valaris] - { "pk_mode", &battle_config.pk_mode }, // [Valaris] - { "multi_level_up", &battle_config.multi_level_up }, // [Valaris] - { "backstab_bow_penalty", &battle_config.backstab_bow_penalty }, - { "night_at_start", &battle_config.night_at_start }, // added by [Yor] - { "day_duration", &battle_config.day_duration }, // added by [Yor] - { "night_duration", &battle_config.night_duration }, // added by [Yor] - { "show_mob_hp", &battle_config.show_mob_hp }, // [Valaris] - { "hack_info_GM_level", &battle_config.hack_info_GM_level }, // added by [Yor] - { "any_warp_GM_min_level", &battle_config.any_warp_GM_min_level }, // added by [Yor] - { "packet_ver_flag", &battle_config.packet_ver_flag }, // added by [Yor] - { "min_hair_style", &battle_config.min_hair_style }, // added by [MouseJstr] - { "max_hair_style", &battle_config.max_hair_style }, // added by [MouseJstr] - { "min_hair_color", &battle_config.min_hair_color }, // added by [MouseJstr] - { "max_hair_color", &battle_config.max_hair_color }, // added by [MouseJstr] - { "min_cloth_color", &battle_config.min_cloth_color }, // added by [MouseJstr] - { "max_cloth_color", &battle_config.max_cloth_color }, // added by [MouseJstr] - { "castrate_dex_scale", &battle_config.castrate_dex_scale }, // added by [MouseJstr] - { "area_size", &battle_config.area_size }, // added by [MouseJstr] - { "muting_players", &battle_config.muting_players}, // added by [Apple] - { "chat_lame_penalty", &battle_config.chat_lame_penalty }, - { "chat_spam_threshold", &battle_config.chat_spam_threshold }, - { "chat_spam_flood", &battle_config.chat_spam_flood }, - { "chat_spam_ban", &battle_config.chat_spam_ban }, - { "chat_spam_warn", &battle_config.chat_spam_warn }, - { "chat_maxline", &battle_config.chat_maxline }, - { "trade_spam_threshold", &battle_config.trade_spam_threshold }, - { "trade_spam_flood", &battle_config.trade_spam_flood }, - { "trade_spam_ban", &battle_config.trade_spam_ban }, - { "trade_spam_warn", &battle_config.trade_spam_warn }, - { "sit_spam_threshold", &battle_config.sit_spam_threshold }, - { "sit_spam_flood", &battle_config.sit_spam_flood }, - { "sit_spam_ban", &battle_config.sit_spam_ban }, - { "sit_spam_warn", &battle_config.sit_spam_warn } - }; - - if (line[0] == '/' && line[1] == '/') - continue; - if (sscanf(line, "%[^:]:%s", w1, w2) != 2) - continue; - for(i = 0; i < sizeof(data) / (sizeof(data[0])); i++) - if (strcmpi(w1, data[i].str) == 0) - *data[i].val = battle_config_switch(w2); - - if (strcmpi(w1, "import") == 0) - battle_config_read(w2); - } - fclose_(fp); - - if (--count == 0) { - if(battle_config.flooritem_lifetime < 1000) - battle_config.flooritem_lifetime = LIFETIME_FLOORITEM*1000; - if(battle_config.restart_hp_rate < 0) - battle_config.restart_hp_rate = 0; - else if(battle_config.restart_hp_rate > 100) - battle_config.restart_hp_rate = 100; - if(battle_config.restart_sp_rate < 0) - battle_config.restart_sp_rate = 0; - else if(battle_config.restart_sp_rate > 100) - battle_config.restart_sp_rate = 100; - if(battle_config.natural_healhp_interval < NATURAL_HEAL_INTERVAL) - battle_config.natural_healhp_interval=NATURAL_HEAL_INTERVAL; - if(battle_config.natural_healsp_interval < NATURAL_HEAL_INTERVAL) - battle_config.natural_healsp_interval=NATURAL_HEAL_INTERVAL; - if(battle_config.natural_heal_skill_interval < NATURAL_HEAL_INTERVAL) - battle_config.natural_heal_skill_interval=NATURAL_HEAL_INTERVAL; - if(battle_config.natural_heal_weight_rate < 50) - battle_config.natural_heal_weight_rate = 50; - if(battle_config.natural_heal_weight_rate > 101) - battle_config.natural_heal_weight_rate = 101; - battle_config.monster_max_aspd = 2000 - battle_config.monster_max_aspd*10; - if(battle_config.monster_max_aspd < 10) - battle_config.monster_max_aspd = 10; - if(battle_config.monster_max_aspd > 1000) - battle_config.monster_max_aspd = 1000; - battle_config.max_aspd = 2000 - battle_config.max_aspd*10; - if(battle_config.max_aspd < 10) - battle_config.max_aspd = 10; - if(battle_config.max_aspd > 1000) - battle_config.max_aspd = 1000; - if(battle_config.max_hp > 1000000) - battle_config.max_hp = 1000000; - if(battle_config.max_hp < 100) - battle_config.max_hp = 100; - if(battle_config.max_sp > 1000000) - battle_config.max_sp = 1000000; - if(battle_config.max_sp < 100) - battle_config.max_sp = 100; - if(battle_config.max_parameter < 10) - battle_config.max_parameter = 10; - if(battle_config.max_parameter > 10000) - battle_config.max_parameter = 10000; - if(battle_config.max_cart_weight > 1000000) - battle_config.max_cart_weight = 1000000; - if(battle_config.max_cart_weight < 100) - battle_config.max_cart_weight = 100; - battle_config.max_cart_weight *= 10; - - if(battle_config.agi_penaly_count < 2) - battle_config.agi_penaly_count = 2; - if(battle_config.vit_penaly_count < 2) - battle_config.vit_penaly_count = 2; - - if(battle_config.guild_exp_limit > 99) - battle_config.guild_exp_limit = 99; - if(battle_config.guild_exp_limit < 0) - battle_config.guild_exp_limit = 0; - - if(battle_config.castle_defense_rate < 0) - battle_config.castle_defense_rate = 0; - if(battle_config.castle_defense_rate > 100) - battle_config.castle_defense_rate = 100; - if(battle_config.item_drop_common_min < 1) // Added by TyrNemesis^ - battle_config.item_drop_common_min = 1; - if(battle_config.item_drop_common_max > 10000) - battle_config.item_drop_common_max = 10000; - if(battle_config.item_drop_equip_min < 1) - battle_config.item_drop_equip_min = 1; - if(battle_config.item_drop_equip_max > 10000) - battle_config.item_drop_equip_max = 10000; - if(battle_config.item_drop_card_min < 1) - battle_config.item_drop_card_min = 1; - if(battle_config.item_drop_card_max > 10000) - battle_config.item_drop_card_max = 10000; - if(battle_config.item_drop_mvp_min < 1) - battle_config.item_drop_mvp_min = 1; - if(battle_config.item_drop_mvp_max > 10000) - battle_config.item_drop_mvp_max = 10000; // End Addition - - if (battle_config.night_at_start < 0) // added by [Yor] - battle_config.night_at_start = 0; - else if (battle_config.night_at_start > 1) // added by [Yor] - battle_config.night_at_start = 1; - if (battle_config.day_duration < 0) // added by [Yor] - battle_config.day_duration = 0; - if (battle_config.night_duration < 0) // added by [Yor] - battle_config.night_duration = 0; - - if (battle_config.hack_info_GM_level < 0) // added by [Yor] - battle_config.hack_info_GM_level = 0; - else if (battle_config.hack_info_GM_level > 100) - battle_config.hack_info_GM_level = 100; - - if (battle_config.any_warp_GM_min_level < 0) // added by [Yor] - battle_config.any_warp_GM_min_level = 0; - else if (battle_config.any_warp_GM_min_level > 100) - battle_config.any_warp_GM_min_level = 100; - - - if (battle_config.chat_spam_ban < 0) - battle_config.chat_spam_ban = 0; - else if (battle_config.chat_spam_ban > 32767) - battle_config.chat_spam_ban = 32767; - - if (battle_config.chat_spam_flood < 0) - battle_config.chat_spam_flood = 0; - else if (battle_config.chat_spam_flood > 32767) - battle_config.chat_spam_flood = 32767; - - if (battle_config.chat_spam_warn < 0) - battle_config.chat_spam_warn = 0; - else if (battle_config.chat_spam_warn > 32767) - battle_config.chat_spam_warn = 32767; - - if (battle_config.chat_spam_threshold < 0) - battle_config.chat_spam_threshold = 0; - else if (battle_config.chat_spam_threshold > 32767) - battle_config.chat_spam_threshold = 32767; - - if (battle_config.chat_maxline < 1) - battle_config.chat_maxline = 1; - else if (battle_config.chat_maxline > 512) - battle_config.chat_maxline = 512; - - if (battle_config.trade_spam_ban < 0) - battle_config.trade_spam_ban = 0; - else if (battle_config.trade_spam_ban > 32767) - battle_config.trade_spam_ban = 32767; - - if (battle_config.trade_spam_flood < 0) - battle_config.trade_spam_flood = 0; - else if (battle_config.trade_spam_flood > 32767) - battle_config.trade_spam_flood = 32767; - - if (battle_config.trade_spam_warn < 0) - battle_config.trade_spam_warn = 0; - else if (battle_config.trade_spam_warn > 32767) - battle_config.trade_spam_warn = 32767; - - if (battle_config.trade_spam_threshold < 0) - battle_config.trade_spam_threshold = 0; - else if (battle_config.trade_spam_threshold > 32767) - battle_config.trade_spam_threshold = 32767; - - if (battle_config.sit_spam_ban < 0) - battle_config.sit_spam_ban = 0; - else if (battle_config.sit_spam_ban > 32767) - battle_config.sit_spam_ban = 32767; - - if (battle_config.sit_spam_flood < 0) - battle_config.sit_spam_flood = 0; - else if (battle_config.sit_spam_flood > 32767) - battle_config.sit_spam_flood = 32767; - - if (battle_config.sit_spam_warn < 0) - battle_config.sit_spam_warn = 0; - else if (battle_config.sit_spam_warn > 32767) - battle_config.sit_spam_warn = 32767; - - if (battle_config.sit_spam_threshold < 0) - battle_config.sit_spam_threshold = 0; - else if (battle_config.sit_spam_threshold > 32767) - battle_config.sit_spam_threshold = 32767; - - // at least 1 client must be accepted - if ((battle_config.packet_ver_flag & 63) == 0) // added by [Yor] - battle_config.packet_ver_flag = 63; // accept all clients - - add_timer_func_list(battle_delay_damage_sub, "battle_delay_damage_sub"); - } - - return 0; + int i; + char line[1024], w1[1024], w2[1024]; + FILE *fp; + static int count = 0; + + if ((count++) == 0) + { + battle_config.warp_point_debug = 0; + battle_config.enemy_critical = 0; + battle_config.enemy_critical_rate = 100; + battle_config.enemy_str = 1; + battle_config.enemy_perfect_flee = 0; + battle_config.cast_rate = 100; + battle_config.delay_rate = 100; + battle_config.delay_dependon_dex = 0; + battle_config.sdelay_attack_enable = 0; + battle_config.left_cardfix_to_right = 0; + battle_config.pc_skill_add_range = 0; + battle_config.skill_out_range_consume = 1; + battle_config.mob_skill_add_range = 0; + battle_config.pc_damage_delay = 1; + battle_config.pc_damage_delay_rate = 100; + battle_config.defnotenemy = 1; + battle_config.random_monster_checklv = 1; + battle_config.attr_recover = 1; + battle_config.flooritem_lifetime = LIFETIME_FLOORITEM * 1000; + battle_config.item_auto_get = 0; + battle_config.drop_pickup_safety_zone = 20; + battle_config.item_first_get_time = 3000; + battle_config.item_second_get_time = 1000; + battle_config.item_third_get_time = 1000; + battle_config.mvp_item_first_get_time = 10000; + battle_config.mvp_item_second_get_time = 10000; + battle_config.mvp_item_third_get_time = 2000; + + battle_config.drop_rate0item = 0; + battle_config.base_exp_rate = 100; + battle_config.job_exp_rate = 100; + battle_config.pvp_exp = 1; + battle_config.gtb_pvp_only = 0; + battle_config.death_penalty_type = 0; + battle_config.death_penalty_base = 0; + battle_config.death_penalty_job = 0; + battle_config.zeny_penalty = 0; + battle_config.restart_hp_rate = 0; + battle_config.restart_sp_rate = 0; + battle_config.mvp_item_rate = 100; + battle_config.mvp_exp_rate = 100; + battle_config.mvp_hp_rate = 100; + battle_config.monster_hp_rate = 100; + battle_config.monster_max_aspd = 199; + battle_config.atc_gmonly = 0; + battle_config.gm_allskill = 0; + battle_config.gm_allequip = 0; + battle_config.gm_skilluncond = 0; + battle_config.guild_max_castles = 0; + battle_config.skillfree = 0; + battle_config.skillup_limit = 0; + battle_config.wp_rate = 100; + battle_config.pp_rate = 100; + battle_config.monster_active_enable = 1; + battle_config.monster_damage_delay_rate = 100; + battle_config.monster_loot_type = 0; + battle_config.mob_skill_use = 1; + battle_config.mob_count_rate = 100; + battle_config.quest_skill_learn = 0; + battle_config.quest_skill_reset = 1; + battle_config.basic_skill_check = 1; + battle_config.guild_emperium_check = 1; + battle_config.guild_exp_limit = 50; + battle_config.pc_invincible_time = 5000; + battle_config.skill_min_damage = 0; + battle_config.finger_offensive_type = 0; + battle_config.heal_exp = 0; + battle_config.resurrection_exp = 0; + battle_config.shop_exp = 0; + battle_config.combo_delay_rate = 100; + battle_config.item_check = 1; + battle_config.wedding_modifydisplay = 0; + battle_config.natural_healhp_interval = 6000; + battle_config.natural_healsp_interval = 8000; + battle_config.natural_heal_skill_interval = 10000; + battle_config.natural_heal_weight_rate = 50; + battle_config.itemheal_regeneration_factor = 1; + battle_config.item_name_override_grffile = 1; + battle_config.arrow_decrement = 1; + battle_config.max_aspd = 199; + battle_config.max_hp = 32500; + battle_config.max_sp = 32500; + battle_config.max_lv = 99; // [MouseJstr] + battle_config.max_parameter = 99; + battle_config.max_cart_weight = 8000; + battle_config.pc_skill_log = 0; + battle_config.mob_skill_log = 0; + battle_config.battle_log = 0; + battle_config.save_log = 0; + battle_config.error_log = 1; + battle_config.etc_log = 1; + battle_config.save_clothcolor = 0; + battle_config.undead_detect_type = 0; + battle_config.pc_auto_counter_type = 1; + battle_config.monster_auto_counter_type = 1; + battle_config.agi_penaly_type = 0; + battle_config.agi_penaly_count = 3; + battle_config.agi_penaly_num = 0; + battle_config.agi_penaly_count_lv = ATK_FLEE; + battle_config.vit_penaly_type = 0; + battle_config.vit_penaly_count = 3; + battle_config.vit_penaly_num = 0; + battle_config.vit_penaly_count_lv = ATK_DEF; + battle_config.player_defense_type = 0; + battle_config.monster_defense_type = 0; + battle_config.magic_defense_type = 0; + battle_config.pc_skill_reiteration = 0; + battle_config.monster_skill_reiteration = 0; + battle_config.pc_skill_nofootset = 0; + battle_config.monster_skill_nofootset = 0; + battle_config.pc_cloak_check_type = 0; + battle_config.monster_cloak_check_type = 0; + battle_config.gvg_short_damage_rate = 100; + battle_config.gvg_long_damage_rate = 100; + battle_config.gvg_magic_damage_rate = 100; + battle_config.gvg_misc_damage_rate = 100; + battle_config.gvg_eliminate_time = 7000; + battle_config.mob_changetarget_byskill = 0; + battle_config.pc_attack_direction_change = 1; + battle_config.monster_attack_direction_change = 1; + battle_config.pc_undead_nofreeze = 0; + battle_config.pc_land_skill_limit = 1; + battle_config.monster_land_skill_limit = 1; + battle_config.party_skill_penaly = 1; + battle_config.monster_class_change_full_recover = 0; + battle_config.produce_item_name_input = 1; + battle_config.produce_potion_name_input = 1; + battle_config.making_arrow_name_input = 1; + battle_config.holywater_name_input = 1; + battle_config.display_delay_skill_fail = 1; + battle_config.chat_warpportal = 0; + battle_config.mob_warpportal = 0; + battle_config.dead_branch_active = 0; + battle_config.show_steal_in_same_party = 0; + battle_config.enable_upper_class = 0; + battle_config.pc_attack_attr_none = 0; + battle_config.mob_attack_attr_none = 1; + battle_config.mob_ghostring_fix = 0; + battle_config.gx_allhit = 0; + battle_config.gx_cardfix = 0; + battle_config.gx_dupele = 1; + battle_config.gx_disptype = 1; + battle_config.player_skill_partner_check = 1; + battle_config.hide_GM_session = 0; + battle_config.unit_movement_type = 0; + battle_config.invite_request_check = 1; + battle_config.skill_removetrap_type = 0; + battle_config.disp_experience = 0; + battle_config.item_rate_common = 100; + battle_config.item_rate_equip = 100; + battle_config.item_rate_card = 100; + battle_config.item_rate_heal = 100; // Added by Valaris + battle_config.item_rate_use = 100; // End + battle_config.item_drop_common_min = 1; // Added by TyrNemesis^ + battle_config.item_drop_common_max = 10000; + battle_config.item_drop_equip_min = 1; + battle_config.item_drop_equip_max = 10000; + battle_config.item_drop_card_min = 1; + battle_config.item_drop_card_max = 10000; + battle_config.item_drop_mvp_min = 1; + battle_config.item_drop_mvp_max = 10000; // End Addition + battle_config.item_drop_heal_min = 1; // Added by Valaris + battle_config.item_drop_heal_max = 10000; + battle_config.item_drop_use_min = 1; + battle_config.item_drop_use_max = 10000; // End + battle_config.prevent_logout = 1; // Added by RoVeRT + battle_config.maximum_level = 255; // Added by Valaris + battle_config.drops_by_luk = 0; // [Valaris] + battle_config.equipment_breaking = 0; // [Valaris] + battle_config.equipment_break_rate = 100; // [Valaris] + battle_config.pk_mode = 0; // [Valaris] + battle_config.multi_level_up = 0; // [Valaris] + battle_config.backstab_bow_penalty = 0; // Akaru + battle_config.night_at_start = 0; // added by [Yor] + battle_config.day_duration = 2 * 60 * 60 * 1000; // added by [Yor] (2 hours) + battle_config.night_duration = 30 * 60 * 1000; // added by [Yor] (30 minutes) + battle_config.show_mob_hp = 0; // [Valaris] + battle_config.hack_info_GM_level = 60; // added by [Yor] (default: 60, GM level) + battle_config.any_warp_GM_min_level = 20; // added by [Yor] + battle_config.packet_ver_flag = 63; // added by [Yor] + battle_config.min_hair_style = 0; + battle_config.max_hair_style = 20; + battle_config.min_hair_color = 0; + battle_config.max_hair_color = 9; + battle_config.min_cloth_color = 0; + battle_config.max_cloth_color = 4; + + battle_config.castrate_dex_scale = 150; + + battle_config.area_size = 14; + + battle_config.chat_lame_penalty = 2; + battle_config.chat_spam_threshold = 10; + battle_config.chat_spam_flood = 10; + battle_config.chat_spam_ban = 1; + battle_config.chat_spam_warn = 8; + battle_config.chat_maxline = 255; + + battle_config.trade_spam_threshold = 10; + battle_config.trade_spam_flood = 10; + battle_config.trade_spam_ban = 0; + battle_config.trade_spam_warn = 8; + + battle_config.sit_spam_threshold = 1; + battle_config.sit_spam_flood = 15; + battle_config.sit_spam_ban = 0; + battle_config.sit_spam_warn = 3; + } + + fp = fopen_ (cfgName, "r"); + if (fp == NULL) + { + printf ("file not found: %s\n", cfgName); + return 1; + } + while (fgets (line, 1020, fp)) + { + const struct + { + char str[128]; + int *val; + } data[] = + { + { + "warp_point_debug", &battle_config.warp_point_debug}, + { + "enemy_critical", &battle_config.enemy_critical}, + { + "enemy_critical_rate", &battle_config.enemy_critical_rate}, + { + "enemy_str", &battle_config.enemy_str}, + { + "enemy_perfect_flee", &battle_config.enemy_perfect_flee}, + { + "casting_rate", &battle_config.cast_rate}, + { + "delay_rate", &battle_config.delay_rate}, + { + "delay_dependon_dex", &battle_config.delay_dependon_dex}, + { + "skill_delay_attack_enable", + &battle_config.sdelay_attack_enable}, + { + "left_cardfix_to_right", &battle_config.left_cardfix_to_right}, + { + "player_skill_add_range", &battle_config.pc_skill_add_range}, + { + "skill_out_range_consume", + &battle_config.skill_out_range_consume}, + { + "monster_skill_add_range", &battle_config.mob_skill_add_range}, + { + "player_damage_delay", &battle_config.pc_damage_delay}, + { + "player_damage_delay_rate", + &battle_config.pc_damage_delay_rate}, + { + "defunit_not_enemy", &battle_config.defnotenemy}, + { + "random_monster_checklv", + &battle_config.random_monster_checklv}, + { + "attribute_recover", &battle_config.attr_recover}, + { + "flooritem_lifetime", &battle_config.flooritem_lifetime}, + { + "item_auto_get", &battle_config.item_auto_get}, + { + "drop_pickup_safety_zone", + &battle_config.drop_pickup_safety_zone}, + { + "item_first_get_time", &battle_config.item_first_get_time}, + { + "item_second_get_time", &battle_config.item_second_get_time}, + { + "item_third_get_time", &battle_config.item_third_get_time}, + { + "mvp_item_first_get_time", + &battle_config.mvp_item_first_get_time}, + { + "mvp_item_second_get_time", + &battle_config.mvp_item_second_get_time}, + { + "mvp_item_third_get_time", + &battle_config.mvp_item_third_get_time}, + { + "item_rate", &battle_config.item_rate}, + { + "drop_rate0item", &battle_config.drop_rate0item}, + { + "base_exp_rate", &battle_config.base_exp_rate}, + { + "job_exp_rate", &battle_config.job_exp_rate}, + { + "pvp_exp", &battle_config.pvp_exp}, + { + "gtb_pvp_only", &battle_config.gtb_pvp_only}, + { + "guild_max_castles", &battle_config.guild_max_castles}, + { + "death_penalty_type", &battle_config.death_penalty_type}, + { + "death_penalty_base", &battle_config.death_penalty_base}, + { + "death_penalty_job", &battle_config.death_penalty_job}, + { + "zeny_penalty", &battle_config.zeny_penalty}, + { + "restart_hp_rate", &battle_config.restart_hp_rate}, + { + "restart_sp_rate", &battle_config.restart_sp_rate}, + { + "mvp_hp_rate", &battle_config.mvp_hp_rate}, + { + "mvp_item_rate", &battle_config.mvp_item_rate}, + { + "mvp_exp_rate", &battle_config.mvp_exp_rate}, + { + "monster_hp_rate", &battle_config.monster_hp_rate}, + { + "monster_max_aspd", &battle_config.monster_max_aspd}, + { + "atcommand_gm_only", &battle_config.atc_gmonly}, + { + "atcommand_spawn_quantity_limit", + &battle_config.atc_spawn_quantity_limit}, + { + "gm_all_skill", &battle_config.gm_allskill}, + { + "gm_all_skill_add_abra", &battle_config.gm_allskill_addabra}, + { + "gm_all_equipment", &battle_config.gm_allequip}, + { + "gm_skill_unconditional", &battle_config.gm_skilluncond}, + { + "player_skillfree", &battle_config.skillfree}, + { + "player_skillup_limit", &battle_config.skillup_limit}, + { + "weapon_produce_rate", &battle_config.wp_rate}, + { + "potion_produce_rate", &battle_config.pp_rate}, + { + "monster_active_enable", &battle_config.monster_active_enable}, + { + "monster_damage_delay_rate", + &battle_config.monster_damage_delay_rate}, + { + "monster_loot_type", &battle_config.monster_loot_type}, + { + "mob_skill_use", &battle_config.mob_skill_use}, + { + "mob_count_rate", &battle_config.mob_count_rate}, + { + "quest_skill_learn", &battle_config.quest_skill_learn}, + { + "quest_skill_reset", &battle_config.quest_skill_reset}, + { + "basic_skill_check", &battle_config.basic_skill_check}, + { + "guild_emperium_check", &battle_config.guild_emperium_check}, + { + "guild_exp_limit", &battle_config.guild_exp_limit}, + { + "player_invincible_time", &battle_config.pc_invincible_time}, + { + "skill_min_damage", &battle_config.skill_min_damage}, + { + "finger_offensive_type", &battle_config.finger_offensive_type}, + { + "heal_exp", &battle_config.heal_exp}, + { + "resurrection_exp", &battle_config.resurrection_exp}, + { + "shop_exp", &battle_config.shop_exp}, + { + "combo_delay_rate", &battle_config.combo_delay_rate}, + { + "item_check", &battle_config.item_check}, + { + "wedding_modifydisplay", &battle_config.wedding_modifydisplay}, + { + "natural_healhp_interval", + &battle_config.natural_healhp_interval}, + { + "natural_healsp_interval", + &battle_config.natural_healsp_interval}, + { + "natural_heal_skill_interval", + &battle_config.natural_heal_skill_interval}, + { + "natural_heal_weight_rate", + &battle_config.natural_heal_weight_rate}, + { + "itemheal_regeneration_factor", + &battle_config.itemheal_regeneration_factor}, + { + "item_name_override_grffile", + &battle_config.item_name_override_grffile}, + { + "arrow_decrement", &battle_config.arrow_decrement}, + { + "max_aspd", &battle_config.max_aspd}, + { + "max_hp", &battle_config.max_hp}, + { + "max_sp", &battle_config.max_sp}, + { + "max_lv", &battle_config.max_lv}, + { + "max_parameter", &battle_config.max_parameter}, + { + "max_cart_weight", &battle_config.max_cart_weight}, + { + "player_skill_log", &battle_config.pc_skill_log}, + { + "monster_skill_log", &battle_config.mob_skill_log}, + { + "battle_log", &battle_config.battle_log}, + { + "save_log", &battle_config.save_log}, + { + "error_log", &battle_config.error_log}, + { + "etc_log", &battle_config.etc_log}, + { + "save_clothcolor", &battle_config.save_clothcolor}, + { + "undead_detect_type", &battle_config.undead_detect_type}, + { + "player_auto_counter_type", + &battle_config.pc_auto_counter_type}, + { + "monster_auto_counter_type", + &battle_config.monster_auto_counter_type}, + { + "agi_penaly_type", &battle_config.agi_penaly_type}, + { + "agi_penaly_count", &battle_config.agi_penaly_count}, + { + "agi_penaly_num", &battle_config.agi_penaly_num}, + { + "agi_penaly_count_lv", &battle_config.agi_penaly_count_lv}, + { + "vit_penaly_type", &battle_config.vit_penaly_type}, + { + "vit_penaly_count", &battle_config.vit_penaly_count}, + { + "vit_penaly_num", &battle_config.vit_penaly_num}, + { + "vit_penaly_count_lv", &battle_config.vit_penaly_count_lv}, + { + "player_defense_type", &battle_config.player_defense_type}, + { + "monster_defense_type", &battle_config.monster_defense_type}, + { + "magic_defense_type", &battle_config.magic_defense_type}, + { + "player_skill_reiteration", + &battle_config.pc_skill_reiteration}, + { + "monster_skill_reiteration", + &battle_config.monster_skill_reiteration}, + { + "player_skill_nofootset", &battle_config.pc_skill_nofootset}, + { + "monster_skill_nofootset", + &battle_config.monster_skill_nofootset}, + { + "player_cloak_check_type", &battle_config.pc_cloak_check_type}, + { + "monster_cloak_check_type", + &battle_config.monster_cloak_check_type}, + { + "gvg_short_attack_damage_rate", + &battle_config.gvg_short_damage_rate}, + { + "gvg_long_attack_damage_rate", + &battle_config.gvg_long_damage_rate}, + { + "gvg_magic_attack_damage_rate", + &battle_config.gvg_magic_damage_rate}, + { + "gvg_misc_attack_damage_rate", + &battle_config.gvg_misc_damage_rate}, + { + "gvg_eliminate_time", &battle_config.gvg_eliminate_time}, + { + "mob_changetarget_byskill", + &battle_config.mob_changetarget_byskill}, + { + "player_attack_direction_change", + &battle_config.pc_attack_direction_change}, + { + "monster_attack_direction_change", + &battle_config.monster_attack_direction_change}, + { + "player_land_skill_limit", &battle_config.pc_land_skill_limit}, + { + "monster_land_skill_limit", + &battle_config.monster_land_skill_limit}, + { + "party_skill_penaly", &battle_config.party_skill_penaly}, + { + "monster_class_change_full_recover", + &battle_config.monster_class_change_full_recover}, + { + "produce_item_name_input", + &battle_config.produce_item_name_input}, + { + "produce_potion_name_input", + &battle_config.produce_potion_name_input}, + { + "making_arrow_name_input", + &battle_config.making_arrow_name_input}, + { + "holywater_name_input", &battle_config.holywater_name_input}, + { + "display_delay_skill_fail", + &battle_config.display_delay_skill_fail}, + { + "chat_warpportal", &battle_config.chat_warpportal}, + { + "mob_warpportal", &battle_config.mob_warpportal}, + { + "dead_branch_active", &battle_config.dead_branch_active}, + { + "show_steal_in_same_party", + &battle_config.show_steal_in_same_party}, + { + "enable_upper_class", &battle_config.enable_upper_class}, + { + "mob_attack_attr_none", &battle_config.mob_attack_attr_none}, + { + "mob_ghostring_fix", &battle_config.mob_ghostring_fix}, + { + "pc_attack_attr_none", &battle_config.pc_attack_attr_none}, + { + "gx_allhit", &battle_config.gx_allhit}, + { + "gx_cardfix", &battle_config.gx_cardfix}, + { + "gx_dupele", &battle_config.gx_dupele}, + { + "gx_disptype", &battle_config.gx_disptype}, + { + "player_skill_partner_check", + &battle_config.player_skill_partner_check}, + { + "hide_GM_session", &battle_config.hide_GM_session}, + { + "unit_movement_type", &battle_config.unit_movement_type}, + { + "invite_request_check", &battle_config.invite_request_check}, + { + "skill_removetrap_type", &battle_config.skill_removetrap_type}, + { + "disp_experience", &battle_config.disp_experience}, + { + "castle_defense_rate", &battle_config.castle_defense_rate}, + { + "riding_weight", &battle_config.riding_weight}, + { + "item_rate_common", &battle_config.item_rate_common}, // Added by RoVeRT + { + "item_rate_equip", &battle_config.item_rate_equip}, + { + "item_rate_card", &battle_config.item_rate_card}, // End Addition + { + "item_rate_heal", &battle_config.item_rate_heal}, // Added by Valaris + { + "item_rate_use", &battle_config.item_rate_use}, // End + { + "item_drop_common_min", &battle_config.item_drop_common_min}, // Added by TyrNemesis^ + { + "item_drop_common_max", &battle_config.item_drop_common_max}, + { + "item_drop_equip_min", &battle_config.item_drop_equip_min}, + { + "item_drop_equip_max", &battle_config.item_drop_equip_max}, + { + "item_drop_card_min", &battle_config.item_drop_card_min}, + { + "item_drop_card_max", &battle_config.item_drop_card_max}, + { + "item_drop_mvp_min", &battle_config.item_drop_mvp_min}, + { + "item_drop_mvp_max", &battle_config.item_drop_mvp_max}, // End Addition + { + "prevent_logout", &battle_config.prevent_logout}, // Added by RoVeRT + { + "alchemist_summon_reward", &battle_config.alchemist_summon_reward}, // [Valaris] + { + "maximum_level", &battle_config.maximum_level}, // [Valaris] + { + "drops_by_luk", &battle_config.drops_by_luk}, // [Valaris] + { + "monsters_ignore_gm", &battle_config.monsters_ignore_gm}, // [Valaris] + { + "equipment_breaking", &battle_config.equipment_breaking}, // [Valaris] + { + "equipment_break_rate", &battle_config.equipment_break_rate}, // [Valaris] + { + "pk_mode", &battle_config.pk_mode}, // [Valaris] + { + "multi_level_up", &battle_config.multi_level_up}, // [Valaris] + { + "backstab_bow_penalty", &battle_config.backstab_bow_penalty}, + { + "night_at_start", &battle_config.night_at_start}, // added by [Yor] + { + "day_duration", &battle_config.day_duration}, // added by [Yor] + { + "night_duration", &battle_config.night_duration}, // added by [Yor] + { + "show_mob_hp", &battle_config.show_mob_hp}, // [Valaris] + { + "hack_info_GM_level", &battle_config.hack_info_GM_level}, // added by [Yor] + { + "any_warp_GM_min_level", &battle_config.any_warp_GM_min_level}, // added by [Yor] + { + "packet_ver_flag", &battle_config.packet_ver_flag}, // added by [Yor] + { + "min_hair_style", &battle_config.min_hair_style}, // added by [MouseJstr] + { + "max_hair_style", &battle_config.max_hair_style}, // added by [MouseJstr] + { + "min_hair_color", &battle_config.min_hair_color}, // added by [MouseJstr] + { + "max_hair_color", &battle_config.max_hair_color}, // added by [MouseJstr] + { + "min_cloth_color", &battle_config.min_cloth_color}, // added by [MouseJstr] + { + "max_cloth_color", &battle_config.max_cloth_color}, // added by [MouseJstr] + { + "castrate_dex_scale", &battle_config.castrate_dex_scale}, // added by [MouseJstr] + { + "area_size", &battle_config.area_size}, // added by [MouseJstr] + { + "muting_players", &battle_config.muting_players}, // added by [Apple] + { + "chat_lame_penalty", &battle_config.chat_lame_penalty}, + { + "chat_spam_threshold", &battle_config.chat_spam_threshold}, + { + "chat_spam_flood", &battle_config.chat_spam_flood}, + { + "chat_spam_ban", &battle_config.chat_spam_ban}, + { + "chat_spam_warn", &battle_config.chat_spam_warn}, + { + "chat_maxline", &battle_config.chat_maxline}, + { + "trade_spam_threshold", &battle_config.trade_spam_threshold}, + { + "trade_spam_flood", &battle_config.trade_spam_flood}, + { + "trade_spam_ban", &battle_config.trade_spam_ban}, + { + "trade_spam_warn", &battle_config.trade_spam_warn}, + { + "sit_spam_threshold", &battle_config.sit_spam_threshold}, + { + "sit_spam_flood", &battle_config.sit_spam_flood}, + { + "sit_spam_ban", &battle_config.sit_spam_ban}, + { + "sit_spam_warn", &battle_config.sit_spam_warn} + }; + + if (line[0] == '/' && line[1] == '/') + continue; + if (sscanf (line, "%[^:]:%s", w1, w2) != 2) + continue; + for (i = 0; i < sizeof (data) / (sizeof (data[0])); i++) + if (strcmpi (w1, data[i].str) == 0) + *data[i].val = battle_config_switch (w2); + + if (strcmpi (w1, "import") == 0) + battle_config_read (w2); + } + fclose_ (fp); + + if (--count == 0) + { + if (battle_config.flooritem_lifetime < 1000) + battle_config.flooritem_lifetime = LIFETIME_FLOORITEM * 1000; + if (battle_config.restart_hp_rate < 0) + battle_config.restart_hp_rate = 0; + else if (battle_config.restart_hp_rate > 100) + battle_config.restart_hp_rate = 100; + if (battle_config.restart_sp_rate < 0) + battle_config.restart_sp_rate = 0; + else if (battle_config.restart_sp_rate > 100) + battle_config.restart_sp_rate = 100; + if (battle_config.natural_healhp_interval < NATURAL_HEAL_INTERVAL) + battle_config.natural_healhp_interval = NATURAL_HEAL_INTERVAL; + if (battle_config.natural_healsp_interval < NATURAL_HEAL_INTERVAL) + battle_config.natural_healsp_interval = NATURAL_HEAL_INTERVAL; + if (battle_config.natural_heal_skill_interval < NATURAL_HEAL_INTERVAL) + battle_config.natural_heal_skill_interval = NATURAL_HEAL_INTERVAL; + if (battle_config.natural_heal_weight_rate < 50) + battle_config.natural_heal_weight_rate = 50; + if (battle_config.natural_heal_weight_rate > 101) + battle_config.natural_heal_weight_rate = 101; + battle_config.monster_max_aspd = + 2000 - battle_config.monster_max_aspd * 10; + if (battle_config.monster_max_aspd < 10) + battle_config.monster_max_aspd = 10; + if (battle_config.monster_max_aspd > 1000) + battle_config.monster_max_aspd = 1000; + battle_config.max_aspd = 2000 - battle_config.max_aspd * 10; + if (battle_config.max_aspd < 10) + battle_config.max_aspd = 10; + if (battle_config.max_aspd > 1000) + battle_config.max_aspd = 1000; + if (battle_config.max_hp > 1000000) + battle_config.max_hp = 1000000; + if (battle_config.max_hp < 100) + battle_config.max_hp = 100; + if (battle_config.max_sp > 1000000) + battle_config.max_sp = 1000000; + if (battle_config.max_sp < 100) + battle_config.max_sp = 100; + if (battle_config.max_parameter < 10) + battle_config.max_parameter = 10; + if (battle_config.max_parameter > 10000) + battle_config.max_parameter = 10000; + if (battle_config.max_cart_weight > 1000000) + battle_config.max_cart_weight = 1000000; + if (battle_config.max_cart_weight < 100) + battle_config.max_cart_weight = 100; + battle_config.max_cart_weight *= 10; + + if (battle_config.agi_penaly_count < 2) + battle_config.agi_penaly_count = 2; + if (battle_config.vit_penaly_count < 2) + battle_config.vit_penaly_count = 2; + + if (battle_config.guild_exp_limit > 99) + battle_config.guild_exp_limit = 99; + if (battle_config.guild_exp_limit < 0) + battle_config.guild_exp_limit = 0; + + if (battle_config.castle_defense_rate < 0) + battle_config.castle_defense_rate = 0; + if (battle_config.castle_defense_rate > 100) + battle_config.castle_defense_rate = 100; + if (battle_config.item_drop_common_min < 1) // Added by TyrNemesis^ + battle_config.item_drop_common_min = 1; + if (battle_config.item_drop_common_max > 10000) + battle_config.item_drop_common_max = 10000; + if (battle_config.item_drop_equip_min < 1) + battle_config.item_drop_equip_min = 1; + if (battle_config.item_drop_equip_max > 10000) + battle_config.item_drop_equip_max = 10000; + if (battle_config.item_drop_card_min < 1) + battle_config.item_drop_card_min = 1; + if (battle_config.item_drop_card_max > 10000) + battle_config.item_drop_card_max = 10000; + if (battle_config.item_drop_mvp_min < 1) + battle_config.item_drop_mvp_min = 1; + if (battle_config.item_drop_mvp_max > 10000) + battle_config.item_drop_mvp_max = 10000; // End Addition + + if (battle_config.night_at_start < 0) // added by [Yor] + battle_config.night_at_start = 0; + else if (battle_config.night_at_start > 1) // added by [Yor] + battle_config.night_at_start = 1; + if (battle_config.day_duration < 0) // added by [Yor] + battle_config.day_duration = 0; + if (battle_config.night_duration < 0) // added by [Yor] + battle_config.night_duration = 0; + + if (battle_config.hack_info_GM_level < 0) // added by [Yor] + battle_config.hack_info_GM_level = 0; + else if (battle_config.hack_info_GM_level > 100) + battle_config.hack_info_GM_level = 100; + + if (battle_config.any_warp_GM_min_level < 0) // added by [Yor] + battle_config.any_warp_GM_min_level = 0; + else if (battle_config.any_warp_GM_min_level > 100) + battle_config.any_warp_GM_min_level = 100; + + if (battle_config.chat_spam_ban < 0) + battle_config.chat_spam_ban = 0; + else if (battle_config.chat_spam_ban > 32767) + battle_config.chat_spam_ban = 32767; + + if (battle_config.chat_spam_flood < 0) + battle_config.chat_spam_flood = 0; + else if (battle_config.chat_spam_flood > 32767) + battle_config.chat_spam_flood = 32767; + + if (battle_config.chat_spam_warn < 0) + battle_config.chat_spam_warn = 0; + else if (battle_config.chat_spam_warn > 32767) + battle_config.chat_spam_warn = 32767; + + if (battle_config.chat_spam_threshold < 0) + battle_config.chat_spam_threshold = 0; + else if (battle_config.chat_spam_threshold > 32767) + battle_config.chat_spam_threshold = 32767; + + if (battle_config.chat_maxline < 1) + battle_config.chat_maxline = 1; + else if (battle_config.chat_maxline > 512) + battle_config.chat_maxline = 512; + + if (battle_config.trade_spam_ban < 0) + battle_config.trade_spam_ban = 0; + else if (battle_config.trade_spam_ban > 32767) + battle_config.trade_spam_ban = 32767; + + if (battle_config.trade_spam_flood < 0) + battle_config.trade_spam_flood = 0; + else if (battle_config.trade_spam_flood > 32767) + battle_config.trade_spam_flood = 32767; + + if (battle_config.trade_spam_warn < 0) + battle_config.trade_spam_warn = 0; + else if (battle_config.trade_spam_warn > 32767) + battle_config.trade_spam_warn = 32767; + + if (battle_config.trade_spam_threshold < 0) + battle_config.trade_spam_threshold = 0; + else if (battle_config.trade_spam_threshold > 32767) + battle_config.trade_spam_threshold = 32767; + + if (battle_config.sit_spam_ban < 0) + battle_config.sit_spam_ban = 0; + else if (battle_config.sit_spam_ban > 32767) + battle_config.sit_spam_ban = 32767; + + if (battle_config.sit_spam_flood < 0) + battle_config.sit_spam_flood = 0; + else if (battle_config.sit_spam_flood > 32767) + battle_config.sit_spam_flood = 32767; + + if (battle_config.sit_spam_warn < 0) + battle_config.sit_spam_warn = 0; + else if (battle_config.sit_spam_warn > 32767) + battle_config.sit_spam_warn = 32767; + + if (battle_config.sit_spam_threshold < 0) + battle_config.sit_spam_threshold = 0; + else if (battle_config.sit_spam_threshold > 32767) + battle_config.sit_spam_threshold = 32767; + + // at least 1 client must be accepted + if ((battle_config.packet_ver_flag & 63) == 0) // added by [Yor] + battle_config.packet_ver_flag = 63; // accept all clients + + add_timer_func_list (battle_delay_damage_sub, + "battle_delay_damage_sub"); + } + + return 0; } diff --git a/src/map/battle.h b/src/map/battle.h index 6b4860d..4270b5b 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -3,13 +3,14 @@ #define _BATTLE_H_ // ダメージ -struct Damage { - int damage,damage2; - int type,div_; - int amotion,dmotion; - int blewcount; - int flag; - int dmg_lv; //囲まれ減算計算用 0:スキル攻撃 ATK_LUCKY,ATK_FLEE,ATK_DEF +struct Damage +{ + int damage, damage2; + int type, div_; + int amotion, dmotion; + int blewcount; + int flag; + int dmg_lv; //囲まれ減算計算用 0:スキル攻撃 ATK_LUCKY,ATK_FLEE,ATK_DEF }; // 属性表(読み込みはpc.c、battle_attr_fixで使用) @@ -21,322 +22,340 @@ struct block_list; // ダメージ計算 -struct Damage battle_calc_attack( int attack_type, - struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag); -struct Damage battle_calc_weapon_attack( - struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag); -struct Damage battle_calc_magic_attack( - struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag); -struct Damage battle_calc_misc_attack( - struct block_list *bl,struct block_list *target,int skill_num,int skill_lv,int flag); +struct Damage battle_calc_attack (int attack_type, + struct block_list *bl, + struct block_list *target, int skill_num, + int skill_lv, int flag); +struct Damage battle_calc_weapon_attack (struct block_list *bl, + struct block_list *target, + int skill_num, int skill_lv, + int flag); +struct Damage battle_calc_magic_attack (struct block_list *bl, + struct block_list *target, + int skill_num, int skill_lv, + int flag); +struct Damage battle_calc_misc_attack (struct block_list *bl, + struct block_list *target, + int skill_num, int skill_lv, int flag); // 属性修正計算 -int battle_attr_fix(int damage,int atk_elem,int def_elem); +int battle_attr_fix (int damage, int atk_elem, int def_elem); // ダメージ最終計算 -int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,int div_,int skill_num,int skill_lv,int flag); -enum { // 最終計算のフラグ - BF_WEAPON = 0x0001, - BF_MAGIC = 0x0002, - BF_MISC = 0x0004, - BF_SHORT = 0x0010, - BF_LONG = 0x0040, - BF_SKILL = 0x0100, - BF_NORMAL = 0x0200, - BF_WEAPONMASK=0x000f, - BF_RANGEMASK= 0x00f0, - BF_SKILLMASK= 0x0f00, +int battle_calc_damage (struct block_list *src, struct block_list *bl, + int damage, int div_, int skill_num, int skill_lv, + int flag); +enum +{ // 最終計算のフラグ + BF_WEAPON = 0x0001, + BF_MAGIC = 0x0002, + BF_MISC = 0x0004, + BF_SHORT = 0x0010, + BF_LONG = 0x0040, + BF_SKILL = 0x0100, + BF_NORMAL = 0x0200, + BF_WEAPONMASK = 0x000f, + BF_RANGEMASK = 0x00f0, + BF_SKILLMASK = 0x0f00, }; // 実際にHPを増減 -int battle_delay_damage(unsigned int tick,struct block_list *src,struct block_list *target,int damage,int flag); -int battle_damage(struct block_list *bl,struct block_list *target,int damage,int flag); -int battle_heal(struct block_list *bl,struct block_list *target,int hp,int sp,int flag); +int battle_delay_damage (unsigned int tick, struct block_list *src, + struct block_list *target, int damage, int flag); +int battle_damage (struct block_list *bl, struct block_list *target, + int damage, int flag); +int battle_heal (struct block_list *bl, struct block_list *target, int hp, + int sp, int flag); // 攻撃や移動を止める -int battle_stopattack(struct block_list *bl); -int battle_stopwalking(struct block_list *bl,int type); +int battle_stopattack (struct block_list *bl); +int battle_stopwalking (struct block_list *bl, int type); // 通常攻撃処理まとめ -int battle_weapon_attack( struct block_list *bl,struct block_list *target, - unsigned int tick,int flag); +int battle_weapon_attack (struct block_list *bl, struct block_list *target, + unsigned int tick, int flag); // 各種パラメータを得る -int battle_counttargeted(struct block_list *bl,struct block_list *src,int target_lv); -int battle_is_unarmed(struct block_list *bl); -int battle_get_class(struct block_list *bl); -int battle_get_dir(struct block_list *bl); -int battle_get_lv(struct block_list *bl); -int battle_get_range(struct block_list *bl); -int battle_get_hp(struct block_list *bl); -int battle_get_max_hp(struct block_list *bl); -int battle_get_str(struct block_list *bl); -int battle_get_agi(struct block_list *bl); -int battle_get_vit(struct block_list *bl); -int battle_get_int(struct block_list *bl); -int battle_get_dex(struct block_list *bl); -int battle_get_luk(struct block_list *bl); -int battle_get_hit(struct block_list *bl); -int battle_get_flee(struct block_list *bl); -int battle_get_def(struct block_list *bl); -int battle_get_mdef(struct block_list *bl); -int battle_get_flee2(struct block_list *bl); -int battle_get_def2(struct block_list *bl); -int battle_get_mdef2(struct block_list *bl); -int battle_get_baseatk(struct block_list *bl); -int battle_get_atk(struct block_list *bl); -int battle_get_atk2(struct block_list *bl); -int battle_get_speed(struct block_list *bl); -int battle_get_adelay(struct block_list *bl); -int battle_get_amotion(struct block_list *bl); -int battle_get_dmotion(struct block_list *bl); -int battle_get_element(struct block_list *bl); -int battle_get_attack_element(struct block_list *bl); -int battle_get_attack_element2(struct block_list *bl); //左手武器属性取得 +int battle_counttargeted (struct block_list *bl, struct block_list *src, + int target_lv); +int battle_is_unarmed (struct block_list *bl); +int battle_get_class (struct block_list *bl); +int battle_get_dir (struct block_list *bl); +int battle_get_lv (struct block_list *bl); +int battle_get_range (struct block_list *bl); +int battle_get_hp (struct block_list *bl); +int battle_get_max_hp (struct block_list *bl); +int battle_get_str (struct block_list *bl); +int battle_get_agi (struct block_list *bl); +int battle_get_vit (struct block_list *bl); +int battle_get_int (struct block_list *bl); +int battle_get_dex (struct block_list *bl); +int battle_get_luk (struct block_list *bl); +int battle_get_hit (struct block_list *bl); +int battle_get_flee (struct block_list *bl); +int battle_get_def (struct block_list *bl); +int battle_get_mdef (struct block_list *bl); +int battle_get_flee2 (struct block_list *bl); +int battle_get_def2 (struct block_list *bl); +int battle_get_mdef2 (struct block_list *bl); +int battle_get_baseatk (struct block_list *bl); +int battle_get_atk (struct block_list *bl); +int battle_get_atk2 (struct block_list *bl); +int battle_get_speed (struct block_list *bl); +int battle_get_adelay (struct block_list *bl); +int battle_get_amotion (struct block_list *bl); +int battle_get_dmotion (struct block_list *bl); +int battle_get_element (struct block_list *bl); +int battle_get_attack_element (struct block_list *bl); +int battle_get_attack_element2 (struct block_list *bl); //左手武器属性取得 #define battle_get_elem_type(bl) (battle_get_element(bl)%10) #define battle_get_elem_level(bl) (battle_get_element(bl)/10/2) -int battle_get_party_id(struct block_list *bl); -int battle_get_guild_id(struct block_list *bl); -int battle_get_race(struct block_list *bl); -int battle_get_size(struct block_list *bl); -int battle_get_mode(struct block_list *bl); -int battle_get_mexp(struct block_list *bl); -int battle_get_stat(int stat_id /* SP_VIT or similar */, struct block_list *bl); - -struct status_change *battle_get_sc_data(struct block_list *bl); -short *battle_get_sc_count(struct block_list *bl); -short *battle_get_opt1(struct block_list *bl); -short *battle_get_opt2(struct block_list *bl); -short *battle_get_opt3(struct block_list *bl); -short *battle_get_option(struct block_list *bl); - -enum { - BCT_NOENEMY =0x00000, - BCT_PARTY =0x10000, - BCT_ENEMY =0x40000, - BCT_NOPARTY =0x50000, - BCT_ALL =0x20000, - BCT_NOONE =0x60000, -}; +int battle_get_party_id (struct block_list *bl); +int battle_get_guild_id (struct block_list *bl); +int battle_get_race (struct block_list *bl); +int battle_get_size (struct block_list *bl); +int battle_get_mode (struct block_list *bl); +int battle_get_mexp (struct block_list *bl); +int battle_get_stat (int stat_id /* SP_VIT or similar */ , + struct block_list *bl); + +struct status_change *battle_get_sc_data (struct block_list *bl); +short *battle_get_sc_count (struct block_list *bl); +short *battle_get_opt1 (struct block_list *bl); +short *battle_get_opt2 (struct block_list *bl); +short *battle_get_opt3 (struct block_list *bl); +short *battle_get_option (struct block_list *bl); -int battle_check_undead(int race,int element); -int battle_check_target( struct block_list *src, struct block_list *target,int flag); -int battle_check_range(struct block_list *src,struct block_list *bl,int range); +enum +{ + BCT_NOENEMY = 0x00000, + BCT_PARTY = 0x10000, + BCT_ENEMY = 0x40000, + BCT_NOPARTY = 0x50000, + BCT_ALL = 0x20000, + BCT_NOONE = 0x60000, +}; +int battle_check_undead (int race, int element); +int battle_check_target (struct block_list *src, struct block_list *target, + int flag); +int battle_check_range (struct block_list *src, struct block_list *bl, + int range); // 設定 -int battle_config_switch(const char *str); // [Valaris] - -extern struct Battle_Config { - int warp_point_debug; - int enemy_critical; - int enemy_critical_rate; - int enemy_str; - int enemy_perfect_flee; - int cast_rate,delay_rate,delay_dependon_dex; - int sdelay_attack_enable; - int left_cardfix_to_right; - int pc_skill_add_range; - int skill_out_range_consume; - int mob_skill_add_range; - int pc_damage_delay; - int pc_damage_delay_rate; - int defnotenemy; - int random_monster_checklv; - int attr_recover; - int flooritem_lifetime; - int item_auto_get; - int item_first_get_time; - int item_second_get_time; - int item_third_get_time; - int mvp_item_first_get_time; - int mvp_item_second_get_time; - int mvp_item_third_get_time; - int item_rate,base_exp_rate,job_exp_rate; // removed item rate, depreciated - int drop_rate0item; - int death_penalty_type; - int death_penalty_base,death_penalty_job; - int pvp_exp; // [MouseJstr] - int gtb_pvp_only; // [MouseJstr] - int zeny_penalty; - int restart_hp_rate; - int restart_sp_rate; - int mvp_item_rate,mvp_exp_rate; - int mvp_hp_rate; - int monster_hp_rate; - int monster_max_aspd; - int atc_gmonly; - int atc_spawn_quantity_limit; - int gm_allskill; - int gm_allskill_addabra; - int gm_allequip; - int gm_skilluncond; - int skillfree; - int skillup_limit; - int wp_rate; - int pp_rate; - int monster_active_enable; - int monster_damage_delay_rate; - int monster_loot_type; - int mob_skill_use; - int mob_count_rate; - int quest_skill_learn; - int quest_skill_reset; - int basic_skill_check; - int guild_emperium_check; - int guild_exp_limit; - int guild_max_castles; - int pc_invincible_time; - int skill_min_damage; - int finger_offensive_type; - int heal_exp; - int resurrection_exp; - int shop_exp; - int combo_delay_rate; - int item_check; - int wedding_modifydisplay; - int natural_healhp_interval; - int natural_healsp_interval; - int natural_heal_skill_interval; - int natural_heal_weight_rate; - int item_name_override_grffile; - int arrow_decrement; - int max_aspd; - int max_hp; - int max_sp; - int max_lv; - int max_parameter; - int max_cart_weight; - int pc_skill_log; - int mob_skill_log; - int battle_log; - int save_log; - int error_log; - int etc_log; - int save_clothcolor; - int undead_detect_type; - int pc_auto_counter_type; - int monster_auto_counter_type; - int agi_penaly_type; - int agi_penaly_count; - int agi_penaly_num; - int vit_penaly_type; - int vit_penaly_count; - int vit_penaly_num; - int player_defense_type; - int monster_defense_type; - int magic_defense_type; - int pc_skill_reiteration; - int monster_skill_reiteration; - int pc_skill_nofootset; - int monster_skill_nofootset; - int pc_cloak_check_type; - int monster_cloak_check_type; - int gvg_short_damage_rate; - int gvg_long_damage_rate; - int gvg_magic_damage_rate; - int gvg_misc_damage_rate; - int gvg_eliminate_time; - int mob_changetarget_byskill; - int pc_attack_direction_change; - int monster_attack_direction_change; - int pc_undead_nofreeze; - int pc_land_skill_limit; - int monster_land_skill_limit; - int party_skill_penaly; - int monster_class_change_full_recover; - int produce_item_name_input; - int produce_potion_name_input; - int making_arrow_name_input; - int holywater_name_input; - int display_delay_skill_fail; - int chat_warpportal; - int mob_warpportal; - int dead_branch_active; - int show_steal_in_same_party; - int enable_upper_class; - int mob_attack_attr_none; - int mob_ghostring_fix; - int pc_attack_attr_none; - int item_rate_common,item_rate_card,item_rate_equip,item_rate_heal,item_rate_use; // Added by RoVeRT, Additional Heal and Usable item rate by Val - int item_drop_common_min,item_drop_common_max; // Added by TyrNemesis^ - int item_drop_card_min,item_drop_card_max; - int item_drop_equip_min,item_drop_equip_max; - int item_drop_mvp_min,item_drop_mvp_max; // End Addition - int item_drop_heal_min,item_drop_heal_max; // Added by Valatris - int item_drop_use_min,item_drop_use_max; //End - - int prevent_logout; // Added by RoVeRT - - int alchemist_summon_reward; // [Valaris] - int maximum_level; - int drops_by_luk; - int monsters_ignore_gm; - int equipment_breaking; - int equipment_break_rate; - int multi_level_up; - int pk_mode; - int show_mob_hp; // end additions [Valaris] - - int agi_penaly_count_lv; - int vit_penaly_count_lv; - - int gx_allhit; - int gx_cardfix; - int gx_dupele; - int gx_disptype; - int player_skill_partner_check; - int hide_GM_session; - int unit_movement_type; - int invite_request_check; - int skill_removetrap_type; - int disp_experience; - int castle_defense_rate; - int riding_weight; - int backstab_bow_penalty; - - int night_at_start; // added by [Yor] - int day_duration; // added by [Yor] - int night_duration; // added by [Yor] - int hack_info_GM_level; // added by [Yor] - int any_warp_GM_min_level; // added by [Yor] - int packet_ver_flag; // added by [Yor] - int muting_players; // added by [Apple] - - int min_hair_style; // added by [MouseJstr] - int max_hair_style; // added by [MouseJstr] - int min_hair_color; // added by [MouseJstr] - int max_hair_color; // added by [MouseJstr] - int min_cloth_color; // added by [MouseJstr] - int max_cloth_color; // added by [MouseJstr] - - int castrate_dex_scale; // added by [MouseJstr] - int area_size; // added by [MouseJstr] - - int chat_lame_penalty; - int chat_spam_threshold; - int chat_spam_flood; - int chat_spam_ban; - int chat_spam_warn; - int chat_maxline; - - int trade_spam_threshold; - int trade_spam_flood; - int trade_spam_ban; - int trade_spam_warn; - - int sit_spam_threshold; - int sit_spam_flood; - int sit_spam_ban; - int sit_spam_warn; - - int drop_pickup_safety_zone; // [Fate] Max. distance to an object dropped by a kill by self in which dropsteal protection works - - int itemheal_regeneration_factor; // [Fate] itemheal speed factor +int battle_config_switch (const char *str); // [Valaris] + +extern struct Battle_Config +{ + int warp_point_debug; + int enemy_critical; + int enemy_critical_rate; + int enemy_str; + int enemy_perfect_flee; + int cast_rate, delay_rate, delay_dependon_dex; + int sdelay_attack_enable; + int left_cardfix_to_right; + int pc_skill_add_range; + int skill_out_range_consume; + int mob_skill_add_range; + int pc_damage_delay; + int pc_damage_delay_rate; + int defnotenemy; + int random_monster_checklv; + int attr_recover; + int flooritem_lifetime; + int item_auto_get; + int item_first_get_time; + int item_second_get_time; + int item_third_get_time; + int mvp_item_first_get_time; + int mvp_item_second_get_time; + int mvp_item_third_get_time; + int item_rate, base_exp_rate, job_exp_rate; // removed item rate, depreciated + int drop_rate0item; + int death_penalty_type; + int death_penalty_base, death_penalty_job; + int pvp_exp; // [MouseJstr] + int gtb_pvp_only; // [MouseJstr] + int zeny_penalty; + int restart_hp_rate; + int restart_sp_rate; + int mvp_item_rate, mvp_exp_rate; + int mvp_hp_rate; + int monster_hp_rate; + int monster_max_aspd; + int atc_gmonly; + int atc_spawn_quantity_limit; + int gm_allskill; + int gm_allskill_addabra; + int gm_allequip; + int gm_skilluncond; + int skillfree; + int skillup_limit; + int wp_rate; + int pp_rate; + int monster_active_enable; + int monster_damage_delay_rate; + int monster_loot_type; + int mob_skill_use; + int mob_count_rate; + int quest_skill_learn; + int quest_skill_reset; + int basic_skill_check; + int guild_emperium_check; + int guild_exp_limit; + int guild_max_castles; + int pc_invincible_time; + int skill_min_damage; + int finger_offensive_type; + int heal_exp; + int resurrection_exp; + int shop_exp; + int combo_delay_rate; + int item_check; + int wedding_modifydisplay; + int natural_healhp_interval; + int natural_healsp_interval; + int natural_heal_skill_interval; + int natural_heal_weight_rate; + int item_name_override_grffile; + int arrow_decrement; + int max_aspd; + int max_hp; + int max_sp; + int max_lv; + int max_parameter; + int max_cart_weight; + int pc_skill_log; + int mob_skill_log; + int battle_log; + int save_log; + int error_log; + int etc_log; + int save_clothcolor; + int undead_detect_type; + int pc_auto_counter_type; + int monster_auto_counter_type; + int agi_penaly_type; + int agi_penaly_count; + int agi_penaly_num; + int vit_penaly_type; + int vit_penaly_count; + int vit_penaly_num; + int player_defense_type; + int monster_defense_type; + int magic_defense_type; + int pc_skill_reiteration; + int monster_skill_reiteration; + int pc_skill_nofootset; + int monster_skill_nofootset; + int pc_cloak_check_type; + int monster_cloak_check_type; + int gvg_short_damage_rate; + int gvg_long_damage_rate; + int gvg_magic_damage_rate; + int gvg_misc_damage_rate; + int gvg_eliminate_time; + int mob_changetarget_byskill; + int pc_attack_direction_change; + int monster_attack_direction_change; + int pc_undead_nofreeze; + int pc_land_skill_limit; + int monster_land_skill_limit; + int party_skill_penaly; + int monster_class_change_full_recover; + int produce_item_name_input; + int produce_potion_name_input; + int making_arrow_name_input; + int holywater_name_input; + int display_delay_skill_fail; + int chat_warpportal; + int mob_warpportal; + int dead_branch_active; + int show_steal_in_same_party; + int enable_upper_class; + int mob_attack_attr_none; + int mob_ghostring_fix; + int pc_attack_attr_none; + int item_rate_common, item_rate_card, item_rate_equip, item_rate_heal, item_rate_use; // Added by RoVeRT, Additional Heal and Usable item rate by Val + int item_drop_common_min, item_drop_common_max; // Added by TyrNemesis^ + int item_drop_card_min, item_drop_card_max; + int item_drop_equip_min, item_drop_equip_max; + int item_drop_mvp_min, item_drop_mvp_max; // End Addition + int item_drop_heal_min, item_drop_heal_max; // Added by Valatris + int item_drop_use_min, item_drop_use_max; //End + + int prevent_logout; // Added by RoVeRT + + int alchemist_summon_reward; // [Valaris] + int maximum_level; + int drops_by_luk; + int monsters_ignore_gm; + int equipment_breaking; + int equipment_break_rate; + int multi_level_up; + int pk_mode; + int show_mob_hp; // end additions [Valaris] + + int agi_penaly_count_lv; + int vit_penaly_count_lv; + + int gx_allhit; + int gx_cardfix; + int gx_dupele; + int gx_disptype; + int player_skill_partner_check; + int hide_GM_session; + int unit_movement_type; + int invite_request_check; + int skill_removetrap_type; + int disp_experience; + int castle_defense_rate; + int riding_weight; + int backstab_bow_penalty; + + int night_at_start; // added by [Yor] + int day_duration; // added by [Yor] + int night_duration; // added by [Yor] + int hack_info_GM_level; // added by [Yor] + int any_warp_GM_min_level; // added by [Yor] + int packet_ver_flag; // added by [Yor] + int muting_players; // added by [Apple] + + int min_hair_style; // added by [MouseJstr] + int max_hair_style; // added by [MouseJstr] + int min_hair_color; // added by [MouseJstr] + int max_hair_color; // added by [MouseJstr] + int min_cloth_color; // added by [MouseJstr] + int max_cloth_color; // added by [MouseJstr] + + int castrate_dex_scale; // added by [MouseJstr] + int area_size; // added by [MouseJstr] + + int chat_lame_penalty; + int chat_spam_threshold; + int chat_spam_flood; + int chat_spam_ban; + int chat_spam_warn; + int chat_maxline; + + int trade_spam_threshold; + int trade_spam_flood; + int trade_spam_ban; + int trade_spam_warn; + + int sit_spam_threshold; + int sit_spam_flood; + int sit_spam_ban; + int sit_spam_warn; + + int drop_pickup_safety_zone; // [Fate] Max. distance to an object dropped by a kill by self in which dropsteal protection works + + int itemheal_regeneration_factor; // [Fate] itemheal speed factor } battle_config; -int battle_config_read(const char *cfgName); +int battle_config_read (const char *cfgName); #endif diff --git a/src/map/chat.c b/src/map/chat.c index 8af50da..1005205 100644 --- a/src/map/chat.c +++ b/src/map/chat.c @@ -16,358 +16,381 @@ #include "memwatch.h" #endif -int chat_triggerevent(struct chat_data *cd); - +int chat_triggerevent (struct chat_data *cd); /*========================================== * チャットルーム作成 *------------------------------------------ */ -int chat_createchat(struct map_session_data *sd,int limit,int pub,char* pass,char* title,int titlelen) +int chat_createchat (struct map_session_data *sd, int limit, int pub, + char *pass, char *title, int titlelen) { - struct chat_data *cd; - - nullpo_retr(0, sd); - - cd = aCalloc(1,sizeof(struct chat_data)); - - cd->limit = limit; - cd->pub = pub; - cd->users = 1; - memcpy(cd->pass,pass,8); - if(titlelen>=sizeof(cd->title)-1) titlelen=sizeof(cd->title)-1; - memcpy(cd->title,title,titlelen); - cd->title[titlelen]=0; - - cd->owner = (struct block_list **)(&cd->usersd[0]); - cd->usersd[0] = sd; - cd->bl.m = sd->bl.m; - cd->bl.x = sd->bl.x; - cd->bl.y = sd->bl.y; - cd->bl.type = BL_CHAT; - - cd->bl.id = map_addobject(&cd->bl); - if(cd->bl.id==0){ - clif_createchat(sd,1); - free(cd); - return 0; - } - pc_setchatid(sd,cd->bl.id); - - clif_createchat(sd,0); - clif_dispchat(cd,0); - - return 0; + struct chat_data *cd; + + nullpo_retr (0, sd); + + cd = aCalloc (1, sizeof (struct chat_data)); + + cd->limit = limit; + cd->pub = pub; + cd->users = 1; + memcpy (cd->pass, pass, 8); + if (titlelen >= sizeof (cd->title) - 1) + titlelen = sizeof (cd->title) - 1; + memcpy (cd->title, title, titlelen); + cd->title[titlelen] = 0; + + cd->owner = (struct block_list **) (&cd->usersd[0]); + cd->usersd[0] = sd; + cd->bl.m = sd->bl.m; + cd->bl.x = sd->bl.x; + cd->bl.y = sd->bl.y; + cd->bl.type = BL_CHAT; + + cd->bl.id = map_addobject (&cd->bl); + if (cd->bl.id == 0) + { + clif_createchat (sd, 1); + free (cd); + return 0; + } + pc_setchatid (sd, cd->bl.id); + + clif_createchat (sd, 0); + clif_dispchat (cd, 0); + + return 0; } /*========================================== * 既存チャットルームに参加 *------------------------------------------ */ -int chat_joinchat(struct map_session_data *sd,int chatid,char* pass) +int chat_joinchat (struct map_session_data *sd, int chatid, char *pass) { - struct chat_data *cd; + struct chat_data *cd; + + nullpo_retr (0, sd); - nullpo_retr(0, sd); + cd = (struct chat_data *) map_id2bl (chatid); + if (cd == NULL) + return 1; - cd=(struct chat_data*)map_id2bl(chatid); - if(cd==NULL) - return 1; + if (cd->bl.m != sd->bl.m || cd->limit <= cd->users) + { + clif_joinchatfail (sd, 0); + return 0; + } + if (cd->pub == 0 && strncmp (pass, cd->pass, 8)) + { + clif_joinchatfail (sd, 1); + return 0; + } - if(cd->bl.m != sd->bl.m || cd->limit <= cd->users){ - clif_joinchatfail(sd,0); - return 0; - } - if(cd->pub==0 && strncmp(pass,cd->pass,8)){ - clif_joinchatfail(sd,1); - return 0; - } + cd->usersd[cd->users] = sd; + cd->users++; - cd->usersd[cd->users] = sd; - cd->users++; + pc_setchatid (sd, cd->bl.id); - pc_setchatid(sd,cd->bl.id); + clif_joinchatok (sd, cd); // 新たに参加した人には全員のリスト + clif_addchat (cd, sd); // 既に中に居た人には追加した人の報告 + clif_dispchat (cd, 0); // 周囲の人には人数変化報告 - - clif_joinchatok(sd,cd); // 新たに参加した人には全員のリスト - clif_addchat(cd,sd); // 既に中に居た人には追加した人の報告 - clif_dispchat(cd,0); // 周囲の人には人数変化報告 + chat_triggerevent (cd); // イベント - chat_triggerevent(cd); // イベント - - return 0; + return 0; } /*========================================== * チャットルームから抜ける *------------------------------------------ */ -int chat_leavechat(struct map_session_data *sd) +int chat_leavechat (struct map_session_data *sd) { - struct chat_data *cd; - int i,leavechar; - - nullpo_retr(1, sd); - - cd=(struct chat_data*)map_id2bl(sd->chatID); - if(cd==NULL) - return 1; - - for(i = 0,leavechar=-1;i < cd->users;i++){ - if(cd->usersd[i] == sd){ - leavechar=i; - break; - } - } - if(leavechar<0) // そのchatに所属していないらしい (バグ時のみ) - return -1; - - if(leavechar==0 && cd->users>1 && (*cd->owner)->type==BL_PC){ - // 所有者だった&他に人が居る&PCのチャット - clif_changechatowner(cd,cd->usersd[1]); - clif_clearchat(cd,0); - } - - // 抜けるPCにも送るのでusersを減らす前に実行 - clif_leavechat(cd,sd); - - cd->users--; - pc_setchatid(sd,0); - - if(cd->users == 0 && (*cd->owner)->type==BL_PC){ - // 全員居なくなった&PCのチャットなので消す - clif_clearchat(cd,0); - map_delobject(cd->bl.id, BL_CHAT); // freeまでしてくれる - } else { - for(i=leavechar;i < cd->users;i++) - cd->usersd[i] = cd->usersd[i+1]; - if(leavechar==0 && (*cd->owner)->type==BL_PC){ - // PCのチャットなので所有者が抜けたので位置変更 - cd->bl.x=cd->usersd[0]->bl.x; - cd->bl.y=cd->usersd[0]->bl.y; - } - clif_dispchat(cd,0); - } - - return 0; + struct chat_data *cd; + int i, leavechar; + + nullpo_retr (1, sd); + + cd = (struct chat_data *) map_id2bl (sd->chatID); + if (cd == NULL) + return 1; + + for (i = 0, leavechar = -1; i < cd->users; i++) + { + if (cd->usersd[i] == sd) + { + leavechar = i; + break; + } + } + if (leavechar < 0) // そのchatに所属していないらしい (バグ時のみ) + return -1; + + if (leavechar == 0 && cd->users > 1 && (*cd->owner)->type == BL_PC) + { + // 所有者だった&他に人が居る&PCのチャット + clif_changechatowner (cd, cd->usersd[1]); + clif_clearchat (cd, 0); + } + + // 抜けるPCにも送るのでusersを減らす前に実行 + clif_leavechat (cd, sd); + + cd->users--; + pc_setchatid (sd, 0); + + if (cd->users == 0 && (*cd->owner)->type == BL_PC) + { + // 全員居なくなった&PCのチャットなので消す + clif_clearchat (cd, 0); + map_delobject (cd->bl.id, BL_CHAT); // freeまでしてくれる + } + else + { + for (i = leavechar; i < cd->users; i++) + cd->usersd[i] = cd->usersd[i + 1]; + if (leavechar == 0 && (*cd->owner)->type == BL_PC) + { + // PCのチャットなので所有者が抜けたので位置変更 + cd->bl.x = cd->usersd[0]->bl.x; + cd->bl.y = cd->usersd[0]->bl.y; + } + clif_dispchat (cd, 0); + } + + return 0; } /*========================================== * チャットルームの持ち主を譲る *------------------------------------------ */ -int chat_changechatowner(struct map_session_data *sd,char *nextownername) +int chat_changechatowner (struct map_session_data *sd, char *nextownername) { - struct chat_data *cd; - struct map_session_data *tmp_sd; - int i,nextowner; - - nullpo_retr(1, sd); - - cd=(struct chat_data*)map_id2bl(sd->chatID); - if(cd==NULL || (struct block_list *)sd!=(*cd->owner)) - return 1; - - for(i = 1,nextowner=-1;i < cd->users;i++){ - if(strcmp(cd->usersd[i]->status.name,nextownername)==0){ - nextowner=i; - break; - } - } - if(nextowner<0) // そんな人は居ない - return -1; - - clif_changechatowner(cd,cd->usersd[nextowner]); - // 一旦消す - clif_clearchat(cd,0); - - // userlistの順番変更 (0が所有者なので) - if( (tmp_sd = cd->usersd[0]) == NULL ) - return 1; //ありえるのかな? - cd->usersd[0] = cd->usersd[nextowner]; - cd->usersd[nextowner] = tmp_sd; - - // 新しい所有者の位置へ変更 - cd->bl.x=cd->usersd[0]->bl.x; - cd->bl.y=cd->usersd[0]->bl.y; - - // 再度表示 - clif_dispchat(cd,0); - - return 0; + struct chat_data *cd; + struct map_session_data *tmp_sd; + int i, nextowner; + + nullpo_retr (1, sd); + + cd = (struct chat_data *) map_id2bl (sd->chatID); + if (cd == NULL || (struct block_list *) sd != (*cd->owner)) + return 1; + + for (i = 1, nextowner = -1; i < cd->users; i++) + { + if (strcmp (cd->usersd[i]->status.name, nextownername) == 0) + { + nextowner = i; + break; + } + } + if (nextowner < 0) // そんな人は居ない + return -1; + + clif_changechatowner (cd, cd->usersd[nextowner]); + // 一旦消す + clif_clearchat (cd, 0); + + // userlistの順番変更 (0が所有者なので) + if ((tmp_sd = cd->usersd[0]) == NULL) + return 1; //ありえるのかな? + cd->usersd[0] = cd->usersd[nextowner]; + cd->usersd[nextowner] = tmp_sd; + + // 新しい所有者の位置へ変更 + cd->bl.x = cd->usersd[0]->bl.x; + cd->bl.y = cd->usersd[0]->bl.y; + + // 再度表示 + clif_dispchat (cd, 0); + + return 0; } /*========================================== * チャットの状態(タイトル等)を変更 *------------------------------------------ */ -int chat_changechatstatus(struct map_session_data *sd,int limit,int pub,char* pass,char* title,int titlelen) +int chat_changechatstatus (struct map_session_data *sd, int limit, int pub, + char *pass, char *title, int titlelen) { - struct chat_data *cd; + struct chat_data *cd; - nullpo_retr(1, sd); + nullpo_retr (1, sd); - cd=(struct chat_data*)map_id2bl(sd->chatID); - if(cd==NULL || (struct block_list *)sd!=(*cd->owner)) - return 1; + cd = (struct chat_data *) map_id2bl (sd->chatID); + if (cd == NULL || (struct block_list *) sd != (*cd->owner)) + return 1; - cd->limit = limit; - cd->pub = pub; - memcpy(cd->pass,pass,8); - if(titlelen>=sizeof(cd->title)-1) titlelen=sizeof(cd->title)-1; - memcpy(cd->title,title,titlelen); - cd->title[titlelen]=0; + cd->limit = limit; + cd->pub = pub; + memcpy (cd->pass, pass, 8); + if (titlelen >= sizeof (cd->title) - 1) + titlelen = sizeof (cd->title) - 1; + memcpy (cd->title, title, titlelen); + cd->title[titlelen] = 0; - clif_changechatstatus(cd); - clif_dispchat(cd,0); + clif_changechatstatus (cd); + clif_dispchat (cd, 0); - return 0; + return 0; } /*========================================== * チャットルームから蹴り出す *------------------------------------------ */ -int chat_kickchat(struct map_session_data *sd,char *kickusername) +int chat_kickchat (struct map_session_data *sd, char *kickusername) { - struct chat_data *cd; - int i,kickuser; + struct chat_data *cd; + int i, kickuser; - nullpo_retr(1, sd); + nullpo_retr (1, sd); - cd=(struct chat_data*)map_id2bl(sd->chatID); - if(cd==NULL || (struct block_list *)sd!=(*cd->owner)) - return 1; + cd = (struct chat_data *) map_id2bl (sd->chatID); + if (cd == NULL || (struct block_list *) sd != (*cd->owner)) + return 1; - for(i = 0,kickuser=-1;i < cd->users;i++){ - if(strcmp(cd->usersd[i]->status.name,kickusername)==0){ - kickuser=i; - break; - } - } - if(kickuser<0) // そんな人は居ない - return -1; + for (i = 0, kickuser = -1; i < cd->users; i++) + { + if (strcmp (cd->usersd[i]->status.name, kickusername) == 0) + { + kickuser = i; + break; + } + } + if (kickuser < 0) // そんな人は居ない + return -1; - chat_leavechat(cd->usersd[kickuser]); + chat_leavechat (cd->usersd[kickuser]); - return 0; + return 0; } /*========================================== * npcチャットルーム作成 *------------------------------------------ */ -int chat_createnpcchat(struct npc_data *nd,int limit,int pub,int trigger,char* title,int titlelen,const char *ev) +int chat_createnpcchat (struct npc_data *nd, int limit, int pub, int trigger, + char *title, int titlelen, const char *ev) { - struct chat_data *cd; - - nullpo_retr(1, nd); - - cd = aCalloc(1,sizeof(struct chat_data)); - - cd->limit = cd->trigger = limit; - if(trigger>0) - cd->trigger = trigger; - cd->pub = pub; - cd->users = 0; - memcpy(cd->pass,"",8); - if(titlelen>=sizeof(cd->title)-1) titlelen=sizeof(cd->title)-1; - memcpy(cd->title,title,titlelen); - cd->title[titlelen]=0; - - cd->bl.m = nd->bl.m; - cd->bl.x = nd->bl.x; - cd->bl.y = nd->bl.y; - cd->bl.type = BL_CHAT; - cd->owner_ = (struct block_list *)nd; - cd->owner = &cd->owner_; - memcpy(cd->npc_event,ev,sizeof(cd->npc_event)); - - cd->bl.id = map_addobject(&cd->bl); - if(cd->bl.id==0){ - free(cd); - return 0; - } - nd->chat_id=cd->bl.id; - - clif_dispchat(cd,0); - - return 0; + struct chat_data *cd; + + nullpo_retr (1, nd); + + cd = aCalloc (1, sizeof (struct chat_data)); + + cd->limit = cd->trigger = limit; + if (trigger > 0) + cd->trigger = trigger; + cd->pub = pub; + cd->users = 0; + memcpy (cd->pass, "", 8); + if (titlelen >= sizeof (cd->title) - 1) + titlelen = sizeof (cd->title) - 1; + memcpy (cd->title, title, titlelen); + cd->title[titlelen] = 0; + + cd->bl.m = nd->bl.m; + cd->bl.x = nd->bl.x; + cd->bl.y = nd->bl.y; + cd->bl.type = BL_CHAT; + cd->owner_ = (struct block_list *) nd; + cd->owner = &cd->owner_; + memcpy (cd->npc_event, ev, sizeof (cd->npc_event)); + + cd->bl.id = map_addobject (&cd->bl); + if (cd->bl.id == 0) + { + free (cd); + return 0; + } + nd->chat_id = cd->bl.id; + + clif_dispchat (cd, 0); + + return 0; } + /*========================================== * npcチャットルーム削除 *------------------------------------------ */ -int chat_deletenpcchat(struct npc_data *nd) +int chat_deletenpcchat (struct npc_data *nd) { - struct chat_data *cd; - - nullpo_retr(0, nd); - nullpo_retr(0, cd=(struct chat_data*)map_id2bl(nd->chat_id)); - - chat_npckickall(cd); - clif_clearchat(cd,0); - map_delobject(cd->bl.id, BL_CHAT); // freeまでしてくれる - nd->chat_id=0; - - return 0; + struct chat_data *cd; + + nullpo_retr (0, nd); + nullpo_retr (0, cd = (struct chat_data *) map_id2bl (nd->chat_id)); + + chat_npckickall (cd); + clif_clearchat (cd, 0); + map_delobject (cd->bl.id, BL_CHAT); // freeまでしてくれる + nd->chat_id = 0; + + return 0; } /*========================================== * 規定人数以上でイベントが定義されてるなら実行 *------------------------------------------ */ -int chat_triggerevent(struct chat_data *cd) +int chat_triggerevent (struct chat_data *cd) { - nullpo_retr(0, cd); + nullpo_retr (0, cd); - if(cd->users>=cd->trigger && cd->npc_event[0]) - npc_event_do(cd->npc_event); - return 0; + if (cd->users >= cd->trigger && cd->npc_event[0]) + npc_event_do (cd->npc_event); + return 0; } /*========================================== * イベントの有効化 *------------------------------------------ */ -int chat_enableevent(struct chat_data *cd) +int chat_enableevent (struct chat_data *cd) { - nullpo_retr(0, cd); + nullpo_retr (0, cd); - cd->trigger&=0x7f; - chat_triggerevent(cd); - return 0; + cd->trigger &= 0x7f; + chat_triggerevent (cd); + return 0; } + /*========================================== * イベントの無効化 *------------------------------------------ */ -int chat_disableevent(struct chat_data *cd) +int chat_disableevent (struct chat_data *cd) { - nullpo_retr(0, cd); + nullpo_retr (0, cd); - cd->trigger|=0x80; - return 0; + cd->trigger |= 0x80; + return 0; } + /*========================================== * チャットルームから全員蹴り出す *------------------------------------------ */ -int chat_npckickall(struct chat_data *cd) +int chat_npckickall (struct chat_data *cd) { - nullpo_retr(0, cd); + nullpo_retr (0, cd); - while(cd->users>0){ - chat_leavechat(cd->usersd[cd->users-1]); - } - return 0; + while (cd->users > 0) + { + chat_leavechat (cd->usersd[cd->users - 1]); + } + return 0; } /*========================================== * 終了 *------------------------------------------ */ -int do_final_chat(void) +int do_final_chat (void) { - return 0; + return 0; } diff --git a/src/map/chat.h b/src/map/chat.h index 2761602..7f61f54 100644 --- a/src/map/chat.h +++ b/src/map/chat.h @@ -4,19 +4,22 @@ #include "map.h" -int chat_createchat(struct map_session_data *,int,int,char*,char*,int); -int chat_joinchat(struct map_session_data *,int,char*); -int chat_leavechat(struct map_session_data* ); -int chat_changechatowner(struct map_session_data *,char *); -int chat_changechatstatus(struct map_session_data *,int,int,char*,char*,int); -int chat_kickchat(struct map_session_data *,char *); +int chat_createchat (struct map_session_data *, int, int, char *, char *, + int); +int chat_joinchat (struct map_session_data *, int, char *); +int chat_leavechat (struct map_session_data *); +int chat_changechatowner (struct map_session_data *, char *); +int chat_changechatstatus (struct map_session_data *, int, int, char *, + char *, int); +int chat_kickchat (struct map_session_data *, char *); -int chat_createnpcchat(struct npc_data *nd,int limit,int pub,int trigger,char* title,int titlelen,const char *ev); -int chat_deletenpcchat(struct npc_data *nd); -int chat_enableevent(struct chat_data *cd); -int chat_disableevent(struct chat_data *cd); -int chat_npckickall(struct chat_data *cd); +int chat_createnpcchat (struct npc_data *nd, int limit, int pub, int trigger, + char *title, int titlelen, const char *ev); +int chat_deletenpcchat (struct npc_data *nd); +int chat_enableevent (struct chat_data *cd); +int chat_disableevent (struct chat_data *cd); +int chat_npckickall (struct chat_data *cd); -int do_final_chat(void); +int do_final_chat (void); #endif diff --git a/src/map/chrif.c b/src/map/chrif.c index 3152866..c4a528b 100644 --- a/src/map/chrif.c +++ b/src/map/chrif.c @@ -30,14 +30,14 @@ #endif static const int packet_len_table[0x20] = { - 60, 3,10,27,22,-1, 6,-1, // 2af8-2aff - 6,-1,18, 7,-1,49,44, 0, // 2b00-2b07 - 6,30,-1,10,86, 7,44,34, // 2b08-2b0f - -1,-1,10, 6,11,-1, 0, 0, // 2b10-2b17 + 60, 3, 10, 27, 22, -1, 6, -1, // 2af8-2aff + 6, -1, 18, 7, -1, 49, 44, 0, // 2b00-2b07 + 6, 30, -1, 10, 86, 7, 44, 34, // 2b08-2b0f + -1, -1, 10, 6, 11, -1, 0, 0, // 2b10-2b17 }; -int char_fd; -int srvinfo; +int char_fd; +int srvinfo; static char char_ip_str[16]; static int char_ip; static int char_port = 6121; @@ -49,345 +49,362 @@ static int chrif_state; * *------------------------------------------ */ -void chrif_setuserid(char *id) +void chrif_setuserid (char *id) { - strncpy(userid, id, 24); + strncpy (userid, id, 24); } /*========================================== * *------------------------------------------ */ -void chrif_setpasswd(char *pwd) +void chrif_setpasswd (char *pwd) { - strncpy(passwd, pwd, 24); + strncpy (passwd, pwd, 24); } /*========================================== * *------------------------------------------ */ -void chrif_setip(char *ip) +void chrif_setip (char *ip) { - strncpy(char_ip_str, ip, 16); - char_ip = inet_addr(char_ip_str); + strncpy (char_ip_str, ip, 16); + char_ip = inet_addr (char_ip_str); } /*========================================== * *------------------------------------------ */ -void chrif_setport(int port) +void chrif_setport (int port) { - char_port = port; + char_port = port; } /*========================================== * *------------------------------------------ */ -int chrif_isconnect(void) +int chrif_isconnect (void) { - return chrif_state == 2; + return chrif_state == 2; } /*========================================== * *------------------------------------------ */ -int chrif_save(struct map_session_data *sd) +int chrif_save (struct map_session_data *sd) { - nullpo_retr(-1, sd); + nullpo_retr (-1, sd); - if (char_fd < 0) - return -1; + if (char_fd < 0) + return -1; - pc_makesavestatus(sd); + pc_makesavestatus (sd); - WFIFOW(char_fd,0) = 0x2b01; - WFIFOW(char_fd,2) = sizeof(sd->status) + 12; - WFIFOL(char_fd,4) = sd->bl.id; - WFIFOL(char_fd,8) = sd->char_id; - memcpy(WFIFOP(char_fd,12), &sd->status, sizeof(sd->status)); - WFIFOSET(char_fd, WFIFOW(char_fd,2)); + WFIFOW (char_fd, 0) = 0x2b01; + WFIFOW (char_fd, 2) = sizeof (sd->status) + 12; + WFIFOL (char_fd, 4) = sd->bl.id; + WFIFOL (char_fd, 8) = sd->char_id; + memcpy (WFIFOP (char_fd, 12), &sd->status, sizeof (sd->status)); + WFIFOSET (char_fd, WFIFOW (char_fd, 2)); - //For data sync - if (sd->state.storage_flag == 1) - storage_storage_save(sd->status.account_id, 0); - else if (sd->state.storage_flag == 2) - storage_guild_storagesave(sd->status.account_id, sd->status.guild_id, 0); + //For data sync + if (sd->state.storage_flag == 1) + storage_storage_save (sd->status.account_id, 0); + else if (sd->state.storage_flag == 2) + storage_guild_storagesave (sd->status.account_id, sd->status.guild_id, + 0); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int chrif_connect(int fd) +int chrif_connect (int fd) { - WFIFOW(fd,0) = 0x2af8; - memcpy(WFIFOP(fd,2), userid, 24); - memcpy(WFIFOP(fd,26), passwd, 24); - WFIFOL(fd,50) = 0; - WFIFOL(fd,54) = clif_getip(); - WFIFOW(fd,58) = clif_getport(); // [Valaris] thanks to fov - WFIFOSET(fd,60); - - return 0; + WFIFOW (fd, 0) = 0x2af8; + memcpy (WFIFOP (fd, 2), userid, 24); + memcpy (WFIFOP (fd, 26), passwd, 24); + WFIFOL (fd, 50) = 0; + WFIFOL (fd, 54) = clif_getip (); + WFIFOW (fd, 58) = clif_getport (); // [Valaris] thanks to fov + WFIFOSET (fd, 60); + + return 0; } /*========================================== * マップ送信 *------------------------------------------ */ -int chrif_sendmap(int fd) +int chrif_sendmap (int fd) { - int i; - - WFIFOW(fd,0) = 0x2afa; - for(i = 0; i < map_num; i++) - if (map[i].alias[0] != '\0') // [MouseJstr] map aliasing - memcpy(WFIFOP(fd,4+i*16), map[i].alias, 16); - else - memcpy(WFIFOP(fd,4+i*16), map[i].name, 16); - WFIFOW(fd,2) = 4 + i * 16; - WFIFOSET(fd,WFIFOW(fd,2)); - - return 0; + int i; + + WFIFOW (fd, 0) = 0x2afa; + for (i = 0; i < map_num; i++) + if (map[i].alias[0] != '\0') // [MouseJstr] map aliasing + memcpy (WFIFOP (fd, 4 + i * 16), map[i].alias, 16); + else + memcpy (WFIFOP (fd, 4 + i * 16), map[i].name, 16); + WFIFOW (fd, 2) = 4 + i * 16; + WFIFOSET (fd, WFIFOW (fd, 2)); + + return 0; } /*========================================== * マップ受信 *------------------------------------------ */ -int chrif_recvmap(int fd) +int chrif_recvmap (int fd) { - int i, j, ip, port; - unsigned char *p = (unsigned char *)&ip; - - if (chrif_state < 2) // まだ準備中 - return -1; - - ip = RFIFOL(fd,4); - port = RFIFOW(fd,8); - for(i = 10, j = 0; i < RFIFOW(fd,2); i += 16, j++) { - map_setipport(RFIFOP(fd,i), ip, port); -// if (battle_config.etc_log) -// printf("recv map %d %s\n", j, RFIFOP(fd,i)); - } - if (battle_config.etc_log) - printf("recv map on %d.%d.%d.%d:%d (%d maps)\n", p[0], p[1], p[2], p[3], port, j); - - return 0; + int i, j, ip, port; + unsigned char *p = (unsigned char *) &ip; + + if (chrif_state < 2) // まだ準備中 + return -1; + + ip = RFIFOL (fd, 4); + port = RFIFOW (fd, 8); + for (i = 10, j = 0; i < RFIFOW (fd, 2); i += 16, j++) + { + map_setipport (RFIFOP (fd, i), ip, port); +// if (battle_config.etc_log) +// printf("recv map %d %s\n", j, RFIFOP(fd,i)); + } + if (battle_config.etc_log) + printf ("recv map on %d.%d.%d.%d:%d (%d maps)\n", p[0], p[1], p[2], + p[3], port, j); + + return 0; } /*========================================== * マップ鯖間移動のためのデータ準備要求 *------------------------------------------ */ -int chrif_changemapserver(struct map_session_data *sd, char *name, int x, int y, int ip, short port) +int chrif_changemapserver (struct map_session_data *sd, char *name, int x, + int y, int ip, short port) { - int i, s_ip; - - nullpo_retr(-1, sd); - - s_ip = 0; - for(i = 0; i < fd_max; i++) - if (session[i] && session[i]->session_data == sd) { - s_ip = session[i]->client_addr.sin_addr.s_addr; - break; - } - - WFIFOW(char_fd, 0) = 0x2b05; - WFIFOL(char_fd, 2) = sd->bl.id; - WFIFOL(char_fd, 6) = sd->login_id1; - WFIFOL(char_fd,10) = sd->login_id2; - WFIFOL(char_fd,14) = sd->status.char_id; - memcpy(WFIFOP(char_fd,18), name, 16); - WFIFOW(char_fd,34) = x; - WFIFOW(char_fd,36) = y; - WFIFOL(char_fd,38) = ip; - WFIFOL(char_fd,42) = port; - WFIFOB(char_fd,44) = sd->status.sex; - WFIFOL(char_fd,45) = s_ip; - WFIFOSET(char_fd,49); - - return 0; + int i, s_ip; + + nullpo_retr (-1, sd); + + s_ip = 0; + for (i = 0; i < fd_max; i++) + if (session[i] && session[i]->session_data == sd) + { + s_ip = session[i]->client_addr.sin_addr.s_addr; + break; + } + + WFIFOW (char_fd, 0) = 0x2b05; + WFIFOL (char_fd, 2) = sd->bl.id; + WFIFOL (char_fd, 6) = sd->login_id1; + WFIFOL (char_fd, 10) = sd->login_id2; + WFIFOL (char_fd, 14) = sd->status.char_id; + memcpy (WFIFOP (char_fd, 18), name, 16); + WFIFOW (char_fd, 34) = x; + WFIFOW (char_fd, 36) = y; + WFIFOL (char_fd, 38) = ip; + WFIFOL (char_fd, 42) = port; + WFIFOB (char_fd, 44) = sd->status.sex; + WFIFOL (char_fd, 45) = s_ip; + WFIFOSET (char_fd, 49); + + return 0; } /*========================================== * マップ鯖間移動ack *------------------------------------------ */ -int chrif_changemapserverack(int fd) +int chrif_changemapserverack (int fd) { - struct map_session_data *sd = map_id2sd(RFIFOL(fd,2)); + struct map_session_data *sd = map_id2sd (RFIFOL (fd, 2)); - if (sd == NULL || sd->status.char_id != RFIFOL(fd,14)) - return -1; + if (sd == NULL || sd->status.char_id != RFIFOL (fd, 14)) + return -1; - if (RFIFOL(fd,6) == 1) { - if (battle_config.error_log) - printf("map server change failed.\n"); - pc_authfail(sd->fd); - return 0; - } - clif_changemapserver(sd, RFIFOP(fd,18), RFIFOW(fd,34), RFIFOW(fd,36), RFIFOL(fd,38), RFIFOW(fd,42)); + if (RFIFOL (fd, 6) == 1) + { + if (battle_config.error_log) + printf ("map server change failed.\n"); + pc_authfail (sd->fd); + return 0; + } + clif_changemapserver (sd, RFIFOP (fd, 18), RFIFOW (fd, 34), + RFIFOW (fd, 36), RFIFOL (fd, 38), RFIFOW (fd, 42)); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int chrif_connectack(int fd) +int chrif_connectack (int fd) { - if (RFIFOB(fd,2)) { - printf("Connected to char-server failed %d.\n", RFIFOB(fd,2)); - exit(1); - } - printf("Connected to char-server (connection #%d).\n", fd); - chrif_state = 1; + if (RFIFOB (fd, 2)) + { + printf ("Connected to char-server failed %d.\n", RFIFOB (fd, 2)); + exit (1); + } + printf ("Connected to char-server (connection #%d).\n", fd); + chrif_state = 1; - chrif_sendmap(fd); + chrif_sendmap (fd); - printf("chrif: OnCharIfInit event done. (%d events)\n", npc_event_doall("OnCharIfInit")); - printf("chrif: OnInterIfInit event done. (%d events)\n", npc_event_doall("OnInterIfInit")); + printf ("chrif: OnCharIfInit event done. (%d events)\n", + npc_event_doall ("OnCharIfInit")); + printf ("chrif: OnInterIfInit event done. (%d events)\n", + npc_event_doall ("OnInterIfInit")); - // <Agit> Run Event [AgitInit] -// printf("NPC_Event:[OnAgitInit] do (%d) events (Agit Initialize).\n", npc_event_doall("OnAgitInit")); + // <Agit> Run Event [AgitInit] +// printf("NPC_Event:[OnAgitInit] do (%d) events (Agit Initialize).\n", npc_event_doall("OnAgitInit")); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int chrif_sendmapack(int fd) +int chrif_sendmapack (int fd) { - if (RFIFOB(fd,2)) { - printf("chrif : send map list to char server failed %d\n", RFIFOB(fd,2)); - exit(1); - } + if (RFIFOB (fd, 2)) + { + printf ("chrif : send map list to char server failed %d\n", + RFIFOB (fd, 2)); + exit (1); + } - memcpy(wisp_server_name, RFIFOP(fd,3), 24); + memcpy (wisp_server_name, RFIFOP (fd, 3), 24); - chrif_state = 2; + chrif_state = 2; - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int chrif_authreq(struct map_session_data *sd) +int chrif_authreq (struct map_session_data *sd) { - int i; - - nullpo_retr(-1, sd); - - if (!sd || !char_fd || !sd->bl.id || !sd->login_id1) - return -1; - - for(i = 0; i < fd_max; i++) - if (session[i] && session[i]->session_data == sd) { - WFIFOW(char_fd, 0) = 0x2afc; - WFIFOL(char_fd, 2) = sd->bl.id; - WFIFOL(char_fd, 6) = sd->char_id; - WFIFOL(char_fd,10) = sd->login_id1; - WFIFOL(char_fd,14) = sd->login_id2; - WFIFOL(char_fd,18) = session[i]->client_addr.sin_addr.s_addr; - WFIFOSET(char_fd,22); - break; - } - - return 0; + int i; + + nullpo_retr (-1, sd); + + if (!sd || !char_fd || !sd->bl.id || !sd->login_id1) + return -1; + + for (i = 0; i < fd_max; i++) + if (session[i] && session[i]->session_data == sd) + { + WFIFOW (char_fd, 0) = 0x2afc; + WFIFOL (char_fd, 2) = sd->bl.id; + WFIFOL (char_fd, 6) = sd->char_id; + WFIFOL (char_fd, 10) = sd->login_id1; + WFIFOL (char_fd, 14) = sd->login_id2; + WFIFOL (char_fd, 18) = session[i]->client_addr.sin_addr.s_addr; + WFIFOSET (char_fd, 22); + break; + } + + return 0; } /*========================================== * *------------------------------------------ */ -int chrif_charselectreq(struct map_session_data *sd) +int chrif_charselectreq (struct map_session_data *sd) { - int i, s_ip; + int i, s_ip; - nullpo_retr(-1, sd); + nullpo_retr (-1, sd); - if(!sd || !char_fd || !sd->bl.id || !sd->login_id1) - return -1; + if (!sd || !char_fd || !sd->bl.id || !sd->login_id1) + return -1; - s_ip = 0; - for(i = 0; i < fd_max; i++) - if (session[i] && session[i]->session_data == sd) { - s_ip = session[i]->client_addr.sin_addr.s_addr; - break; - } + s_ip = 0; + for (i = 0; i < fd_max; i++) + if (session[i] && session[i]->session_data == sd) + { + s_ip = session[i]->client_addr.sin_addr.s_addr; + break; + } - WFIFOW(char_fd, 0) = 0x2b02; - WFIFOL(char_fd, 2) = sd->bl.id; - WFIFOL(char_fd, 6) = sd->login_id1; - WFIFOL(char_fd,10) = sd->login_id2; - WFIFOL(char_fd,14) = s_ip; - WFIFOSET(char_fd,18); + WFIFOW (char_fd, 0) = 0x2b02; + WFIFOL (char_fd, 2) = sd->bl.id; + WFIFOL (char_fd, 6) = sd->login_id1; + WFIFOL (char_fd, 10) = sd->login_id2; + WFIFOL (char_fd, 14) = s_ip; + WFIFOSET (char_fd, 18); - return 0; + return 0; } /*========================================== * キャラ名問い合わせ *------------------------------------------ */ -int chrif_searchcharid(int char_id) +int chrif_searchcharid (int char_id) { - if (!char_id) - return -1; + if (!char_id) + return -1; - WFIFOW(char_fd,0) = 0x2b08; - WFIFOL(char_fd,2) = char_id; - WFIFOSET(char_fd,6); + WFIFOW (char_fd, 0) = 0x2b08; + WFIFOL (char_fd, 2) = char_id; + WFIFOSET (char_fd, 6); - return 0; + return 0; } /*========================================== * GMに変化要求 *------------------------------------------ */ -int chrif_changegm(int id, const char *pass, int len) +int chrif_changegm (int id, const char *pass, int len) { - if (battle_config.etc_log) - printf("chrif_changegm: account: %d, password: '%s'.\n", id, pass); + if (battle_config.etc_log) + printf ("chrif_changegm: account: %d, password: '%s'.\n", id, pass); - WFIFOW(char_fd,0) = 0x2b0a; - WFIFOW(char_fd,2) = len + 8; - WFIFOL(char_fd,4) = id; - memcpy(WFIFOP(char_fd,8), pass, len); - WFIFOSET(char_fd, len + 8); + WFIFOW (char_fd, 0) = 0x2b0a; + WFIFOW (char_fd, 2) = len + 8; + WFIFOL (char_fd, 4) = id; + memcpy (WFIFOP (char_fd, 8), pass, len); + WFIFOSET (char_fd, len + 8); - return 0; + return 0; } /*========================================== * Change Email *------------------------------------------ */ -int chrif_changeemail(int id, const char *actual_email, const char *new_email) +int chrif_changeemail (int id, const char *actual_email, + const char *new_email) { - if (battle_config.etc_log) - printf("chrif_changeemail: account: %d, actual_email: '%s', new_email: '%s'.\n", id, actual_email, new_email); - - WFIFOW(char_fd,0) = 0x2b0c; - WFIFOL(char_fd,2) = id; - memcpy(WFIFOP(char_fd,6), actual_email, 40); - memcpy(WFIFOP(char_fd,46), new_email, 40); - WFIFOSET(char_fd,86); - - return 0; + if (battle_config.etc_log) + printf + ("chrif_changeemail: account: %d, actual_email: '%s', new_email: '%s'.\n", + id, actual_email, new_email); + + WFIFOW (char_fd, 0) = 0x2b0c; + WFIFOL (char_fd, 2) = id; + memcpy (WFIFOP (char_fd, 6), actual_email, 40); + memcpy (WFIFOP (char_fd, 46), new_email, 40); + WFIFOSET (char_fd, 86); + + return 0; } /*========================================== @@ -401,24 +418,27 @@ int chrif_changeemail(int id, const char *actual_email, const char *new_email) * 5: changesex *------------------------------------------ */ -int chrif_char_ask_name(int id, char * character_name, short operation_type, int year, int month, int day, int hour, int minute, int second) +int chrif_char_ask_name (int id, char *character_name, short operation_type, + int year, int month, int day, int hour, int minute, + int second) { - WFIFOW(char_fd, 0) = 0x2b0e; - WFIFOL(char_fd, 2) = id; // account_id of who ask (for answer) -1 if nobody - memcpy(WFIFOP(char_fd,6), character_name, 24); - WFIFOW(char_fd, 30) = operation_type; // type of operation - if (operation_type == 2) { - WFIFOW(char_fd, 32) = year; - WFIFOW(char_fd, 34) = month; - WFIFOW(char_fd, 36) = day; - WFIFOW(char_fd, 38) = hour; - WFIFOW(char_fd, 40) = minute; - WFIFOW(char_fd, 42) = second; - } - printf("chrif : sended 0x2b0e\n"); - WFIFOSET(char_fd,44); - - return 0; + WFIFOW (char_fd, 0) = 0x2b0e; + WFIFOL (char_fd, 2) = id; // account_id of who ask (for answer) -1 if nobody + memcpy (WFIFOP (char_fd, 6), character_name, 24); + WFIFOW (char_fd, 30) = operation_type; // type of operation + if (operation_type == 2) + { + WFIFOW (char_fd, 32) = year; + WFIFOW (char_fd, 34) = month; + WFIFOW (char_fd, 36) = day; + WFIFOW (char_fd, 38) = hour; + WFIFOW (char_fd, 40) = minute; + WFIFOW (char_fd, 42) = second; + } + printf ("chrif : sended 0x2b0e\n"); + WFIFOSET (char_fd, 44); + + return 0; } /*========================================== @@ -437,234 +457,295 @@ int chrif_char_ask_name(int id, char * character_name, short operation_type, int * 3: login-server offline *------------------------------------------ */ -int chrif_char_ask_name_answer(int fd) +int chrif_char_ask_name_answer (int fd) { - int acc; - struct map_session_data *sd; - char output[256]; - char player_name[24]; - - acc = RFIFOL(fd,2); // account_id of who has asked (-1 if nobody) - memcpy(player_name, RFIFOP(fd,6), sizeof(player_name)); - player_name[sizeof(player_name)-1] = '\0'; - - sd = map_id2sd(acc); - if (acc >= 0 && sd != NULL) { - if (RFIFOW(fd, 32) == 1) // player not found - sprintf(output, "The player '%s' doesn't exist.", player_name); - else { - switch(RFIFOW(fd, 30)) { - case 1: // block - switch(RFIFOW(fd, 32)) { - case 0: // login-server resquest done - sprintf(output, "Login-server has been asked to block the player '%s'.", player_name); - break; - //case 1: // player not found - case 2: // gm level too low - sprintf(output, "Your GM level don't authorise you to block the player '%s'.", player_name); - break; - case 3: // login-server offline - sprintf(output, "Login-server is offline. Impossible to block the the player '%s'.", player_name); - break; - } - break; - case 2: // ban - switch(RFIFOW(fd, 32)) { - case 0: // login-server resquest done - sprintf(output, "Login-server has been asked to ban the player '%s'.", player_name); - break; - //case 1: // player not found - case 2: // gm level too low - sprintf(output, "Your GM level don't authorise you to ban the player '%s'.", player_name); - break; - case 3: // login-server offline - sprintf(output, "Login-server is offline. Impossible to ban the the player '%s'.", player_name); - break; - } - break; - case 3: // unblock - switch(RFIFOW(fd, 32)) { - case 0: // login-server resquest done - sprintf(output, "Login-server has been asked to unblock the player '%s'.", player_name); - break; - //case 1: // player not found - case 2: // gm level too low - sprintf(output, "Your GM level don't authorise you to unblock the player '%s'.", player_name); - break; - case 3: // login-server offline - sprintf(output, "Login-server is offline. Impossible to unblock the the player '%s'.", player_name); - break; - } - break; - case 4: // unban - switch(RFIFOW(fd, 32)) { - case 0: // login-server resquest done - sprintf(output, "Login-server has been asked to unban the player '%s'.", player_name); - break; - //case 1: // player not found - case 2: // gm level too low - sprintf(output, "Your GM level don't authorise you to unban the player '%s'.", player_name); - break; - case 3: // login-server offline - sprintf(output, "Login-server is offline. Impossible to unban the the player '%s'.", player_name); - break; - } - break; - case 5: // changesex - switch(RFIFOW(fd, 32)) { - case 0: // login-server resquest done - sprintf(output, "Login-server has been asked to change the sex of the player '%s'.", player_name); - break; - //case 1: // player not found - case 2: // gm level too low - sprintf(output, "Your GM level don't authorise you to change the sex of the player '%s'.", player_name); - break; - case 3: // login-server offline - sprintf(output, "Login-server is offline. Impossible to change the sex of the the player '%s'.", player_name); - break; - } - break; - } - } - if (output[0] != '\0') { - output[sizeof(output)-1] = '\0'; - clif_displaymessage(sd->fd, output); - } - } else - printf("chrif_char_ask_name_answer failed - player not online.\n"); - - return 0; + int acc; + struct map_session_data *sd; + char output[256]; + char player_name[24]; + + acc = RFIFOL (fd, 2); // account_id of who has asked (-1 if nobody) + memcpy (player_name, RFIFOP (fd, 6), sizeof (player_name)); + player_name[sizeof (player_name) - 1] = '\0'; + + sd = map_id2sd (acc); + if (acc >= 0 && sd != NULL) + { + if (RFIFOW (fd, 32) == 1) // player not found + sprintf (output, "The player '%s' doesn't exist.", player_name); + else + { + switch (RFIFOW (fd, 30)) + { + case 1: // block + switch (RFIFOW (fd, 32)) + { + case 0: // login-server resquest done + sprintf (output, + "Login-server has been asked to block the player '%s'.", + player_name); + break; + //case 1: // player not found + case 2: // gm level too low + sprintf (output, + "Your GM level don't authorise you to block the player '%s'.", + player_name); + break; + case 3: // login-server offline + sprintf (output, + "Login-server is offline. Impossible to block the the player '%s'.", + player_name); + break; + } + break; + case 2: // ban + switch (RFIFOW (fd, 32)) + { + case 0: // login-server resquest done + sprintf (output, + "Login-server has been asked to ban the player '%s'.", + player_name); + break; + //case 1: // player not found + case 2: // gm level too low + sprintf (output, + "Your GM level don't authorise you to ban the player '%s'.", + player_name); + break; + case 3: // login-server offline + sprintf (output, + "Login-server is offline. Impossible to ban the the player '%s'.", + player_name); + break; + } + break; + case 3: // unblock + switch (RFIFOW (fd, 32)) + { + case 0: // login-server resquest done + sprintf (output, + "Login-server has been asked to unblock the player '%s'.", + player_name); + break; + //case 1: // player not found + case 2: // gm level too low + sprintf (output, + "Your GM level don't authorise you to unblock the player '%s'.", + player_name); + break; + case 3: // login-server offline + sprintf (output, + "Login-server is offline. Impossible to unblock the the player '%s'.", + player_name); + break; + } + break; + case 4: // unban + switch (RFIFOW (fd, 32)) + { + case 0: // login-server resquest done + sprintf (output, + "Login-server has been asked to unban the player '%s'.", + player_name); + break; + //case 1: // player not found + case 2: // gm level too low + sprintf (output, + "Your GM level don't authorise you to unban the player '%s'.", + player_name); + break; + case 3: // login-server offline + sprintf (output, + "Login-server is offline. Impossible to unban the the player '%s'.", + player_name); + break; + } + break; + case 5: // changesex + switch (RFIFOW (fd, 32)) + { + case 0: // login-server resquest done + sprintf (output, + "Login-server has been asked to change the sex of the player '%s'.", + player_name); + break; + //case 1: // player not found + case 2: // gm level too low + sprintf (output, + "Your GM level don't authorise you to change the sex of the player '%s'.", + player_name); + break; + case 3: // login-server offline + sprintf (output, + "Login-server is offline. Impossible to change the sex of the the player '%s'.", + player_name); + break; + } + break; + } + } + if (output[0] != '\0') + { + output[sizeof (output) - 1] = '\0'; + clif_displaymessage (sd->fd, output); + } + } + else + printf ("chrif_char_ask_name_answer failed - player not online.\n"); + + return 0; } /*========================================== * End of GM change (@GM) (modified by Yor) *------------------------------------------ */ -int chrif_changedgm(int fd) +int chrif_changedgm (int fd) { - int acc, level; - struct map_session_data *sd = NULL; - - acc = RFIFOL(fd,2); - level = RFIFOL(fd,6); - - sd = map_id2sd(acc); - - if (battle_config.etc_log) - printf("chrif_changedgm: account: %d, GM level 0 -> %d.\n", acc, level); - if (sd != NULL) { - if (level > 0) - clif_displaymessage(sd->fd, "GM modification success."); - else - clif_displaymessage(sd->fd, "Failure of GM modification."); - } - - return 0; + int acc, level; + struct map_session_data *sd = NULL; + + acc = RFIFOL (fd, 2); + level = RFIFOL (fd, 6); + + sd = map_id2sd (acc); + + if (battle_config.etc_log) + printf ("chrif_changedgm: account: %d, GM level 0 -> %d.\n", acc, + level); + if (sd != NULL) + { + if (level > 0) + clif_displaymessage (sd->fd, "GM modification success."); + else + clif_displaymessage (sd->fd, "Failure of GM modification."); + } + + return 0; } /*========================================== * 性別変化終了 (modified by Yor) *------------------------------------------ */ -int chrif_changedsex(int fd) +int chrif_changedsex (int fd) { - int acc, sex, i; - struct map_session_data *sd; - struct pc_base_job s_class; - - acc = RFIFOL(fd,2); - sex = RFIFOL(fd,6); - if (battle_config.etc_log) - printf("chrif_changedsex %d.\n", acc); - sd = map_id2sd(acc); - if (acc > 0) { - if (sd != NULL && sd->status.sex != sex) { - s_class = pc_calc_base_job(sd->status.class); - if (sd->status.sex == 0) { - sd->status.sex = 1; - sd->sex = 1; - } else if (sd->status.sex == 1) { - sd->status.sex = 0; - sd->sex = 0; - } - // to avoid any problem with equipment and invalid sex, equipment is unequiped. - for (i = 0; i < MAX_INVENTORY; i++) { - if (sd->status.inventory[i].nameid && sd->status.inventory[i].equip) - pc_unequipitem((struct map_session_data*)sd, i, 0); - } - // reset skill of some job - if (s_class.job == 19 || s_class.job == 4020 || s_class.job == 4042 || - s_class.job == 20 || s_class.job == 4021 || s_class.job == 4043) { - - clif_updatestatus(sd, SP_SKILLPOINT); - // change job if necessary - if (s_class.job == 20 || s_class.job == 4021 || s_class.job == 4043) - sd->status.class -= 1; - else if (s_class.job == 19 || s_class.job == 4020 || s_class.job == 4042) - sd->status.class += 1; - } - // save character - chrif_save(sd); - sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters - // do same modify in login-server for the account, but no in char-server (it ask again login_id1 to login, and don't remember it) - clif_displaymessage(sd->fd, "Your sex has been changed (need disconexion by the server)..."); - clif_setwaitclose(sd->fd); // forced to disconnect for the change - } - } else { - if (sd != NULL) { - printf("chrif_changedsex failed.\n"); - } - } - - return 0; + int acc, sex, i; + struct map_session_data *sd; + struct pc_base_job s_class; + + acc = RFIFOL (fd, 2); + sex = RFIFOL (fd, 6); + if (battle_config.etc_log) + printf ("chrif_changedsex %d.\n", acc); + sd = map_id2sd (acc); + if (acc > 0) + { + if (sd != NULL && sd->status.sex != sex) + { + s_class = pc_calc_base_job (sd->status.class); + if (sd->status.sex == 0) + { + sd->status.sex = 1; + sd->sex = 1; + } + else if (sd->status.sex == 1) + { + sd->status.sex = 0; + sd->sex = 0; + } + // to avoid any problem with equipment and invalid sex, equipment is unequiped. + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid + && sd->status.inventory[i].equip) + pc_unequipitem ((struct map_session_data *) sd, i, 0); + } + // reset skill of some job + if (s_class.job == 19 || s_class.job == 4020 + || s_class.job == 4042 || s_class.job == 20 + || s_class.job == 4021 || s_class.job == 4043) + { + + clif_updatestatus (sd, SP_SKILLPOINT); + // change job if necessary + if (s_class.job == 20 || s_class.job == 4021 + || s_class.job == 4043) + sd->status.class -= 1; + else if (s_class.job == 19 || s_class.job == 4020 + || s_class.job == 4042) + sd->status.class += 1; + } + // save character + chrif_save (sd); + sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters + // do same modify in login-server for the account, but no in char-server (it ask again login_id1 to login, and don't remember it) + clif_displaymessage (sd->fd, + "Your sex has been changed (need disconexion by the server)..."); + clif_setwaitclose (sd->fd); // forced to disconnect for the change + } + } + else + { + if (sd != NULL) + { + printf ("chrif_changedsex failed.\n"); + } + } + + return 0; } /*========================================== * アカウント変数保存要求 *------------------------------------------ */ -int chrif_saveaccountreg2(struct map_session_data *sd) +int chrif_saveaccountreg2 (struct map_session_data *sd) { - int p, j; - nullpo_retr(-1, sd); - - p = 8; - for(j = 0; j < sd->status.account_reg2_num; j++) { - struct global_reg *reg = &sd->status.account_reg2[j]; - if (reg->str[0] && reg->value != 0) { - memcpy(WFIFOP(char_fd,p), reg->str, 32); - WFIFOL(char_fd,p+32) = reg->value; - p += 36; - } - } - WFIFOW(char_fd,0) = 0x2b10; - WFIFOW(char_fd,2) = p; - WFIFOL(char_fd,4) = sd->bl.id; - WFIFOSET(char_fd,p); - - return 0; + int p, j; + nullpo_retr (-1, sd); + + p = 8; + for (j = 0; j < sd->status.account_reg2_num; j++) + { + struct global_reg *reg = &sd->status.account_reg2[j]; + if (reg->str[0] && reg->value != 0) + { + memcpy (WFIFOP (char_fd, p), reg->str, 32); + WFIFOL (char_fd, p + 32) = reg->value; + p += 36; + } + } + WFIFOW (char_fd, 0) = 0x2b10; + WFIFOW (char_fd, 2) = p; + WFIFOL (char_fd, 4) = sd->bl.id; + WFIFOSET (char_fd, p); + + return 0; } /*========================================== * アカウント変数通知 *------------------------------------------ */ -int chrif_accountreg2(int fd) +int chrif_accountreg2 (int fd) { - int j, p; - struct map_session_data *sd; - - if ((sd = map_id2sd(RFIFOL(fd,4))) == NULL) - return 1; - - for(p = 8, j = 0; p < RFIFOW(fd,2) && j < ACCOUNT_REG2_NUM; p += 36, j++) { - memcpy(sd->status.account_reg2[j].str, RFIFOP(fd,p), 32); - sd->status.account_reg2[j].value = RFIFOL(fd, p + 32); - } - sd->status.account_reg2_num = j; -// printf("chrif: accountreg2\n"); - - return 0; + int j, p; + struct map_session_data *sd; + + if ((sd = map_id2sd (RFIFOL (fd, 4))) == NULL) + return 1; + + for (p = 8, j = 0; p < RFIFOW (fd, 2) && j < ACCOUNT_REG2_NUM; + p += 36, j++) + { + memcpy (sd->status.account_reg2[j].str, RFIFOP (fd, p), 32); + sd->status.account_reg2[j].value = RFIFOL (fd, p + 32); + } + sd->status.account_reg2_num = j; +// printf("chrif: accountreg2\n"); + + return 0; } /*========================================== @@ -673,29 +754,30 @@ int chrif_accountreg2(int fd) * ack from a map-server divorce request *------------------------------------------ */ -int chrif_divorce(int char_id, int partner_id) +int chrif_divorce (int char_id, int partner_id) { - struct map_session_data *sd = NULL; - - if (!char_id || !partner_id) - return 0; + struct map_session_data *sd = NULL; + if (!char_id || !partner_id) + return 0; - sd = map_nick2sd(map_charid2nick(char_id)); - if (sd && sd->status.partner_id == partner_id) { - sd->status.partner_id = 0; + sd = map_nick2sd (map_charid2nick (char_id)); + if (sd && sd->status.partner_id == partner_id) + { + sd->status.partner_id = 0; - if (sd->npc_flags.divorce) { - sd->npc_flags.divorce = 0; - map_scriptcont(sd, sd->npc_id); - } - } + if (sd->npc_flags.divorce) + { + sd->npc_flags.divorce = 0; + map_scriptcont (sd, sd->npc_id); + } + } - nullpo_retr(0, sd = map_nick2sd(map_charid2nick(partner_id))); - if (sd->status.partner_id == char_id) - sd->status.partner_id = 0; + nullpo_retr (0, sd = map_nick2sd (map_charid2nick (partner_id))); + if (sd->status.partner_id == char_id) + sd->status.partner_id = 0; - return 0; + return 0; } /*========================================== @@ -703,171 +785,204 @@ int chrif_divorce(int char_id, int partner_id) * Needed to divorce when partner is not connected to map server *------------------------------------- */ -int chrif_send_divorce(int char_id) { - if (char_fd < 0) - return -1; - - WFIFOW(char_fd, 0) = 0x2b16; - WFIFOL(char_fd, 2) = char_id; - WFIFOSET(char_fd,6); - return 0; +int chrif_send_divorce (int char_id) +{ + if (char_fd < 0) + return -1; + + WFIFOW (char_fd, 0) = 0x2b16; + WFIFOL (char_fd, 2) = char_id; + WFIFOSET (char_fd, 6); + return 0; } /*========================================== * Disconnection of a player (account has been deleted in login-server) by [Yor] *------------------------------------------ */ -int chrif_accountdeletion(int fd) +int chrif_accountdeletion (int fd) { - int acc; - struct map_session_data *sd; - - acc = RFIFOL(fd,2); - if (battle_config.etc_log) - printf("chrif_accountdeletion %d.\n", acc); - sd = map_id2sd(acc); - if (acc > 0) { - if (sd != NULL) { - sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters - clif_displaymessage(sd->fd, "Your account has been deleted (disconnection)..."); - clif_setwaitclose(sd->fd); // forced to disconnect for the change - } - } else { - if (sd != NULL) - printf("chrif_accountdeletion failed - player not online.\n"); - } - - return 0; + int acc; + struct map_session_data *sd; + + acc = RFIFOL (fd, 2); + if (battle_config.etc_log) + printf ("chrif_accountdeletion %d.\n", acc); + sd = map_id2sd (acc); + if (acc > 0) + { + if (sd != NULL) + { + sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters + clif_displaymessage (sd->fd, + "Your account has been deleted (disconnection)..."); + clif_setwaitclose (sd->fd); // forced to disconnect for the change + } + } + else + { + if (sd != NULL) + printf ("chrif_accountdeletion failed - player not online.\n"); + } + + return 0; } /*========================================== * Disconnection of a player (account has been banned of has a status, from login-server) by [Yor] *------------------------------------------ */ -int chrif_accountban(int fd) +int chrif_accountban (int fd) { - int acc; - struct map_session_data *sd; - - acc = RFIFOL(fd,2); - if (battle_config.etc_log) - printf("chrif_accountban %d.\n", acc); - sd = map_id2sd(acc); - if (acc > 0) { - if (sd != NULL) { - sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters - if (RFIFOB(fd,6) == 0) { // 0: change of statut, 1: ban - switch (RFIFOL(fd,7)) { // status or final date of a banishment - case 1: // 0 = Unregistered ID - clif_displaymessage(sd->fd, "Your account has 'Unregistered'."); - break; - case 2: // 1 = Incorrect Password - clif_displaymessage(sd->fd, "Your account has an 'Incorrect Password'..."); - break; - case 3: // 2 = This ID is expired - clif_displaymessage(sd->fd, "Your account has expired."); - break; - case 4: // 3 = Rejected from Server - clif_displaymessage(sd->fd, "Your account has been rejected from server."); - break; - case 5: // 4 = You have been blocked by the GM Team - clif_displaymessage(sd->fd, "Your account has been blocked by the GM Team."); - break; - case 6: // 5 = Your Game's EXE file is not the latest version - clif_displaymessage(sd->fd, "Your Game's EXE file is not the latest version."); - break; - case 7: // 6 = Your are Prohibited to log in until %s - clif_displaymessage(sd->fd, "Your account has been prohibited to log in."); - break; - case 8: // 7 = Server is jammed due to over populated - clif_displaymessage(sd->fd, "Server is jammed due to over populated."); - break; - case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this) - clif_displaymessage(sd->fd, "Your account has not more authorised."); - break; - case 100: // 99 = This ID has been totally erased - clif_displaymessage(sd->fd, "Your account has been totally erased."); - break; - default: - clif_displaymessage(sd->fd, "Your account has not more authorised."); - break; - } - } else if (RFIFOB(fd,6) == 1) { // 0: change of statut, 1: ban - time_t timestamp; - char tmpstr[2048]; - timestamp = (time_t)RFIFOL(fd,7); // status or final date of a banishment - strcpy(tmpstr, "Your account has been banished until "); - strftime(tmpstr + strlen(tmpstr), 24, "%d-%m-%Y %H:%M:%S", gmtime(×tamp)); - clif_displaymessage(sd->fd, tmpstr); - } - clif_setwaitclose(sd->fd); // forced to disconnect for the change - } - } else { - if (sd != NULL) - printf("chrif_accountban failed - player not online.\n"); - } - - return 0; + int acc; + struct map_session_data *sd; + + acc = RFIFOL (fd, 2); + if (battle_config.etc_log) + printf ("chrif_accountban %d.\n", acc); + sd = map_id2sd (acc); + if (acc > 0) + { + if (sd != NULL) + { + sd->login_id1++; // change identify, because if player come back in char within the 5 seconds, he can change its characters + if (RFIFOB (fd, 6) == 0) + { // 0: change of statut, 1: ban + switch (RFIFOL (fd, 7)) + { // status or final date of a banishment + case 1: // 0 = Unregistered ID + clif_displaymessage (sd->fd, + "Your account has 'Unregistered'."); + break; + case 2: // 1 = Incorrect Password + clif_displaymessage (sd->fd, + "Your account has an 'Incorrect Password'..."); + break; + case 3: // 2 = This ID is expired + clif_displaymessage (sd->fd, + "Your account has expired."); + break; + case 4: // 3 = Rejected from Server + clif_displaymessage (sd->fd, + "Your account has been rejected from server."); + break; + case 5: // 4 = You have been blocked by the GM Team + clif_displaymessage (sd->fd, + "Your account has been blocked by the GM Team."); + break; + case 6: // 5 = Your Game's EXE file is not the latest version + clif_displaymessage (sd->fd, + "Your Game's EXE file is not the latest version."); + break; + case 7: // 6 = Your are Prohibited to log in until %s + clif_displaymessage (sd->fd, + "Your account has been prohibited to log in."); + break; + case 8: // 7 = Server is jammed due to over populated + clif_displaymessage (sd->fd, + "Server is jammed due to over populated."); + break; + case 9: // 8 = No MSG (actually, all states after 9 except 99 are No MSG, use only this) + clif_displaymessage (sd->fd, + "Your account has not more authorised."); + break; + case 100: // 99 = This ID has been totally erased + clif_displaymessage (sd->fd, + "Your account has been totally erased."); + break; + default: + clif_displaymessage (sd->fd, + "Your account has not more authorised."); + break; + } + } + else if (RFIFOB (fd, 6) == 1) + { // 0: change of statut, 1: ban + time_t timestamp; + char tmpstr[2048]; + timestamp = (time_t) RFIFOL (fd, 7); // status or final date of a banishment + strcpy (tmpstr, "Your account has been banished until "); + strftime (tmpstr + strlen (tmpstr), 24, "%d-%m-%Y %H:%M:%S", + gmtime (×tamp)); + clif_displaymessage (sd->fd, tmpstr); + } + clif_setwaitclose (sd->fd); // forced to disconnect for the change + } + } + else + { + if (sd != NULL) + printf ("chrif_accountban failed - player not online.\n"); + } + + return 0; } /*========================================== * Receiving GM accounts and their levels from char-server by [Yor] *------------------------------------------ */ -int chrif_recvgmaccounts(int fd) +int chrif_recvgmaccounts (int fd) { - printf("From login-server: receiving of %d GM accounts information.\n", pc_read_gm_account(fd)); + printf ("From login-server: receiving of %d GM accounts information.\n", + pc_read_gm_account (fd)); - return 0; + return 0; } /*========================================== * Request to reload GM accounts and their levels: send to char-server by [Yor] *------------------------------------------ */ -int chrif_reloadGMdb(void) +int chrif_reloadGMdb (void) { - WFIFOW(char_fd,0) = 0x2af7; - WFIFOSET(char_fd, 2); + WFIFOW (char_fd, 0) = 0x2af7; + WFIFOSET (char_fd, 2); - return 0; + return 0; } /*========================================== * Send rates and motd to char server [Wizputer] *------------------------------------------ */ - int chrif_ragsrvinfo(int base_rate, int job_rate, int drop_rate) +int chrif_ragsrvinfo (int base_rate, int job_rate, int drop_rate) { - char buf[256]; - FILE *fp; - int i; - - WFIFOW(char_fd,0) = 0x2b16; - WFIFOW(char_fd,2) = base_rate; - WFIFOW(char_fd,4) = job_rate; - WFIFOW(char_fd,6) = drop_rate; - - if ((fp = fopen_(motd_txt, "r")) != NULL) { - if (fgets(buf, 250, fp) != NULL) { - for(i = 0; buf[i]; i++) { - if (buf[i] == '\r' || buf[i] == '\n') { - buf[i] = 0; - break; - } - } - WFIFOW(char_fd,8) = sizeof(buf) + 10; - memcpy(WFIFOP(char_fd,10), buf, sizeof(buf)); - } - fclose_(fp); - } else { - WFIFOW(char_fd,8) = sizeof(buf) + 10; - memcpy(WFIFOP(char_fd,10), buf, sizeof(buf)); - } - WFIFOSET(char_fd,WFIFOW(char_fd,8)); - - return 0; + char buf[256]; + FILE *fp; + int i; + + WFIFOW (char_fd, 0) = 0x2b16; + WFIFOW (char_fd, 2) = base_rate; + WFIFOW (char_fd, 4) = job_rate; + WFIFOW (char_fd, 6) = drop_rate; + + if ((fp = fopen_ (motd_txt, "r")) != NULL) + { + if (fgets (buf, 250, fp) != NULL) + { + for (i = 0; buf[i]; i++) + { + if (buf[i] == '\r' || buf[i] == '\n') + { + buf[i] = 0; + break; + } + } + WFIFOW (char_fd, 8) = sizeof (buf) + 10; + memcpy (WFIFOP (char_fd, 10), buf, sizeof (buf)); + } + fclose_ (fp); + } + else + { + WFIFOW (char_fd, 8) = sizeof (buf) + 10; + memcpy (WFIFOP (char_fd, 10), buf, sizeof (buf)); + } + WFIFOSET (char_fd, WFIFOW (char_fd, 8)); + + return 0; } /*========================================= @@ -875,16 +990,16 @@ int chrif_reloadGMdb(void) *----------------------------------------- */ -int chrif_char_offline(struct map_session_data *sd) +int chrif_char_offline (struct map_session_data *sd) { - if (char_fd < 0) - return -1; + if (char_fd < 0) + return -1; - WFIFOW(char_fd,0) = 0x2b17; - WFIFOL(char_fd,2) = sd->status.char_id; - WFIFOSET(char_fd,6); + WFIFOW (char_fd, 0) = 0x2b17; + WFIFOL (char_fd, 2) = sd->status.char_id; + WFIFOSET (char_fd, 6); - return 0; + return 0; } /*======================================== @@ -892,172 +1007,232 @@ int chrif_char_offline(struct map_session_data *sd) *---------------------------------------- */ -static void -ladmin_itemfrob_fix_item(int source, int dest, struct item *item) +static void ladmin_itemfrob_fix_item (int source, int dest, struct item *item) { - if (item && item->nameid == source) { - item->nameid = dest; - item->equip = 0; - } + if (item && item->nameid == source) + { + item->nameid = dest; + item->equip = 0; + } } -static int ladmin_itemfrob_c2(struct block_list *bl, int source_id, int dest_id) +static int ladmin_itemfrob_c2 (struct block_list *bl, int source_id, + int dest_id) { #define IFIX(v) if (v == source_id) {v = dest_id; } #define FIX(item) ladmin_itemfrob_fix_item(source_id, dest_id, &item) - if (!bl) - return 0; + if (!bl) + return 0; - switch (bl->type) { - case BL_PC: { - struct map_session_data *pc = (struct map_session_data *) bl; - struct storage *stor = account2storage2(pc->status.account_id); - int j; - - for (j = 0; j < MAX_INVENTORY; j++) - IFIX(pc->status.inventory[j].nameid); - for (j = 0; j < MAX_CART; j++) - IFIX(pc->status.cart[j].nameid); - IFIX(pc->status.weapon); - IFIX(pc->status.shield); - IFIX(pc->status.head_top); - IFIX(pc->status.head_mid); - IFIX(pc->status.head_bottom); - - if (stor) - for (j = 0; j < stor->storage_amount; j++) - FIX(stor->storage_[j]); - - for (j = 0; j < MAX_INVENTORY; j++) { - struct item_data *item = pc->inventory_data[j]; - if (item && item->nameid == source_id) { - item->nameid = dest_id; - if (item->equip) - pc_unequipitem(pc, j, 0); - item->nameid = dest_id; - } + switch (bl->type) + { + case BL_PC: + { + struct map_session_data *pc = (struct map_session_data *) bl; + struct storage *stor = account2storage2 (pc->status.account_id); + int j; + + for (j = 0; j < MAX_INVENTORY; j++) + IFIX (pc->status.inventory[j].nameid); + for (j = 0; j < MAX_CART; j++) + IFIX (pc->status.cart[j].nameid); + IFIX (pc->status.weapon); + IFIX (pc->status.shield); + IFIX (pc->status.head_top); + IFIX (pc->status.head_mid); + IFIX (pc->status.head_bottom); + + if (stor) + for (j = 0; j < stor->storage_amount; j++) + FIX (stor->storage_[j]); + + for (j = 0; j < MAX_INVENTORY; j++) + { + struct item_data *item = pc->inventory_data[j]; + if (item && item->nameid == source_id) + { + item->nameid = dest_id; + if (item->equip) + pc_unequipitem (pc, j, 0); + item->nameid = dest_id; } - + } - break; + break; } - case BL_MOB: { - struct mob_data *mob = (struct mob_data *) bl; - int i; - for (i = 0; i < mob->lootitem_count; i++) - FIX(mob->lootitem[i]); - break; + case BL_MOB: + { + struct mob_data *mob = (struct mob_data *) bl; + int i; + for (i = 0; i < mob->lootitem_count; i++) + FIX (mob->lootitem[i]); + break; } - case BL_ITEM: { - struct flooritem_data *item = (struct flooritem_data *) bl; - FIX(item->item_data); - break; - } + case BL_ITEM: + { + struct flooritem_data *item = (struct flooritem_data *) bl; + FIX (item->item_data); + break; } + } #undef FIX #undef IFIX - return 0; + return 0; } -int ladmin_itemfrob_c(struct block_list *bl, va_list va_args) +int ladmin_itemfrob_c (struct block_list *bl, va_list va_args) { - int source_id = va_arg(va_args, int); - int dest_id = va_arg(va_args, int); - return ladmin_itemfrob_c2(bl, source_id, dest_id); + int source_id = va_arg (va_args, int); + int dest_id = va_arg (va_args, int); + return ladmin_itemfrob_c2 (bl, source_id, dest_id); } -void ladmin_itemfrob(int fd) +void ladmin_itemfrob (int fd) { - int source_id = RFIFOL(fd, 2); - int dest_id = RFIFOL(fd, 6); - struct block_list *bl = (struct block_list *)map_get_first_session(); - - // flooritems - map_foreachobject(ladmin_itemfrob_c, 0 /* any object */, source_id, dest_id); - - // player characters (and, hopefully, mobs) - while (bl->next) { - ladmin_itemfrob_c2(bl, source_id, dest_id); - bl = bl->next; - } + int source_id = RFIFOL (fd, 2); + int dest_id = RFIFOL (fd, 6); + struct block_list *bl = (struct block_list *) map_get_first_session (); + + // flooritems + map_foreachobject (ladmin_itemfrob_c, 0 /* any object */ , source_id, + dest_id); + + // player characters (and, hopefully, mobs) + while (bl->next) + { + ladmin_itemfrob_c2 (bl, source_id, dest_id); + bl = bl->next; + } } /*========================================== * *------------------------------------------ */ -int chrif_parse(int fd) +int chrif_parse (int fd) { - int packet_len, cmd; - - // only char-server can have an access to here. - // so, if it isn't the char-server, we disconnect the session (fd != char_fd). - if (fd != char_fd || session[fd]->eof) { - if (fd == char_fd) { - printf("Map-server can't connect to char-server (connection #%d).\n", fd); - char_fd = -1; - } - close(fd); - delete_session(fd); - return 0; - } - - while (RFIFOREST(fd) >= 2) { - cmd = RFIFOW(fd,0); - if (cmd < 0x2af8 || cmd >= 0x2af8 + (sizeof(packet_len_table) / sizeof(packet_len_table[0])) || - packet_len_table[cmd-0x2af8] == 0) { - - int r = intif_parse(fd); // intifに渡す - - if (r == 1) continue; // intifで処理した - if (r == 2) return 0; // intifで処理したが、データが足りない - - session[fd]->eof = 1; - return 0; - } - packet_len = packet_len_table[cmd-0x2af8]; - if (packet_len == -1) { - if (RFIFOREST(fd) < 4) - return 0; - packet_len = RFIFOW(fd,2); - } - if (RFIFOREST(fd) < packet_len) - return 0; - - switch(cmd) { - case 0x2af9: chrif_connectack(fd); break; - case 0x2afa: ladmin_itemfrob(fd); break; - case 0x2afb: chrif_sendmapack(fd); break; - case 0x2afd: pc_authok(RFIFOL(fd,4), RFIFOL(fd,8), (time_t)RFIFOL(fd,12), RFIFOW(fd, 16), (struct mmo_charstatus*)RFIFOP(fd,18)); break; - case 0x2afe: pc_authfail(RFIFOL(fd,2)); break; - case 0x2b00: map_setusers(RFIFOL(fd,2)); break; - case 0x2b03: clif_charselectok(RFIFOL(fd,2)); break; - case 0x2b04: chrif_recvmap(fd); break; - case 0x2b06: chrif_changemapserverack(fd); break; - case 0x2b09: map_addchariddb(RFIFOL(fd,2), RFIFOP(fd,6)); break; - case 0x2b0b: chrif_changedgm(fd); break; - case 0x2b0d: chrif_changedsex(fd); break; - case 0x2b0f: chrif_char_ask_name_answer(fd); break; - case 0x2b11: chrif_accountreg2(fd); break; - case 0x2b12: chrif_divorce(RFIFOL(fd,2), RFIFOL(fd,6)); break; - case 0x2b13: chrif_accountdeletion(fd); break; - case 0x2b14: chrif_accountban(fd); break; - case 0x2b15: chrif_recvgmaccounts(fd); break; - - default: - if (battle_config.error_log) - printf("chrif_parse : unknown packet %d %d\n", fd, RFIFOW(fd,0)); - session[fd]->eof = 1; - return 0; - } - RFIFOSKIP(fd, packet_len); - } - - return 0; + int packet_len, cmd; + + // only char-server can have an access to here. + // so, if it isn't the char-server, we disconnect the session (fd != char_fd). + if (fd != char_fd || session[fd]->eof) + { + if (fd == char_fd) + { + printf + ("Map-server can't connect to char-server (connection #%d).\n", + fd); + char_fd = -1; + } + close (fd); + delete_session (fd); + return 0; + } + + while (RFIFOREST (fd) >= 2) + { + cmd = RFIFOW (fd, 0); + if (cmd < 0x2af8 + || cmd >= + 0x2af8 + + (sizeof (packet_len_table) / sizeof (packet_len_table[0])) + || packet_len_table[cmd - 0x2af8] == 0) + { + + int r = intif_parse (fd); // intifに渡す + + if (r == 1) + continue; // intifで処理した + if (r == 2) + return 0; // intifで処理したが、データが足りない + + session[fd]->eof = 1; + return 0; + } + packet_len = packet_len_table[cmd - 0x2af8]; + if (packet_len == -1) + { + if (RFIFOREST (fd) < 4) + return 0; + packet_len = RFIFOW (fd, 2); + } + if (RFIFOREST (fd) < packet_len) + return 0; + + switch (cmd) + { + case 0x2af9: + chrif_connectack (fd); + break; + case 0x2afa: + ladmin_itemfrob (fd); + break; + case 0x2afb: + chrif_sendmapack (fd); + break; + case 0x2afd: + pc_authok (RFIFOL (fd, 4), RFIFOL (fd, 8), + (time_t) RFIFOL (fd, 12), RFIFOW (fd, 16), + (struct mmo_charstatus *) RFIFOP (fd, 18)); + break; + case 0x2afe: + pc_authfail (RFIFOL (fd, 2)); + break; + case 0x2b00: + map_setusers (RFIFOL (fd, 2)); + break; + case 0x2b03: + clif_charselectok (RFIFOL (fd, 2)); + break; + case 0x2b04: + chrif_recvmap (fd); + break; + case 0x2b06: + chrif_changemapserverack (fd); + break; + case 0x2b09: + map_addchariddb (RFIFOL (fd, 2), RFIFOP (fd, 6)); + break; + case 0x2b0b: + chrif_changedgm (fd); + break; + case 0x2b0d: + chrif_changedsex (fd); + break; + case 0x2b0f: + chrif_char_ask_name_answer (fd); + break; + case 0x2b11: + chrif_accountreg2 (fd); + break; + case 0x2b12: + chrif_divorce (RFIFOL (fd, 2), RFIFOL (fd, 6)); + break; + case 0x2b13: + chrif_accountdeletion (fd); + break; + case 0x2b14: + chrif_accountban (fd); + break; + case 0x2b15: + chrif_recvgmaccounts (fd); + break; + + default: + if (battle_config.error_log) + printf ("chrif_parse : unknown packet %d %d\n", fd, + RFIFOW (fd, 0)); + session[fd]->eof = 1; + return 0; + } + RFIFOSKIP (fd, packet_len); + } + + return 0; } /*========================================== @@ -1065,28 +1240,31 @@ int chrif_parse(int fd) * 今このmap鯖に繋がっているクライアント人数をchar鯖へ送る *------------------------------------------ */ -int send_users_tochar(int tid, unsigned int tick, int id, int data) { - int users = 0, i; - struct map_session_data *sd; - - if (char_fd <= 0 || session[char_fd] == NULL) - return 0; - - WFIFOW(char_fd,0) = 0x2aff; - for (i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) && sd->state.auth && - !((battle_config.hide_GM_session - || sd->state.shroud_active - || (sd->status.option & OPTION_HIDE)) && pc_isGM(sd))) { - WFIFOL(char_fd,6+4*users) = sd->status.char_id; - users++; - } - } - WFIFOW(char_fd,2) = 6 + 4 * users; - WFIFOW(char_fd,4) = users; - WFIFOSET(char_fd,6+4*users); - - return 0; +int send_users_tochar (int tid, unsigned int tick, int id, int data) +{ + int users = 0, i; + struct map_session_data *sd; + + if (char_fd <= 0 || session[char_fd] == NULL) + return 0; + + WFIFOW (char_fd, 0) = 0x2aff; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data) && sd->state.auth && + !((battle_config.hide_GM_session + || sd->state.shroud_active + || (sd->status.option & OPTION_HIDE)) && pc_isGM (sd))) + { + WFIFOL (char_fd, 6 + 4 * users) = sd->status.char_id; + users++; + } + } + WFIFOW (char_fd, 2) = 6 + 4 * users; + WFIFOW (char_fd, 4) = users; + WFIFOSET (char_fd, 6 + 4 * users); + + return 0; } /*========================================== @@ -1094,30 +1272,35 @@ int send_users_tochar(int tid, unsigned int tick, int id, int data) { * char鯖との接続を確認し、もし切れていたら再度接続する *------------------------------------------ */ -int check_connect_char_server(int tid, unsigned int tick, int id, int data) { - if (char_fd <= 0 || session[char_fd] == NULL) { - printf("Attempt to connect to char-server...\n"); - chrif_state = 0; - if ((char_fd = make_connection(char_ip, char_port)) < 0) - return 0; - session[char_fd]->func_parse = chrif_parse; - realloc_fifo(char_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); - - chrif_connect(char_fd); - } - - return 0; +int check_connect_char_server (int tid, unsigned int tick, int id, int data) +{ + if (char_fd <= 0 || session[char_fd] == NULL) + { + printf ("Attempt to connect to char-server...\n"); + chrif_state = 0; + if ((char_fd = make_connection (char_ip, char_port)) < 0) + return 0; + session[char_fd]->func_parse = chrif_parse; + realloc_fifo (char_fd, FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK); + + chrif_connect (char_fd); + } + + return 0; } /*========================================== * *------------------------------------------ */ -int do_init_chrif(void) { - add_timer_func_list(check_connect_char_server, "check_connect_char_server"); - add_timer_func_list(send_users_tochar, "send_users_tochar"); - add_timer_interval(gettick() + 1000, check_connect_char_server, 0, 0, 10 * 1000); - add_timer_interval(gettick() + 1000, send_users_tochar, 0, 0, 5 * 1000); - - return 0; +int do_init_chrif (void) +{ + add_timer_func_list (check_connect_char_server, + "check_connect_char_server"); + add_timer_func_list (send_users_tochar, "send_users_tochar"); + add_timer_interval (gettick () + 1000, check_connect_char_server, 0, 0, + 10 * 1000); + add_timer_interval (gettick () + 1000, send_users_tochar, 0, 0, 5 * 1000); + + return 0; } diff --git a/src/map/chrif.h b/src/map/chrif.h index 2a7b35e..c3ae80d 100644 --- a/src/map/chrif.h +++ b/src/map/chrif.h @@ -2,29 +2,33 @@ #ifndef _CHRIF_H_ #define _CHRIF_H_ -void chrif_setuserid(char*); -void chrif_setpasswd(char*); -void chrif_setip(char*); -void chrif_setport(int); +void chrif_setuserid (char *); +void chrif_setpasswd (char *); +void chrif_setip (char *); +void chrif_setport (int); -int chrif_isconnect(void); +int chrif_isconnect (void); -int chrif_authreq(struct map_session_data *); -int chrif_save(struct map_session_data*); -int chrif_charselectreq(struct map_session_data *); +int chrif_authreq (struct map_session_data *); +int chrif_save (struct map_session_data *); +int chrif_charselectreq (struct map_session_data *); -int chrif_changemapserver(struct map_session_data *sd,char *name,int x,int y,int ip,short port); +int chrif_changemapserver (struct map_session_data *sd, char *name, int x, + int y, int ip, short port); -int chrif_searchcharid(int char_id); -int chrif_changegm(int id,const char *pass,int len); -int chrif_changeemail(int id, const char *actual_email, const char *new_email); -int chrif_char_ask_name(int id, char * character_name, short operation_type, int year, int month, int day, int hour, int minute, int second); -int chrif_saveaccountreg2(struct map_session_data *sd); -int chrif_reloadGMdb(void); -int chrif_ragsrvinfo(int base_rate,int job_rate, int drop_rate); -int chrif_char_offline(struct map_session_data *sd); -int chrif_send_divorce(int char_id); +int chrif_searchcharid (int char_id); +int chrif_changegm (int id, const char *pass, int len); +int chrif_changeemail (int id, const char *actual_email, + const char *new_email); +int chrif_char_ask_name (int id, char *character_name, short operation_type, + int year, int month, int day, int hour, int minute, + int second); +int chrif_saveaccountreg2 (struct map_session_data *sd); +int chrif_reloadGMdb (void); +int chrif_ragsrvinfo (int base_rate, int job_rate, int drop_rate); +int chrif_char_offline (struct map_session_data *sd); +int chrif_send_divorce (int char_id); -int do_init_chrif(void); +int do_init_chrif (void); #endif diff --git a/src/map/clif.c b/src/map/clif.c index 3fe4ad9..c3099d7 100644 --- a/src/map/clif.c +++ b/src/map/clif.c @@ -52,75 +52,76 @@ #define EMOTE_IGNORED 0x0e static const int packet_len_table[0x220] = { - 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, //#0x0040 - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, -1, 55, 17, 3, 37, 46, -1, 23, -1, 3,108, 3, 2, - 3, 28, 19, 11, 3, -1, 9, 5, 54, 53, 58, 60, 41, 2, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -1, 55, 17, 3, 37, 46, -1, 23, -1, 3, 108, 3, 2, + 3, 28, 19, 11, 3, -1, 9, 5, 54, 53, 58, 60, 41, 2, 6, 6, //#0x0080 - 7, 3, 2, 2, 2, 5, 16, 12, 10, 7, 29, 23, -1, -1, -1, 0, // 0x8b unknown... size 2 or 23? - 7, 22, 28, 2, 6, 30, -1, -1, 3, -1, -1, 5, 9, 17, 17, 6, - 23, 6, 6, -1, -1, -1, -1, 8, 7, 6, 7, 4, 7, 0, -1, 6, - 8, 8, 3, 3, -1, 6, 6, -1, 7, 6, 2, 5, 6, 44, 5, 3, + 7, 3, 2, 2, 2, 5, 16, 12, 10, 7, 29, 23, -1, -1, -1, 0, // 0x8b unknown... size 2 or 23? + 7, 22, 28, 2, 6, 30, -1, -1, 3, -1, -1, 5, 9, 17, 17, 6, + 23, 6, 6, -1, -1, -1, -1, 8, 7, 6, 7, 4, 7, 0, -1, 6, + 8, 8, 3, 3, -1, 6, 6, -1, 7, 6, 2, 5, 6, 44, 5, 3, //#0x00C0 - 7, 2, 6, 8, 6, 7, -1, -1, -1, -1, 3, 3, 6, 6, 2, 27, - 3, 4, 4, 2, -1, -1, 3, -1, 6, 14, 3, -1, 28, 29, -1, -1, - 30, 30, 26, 2, 6, 26, 3, 3, 8, 19, 5, 2, 3, 2, 2, 2, - 3, 2, 6, 8, 21, 8, 8, 2, 2, 26, 3, -1, 6, 27, 30, 10, + 7, 2, 6, 8, 6, 7, -1, -1, -1, -1, 3, 3, 6, 6, 2, 27, + 3, 4, 4, 2, -1, -1, 3, -1, 6, 14, 3, -1, 28, 29, -1, -1, + 30, 30, 26, 2, 6, 26, 3, 3, 8, 19, 5, 2, 3, 2, 2, 2, + 3, 2, 6, 8, 21, 8, 8, 2, 2, 26, 3, -1, 6, 27, 30, 10, //#0x0100 - 2, 6, 6, 30, 79, 31, 10, 10, -1, -1, 4, 6, 6, 2, 11, -1, - 10, 39, 4, 10, 31, 35, 10, 18, 2, 13, 15, 20, 68, 2, 3, 16, - 6, 14, -1, -1, 21, 8, 8, 8, 8, 8, 2, 2, 3, 4, 2, -1, - 6, 86, 6, -1, -1, 7, -1, 6, 3, 16, 4, 4, 4, 6, 24, 26, + 2, 6, 6, 30, 79, 31, 10, 10, -1, -1, 4, 6, 6, 2, 11, -1, + 10, 39, 4, 10, 31, 35, 10, 18, 2, 13, 15, 20, 68, 2, 3, 16, + 6, 14, -1, -1, 21, 8, 8, 8, 8, 8, 2, 2, 3, 4, 2, -1, + 6, 86, 6, -1, -1, 7, -1, 6, 3, 16, 4, 4, 4, 6, 24, 26, //#0x0140 - 22, 14, 6, 10, 23, 19, 6, 39, 8, 9, 6, 27, -1, 2, 6, 6, - 110, 6, -1, -1, -1, -1, -1, 6, -1, 54, 66, 54, 90, 42, 6, 42, - -1, -1, -1, -1, -1, 30, -1, 3, 14, 3, 30, 10, 43, 14,186,182, - 14, 30, 10, 3, -1, 6,106, -1, 4, 5, 4, -1, 6, 7, -1, -1, + 22, 14, 6, 10, 23, 19, 6, 39, 8, 9, 6, 27, -1, 2, 6, 6, + 110, 6, -1, -1, -1, -1, -1, 6, -1, 54, 66, 54, 90, 42, 6, 42, + -1, -1, -1, -1, -1, 30, -1, 3, 14, 3, 30, 10, 43, 14, 186, 182, + 14, 30, 10, 3, -1, 6, 106, -1, 4, 5, 4, -1, 6, 7, -1, -1, //#0x0180 - 6, 3,106, 10, 10, 34, 0, 6, 8, 4, 4, 4, 29, -1, 10, 6, - 90, 86, 24, 6, 30,102, 9, 4, 8, 4, 14, 10, -1, 6, 2, 6, - 3, 3, 35, 5, 11, 26, -1, 4, 4, 6, 10, 12, 6, -1, 4, 4, - 11, 7, -1, 67, 12, 18,114, 6, 3, 6, 26, 26, 26, 26, 2, 3, + 6, 3, 106, 10, 10, 34, 0, 6, 8, 4, 4, 4, 29, -1, 10, 6, + 90, 86, 24, 6, 30, 102, 9, 4, 8, 4, 14, 10, -1, 6, 2, 6, + 3, 3, 35, 5, 11, 26, -1, 4, 4, 6, 10, 12, 6, -1, 4, 4, + 11, 7, -1, 67, 12, 18, 114, 6, 3, 6, 26, 26, 26, 26, 2, 3, //#0x01C0, Set 0x1d5=-1 - 2, 14, 10, -1, 22, 22, 4, 2, 13, 97, 0, 9, 9, 30, 6, 28, - 8, 14, 10, 35, 6, -1, 4, 11, 54, 53, 60, 2, -1, 47, 33, 6, - 30, 8, 34, 14, 2, 6, 26, 2, 28, 81, 6, 10, 26, 2, -1, -1, - -1, -1, 20, 10, 32, 9, 34, 14, 2, 6, 48, 56, -1, 4, 5, 10, + 2, 14, 10, -1, 22, 22, 4, 2, 13, 97, 0, 9, 9, 30, 6, 28, + 8, 14, 10, 35, 6, -1, 4, 11, 54, 53, 60, 2, -1, 47, 33, 6, + 30, 8, 34, 14, 2, 6, 26, 2, 28, 81, 6, 10, 26, 2, -1, -1, + -1, -1, 20, 10, 32, 9, 34, 14, 2, 6, 48, 56, -1, 4, 5, 10, //#0x200 - 26, -1, 26, 10, 18, 26, 11, 34, 14, 36, 10, 19, 0, -1, 24, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 26, -1, 26, 10, 18, 26, 11, 34, 14, 36, 10, 19, 0, -1, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; // local define -enum { - ALL_CLIENT, - ALL_SAMEMAP, - AREA, - AREA_WOS, - AREA_WOC, - AREA_WOSC, - AREA_CHAT_WOC, - CHAT, - CHAT_WOS, - PARTY, - PARTY_WOS, - PARTY_SAMEMAP, - PARTY_SAMEMAP_WOS, - PARTY_AREA, - PARTY_AREA_WOS, - GUILD, - GUILD_WOS, - GUILD_SAMEMAP, // [Valaris] - GUILD_SAMEMAP_WOS, - GUILD_AREA, - GUILD_AREA_WOS, // end additions [Valaris] - SELF +enum +{ + ALL_CLIENT, + ALL_SAMEMAP, + AREA, + AREA_WOS, + AREA_WOC, + AREA_WOSC, + AREA_CHAT_WOC, + CHAT, + CHAT_WOS, + PARTY, + PARTY_WOS, + PARTY_SAMEMAP, + PARTY_SAMEMAP_WOS, + PARTY_AREA, + PARTY_AREA_WOS, + GUILD, + GUILD_WOS, + GUILD_SAMEMAP, // [Valaris] + GUILD_SAMEMAP_WOS, + GUILD_AREA, + GUILD_AREA_WOS, // end additions [Valaris] + SELF }; #define WBUFPOS(p,pos,x,y) { unsigned char *__p = (p); __p+=(pos); __p[0] = (x)>>2; __p[1] = ((x)<<6) | (((y)>>4)&0x3f); __p[2] = (y)<<4; } @@ -132,376 +133,452 @@ enum { static char map_ip_str[16]; static in_addr_t map_ip; static int map_port = 5121; -int map_fd; +int map_fd; char talkie_mes[80]; /*========================================== * mapソスIソスソスipソスン抵ソス *------------------------------------------ */ -void clif_setip(char *ip) +void clif_setip (char *ip) { - memcpy(map_ip_str, ip, 16); - map_ip = inet_addr(map_ip_str); + memcpy (map_ip_str, ip, 16); + map_ip = inet_addr (map_ip_str); } /*========================================== * mapソスIソスソスportソスン抵ソス *------------------------------------------ */ -void clif_setport(int port) +void clif_setport (int port) { - map_port = port; + map_port = port; } /*========================================== * mapソスIソスソスipソスヌみ出ソスソス *------------------------------------------ */ -in_addr_t clif_getip(void) +in_addr_t clif_getip (void) { - return map_ip; + return map_ip; } /*========================================== * mapソスIソスソスportソスヌみ出ソスソス *------------------------------------------ */ -int clif_getport(void) +int clif_getport (void) { - return map_port; + return map_port; } /*========================================== * *------------------------------------------ */ -int clif_countusers(void) +int clif_countusers (void) { - int users = 0, i; - struct map_session_data *sd; + int users = 0, i; + struct map_session_data *sd; - for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) && sd && sd->state.auth && - !(battle_config.hide_GM_session && pc_isGM(sd))) - users++; - } - return users; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data) && sd + && sd->state.auth && !(battle_config.hide_GM_session + && pc_isGM (sd))) + users++; + } + return users; } /*========================================== * ソスSソストゑソスclientソスノ対ゑソスソスソスfunc()ソスソスs *------------------------------------------ */ -int clif_foreachclient(int (*func)(struct map_session_data*, va_list),...) +int clif_foreachclient (int (*func) (struct map_session_data *, va_list), ...) { - int i; - va_list ap; - struct map_session_data *sd; + int i; + va_list ap; + struct map_session_data *sd; - va_start(ap,func); - for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) && sd && sd->state.auth) - func(sd, ap); - } - va_end(ap); - return 0; + va_start (ap, func); + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data) && sd + && sd->state.auth) + func (sd, ap); + } + va_end (ap); + return 0; } -static int -is_deaf(struct block_list *bl) +static int is_deaf (struct block_list *bl) { - struct map_session_data *sd = (struct map_session_data *) bl; - if (!bl || bl->type != BL_PC) - return 0; - return sd->special_state.deaf; + struct map_session_data *sd = (struct map_session_data *) bl; + if (!bl || bl->type != BL_PC) + return 0; + return sd->special_state.deaf; } -static void clif_emotion_towards(struct block_list *bl, struct block_list *target, int type); - +static void clif_emotion_towards (struct block_list *bl, + struct block_list *target, int type); /*========================================== * clif_sendソスソスAREA*ソスwソス闔橸ソスp *------------------------------------------ */ -int clif_send_sub(struct block_list *bl, va_list ap) +int clif_send_sub (struct block_list *bl, va_list ap) { - unsigned char *buf; - int len; - struct block_list *src_bl; - int type; - struct map_session_data *sd; + unsigned char *buf; + int len; + struct block_list *src_bl; + int type; + struct map_session_data *sd; - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, sd = (struct map_session_data *)bl); + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, sd = (struct map_session_data *) bl); - buf = va_arg(ap,unsigned char*); - len = va_arg(ap,int); - nullpo_retr(0, src_bl = va_arg(ap,struct block_list*)); - type = va_arg(ap,int); + buf = va_arg (ap, unsigned char *); + len = va_arg (ap, int); + nullpo_retr (0, src_bl = va_arg (ap, struct block_list *)); + type = va_arg (ap, int); - switch(type) { - case AREA_WOS: - if (bl && bl == src_bl) - return 0; - break; + switch (type) + { + case AREA_WOS: + if (bl && bl == src_bl) + return 0; + break; case AREA_CHAT_WOC: - if (is_deaf (bl) && !(bl->type == BL_PC && pc_isGM((struct map_session_data *)src_bl))) { - clif_emotion_towards(src_bl, bl, EMOTE_IGNORED); - return 0; - } - /* fall through... */ - case AREA_WOC: - if ((sd && sd->chatID) || (bl && bl == src_bl)) - return 0; - - break; - case AREA_WOSC: - if ((sd) && sd->chatID && sd->chatID == ((struct map_session_data*)src_bl)->chatID) - return 0; - break; - } + if (is_deaf (bl) + && !(bl->type == BL_PC + && pc_isGM ((struct map_session_data *) src_bl))) + { + clif_emotion_towards (src_bl, bl, EMOTE_IGNORED); + return 0; + } + /* fall through... */ + case AREA_WOC: + if ((sd && sd->chatID) || (bl && bl == src_bl)) + return 0; - if (session[sd->fd] != NULL) { - if (WFIFOP(sd->fd,0) == buf) { - printf("WARNING: Invalid use of clif_send function\n"); - printf(" Packet x%4x use a WFIFO of a player instead of to use a buffer.\n", WBUFW(buf,0)); - printf(" Please correct your code.\n"); - // don't send to not move the pointer of the packet for next sessions in the loop - } else { - if (packet_len_table[RBUFW(buf,0)]) { // packet must exist - memcpy(WFIFOP(sd->fd,0), buf, len); - WFIFOSET(sd->fd,len); - } - } - } + break; + case AREA_WOSC: + if ((sd) && sd->chatID + && sd->chatID == ((struct map_session_data *) src_bl)->chatID) + return 0; + break; + } + + if (session[sd->fd] != NULL) + { + if (WFIFOP (sd->fd, 0) == buf) + { + printf ("WARNING: Invalid use of clif_send function\n"); + printf + (" Packet x%4x use a WFIFO of a player instead of to use a buffer.\n", + WBUFW (buf, 0)); + printf (" Please correct your code.\n"); + // don't send to not move the pointer of the packet for next sessions in the loop + } + else + { + if (packet_len_table[RBUFW (buf, 0)]) + { // packet must exist + memcpy (WFIFOP (sd->fd, 0), buf, len); + WFIFOSET (sd->fd, len); + } + } + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_send(unsigned char *buf, int len, struct block_list *bl, int type) { - int i; - struct map_session_data *sd; - struct chat_data *cd; - struct party *p = NULL; - struct guild *g = NULL; - int x0 = 0, x1 = 0, y0 = 0, y1 = 0; +int clif_send (unsigned char *buf, int len, struct block_list *bl, int type) +{ + int i; + struct map_session_data *sd; + struct chat_data *cd; + struct party *p = NULL; + struct guild *g = NULL; + int x0 = 0, x1 = 0, y0 = 0, y1 = 0; - if (type != ALL_CLIENT) { - nullpo_retr(0, bl); + if (type != ALL_CLIENT) + { + nullpo_retr (0, bl); - if (bl->type == BL_PC) { - struct map_session_data *sd = (struct map_session_data *) bl; - if (sd->status.option & OPTION_INVISIBILITY) { - // Obscure hidden GMs + if (bl->type == BL_PC) + { + struct map_session_data *sd = (struct map_session_data *) bl; + if (sd->status.option & OPTION_INVISIBILITY) + { + // Obscure hidden GMs - switch (type) { - case AREA: - case AREA_WOC: - type = SELF; - break; + switch (type) + { + case AREA: + case AREA_WOC: + type = SELF; + break; - case AREA_WOS: - case AREA_WOSC: - return 1; + case AREA_WOS: + case AREA_WOSC: + return 1; - default: - break; + default: + break; + } + } + } + } + + switch (type) + { + case ALL_CLIENT: // ソスSソスNソスソスソスCソスAソスソスソスgソスノ托ソスソスM + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data) != NULL + && sd->state.auth) + { + if (packet_len_table[RBUFW (buf, 0)]) + { // packet must exist + memcpy (WFIFOP (i, 0), buf, len); + WFIFOSET (i, len); + } + } + } + break; + case ALL_SAMEMAP: // ソスソスソスソスソス}ソスbソスvソスフ全ソスNソスソスソスCソスAソスソスソスgソスノ托ソスソスM + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data) != NULL + && sd->state.auth && sd->bl.m == bl->m) + { + if (packet_len_table[RBUFW (buf, 0)]) + { // packet must exist + memcpy (WFIFOP (i, 0), buf, len); + WFIFOSET (i, len); + } + } + } + break; + case AREA: + case AREA_WOS: + case AREA_WOC: + case AREA_WOSC: + map_foreachinarea (clif_send_sub, bl->m, bl->x - AREA_SIZE, + bl->y - AREA_SIZE, bl->x + AREA_SIZE, + bl->y + AREA_SIZE, BL_PC, buf, len, bl, type); + break; + case AREA_CHAT_WOC: + map_foreachinarea (clif_send_sub, bl->m, bl->x - (AREA_SIZE - 5), + bl->y - (AREA_SIZE - 5), + bl->x + (AREA_SIZE - 5), + bl->y + (AREA_SIZE - 5), BL_PC, buf, len, bl, + AREA_CHAT_WOC); + break; + case CHAT: + case CHAT_WOS: + cd = (struct chat_data *) bl; + if (bl->type == BL_PC) + { + sd = (struct map_session_data *) bl; + cd = (struct chat_data *) map_id2bl (sd->chatID); + } + else if (bl->type != BL_CHAT) + break; + if (cd == NULL) + break; + for (i = 0; i < cd->users; i++) + { + if (type == CHAT_WOS + && cd->usersd[i] == (struct map_session_data *) bl) + continue; + if (packet_len_table[RBUFW (buf, 0)]) + { // packet must exist + memcpy (WFIFOP (cd->usersd[i]->fd, 0), buf, len); + WFIFOSET (cd->usersd[i]->fd, len); + } + } + break; + + case PARTY_AREA: // ソスソスソスソスソスソスソスハ難ソスソスフ全ソスpソス[ソスeソスBソス[ソスソスソスソスソスoソスノ托ソスソスM + case PARTY_AREA_WOS: // ソスソスソスソスソスネ外ソスフ難ソスソスソスソスソスソスハ難ソスソスフ全ソスpソス[ソスeソスBソス[ソスソスソスソスソスoソスノ托ソスソスM + x0 = bl->x - AREA_SIZE; + y0 = bl->y - AREA_SIZE; + x1 = bl->x + AREA_SIZE; + y1 = bl->y + AREA_SIZE; + case PARTY: // ソスSソスpソス[ソスeソスBソス[ソスソスソスソスソスoソスノ托ソスソスM + case PARTY_WOS: // ソスソスソスソスソスネ外ソスフ全ソスpソス[ソスeソスBソス[ソスソスソスソスソスoソスノ托ソスソスM + case PARTY_SAMEMAP: // ソスソスソスソスソス}ソスbソスvソスフ全ソスpソス[ソスeソスBソス[ソスソスソスソスソスoソスノ托ソスソスM + case PARTY_SAMEMAP_WOS: // ソスソスソスソスソスネ外ソスフ難ソスソスソスソス}ソスbソスvソスフ全ソスpソス[ソスeソスBソス[ソスソスソスソスソスoソスノ托ソスソスM + if (bl->type == BL_PC) + { + sd = (struct map_session_data *) bl; + if (sd->partyspy > 0) + { + p = party_search (sd->partyspy); + } + else + { + if (sd->status.party_id > 0) + p = party_search (sd->status.party_id); + } + } + if (p) + { + for (i = 0; i < MAX_PARTY; i++) + { + if ((sd = p->member[i].sd) != NULL) + { + if (sd->bl.id == bl->id && (type == PARTY_WOS || + type == PARTY_SAMEMAP_WOS + || type == + PARTY_AREA_WOS)) + continue; + if (type != PARTY && type != PARTY_WOS && bl->m != sd->bl.m) // ソス}ソスbソスvソス`ソスFソスbソスN + continue; + if ((type == PARTY_AREA || type == PARTY_AREA_WOS) && + (sd->bl.x < x0 || sd->bl.y < y0 || + sd->bl.x > x1 || sd->bl.y > y1)) + continue; + if (packet_len_table[RBUFW (buf, 0)]) + { // packet must exist + memcpy (WFIFOP (sd->fd, 0), buf, len); + WFIFOSET (sd->fd, len); } } } - } - - switch(type) { - case ALL_CLIENT: // ソスSソスNソスソスソスCソスAソスソスソスgソスノ托ソスソスM - for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth) { - if (packet_len_table[RBUFW(buf,0)]) { // packet must exist - memcpy(WFIFOP(i,0), buf, len); - WFIFOSET(i,len); - } - } - } - break; - case ALL_SAMEMAP: // ソスソスソスソスソス}ソスbソスvソスフ全ソスNソスソスソスCソスAソスソスソスgソスノ托ソスソスM - for(i = 0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth && sd->bl.m == bl->m) { - if (packet_len_table[RBUFW(buf,0)]) { // packet must exist - memcpy(WFIFOP(i,0), buf, len); - WFIFOSET(i,len); - } - } - } - break; - case AREA: - case AREA_WOS: - case AREA_WOC: - case AREA_WOSC: - map_foreachinarea(clif_send_sub, bl->m, bl->x-AREA_SIZE, bl->y-AREA_SIZE, bl->x+AREA_SIZE, bl->y+AREA_SIZE, BL_PC, buf, len, bl, type); - break; - case AREA_CHAT_WOC: - map_foreachinarea(clif_send_sub, bl->m, bl->x-(AREA_SIZE-5), bl->y-(AREA_SIZE-5), bl->x+(AREA_SIZE-5), bl->y+(AREA_SIZE-5), BL_PC, buf, len, bl, AREA_CHAT_WOC); - break; - case CHAT: - case CHAT_WOS: - cd = (struct chat_data*)bl; - if (bl->type == BL_PC) { - sd = (struct map_session_data*)bl; - cd = (struct chat_data*)map_id2bl(sd->chatID); - } else if (bl->type != BL_CHAT) - break; - if (cd == NULL) - break; - for(i = 0; i < cd->users; i++) { - if (type == CHAT_WOS && cd->usersd[i] == (struct map_session_data*)bl) - continue; - if (packet_len_table[RBUFW(buf,0)]) { // packet must exist - memcpy(WFIFOP(cd->usersd[i]->fd,0), buf, len); - WFIFOSET(cd->usersd[i]->fd,len); - } - } - break; - - case PARTY_AREA: // ソスソスソスソスソスソスソスハ難ソスソスフ全ソスpソス[ソスeソスBソス[ソスソスソスソスソスoソスノ托ソスソスM - case PARTY_AREA_WOS: // ソスソスソスソスソスネ外ソスフ難ソスソスソスソスソスソスハ難ソスソスフ全ソスpソス[ソスeソスBソス[ソスソスソスソスソスoソスノ托ソスソスM - x0 = bl->x - AREA_SIZE; - y0 = bl->y - AREA_SIZE; - x1 = bl->x + AREA_SIZE; - y1 = bl->y + AREA_SIZE; - case PARTY: // ソスSソスpソス[ソスeソスBソス[ソスソスソスソスソスoソスノ托ソスソスM - case PARTY_WOS: // ソスソスソスソスソスネ外ソスフ全ソスpソス[ソスeソスBソス[ソスソスソスソスソスoソスノ托ソスソスM - case PARTY_SAMEMAP: // ソスソスソスソスソス}ソスbソスvソスフ全ソスpソス[ソスeソスBソス[ソスソスソスソスソスoソスノ托ソスソスM - case PARTY_SAMEMAP_WOS: // ソスソスソスソスソスネ外ソスフ難ソスソスソスソス}ソスbソスvソスフ全ソスpソス[ソスeソスBソス[ソスソスソスソスソスoソスノ托ソスソスM - if (bl->type == BL_PC) { - sd = (struct map_session_data *)bl; - if (sd->partyspy > 0) { - p = party_search(sd->partyspy); - } else { - if (sd->status.party_id > 0) - p = party_search(sd->status.party_id); - } - } - if (p) { - for(i=0;i<MAX_PARTY;i++){ - if ((sd = p->member[i].sd) != NULL) { - if (sd->bl.id == bl->id && (type == PARTY_WOS || - type == PARTY_SAMEMAP_WOS || type == PARTY_AREA_WOS)) - continue; - if (type != PARTY && type != PARTY_WOS && bl->m != sd->bl.m) // ソス}ソスbソスvソス`ソスFソスbソスN - continue; - if ((type == PARTY_AREA || type == PARTY_AREA_WOS) && - (sd->bl.x < x0 || sd->bl.y < y0 || - sd->bl.x > x1 || sd->bl.y > y1)) - continue; - if (packet_len_table[RBUFW(buf,0)]) { // packet must exist - memcpy(WFIFOP(sd->fd,0), buf, len); - WFIFOSET(sd->fd,len); - } - } - } - for (i = 0; i < fd_max; i++){ - if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth) { - if (sd->partyspy == p->party_id) { - if (packet_len_table[RBUFW(buf,0)]) { // packet must exist - memcpy(WFIFOP(sd->fd,0), buf, len); - WFIFOSET(sd->fd,len); - } - } - } - } - } - break; - case SELF: - sd = (struct map_session_data *)bl; - if (packet_len_table[RBUFW(buf,0)]) { // packet must exist - memcpy(WFIFOP(sd->fd,0), buf, len); - WFIFOSET(sd->fd,len); - } - break; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data) != NULL + && sd->state.auth) + { + if (sd->partyspy == p->party_id) + { + if (packet_len_table[RBUFW (buf, 0)]) + { // packet must exist + memcpy (WFIFOP (sd->fd, 0), buf, len); + WFIFOSET (sd->fd, len); + } + } + } + } + } + break; + case SELF: + sd = (struct map_session_data *) bl; + if (packet_len_table[RBUFW (buf, 0)]) + { // packet must exist + memcpy (WFIFOP (sd->fd, 0), buf, len); + WFIFOSET (sd->fd, len); + } + break; /* New definitions for guilds [Valaris] */ - case GUILD_AREA: - case GUILD_AREA_WOS: - x0 = bl->x - AREA_SIZE; - y0 = bl->y - AREA_SIZE; - x1 = bl->x + AREA_SIZE; - y1 = bl->y + AREA_SIZE; - case GUILD: - case GUILD_WOS: - if (bl && bl->type == BL_PC) { // guildspy [Syrus22] - sd = (struct map_session_data *)bl; - if (sd->guildspy > 0) { - g = guild_search(sd->guildspy); - } else { - if (sd->status.guild_id > 0) - g = guild_search(sd->status.guild_id); - } - } - if (g) { - for(i = 0; i < g->max_member; i++) { - if ((sd = g->member[i].sd) != NULL) { - if (type == GUILD_WOS && sd->bl.id == bl->id) - continue; - if (packet_len_table[RBUFW(buf,0)]) { // packet must exist - memcpy(WFIFOP(sd->fd,0), buf, len); - WFIFOSET(sd->fd,len); - } - } - } - for (i = 0; i < fd_max; i++){ - if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth) { - if (sd->guildspy == g->guild_id) { - if (packet_len_table[RBUFW(buf,0)]) { // packet must exist - memcpy(WFIFOP(sd->fd,0), buf, len); - WFIFOSET(sd->fd,len); - } - } - } - } - } - break; - case GUILD_SAMEMAP: - case GUILD_SAMEMAP_WOS: - if (bl->type == BL_PC) { - sd = (struct map_session_data *)bl; - if (sd->status.guild_id > 0) - g = guild_search(sd->status.guild_id); - } - if (g) { - for(i = 0; i < g->max_member; i++) { - if ((sd = g->member[i].sd) != NULL) { - if (sd->bl.id == bl->id && (type == GUILD_WOS || - type == GUILD_SAMEMAP_WOS || type == GUILD_AREA_WOS)) - continue; - if (type != GUILD && type != GUILD_WOS && bl->m != sd->bl.m) // ソス}ソスbソスvソス`ソスFソスbソスN - continue; - if ((type == GUILD_AREA || type == GUILD_AREA_WOS) && - (sd->bl.x < x0 || sd->bl.y < y0 || - sd->bl.x > x1 || sd->bl.y > y1)) - continue; - if (packet_len_table[RBUFW(buf,0)]) { // packet must exist - memcpy(WFIFOP(sd->fd,0), buf, len); - WFIFOSET(sd->fd,len); - } - } - } - } - break; + case GUILD_AREA: + case GUILD_AREA_WOS: + x0 = bl->x - AREA_SIZE; + y0 = bl->y - AREA_SIZE; + x1 = bl->x + AREA_SIZE; + y1 = bl->y + AREA_SIZE; + case GUILD: + case GUILD_WOS: + if (bl && bl->type == BL_PC) + { // guildspy [Syrus22] + sd = (struct map_session_data *) bl; + if (sd->guildspy > 0) + { + g = guild_search (sd->guildspy); + } + else + { + if (sd->status.guild_id > 0) + g = guild_search (sd->status.guild_id); + } + } + if (g) + { + for (i = 0; i < g->max_member; i++) + { + if ((sd = g->member[i].sd) != NULL) + { + if (type == GUILD_WOS && sd->bl.id == bl->id) + continue; + if (packet_len_table[RBUFW (buf, 0)]) + { // packet must exist + memcpy (WFIFOP (sd->fd, 0), buf, len); + WFIFOSET (sd->fd, len); + } + } + } + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data) != NULL + && sd->state.auth) + { + if (sd->guildspy == g->guild_id) + { + if (packet_len_table[RBUFW (buf, 0)]) + { // packet must exist + memcpy (WFIFOP (sd->fd, 0), buf, len); + WFIFOSET (sd->fd, len); + } + } + } + } + } + break; + case GUILD_SAMEMAP: + case GUILD_SAMEMAP_WOS: + if (bl->type == BL_PC) + { + sd = (struct map_session_data *) bl; + if (sd->status.guild_id > 0) + g = guild_search (sd->status.guild_id); + } + if (g) + { + for (i = 0; i < g->max_member; i++) + { + if ((sd = g->member[i].sd) != NULL) + { + if (sd->bl.id == bl->id && (type == GUILD_WOS || + type == GUILD_SAMEMAP_WOS + || type == + GUILD_AREA_WOS)) + continue; + if (type != GUILD && type != GUILD_WOS && bl->m != sd->bl.m) // ソス}ソスbソスvソス`ソスFソスbソスN + continue; + if ((type == GUILD_AREA || type == GUILD_AREA_WOS) && + (sd->bl.x < x0 || sd->bl.y < y0 || + sd->bl.x > x1 || sd->bl.y > y1)) + continue; + if (packet_len_table[RBUFW (buf, 0)]) + { // packet must exist + memcpy (WFIFOP (sd->fd, 0), buf, len); + WFIFOSET (sd->fd, len); + } + } + } + } + break; - default: - if (battle_config.error_log) - printf("clif_send ソスワゑソスソスソスソスソストなゑソスソスソスソス[\n"); - return -1; - } + default: + if (battle_config.error_log) + printf ("clif_send ソスワゑソスソスソスソスソストなゑソスソスソスソス[\n"); + return -1; + } - return 0; + return 0; } // @@ -511,190 +588,209 @@ int clif_send(unsigned char *buf, int len, struct block_list *bl, int type) { * *------------------------------------------ */ -int clif_authok(struct map_session_data *sd) { - int fd; +int clif_authok (struct map_session_data *sd) +{ + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if (!sd) - return 0; + if (!sd) + return 0; - if (!sd->fd) - return 0; + if (!sd->fd) + return 0; - fd = sd->fd; + fd = sd->fd; - WFIFOW(fd, 0) = 0x73; - WFIFOL(fd, 2) = gettick(); - WFIFOPOS(fd, 6, sd->bl.x, sd->bl.y); - WFIFOB(fd, 9) = 5; - WFIFOB(fd,10) = 5; - WFIFOSET(fd,packet_len_table[0x73]); + WFIFOW (fd, 0) = 0x73; + WFIFOL (fd, 2) = gettick (); + WFIFOPOS (fd, 6, sd->bl.x, sd->bl.y); + WFIFOB (fd, 9) = 5; + WFIFOB (fd, 10) = 5; + WFIFOSET (fd, packet_len_table[0x73]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_authfail_fd(int fd, int type) { - if (!fd || !session[fd]) - return 0; +int clif_authfail_fd (int fd, int type) +{ + if (!fd || !session[fd]) + return 0; - WFIFOW(fd,0) = 0x81; - WFIFOL(fd,2) = type; - WFIFOSET(fd,packet_len_table[0x81]); + WFIFOW (fd, 0) = 0x81; + WFIFOL (fd, 2) = type; + WFIFOSET (fd, packet_len_table[0x81]); - clif_setwaitclose(fd); + clif_setwaitclose (fd); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_charselectok(int id) { - struct map_session_data *sd; - int fd; +int clif_charselectok (int id) +{ + struct map_session_data *sd; + int fd; - if ((sd = map_id2sd(id)) == NULL) - return 1; + if ((sd = map_id2sd (id)) == NULL) + return 1; - if (!sd->fd) - return 1; + if (!sd->fd) + return 1; - fd = sd->fd; - WFIFOW(fd,0) = 0xb3; - WFIFOB(fd,2) = 1; - WFIFOSET(fd,packet_len_table[0xb3]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xb3; + WFIFOB (fd, 2) = 1; + WFIFOSET (fd, packet_len_table[0xb3]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -static int clif_set009e(struct flooritem_data *fitem, char *buf) { - int view; +static int clif_set009e (struct flooritem_data *fitem, char *buf) +{ + int view; - nullpo_retr(0, fitem); + nullpo_retr (0, fitem); - //009e <ID>.l <name ID>.w <identify flag>.B <X>.w <Y>.w <subX>.B <subY>.B <amount>.w - WBUFW(buf, 0) = 0x9e; - WBUFL(buf, 2) = fitem->bl.id; - if ((view = itemdb_viewid(fitem->item_data.nameid)) > 0) - WBUFW(buf, 6) = view; - else - WBUFW(buf, 6) = fitem->item_data.nameid; - WBUFB(buf, 8) = fitem->item_data.identify; - WBUFW(buf, 9) = fitem->bl.x; - WBUFW(buf,11) = fitem->bl.y; - WBUFB(buf,13) = fitem->subx; - WBUFB(buf,14) = fitem->suby; - WBUFW(buf,15) = fitem->item_data.amount; + //009e <ID>.l <name ID>.w <identify flag>.B <X>.w <Y>.w <subX>.B <subY>.B <amount>.w + WBUFW (buf, 0) = 0x9e; + WBUFL (buf, 2) = fitem->bl.id; + if ((view = itemdb_viewid (fitem->item_data.nameid)) > 0) + WBUFW (buf, 6) = view; + else + WBUFW (buf, 6) = fitem->item_data.nameid; + WBUFB (buf, 8) = fitem->item_data.identify; + WBUFW (buf, 9) = fitem->bl.x; + WBUFW (buf, 11) = fitem->bl.y; + WBUFB (buf, 13) = fitem->subx; + WBUFB (buf, 14) = fitem->suby; + WBUFW (buf, 15) = fitem->item_data.amount; - return packet_len_table[0x9e]; + return packet_len_table[0x9e]; } /*========================================== * *------------------------------------------ */ -int clif_dropflooritem(struct flooritem_data *fitem) { - char buf[64]; +int clif_dropflooritem (struct flooritem_data *fitem) +{ + char buf[64]; - nullpo_retr(0, fitem); + nullpo_retr (0, fitem); - if (fitem->item_data.nameid <= 0) - return 0; - clif_set009e(fitem, buf); - clif_send(buf, packet_len_table[0x9e], &fitem->bl, AREA); + if (fitem->item_data.nameid <= 0) + return 0; + clif_set009e (fitem, buf); + clif_send (buf, packet_len_table[0x9e], &fitem->bl, AREA); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_clearflooritem(struct flooritem_data *fitem, int fd) { - unsigned char buf[16]; +int clif_clearflooritem (struct flooritem_data *fitem, int fd) +{ + unsigned char buf[16]; - nullpo_retr(0, fitem); + nullpo_retr (0, fitem); - WBUFW(buf,0) = 0xa1; - WBUFL(buf,2) = fitem->bl.id; + WBUFW (buf, 0) = 0xa1; + WBUFL (buf, 2) = fitem->bl.id; - if (fd == 0) { - clif_send(buf, packet_len_table[0xa1], &fitem->bl, AREA); - } else { - memcpy(WFIFOP(fd,0), buf, 6); - WFIFOSET(fd,packet_len_table[0xa1]); - } + if (fd == 0) + { + clif_send (buf, packet_len_table[0xa1], &fitem->bl, AREA); + } + else + { + memcpy (WFIFOP (fd, 0), buf, 6); + WFIFOSET (fd, packet_len_table[0xa1]); + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_clearchar(struct block_list *bl, int type) { - unsigned char buf[16]; +int clif_clearchar (struct block_list *bl, int type) +{ + unsigned char buf[16]; - nullpo_retr(0, bl); + nullpo_retr (0, bl); - WBUFW(buf,0) = 0x80; - WBUFL(buf,2) = bl->id; - if (type == 9) { - WBUFB(buf,6) = 0; - clif_send(buf, packet_len_table[0x80], bl, AREA); - } else { - WBUFB(buf,6) = type; - clif_send(buf, packet_len_table[0x80], bl, type == 1 ? AREA : AREA_WOS); - } + WBUFW (buf, 0) = 0x80; + WBUFL (buf, 2) = bl->id; + if (type == 9) + { + WBUFB (buf, 6) = 0; + clif_send (buf, packet_len_table[0x80], bl, AREA); + } + else + { + WBUFB (buf, 6) = type; + clif_send (buf, packet_len_table[0x80], bl, + type == 1 ? AREA : AREA_WOS); + } - return 0; + return 0; } -static int clif_clearchar_delay_sub(int tid, unsigned int tick, int id, int data) { - struct block_list *bl = (struct block_list *)id; +static int clif_clearchar_delay_sub (int tid, unsigned int tick, int id, + int data) +{ + struct block_list *bl = (struct block_list *) id; - clif_clearchar(bl,data); - map_freeblock(bl); + clif_clearchar (bl, data); + map_freeblock (bl); - return 0; + return 0; } -int clif_clearchar_delay(unsigned int tick, struct block_list *bl, int type) { - struct block_list *tmpbl = calloc(sizeof(struct block_list), 1); - if (tmpbl == NULL) { - printf("clif_clearchar_delay: out of memory !\n"); - exit(1); - } - memcpy(tmpbl, bl, sizeof(struct block_list)); - add_timer(tick, clif_clearchar_delay_sub, (int)tmpbl, type); +int clif_clearchar_delay (unsigned int tick, struct block_list *bl, int type) +{ + struct block_list *tmpbl = calloc (sizeof (struct block_list), 1); + if (tmpbl == NULL) + { + printf ("clif_clearchar_delay: out of memory !\n"); + exit (1); + } + memcpy (tmpbl, bl, sizeof (struct block_list)); + add_timer (tick, clif_clearchar_delay_sub, (int) tmpbl, type); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_clearchar_id(int id, int type, int fd) { - unsigned char buf[16]; +int clif_clearchar_id (int id, int type, int fd) +{ + unsigned char buf[16]; - WBUFW(buf,0) = 0x80; - WBUFL(buf,2) = id; - WBUFB(buf,6) = type; - memcpy(WFIFOP(fd,0), buf, 7); - WFIFOSET(fd, packet_len_table[0x80]); + WBUFW (buf, 0) = 0x80; + WBUFL (buf, 2) = id; + WBUFB (buf, 6) = type; + memcpy (WFIFOP (fd, 0), buf, 7); + WFIFOSET (fd, packet_len_table[0x80]); - return 0; + return 0; } /* @@ -712,1379 +808,1533 @@ static int current_weapon(struct map_session_data *sd) * *------------------------------------------ */ -static int clif_set0078(struct map_session_data *sd, unsigned char *buf) { - int level=0; - - nullpo_retr(0, sd); - - if (sd->disguise > 23 && sd->disguise < 4001) { // mob disguises [Valaris] - WBUFW(buf,0) = 0x78; - WBUFL(buf,2) = sd->bl.id; - WBUFW(buf,6) = battle_get_speed(&sd->bl); - WBUFW(buf,8) = sd->opt1; - WBUFW(buf,10) = sd->opt2; - WBUFW(buf,12) = sd->status.option; - WBUFW(buf,14) = sd->disguise; - WBUFW(buf,42) = 0; - WBUFB(buf,44) = 0; - WBUFPOS(buf, 46, sd->bl.x, sd->bl.y); - WBUFB(buf,48) |= sd->dir & 0x0f; - WBUFB(buf,49) = 5; - WBUFB(buf,50) = 5; - WBUFB(buf,51) = 0; - WBUFW(buf,52) = ((level = battle_get_lv(&sd->bl)) > battle_config.max_lv) ? battle_config.max_lv : level; - - return packet_len_table[0x78]; - } - - WBUFW(buf,0) = 0x1d8; - WBUFL(buf,2) = sd->bl.id; - WBUFW(buf,6) = sd->speed; - WBUFW(buf,8) = sd->opt1; - WBUFW(buf,10) = sd->opt2; - WBUFW(buf,12) = sd->status.option; - WBUFW(buf,14) = sd->view_class; - WBUFW(buf,16) = sd->status.hair; - if (sd->attack_spell_override) - WBUFB(buf, 18) = sd->attack_spell_look_override; - else { - if (sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]] && sd->view_class != 22) { - if (sd->inventory_data[sd->equip_index[9]]->view_id > 0) - WBUFW(buf,18) = sd->inventory_data[sd->equip_index[9]]->view_id; - else - WBUFW(buf,18) = sd->status.inventory[sd->equip_index[9]].nameid; - } else - WBUFW(buf,18) = 0; +static int clif_set0078 (struct map_session_data *sd, unsigned char *buf) +{ + int level = 0; + + nullpo_retr (0, sd); + + if (sd->disguise > 23 && sd->disguise < 4001) + { // mob disguises [Valaris] + WBUFW (buf, 0) = 0x78; + WBUFL (buf, 2) = sd->bl.id; + WBUFW (buf, 6) = battle_get_speed (&sd->bl); + WBUFW (buf, 8) = sd->opt1; + WBUFW (buf, 10) = sd->opt2; + WBUFW (buf, 12) = sd->status.option; + WBUFW (buf, 14) = sd->disguise; + WBUFW (buf, 42) = 0; + WBUFB (buf, 44) = 0; + WBUFPOS (buf, 46, sd->bl.x, sd->bl.y); + WBUFB (buf, 48) |= sd->dir & 0x0f; + WBUFB (buf, 49) = 5; + WBUFB (buf, 50) = 5; + WBUFB (buf, 51) = 0; + WBUFW (buf, 52) = + ((level = + battle_get_lv (&sd->bl)) > + battle_config.max_lv) ? battle_config.max_lv : level; + + return packet_len_table[0x78]; + } + + WBUFW (buf, 0) = 0x1d8; + WBUFL (buf, 2) = sd->bl.id; + WBUFW (buf, 6) = sd->speed; + WBUFW (buf, 8) = sd->opt1; + WBUFW (buf, 10) = sd->opt2; + WBUFW (buf, 12) = sd->status.option; + WBUFW (buf, 14) = sd->view_class; + WBUFW (buf, 16) = sd->status.hair; + if (sd->attack_spell_override) + WBUFB (buf, 18) = sd->attack_spell_look_override; + else + { + if (sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]] + && sd->view_class != 22) + { + if (sd->inventory_data[sd->equip_index[9]]->view_id > 0) + WBUFW (buf, 18) = + sd->inventory_data[sd->equip_index[9]]->view_id; + else + WBUFW (buf, 18) = + sd->status.inventory[sd->equip_index[9]].nameid; } - if (sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9] && sd->inventory_data[sd->equip_index[8]] && sd->view_class != 22) { - if (sd->inventory_data[sd->equip_index[8]]->view_id > 0) - WBUFW(buf,20) = sd->inventory_data[sd->equip_index[8]]->view_id; - else - WBUFW(buf,20) = sd->status.inventory[sd->equip_index[8]].nameid; - } else - WBUFW(buf,20) = 0; - WBUFW(buf,22)=sd->status.head_bottom; - WBUFW(buf,24)=sd->status.head_top; - WBUFW(buf,26)=sd->status.head_mid; - WBUFW(buf,28)=sd->status.hair_color; - WBUFW(buf,30)=sd->status.clothes_color; - WBUFW(buf,32)=sd->head_dir; - WBUFL(buf,34)=sd->status.guild_id; - WBUFW(buf,38)=sd->guild_emblem_id; - WBUFW(buf,40)=sd->status.manner; - WBUFW(buf,42)=sd->opt3; - WBUFB(buf,44)=sd->status.karma; - WBUFB(buf,45)=sd->sex; - WBUFPOS(buf,46,sd->bl.x,sd->bl.y); - WBUFB(buf,48)|=sd->dir&0x0f; - WBUFW(buf,49)=(pc_isGM(sd) == 60 || pc_isGM(sd) == 99) ? 0x80 : 0; - WBUFB(buf,51)=sd->state.dead_sit; - WBUFW(buf,52)=((level = battle_get_lv(&sd->bl)) > battle_config.max_lv) ? battle_config.max_lv : level; - - return packet_len_table[0x1d8]; + else + WBUFW (buf, 18) = 0; + } + if (sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9] + && sd->inventory_data[sd->equip_index[8]] && sd->view_class != 22) + { + if (sd->inventory_data[sd->equip_index[8]]->view_id > 0) + WBUFW (buf, 20) = sd->inventory_data[sd->equip_index[8]]->view_id; + else + WBUFW (buf, 20) = sd->status.inventory[sd->equip_index[8]].nameid; + } + else + WBUFW (buf, 20) = 0; + WBUFW (buf, 22) = sd->status.head_bottom; + WBUFW (buf, 24) = sd->status.head_top; + WBUFW (buf, 26) = sd->status.head_mid; + WBUFW (buf, 28) = sd->status.hair_color; + WBUFW (buf, 30) = sd->status.clothes_color; + WBUFW (buf, 32) = sd->head_dir; + WBUFL (buf, 34) = sd->status.guild_id; + WBUFW (buf, 38) = sd->guild_emblem_id; + WBUFW (buf, 40) = sd->status.manner; + WBUFW (buf, 42) = sd->opt3; + WBUFB (buf, 44) = sd->status.karma; + WBUFB (buf, 45) = sd->sex; + WBUFPOS (buf, 46, sd->bl.x, sd->bl.y); + WBUFB (buf, 48) |= sd->dir & 0x0f; + WBUFW (buf, 49) = (pc_isGM (sd) == 60 || pc_isGM (sd) == 99) ? 0x80 : 0; + WBUFB (buf, 51) = sd->state.dead_sit; + WBUFW (buf, 52) = + ((level = + battle_get_lv (&sd->bl)) > + battle_config.max_lv) ? battle_config.max_lv : level; + + return packet_len_table[0x1d8]; } /*========================================== * *------------------------------------------ */ -static int clif_set007b(struct map_session_data *sd,unsigned char *buf) { - int level=0; - nullpo_retr(0, sd); - - if (sd->disguise > 23 && sd->disguise < 4001) { // mob disguises [Valaris] - WBUFW(buf,0)=0x7b; - WBUFL(buf,2)=sd->bl.id; - WBUFW(buf,6)=battle_get_speed(&sd->bl); - WBUFW(buf,8)=sd->opt1; - WBUFW(buf,10)=sd->opt2; - WBUFW(buf,12)=sd->status.option; - WBUFW(buf,14)=sd->disguise; - WBUFL(buf,22)=gettick(); - WBUFW(buf,46)=0; - WBUFB(buf,48)=0; - WBUFPOS2(buf,50,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y); - WBUFB(buf,55)=0; - WBUFB(buf,56)=5; - WBUFB(buf,57)=5; - WBUFW(buf,58)=((level = battle_get_lv(&sd->bl))>battle_config.max_lv)? battle_config.max_lv:level; - - return packet_len_table[0x7b]; - } - - WBUFW(buf,0)=0x1da; - WBUFL(buf,2)=sd->bl.id; - WBUFW(buf,6)=sd->speed; - WBUFW(buf,8)=sd->opt1; - WBUFW(buf,10)=sd->opt2; - WBUFW(buf,12)=sd->status.option; - WBUFW(buf,14)=sd->view_class; - WBUFW(buf,16)=sd->status.hair; - if(sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]] && sd->view_class != 22) { - if(sd->inventory_data[sd->equip_index[9]]->view_id > 0) - WBUFW(buf,18)=sd->inventory_data[sd->equip_index[9]]->view_id; - else - WBUFW(buf,18)=sd->status.inventory[sd->equip_index[9]].nameid; - } - else - WBUFW(buf,18)=0; - if(sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9] && sd->inventory_data[sd->equip_index[8]] && sd->view_class != 22) { - if(sd->inventory_data[sd->equip_index[8]]->view_id > 0) - WBUFW(buf,20)=sd->inventory_data[sd->equip_index[8]]->view_id; - else - WBUFW(buf,20)=sd->status.inventory[sd->equip_index[8]].nameid; - } - else - WBUFW(buf,20)=0; - WBUFW(buf,22)=sd->status.head_bottom; - WBUFL(buf,24)=gettick(); - WBUFW(buf,28)=sd->status.head_top; - WBUFW(buf,30)=sd->status.head_mid; - WBUFW(buf,32)=sd->status.hair_color; - WBUFW(buf,34)=sd->status.clothes_color; - WBUFW(buf,36)=sd->head_dir; - WBUFL(buf,38)=sd->status.guild_id; - WBUFW(buf,42)=sd->guild_emblem_id; - WBUFW(buf,44)=sd->status.manner; - WBUFW(buf,46)=sd->opt3; - WBUFB(buf,48)=sd->status.karma; - WBUFB(buf,49)=sd->sex; - WBUFPOS2(buf,50,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y); - WBUFW(buf,55)=pc_isGM(sd) == 60 ? 0x80 : 0; - WBUFB(buf,57)=5; - WBUFW(buf,58)=(sd->status.base_level>battle_config.max_lv)?battle_config.max_lv:sd->status.base_level; - - return packet_len_table[0x1da]; +static int clif_set007b (struct map_session_data *sd, unsigned char *buf) +{ + int level = 0; + nullpo_retr (0, sd); + + if (sd->disguise > 23 && sd->disguise < 4001) + { // mob disguises [Valaris] + WBUFW (buf, 0) = 0x7b; + WBUFL (buf, 2) = sd->bl.id; + WBUFW (buf, 6) = battle_get_speed (&sd->bl); + WBUFW (buf, 8) = sd->opt1; + WBUFW (buf, 10) = sd->opt2; + WBUFW (buf, 12) = sd->status.option; + WBUFW (buf, 14) = sd->disguise; + WBUFL (buf, 22) = gettick (); + WBUFW (buf, 46) = 0; + WBUFB (buf, 48) = 0; + WBUFPOS2 (buf, 50, sd->bl.x, sd->bl.y, sd->to_x, sd->to_y); + WBUFB (buf, 55) = 0; + WBUFB (buf, 56) = 5; + WBUFB (buf, 57) = 5; + WBUFW (buf, 58) = + ((level = + battle_get_lv (&sd->bl)) > + battle_config.max_lv) ? battle_config.max_lv : level; + + return packet_len_table[0x7b]; + } + + WBUFW (buf, 0) = 0x1da; + WBUFL (buf, 2) = sd->bl.id; + WBUFW (buf, 6) = sd->speed; + WBUFW (buf, 8) = sd->opt1; + WBUFW (buf, 10) = sd->opt2; + WBUFW (buf, 12) = sd->status.option; + WBUFW (buf, 14) = sd->view_class; + WBUFW (buf, 16) = sd->status.hair; + if (sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]] + && sd->view_class != 22) + { + if (sd->inventory_data[sd->equip_index[9]]->view_id > 0) + WBUFW (buf, 18) = sd->inventory_data[sd->equip_index[9]]->view_id; + else + WBUFW (buf, 18) = sd->status.inventory[sd->equip_index[9]].nameid; + } + else + WBUFW (buf, 18) = 0; + if (sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9] + && sd->inventory_data[sd->equip_index[8]] && sd->view_class != 22) + { + if (sd->inventory_data[sd->equip_index[8]]->view_id > 0) + WBUFW (buf, 20) = sd->inventory_data[sd->equip_index[8]]->view_id; + else + WBUFW (buf, 20) = sd->status.inventory[sd->equip_index[8]].nameid; + } + else + WBUFW (buf, 20) = 0; + WBUFW (buf, 22) = sd->status.head_bottom; + WBUFL (buf, 24) = gettick (); + WBUFW (buf, 28) = sd->status.head_top; + WBUFW (buf, 30) = sd->status.head_mid; + WBUFW (buf, 32) = sd->status.hair_color; + WBUFW (buf, 34) = sd->status.clothes_color; + WBUFW (buf, 36) = sd->head_dir; + WBUFL (buf, 38) = sd->status.guild_id; + WBUFW (buf, 42) = sd->guild_emblem_id; + WBUFW (buf, 44) = sd->status.manner; + WBUFW (buf, 46) = sd->opt3; + WBUFB (buf, 48) = sd->status.karma; + WBUFB (buf, 49) = sd->sex; + WBUFPOS2 (buf, 50, sd->bl.x, sd->bl.y, sd->to_x, sd->to_y); + WBUFW (buf, 55) = pc_isGM (sd) == 60 ? 0x80 : 0; + WBUFB (buf, 57) = 5; + WBUFW (buf, 58) = + (sd->status.base_level > + battle_config.max_lv) ? battle_config.max_lv : sd->status.base_level; + + return packet_len_table[0x1da]; } /*========================================== * ソスNソスソスソスXソス`ソスFソスソスソスW typeソスソスMobソスフ場合ソスソス1ソスナ托ソスソスソス0ソスH *------------------------------------------ */ -int clif_class_change(struct block_list *bl,int class,int type) +int clif_class_change (struct block_list *bl, int class, int type) { - char buf[16]; + char buf[16]; - nullpo_retr(0, bl); + nullpo_retr (0, bl); - if(class >= MAX_PC_CLASS) { - WBUFW(buf,0)=0x1b0; - WBUFL(buf,2)=bl->id; - WBUFB(buf,6)=type; - WBUFL(buf,7)=class; + if (class >= MAX_PC_CLASS) + { + WBUFW (buf, 0) = 0x1b0; + WBUFL (buf, 2) = bl->id; + WBUFB (buf, 6) = type; + WBUFL (buf, 7) = class; - clif_send(buf,packet_len_table[0x1b0],bl,AREA); - } - return 0; + clif_send (buf, packet_len_table[0x1b0], bl, AREA); + } + return 0; } + /*========================================== * *------------------------------------------ */ -int clif_mob_class_change(struct mob_data *md, int class) { - char buf[16]; - int view = mob_get_viewclass(class); +int clif_mob_class_change (struct mob_data *md, int class) +{ + char buf[16]; + int view = mob_get_viewclass (class); - nullpo_retr(0, md); + nullpo_retr (0, md); - if(view >= MAX_PC_CLASS) { - WBUFW(buf,0)=0x1b0; - WBUFL(buf,2)=md->bl.id; - WBUFB(buf,6)=1; - WBUFL(buf,7)=view; + if (view >= MAX_PC_CLASS) + { + WBUFW (buf, 0) = 0x1b0; + WBUFL (buf, 2) = md->bl.id; + WBUFB (buf, 6) = 1; + WBUFL (buf, 7) = view; - clif_send(buf,packet_len_table[0x1b0],&md->bl,AREA); - } - return 0; + clif_send (buf, packet_len_table[0x1b0], &md->bl, AREA); + } + return 0; } + // mob equipment [Valaris] -int clif_mob_equip(struct mob_data *md, int nameid) { - unsigned char buf[16]; +int clif_mob_equip (struct mob_data *md, int nameid) +{ + unsigned char buf[16]; - nullpo_retr(0, md); + nullpo_retr (0, md); - memset(buf,0,packet_len_table[0x1a4]); + memset (buf, 0, packet_len_table[0x1a4]); - WBUFW(buf,0)=0x1a4; - WBUFB(buf,2)=3; - WBUFL(buf,3)=md->bl.id; - WBUFL(buf,7)=nameid; + WBUFW (buf, 0) = 0x1a4; + WBUFB (buf, 2) = 3; + WBUFL (buf, 3) = md->bl.id; + WBUFL (buf, 7) = nameid; - clif_send(buf,packet_len_table[0x1a4],&md->bl,AREA); + clif_send (buf, packet_len_table[0x1a4], &md->bl, AREA); - return 0; + return 0; } /*========================================== * MOBソス\ソスソス1 *------------------------------------------ */ -static int clif_mob0078(struct mob_data *md, unsigned char *buf) -{ - int level; - - memset(buf,0,packet_len_table[0x78]); - - nullpo_retr(0, md); - - WBUFW(buf,0)=0x78; - WBUFL(buf,2)=md->bl.id; - WBUFW(buf,6)=battle_get_speed(&md->bl); - WBUFW(buf,8)=md->opt1; - WBUFW(buf,10)=md->opt2; - WBUFW(buf,12)=md->option; - WBUFW(buf,14)=mob_get_viewclass(md->class); - if((mob_get_viewclass(md->class) <= 23) || (mob_get_viewclass(md->class) == 812) || (mob_get_viewclass(md->class) >= 4001)) { - WBUFW(buf,12)|=mob_db[md->class].option; - WBUFW(buf,16)=mob_get_hair(md->class); - WBUFW(buf,18)=mob_get_weapon(md->class); - WBUFW(buf,20)=mob_get_head_buttom(md->class); - WBUFW(buf,22)=mob_get_shield(md->class); - WBUFW(buf,24)=mob_get_head_top(md->class); - WBUFW(buf,26)=mob_get_head_mid(md->class); - WBUFW(buf,28)=mob_get_hair_color(md->class); - WBUFW(buf,30)=mob_get_clothes_color(md->class); //Add for player monster dye - Valaris - WBUFB(buf,45)=mob_get_sex(md->class); - } - - if (md->class >= 1285 && md->class <= 1287) { // Added guardian emblems [Valaris] - struct guild *g; - struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name); - if (gc && gc->guild_id > 0) { - g=guild_search(gc->guild_id); - if (g) { - WBUFL(buf,26)=gc->guild_id; - WBUFL(buf,22)=g->emblem_id; - } - } - } // End addition +static int clif_mob0078 (struct mob_data *md, unsigned char *buf) +{ + int level; + + memset (buf, 0, packet_len_table[0x78]); + + nullpo_retr (0, md); + + WBUFW (buf, 0) = 0x78; + WBUFL (buf, 2) = md->bl.id; + WBUFW (buf, 6) = battle_get_speed (&md->bl); + WBUFW (buf, 8) = md->opt1; + WBUFW (buf, 10) = md->opt2; + WBUFW (buf, 12) = md->option; + WBUFW (buf, 14) = mob_get_viewclass (md->class); + if ((mob_get_viewclass (md->class) <= 23) + || (mob_get_viewclass (md->class) == 812) + || (mob_get_viewclass (md->class) >= 4001)) + { + WBUFW (buf, 12) |= mob_db[md->class].option; + WBUFW (buf, 16) = mob_get_hair (md->class); + WBUFW (buf, 18) = mob_get_weapon (md->class); + WBUFW (buf, 20) = mob_get_head_buttom (md->class); + WBUFW (buf, 22) = mob_get_shield (md->class); + WBUFW (buf, 24) = mob_get_head_top (md->class); + WBUFW (buf, 26) = mob_get_head_mid (md->class); + WBUFW (buf, 28) = mob_get_hair_color (md->class); + WBUFW (buf, 30) = mob_get_clothes_color (md->class); //Add for player monster dye - Valaris + WBUFB (buf, 45) = mob_get_sex (md->class); + } + + if (md->class >= 1285 && md->class <= 1287) + { // Added guardian emblems [Valaris] + struct guild *g; + struct guild_castle *gc = guild_mapname2gc (map[md->bl.m].name); + if (gc && gc->guild_id > 0) + { + g = guild_search (gc->guild_id); + if (g) + { + WBUFL (buf, 26) = gc->guild_id; + WBUFL (buf, 22) = g->emblem_id; + } + } + } // End addition - WBUFPOS(buf,46,md->bl.x,md->bl.y); - WBUFB(buf,48)|=md->dir&0x0f; - WBUFB(buf,49)=5; - WBUFB(buf,50)=5; - WBUFW(buf,52)=((level = battle_get_lv(&md->bl))>battle_config.max_lv)? battle_config.max_lv:level; + WBUFPOS (buf, 46, md->bl.x, md->bl.y); + WBUFB (buf, 48) |= md->dir & 0x0f; + WBUFB (buf, 49) = 5; + WBUFB (buf, 50) = 5; + WBUFW (buf, 52) = + ((level = + battle_get_lv (&md->bl)) > + battle_config.max_lv) ? battle_config.max_lv : level; - return packet_len_table[0x78]; + return packet_len_table[0x78]; } /*========================================== * MOBソス\ソスソス2 *------------------------------------------ */ -static int clif_mob007b(struct mob_data *md, unsigned char *buf) { - int level; - - memset(buf,0,packet_len_table[0x7b]); - - nullpo_retr(0, md); - - WBUFW(buf,0)=0x7b; - WBUFL(buf,2)=md->bl.id; - WBUFW(buf,6)=battle_get_speed(&md->bl); - WBUFW(buf,8)=md->opt1; - WBUFW(buf,10)=md->opt2; - WBUFW(buf,12)=md->option; - WBUFW(buf,14)=mob_get_viewclass(md->class); - if ((mob_get_viewclass(md->class) < 24) || (mob_get_viewclass(md->class) > 4000)) { - WBUFW(buf,12)|=mob_db[md->class].option; - WBUFW(buf,16)=mob_get_hair(md->class); - WBUFW(buf,18)=mob_get_weapon(md->class); - WBUFW(buf,20)=mob_get_head_buttom(md->class); - WBUFL(buf,22)=gettick(); - WBUFW(buf,26)=mob_get_shield(md->class); - WBUFW(buf,28)=mob_get_head_top(md->class); - WBUFW(buf,30)=mob_get_head_mid(md->class); - WBUFW(buf,32)=mob_get_hair_color(md->class); - WBUFW(buf,34)=mob_get_clothes_color(md->class); //Add for player monster dye - Valaris - WBUFB(buf,49)=mob_get_sex(md->class); - } else - WBUFL(buf,22)=gettick(); - - if(md->class >= 1285 && md->class <= 1287) { // Added guardian emblems [Valaris] - struct guild *g; - struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name); - if(gc && gc->guild_id > 0){ - g=guild_search(gc->guild_id); - if(g) { - WBUFL(buf,28)=gc->guild_id; - WBUFL(buf,24)=g->emblem_id; - } - } - } // End addition - - WBUFPOS2(buf,50,md->bl.x,md->bl.y,md->to_x,md->to_y); - WBUFB(buf,56)=5; - WBUFB(buf,57)=5; - WBUFW(buf,58)=((level = battle_get_lv(&md->bl))>battle_config.max_lv)? battle_config.max_lv:level; - - return packet_len_table[0x7b]; +static int clif_mob007b (struct mob_data *md, unsigned char *buf) +{ + int level; + + memset (buf, 0, packet_len_table[0x7b]); + + nullpo_retr (0, md); + + WBUFW (buf, 0) = 0x7b; + WBUFL (buf, 2) = md->bl.id; + WBUFW (buf, 6) = battle_get_speed (&md->bl); + WBUFW (buf, 8) = md->opt1; + WBUFW (buf, 10) = md->opt2; + WBUFW (buf, 12) = md->option; + WBUFW (buf, 14) = mob_get_viewclass (md->class); + if ((mob_get_viewclass (md->class) < 24) + || (mob_get_viewclass (md->class) > 4000)) + { + WBUFW (buf, 12) |= mob_db[md->class].option; + WBUFW (buf, 16) = mob_get_hair (md->class); + WBUFW (buf, 18) = mob_get_weapon (md->class); + WBUFW (buf, 20) = mob_get_head_buttom (md->class); + WBUFL (buf, 22) = gettick (); + WBUFW (buf, 26) = mob_get_shield (md->class); + WBUFW (buf, 28) = mob_get_head_top (md->class); + WBUFW (buf, 30) = mob_get_head_mid (md->class); + WBUFW (buf, 32) = mob_get_hair_color (md->class); + WBUFW (buf, 34) = mob_get_clothes_color (md->class); //Add for player monster dye - Valaris + WBUFB (buf, 49) = mob_get_sex (md->class); + } + else + WBUFL (buf, 22) = gettick (); + + if (md->class >= 1285 && md->class <= 1287) + { // Added guardian emblems [Valaris] + struct guild *g; + struct guild_castle *gc = guild_mapname2gc (map[md->bl.m].name); + if (gc && gc->guild_id > 0) + { + g = guild_search (gc->guild_id); + if (g) + { + WBUFL (buf, 28) = gc->guild_id; + WBUFL (buf, 24) = g->emblem_id; + } + } + } // End addition + + WBUFPOS2 (buf, 50, md->bl.x, md->bl.y, md->to_x, md->to_y); + WBUFB (buf, 56) = 5; + WBUFB (buf, 57) = 5; + WBUFW (buf, 58) = + ((level = + battle_get_lv (&md->bl)) > + battle_config.max_lv) ? battle_config.max_lv : level; + + return packet_len_table[0x7b]; } /*========================================== * *------------------------------------------ */ -static int clif_npc0078(struct npc_data *nd, unsigned char *buf) { - struct guild *g; +static int clif_npc0078 (struct npc_data *nd, unsigned char *buf) +{ + struct guild *g; - nullpo_retr(0, nd); + nullpo_retr (0, nd); - memset(buf,0,packet_len_table[0x78]); + memset (buf, 0, packet_len_table[0x78]); - WBUFW(buf,0)=0x78; - WBUFL(buf,2)=nd->bl.id; - WBUFW(buf,6)=nd->speed; - WBUFW(buf,14)=nd->class; - if ((nd->class == 722) && (nd->u.scr.guild_id > 0) && ((g=guild_search(nd->u.scr.guild_id)) != NULL)) { - WBUFL(buf,22)=g->emblem_id; - WBUFL(buf,26)=g->guild_id; - } - WBUFPOS(buf,46,nd->bl.x,nd->bl.y); - WBUFB(buf,48)|=nd->dir&0x0f; - WBUFB(buf,49)=5; - WBUFB(buf,50)=5; + WBUFW (buf, 0) = 0x78; + WBUFL (buf, 2) = nd->bl.id; + WBUFW (buf, 6) = nd->speed; + WBUFW (buf, 14) = nd->class; + if ((nd->class == 722) && (nd->u.scr.guild_id > 0) + && ((g = guild_search (nd->u.scr.guild_id)) != NULL)) + { + WBUFL (buf, 22) = g->emblem_id; + WBUFL (buf, 26) = g->guild_id; + } + WBUFPOS (buf, 46, nd->bl.x, nd->bl.y); + WBUFB (buf, 48) |= nd->dir & 0x0f; + WBUFB (buf, 49) = 5; + WBUFB (buf, 50) = 5; - return packet_len_table[0x78]; + return packet_len_table[0x78]; } /*========================================== * *------------------------------------------ */ -static int clif_set01e1(struct map_session_data *sd, unsigned char *buf) { - nullpo_retr(0, sd); +static int clif_set01e1 (struct map_session_data *sd, unsigned char *buf) +{ + nullpo_retr (0, sd); - WBUFW(buf,0)=0x1e1; - WBUFL(buf,2)=sd->bl.id; - WBUFW(buf,6)=sd->spiritball; + WBUFW (buf, 0) = 0x1e1; + WBUFL (buf, 2) = sd->bl.id; + WBUFW (buf, 6) = sd->spiritball; - return packet_len_table[0x1e1]; + return packet_len_table[0x1e1]; } /*========================================== * *------------------------------------------ */ -static int clif_set0192(int fd, int m, int x, int y, int type) { - WFIFOW(fd,0) = 0x192; - WFIFOW(fd,2) = x; - WFIFOW(fd,4) = y; - WFIFOW(fd,6) = type; - memcpy(WFIFOP(fd,8),map[m].name,16); - WFIFOSET(fd,packet_len_table[0x192]); +static int clif_set0192 (int fd, int m, int x, int y, int type) +{ + WFIFOW (fd, 0) = 0x192; + WFIFOW (fd, 2) = x; + WFIFOW (fd, 4) = y; + WFIFOW (fd, 6) = type; + memcpy (WFIFOP (fd, 8), map[m].name, 16); + WFIFOSET (fd, packet_len_table[0x192]); - return 0; + return 0; } /* These indices are derived from equip_pos in pc.c and some guesswork */ static int equip_points[LOOK_LAST + 1] = { - -1, /* 0: base */ - -1, /* 1: hair */ - 9, /* 2: weapon */ - 4, /* 3: head botom -- leg armour */ - 6, /* 4: head top -- hat */ - 5, /* 5: head mid -- torso armour */ - -1, /* 6: hair colour */ - -1, /* 6: clothes colour */ - 8, /* 6: shield */ - 2, /* 9: shoes */ - 3, /* gloves */ - 1, /* cape */ - 7, /* misc1 */ - 0, /* misc2 */}; + -1, /* 0: base */ + -1, /* 1: hair */ + 9, /* 2: weapon */ + 4, /* 3: head botom -- leg armour */ + 6, /* 4: head top -- hat */ + 5, /* 5: head mid -- torso armour */ + -1, /* 6: hair colour */ + -1, /* 6: clothes colour */ + 8, /* 6: shield */ + 2, /* 9: shoes */ + 3, /* gloves */ + 1, /* cape */ + 7, /* misc1 */ + 0, /* misc2 */ +}; /*========================================== * *------------------------------------------ */ -int clif_spawnpc(struct map_session_data *sd) { - unsigned char buf[128]; - - nullpo_retr(0, sd); +int clif_spawnpc (struct map_session_data *sd) +{ + unsigned char buf[128]; - if (sd->disguise > 23 && sd->disguise < 4001) { // mob disguises [Valaris] - clif_clearchar(&sd->bl, 9); + nullpo_retr (0, sd); - memset(buf, 0, packet_len_table[0x119]); + if (sd->disguise > 23 && sd->disguise < 4001) + { // mob disguises [Valaris] + clif_clearchar (&sd->bl, 9); - WBUFW(buf, 0) = 0x119; - WBUFL(buf, 2) = sd->bl.id; - WBUFW(buf, 6) = 0; - WBUFW(buf, 8) = 0; - WBUFW(buf,10) = 0x40; - WBUFB(buf,12) = 0; + memset (buf, 0, packet_len_table[0x119]); - clif_send(buf, packet_len_table[0x119], &sd->bl, SELF); + WBUFW (buf, 0) = 0x119; + WBUFL (buf, 2) = sd->bl.id; + WBUFW (buf, 6) = 0; + WBUFW (buf, 8) = 0; + WBUFW (buf, 10) = 0x40; + WBUFB (buf, 12) = 0; - memset(buf, 0, packet_len_table[0x7c]); + clif_send (buf, packet_len_table[0x119], &sd->bl, SELF); - WBUFW(buf, 0) = 0x7c; - WBUFL(buf, 2) = sd->bl.id; - WBUFW(buf, 6) = sd->speed; - WBUFW(buf, 8) = sd->opt1; - WBUFW(buf,10) = sd->opt2; - WBUFW(buf,12) = sd->status.option; - WBUFW(buf,20) = sd->disguise; - WBUFPOS(buf, 36, sd->bl.x, sd->bl.y); - clif_send(buf, packet_len_table[0x7c], &sd->bl, AREA); - } + memset (buf, 0, packet_len_table[0x7c]); - clif_set0078(sd, buf); + WBUFW (buf, 0) = 0x7c; + WBUFL (buf, 2) = sd->bl.id; + WBUFW (buf, 6) = sd->speed; + WBUFW (buf, 8) = sd->opt1; + WBUFW (buf, 10) = sd->opt2; + WBUFW (buf, 12) = sd->status.option; + WBUFW (buf, 20) = sd->disguise; + WBUFPOS (buf, 36, sd->bl.x, sd->bl.y); + clif_send (buf, packet_len_table[0x7c], &sd->bl, AREA); + } - WBUFW(buf, 0) = 0x1d9; - WBUFW(buf,51) = (sd->status.base_level > battle_config.max_lv) ? battle_config.max_lv : sd->status.base_level; - clif_send(buf, packet_len_table[0x1d9], &sd->bl, AREA_WOS); + clif_set0078 (sd, buf); - if (sd->spiritball > 0) - clif_spiritball(sd); + WBUFW (buf, 0) = 0x1d9; + WBUFW (buf, 51) = + (sd->status.base_level > + battle_config.max_lv) ? battle_config.max_lv : sd->status.base_level; + clif_send (buf, packet_len_table[0x1d9], &sd->bl, AREA_WOS); - if (sd->status.guild_id > 0) { // force display of guild emblem [Valaris] - struct guild *g = guild_search(sd->status.guild_id); - if (g) - clif_guild_emblem(sd,g); - } // end addition [Valaris] + if (sd->spiritball > 0) + clif_spiritball (sd); - if (sd->status.class==13 || sd->status.class==21 || sd->status.class==4014 || sd->status.class==4022) - pc_setoption(sd,sd->status.option|0x0020); // [Valaris] + if (sd->status.guild_id > 0) + { // force display of guild emblem [Valaris] + struct guild *g = guild_search (sd->status.guild_id); + if (g) + clif_guild_emblem (sd, g); + } // end addition [Valaris] - if ((pc_isriding(sd) && pc_checkskill(sd,KN_RIDING)>0) && (sd->status.class==7 || - sd->status.class==14 || sd->status.class==4008 || sd->status.class==4015)) - pc_setriding(sd); // update peco riders for people upgrading athena [Valaris] + if (sd->status.class == 13 || sd->status.class == 21 + || sd->status.class == 4014 || sd->status.class == 4022) + pc_setoption (sd, sd->status.option | 0x0020); // [Valaris] + if ((pc_isriding (sd) && pc_checkskill (sd, KN_RIDING) > 0) + && (sd->status.class == 7 || sd->status.class == 14 + || sd->status.class == 4008 || sd->status.class == 4015)) + pc_setriding (sd); // update peco riders for people upgrading athena [Valaris] - if (map[sd->bl.m].flag.snow) - clif_specialeffect(&sd->bl, 162, 1); - if (map[sd->bl.m].flag.fog) - clif_specialeffect(&sd->bl, 233, 1); - if (map[sd->bl.m].flag.sakura) - clif_specialeffect(&sd->bl, 163, 1); - if (map[sd->bl.m].flag.leaves) - clif_specialeffect(&sd->bl, 333, 1); - if (map[sd->bl.m].flag.rain) - clif_specialeffect(&sd->bl, 161, 1); + if (map[sd->bl.m].flag.snow) + clif_specialeffect (&sd->bl, 162, 1); + if (map[sd->bl.m].flag.fog) + clif_specialeffect (&sd->bl, 233, 1); + if (map[sd->bl.m].flag.sakura) + clif_specialeffect (&sd->bl, 163, 1); + if (map[sd->bl.m].flag.leaves) + clif_specialeffect (&sd->bl, 333, 1); + if (map[sd->bl.m].flag.rain) + clif_specialeffect (&sd->bl, 161, 1); // clif_changelook_accessories(&sd->bl, NULL); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_spawnnpc(struct npc_data *nd) +int clif_spawnnpc (struct npc_data *nd) { - unsigned char buf[64]; - int len; - - nullpo_retr(0, nd); + unsigned char buf[64]; + int len; - if(nd->class < 0 || nd->flag&1 || nd->class == INVISIBLE_CLASS) - return 0; + nullpo_retr (0, nd); - memset(buf,0,packet_len_table[0x7c]); + if (nd->class < 0 || nd->flag & 1 || nd->class == INVISIBLE_CLASS) + return 0; - WBUFW(buf,0)=0x7c; - WBUFL(buf,2)=nd->bl.id; - WBUFW(buf,6)=nd->speed; - WBUFW(buf,20)=nd->class; - WBUFPOS(buf,36,nd->bl.x,nd->bl.y); + memset (buf, 0, packet_len_table[0x7c]); - clif_send(buf,packet_len_table[0x7c],&nd->bl,AREA); + WBUFW (buf, 0) = 0x7c; + WBUFL (buf, 2) = nd->bl.id; + WBUFW (buf, 6) = nd->speed; + WBUFW (buf, 20) = nd->class; + WBUFPOS (buf, 36, nd->bl.x, nd->bl.y); - len = clif_npc0078(nd,buf); - clif_send(buf,len,&nd->bl,AREA); + clif_send (buf, packet_len_table[0x7c], &nd->bl, AREA); + len = clif_npc0078 (nd, buf); + clif_send (buf, len, &nd->bl, AREA); - return 0; + return 0; } int -clif_spawn_fake_npc_for_player(struct map_session_data *sd, int fake_npc_id) +clif_spawn_fake_npc_for_player (struct map_session_data *sd, int fake_npc_id) { - int fd; - - nullpo_retr(0, sd); - - fd = sd->fd; - if (!fd) - return 0; + int fd; - WFIFOW(fd, 0) = 0x7c; - WFIFOL(fd, 2) = fake_npc_id; - WFIFOW(fd, 6) = 0; - WFIFOW(fd, 8) = 0; - WFIFOW(fd, 10) = 0; - WFIFOW(fd, 12) = 0; - WFIFOW(fd, 20) = 127; - WFIFOPOS(fd, 36, sd->bl.x, sd->bl.y); - WFIFOSET(fd, packet_len_table[0x7c]); - - WFIFOW(fd, 0)=0x78; - WFIFOL(fd, 2) = fake_npc_id; - WFIFOW(fd, 6) = 0; - WFIFOW(fd, 8) = 0; - WFIFOW(fd, 10) = 0; - WFIFOW(fd, 12) = 0; - WFIFOW(fd, 14) = 127; // identifies as NPC - WFIFOW(fd, 20) = 127; - WFIFOPOS(fd, 46, sd->bl.x, sd->bl.y); - WFIFOPOS(fd, 36, sd->bl.x, sd->bl.y); - WFIFOB(fd, 49) = 5; - WFIFOB(fd, 50) = 5; - WFIFOSET(fd, packet_len_table[0x78]); + nullpo_retr (0, sd); + fd = sd->fd; + if (!fd) return 0; -} + WFIFOW (fd, 0) = 0x7c; + WFIFOL (fd, 2) = fake_npc_id; + WFIFOW (fd, 6) = 0; + WFIFOW (fd, 8) = 0; + WFIFOW (fd, 10) = 0; + WFIFOW (fd, 12) = 0; + WFIFOW (fd, 20) = 127; + WFIFOPOS (fd, 36, sd->bl.x, sd->bl.y); + WFIFOSET (fd, packet_len_table[0x7c]); + + WFIFOW (fd, 0) = 0x78; + WFIFOL (fd, 2) = fake_npc_id; + WFIFOW (fd, 6) = 0; + WFIFOW (fd, 8) = 0; + WFIFOW (fd, 10) = 0; + WFIFOW (fd, 12) = 0; + WFIFOW (fd, 14) = 127; // identifies as NPC + WFIFOW (fd, 20) = 127; + WFIFOPOS (fd, 46, sd->bl.x, sd->bl.y); + WFIFOPOS (fd, 36, sd->bl.x, sd->bl.y); + WFIFOB (fd, 49) = 5; + WFIFOB (fd, 50) = 5; + WFIFOSET (fd, packet_len_table[0x78]); + + return 0; +} /*========================================== * *------------------------------------------ */ -int clif_spawnmob(struct mob_data *md) +int clif_spawnmob (struct mob_data *md) { - unsigned char buf[64]; - int len; - - nullpo_retr(0, md); - - if (mob_get_viewclass(md->class) > 23 ) { - memset(buf,0,packet_len_table[0x7c]); - - WBUFW(buf,0)=0x7c; - WBUFL(buf,2)=md->bl.id; - WBUFW(buf,6)=md->stats[MOB_SPEED]; - WBUFW(buf,8)=md->opt1; - WBUFW(buf,10)=md->opt2; - WBUFW(buf,12)=md->option; - WBUFW(buf,20)=mob_get_viewclass(md->class); - WBUFPOS(buf,36,md->bl.x,md->bl.y); - clif_send(buf,packet_len_table[0x7c],&md->bl,AREA); - } + unsigned char buf[64]; + int len; - len = clif_mob0078(md,buf); - clif_send(buf,len,&md->bl,AREA); + nullpo_retr (0, md); - if (mob_get_equip(md->class) > 0) // mob equipment [Valaris] - clif_mob_equip(md,mob_get_equip(md->class)); + if (mob_get_viewclass (md->class) > 23) + { + memset (buf, 0, packet_len_table[0x7c]); - return 0; + WBUFW (buf, 0) = 0x7c; + WBUFL (buf, 2) = md->bl.id; + WBUFW (buf, 6) = md->stats[MOB_SPEED]; + WBUFW (buf, 8) = md->opt1; + WBUFW (buf, 10) = md->opt2; + WBUFW (buf, 12) = md->option; + WBUFW (buf, 20) = mob_get_viewclass (md->class); + WBUFPOS (buf, 36, md->bl.x, md->bl.y); + clif_send (buf, packet_len_table[0x7c], &md->bl, AREA); + } + + len = clif_mob0078 (md, buf); + clif_send (buf, len, &md->bl, AREA); + + if (mob_get_equip (md->class) > 0) // mob equipment [Valaris] + clif_mob_equip (md, mob_get_equip (md->class)); + + return 0; } /*========================================== * *------------------------------------------ */ -int clif_servertick(struct map_session_data *sd) +int clif_servertick (struct map_session_data *sd) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x7f; - WFIFOL(fd,2)=sd->server_tick; - WFIFOSET(fd,packet_len_table[0x7f]); + fd = sd->fd; + WFIFOW (fd, 0) = 0x7f; + WFIFOL (fd, 2) = sd->server_tick; + WFIFOSET (fd, packet_len_table[0x7f]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_walkok(struct map_session_data *sd) +int clif_walkok (struct map_session_data *sd) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x87; - WFIFOL(fd,2)=gettick();; - WFIFOPOS2(fd,6,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y); - WFIFOB(fd,11)=0; - WFIFOSET(fd,packet_len_table[0x87]); + fd = sd->fd; + WFIFOW (fd, 0) = 0x87; + WFIFOL (fd, 2) = gettick ();; + WFIFOPOS2 (fd, 6, sd->bl.x, sd->bl.y, sd->to_x, sd->to_y); + WFIFOB (fd, 11) = 0; + WFIFOSET (fd, packet_len_table[0x87]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_movechar(struct map_session_data *sd) { - int fd; - int len; - unsigned char buf[256]; +int clif_movechar (struct map_session_data *sd) +{ + int fd; + int len; + unsigned char buf[256]; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd = sd->fd; + fd = sd->fd; - len = clif_set007b(sd, buf); + len = clif_set007b (sd, buf); - if (sd->disguise > 23 && sd->disguise < 4001) { - clif_send(buf, len, &sd->bl, AREA); - return 0; - } else - clif_send(buf, len, &sd->bl, AREA_WOS); + if (sd->disguise > 23 && sd->disguise < 4001) + { + clif_send (buf, len, &sd->bl, AREA); + return 0; + } + else + clif_send (buf, len, &sd->bl, AREA_WOS); - if (battle_config.save_clothcolor == 1 && sd->status.clothes_color > 0) - clif_changelook(&sd->bl, LOOK_CLOTHES_COLOR, sd->status.clothes_color); + if (battle_config.save_clothcolor == 1 && sd->status.clothes_color > 0) + clif_changelook (&sd->bl, LOOK_CLOTHES_COLOR, + sd->status.clothes_color); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -void clif_quitsave(int fd,struct map_session_data *sd) +void clif_quitsave (int fd, struct map_session_data *sd) { - map_quit(sd); + map_quit (sd); } /*========================================== * *------------------------------------------ */ -static int clif_waitclose(int tid, unsigned int tick, int id, int data) { - if (session[id]) - session[id]->eof = 1; +static int clif_waitclose (int tid, unsigned int tick, int id, int data) +{ + if (session[id]) + session[id]->eof = 1; - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -void clif_setwaitclose(int fd) { - add_timer(gettick() + 5000, clif_waitclose, fd, 0); +void clif_setwaitclose (int fd) +{ + add_timer (gettick () + 5000, clif_waitclose, fd, 0); } /*========================================== * *------------------------------------------ */ -int clif_changemap(struct map_session_data *sd, char *mapname, int x, int y) { - int fd; +int clif_changemap (struct map_session_data *sd, char *mapname, int x, int y) +{ + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd = sd->fd; + fd = sd->fd; - WFIFOW(fd,0) = 0x91; - memcpy(WFIFOP(fd,2), mapname, 16); - WFIFOW(fd,18) = x; - WFIFOW(fd,20) = y; - WFIFOSET(fd, packet_len_table[0x91]); + WFIFOW (fd, 0) = 0x91; + memcpy (WFIFOP (fd, 2), mapname, 16); + WFIFOW (fd, 18) = x; + WFIFOW (fd, 20) = y; + WFIFOSET (fd, packet_len_table[0x91]); - if (sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris] - clif_spawnpc(sd); + if (sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris] + clif_spawnpc (sd); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_changemapserver(struct map_session_data *sd, char *mapname, int x, int y, int ip, int port) { - int fd; +int clif_changemapserver (struct map_session_data *sd, char *mapname, int x, + int y, int ip, int port) +{ + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd = sd->fd; - WFIFOW(fd,0) = 0x92; - memcpy(WFIFOP(fd,2), mapname, 16); - WFIFOW(fd,18) = x; - WFIFOW(fd,20) = y; - WFIFOL(fd,22) = ip; - WFIFOW(fd,26) = port; - WFIFOSET(fd, packet_len_table[0x92]); + fd = sd->fd; + WFIFOW (fd, 0) = 0x92; + memcpy (WFIFOP (fd, 2), mapname, 16); + WFIFOW (fd, 18) = x; + WFIFOW (fd, 20) = y; + WFIFOL (fd, 22) = ip; + WFIFOW (fd, 26) = port; + WFIFOSET (fd, packet_len_table[0x92]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_fixpos(struct block_list *bl) { - char buf[16]; +int clif_fixpos (struct block_list *bl) +{ + char buf[16]; - nullpo_retr(0, bl); + nullpo_retr (0, bl); - WBUFW(buf,0)=0x88; - WBUFL(buf,2)=bl->id; - WBUFW(buf,6)=bl->x; - WBUFW(buf,8)=bl->y; + WBUFW (buf, 0) = 0x88; + WBUFL (buf, 2) = bl->id; + WBUFW (buf, 6) = bl->x; + WBUFW (buf, 8) = bl->y; - clif_send(buf, packet_len_table[0x88], bl, AREA); + clif_send (buf, packet_len_table[0x88], bl, AREA); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_npcbuysell(struct map_session_data* sd, int id) { - int fd; +int clif_npcbuysell (struct map_session_data *sd, int id) +{ + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xc4; - WFIFOL(fd,2)=id; - WFIFOSET(fd,packet_len_table[0xc4]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xc4; + WFIFOL (fd, 2) = id; + WFIFOSET (fd, packet_len_table[0xc4]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_buylist(struct map_session_data *sd, struct npc_data *nd) { - struct item_data *id; - int fd,i,val; - - nullpo_retr(0, sd); - nullpo_retr(0, nd); - - fd=sd->fd; - WFIFOW(fd,0)=0xc6; - for(i=0;nd->u.shop_item[i].nameid > 0;i++){ - id = itemdb_search(nd->u.shop_item[i].nameid); - val=nd->u.shop_item[i].value; - WFIFOL(fd,4+i*11)=val; - if (!id->flag.value_notdc) - val=pc_modifybuyvalue(sd,val); - WFIFOL(fd,8+i*11)=val; - WFIFOB(fd,12+i*11)=id->type; - if (id->view_id > 0) - WFIFOW(fd,13+i*11)=id->view_id; - else - WFIFOW(fd,13+i*11)=nd->u.shop_item[i].nameid; - } - WFIFOW(fd,2)=i*11+4; - WFIFOSET(fd,WFIFOW(fd,2)); +int clif_buylist (struct map_session_data *sd, struct npc_data *nd) +{ + struct item_data *id; + int fd, i, val; - return 0; + nullpo_retr (0, sd); + nullpo_retr (0, nd); + + fd = sd->fd; + WFIFOW (fd, 0) = 0xc6; + for (i = 0; nd->u.shop_item[i].nameid > 0; i++) + { + id = itemdb_search (nd->u.shop_item[i].nameid); + val = nd->u.shop_item[i].value; + WFIFOL (fd, 4 + i * 11) = val; + if (!id->flag.value_notdc) + val = pc_modifybuyvalue (sd, val); + WFIFOL (fd, 8 + i * 11) = val; + WFIFOB (fd, 12 + i * 11) = id->type; + if (id->view_id > 0) + WFIFOW (fd, 13 + i * 11) = id->view_id; + else + WFIFOW (fd, 13 + i * 11) = nd->u.shop_item[i].nameid; + } + WFIFOW (fd, 2) = i * 11 + 4; + WFIFOSET (fd, WFIFOW (fd, 2)); + + return 0; } /*========================================== * *------------------------------------------ */ -int clif_selllist(struct map_session_data *sd) { - int fd,i,c=0,val; - - nullpo_retr(0, sd); - - fd=sd->fd; - WFIFOW(fd,0)=0xc7; - for(i=0;i<MAX_INVENTORY;i++) { - if(sd->status.inventory[i].nameid > 0 && sd->inventory_data[i]) { - val=sd->inventory_data[i]->value_sell; - if (val < 0) - continue; - WFIFOW(fd,4+c*10)=i+2; - WFIFOL(fd,6+c*10)=val; - if (!sd->inventory_data[i]->flag.value_notoc) - val=pc_modifysellvalue(sd,val); - WFIFOL(fd,10+c*10)=val; - c++; - } - } - WFIFOW(fd,2)=c*10+4; - WFIFOSET(fd,WFIFOW(fd,2)); +int clif_selllist (struct map_session_data *sd) +{ + int fd, i, c = 0, val; - return 0; + nullpo_retr (0, sd); + + fd = sd->fd; + WFIFOW (fd, 0) = 0xc7; + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid > 0 && sd->inventory_data[i]) + { + val = sd->inventory_data[i]->value_sell; + if (val < 0) + continue; + WFIFOW (fd, 4 + c * 10) = i + 2; + WFIFOL (fd, 6 + c * 10) = val; + if (!sd->inventory_data[i]->flag.value_notoc) + val = pc_modifysellvalue (sd, val); + WFIFOL (fd, 10 + c * 10) = val; + c++; + } + } + WFIFOW (fd, 2) = c * 10 + 4; + WFIFOSET (fd, WFIFOW (fd, 2)); + + return 0; } /*========================================== * *------------------------------------------ */ -int clif_scriptmes(struct map_session_data *sd, int npcid, char *mes) { - int fd; +int clif_scriptmes (struct map_session_data *sd, int npcid, char *mes) +{ + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd = sd->fd; - WFIFOW(fd, 0) = 0xb4; - WFIFOW(fd, 2) = strlen(mes) + 9; - WFIFOL(fd, 4) = npcid; - strcpy(WFIFOP(fd, 8), mes); - WFIFOSET(fd, WFIFOW(fd, 2)); + fd = sd->fd; + WFIFOW (fd, 0) = 0xb4; + WFIFOW (fd, 2) = strlen (mes) + 9; + WFIFOL (fd, 4) = npcid; + strcpy (WFIFOP (fd, 8), mes); + WFIFOSET (fd, WFIFOW (fd, 2)); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_scriptnext(struct map_session_data *sd,int npcid) { - int fd; +int clif_scriptnext (struct map_session_data *sd, int npcid) +{ + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xb5; - WFIFOL(fd,2)=npcid; - WFIFOSET(fd,packet_len_table[0xb5]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xb5; + WFIFOL (fd, 2) = npcid; + WFIFOSET (fd, packet_len_table[0xb5]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_scriptclose(struct map_session_data *sd, int npcid) { - int fd; +int clif_scriptclose (struct map_session_data *sd, int npcid) +{ + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xb6; - WFIFOL(fd,2)=npcid; - WFIFOSET(fd,packet_len_table[0xb6]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xb6; + WFIFOL (fd, 2) = npcid; + WFIFOSET (fd, packet_len_table[0xb6]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_scriptmenu(struct map_session_data *sd, int npcid, char *mes) { - int fd; +int clif_scriptmenu (struct map_session_data *sd, int npcid, char *mes) +{ + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xb7; - WFIFOW(fd,2)=strlen(mes)+8; - WFIFOL(fd,4)=npcid; - strcpy(WFIFOP(fd,8),mes); - WFIFOSET(fd,WFIFOW(fd,2)); + fd = sd->fd; + WFIFOW (fd, 0) = 0xb7; + WFIFOW (fd, 2) = strlen (mes) + 8; + WFIFOL (fd, 4) = npcid; + strcpy (WFIFOP (fd, 8), mes); + WFIFOSET (fd, WFIFOW (fd, 2)); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_scriptinput(struct map_session_data *sd, int npcid) { - int fd; +int clif_scriptinput (struct map_session_data *sd, int npcid) +{ + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x142; - WFIFOL(fd,2)=npcid; - WFIFOSET(fd,packet_len_table[0x142]); + fd = sd->fd; + WFIFOW (fd, 0) = 0x142; + WFIFOL (fd, 2) = npcid; + WFIFOSET (fd, packet_len_table[0x142]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_scriptinputstr(struct map_session_data *sd, int npcid) { - int fd; +int clif_scriptinputstr (struct map_session_data *sd, int npcid) +{ + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x1d4; - WFIFOL(fd,2)=npcid; - WFIFOSET(fd,packet_len_table[0x1d4]); + fd = sd->fd; + WFIFOW (fd, 0) = 0x1d4; + WFIFOL (fd, 2) = npcid; + WFIFOSET (fd, packet_len_table[0x1d4]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_viewpoint(struct map_session_data *sd, int npc_id, int type, int x, int y, int id, int color) { - int fd; +int clif_viewpoint (struct map_session_data *sd, int npc_id, int type, int x, + int y, int id, int color) +{ + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x144; - WFIFOL(fd,2)=npc_id; - WFIFOL(fd,6)=type; - WFIFOL(fd,10)=x; - WFIFOL(fd,14)=y; - WFIFOB(fd,18)=id; - WFIFOL(fd,19)=color; - WFIFOSET(fd,packet_len_table[0x144]); + fd = sd->fd; + WFIFOW (fd, 0) = 0x144; + WFIFOL (fd, 2) = npc_id; + WFIFOL (fd, 6) = type; + WFIFOL (fd, 10) = x; + WFIFOL (fd, 14) = y; + WFIFOB (fd, 18) = id; + WFIFOL (fd, 19) = color; + WFIFOSET (fd, packet_len_table[0x144]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_cutin(struct map_session_data *sd, char *image, int type) { - int fd; +int clif_cutin (struct map_session_data *sd, char *image, int type) +{ + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x1b3; - memcpy(WFIFOP(fd,2),image,64); - WFIFOB(fd,66)=type; - WFIFOSET(fd,packet_len_table[0x1b3]); + fd = sd->fd; + WFIFOW (fd, 0) = 0x1b3; + memcpy (WFIFOP (fd, 2), image, 64); + WFIFOB (fd, 66) = type; + WFIFOSET (fd, packet_len_table[0x1b3]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_additem(struct map_session_data *sd, int n, int amount, int fail) { - int fd,j; - unsigned char *buf; - - nullpo_retr(0, sd); - - fd=sd->fd; - buf=WFIFOP(fd,0); - if(fail) { - WBUFW(buf,0)=0xa0; - WBUFW(buf,2)=n+2; - WBUFW(buf,4)=amount; - WBUFW(buf,6)=0; - WBUFB(buf,8)=0; - WBUFB(buf,9)=0; - WBUFB(buf,10)=0; - WBUFW(buf,11)=0; - WBUFW(buf,13)=0; - WBUFW(buf,15)=0; - WBUFW(buf,17)=0; - WBUFW(buf,19)=0; - WBUFB(buf,21)=0; - WBUFB(buf,22)=fail; - } else { - if (n<0 || n>=MAX_INVENTORY || sd->status.inventory[n].nameid <=0 || sd->inventory_data[n] == NULL) - return 1; - - WBUFW(buf,0)=0xa0; - WBUFW(buf,2)=n+2; - WBUFW(buf,4)=amount; - if (sd->inventory_data[n]->view_id > 0) - WBUFW(buf,6)=sd->inventory_data[n]->view_id; - else - WBUFW(buf,6)=sd->status.inventory[n].nameid; - WBUFB(buf,8)=sd->status.inventory[n].identify; - if (sd->status.inventory[n].broken==1) - WBUFB(buf,9)=1; // is weapon broken [Valaris] - else - WBUFB(buf,9)=sd->status.inventory[n].attribute; - WBUFB(buf,10)=sd->status.inventory[n].refine; - if(sd->status.inventory[n].card[0]==0x00ff || sd->status.inventory[n].card[0]==0x00fe || sd->status.inventory[n].card[0]==(short)0xff00) { - WBUFW(buf,11)=sd->status.inventory[n].card[0]; - WBUFW(buf,13)=sd->status.inventory[n].card[1]; - WBUFW(buf,15)=sd->status.inventory[n].card[2]; - WBUFW(buf,17)=sd->status.inventory[n].card[3]; - } else { - if (sd->status.inventory[n].card[0] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[0])) > 0) - WBUFW(buf,11)=j; - else - WBUFW(buf,11)=sd->status.inventory[n].card[0]; - if (sd->status.inventory[n].card[1] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[1])) > 0) - WBUFW(buf,13)=j; - else - WBUFW(buf,13)=sd->status.inventory[n].card[1]; - if (sd->status.inventory[n].card[2] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[2])) > 0) - WBUFW(buf,15)=j; - else - WBUFW(buf,15)=sd->status.inventory[n].card[2]; - if (sd->status.inventory[n].card[3] > 0 && (j=itemdb_viewid(sd->status.inventory[n].card[3])) > 0) - WBUFW(buf,17)=j; - else - WBUFW(buf,17)=sd->status.inventory[n].card[3]; - } - WBUFW(buf,19)=pc_equippoint(sd,n); - WBUFB(buf,21)=(sd->inventory_data[n]->type == 7)? 4:sd->inventory_data[n]->type; - WBUFB(buf,22)=fail; - } +int clif_additem (struct map_session_data *sd, int n, int amount, int fail) +{ + int fd, j; + unsigned char *buf; + + nullpo_retr (0, sd); + + fd = sd->fd; + buf = WFIFOP (fd, 0); + if (fail) + { + WBUFW (buf, 0) = 0xa0; + WBUFW (buf, 2) = n + 2; + WBUFW (buf, 4) = amount; + WBUFW (buf, 6) = 0; + WBUFB (buf, 8) = 0; + WBUFB (buf, 9) = 0; + WBUFB (buf, 10) = 0; + WBUFW (buf, 11) = 0; + WBUFW (buf, 13) = 0; + WBUFW (buf, 15) = 0; + WBUFW (buf, 17) = 0; + WBUFW (buf, 19) = 0; + WBUFB (buf, 21) = 0; + WBUFB (buf, 22) = fail; + } + else + { + if (n < 0 || n >= MAX_INVENTORY || sd->status.inventory[n].nameid <= 0 + || sd->inventory_data[n] == NULL) + return 1; + + WBUFW (buf, 0) = 0xa0; + WBUFW (buf, 2) = n + 2; + WBUFW (buf, 4) = amount; + if (sd->inventory_data[n]->view_id > 0) + WBUFW (buf, 6) = sd->inventory_data[n]->view_id; + else + WBUFW (buf, 6) = sd->status.inventory[n].nameid; + WBUFB (buf, 8) = sd->status.inventory[n].identify; + if (sd->status.inventory[n].broken == 1) + WBUFB (buf, 9) = 1; // is weapon broken [Valaris] + else + WBUFB (buf, 9) = sd->status.inventory[n].attribute; + WBUFB (buf, 10) = sd->status.inventory[n].refine; + if (sd->status.inventory[n].card[0] == 0x00ff + || sd->status.inventory[n].card[0] == 0x00fe + || sd->status.inventory[n].card[0] == (short) 0xff00) + { + WBUFW (buf, 11) = sd->status.inventory[n].card[0]; + WBUFW (buf, 13) = sd->status.inventory[n].card[1]; + WBUFW (buf, 15) = sd->status.inventory[n].card[2]; + WBUFW (buf, 17) = sd->status.inventory[n].card[3]; + } + else + { + if (sd->status.inventory[n].card[0] > 0 + && (j = itemdb_viewid (sd->status.inventory[n].card[0])) > 0) + WBUFW (buf, 11) = j; + else + WBUFW (buf, 11) = sd->status.inventory[n].card[0]; + if (sd->status.inventory[n].card[1] > 0 + && (j = itemdb_viewid (sd->status.inventory[n].card[1])) > 0) + WBUFW (buf, 13) = j; + else + WBUFW (buf, 13) = sd->status.inventory[n].card[1]; + if (sd->status.inventory[n].card[2] > 0 + && (j = itemdb_viewid (sd->status.inventory[n].card[2])) > 0) + WBUFW (buf, 15) = j; + else + WBUFW (buf, 15) = sd->status.inventory[n].card[2]; + if (sd->status.inventory[n].card[3] > 0 + && (j = itemdb_viewid (sd->status.inventory[n].card[3])) > 0) + WBUFW (buf, 17) = j; + else + WBUFW (buf, 17) = sd->status.inventory[n].card[3]; + } + WBUFW (buf, 19) = pc_equippoint (sd, n); + WBUFB (buf, 21) = + (sd->inventory_data[n]->type == + 7) ? 4 : sd->inventory_data[n]->type; + WBUFB (buf, 22) = fail; + } - WFIFOSET(fd,packet_len_table[0xa0]); - return 0; + WFIFOSET (fd, packet_len_table[0xa0]); + return 0; } /*========================================== * *------------------------------------------ */ -int clif_delitem(struct map_session_data *sd,int n,int amount) +int clif_delitem (struct map_session_data *sd, int n, int amount) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xaf; - WFIFOW(fd,2)=n+2; - WFIFOW(fd,4)=amount; + fd = sd->fd; + WFIFOW (fd, 0) = 0xaf; + WFIFOW (fd, 2) = n + 2; + WFIFOW (fd, 4) = amount; - WFIFOSET(fd,packet_len_table[0xaf]); + WFIFOSET (fd, packet_len_table[0xaf]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_itemlist(struct map_session_data *sd) -{ - int i,n,fd,arrow=-1; - unsigned char *buf; - - nullpo_retr(0, sd); - - fd=sd->fd; - buf = WFIFOP(fd,0); - WBUFW(buf,0)=0x1ee; - for(i=0,n=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].nameid <=0 || sd->inventory_data[i] == NULL || itemdb_isequip2(sd->inventory_data[i])) - continue; - WBUFW(buf,n*18+4)=i+2; - if(sd->inventory_data[i]->view_id > 0) - WBUFW(buf,n*18+6)=sd->inventory_data[i]->view_id; - else - WBUFW(buf,n*18+6)=sd->status.inventory[i].nameid; - WBUFB(buf,n*18+8)=sd->inventory_data[i]->type; - WBUFB(buf,n*18+9)=sd->status.inventory[i].identify; - WBUFW(buf,n*18+10)=sd->status.inventory[i].amount; - if (sd->inventory_data[i]->equip == 0x8000) { - WBUFW(buf,n*18+12)=0x8000; - if(sd->status.inventory[i].equip) - arrow=i; // ソスツゑソスソスナに矢装ソスソスソス`ソスFソスbソスN - } else - WBUFW(buf,n*18+12)=0; - WBUFW(buf,n*18+14)=sd->status.inventory[i].card[0]; - WBUFW(buf,n*18+16)=sd->status.inventory[i].card[1]; - WBUFW(buf,n*18+18)=sd->status.inventory[i].card[2]; - WBUFW(buf,n*18+20)=sd->status.inventory[i].card[3]; - n++; - } - if (n) { - WBUFW(buf,2)=4+n*18; - WFIFOSET(fd,WFIFOW(fd,2)); - } - if(arrow >= 0) - clif_arrowequip(sd,arrow); - return 0; +int clif_itemlist (struct map_session_data *sd) +{ + int i, n, fd, arrow = -1; + unsigned char *buf; + + nullpo_retr (0, sd); + + fd = sd->fd; + buf = WFIFOP (fd, 0); + WBUFW (buf, 0) = 0x1ee; + for (i = 0, n = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid <= 0 + || sd->inventory_data[i] == NULL + || itemdb_isequip2 (sd->inventory_data[i])) + continue; + WBUFW (buf, n * 18 + 4) = i + 2; + if (sd->inventory_data[i]->view_id > 0) + WBUFW (buf, n * 18 + 6) = sd->inventory_data[i]->view_id; + else + WBUFW (buf, n * 18 + 6) = sd->status.inventory[i].nameid; + WBUFB (buf, n * 18 + 8) = sd->inventory_data[i]->type; + WBUFB (buf, n * 18 + 9) = sd->status.inventory[i].identify; + WBUFW (buf, n * 18 + 10) = sd->status.inventory[i].amount; + if (sd->inventory_data[i]->equip == 0x8000) + { + WBUFW (buf, n * 18 + 12) = 0x8000; + if (sd->status.inventory[i].equip) + arrow = i; // ソスツゑソスソスナに矢装ソスソスソス`ソスFソスbソスN + } + else + WBUFW (buf, n * 18 + 12) = 0; + WBUFW (buf, n * 18 + 14) = sd->status.inventory[i].card[0]; + WBUFW (buf, n * 18 + 16) = sd->status.inventory[i].card[1]; + WBUFW (buf, n * 18 + 18) = sd->status.inventory[i].card[2]; + WBUFW (buf, n * 18 + 20) = sd->status.inventory[i].card[3]; + n++; + } + if (n) + { + WBUFW (buf, 2) = 4 + n * 18; + WFIFOSET (fd, WFIFOW (fd, 2)); + } + if (arrow >= 0) + clif_arrowequip (sd, arrow); + return 0; } /*========================================== * *------------------------------------------ */ -int clif_equiplist(struct map_session_data *sd) -{ - int i,j,n,fd; - unsigned char *buf; - - nullpo_retr(0, sd); - - fd=sd->fd; - buf = WFIFOP(fd,0); - WBUFW(buf,0)=0xa4; - for(i=0,n=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].nameid<=0 || sd->inventory_data[i] == NULL || !itemdb_isequip2(sd->inventory_data[i])) - continue; - WBUFW(buf,n*20+4)=i+2; - if(sd->inventory_data[i]->view_id > 0) - WBUFW(buf,n*20+6)=sd->inventory_data[i]->view_id; - else - WBUFW(buf,n*20+6)=sd->status.inventory[i].nameid; - WBUFB(buf,n*20+8)=(sd->inventory_data[i]->type == 7)? 4:sd->inventory_data[i]->type; - WBUFB(buf,n*20+9)=sd->status.inventory[i].identify; - WBUFW(buf,n*20+10)=pc_equippoint(sd,i); - WBUFW(buf,n*20+12)=sd->status.inventory[i].equip; - if(sd->status.inventory[i].broken==1) - WBUFB(buf,n*20+14)=1; // is weapon broken [Valaris] - else - WBUFB(buf,n*20+14)=sd->status.inventory[i].attribute; - WBUFB(buf,n*20+15)=sd->status.inventory[i].refine; - if(sd->status.inventory[i].card[0]==0x00ff || sd->status.inventory[i].card[0]==0x00fe || sd->status.inventory[i].card[0]==(short)0xff00) { - WBUFW(buf,n*20+16)=sd->status.inventory[i].card[0]; - WBUFW(buf,n*20+18)=sd->status.inventory[i].card[1]; - WBUFW(buf,n*20+20)=sd->status.inventory[i].card[2]; - WBUFW(buf,n*20+22)=sd->status.inventory[i].card[3]; - } else { - if(sd->status.inventory[i].card[0] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[0])) > 0) - WBUFW(buf,n*20+16)=j; - else - WBUFW(buf,n*20+16)=sd->status.inventory[i].card[0]; - if(sd->status.inventory[i].card[1] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[1])) > 0) - WBUFW(buf,n*20+18)=j; - else - WBUFW(buf,n*20+18)=sd->status.inventory[i].card[1]; - if(sd->status.inventory[i].card[2] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[2])) > 0) - WBUFW(buf,n*20+20)=j; - else - WBUFW(buf,n*20+20)=sd->status.inventory[i].card[2]; - if(sd->status.inventory[i].card[3] > 0 && (j=itemdb_viewid(sd->status.inventory[i].card[3])) > 0) - WBUFW(buf,n*20+22)=j; - else - WBUFW(buf,n*20+22)=sd->status.inventory[i].card[3]; - } - n++; - } - if(n){ - WBUFW(buf,2)=4+n*20; - WFIFOSET(fd,WFIFOW(fd,2)); - } - return 0; +int clif_equiplist (struct map_session_data *sd) +{ + int i, j, n, fd; + unsigned char *buf; + + nullpo_retr (0, sd); + + fd = sd->fd; + buf = WFIFOP (fd, 0); + WBUFW (buf, 0) = 0xa4; + for (i = 0, n = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid <= 0 + || sd->inventory_data[i] == NULL + || !itemdb_isequip2 (sd->inventory_data[i])) + continue; + WBUFW (buf, n * 20 + 4) = i + 2; + if (sd->inventory_data[i]->view_id > 0) + WBUFW (buf, n * 20 + 6) = sd->inventory_data[i]->view_id; + else + WBUFW (buf, n * 20 + 6) = sd->status.inventory[i].nameid; + WBUFB (buf, n * 20 + 8) = + (sd->inventory_data[i]->type == + 7) ? 4 : sd->inventory_data[i]->type; + WBUFB (buf, n * 20 + 9) = sd->status.inventory[i].identify; + WBUFW (buf, n * 20 + 10) = pc_equippoint (sd, i); + WBUFW (buf, n * 20 + 12) = sd->status.inventory[i].equip; + if (sd->status.inventory[i].broken == 1) + WBUFB (buf, n * 20 + 14) = 1; // is weapon broken [Valaris] + else + WBUFB (buf, n * 20 + 14) = sd->status.inventory[i].attribute; + WBUFB (buf, n * 20 + 15) = sd->status.inventory[i].refine; + if (sd->status.inventory[i].card[0] == 0x00ff + || sd->status.inventory[i].card[0] == 0x00fe + || sd->status.inventory[i].card[0] == (short) 0xff00) + { + WBUFW (buf, n * 20 + 16) = sd->status.inventory[i].card[0]; + WBUFW (buf, n * 20 + 18) = sd->status.inventory[i].card[1]; + WBUFW (buf, n * 20 + 20) = sd->status.inventory[i].card[2]; + WBUFW (buf, n * 20 + 22) = sd->status.inventory[i].card[3]; + } + else + { + if (sd->status.inventory[i].card[0] > 0 + && (j = itemdb_viewid (sd->status.inventory[i].card[0])) > 0) + WBUFW (buf, n * 20 + 16) = j; + else + WBUFW (buf, n * 20 + 16) = sd->status.inventory[i].card[0]; + if (sd->status.inventory[i].card[1] > 0 + && (j = itemdb_viewid (sd->status.inventory[i].card[1])) > 0) + WBUFW (buf, n * 20 + 18) = j; + else + WBUFW (buf, n * 20 + 18) = sd->status.inventory[i].card[1]; + if (sd->status.inventory[i].card[2] > 0 + && (j = itemdb_viewid (sd->status.inventory[i].card[2])) > 0) + WBUFW (buf, n * 20 + 20) = j; + else + WBUFW (buf, n * 20 + 20) = sd->status.inventory[i].card[2]; + if (sd->status.inventory[i].card[3] > 0 + && (j = itemdb_viewid (sd->status.inventory[i].card[3])) > 0) + WBUFW (buf, n * 20 + 22) = j; + else + WBUFW (buf, n * 20 + 22) = sd->status.inventory[i].card[3]; + } + n++; + } + if (n) + { + WBUFW (buf, 2) = 4 + n * 20; + WFIFOSET (fd, WFIFOW (fd, 2)); + } + return 0; } /*========================================== * ソスJソスvソスソスソスソスソスソスソスノ預ソスソスソストゑソスソスソスソスソスユ品&ソスソスソスWソスiソスソスソスXソスg *------------------------------------------ */ -int clif_storageitemlist(struct map_session_data *sd,struct storage *stor) -{ - struct item_data *id; - int i,n,fd; - unsigned char *buf; - - nullpo_retr(0, sd); - nullpo_retr(0, stor); - - fd=sd->fd; - buf = WFIFOP(fd,0); - WBUFW(buf,0)=0x1f0; - for(i=0,n=0;i<MAX_STORAGE;i++){ - if(stor->storage_[i].nameid<=0) - continue; - nullpo_retr(0, id = itemdb_search(stor->storage_[i].nameid)); - if(itemdb_isequip2(id)) - continue; - - WBUFW(buf,n*18+4)=i+1; - if(id->view_id > 0) - WBUFW(buf,n*18+6)=id->view_id; - else - WBUFW(buf,n*18+6)=stor->storage_[i].nameid; - WBUFB(buf,n*18+8)=id->type;; - WBUFB(buf,n*18+9)=stor->storage_[i].identify; - WBUFW(buf,n*18+10)=stor->storage_[i].amount; - WBUFW(buf,n*18+12)=0; - WBUFW(buf,n*18+14)=stor->storage_[i].card[0]; - WBUFW(buf,n*18+16)=stor->storage_[i].card[1]; - WBUFW(buf,n*18+18)=stor->storage_[i].card[2]; - WBUFW(buf,n*18+20)=stor->storage_[i].card[3]; - n++; - } - if(n){ - WBUFW(buf,2)=4+n*18; - WFIFOSET(fd,WFIFOW(fd,2)); - } - return 0; +int clif_storageitemlist (struct map_session_data *sd, struct storage *stor) +{ + struct item_data *id; + int i, n, fd; + unsigned char *buf; + + nullpo_retr (0, sd); + nullpo_retr (0, stor); + + fd = sd->fd; + buf = WFIFOP (fd, 0); + WBUFW (buf, 0) = 0x1f0; + for (i = 0, n = 0; i < MAX_STORAGE; i++) + { + if (stor->storage_[i].nameid <= 0) + continue; + nullpo_retr (0, id = itemdb_search (stor->storage_[i].nameid)); + if (itemdb_isequip2 (id)) + continue; + + WBUFW (buf, n * 18 + 4) = i + 1; + if (id->view_id > 0) + WBUFW (buf, n * 18 + 6) = id->view_id; + else + WBUFW (buf, n * 18 + 6) = stor->storage_[i].nameid; + WBUFB (buf, n * 18 + 8) = id->type;; + WBUFB (buf, n * 18 + 9) = stor->storage_[i].identify; + WBUFW (buf, n * 18 + 10) = stor->storage_[i].amount; + WBUFW (buf, n * 18 + 12) = 0; + WBUFW (buf, n * 18 + 14) = stor->storage_[i].card[0]; + WBUFW (buf, n * 18 + 16) = stor->storage_[i].card[1]; + WBUFW (buf, n * 18 + 18) = stor->storage_[i].card[2]; + WBUFW (buf, n * 18 + 20) = stor->storage_[i].card[3]; + n++; + } + if (n) + { + WBUFW (buf, 2) = 4 + n * 18; + WFIFOSET (fd, WFIFOW (fd, 2)); + } + return 0; } /*========================================== * ソスJソスvソスソスソスソスソスソスソスノ預ソスソスソストゑソスソス髑包ソスソスXソスg *------------------------------------------ */ -int clif_storageequiplist(struct map_session_data *sd,struct storage *stor) -{ - struct item_data *id; - int i,j,n,fd; - unsigned char *buf; - - nullpo_retr(0, sd); - nullpo_retr(0, stor); - - fd=sd->fd; - buf = WFIFOP(fd,0); - WBUFW(buf,0)=0xa6; - for(i=0,n=0;i<MAX_STORAGE;i++){ - if(stor->storage_[i].nameid<=0) - continue; - nullpo_retr(0, id = itemdb_search(stor->storage_[i].nameid)); - if(!itemdb_isequip2(id)) - continue; - WBUFW(buf,n*20+4)=i+1; - if(id->view_id > 0) - WBUFW(buf,n*20+6)=id->view_id; - else - WBUFW(buf,n*20+6)=stor->storage_[i].nameid; - WBUFB(buf,n*20+8)=id->type; - WBUFB(buf,n*20+9)=stor->storage_[i].identify; - WBUFW(buf,n*20+10)=id->equip; - WBUFW(buf,n*20+12)=stor->storage_[i].equip; - if(stor->storage_[i].broken==1) - WBUFB(buf,n*20+14)=1; //is weapon broken [Valaris] - else - WBUFB(buf,n*20+14)=stor->storage_[i].attribute; - WBUFB(buf,n*20+15)=stor->storage_[i].refine; - if(stor->storage_[i].card[0]==0x00ff || stor->storage_[i].card[0]==0x00fe || stor->storage_[i].card[0]==(short)0xff00) { - WBUFW(buf,n*20+16)=stor->storage_[i].card[0]; - WBUFW(buf,n*20+18)=stor->storage_[i].card[1]; - WBUFW(buf,n*20+20)=stor->storage_[i].card[2]; - WBUFW(buf,n*20+22)=stor->storage_[i].card[3]; - } else { - if(stor->storage_[i].card[0] > 0 && (j=itemdb_viewid(stor->storage_[i].card[0])) > 0) - WBUFW(buf,n*20+16)=j; - else - WBUFW(buf,n*20+16)=stor->storage_[i].card[0]; - if(stor->storage_[i].card[1] > 0 && (j=itemdb_viewid(stor->storage_[i].card[1])) > 0) - WBUFW(buf,n*20+18)=j; - else - WBUFW(buf,n*20+18)=stor->storage_[i].card[1]; - if(stor->storage_[i].card[2] > 0 && (j=itemdb_viewid(stor->storage_[i].card[2])) > 0) - WBUFW(buf,n*20+20)=j; - else - WBUFW(buf,n*20+20)=stor->storage_[i].card[2]; - if(stor->storage_[i].card[3] > 0 && (j=itemdb_viewid(stor->storage_[i].card[3])) > 0) - WBUFW(buf,n*20+22)=j; - else - WBUFW(buf,n*20+22)=stor->storage_[i].card[3]; - } - n++; - } - if(n){ - WBUFW(buf,2)=4+n*20; - WFIFOSET(fd,WFIFOW(fd,2)); - } - return 0; +int clif_storageequiplist (struct map_session_data *sd, struct storage *stor) +{ + struct item_data *id; + int i, j, n, fd; + unsigned char *buf; + + nullpo_retr (0, sd); + nullpo_retr (0, stor); + + fd = sd->fd; + buf = WFIFOP (fd, 0); + WBUFW (buf, 0) = 0xa6; + for (i = 0, n = 0; i < MAX_STORAGE; i++) + { + if (stor->storage_[i].nameid <= 0) + continue; + nullpo_retr (0, id = itemdb_search (stor->storage_[i].nameid)); + if (!itemdb_isequip2 (id)) + continue; + WBUFW (buf, n * 20 + 4) = i + 1; + if (id->view_id > 0) + WBUFW (buf, n * 20 + 6) = id->view_id; + else + WBUFW (buf, n * 20 + 6) = stor->storage_[i].nameid; + WBUFB (buf, n * 20 + 8) = id->type; + WBUFB (buf, n * 20 + 9) = stor->storage_[i].identify; + WBUFW (buf, n * 20 + 10) = id->equip; + WBUFW (buf, n * 20 + 12) = stor->storage_[i].equip; + if (stor->storage_[i].broken == 1) + WBUFB (buf, n * 20 + 14) = 1; //is weapon broken [Valaris] + else + WBUFB (buf, n * 20 + 14) = stor->storage_[i].attribute; + WBUFB (buf, n * 20 + 15) = stor->storage_[i].refine; + if (stor->storage_[i].card[0] == 0x00ff + || stor->storage_[i].card[0] == 0x00fe + || stor->storage_[i].card[0] == (short) 0xff00) + { + WBUFW (buf, n * 20 + 16) = stor->storage_[i].card[0]; + WBUFW (buf, n * 20 + 18) = stor->storage_[i].card[1]; + WBUFW (buf, n * 20 + 20) = stor->storage_[i].card[2]; + WBUFW (buf, n * 20 + 22) = stor->storage_[i].card[3]; + } + else + { + if (stor->storage_[i].card[0] > 0 + && (j = itemdb_viewid (stor->storage_[i].card[0])) > 0) + WBUFW (buf, n * 20 + 16) = j; + else + WBUFW (buf, n * 20 + 16) = stor->storage_[i].card[0]; + if (stor->storage_[i].card[1] > 0 + && (j = itemdb_viewid (stor->storage_[i].card[1])) > 0) + WBUFW (buf, n * 20 + 18) = j; + else + WBUFW (buf, n * 20 + 18) = stor->storage_[i].card[1]; + if (stor->storage_[i].card[2] > 0 + && (j = itemdb_viewid (stor->storage_[i].card[2])) > 0) + WBUFW (buf, n * 20 + 20) = j; + else + WBUFW (buf, n * 20 + 20) = stor->storage_[i].card[2]; + if (stor->storage_[i].card[3] > 0 + && (j = itemdb_viewid (stor->storage_[i].card[3])) > 0) + WBUFW (buf, n * 20 + 22) = j; + else + WBUFW (buf, n * 20 + 22) = stor->storage_[i].card[3]; + } + n++; + } + if (n) + { + WBUFW (buf, 2) = 4 + n * 20; + WFIFOSET (fd, WFIFOW (fd, 2)); + } + return 0; } /*========================================== * *------------------------------------------ */ -int clif_guildstorageitemlist(struct map_session_data *sd,struct guild_storage *stor) -{ - struct item_data *id; - int i,n,fd; - unsigned char *buf; - - nullpo_retr(0, sd); - nullpo_retr(0, stor); - - fd=sd->fd; - buf=WFIFOP(fd,0); - - WBUFW(buf,0)=0x1f0; - for(i=0,n=0;i<MAX_GUILD_STORAGE;i++){ - if(stor->storage_[i].nameid<=0) - continue; - nullpo_retr(0, id = itemdb_search(stor->storage_[i].nameid)); - if(itemdb_isequip2(id)) - continue; - - WBUFW(buf,n*18+4)=i+1; - if(id->view_id > 0) - WBUFW(buf,n*18+6)=id->view_id; - else - WBUFW(buf,n*18+6)=stor->storage_[i].nameid; - WBUFB(buf,n*18+8)=id->type;; - WBUFB(buf,n*18+9)=stor->storage_[i].identify; - WBUFW(buf,n*18+10)=stor->storage_[i].amount; - WBUFW(buf,n*18+12)=0; - WBUFW(buf,n*18+14)=stor->storage_[i].card[0]; - WBUFW(buf,n*18+16)=stor->storage_[i].card[1]; - WBUFW(buf,n*18+18)=stor->storage_[i].card[2]; - WBUFW(buf,n*18+20)=stor->storage_[i].card[3]; - n++; - } - if(n){ - WBUFW(buf,2)=4+n*18; - WFIFOSET(fd,WFIFOW(fd,2)); - } - return 0; +int clif_guildstorageitemlist (struct map_session_data *sd, + struct guild_storage *stor) +{ + struct item_data *id; + int i, n, fd; + unsigned char *buf; + + nullpo_retr (0, sd); + nullpo_retr (0, stor); + + fd = sd->fd; + buf = WFIFOP (fd, 0); + + WBUFW (buf, 0) = 0x1f0; + for (i = 0, n = 0; i < MAX_GUILD_STORAGE; i++) + { + if (stor->storage_[i].nameid <= 0) + continue; + nullpo_retr (0, id = itemdb_search (stor->storage_[i].nameid)); + if (itemdb_isequip2 (id)) + continue; + + WBUFW (buf, n * 18 + 4) = i + 1; + if (id->view_id > 0) + WBUFW (buf, n * 18 + 6) = id->view_id; + else + WBUFW (buf, n * 18 + 6) = stor->storage_[i].nameid; + WBUFB (buf, n * 18 + 8) = id->type;; + WBUFB (buf, n * 18 + 9) = stor->storage_[i].identify; + WBUFW (buf, n * 18 + 10) = stor->storage_[i].amount; + WBUFW (buf, n * 18 + 12) = 0; + WBUFW (buf, n * 18 + 14) = stor->storage_[i].card[0]; + WBUFW (buf, n * 18 + 16) = stor->storage_[i].card[1]; + WBUFW (buf, n * 18 + 18) = stor->storage_[i].card[2]; + WBUFW (buf, n * 18 + 20) = stor->storage_[i].card[3]; + n++; + } + if (n) + { + WBUFW (buf, 2) = 4 + n * 18; + WFIFOSET (fd, WFIFOW (fd, 2)); + } + return 0; } /*========================================== * *------------------------------------------ */ -int clif_guildstorageequiplist(struct map_session_data *sd,struct guild_storage *stor) -{ - struct item_data *id; - int i,j,n,fd; - unsigned char *buf; - - nullpo_retr(0, sd); - - fd=sd->fd; - buf=WFIFOP(fd,0); - - WBUFW(buf,0)=0xa6; - for(i=0,n=0;i<MAX_GUILD_STORAGE;i++){ - if(stor->storage_[i].nameid<=0) - continue; - nullpo_retr(0, id = itemdb_search(stor->storage_[i].nameid)); - if(!itemdb_isequip2(id)) - continue; - WBUFW(buf,n*20+4)=i+1; - if(id->view_id > 0) - WBUFW(buf,n*20+6)=id->view_id; - else - WBUFW(buf,n*20+6)=stor->storage_[i].nameid; - WBUFB(buf,n*20+8)=id->type; - WBUFB(buf,n*20+9)=stor->storage_[i].identify; - WBUFW(buf,n*20+10)=id->equip; - WBUFW(buf,n*20+12)=stor->storage_[i].equip; - if(stor->storage_[i].broken==1) - WBUFB(buf,n*20+14)=1; // is weapon broken [Valaris] - else - WBUFB(buf,n*20+14)=stor->storage_[i].attribute; - WBUFB(buf,n*20+15)=stor->storage_[i].refine; - if(stor->storage_[i].card[0]==0x00ff || stor->storage_[i].card[0]==0x00fe || stor->storage_[i].card[0]==(short)0xff00) { - WBUFW(buf,n*20+16)=stor->storage_[i].card[0]; - WBUFW(buf,n*20+18)=stor->storage_[i].card[1]; - WBUFW(buf,n*20+20)=stor->storage_[i].card[2]; - WBUFW(buf,n*20+22)=stor->storage_[i].card[3]; - } else { - if(stor->storage_[i].card[0] > 0 && (j=itemdb_viewid(stor->storage_[i].card[0])) > 0) - WBUFW(buf,n*20+16)=j; - else - WBUFW(buf,n*20+16)=stor->storage_[i].card[0]; - if(stor->storage_[i].card[1] > 0 && (j=itemdb_viewid(stor->storage_[i].card[1])) > 0) - WBUFW(buf,n*20+18)=j; - else - WBUFW(buf,n*20+18)=stor->storage_[i].card[1]; - if(stor->storage_[i].card[2] > 0 && (j=itemdb_viewid(stor->storage_[i].card[2])) > 0) - WBUFW(buf,n*20+20)=j; - else - WBUFW(buf,n*20+20)=stor->storage_[i].card[2]; - if(stor->storage_[i].card[3] > 0 && (j=itemdb_viewid(stor->storage_[i].card[3])) > 0) - WBUFW(buf,n*20+22)=j; - else - WBUFW(buf,n*20+22)=stor->storage_[i].card[3]; - } - n++; - } - if(n){ - WBUFW(buf,2)=4+n*20; - WFIFOSET(fd,WFIFOW(fd,2)); - } - return 0; +int clif_guildstorageequiplist (struct map_session_data *sd, + struct guild_storage *stor) +{ + struct item_data *id; + int i, j, n, fd; + unsigned char *buf; + + nullpo_retr (0, sd); + + fd = sd->fd; + buf = WFIFOP (fd, 0); + + WBUFW (buf, 0) = 0xa6; + for (i = 0, n = 0; i < MAX_GUILD_STORAGE; i++) + { + if (stor->storage_[i].nameid <= 0) + continue; + nullpo_retr (0, id = itemdb_search (stor->storage_[i].nameid)); + if (!itemdb_isequip2 (id)) + continue; + WBUFW (buf, n * 20 + 4) = i + 1; + if (id->view_id > 0) + WBUFW (buf, n * 20 + 6) = id->view_id; + else + WBUFW (buf, n * 20 + 6) = stor->storage_[i].nameid; + WBUFB (buf, n * 20 + 8) = id->type; + WBUFB (buf, n * 20 + 9) = stor->storage_[i].identify; + WBUFW (buf, n * 20 + 10) = id->equip; + WBUFW (buf, n * 20 + 12) = stor->storage_[i].equip; + if (stor->storage_[i].broken == 1) + WBUFB (buf, n * 20 + 14) = 1; // is weapon broken [Valaris] + else + WBUFB (buf, n * 20 + 14) = stor->storage_[i].attribute; + WBUFB (buf, n * 20 + 15) = stor->storage_[i].refine; + if (stor->storage_[i].card[0] == 0x00ff + || stor->storage_[i].card[0] == 0x00fe + || stor->storage_[i].card[0] == (short) 0xff00) + { + WBUFW (buf, n * 20 + 16) = stor->storage_[i].card[0]; + WBUFW (buf, n * 20 + 18) = stor->storage_[i].card[1]; + WBUFW (buf, n * 20 + 20) = stor->storage_[i].card[2]; + WBUFW (buf, n * 20 + 22) = stor->storage_[i].card[3]; + } + else + { + if (stor->storage_[i].card[0] > 0 + && (j = itemdb_viewid (stor->storage_[i].card[0])) > 0) + WBUFW (buf, n * 20 + 16) = j; + else + WBUFW (buf, n * 20 + 16) = stor->storage_[i].card[0]; + if (stor->storage_[i].card[1] > 0 + && (j = itemdb_viewid (stor->storage_[i].card[1])) > 0) + WBUFW (buf, n * 20 + 18) = j; + else + WBUFW (buf, n * 20 + 18) = stor->storage_[i].card[1]; + if (stor->storage_[i].card[2] > 0 + && (j = itemdb_viewid (stor->storage_[i].card[2])) > 0) + WBUFW (buf, n * 20 + 20) = j; + else + WBUFW (buf, n * 20 + 20) = stor->storage_[i].card[2]; + if (stor->storage_[i].card[3] > 0 + && (j = itemdb_viewid (stor->storage_[i].card[3])) > 0) + WBUFW (buf, n * 20 + 22) = j; + else + WBUFW (buf, n * 20 + 22) = stor->storage_[i].card[3]; + } + n++; + } + if (n) + { + WBUFW (buf, 2) = 4 + n * 20; + WFIFOSET (fd, WFIFOW (fd, 2)); + } + return 0; } /*========================================== @@ -2092,626 +2342,673 @@ int clif_guildstorageequiplist(struct map_session_data *sd,struct guild_storage * ソス\ソスソスソスソスソスpソスソスソスソスソスヘゑソスソスフ抵ソスソスナ計ソスZソスソスソスト托ソスソスソス *------------------------------------------ */ -int clif_updatestatus(struct map_session_data *sd,int type) -{ - int fd,len=8; - - nullpo_retr(0, sd); - - fd=sd->fd; - - WFIFOW(fd,0)=0xb0; - WFIFOW(fd,2)=type; - switch(type){ - // 00b0 - case SP_WEIGHT: - pc_checkweighticon(sd); - WFIFOW(fd,0)=0xb0; - WFIFOW(fd,2)=type; - WFIFOL(fd,4)=sd->weight; - break; - case SP_MAXWEIGHT: - WFIFOL(fd,4)=sd->max_weight; - break; - case SP_SPEED: - WFIFOL(fd,4)=sd->speed; - break; - case SP_BASELEVEL: - WFIFOL(fd,4)=sd->status.base_level; - break; - case SP_JOBLEVEL: - WFIFOL(fd,4)=0; - break; - case SP_MANNER: - WFIFOL(fd,4)=sd->status.manner; - clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner); - break; - case SP_STATUSPOINT: - WFIFOL(fd,4)=sd->status.status_point; - break; - case SP_SKILLPOINT: - WFIFOL(fd,4)=sd->status.skill_point; - break; - case SP_HIT: - WFIFOL(fd,4)=sd->hit; - break; - case SP_FLEE1: - WFIFOL(fd,4)=sd->flee; - break; - case SP_FLEE2: - WFIFOL(fd,4)=sd->flee2/10; - break; - case SP_MAXHP: - WFIFOL(fd,4)=sd->status.max_hp; - break; - case SP_MAXSP: - WFIFOL(fd,4)=sd->status.max_sp; - break; - case SP_HP: - WFIFOL(fd,4)=sd->status.hp; - break; - case SP_SP: - WFIFOL(fd,4)=sd->status.sp; - break; - case SP_ASPD: - WFIFOL(fd,4)=sd->aspd; - break; - case SP_ATK1: - WFIFOL(fd,4)=sd->base_atk+sd->watk; - break; - case SP_DEF1: - WFIFOL(fd,4)=sd->def; - break; - case SP_MDEF1: - WFIFOL(fd,4)=sd->mdef; - break; - case SP_ATK2: - WFIFOL(fd,4)=sd->watk2; - break; - case SP_DEF2: - WFIFOL(fd,4)=sd->def2; - break; - case SP_MDEF2: - WFIFOL(fd,4)=sd->mdef2; - break; - case SP_CRITICAL: - WFIFOL(fd,4)=sd->critical/10; - break; - case SP_MATK1: - WFIFOL(fd,4)=sd->matk1; - break; - case SP_MATK2: - WFIFOL(fd,4)=sd->matk2; - break; - - - case SP_ZENY: - trade_verifyzeny(sd); - WFIFOW(fd,0)=0xb1; - if(sd->status.zeny < 0) - sd->status.zeny = 0; - WFIFOL(fd,4)=sd->status.zeny; - break; - case SP_BASEEXP: - WFIFOW(fd,0)=0xb1; - WFIFOL(fd,4)=sd->status.base_exp; - break; - case SP_JOBEXP: - WFIFOW(fd,0)=0xb1; - WFIFOL(fd,4)=sd->status.job_exp; - break; - case SP_NEXTBASEEXP: - WFIFOW(fd,0)=0xb1; - WFIFOL(fd,4)=pc_nextbaseexp(sd); - break; - case SP_NEXTJOBEXP: - WFIFOW(fd,0)=0xb1; - WFIFOL(fd,4)=pc_nextjobexp(sd); - break; - - // 00be ソスIソスソス - case SP_USTR: - case SP_UAGI: - case SP_UVIT: - case SP_UINT: - case SP_UDEX: - case SP_ULUK: - WFIFOW(fd,0)=0xbe; - WFIFOB(fd,4)=pc_need_status_point(sd,type-SP_USTR+SP_STR); - len=5; - break; - - // 013a ソスIソスソス - case SP_ATTACKRANGE: - WFIFOW(fd,0)=0x13a; - WFIFOW(fd,2) = (sd->attack_spell_override) - ? sd->attack_spell_range - : sd->attackrange; - len=4; - break; - - // 0141 ソスIソスソス - case SP_STR: - WFIFOW(fd,0)=0x141; - WFIFOL(fd,2)=type; - WFIFOL(fd,6)=sd->status.str; - WFIFOL(fd,10)=sd->paramb[0] + sd->parame[0]; - len=14; - break; - case SP_AGI: - WFIFOW(fd,0)=0x141; - WFIFOL(fd,2)=type; - WFIFOL(fd,6)=sd->status.agi; - WFIFOL(fd,10)=sd->paramb[1] + sd->parame[1]; - len=14; - break; - case SP_VIT: - WFIFOW(fd,0)=0x141; - WFIFOL(fd,2)=type; - WFIFOL(fd,6)=sd->status.vit; - WFIFOL(fd,10)=sd->paramb[2] + sd->parame[2]; - len=14; - break; - case SP_INT: - WFIFOW(fd,0)=0x141; - WFIFOL(fd,2)=type; - WFIFOL(fd,6)=sd->status.int_; - WFIFOL(fd,10)=sd->paramb[3] + sd->parame[3]; - len=14; - break; - case SP_DEX: - WFIFOW(fd,0)=0x141; - WFIFOL(fd,2)=type; - WFIFOL(fd,6)=sd->status.dex; - WFIFOL(fd,10)=sd->paramb[4] + sd->parame[4]; - len=14; - break; - case SP_LUK: - WFIFOW(fd,0)=0x141; - WFIFOL(fd,2)=type; - WFIFOL(fd,6)=sd->status.luk; - WFIFOL(fd,10)=sd->paramb[5] + sd->parame[5]; - len=14; - break; - - case SP_CARTINFO: - WFIFOW(fd,0)=0x121; - WFIFOW(fd,2)=sd->cart_num; - WFIFOW(fd,4)=sd->cart_max_num; - WFIFOL(fd,6)=sd->cart_weight; - WFIFOL(fd,10)=sd->cart_max_weight; - len=14; - break; - - case SP_GM: - WFIFOL(fd,4)=pc_isGM(sd); - break; - - default: - if(battle_config.error_log) - printf("clif_updatestatus : make %d routine\n",type); - return 1; - } - WFIFOSET(fd,len); - - return 0; -} -int clif_changestatus(struct block_list *bl,int type,int val) -{ - unsigned char buf[12]; - struct map_session_data *sd = NULL; - - nullpo_retr(0, bl); - - if(bl->type == BL_PC) - sd = (struct map_session_data *)bl; +int clif_updatestatus (struct map_session_data *sd, int type) +{ + int fd, len = 8; + + nullpo_retr (0, sd); + + fd = sd->fd; + + WFIFOW (fd, 0) = 0xb0; + WFIFOW (fd, 2) = type; + switch (type) + { + // 00b0 + case SP_WEIGHT: + pc_checkweighticon (sd); + WFIFOW (fd, 0) = 0xb0; + WFIFOW (fd, 2) = type; + WFIFOL (fd, 4) = sd->weight; + break; + case SP_MAXWEIGHT: + WFIFOL (fd, 4) = sd->max_weight; + break; + case SP_SPEED: + WFIFOL (fd, 4) = sd->speed; + break; + case SP_BASELEVEL: + WFIFOL (fd, 4) = sd->status.base_level; + break; + case SP_JOBLEVEL: + WFIFOL (fd, 4) = 0; + break; + case SP_MANNER: + WFIFOL (fd, 4) = sd->status.manner; + clif_changestatus (&sd->bl, SP_MANNER, sd->status.manner); + break; + case SP_STATUSPOINT: + WFIFOL (fd, 4) = sd->status.status_point; + break; + case SP_SKILLPOINT: + WFIFOL (fd, 4) = sd->status.skill_point; + break; + case SP_HIT: + WFIFOL (fd, 4) = sd->hit; + break; + case SP_FLEE1: + WFIFOL (fd, 4) = sd->flee; + break; + case SP_FLEE2: + WFIFOL (fd, 4) = sd->flee2 / 10; + break; + case SP_MAXHP: + WFIFOL (fd, 4) = sd->status.max_hp; + break; + case SP_MAXSP: + WFIFOL (fd, 4) = sd->status.max_sp; + break; + case SP_HP: + WFIFOL (fd, 4) = sd->status.hp; + break; + case SP_SP: + WFIFOL (fd, 4) = sd->status.sp; + break; + case SP_ASPD: + WFIFOL (fd, 4) = sd->aspd; + break; + case SP_ATK1: + WFIFOL (fd, 4) = sd->base_atk + sd->watk; + break; + case SP_DEF1: + WFIFOL (fd, 4) = sd->def; + break; + case SP_MDEF1: + WFIFOL (fd, 4) = sd->mdef; + break; + case SP_ATK2: + WFIFOL (fd, 4) = sd->watk2; + break; + case SP_DEF2: + WFIFOL (fd, 4) = sd->def2; + break; + case SP_MDEF2: + WFIFOL (fd, 4) = sd->mdef2; + break; + case SP_CRITICAL: + WFIFOL (fd, 4) = sd->critical / 10; + break; + case SP_MATK1: + WFIFOL (fd, 4) = sd->matk1; + break; + case SP_MATK2: + WFIFOL (fd, 4) = sd->matk2; + break; + + case SP_ZENY: + trade_verifyzeny (sd); + WFIFOW (fd, 0) = 0xb1; + if (sd->status.zeny < 0) + sd->status.zeny = 0; + WFIFOL (fd, 4) = sd->status.zeny; + break; + case SP_BASEEXP: + WFIFOW (fd, 0) = 0xb1; + WFIFOL (fd, 4) = sd->status.base_exp; + break; + case SP_JOBEXP: + WFIFOW (fd, 0) = 0xb1; + WFIFOL (fd, 4) = sd->status.job_exp; + break; + case SP_NEXTBASEEXP: + WFIFOW (fd, 0) = 0xb1; + WFIFOL (fd, 4) = pc_nextbaseexp (sd); + break; + case SP_NEXTJOBEXP: + WFIFOW (fd, 0) = 0xb1; + WFIFOL (fd, 4) = pc_nextjobexp (sd); + break; + + // 00be ソスIソスソス + case SP_USTR: + case SP_UAGI: + case SP_UVIT: + case SP_UINT: + case SP_UDEX: + case SP_ULUK: + WFIFOW (fd, 0) = 0xbe; + WFIFOB (fd, 4) = + pc_need_status_point (sd, type - SP_USTR + SP_STR); + len = 5; + break; + + // 013a ソスIソスソス + case SP_ATTACKRANGE: + WFIFOW (fd, 0) = 0x13a; + WFIFOW (fd, 2) = (sd->attack_spell_override) + ? sd->attack_spell_range : sd->attackrange; + len = 4; + break; + + // 0141 ソスIソスソス + case SP_STR: + WFIFOW (fd, 0) = 0x141; + WFIFOL (fd, 2) = type; + WFIFOL (fd, 6) = sd->status.str; + WFIFOL (fd, 10) = sd->paramb[0] + sd->parame[0]; + len = 14; + break; + case SP_AGI: + WFIFOW (fd, 0) = 0x141; + WFIFOL (fd, 2) = type; + WFIFOL (fd, 6) = sd->status.agi; + WFIFOL (fd, 10) = sd->paramb[1] + sd->parame[1]; + len = 14; + break; + case SP_VIT: + WFIFOW (fd, 0) = 0x141; + WFIFOL (fd, 2) = type; + WFIFOL (fd, 6) = sd->status.vit; + WFIFOL (fd, 10) = sd->paramb[2] + sd->parame[2]; + len = 14; + break; + case SP_INT: + WFIFOW (fd, 0) = 0x141; + WFIFOL (fd, 2) = type; + WFIFOL (fd, 6) = sd->status.int_; + WFIFOL (fd, 10) = sd->paramb[3] + sd->parame[3]; + len = 14; + break; + case SP_DEX: + WFIFOW (fd, 0) = 0x141; + WFIFOL (fd, 2) = type; + WFIFOL (fd, 6) = sd->status.dex; + WFIFOL (fd, 10) = sd->paramb[4] + sd->parame[4]; + len = 14; + break; + case SP_LUK: + WFIFOW (fd, 0) = 0x141; + WFIFOL (fd, 2) = type; + WFIFOL (fd, 6) = sd->status.luk; + WFIFOL (fd, 10) = sd->paramb[5] + sd->parame[5]; + len = 14; + break; + + case SP_CARTINFO: + WFIFOW (fd, 0) = 0x121; + WFIFOW (fd, 2) = sd->cart_num; + WFIFOW (fd, 4) = sd->cart_max_num; + WFIFOL (fd, 6) = sd->cart_weight; + WFIFOL (fd, 10) = sd->cart_max_weight; + len = 14; + break; + + case SP_GM: + WFIFOL (fd, 4) = pc_isGM (sd); + break; + + default: + if (battle_config.error_log) + printf ("clif_updatestatus : make %d routine\n", type); + return 1; + } + WFIFOSET (fd, len); + + return 0; +} + +int clif_changestatus (struct block_list *bl, int type, int val) +{ + unsigned char buf[12]; + struct map_session_data *sd = NULL; + + nullpo_retr (0, bl); + + if (bl->type == BL_PC) + sd = (struct map_session_data *) bl; //printf("clif_changestatus id:%d type:%d val:%d\n",bl->id,type,val); - if(sd){ - WBUFW(buf,0)=0x1ab; - WBUFL(buf,2)=bl->id; - WBUFW(buf,6)=type; - switch(type){ - case SP_MANNER: - WBUFL(buf,8)=val; - break; - default: - if(battle_config.error_log) - printf("clif_changestatus : make %d routine\n",type); - return 1; - } - clif_send(buf,packet_len_table[0x1ab],bl,AREA_WOS); - } - return 0; + if (sd) + { + WBUFW (buf, 0) = 0x1ab; + WBUFL (buf, 2) = bl->id; + WBUFW (buf, 6) = type; + switch (type) + { + case SP_MANNER: + WBUFL (buf, 8) = val; + break; + default: + if (battle_config.error_log) + printf ("clif_changestatus : make %d routine\n", type); + return 1; + } + clif_send (buf, packet_len_table[0x1ab], bl, AREA_WOS); + } + return 0; } + /*========================================== * *------------------------------------------ */ -int clif_changelook(struct block_list *bl,int type,int val) +int clif_changelook (struct block_list *bl, int type, int val) { - return clif_changelook_towards(bl, type, val, NULL); + return clif_changelook_towards (bl, type, val, NULL); } -int clif_changelook_towards(struct block_list *bl,int type,int val, struct map_session_data *dstsd) +int clif_changelook_towards (struct block_list *bl, int type, int val, + struct map_session_data *dstsd) { - unsigned char rbuf[32]; - unsigned char *buf = dstsd ? WFIFOP(dstsd->fd, 0) : rbuf; // pick target buffer or general-purpose one - struct map_session_data *sd = NULL; - - nullpo_retr(0, bl); + unsigned char rbuf[32]; + unsigned char *buf = dstsd ? WFIFOP (dstsd->fd, 0) : rbuf; // pick target buffer or general-purpose one + struct map_session_data *sd = NULL; - if(bl->type == BL_PC) - sd = (struct map_session_data *)bl; + nullpo_retr (0, bl); - if(sd && sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris] - return 0; + if (bl->type == BL_PC) + sd = (struct map_session_data *) bl; - if (sd && sd->status.option & OPTION_INVISIBILITY) - return 0; + if (sd && sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris] + return 0; - if(sd && (type == LOOK_WEAPON || type == LOOK_SHIELD || type >= LOOK_SHOES)) { - WBUFW(buf,0)=0x1d7; - WBUFL(buf,2)=bl->id; - if(type >= LOOK_SHOES) { - int equip_point = equip_points[type]; + if (sd && sd->status.option & OPTION_INVISIBILITY) + return 0; - WBUFB(buf,6) = type; - if(sd->equip_index[equip_point] >= 0 && sd->inventory_data[sd->equip_index[2]]) { - if(sd->inventory_data[sd->equip_index[equip_point]]->view_id > 0) - WBUFW(buf,7)=sd->inventory_data[sd->equip_index[equip_point]]->view_id; - else - WBUFW(buf,7)=sd->status.inventory[sd->equip_index[equip_point]].nameid; - } else - WBUFW(buf,7)=0; - WBUFW(buf,9)=0; - } - else { - WBUFB(buf,6)=2; - if (sd->attack_spell_override) - WBUFW(buf, 7) = sd->attack_spell_look_override; - else { - if(sd->equip_index[9] >= 0 && sd->inventory_data[sd->equip_index[9]] && sd->view_class != 22) { - if(sd->inventory_data[sd->equip_index[9]]->view_id > 0) - WBUFW(buf,7)=sd->inventory_data[sd->equip_index[9]]->view_id; - else - WBUFW(buf,7)=sd->status.inventory[sd->equip_index[9]].nameid; - } else - WBUFW(buf,7)=0; - } - if(sd->equip_index[8] >= 0 && sd->equip_index[8] != sd->equip_index[9] && sd->inventory_data[sd->equip_index[8]] && - sd->view_class != 22) { - if(sd->inventory_data[sd->equip_index[8]]->view_id > 0) - WBUFW(buf,9)=sd->inventory_data[sd->equip_index[8]]->view_id; - else - WBUFW(buf,9)=sd->status.inventory[sd->equip_index[8]].nameid; - } else - WBUFW(buf,9)=0; - } - if (dstsd) - WFIFOSET(dstsd->fd, packet_len_table[0x1d7]); + if (sd + && (type == LOOK_WEAPON || type == LOOK_SHIELD || type >= LOOK_SHOES)) + { + WBUFW (buf, 0) = 0x1d7; + WBUFL (buf, 2) = bl->id; + if (type >= LOOK_SHOES) + { + int equip_point = equip_points[type]; + + WBUFB (buf, 6) = type; + if (sd->equip_index[equip_point] >= 0 + && sd->inventory_data[sd->equip_index[2]]) + { + if (sd-> + inventory_data[sd->equip_index[equip_point]]->view_id > 0) + WBUFW (buf, 7) = + sd->inventory_data[sd-> + equip_index[equip_point]]->view_id; else - clif_send(buf, packet_len_table[0x1d7], bl, AREA); - } - else { - WBUFW(buf,0)=0x1d7; - WBUFL(buf,2)=bl->id; - WBUFB(buf,6)=type; - WBUFW(buf,7)=val; - WBUFW(buf,9)=0; - if (dstsd) - WFIFOSET(dstsd->fd, packet_len_table[0x1d7]); + WBUFW (buf, 7) = + sd->status.inventory[sd-> + equip_index[equip_point]].nameid; + } + else + WBUFW (buf, 7) = 0; + WBUFW (buf, 9) = 0; + } + else + { + WBUFB (buf, 6) = 2; + if (sd->attack_spell_override) + WBUFW (buf, 7) = sd->attack_spell_look_override; + else + { + if (sd->equip_index[9] >= 0 + && sd->inventory_data[sd->equip_index[9]] + && sd->view_class != 22) + { + if (sd->inventory_data[sd->equip_index[9]]->view_id > 0) + WBUFW (buf, 7) = + sd->inventory_data[sd->equip_index[9]]->view_id; + else + WBUFW (buf, 7) = + sd->status.inventory[sd->equip_index[9]].nameid; + } else - clif_send(buf, packet_len_table[0x1d7], bl, AREA); - } - return 0; + WBUFW (buf, 7) = 0; + } + if (sd->equip_index[8] >= 0 + && sd->equip_index[8] != sd->equip_index[9] + && sd->inventory_data[sd->equip_index[8]] + && sd->view_class != 22) + { + if (sd->inventory_data[sd->equip_index[8]]->view_id > 0) + WBUFW (buf, 9) = + sd->inventory_data[sd->equip_index[8]]->view_id; + else + WBUFW (buf, 9) = + sd->status.inventory[sd->equip_index[8]].nameid; + } + else + WBUFW (buf, 9) = 0; + } + if (dstsd) + WFIFOSET (dstsd->fd, packet_len_table[0x1d7]); + else + clif_send (buf, packet_len_table[0x1d7], bl, AREA); + } + else + { + WBUFW (buf, 0) = 0x1d7; + WBUFL (buf, 2) = bl->id; + WBUFB (buf, 6) = type; + WBUFW (buf, 7) = val; + WBUFW (buf, 9) = 0; + if (dstsd) + WFIFOSET (dstsd->fd, packet_len_table[0x1d7]); + else + clif_send (buf, packet_len_table[0x1d7], bl, AREA); + } + return 0; } /*========================================== * *------------------------------------------ */ -int clif_initialstatus(struct map_session_data *sd) -{ - int fd; - unsigned char *buf; - - nullpo_retr(0, sd); - - fd=sd->fd; - buf=WFIFOP(fd,0); - - WBUFW(buf,0)=0xbd; - WBUFW(buf,2)=sd->status.status_point; - WBUFB(buf,4)=(sd->status.str > 255)? 255:sd->status.str; - WBUFB(buf,5)=pc_need_status_point(sd,SP_STR); - WBUFB(buf,6)=(sd->status.agi > 255)? 255:sd->status.agi; - WBUFB(buf,7)=pc_need_status_point(sd,SP_AGI); - WBUFB(buf,8)=(sd->status.vit > 255)? 255:sd->status.vit; - WBUFB(buf,9)=pc_need_status_point(sd,SP_VIT); - WBUFB(buf,10)=(sd->status.int_ > 255)? 255:sd->status.int_; - WBUFB(buf,11)=pc_need_status_point(sd,SP_INT); - WBUFB(buf,12)=(sd->status.dex > 255)? 255:sd->status.dex; - WBUFB(buf,13)=pc_need_status_point(sd,SP_DEX); - WBUFB(buf,14)=(sd->status.luk > 255)? 255:sd->status.luk; - WBUFB(buf,15)=pc_need_status_point(sd,SP_LUK); - - WBUFW(buf,16) = sd->base_atk + sd->watk; - WBUFW(buf,18) = sd->watk2; //atk bonus - WBUFW(buf,20) = sd->matk1; - WBUFW(buf,22) = sd->matk2; - WBUFW(buf,24) = sd->def; // def - WBUFW(buf,26) = sd->def2; - WBUFW(buf,28) = sd->mdef; // mdef - WBUFW(buf,30) = sd->mdef2; - WBUFW(buf,32) = sd->hit; - WBUFW(buf,34) = sd->flee; - WBUFW(buf,36) = sd->flee2/10; - WBUFW(buf,38) = sd->critical/10; - WBUFW(buf,40) = sd->status.karma; - WBUFW(buf,42) = sd->status.manner; - - WFIFOSET(fd,packet_len_table[0xbd]); - - clif_updatestatus(sd,SP_STR); - clif_updatestatus(sd,SP_AGI); - clif_updatestatus(sd,SP_VIT); - clif_updatestatus(sd,SP_INT); - clif_updatestatus(sd,SP_DEX); - clif_updatestatus(sd,SP_LUK); - - clif_updatestatus(sd,SP_ATTACKRANGE); - clif_updatestatus(sd,SP_ASPD); +int clif_initialstatus (struct map_session_data *sd) +{ + int fd; + unsigned char *buf; - return 0; + nullpo_retr (0, sd); + + fd = sd->fd; + buf = WFIFOP (fd, 0); + + WBUFW (buf, 0) = 0xbd; + WBUFW (buf, 2) = sd->status.status_point; + WBUFB (buf, 4) = (sd->status.str > 255) ? 255 : sd->status.str; + WBUFB (buf, 5) = pc_need_status_point (sd, SP_STR); + WBUFB (buf, 6) = (sd->status.agi > 255) ? 255 : sd->status.agi; + WBUFB (buf, 7) = pc_need_status_point (sd, SP_AGI); + WBUFB (buf, 8) = (sd->status.vit > 255) ? 255 : sd->status.vit; + WBUFB (buf, 9) = pc_need_status_point (sd, SP_VIT); + WBUFB (buf, 10) = (sd->status.int_ > 255) ? 255 : sd->status.int_; + WBUFB (buf, 11) = pc_need_status_point (sd, SP_INT); + WBUFB (buf, 12) = (sd->status.dex > 255) ? 255 : sd->status.dex; + WBUFB (buf, 13) = pc_need_status_point (sd, SP_DEX); + WBUFB (buf, 14) = (sd->status.luk > 255) ? 255 : sd->status.luk; + WBUFB (buf, 15) = pc_need_status_point (sd, SP_LUK); + + WBUFW (buf, 16) = sd->base_atk + sd->watk; + WBUFW (buf, 18) = sd->watk2; //atk bonus + WBUFW (buf, 20) = sd->matk1; + WBUFW (buf, 22) = sd->matk2; + WBUFW (buf, 24) = sd->def; // def + WBUFW (buf, 26) = sd->def2; + WBUFW (buf, 28) = sd->mdef; // mdef + WBUFW (buf, 30) = sd->mdef2; + WBUFW (buf, 32) = sd->hit; + WBUFW (buf, 34) = sd->flee; + WBUFW (buf, 36) = sd->flee2 / 10; + WBUFW (buf, 38) = sd->critical / 10; + WBUFW (buf, 40) = sd->status.karma; + WBUFW (buf, 42) = sd->status.manner; + + WFIFOSET (fd, packet_len_table[0xbd]); + + clif_updatestatus (sd, SP_STR); + clif_updatestatus (sd, SP_AGI); + clif_updatestatus (sd, SP_VIT); + clif_updatestatus (sd, SP_INT); + clif_updatestatus (sd, SP_DEX); + clif_updatestatus (sd, SP_LUK); + + clif_updatestatus (sd, SP_ATTACKRANGE); + clif_updatestatus (sd, SP_ASPD); + + return 0; } /*========================================== *ソス装ソスソス *------------------------------------------ */ -int clif_arrowequip(struct map_session_data *sd,int val) +int clif_arrowequip (struct map_session_data *sd, int val) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->attacktarget && sd->attacktarget > 0) // [Valaris] - sd->attacktarget = 0; + if (sd->attacktarget && sd->attacktarget > 0) // [Valaris] + sd->attacktarget = 0; - fd=sd->fd; - WFIFOW(fd,0)=0x013c; - WFIFOW(fd,2)=val+2;//ソスソスソスフアソスCソスeソスソスID + fd = sd->fd; + WFIFOW (fd, 0) = 0x013c; + WFIFOW (fd, 2) = val + 2; //ソスソスソスフアソスCソスeソスソスID - WFIFOSET(fd,packet_len_table[0x013c]); + WFIFOSET (fd, packet_len_table[0x013c]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_arrow_fail(struct map_session_data *sd,int type) +int clif_arrow_fail (struct map_session_data *sd, int type) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x013b; - WFIFOW(fd,2)=type; + fd = sd->fd; + WFIFOW (fd, 0) = 0x013b; + WFIFOW (fd, 2) = type; - WFIFOSET(fd,packet_len_table[0x013b]); + WFIFOSET (fd, packet_len_table[0x013b]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_statusupack(struct map_session_data *sd,int type,int ok,int val) +int clif_statusupack (struct map_session_data *sd, int type, int ok, int val) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xbc; - WFIFOW(fd,2)=type; - WFIFOB(fd,4)=ok; - WFIFOB(fd,5)=val; - WFIFOSET(fd,packet_len_table[0xbc]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xbc; + WFIFOW (fd, 2) = type; + WFIFOB (fd, 4) = ok; + WFIFOB (fd, 5) = val; + WFIFOSET (fd, packet_len_table[0xbc]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_equipitemack(struct map_session_data *sd,int n,int pos,int ok) +int clif_equipitemack (struct map_session_data *sd, int n, int pos, int ok) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xaa; - WFIFOW(fd,2)=n+2; - WFIFOW(fd,4)=pos; - WFIFOB(fd,6)=ok; - WFIFOSET(fd,packet_len_table[0xaa]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xaa; + WFIFOW (fd, 2) = n + 2; + WFIFOW (fd, 4) = pos; + WFIFOB (fd, 6) = ok; + WFIFOSET (fd, packet_len_table[0xaa]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_unequipitemack(struct map_session_data *sd,int n,int pos,int ok) +int clif_unequipitemack (struct map_session_data *sd, int n, int pos, int ok) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xac; - WFIFOW(fd,2)=n+2; - WFIFOW(fd,4)=pos; - WFIFOB(fd,6)=ok; - WFIFOSET(fd,packet_len_table[0xac]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xac; + WFIFOW (fd, 2) = n + 2; + WFIFOW (fd, 4) = pos; + WFIFOB (fd, 6) = ok; + WFIFOSET (fd, packet_len_table[0xac]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_misceffect(struct block_list* bl,int type) +int clif_misceffect (struct block_list *bl, int type) { - char buf[32]; + char buf[32]; - nullpo_retr(0, bl); + nullpo_retr (0, bl); - WBUFW(buf,0) = 0x19b; - WBUFL(buf,2) = bl->id; - WBUFL(buf,6) = type; + WBUFW (buf, 0) = 0x19b; + WBUFL (buf, 2) = bl->id; + WBUFL (buf, 6) = type; - clif_send(buf,packet_len_table[0x19b],bl,AREA); + clif_send (buf, packet_len_table[0x19b], bl, AREA); - return 0; + return 0; } + /*========================================== * ソス\ソスソスソスIソスvソスVソスソスソスソスソスマ更 *------------------------------------------ */ -int clif_changeoption(struct block_list* bl) -{ - char buf[32]; - short option; - struct status_change *sc_data; - static const int omask[]={ 0x10,0x20 }; - static const int scnum[]={ SC_FALCON, SC_RIDING }; - int i; - - nullpo_retr(0, bl); - - option = *battle_get_option(bl); - sc_data = battle_get_sc_data(bl); - - WBUFW(buf,0) = 0x119; - WBUFL(buf,2) = bl->id; - WBUFW(buf,6) = *battle_get_opt1(bl); - WBUFW(buf,8) = *battle_get_opt2(bl); - WBUFW(buf,10) = option; - WBUFB(buf,12) = 0; // ?? - - if(bl->type==BL_PC) { // disguises [Valaris] - struct map_session_data *sd=((struct map_session_data *)bl); - if(sd && sd->disguise > 23 && sd->disguise < 4001) { - clif_send(buf,packet_len_table[0x119],bl,AREA_WOS); - clif_spawnpc(sd); - } else - clif_send(buf,packet_len_table[0x119],bl,AREA); - } else - clif_send(buf,packet_len_table[0x119],bl,AREA); - - // ソスAソスCソスRソスソスソスフ表ソスソス - for(i=0;i<sizeof(omask)/sizeof(omask[0]);i++){ - if( option&omask[i] ){ - if( sc_data[scnum[i]].timer==-1) - skill_status_change_start(bl,scnum[i],0,0,0,0,0,0); - } else { - skill_status_change_end(bl,scnum[i],-1); - } - } +int clif_changeoption (struct block_list *bl) +{ + char buf[32]; + short option; + struct status_change *sc_data; + static const int omask[] = { 0x10, 0x20 }; + static const int scnum[] = { SC_FALCON, SC_RIDING }; + int i; - return 0; + nullpo_retr (0, bl); + + option = *battle_get_option (bl); + sc_data = battle_get_sc_data (bl); + + WBUFW (buf, 0) = 0x119; + WBUFL (buf, 2) = bl->id; + WBUFW (buf, 6) = *battle_get_opt1 (bl); + WBUFW (buf, 8) = *battle_get_opt2 (bl); + WBUFW (buf, 10) = option; + WBUFB (buf, 12) = 0; // ?? + + if (bl->type == BL_PC) + { // disguises [Valaris] + struct map_session_data *sd = ((struct map_session_data *) bl); + if (sd && sd->disguise > 23 && sd->disguise < 4001) + { + clif_send (buf, packet_len_table[0x119], bl, AREA_WOS); + clif_spawnpc (sd); + } + else + clif_send (buf, packet_len_table[0x119], bl, AREA); + } + else + clif_send (buf, packet_len_table[0x119], bl, AREA); + + // ソスAソスCソスRソスソスソスフ表ソスソス + for (i = 0; i < sizeof (omask) / sizeof (omask[0]); i++) + { + if (option & omask[i]) + { + if (sc_data[scnum[i]].timer == -1) + skill_status_change_start (bl, scnum[i], 0, 0, 0, 0, 0, 0); + } + else + { + skill_status_change_end (bl, scnum[i], -1); + } + } + + return 0; } /*========================================== * *------------------------------------------ */ -int clif_useitemack(struct map_session_data *sd,int index,int amount,int ok) +int clif_useitemack (struct map_session_data *sd, int index, int amount, + int ok) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(!ok) { - int fd=sd->fd; - WFIFOW(fd,0)=0xa8; - WFIFOW(fd,2)=index+2; - WFIFOW(fd,4)=amount; - WFIFOB(fd,6)=ok; - WFIFOSET(fd,packet_len_table[0xa8]); - } - else { - char buf[32]; - - WBUFW(buf,0)=0x1c8; - WBUFW(buf,2)=index+2; - if(sd->inventory_data[index] && sd->inventory_data[index]->view_id > 0) - WBUFW(buf,4)=sd->inventory_data[index]->view_id; - else - WBUFW(buf,4)=sd->status.inventory[index].nameid; - WBUFL(buf,6)=sd->bl.id; - WBUFW(buf,10)=amount; - WBUFB(buf,12)=ok; - clif_send(buf,packet_len_table[0x1c8],&sd->bl,SELF); - } + if (!ok) + { + int fd = sd->fd; + WFIFOW (fd, 0) = 0xa8; + WFIFOW (fd, 2) = index + 2; + WFIFOW (fd, 4) = amount; + WFIFOB (fd, 6) = ok; + WFIFOSET (fd, packet_len_table[0xa8]); + } + else + { + char buf[32]; - return 0; + WBUFW (buf, 0) = 0x1c8; + WBUFW (buf, 2) = index + 2; + if (sd->inventory_data[index] + && sd->inventory_data[index]->view_id > 0) + WBUFW (buf, 4) = sd->inventory_data[index]->view_id; + else + WBUFW (buf, 4) = sd->status.inventory[index].nameid; + WBUFL (buf, 6) = sd->bl.id; + WBUFW (buf, 10) = amount; + WBUFB (buf, 12) = ok; + clif_send (buf, packet_len_table[0x1c8], &sd->bl, SELF); + } + + return 0; } /*========================================== * *------------------------------------------ */ -int clif_createchat(struct map_session_data *sd,int fail) +int clif_createchat (struct map_session_data *sd, int fail) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xd6; - WFIFOB(fd,2)=fail; - WFIFOSET(fd,packet_len_table[0xd6]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xd6; + WFIFOB (fd, 2) = fail; + WFIFOSET (fd, packet_len_table[0xd6]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_dispchat(struct chat_data *cd,int fd) +int clif_dispchat (struct chat_data *cd, int fd) { - char buf[128]; // ソスナ托ソスtitle(60ソスoソスCソスg)+17 + char buf[128]; // ソスナ托ソスtitle(60ソスoソスCソスg)+17 - if(cd==NULL || *cd->owner==NULL) - return 1; + if (cd == NULL || *cd->owner == NULL) + return 1; - WBUFW(buf,0)=0xd7; - WBUFW(buf,2)=strlen(cd->title)+17; - WBUFL(buf,4)=(*cd->owner)->id; - WBUFL(buf,8)=cd->bl.id; - WBUFW(buf,12)=cd->limit; - WBUFW(buf,14)=cd->users; - WBUFB(buf,16)=cd->pub; - strcpy(WBUFP(buf,17),cd->title); - if(fd){ - memcpy(WFIFOP(fd,0),buf,WBUFW(buf,2)); - WFIFOSET(fd,WBUFW(buf,2)); - } else { - clif_send(buf,WBUFW(buf,2),*cd->owner,AREA_WOSC); - } + WBUFW (buf, 0) = 0xd7; + WBUFW (buf, 2) = strlen (cd->title) + 17; + WBUFL (buf, 4) = (*cd->owner)->id; + WBUFL (buf, 8) = cd->bl.id; + WBUFW (buf, 12) = cd->limit; + WBUFW (buf, 14) = cd->users; + WBUFB (buf, 16) = cd->pub; + strcpy (WBUFP (buf, 17), cd->title); + if (fd) + { + memcpy (WFIFOP (fd, 0), buf, WBUFW (buf, 2)); + WFIFOSET (fd, WBUFW (buf, 2)); + } + else + { + clif_send (buf, WBUFW (buf, 2), *cd->owner, AREA_WOSC); + } - return 0; + return 0; } /*========================================== @@ -2719,523 +3016,568 @@ int clif_dispchat(struct chat_data *cd,int fd) * ソスOソスソスソスフ人ソスpソスニ厄ソスソス゚コソス[ソスh(d7->df)ソスソスソス痰、ソスソスソスソス *------------------------------------------ */ -int clif_changechatstatus(struct chat_data *cd) +int clif_changechatstatus (struct chat_data *cd) { - char buf[128]; // ソスナ托ソスtitle(60ソスoソスCソスg)+17 + char buf[128]; // ソスナ托ソスtitle(60ソスoソスCソスg)+17 - if(cd==NULL || cd->usersd[0]==NULL) - return 1; + if (cd == NULL || cd->usersd[0] == NULL) + return 1; - WBUFW(buf,0)=0xdf; - WBUFW(buf,2)=strlen(cd->title)+17; - WBUFL(buf,4)=cd->usersd[0]->bl.id; - WBUFL(buf,8)=cd->bl.id; - WBUFW(buf,12)=cd->limit; - WBUFW(buf,14)=cd->users; - WBUFB(buf,16)=cd->pub; - strcpy(WBUFP(buf,17),cd->title); - clif_send(buf,WBUFW(buf,2),&cd->usersd[0]->bl,CHAT); + WBUFW (buf, 0) = 0xdf; + WBUFW (buf, 2) = strlen (cd->title) + 17; + WBUFL (buf, 4) = cd->usersd[0]->bl.id; + WBUFL (buf, 8) = cd->bl.id; + WBUFW (buf, 12) = cd->limit; + WBUFW (buf, 14) = cd->users; + WBUFB (buf, 16) = cd->pub; + strcpy (WBUFP (buf, 17), cd->title); + clif_send (buf, WBUFW (buf, 2), &cd->usersd[0]->bl, CHAT); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_clearchat(struct chat_data *cd,int fd) +int clif_clearchat (struct chat_data *cd, int fd) { - char buf[32]; + char buf[32]; - nullpo_retr(0, cd); + nullpo_retr (0, cd); - WBUFW(buf,0)=0xd8; - WBUFL(buf,2)=cd->bl.id; - if(fd){ - memcpy(WFIFOP(fd,0),buf,packet_len_table[0xd8]); - WFIFOSET(fd,packet_len_table[0xd8]); - } else { - clif_send(buf,packet_len_table[0xd8],*cd->owner,AREA_WOSC); - } + WBUFW (buf, 0) = 0xd8; + WBUFL (buf, 2) = cd->bl.id; + if (fd) + { + memcpy (WFIFOP (fd, 0), buf, packet_len_table[0xd8]); + WFIFOSET (fd, packet_len_table[0xd8]); + } + else + { + clif_send (buf, packet_len_table[0xd8], *cd->owner, AREA_WOSC); + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_joinchatfail(struct map_session_data *sd,int fail) +int clif_joinchatfail (struct map_session_data *sd, int fail) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; + fd = sd->fd; - WFIFOW(fd,0)=0xda; - WFIFOB(fd,2)=fail; - WFIFOSET(fd,packet_len_table[0xda]); + WFIFOW (fd, 0) = 0xda; + WFIFOB (fd, 2) = fail; + WFIFOSET (fd, packet_len_table[0xda]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_joinchatok(struct map_session_data *sd,struct chat_data* cd) +int clif_joinchatok (struct map_session_data *sd, struct chat_data *cd) { - int fd; - int i; + int fd; + int i; - nullpo_retr(0, sd); - nullpo_retr(0, cd); + nullpo_retr (0, sd); + nullpo_retr (0, cd); - fd=sd->fd; - WFIFOW(fd,0)=0xdb; - WFIFOW(fd,2)=8+(28*cd->users); - WFIFOL(fd,4)=cd->bl.id; - for(i = 0;i < cd->users;i++){ - WFIFOL(fd,8+i*28) = (i!=0)||((*cd->owner)->type==BL_NPC); - memcpy(WFIFOP(fd,8+i*28+4),cd->usersd[i]->status.name,24); - } - WFIFOSET(fd,WFIFOW(fd,2)); + fd = sd->fd; + WFIFOW (fd, 0) = 0xdb; + WFIFOW (fd, 2) = 8 + (28 * cd->users); + WFIFOL (fd, 4) = cd->bl.id; + for (i = 0; i < cd->users; i++) + { + WFIFOL (fd, 8 + i * 28) = (i != 0) || ((*cd->owner)->type == BL_NPC); + memcpy (WFIFOP (fd, 8 + i * 28 + 4), cd->usersd[i]->status.name, 24); + } + WFIFOSET (fd, WFIFOW (fd, 2)); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_addchat(struct chat_data* cd,struct map_session_data *sd) +int clif_addchat (struct chat_data *cd, struct map_session_data *sd) { - char buf[32]; + char buf[32]; - nullpo_retr(0, sd); - nullpo_retr(0, cd); + nullpo_retr (0, sd); + nullpo_retr (0, cd); - WBUFW(buf, 0) = 0x0dc; - WBUFW(buf, 2) = cd->users; - memcpy(WBUFP(buf, 4),sd->status.name,24); - clif_send(buf,packet_len_table[0xdc],&sd->bl,CHAT_WOS); + WBUFW (buf, 0) = 0x0dc; + WBUFW (buf, 2) = cd->users; + memcpy (WBUFP (buf, 4), sd->status.name, 24); + clif_send (buf, packet_len_table[0xdc], &sd->bl, CHAT_WOS); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_changechatowner(struct chat_data* cd,struct map_session_data *sd) +int clif_changechatowner (struct chat_data *cd, struct map_session_data *sd) { - char buf[64]; + char buf[64]; - nullpo_retr(0, sd); - nullpo_retr(0, cd); + nullpo_retr (0, sd); + nullpo_retr (0, cd); - WBUFW(buf, 0) = 0xe1; - WBUFL(buf, 2) = 1; - memcpy(WBUFP(buf,6),cd->usersd[0]->status.name,24); - WBUFW(buf,30) = 0xe1; - WBUFL(buf,32) = 0; - memcpy(WBUFP(buf,36),sd->status.name,24); + WBUFW (buf, 0) = 0xe1; + WBUFL (buf, 2) = 1; + memcpy (WBUFP (buf, 6), cd->usersd[0]->status.name, 24); + WBUFW (buf, 30) = 0xe1; + WBUFL (buf, 32) = 0; + memcpy (WBUFP (buf, 36), sd->status.name, 24); - clif_send(buf,packet_len_table[0xe1]*2,&sd->bl,CHAT); + clif_send (buf, packet_len_table[0xe1] * 2, &sd->bl, CHAT); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_leavechat(struct chat_data* cd,struct map_session_data *sd) +int clif_leavechat (struct chat_data *cd, struct map_session_data *sd) { - char buf[32]; + char buf[32]; - nullpo_retr(0, sd); - nullpo_retr(0, cd); + nullpo_retr (0, sd); + nullpo_retr (0, cd); - WBUFW(buf, 0) = 0xdd; - WBUFW(buf, 2) = cd->users-1; - memcpy(WBUFP(buf,4),sd->status.name,24); - WBUFB(buf,28) = 0; + WBUFW (buf, 0) = 0xdd; + WBUFW (buf, 2) = cd->users - 1; + memcpy (WBUFP (buf, 4), sd->status.name, 24); + WBUFB (buf, 28) = 0; - clif_send(buf,packet_len_table[0xdd],&sd->bl,CHAT); + clif_send (buf, packet_len_table[0xdd], &sd->bl, CHAT); - return 0; + return 0; } /*========================================== * ソスソスソスソスソスソスソスソスソスvソスソスソスソスソスソス *------------------------------------------ */ -int clif_traderequest(struct map_session_data *sd,char *name) +int clif_traderequest (struct map_session_data *sd, char *name) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xe5; - strcpy(WFIFOP(fd,2),name); - WFIFOSET(fd,packet_len_table[0xe5]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xe5; + strcpy (WFIFOP (fd, 2), name); + WFIFOSET (fd, packet_len_table[0xe5]); - return 0; + return 0; } /*========================================== * ソスソスソスソスソスソスソスソスソスvソスソスソスソスソスソス *------------------------------------------ */ -int clif_tradestart(struct map_session_data *sd,int type) +int clif_tradestart (struct map_session_data *sd, int type) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xe7; - WFIFOB(fd,2)=type; - WFIFOSET(fd,packet_len_table[0xe7]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xe7; + WFIFOB (fd, 2) = type; + WFIFOSET (fd, packet_len_table[0xe7]); - return 0; + return 0; } /*========================================== * ソスソスソスソスソスソスソスソスソスソスソスフアソスCソスeソスソスソスヌ会ソス *------------------------------------------ */ -int clif_tradeadditem(struct map_session_data *sd,struct map_session_data *tsd,int index,int amount) -{ - int fd,j; - - nullpo_retr(0, sd); - nullpo_retr(0, tsd); - - fd=tsd->fd; - WFIFOW(fd,0)=0xe9; - WFIFOL(fd,2)=amount; - if(index==0){ - WFIFOW(fd,6) = 0; // type id - WFIFOB(fd,8) = 0; //identify flag - WFIFOB(fd,9) = 0; // attribute - WFIFOB(fd,10)= 0; //refine - WFIFOW(fd,11)= 0; //card (4w) - WFIFOW(fd,13)= 0; //card (4w) - WFIFOW(fd,15)= 0; //card (4w) - WFIFOW(fd,17)= 0; //card (4w) - } - else{ - index -= 2; - if(sd->inventory_data[index] && sd->inventory_data[index]->view_id > 0) - WFIFOW(fd,6) = sd->inventory_data[index]->view_id; - else - WFIFOW(fd,6) = sd->status.inventory[index].nameid; // type id - WFIFOB(fd,8) = sd->status.inventory[index].identify; //identify flag - if(sd->status.inventory[index].broken==1) - WFIFOB(fd,9) = 1; // is broke weapon [Valaris] - else - WFIFOB(fd,9) = sd->status.inventory[index].attribute; // attribute - WFIFOB(fd,10)= sd->status.inventory[index].refine; //refine - if(sd->status.inventory[index].card[0]==0x00ff || sd->status.inventory[index].card[0]==0x00fe || sd->status.inventory[index].card[0]==(short)0xff00) { - WFIFOW(fd,11)= sd->status.inventory[index].card[0]; //card (4w) - WFIFOW(fd,13)= sd->status.inventory[index].card[1]; //card (4w) - WFIFOW(fd,15)= sd->status.inventory[index].card[2]; //card (4w) - WFIFOW(fd,17)= sd->status.inventory[index].card[3]; //card (4w) - } else { - if(sd->status.inventory[index].card[0] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[0])) > 0) - WFIFOW(fd,11)= j; - else - WFIFOW(fd,11)= sd->status.inventory[index].card[0]; - if(sd->status.inventory[index].card[1] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[1])) > 0) - WFIFOW(fd,13)= j; - else - WFIFOW(fd,13)= sd->status.inventory[index].card[1]; - if(sd->status.inventory[index].card[2] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[2])) > 0) - WFIFOW(fd,15)= j; - else - WFIFOW(fd,15)= sd->status.inventory[index].card[2]; - if(sd->status.inventory[index].card[3] > 0 && (j=itemdb_viewid(sd->status.inventory[index].card[3])) > 0) - WFIFOW(fd,17)= j; - else - WFIFOW(fd,17)= sd->status.inventory[index].card[3]; - } - } - WFIFOSET(fd,packet_len_table[0xe9]); +int clif_tradeadditem (struct map_session_data *sd, + struct map_session_data *tsd, int index, int amount) +{ + int fd, j; + + nullpo_retr (0, sd); + nullpo_retr (0, tsd); + + fd = tsd->fd; + WFIFOW (fd, 0) = 0xe9; + WFIFOL (fd, 2) = amount; + if (index == 0) + { + WFIFOW (fd, 6) = 0; // type id + WFIFOB (fd, 8) = 0; //identify flag + WFIFOB (fd, 9) = 0; // attribute + WFIFOB (fd, 10) = 0; //refine + WFIFOW (fd, 11) = 0; //card (4w) + WFIFOW (fd, 13) = 0; //card (4w) + WFIFOW (fd, 15) = 0; //card (4w) + WFIFOW (fd, 17) = 0; //card (4w) + } + else + { + index -= 2; + if (sd->inventory_data[index] + && sd->inventory_data[index]->view_id > 0) + WFIFOW (fd, 6) = sd->inventory_data[index]->view_id; + else + WFIFOW (fd, 6) = sd->status.inventory[index].nameid; // type id + WFIFOB (fd, 8) = sd->status.inventory[index].identify; //identify flag + if (sd->status.inventory[index].broken == 1) + WFIFOB (fd, 9) = 1; // is broke weapon [Valaris] + else + WFIFOB (fd, 9) = sd->status.inventory[index].attribute; // attribute + WFIFOB (fd, 10) = sd->status.inventory[index].refine; //refine + if (sd->status.inventory[index].card[0] == 0x00ff + || sd->status.inventory[index].card[0] == 0x00fe + || sd->status.inventory[index].card[0] == (short) 0xff00) + { + WFIFOW (fd, 11) = sd->status.inventory[index].card[0]; //card (4w) + WFIFOW (fd, 13) = sd->status.inventory[index].card[1]; //card (4w) + WFIFOW (fd, 15) = sd->status.inventory[index].card[2]; //card (4w) + WFIFOW (fd, 17) = sd->status.inventory[index].card[3]; //card (4w) + } + else + { + if (sd->status.inventory[index].card[0] > 0 + && (j = + itemdb_viewid (sd->status.inventory[index].card[0])) > 0) + WFIFOW (fd, 11) = j; + else + WFIFOW (fd, 11) = sd->status.inventory[index].card[0]; + if (sd->status.inventory[index].card[1] > 0 + && (j = + itemdb_viewid (sd->status.inventory[index].card[1])) > 0) + WFIFOW (fd, 13) = j; + else + WFIFOW (fd, 13) = sd->status.inventory[index].card[1]; + if (sd->status.inventory[index].card[2] > 0 + && (j = + itemdb_viewid (sd->status.inventory[index].card[2])) > 0) + WFIFOW (fd, 15) = j; + else + WFIFOW (fd, 15) = sd->status.inventory[index].card[2]; + if (sd->status.inventory[index].card[3] > 0 + && (j = + itemdb_viewid (sd->status.inventory[index].card[3])) > 0) + WFIFOW (fd, 17) = j; + else + WFIFOW (fd, 17) = sd->status.inventory[index].card[3]; + } + } + WFIFOSET (fd, packet_len_table[0xe9]); - return 0; + return 0; } /*========================================== * ソスAソスCソスeソスソスソスヌ会ソスソスソスソス/ソスソスソスs *------------------------------------------ */ -int clif_tradeitemok(struct map_session_data *sd,int index,int amount,int fail) +int clif_tradeitemok (struct map_session_data *sd, int index, int amount, + int fail) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x1b1; - //WFIFOW(fd,0)=0xea; - WFIFOW(fd,2)=index; - WFIFOW(fd,4)=amount; - WFIFOB(fd,6)=fail; - WFIFOSET(fd,packet_len_table[0x1b1]); + fd = sd->fd; + WFIFOW (fd, 0) = 0x1b1; + //WFIFOW(fd,0)=0xea; + WFIFOW (fd, 2) = index; + WFIFOW (fd, 4) = amount; + WFIFOB (fd, 6) = fail; + WFIFOSET (fd, packet_len_table[0x1b1]); - return 0; + return 0; } /*========================================== * ソスソスソスソスソスソスソスソスokソスソスソスソス *------------------------------------------ */ -int clif_tradedeal_lock(struct map_session_data *sd,int fail) +int clif_tradedeal_lock (struct map_session_data *sd, int fail) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xec; - WFIFOB(fd,2)=fail; // 0=you 1=the other person - WFIFOSET(fd,packet_len_table[0xec]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xec; + WFIFOB (fd, 2) = fail; // 0=you 1=the other person + WFIFOSET (fd, packet_len_table[0xec]); - return 0; + return 0; } /*========================================== * ソスソスソスソスソスソスソスソスソスソスソスLソスソスソスソスソスZソスソスソスソスソスソスソスワゑソスソスソス *------------------------------------------ */ -int clif_tradecancelled(struct map_session_data *sd) +int clif_tradecancelled (struct map_session_data *sd) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xee; - WFIFOSET(fd,packet_len_table[0xee]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xee; + WFIFOSET (fd, packet_len_table[0xee]); - return 0; + return 0; } /*========================================== * ソスソスソスソスソスソスソスソスソスソスソスソス *------------------------------------------ */ -int clif_tradecompleted(struct map_session_data *sd,int fail) +int clif_tradecompleted (struct map_session_data *sd, int fail) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xf0; - WFIFOB(fd,2)=fail; - WFIFOSET(fd,packet_len_table[0xf0]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xf0; + WFIFOB (fd, 2) = fail; + WFIFOSET (fd, packet_len_table[0xf0]); - return 0; + return 0; } /*========================================== * ソスJソスvソスソスソスqソスノのアソスCソスeソスソスソスソスソスソスソスXソスV *------------------------------------------ */ -int clif_updatestorageamount(struct map_session_data *sd,struct storage *stor) +int clif_updatestorageamount (struct map_session_data *sd, + struct storage *stor) { - int fd; + int fd; - nullpo_retr(0, sd); - nullpo_retr(0, stor); + nullpo_retr (0, sd); + nullpo_retr (0, stor); - fd=sd->fd; - WFIFOW(fd,0) = 0xf2; // update storage amount - WFIFOW(fd,2) = stor->storage_amount; //items - WFIFOW(fd,4) = MAX_STORAGE; //items max - WFIFOSET(fd,packet_len_table[0xf2]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xf2; // update storage amount + WFIFOW (fd, 2) = stor->storage_amount; //items + WFIFOW (fd, 4) = MAX_STORAGE; //items max + WFIFOSET (fd, packet_len_table[0xf2]); - return 0; + return 0; } /*========================================== * ソスJソスvソスソスソスqソスノにアソスCソスeソスソスソスソスソスヌ会ソスソスソスソス *------------------------------------------ */ -int clif_storageitemadded(struct map_session_data *sd,struct storage *stor,int index,int amount) +int clif_storageitemadded (struct map_session_data *sd, struct storage *stor, + int index, int amount) { - int fd,j; + int fd, j; - nullpo_retr(0, sd); - nullpo_retr(0, stor); + nullpo_retr (0, sd); + nullpo_retr (0, stor); - fd=sd->fd; - WFIFOW(fd,0) =0xf4; // Storage item added - WFIFOW(fd,2) =index+1; // index - WFIFOL(fd,4) =amount; // amount + fd = sd->fd; + WFIFOW (fd, 0) = 0xf4; // Storage item added + WFIFOW (fd, 2) = index + 1; // index + WFIFOL (fd, 4) = amount; // amount /* if((view = itemdb_viewid(stor->storage_[index].nameid)) > 0) WFIFOW(fd,8) =view; else*/ - WFIFOW(fd,8) =stor->storage_[index].nameid; - WFIFOB(fd,10)=stor->storage_[index].identify; //identify flag - if(stor->storage_[index].broken==1) - WFIFOB(fd,11)=1; // is weapon broken [Valaris] - else - WFIFOB(fd,11)=stor->storage_[index].attribute; // attribute - WFIFOB(fd,12)=stor->storage_[index].refine; //refine - if(stor->storage_[index].card[0]==0x00ff || stor->storage_[index].card[0]==0x00fe || stor->storage_[index].card[0]==(short)0xff00) { - WFIFOW(fd,13)=stor->storage_[index].card[0]; //card (4w) - WFIFOW(fd,15)=stor->storage_[index].card[1]; //card (4w) - WFIFOW(fd,17)=stor->storage_[index].card[2]; //card (4w) - WFIFOW(fd,19)=stor->storage_[index].card[3]; //card (4w) - } else { - if(stor->storage_[index].card[0] > 0 && (j=itemdb_viewid(stor->storage_[index].card[0])) > 0) - WFIFOW(fd,13)= j; - else - WFIFOW(fd,13)= stor->storage_[index].card[0]; - if(stor->storage_[index].card[1] > 0 && (j=itemdb_viewid(stor->storage_[index].card[1])) > 0) - WFIFOW(fd,15)= j; - else - WFIFOW(fd,15)= stor->storage_[index].card[1]; - if(stor->storage_[index].card[2] > 0 && (j=itemdb_viewid(stor->storage_[index].card[2])) > 0) - WFIFOW(fd,17)= j; - else - WFIFOW(fd,17)= stor->storage_[index].card[2]; - if(stor->storage_[index].card[3] > 0 && (j=itemdb_viewid(stor->storage_[index].card[3])) > 0) - WFIFOW(fd,19)= j; - else - WFIFOW(fd,19)= stor->storage_[index].card[3]; - } - WFIFOSET(fd,packet_len_table[0xf4]); - - return 0; + WFIFOW (fd, 8) = stor->storage_[index].nameid; + WFIFOB (fd, 10) = stor->storage_[index].identify; //identify flag + if (stor->storage_[index].broken == 1) + WFIFOB (fd, 11) = 1; // is weapon broken [Valaris] + else + WFIFOB (fd, 11) = stor->storage_[index].attribute; // attribute + WFIFOB (fd, 12) = stor->storage_[index].refine; //refine + if (stor->storage_[index].card[0] == 0x00ff + || stor->storage_[index].card[0] == 0x00fe + || stor->storage_[index].card[0] == (short) 0xff00) + { + WFIFOW (fd, 13) = stor->storage_[index].card[0]; //card (4w) + WFIFOW (fd, 15) = stor->storage_[index].card[1]; //card (4w) + WFIFOW (fd, 17) = stor->storage_[index].card[2]; //card (4w) + WFIFOW (fd, 19) = stor->storage_[index].card[3]; //card (4w) + } + else + { + if (stor->storage_[index].card[0] > 0 + && (j = itemdb_viewid (stor->storage_[index].card[0])) > 0) + WFIFOW (fd, 13) = j; + else + WFIFOW (fd, 13) = stor->storage_[index].card[0]; + if (stor->storage_[index].card[1] > 0 + && (j = itemdb_viewid (stor->storage_[index].card[1])) > 0) + WFIFOW (fd, 15) = j; + else + WFIFOW (fd, 15) = stor->storage_[index].card[1]; + if (stor->storage_[index].card[2] > 0 + && (j = itemdb_viewid (stor->storage_[index].card[2])) > 0) + WFIFOW (fd, 17) = j; + else + WFIFOW (fd, 17) = stor->storage_[index].card[2]; + if (stor->storage_[index].card[3] > 0 + && (j = itemdb_viewid (stor->storage_[index].card[3])) > 0) + WFIFOW (fd, 19) = j; + else + WFIFOW (fd, 19) = stor->storage_[index].card[3]; + } + WFIFOSET (fd, packet_len_table[0xf4]); + + return 0; } /*========================================== * *------------------------------------------ */ -int clif_updateguildstorageamount(struct map_session_data *sd,struct guild_storage *stor) +int clif_updateguildstorageamount (struct map_session_data *sd, + struct guild_storage *stor) { - int fd; + int fd; - nullpo_retr(0, sd); - nullpo_retr(0, stor); + nullpo_retr (0, sd); + nullpo_retr (0, stor); - fd=sd->fd; - WFIFOW(fd,0) = 0xf2; // update storage amount - WFIFOW(fd,2) = stor->storage_amount; //items - WFIFOW(fd,4) = MAX_GUILD_STORAGE; //items max - WFIFOSET(fd,packet_len_table[0xf2]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xf2; // update storage amount + WFIFOW (fd, 2) = stor->storage_amount; //items + WFIFOW (fd, 4) = MAX_GUILD_STORAGE; //items max + WFIFOSET (fd, packet_len_table[0xf2]); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_guildstorageitemadded(struct map_session_data *sd,struct guild_storage *stor,int index,int amount) -{ - int view,fd,j; - - nullpo_retr(0, sd); - nullpo_retr(0, stor); - - fd=sd->fd; - WFIFOW(fd,0) =0xf4; // Storage item added - WFIFOW(fd,2) =index+1; // index - WFIFOL(fd,4) =amount; // amount - if((view = itemdb_viewid(stor->storage_[index].nameid)) > 0) - WFIFOW(fd,8) =view; - else - WFIFOW(fd,8) =stor->storage_[index].nameid; // id - WFIFOB(fd,10)=stor->storage_[index].identify; //identify flag - if(stor->storage_[index].broken==1) - WFIFOB(fd,11)=1; // is weapon broken [Valaris] - else - WFIFOB(fd,11)=stor->storage_[index].attribute; // attribute - WFIFOB(fd,12)=stor->storage_[index].refine; //refine - if(stor->storage_[index].card[0]==0x00ff || stor->storage_[index].card[0]==0x00fe || stor->storage_[index].card[0]==(short)0xff00) { - WFIFOW(fd,13)=stor->storage_[index].card[0]; //card (4w) - WFIFOW(fd,15)=stor->storage_[index].card[1]; //card (4w) - WFIFOW(fd,17)=stor->storage_[index].card[2]; //card (4w) - WFIFOW(fd,19)=stor->storage_[index].card[3]; //card (4w) - } else { - if(stor->storage_[index].card[0] > 0 && (j=itemdb_viewid(stor->storage_[index].card[0])) > 0) - WFIFOW(fd,13)= j; - else - WFIFOW(fd,13)= stor->storage_[index].card[0]; - if(stor->storage_[index].card[1] > 0 && (j=itemdb_viewid(stor->storage_[index].card[1])) > 0) - WFIFOW(fd,15)= j; - else - WFIFOW(fd,15)= stor->storage_[index].card[1]; - if(stor->storage_[index].card[2] > 0 && (j=itemdb_viewid(stor->storage_[index].card[2])) > 0) - WFIFOW(fd,17)= j; - else - WFIFOW(fd,17)= stor->storage_[index].card[2]; - if(stor->storage_[index].card[3] > 0 && (j=itemdb_viewid(stor->storage_[index].card[3])) > 0) - WFIFOW(fd,19)= j; - else - WFIFOW(fd,19)= stor->storage_[index].card[3]; - } - WFIFOSET(fd,packet_len_table[0xf4]); - - return 0; +int clif_guildstorageitemadded (struct map_session_data *sd, + struct guild_storage *stor, int index, + int amount) +{ + int view, fd, j; + + nullpo_retr (0, sd); + nullpo_retr (0, stor); + + fd = sd->fd; + WFIFOW (fd, 0) = 0xf4; // Storage item added + WFIFOW (fd, 2) = index + 1; // index + WFIFOL (fd, 4) = amount; // amount + if ((view = itemdb_viewid (stor->storage_[index].nameid)) > 0) + WFIFOW (fd, 8) = view; + else + WFIFOW (fd, 8) = stor->storage_[index].nameid; // id + WFIFOB (fd, 10) = stor->storage_[index].identify; //identify flag + if (stor->storage_[index].broken == 1) + WFIFOB (fd, 11) = 1; // is weapon broken [Valaris] + else + WFIFOB (fd, 11) = stor->storage_[index].attribute; // attribute + WFIFOB (fd, 12) = stor->storage_[index].refine; //refine + if (stor->storage_[index].card[0] == 0x00ff + || stor->storage_[index].card[0] == 0x00fe + || stor->storage_[index].card[0] == (short) 0xff00) + { + WFIFOW (fd, 13) = stor->storage_[index].card[0]; //card (4w) + WFIFOW (fd, 15) = stor->storage_[index].card[1]; //card (4w) + WFIFOW (fd, 17) = stor->storage_[index].card[2]; //card (4w) + WFIFOW (fd, 19) = stor->storage_[index].card[3]; //card (4w) + } + else + { + if (stor->storage_[index].card[0] > 0 + && (j = itemdb_viewid (stor->storage_[index].card[0])) > 0) + WFIFOW (fd, 13) = j; + else + WFIFOW (fd, 13) = stor->storage_[index].card[0]; + if (stor->storage_[index].card[1] > 0 + && (j = itemdb_viewid (stor->storage_[index].card[1])) > 0) + WFIFOW (fd, 15) = j; + else + WFIFOW (fd, 15) = stor->storage_[index].card[1]; + if (stor->storage_[index].card[2] > 0 + && (j = itemdb_viewid (stor->storage_[index].card[2])) > 0) + WFIFOW (fd, 17) = j; + else + WFIFOW (fd, 17) = stor->storage_[index].card[2]; + if (stor->storage_[index].card[3] > 0 + && (j = itemdb_viewid (stor->storage_[index].card[3])) > 0) + WFIFOW (fd, 19) = j; + else + WFIFOW (fd, 19) = stor->storage_[index].card[3]; + } + WFIFOSET (fd, packet_len_table[0xf4]); + + return 0; } /*========================================== * ソスJソスvソスソスソスqソスノゑソスソスソスソスAソスCソスeソスソスソスソスソスソスソス闍趣ソスソス *------------------------------------------ */ -int clif_storageitemremoved(struct map_session_data *sd,int index,int amount) +int clif_storageitemremoved (struct map_session_data *sd, int index, + int amount) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xf6; // Storage item removed - WFIFOW(fd,2)=index+1; - WFIFOL(fd,4)=amount; - WFIFOSET(fd,packet_len_table[0xf6]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xf6; // Storage item removed + WFIFOW (fd, 2) = index + 1; + WFIFOL (fd, 4) = amount; + WFIFOSET (fd, packet_len_table[0xf6]); - return 0; + return 0; } /*========================================== * ソスJソスvソスソスソスqソスノゑソスソスツゑソスソスソス *------------------------------------------ */ -int clif_storageclose(struct map_session_data *sd) +int clif_storageclose (struct map_session_data *sd) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xf8; // Storage Closed - WFIFOSET(fd,packet_len_table[0xf8]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xf8; // Storage Closed + WFIFOSET (fd, packet_len_table[0xf8]); - return 0; + return 0; } void -clif_changelook_accessories(struct block_list *bl, struct map_session_data *dest) +clif_changelook_accessories (struct block_list *bl, + struct map_session_data *dest) { - int i; + int i; - for (i = LOOK_SHOES; i <= LOOK_LAST; i++) - clif_changelook_towards(bl, i, 0, dest); + for (i = LOOK_SHOES; i <= LOOK_LAST; i++) + clif_changelook_towards (bl, i, 0, dest); } - - // // callbackソスn ? // @@ -3243,64 +3585,72 @@ clif_changelook_accessories(struct block_list *bl, struct map_session_data *dest * PCソス\ソスソス *------------------------------------------ */ -void clif_getareachar_pc(struct map_session_data* sd,struct map_session_data* dstsd) +void clif_getareachar_pc (struct map_session_data *sd, + struct map_session_data *dstsd) { - int len; + int len; - if (dstsd->status.option & OPTION_INVISIBILITY) - return; + if (dstsd->status.option & OPTION_INVISIBILITY) + return; - nullpo_retv(sd); - nullpo_retv(dstsd); - - if(dstsd->walktimer != -1){ - len = clif_set007b(dstsd,WFIFOP(sd->fd,0)); - WFIFOSET(sd->fd,len); - } else { - len = clif_set0078(dstsd,WFIFOP(sd->fd,0)); - WFIFOSET(sd->fd,len); - } + nullpo_retv (sd); + nullpo_retv (dstsd); - if(dstsd->chatID){ - struct chat_data *cd; - cd=(struct chat_data*)map_id2bl(dstsd->chatID); - if(cd->usersd[0]==dstsd) - clif_dispchat(cd,sd->fd); - } - if(dstsd->spiritball > 0) { - clif_set01e1(dstsd,WFIFOP(sd->fd,0)); - WFIFOSET(sd->fd,packet_len_table[0x1e1]); - } - if(battle_config.save_clothcolor==1 && dstsd->status.clothes_color > 0) - clif_changelook(&dstsd->bl,LOOK_CLOTHES_COLOR,dstsd->status.clothes_color); + if (dstsd->walktimer != -1) + { + len = clif_set007b (dstsd, WFIFOP (sd->fd, 0)); + WFIFOSET (sd->fd, len); + } + else + { + len = clif_set0078 (dstsd, WFIFOP (sd->fd, 0)); + WFIFOSET (sd->fd, len); + } - if(sd->status.manner < 0) - clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner); + if (dstsd->chatID) + { + struct chat_data *cd; + cd = (struct chat_data *) map_id2bl (dstsd->chatID); + if (cd->usersd[0] == dstsd) + clif_dispchat (cd, sd->fd); + } + if (dstsd->spiritball > 0) + { + clif_set01e1 (dstsd, WFIFOP (sd->fd, 0)); + WFIFOSET (sd->fd, packet_len_table[0x1e1]); + } + if (battle_config.save_clothcolor == 1 && dstsd->status.clothes_color > 0) + clif_changelook (&dstsd->bl, LOOK_CLOTHES_COLOR, + dstsd->status.clothes_color); - clif_changelook_accessories(&sd->bl, dstsd); - clif_changelook_accessories(&dstsd->bl, sd); + if (sd->status.manner < 0) + clif_changestatus (&sd->bl, SP_MANNER, sd->status.manner); + + clif_changelook_accessories (&sd->bl, dstsd); + clif_changelook_accessories (&dstsd->bl, sd); } /*========================================== * NPCソス\ソスソス *------------------------------------------ */ -void clif_getareachar_npc(struct map_session_data* sd,struct npc_data* nd) +void clif_getareachar_npc (struct map_session_data *sd, struct npc_data *nd) { - int len; + int len; - nullpo_retv(sd); - nullpo_retv(nd); + nullpo_retv (sd); + nullpo_retv (nd); - if(nd->class < 0 || nd->flag&1 || nd->class == INVISIBLE_CLASS) - return; + if (nd->class < 0 || nd->flag & 1 || nd->class == INVISIBLE_CLASS) + return; - len = clif_npc0078(nd,WFIFOP(sd->fd,0)); - WFIFOSET(sd->fd,len); + len = clif_npc0078 (nd, WFIFOP (sd->fd, 0)); + WFIFOSET (sd->fd, len); - if(nd->chat_id){ - clif_dispchat((struct chat_data*)map_id2bl(nd->chat_id),sd->fd); - } + if (nd->chat_id) + { + clif_dispchat ((struct chat_data *) map_id2bl (nd->chat_id), sd->fd); + } } @@ -3308,1204 +3658,1287 @@ void clif_getareachar_npc(struct map_session_data* sd,struct npc_data* nd) * ソスレ難ソスソスソスソス~ *------------------------------------------ */ -int clif_movemob(struct mob_data *md) +int clif_movemob (struct mob_data *md) { - unsigned char buf[256]; - int len; + unsigned char buf[256]; + int len; - nullpo_retr(0, md); + nullpo_retr (0, md); - len = clif_mob007b(md,buf); - clif_send(buf,len,&md->bl,AREA); + len = clif_mob007b (md, buf); + clif_send (buf, len, &md->bl, AREA); - if(mob_get_equip(md->class) > 0) // mob equipment [Valaris] - clif_mob_equip(md,mob_get_equip(md->class)); + if (mob_get_equip (md->class) > 0) // mob equipment [Valaris] + clif_mob_equip (md, mob_get_equip (md->class)); - return 0; + return 0; } /*========================================== * ソスソスソスソスソスXソス^ソス[ソスフ位置ソスCソスソス *------------------------------------------ */ -int clif_fixmobpos(struct mob_data *md) +int clif_fixmobpos (struct mob_data *md) { - unsigned char buf[256]; - int len; + unsigned char buf[256]; + int len; - nullpo_retr(0, md); + nullpo_retr (0, md); - if(md->state.state == MS_WALK){ - len = clif_mob007b(md,buf); - clif_send(buf,len,&md->bl,AREA); - } else { - len = clif_mob0078(md,buf); - clif_send(buf,len,&md->bl,AREA); - } + if (md->state.state == MS_WALK) + { + len = clif_mob007b (md, buf); + clif_send (buf, len, &md->bl, AREA); + } + else + { + len = clif_mob0078 (md, buf); + clif_send (buf, len, &md->bl, AREA); + } - return 0; + return 0; } /*========================================== * PCソスフ位置ソスCソスソス *------------------------------------------ */ -int clif_fixpcpos(struct map_session_data *sd) +int clif_fixpcpos (struct map_session_data *sd) { - unsigned char buf[256]; - int len; + unsigned char buf[256]; + int len; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->walktimer != -1){ - len = clif_set007b(sd,buf); - clif_send(buf,len,&sd->bl,AREA); - } else { - len = clif_set0078(sd,buf); - clif_send(buf,len,&sd->bl,AREA); - } - clif_changelook_accessories(&sd->bl, NULL); + if (sd->walktimer != -1) + { + len = clif_set007b (sd, buf); + clif_send (buf, len, &sd->bl, AREA); + } + else + { + len = clif_set0078 (sd, buf); + clif_send (buf, len, &sd->bl, AREA); + } + clif_changelook_accessories (&sd->bl, NULL); - return 0; + return 0; } /*========================================== * ソスハ擾ソスソスUソスソスソスGソスtソスFソスNソスgソスソスソス_ソスソスソス[ソスW *------------------------------------------ */ -int clif_damage(struct block_list *src,struct block_list *dst,unsigned int tick,int sdelay,int ddelay,int damage,int div,int type,int damage2) -{ - unsigned char buf[256]; - struct status_change *sc_data; - - nullpo_retr(0, src); - nullpo_retr(0, dst); - - sc_data = battle_get_sc_data(dst); - - if(type != 4 && dst->type == BL_PC && ((struct map_session_data *)dst)->special_state.infinite_endure) - type = 9; - if(sc_data) { - if(type != 4 && sc_data[SC_ENDURE].timer != -1) - type = 9; - if(sc_data[SC_HALLUCINATION].timer != -1) { - if(damage > 0) - damage = damage*(5+sc_data[SC_HALLUCINATION].val1) + MRAND(100); - if(damage2 > 0) - damage2 = damage2*(5+sc_data[SC_HALLUCINATION].val1) + MRAND(100); - } - } +int clif_damage (struct block_list *src, struct block_list *dst, + unsigned int tick, int sdelay, int ddelay, int damage, + int div, int type, int damage2) +{ + unsigned char buf[256]; + struct status_change *sc_data; + + nullpo_retr (0, src); + nullpo_retr (0, dst); + + sc_data = battle_get_sc_data (dst); + + if (type != 4 && dst->type == BL_PC + && ((struct map_session_data *) dst)->special_state.infinite_endure) + type = 9; + if (sc_data) + { + if (type != 4 && sc_data[SC_ENDURE].timer != -1) + type = 9; + if (sc_data[SC_HALLUCINATION].timer != -1) + { + if (damage > 0) + damage = + damage * (5 + sc_data[SC_HALLUCINATION].val1) + + MRAND (100); + if (damage2 > 0) + damage2 = + damage2 * (5 + sc_data[SC_HALLUCINATION].val1) + + MRAND (100); + } + } - WBUFW(buf,0)=0x8a; - WBUFL(buf,2)=src->id; - WBUFL(buf,6)=dst->id; - WBUFL(buf,10)=tick; - WBUFL(buf,14)=sdelay; - WBUFL(buf,18)=ddelay; - WBUFW(buf,22)=(damage > 0x7fff)? 0x7fff:damage; - WBUFW(buf,24)=div; - WBUFB(buf,26)=type; - WBUFW(buf,27)=damage2; - clif_send(buf,packet_len_table[0x8a],src,AREA); + WBUFW (buf, 0) = 0x8a; + WBUFL (buf, 2) = src->id; + WBUFL (buf, 6) = dst->id; + WBUFL (buf, 10) = tick; + WBUFL (buf, 14) = sdelay; + WBUFL (buf, 18) = ddelay; + WBUFW (buf, 22) = (damage > 0x7fff) ? 0x7fff : damage; + WBUFW (buf, 24) = div; + WBUFB (buf, 26) = type; + WBUFW (buf, 27) = damage2; + clif_send (buf, packet_len_table[0x8a], src, AREA); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -void clif_getareachar_mob(struct map_session_data* sd,struct mob_data* md) +void clif_getareachar_mob (struct map_session_data *sd, struct mob_data *md) { - int len; - nullpo_retv(sd); - nullpo_retv(md); - - if(md->state.state == MS_WALK){ - len = clif_mob007b(md,WFIFOP(sd->fd,0)); - WFIFOSET(sd->fd,len); - } else { - len = clif_mob0078(md,WFIFOP(sd->fd,0)); - WFIFOSET(sd->fd,len); - } + int len; + nullpo_retv (sd); + nullpo_retv (md); - if(mob_get_equip(md->class) > 0) // mob equipment [Valaris] - clif_mob_equip(md,mob_get_equip(md->class)); + if (md->state.state == MS_WALK) + { + len = clif_mob007b (md, WFIFOP (sd->fd, 0)); + WFIFOSET (sd->fd, len); + } + else + { + len = clif_mob0078 (md, WFIFOP (sd->fd, 0)); + WFIFOSET (sd->fd, len); + } + + if (mob_get_equip (md->class) > 0) // mob equipment [Valaris] + clif_mob_equip (md, mob_get_equip (md->class)); } /*========================================== * *------------------------------------------ */ -void clif_getareachar_item(struct map_session_data* sd,struct flooritem_data* fitem) +void clif_getareachar_item (struct map_session_data *sd, + struct flooritem_data *fitem) { - int view,fd; + int view, fd; - nullpo_retv(sd); - nullpo_retv(fitem); - - fd=sd->fd; - //009d <ID>.l <item ID>.w <identify flag>.B <X>.w <Y>.w <amount>.w <subX>.B <subY>.B - WFIFOW(fd,0)=0x9d; - WFIFOL(fd,2)=fitem->bl.id; - if((view = itemdb_viewid(fitem->item_data.nameid)) > 0) - WFIFOW(fd,6)=view; - else - WFIFOW(fd,6)=fitem->item_data.nameid; - WFIFOB(fd,8)=fitem->item_data.identify; - WFIFOW(fd,9)=fitem->bl.x; - WFIFOW(fd,11)=fitem->bl.y; - WFIFOW(fd,13)=fitem->item_data.amount; - WFIFOB(fd,15)=fitem->subx; - WFIFOB(fd,16)=fitem->suby; - - WFIFOSET(fd,packet_len_table[0x9d]); + nullpo_retv (sd); + nullpo_retv (fitem); + + fd = sd->fd; + //009d <ID>.l <item ID>.w <identify flag>.B <X>.w <Y>.w <amount>.w <subX>.B <subY>.B + WFIFOW (fd, 0) = 0x9d; + WFIFOL (fd, 2) = fitem->bl.id; + if ((view = itemdb_viewid (fitem->item_data.nameid)) > 0) + WFIFOW (fd, 6) = view; + else + WFIFOW (fd, 6) = fitem->item_data.nameid; + WFIFOB (fd, 8) = fitem->item_data.identify; + WFIFOW (fd, 9) = fitem->bl.x; + WFIFOW (fd, 11) = fitem->bl.y; + WFIFOW (fd, 13) = fitem->item_data.amount; + WFIFOB (fd, 15) = fitem->subx; + WFIFOB (fd, 16) = fitem->suby; + + WFIFOSET (fd, packet_len_table[0x9d]); } + /*========================================== * ソス齒奇ソスXソスLソスソスソスGソスtソスFソスNソスgソスソスソスソスソスEソスノ難ソスソスソス *------------------------------------------ */ -int clif_getareachar_skillunit(struct map_session_data *sd,struct skill_unit *unit) -{ - int fd; - struct block_list *bl; - - nullpo_retr(0, unit); - - fd=sd->fd; - bl=map_id2bl(unit->group->src_id); - memset(WFIFOP(fd,0),0,packet_len_table[0x1c9]); - WFIFOW(fd, 0)=0x1c9; - WFIFOL(fd, 2)=unit->bl.id; - WFIFOL(fd, 6)=unit->group->src_id; - WFIFOW(fd,10)=unit->bl.x; - WFIFOW(fd,12)=unit->bl.y; - WFIFOB(fd,14)=unit->group->unit_id; - WFIFOB(fd,15)=1; - WFIFOL(fd,15+1)=0; //1-4ソスソスソスラゑソスソスソスソスソスナ抵ソス - WFIFOL(fd,15+5)=0; //5-8ソスソスソスラゑソスソスソスソスソスナ抵ソス - //9-12ソス}ソスbソスvソスソスソスニで茨ソスソスソスソスソス77-80ソスニはまゑソスソス痰、4ソスoソスCソスgソスフゑソスソスネゑソスソス蛯ォソスネ撰ソスソスソス - WFIFOL(fd,15+13)=unit->bl.y - 0x12; //13-16ソスソスソスjソスbソスgソスソスYソスソスW-18ソスソスロゑソス(Y:17ソスソスFF FF FF FF) - WFIFOL(fd,15+17)=0x004f37dd; //17-20ソスソスソスラゑソスソスソスソスソスナ抵ソス - WFIFOL(fd,15+21)=0x0012f674; //21-24ソスソスソスラゑソスソスソスソスソスナ抵ソス - WFIFOL(fd,15+25)=0x0012f664; //25-28ソスソスソスラゑソスソスソスソスソスナ抵ソス - WFIFOL(fd,15+29)=0x0012f654; //29-32ソスソスソスラゑソスソスソスソスソスナ抵ソス - WFIFOL(fd,15+33)=0x77527bbc; //33-36ソスソスソスラゑソスソスソスソスソスナ抵ソス - //37-39 - WFIFOB(fd,15+40)=0x2d; //40ソスソスソスラゑソスソスソスソスソスナ抵ソス - WFIFOL(fd,15+41)=0; //41-44ソスソスソスラゑソスソスソスソス0ソスナ抵ソス - WFIFOL(fd,15+45)=0; //45-48ソスソスソスラゑソスソスソスソス0ソスナ抵ソス - WFIFOL(fd,15+49)=0; //49-52ソスソスソスラゑソスソスソスソス0ソスナ抵ソス - WFIFOL(fd,15+53)=0x0048d919; //53-56ソスソスソスラゑソスソスソスソスソスナ抵ソス - WFIFOL(fd,15+57)=0x0000003e; //57-60ソスソスソスラゑソスソスソスソスソスナ抵ソス - WFIFOL(fd,15+61)=0x0012f66c; //61-64ソスソスソスラゑソスソスソスソスソスナ抵ソス - //65-68 - //69-72 - if(bl) WFIFOL(fd,15+73)=bl->y; //73-76ソスpソスメゑソスYソスソスW - WFIFOL(fd,15+77)=unit->bl.m; //77-80ソス}ソスbソスvIDソスソスソスネゑソスソスHソスソスソスネゑソス2ソスoソスCソスgソスナ托ソスソス閧サソスソスソスネ撰ソスソスソス - WFIFOB(fd,15+81)=0xaa; //81ソスIソス[ソスソスソスソス0xaa - - /* Graffiti [Valaris] */ - if(unit->group->unit_id==0xb0) { - WFIFOL(fd,15)=1; - WFIFOL(fd,16)=1; - memcpy(WFIFOP(fd,17),unit->group->valstr,80); - } - - WFIFOSET(fd,packet_len_table[0x1c9]); - if(unit->group->skill_id == WZ_ICEWALL) - clif_set0192(fd,unit->bl.m,unit->bl.x,unit->bl.y,5); - - return 0; +int clif_getareachar_skillunit (struct map_session_data *sd, + struct skill_unit *unit) +{ + int fd; + struct block_list *bl; + + nullpo_retr (0, unit); + + fd = sd->fd; + bl = map_id2bl (unit->group->src_id); + memset (WFIFOP (fd, 0), 0, packet_len_table[0x1c9]); + WFIFOW (fd, 0) = 0x1c9; + WFIFOL (fd, 2) = unit->bl.id; + WFIFOL (fd, 6) = unit->group->src_id; + WFIFOW (fd, 10) = unit->bl.x; + WFIFOW (fd, 12) = unit->bl.y; + WFIFOB (fd, 14) = unit->group->unit_id; + WFIFOB (fd, 15) = 1; + WFIFOL (fd, 15 + 1) = 0; //1-4ソスソスソスラゑソスソスソスソスソスナ抵ソス + WFIFOL (fd, 15 + 5) = 0; //5-8ソスソスソスラゑソスソスソスソスソスナ抵ソス + //9-12ソス}ソスbソスvソスソスソスニで茨ソスソスソスソスソス77-80ソスニはまゑソスソス痰、4ソスoソスCソスgソスフゑソスソスネゑソスソス蛯ォソスネ撰ソスソスソス + WFIFOL (fd, 15 + 13) = unit->bl.y - 0x12; //13-16ソスソスソスjソスbソスgソスソスYソスソスW-18ソスソスロゑソス(Y:17ソスソスFF FF FF FF) + WFIFOL (fd, 15 + 17) = 0x004f37dd; //17-20ソスソスソスラゑソスソスソスソスソスナ抵ソス + WFIFOL (fd, 15 + 21) = 0x0012f674; //21-24ソスソスソスラゑソスソスソスソスソスナ抵ソス + WFIFOL (fd, 15 + 25) = 0x0012f664; //25-28ソスソスソスラゑソスソスソスソスソスナ抵ソス + WFIFOL (fd, 15 + 29) = 0x0012f654; //29-32ソスソスソスラゑソスソスソスソスソスナ抵ソス + WFIFOL (fd, 15 + 33) = 0x77527bbc; //33-36ソスソスソスラゑソスソスソスソスソスナ抵ソス + //37-39 + WFIFOB (fd, 15 + 40) = 0x2d; //40ソスソスソスラゑソスソスソスソスソスナ抵ソス + WFIFOL (fd, 15 + 41) = 0; //41-44ソスソスソスラゑソスソスソスソス0ソスナ抵ソス + WFIFOL (fd, 15 + 45) = 0; //45-48ソスソスソスラゑソスソスソスソス0ソスナ抵ソス + WFIFOL (fd, 15 + 49) = 0; //49-52ソスソスソスラゑソスソスソスソス0ソスナ抵ソス + WFIFOL (fd, 15 + 53) = 0x0048d919; //53-56ソスソスソスラゑソスソスソスソスソスナ抵ソス + WFIFOL (fd, 15 + 57) = 0x0000003e; //57-60ソスソスソスラゑソスソスソスソスソスナ抵ソス + WFIFOL (fd, 15 + 61) = 0x0012f66c; //61-64ソスソスソスラゑソスソスソスソスソスナ抵ソス + //65-68 + //69-72 + if (bl) + WFIFOL (fd, 15 + 73) = bl->y; //73-76ソスpソスメゑソスYソスソスW + WFIFOL (fd, 15 + 77) = unit->bl.m; //77-80ソス}ソスbソスvIDソスソスソスネゑソスソスHソスソスソスネゑソス2ソスoソスCソスgソスナ托ソスソス閧サソスソスソスネ撰ソスソスソス + WFIFOB (fd, 15 + 81) = 0xaa; //81ソスIソス[ソスソスソスソス0xaa + + /* Graffiti [Valaris] */ + if (unit->group->unit_id == 0xb0) + { + WFIFOL (fd, 15) = 1; + WFIFOL (fd, 16) = 1; + memcpy (WFIFOP (fd, 17), unit->group->valstr, 80); + } + + WFIFOSET (fd, packet_len_table[0x1c9]); + if (unit->group->skill_id == WZ_ICEWALL) + clif_set0192 (fd, unit->bl.m, unit->bl.x, unit->bl.y, 5); + + return 0; } + /*========================================== * ソス齒奇ソスXソスLソスソスソスGソスtソスFソスNソスgソスソスソスソスソスEソスソスソスソスソスソスソスソスソス *------------------------------------------ */ -int clif_clearchar_skillunit(struct skill_unit *unit,int fd) +int clif_clearchar_skillunit (struct skill_unit *unit, int fd) { - nullpo_retr(0, unit); + nullpo_retr (0, unit); - WFIFOW(fd, 0)=0x120; - WFIFOL(fd, 2)=unit->bl.id; - WFIFOSET(fd,packet_len_table[0x120]); - if(unit->group->skill_id == WZ_ICEWALL) - clif_set0192(fd,unit->bl.m,unit->bl.x,unit->bl.y,unit->val2); + WFIFOW (fd, 0) = 0x120; + WFIFOL (fd, 2) = unit->bl.id; + WFIFOSET (fd, packet_len_table[0x120]); + if (unit->group->skill_id == WZ_ICEWALL) + clif_set0192 (fd, unit->bl.m, unit->bl.x, unit->bl.y, unit->val2); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_01ac(struct block_list *bl) +int clif_01ac (struct block_list *bl) { - char buf[32]; + char buf[32]; - nullpo_retr(0, bl); + nullpo_retr (0, bl); - WBUFW(buf, 0) = 0x1ac; - WBUFL(buf, 2) = bl->id; + WBUFW (buf, 0) = 0x1ac; + WBUFL (buf, 2) = bl->id; - clif_send(buf,packet_len_table[0x1ac],bl,AREA); - return 0; + clif_send (buf, packet_len_table[0x1ac], bl, AREA); + return 0; } /*========================================== * *------------------------------------------ */ - int clif_getareachar(struct block_list* bl,va_list ap) -{ - struct map_session_data *sd; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - - sd=va_arg(ap,struct map_session_data*); - - switch(bl->type){ - case BL_PC: - if(sd==(struct map_session_data*)bl) - break; - clif_getareachar_pc(sd,(struct map_session_data*) bl); - break; - case BL_NPC: - clif_getareachar_npc(sd,(struct npc_data*) bl); - break; - case BL_MOB: - clif_getareachar_mob(sd,(struct mob_data*) bl); - break; - case BL_ITEM: - clif_getareachar_item(sd,(struct flooritem_data*) bl); - break; - case BL_SKILL: - clif_getareachar_skillunit(sd,(struct skill_unit *)bl); - break; - default: - if(battle_config.error_log) - printf("get area char ??? %d\n",bl->type); - break; - } - return 0; +int clif_getareachar (struct block_list *bl, va_list ap) +{ + struct map_session_data *sd; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + + sd = va_arg (ap, struct map_session_data *); + + switch (bl->type) + { + case BL_PC: + if (sd == (struct map_session_data *) bl) + break; + clif_getareachar_pc (sd, (struct map_session_data *) bl); + break; + case BL_NPC: + clif_getareachar_npc (sd, (struct npc_data *) bl); + break; + case BL_MOB: + clif_getareachar_mob (sd, (struct mob_data *) bl); + break; + case BL_ITEM: + clif_getareachar_item (sd, (struct flooritem_data *) bl); + break; + case BL_SKILL: + clif_getareachar_skillunit (sd, (struct skill_unit *) bl); + break; + default: + if (battle_config.error_log) + printf ("get area char ??? %d\n", bl->type); + break; + } + return 0; } /*========================================== * *------------------------------------------ */ -int clif_pcoutsight(struct block_list *bl,va_list ap) +int clif_pcoutsight (struct block_list *bl, va_list ap) { - struct map_session_data *sd,*dstsd; + struct map_session_data *sd, *dstsd; - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, sd=va_arg(ap,struct map_session_data*)); + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, sd = va_arg (ap, struct map_session_data *)); - switch(bl->type){ - case BL_PC: - dstsd = (struct map_session_data*) bl; - if(sd != dstsd) { - clif_clearchar_id(dstsd->bl.id,0,sd->fd); - clif_clearchar_id(sd->bl.id,0,dstsd->fd); - if(dstsd->chatID){ - struct chat_data *cd; - cd=(struct chat_data*)map_id2bl(dstsd->chatID); - if(cd->usersd[0]==dstsd) - clif_dispchat(cd,sd->fd); - } - } - break; - case BL_NPC: - if( ((struct npc_data *)bl)->class != INVISIBLE_CLASS ) - clif_clearchar_id(bl->id,0,sd->fd); - break; - case BL_MOB: - clif_clearchar_id(bl->id,0,sd->fd); - break; - case BL_ITEM: - clif_clearflooritem((struct flooritem_data*)bl,sd->fd); - break; - case BL_SKILL: - clif_clearchar_skillunit((struct skill_unit *)bl,sd->fd); - break; - } - return 0; + switch (bl->type) + { + case BL_PC: + dstsd = (struct map_session_data *) bl; + if (sd != dstsd) + { + clif_clearchar_id (dstsd->bl.id, 0, sd->fd); + clif_clearchar_id (sd->bl.id, 0, dstsd->fd); + if (dstsd->chatID) + { + struct chat_data *cd; + cd = (struct chat_data *) map_id2bl (dstsd->chatID); + if (cd->usersd[0] == dstsd) + clif_dispchat (cd, sd->fd); + } + } + break; + case BL_NPC: + if (((struct npc_data *) bl)->class != INVISIBLE_CLASS) + clif_clearchar_id (bl->id, 0, sd->fd); + break; + case BL_MOB: + clif_clearchar_id (bl->id, 0, sd->fd); + break; + case BL_ITEM: + clif_clearflooritem ((struct flooritem_data *) bl, sd->fd); + break; + case BL_SKILL: + clif_clearchar_skillunit ((struct skill_unit *) bl, sd->fd); + break; + } + return 0; } /*========================================== * *------------------------------------------ */ -int clif_pcinsight(struct block_list *bl,va_list ap) +int clif_pcinsight (struct block_list *bl, va_list ap) { - struct map_session_data *sd,*dstsd; + struct map_session_data *sd, *dstsd; - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, sd=va_arg(ap,struct map_session_data*)); + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, sd = va_arg (ap, struct map_session_data *)); - switch(bl->type){ - case BL_PC: - dstsd = (struct map_session_data *)bl; - if(sd != dstsd) { - clif_getareachar_pc(sd,dstsd); - clif_getareachar_pc(dstsd,sd); - } - break; - case BL_NPC: - clif_getareachar_npc(sd,(struct npc_data*)bl); - break; - case BL_MOB: - clif_getareachar_mob(sd,(struct mob_data*)bl); - break; - case BL_ITEM: - clif_getareachar_item(sd,(struct flooritem_data*)bl); - break; - case BL_SKILL: - clif_getareachar_skillunit(sd,(struct skill_unit *)bl); - break; - } + switch (bl->type) + { + case BL_PC: + dstsd = (struct map_session_data *) bl; + if (sd != dstsd) + { + clif_getareachar_pc (sd, dstsd); + clif_getareachar_pc (dstsd, sd); + } + break; + case BL_NPC: + clif_getareachar_npc (sd, (struct npc_data *) bl); + break; + case BL_MOB: + clif_getareachar_mob (sd, (struct mob_data *) bl); + break; + case BL_ITEM: + clif_getareachar_item (sd, (struct flooritem_data *) bl); + break; + case BL_SKILL: + clif_getareachar_skillunit (sd, (struct skill_unit *) bl); + break; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_moboutsight(struct block_list *bl,va_list ap) +int clif_moboutsight (struct block_list *bl, va_list ap) { - struct map_session_data *sd; - struct mob_data *md; + struct map_session_data *sd; + struct mob_data *md; - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, md=va_arg(ap,struct mob_data*)); + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, md = va_arg (ap, struct mob_data *)); - if(bl->type==BL_PC && (sd = (struct map_session_data*) bl)){ - clif_clearchar_id(md->bl.id,0,sd->fd); - } + if (bl->type == BL_PC && (sd = (struct map_session_data *) bl)) + { + clif_clearchar_id (md->bl.id, 0, sd->fd); + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_mobinsight(struct block_list *bl,va_list ap) +int clif_mobinsight (struct block_list *bl, va_list ap) { - struct map_session_data *sd; - struct mob_data *md; + struct map_session_data *sd; + struct mob_data *md; - nullpo_retr(0, bl); - nullpo_retr(0, ap); + nullpo_retr (0, bl); + nullpo_retr (0, ap); - md=va_arg(ap,struct mob_data*); - if(bl->type==BL_PC && (sd = (struct map_session_data *)bl)){ - clif_getareachar_mob(sd,md); - } + md = va_arg (ap, struct mob_data *); + if (bl->type == BL_PC && (sd = (struct map_session_data *) bl)) + { + clif_getareachar_mob (sd, md); + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range) -{ - int fd,id; - - nullpo_retr(0, sd); - - fd=sd->fd; - if( (id=sd->status.skill[skillid].id) <= 0 ) - return 0; - WFIFOW(fd,0)=0x147; - WFIFOW(fd,2) = id; - if(type < 0) - WFIFOW(fd,4) = skill_get_inf(id); - else - WFIFOW(fd,4) = type; - WFIFOW(fd,6) = 0; - WFIFOW(fd,8) = sd->status.skill[skillid].lv; - WFIFOW(fd,10) = skill_get_sp(id,sd->status.skill[skillid].lv); - if(range < 0) { - range = skill_get_range(id,sd->status.skill[skillid].lv); - if(range < 0) - range = battle_get_range(&sd->bl) - (range + 1); - WFIFOW(fd,12)= range; - } else - WFIFOW(fd,12)= range; - memset(WFIFOP(fd,14),0,24); - WFIFOB(fd,38)= (sd->status.skill[skillid].lv < skill_get_max_raise(id))? 1:0; - WFIFOSET(fd,packet_len_table[0x147]); +int clif_skillinfo (struct map_session_data *sd, int skillid, int type, + int range) +{ + int fd, id; - return 0; + nullpo_retr (0, sd); + + fd = sd->fd; + if ((id = sd->status.skill[skillid].id) <= 0) + return 0; + WFIFOW (fd, 0) = 0x147; + WFIFOW (fd, 2) = id; + if (type < 0) + WFIFOW (fd, 4) = skill_get_inf (id); + else + WFIFOW (fd, 4) = type; + WFIFOW (fd, 6) = 0; + WFIFOW (fd, 8) = sd->status.skill[skillid].lv; + WFIFOW (fd, 10) = skill_get_sp (id, sd->status.skill[skillid].lv); + if (range < 0) + { + range = skill_get_range (id, sd->status.skill[skillid].lv); + if (range < 0) + range = battle_get_range (&sd->bl) - (range + 1); + WFIFOW (fd, 12) = range; + } + else + WFIFOW (fd, 12) = range; + memset (WFIFOP (fd, 14), 0, 24); + WFIFOB (fd, 38) = + (sd->status.skill[skillid].lv < skill_get_max_raise (id)) ? 1 : 0; + WFIFOSET (fd, packet_len_table[0x147]); + + return 0; } /*========================================== * ソスXソスLソスソスソスソスソスXソスgソス送信ソスソスソスソス *------------------------------------------ */ -int clif_skillinfoblock(struct map_session_data *sd) -{ - int fd; - int i,c,len=4,id,range; - - nullpo_retr(0, sd); - - fd=sd->fd; - WFIFOW(fd,0)=0x10f; - for ( i = c = 0; i < MAX_SKILL; i++){ - if( (id=sd->status.skill[i].id)!=0 - && (sd->tmw_version >= 1)){ // [Fate] Version 1 and later don't crash because of bad skill IDs anymore - WFIFOW(fd,len ) = id; - WFIFOW(fd,len+2) = skill_get_inf(id); - WFIFOW(fd,len+4) = skill_db[i].poolflags | (sd->status.skill[i].flags & (SKILL_POOL_ACTIVATED)); - WFIFOW(fd,len+6) = sd->status.skill[i].lv; - WFIFOW(fd,len+8) = skill_get_sp(id,sd->status.skill[i].lv); - range = skill_get_range(id,sd->status.skill[i].lv); - if(range < 0) - range = battle_get_range(&sd->bl) - (range + 1); - WFIFOW(fd,len+10)= range; - memset(WFIFOP(fd,len+12),0,24); - WFIFOB(fd,len+36)= (sd->status.skill[i].lv < skill_get_max_raise(id))? 1:0; - len+=37; - c++; - } - } - WFIFOW(fd,2)=len; - WFIFOSET(fd,len); +int clif_skillinfoblock (struct map_session_data *sd) +{ + int fd; + int i, c, len = 4, id, range; + + nullpo_retr (0, sd); + + fd = sd->fd; + WFIFOW (fd, 0) = 0x10f; + for (i = c = 0; i < MAX_SKILL; i++) + { + if ((id = sd->status.skill[i].id) != 0 && (sd->tmw_version >= 1)) + { // [Fate] Version 1 and later don't crash because of bad skill IDs anymore + WFIFOW (fd, len) = id; + WFIFOW (fd, len + 2) = skill_get_inf (id); + WFIFOW (fd, len + 4) = + skill_db[i].poolflags | (sd->status. + skill[i].flags & + (SKILL_POOL_ACTIVATED)); + WFIFOW (fd, len + 6) = sd->status.skill[i].lv; + WFIFOW (fd, len + 8) = skill_get_sp (id, sd->status.skill[i].lv); + range = skill_get_range (id, sd->status.skill[i].lv); + if (range < 0) + range = battle_get_range (&sd->bl) - (range + 1); + WFIFOW (fd, len + 10) = range; + memset (WFIFOP (fd, len + 12), 0, 24); + WFIFOB (fd, len + 36) = + (sd->status.skill[i].lv < skill_get_max_raise (id)) ? 1 : 0; + len += 37; + c++; + } + } + WFIFOW (fd, 2) = len; + WFIFOSET (fd, len); - return 0; + return 0; } /*========================================== * ソスXソスLソスソスソスソスソスソスソスUソスソスソスハ知 *------------------------------------------ */ -int clif_skillup(struct map_session_data *sd,int skill_num) +int clif_skillup (struct map_session_data *sd, int skill_num) { - int range,fd; + int range, fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0) = 0x10e; - WFIFOW(fd,2) = skill_num; - WFIFOW(fd,4) = sd->status.skill[skill_num].lv; - WFIFOW(fd,6) = skill_get_sp(skill_num,sd->status.skill[skill_num].lv); - range = skill_get_range(skill_num,sd->status.skill[skill_num].lv); - if(range < 0) - range = battle_get_range(&sd->bl) - (range + 1); - WFIFOW(fd,8) = range; - WFIFOB(fd,10) = (sd->status.skill[skill_num].lv < skill_get_max_raise(sd->status.skill[skill_num].id)) ? 1 : 0; - WFIFOSET(fd,packet_len_table[0x10e]); + fd = sd->fd; + WFIFOW (fd, 0) = 0x10e; + WFIFOW (fd, 2) = skill_num; + WFIFOW (fd, 4) = sd->status.skill[skill_num].lv; + WFIFOW (fd, 6) = skill_get_sp (skill_num, sd->status.skill[skill_num].lv); + range = skill_get_range (skill_num, sd->status.skill[skill_num].lv); + if (range < 0) + range = battle_get_range (&sd->bl) - (range + 1); + WFIFOW (fd, 8) = range; + WFIFOB (fd, 10) = + (sd->status.skill[skill_num].lv < + skill_get_max_raise (sd->status.skill[skill_num].id)) ? 1 : 0; + WFIFOSET (fd, packet_len_table[0x10e]); - return 0; + return 0; } /*========================================== * ソスXソスLソスソスソスrソスソスソスGソスtソスFソスNソスgソス送信ソスソスソスソス *------------------------------------------ */ -int clif_skillcasting(struct block_list* bl, - int src_id,int dst_id,int dst_x,int dst_y,int skill_num,int casttime) +int clif_skillcasting (struct block_list *bl, + int src_id, int dst_id, int dst_x, int dst_y, + int skill_num, int casttime) { - unsigned char buf[32]; - WBUFW(buf,0) = 0x13e; - WBUFL(buf,2) = src_id; - WBUFL(buf,6) = dst_id; - WBUFW(buf,10) = dst_x; - WBUFW(buf,12) = dst_y; - WBUFW(buf,14) = skill_num;//ソスソスソス@ソスrソスソスソスXソスLソスソス - WBUFL(buf,16) = skill_get_pl(skill_num);//ソスソスソスソス - WBUFL(buf,20) = casttime;//skillソスrソスソスソスソスソスソス - clif_send(buf,packet_len_table[0x13e], bl, AREA); + unsigned char buf[32]; + WBUFW (buf, 0) = 0x13e; + WBUFL (buf, 2) = src_id; + WBUFL (buf, 6) = dst_id; + WBUFW (buf, 10) = dst_x; + WBUFW (buf, 12) = dst_y; + WBUFW (buf, 14) = skill_num; //ソスソスソス@ソスrソスソスソスXソスLソスソス + WBUFL (buf, 16) = skill_get_pl (skill_num); //ソスソスソスソス + WBUFL (buf, 20) = casttime; //skillソスrソスソスソスソスソスソス + clif_send (buf, packet_len_table[0x13e], bl, AREA); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_skillcastcancel(struct block_list* bl) +int clif_skillcastcancel (struct block_list *bl) { - unsigned char buf[16]; + unsigned char buf[16]; - nullpo_retr(0, bl); + nullpo_retr (0, bl); - WBUFW(buf,0) = 0x1b9; - WBUFL(buf,2) = bl->id; - clif_send(buf,packet_len_table[0x1b9], bl, AREA); + WBUFW (buf, 0) = 0x1b9; + WBUFL (buf, 2) = bl->id; + clif_send (buf, packet_len_table[0x1b9], bl, AREA); - return 0; + return 0; } /*========================================== * ソスXソスLソスソスソスrソスソスソスソスソスs *------------------------------------------ */ -int clif_skill_fail(struct map_session_data *sd,int skill_id,int type,int btype) +int clif_skill_fail (struct map_session_data *sd, int skill_id, int type, + int btype) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; + fd = sd->fd; - if(type==0x4 && battle_config.display_delay_skill_fail==0){ - return 0; - } + if (type == 0x4 && battle_config.display_delay_skill_fail == 0) + { + return 0; + } - WFIFOW(fd,0) = 0x110; - WFIFOW(fd,2) = skill_id; - WFIFOW(fd,4) = btype; - WFIFOW(fd,6) = 0; - WFIFOB(fd,8) = 0; - WFIFOB(fd,9) = type; - WFIFOSET(fd,packet_len_table[0x110]); + WFIFOW (fd, 0) = 0x110; + WFIFOW (fd, 2) = skill_id; + WFIFOW (fd, 4) = btype; + WFIFOW (fd, 6) = 0; + WFIFOB (fd, 8) = 0; + WFIFOB (fd, 9) = type; + WFIFOSET (fd, packet_len_table[0x110]); - return 0; + return 0; } /*========================================== * ソスXソスLソスソスソスUソスソスソスGソスtソスFソスNソスgソスソスソス_ソスソスソス[ソスW *------------------------------------------ */ -int clif_skill_damage(struct block_list *src,struct block_list *dst, - unsigned int tick,int sdelay,int ddelay,int damage,int div,int skill_id,int skill_lv,int type) +int clif_skill_damage (struct block_list *src, struct block_list *dst, + unsigned int tick, int sdelay, int ddelay, int damage, + int div, int skill_id, int skill_lv, int type) { - unsigned char buf[64]; - struct status_change *sc_data; + unsigned char buf[64]; + struct status_change *sc_data; - nullpo_retr(0, src); - nullpo_retr(0, dst); + nullpo_retr (0, src); + nullpo_retr (0, dst); - sc_data = battle_get_sc_data(dst); + sc_data = battle_get_sc_data (dst); - if(type != 5 && dst->type == BL_PC && ((struct map_session_data *)dst)->special_state.infinite_endure) - type = 9; - if(sc_data) { - if(type != 5 && sc_data[SC_ENDURE].timer != -1) - type = 9; - if(sc_data[SC_HALLUCINATION].timer != -1 && damage > 0) - damage = damage*(5+sc_data[SC_HALLUCINATION].val1) + MRAND(100); - } + if (type != 5 && dst->type == BL_PC + && ((struct map_session_data *) dst)->special_state.infinite_endure) + type = 9; + if (sc_data) + { + if (type != 5 && sc_data[SC_ENDURE].timer != -1) + type = 9; + if (sc_data[SC_HALLUCINATION].timer != -1 && damage > 0) + damage = + damage * (5 + sc_data[SC_HALLUCINATION].val1) + MRAND (100); + } - WBUFW(buf,0)=0x1de; - WBUFW(buf,2)=skill_id; - WBUFL(buf,4)=src->id; - WBUFL(buf,8)=dst->id; - WBUFL(buf,12)=tick; - WBUFL(buf,16)=sdelay; - WBUFL(buf,20)=ddelay; - WBUFL(buf,24)=damage; - WBUFW(buf,28)=skill_lv; - WBUFW(buf,30)=div; - WBUFB(buf,32)=(type>0)?type:skill_get_hit(skill_id); - clif_send(buf,packet_len_table[0x1de],src,AREA); + WBUFW (buf, 0) = 0x1de; + WBUFW (buf, 2) = skill_id; + WBUFL (buf, 4) = src->id; + WBUFL (buf, 8) = dst->id; + WBUFL (buf, 12) = tick; + WBUFL (buf, 16) = sdelay; + WBUFL (buf, 20) = ddelay; + WBUFL (buf, 24) = damage; + WBUFW (buf, 28) = skill_lv; + WBUFW (buf, 30) = div; + WBUFB (buf, 32) = (type > 0) ? type : skill_get_hit (skill_id); + clif_send (buf, packet_len_table[0x1de], src, AREA); - return 0; + return 0; } /*========================================== * ソスソスソスソスソスソスソスホゑソスソスXソスLソスソスソスUソスソスソスGソスtソスFソスNソスgソスソスソス_ソスソスソス[ソスW *------------------------------------------ */ -int clif_skill_damage2(struct block_list *src,struct block_list *dst, - unsigned int tick,int sdelay,int ddelay,int damage,int div,int skill_id,int skill_lv,int type) +int clif_skill_damage2 (struct block_list *src, struct block_list *dst, + unsigned int tick, int sdelay, int ddelay, int damage, + int div, int skill_id, int skill_lv, int type) { - unsigned char buf[64]; - struct status_change *sc_data; + unsigned char buf[64]; + struct status_change *sc_data; - nullpo_retr(0, src); - nullpo_retr(0, dst); + nullpo_retr (0, src); + nullpo_retr (0, dst); - sc_data = battle_get_sc_data(dst); + sc_data = battle_get_sc_data (dst); - if(type != 5 && dst->type == BL_PC && ((struct map_session_data *)dst)->special_state.infinite_endure) - type = 9; - if(sc_data) { - if(type != 5 && sc_data[SC_ENDURE].timer != -1) - type = 9; - if(sc_data[SC_HALLUCINATION].timer != -1 && damage > 0) - damage = damage*(5+sc_data[SC_HALLUCINATION].val1) + MRAND(100); - } + if (type != 5 && dst->type == BL_PC + && ((struct map_session_data *) dst)->special_state.infinite_endure) + type = 9; + if (sc_data) + { + if (type != 5 && sc_data[SC_ENDURE].timer != -1) + type = 9; + if (sc_data[SC_HALLUCINATION].timer != -1 && damage > 0) + damage = + damage * (5 + sc_data[SC_HALLUCINATION].val1) + MRAND (100); + } - WBUFW(buf,0)=0x115; - WBUFW(buf,2)=skill_id; - WBUFL(buf,4)=src->id; - WBUFL(buf,8)=dst->id; - WBUFL(buf,12)=tick; - WBUFL(buf,16)=sdelay; - WBUFL(buf,20)=ddelay; - WBUFW(buf,24)=dst->x; - WBUFW(buf,26)=dst->y; - WBUFW(buf,28)=damage; - WBUFW(buf,30)=skill_lv; - WBUFW(buf,32)=div; - WBUFB(buf,34)=(type>0)?type:skill_get_hit(skill_id); - clif_send(buf,packet_len_table[0x115],src,AREA); + WBUFW (buf, 0) = 0x115; + WBUFW (buf, 2) = skill_id; + WBUFL (buf, 4) = src->id; + WBUFL (buf, 8) = dst->id; + WBUFL (buf, 12) = tick; + WBUFL (buf, 16) = sdelay; + WBUFL (buf, 20) = ddelay; + WBUFW (buf, 24) = dst->x; + WBUFW (buf, 26) = dst->y; + WBUFW (buf, 28) = damage; + WBUFW (buf, 30) = skill_lv; + WBUFW (buf, 32) = div; + WBUFB (buf, 34) = (type > 0) ? type : skill_get_hit (skill_id); + clif_send (buf, packet_len_table[0x115], src, AREA); - return 0; + return 0; } /*========================================== * ソスxソスソス/ソス復スソスLソスソスソスGソスtソスFソスNソスg *------------------------------------------ */ -int clif_skill_nodamage(struct block_list *src,struct block_list *dst, - int skill_id,int heal,int fail) +int clif_skill_nodamage (struct block_list *src, struct block_list *dst, + int skill_id, int heal, int fail) { - unsigned char buf[32]; + unsigned char buf[32]; - nullpo_retr(0, src); - nullpo_retr(0, dst); + nullpo_retr (0, src); + nullpo_retr (0, dst); - WBUFW(buf,0)=0x11a; - WBUFW(buf,2)=skill_id; - WBUFW(buf,4)=(heal > 0x7fff)? 0x7fff:heal; - WBUFL(buf,6)=dst->id; - WBUFL(buf,10)=src->id; - WBUFB(buf,14)=fail; - clif_send(buf,packet_len_table[0x11a],src,AREA); + WBUFW (buf, 0) = 0x11a; + WBUFW (buf, 2) = skill_id; + WBUFW (buf, 4) = (heal > 0x7fff) ? 0x7fff : heal; + WBUFL (buf, 6) = dst->id; + WBUFL (buf, 10) = src->id; + WBUFB (buf, 14) = fail; + clif_send (buf, packet_len_table[0x11a], src, AREA); - return 0; + return 0; } /*========================================== * ソス齒奇ソスXソスLソスソスソスGソスtソスFソスNソスg *------------------------------------------ */ -int clif_skill_poseffect(struct block_list *src,int skill_id,int val,int x,int y,int tick) +int clif_skill_poseffect (struct block_list *src, int skill_id, int val, + int x, int y, int tick) { - unsigned char buf[32]; + unsigned char buf[32]; - nullpo_retr(0, src); + nullpo_retr (0, src); - WBUFW(buf,0)=0x117; - WBUFW(buf,2)=skill_id; - WBUFL(buf,4)=src->id; - WBUFW(buf,8)=val; - WBUFW(buf,10)=x; - WBUFW(buf,12)=y; - WBUFL(buf,14)=tick; - clif_send(buf,packet_len_table[0x117],src,AREA); + WBUFW (buf, 0) = 0x117; + WBUFW (buf, 2) = skill_id; + WBUFL (buf, 4) = src->id; + WBUFW (buf, 8) = val; + WBUFW (buf, 10) = x; + WBUFW (buf, 12) = y; + WBUFL (buf, 14) = tick; + clif_send (buf, packet_len_table[0x117], src, AREA); - return 0; + return 0; } /*========================================== * ソス齒奇ソスXソスLソスソスソスGソスtソスFソスNソスgソス\ソスソス *------------------------------------------ */ -int clif_skill_setunit(struct skill_unit *unit) -{ - unsigned char buf[128]; - struct block_list *bl; - - nullpo_retr(0, unit); - - bl=map_id2bl(unit->group->src_id); - - memset(WBUFP(buf, 0),0,packet_len_table[0x1c9]); - WBUFW(buf, 0)=0x1c9; - WBUFL(buf, 2)=unit->bl.id; - WBUFL(buf, 6)=unit->group->src_id; - WBUFW(buf,10)=unit->bl.x; - WBUFW(buf,12)=unit->bl.y; - WBUFB(buf,14)=unit->group->unit_id; - WBUFB(buf,15)=1; - WBUFL(buf,15+1)=0; //1-4ソスソスソスラゑソスソスソスソスソスナ抵ソス - WBUFL(buf,15+5)=0; //5-8ソスソスソスラゑソスソスソスソスソスナ抵ソス - //9-12ソス}ソスbソスvソスソスソスニで茨ソスソスソスソスソス77-80ソスニはまゑソスソス痰、4ソスoソスCソスgソスフゑソスソスネゑソスソス蛯ォソスネ撰ソスソスソス - WBUFL(buf,15+13)=unit->bl.y - 0x12; //13-16ソスソスソスjソスbソスgソスソスYソスソスW-18ソスソスロゑソス(Y:17ソスソスFF FF FF FF) - WBUFL(buf,15+17)=0x004f37dd; //17-20ソスソスソスラゑソスソスソスソスソスナ抵ソス(0x1b2ソスソス0x004fdbddソスソスソスソスソス) - WBUFL(buf,15+21)=0x0012f674; //21-24ソスソスソスラゑソスソスソスソスソスナ抵ソス - WBUFL(buf,15+25)=0x0012f664; //25-28ソスソスソスラゑソスソスソスソスソスナ抵ソス - WBUFL(buf,15+29)=0x0012f654; //29-32ソスソスソスラゑソスソスソスソスソスナ抵ソス - WBUFL(buf,15+33)=0x77527bbc; //33-36ソスソスソスラゑソスソスソスソスソスナ抵ソス - //37-39 - WBUFB(buf,15+40)=0x2d; //40ソスソスソスラゑソスソスソスソスソスナ抵ソス - WBUFL(buf,15+41)=0; //41-44ソスソスソスラゑソスソスソスソス0ソスナ抵ソス - WBUFL(buf,15+45)=0; //45-48ソスソスソスラゑソスソスソスソス0ソスナ抵ソス - WBUFL(buf,15+49)=0; //49-52ソスソスソスラゑソスソスソスソス0ソスナ抵ソス - WBUFL(buf,15+53)=0x0048d919; //53-56ソスソスソスラゑソスソスソスソスソスナ抵ソス(0x01b2ソスソス0x00495119ソスソスソスソスソス) - WBUFL(buf,15+57)=0x0000003e; //57-60ソスソスソスラゑソスソスソスソスソスナ抵ソス - WBUFL(buf,15+61)=0x0012f66c; //61-64ソスソスソスラゑソスソスソスソスソスナ抵ソス - //65-68 - //69-72 - if(bl) WBUFL(buf,15+73)=bl->y; //73-76ソスpソスメゑソスYソスソスW - WBUFL(buf,15+77)=unit->bl.m; //77-80ソス}ソスbソスvIDソスソスソスネゑソスソスHソスソスソスネゑソス2ソスoソスCソスgソスナ托ソスソス閧サソスソスソスネ撰ソスソスソス - WBUFB(buf,15+81)=0xaa; //81ソスIソス[ソスソスソスソス0xaa - - /* Graffiti [Valaris] */ - if(unit->group->unit_id==0xb0) { - WBUFL(buf,15)=1; - WBUFL(buf,16)=1; - memcpy(WBUFP(buf,17),unit->group->valstr,80); - } - - clif_send(buf,packet_len_table[0x1c9],&unit->bl,AREA); - return 0; +int clif_skill_setunit (struct skill_unit *unit) +{ + unsigned char buf[128]; + struct block_list *bl; + + nullpo_retr (0, unit); + + bl = map_id2bl (unit->group->src_id); + + memset (WBUFP (buf, 0), 0, packet_len_table[0x1c9]); + WBUFW (buf, 0) = 0x1c9; + WBUFL (buf, 2) = unit->bl.id; + WBUFL (buf, 6) = unit->group->src_id; + WBUFW (buf, 10) = unit->bl.x; + WBUFW (buf, 12) = unit->bl.y; + WBUFB (buf, 14) = unit->group->unit_id; + WBUFB (buf, 15) = 1; + WBUFL (buf, 15 + 1) = 0; //1-4ソスソスソスラゑソスソスソスソスソスナ抵ソス + WBUFL (buf, 15 + 5) = 0; //5-8ソスソスソスラゑソスソスソスソスソスナ抵ソス + //9-12ソス}ソスbソスvソスソスソスニで茨ソスソスソスソスソス77-80ソスニはまゑソスソス痰、4ソスoソスCソスgソスフゑソスソスネゑソスソス蛯ォソスネ撰ソスソスソス + WBUFL (buf, 15 + 13) = unit->bl.y - 0x12; //13-16ソスソスソスjソスbソスgソスソスYソスソスW-18ソスソスロゑソス(Y:17ソスソスFF FF FF FF) + WBUFL (buf, 15 + 17) = 0x004f37dd; //17-20ソスソスソスラゑソスソスソスソスソスナ抵ソス(0x1b2ソスソス0x004fdbddソスソスソスソスソス) + WBUFL (buf, 15 + 21) = 0x0012f674; //21-24ソスソスソスラゑソスソスソスソスソスナ抵ソス + WBUFL (buf, 15 + 25) = 0x0012f664; //25-28ソスソスソスラゑソスソスソスソスソスナ抵ソス + WBUFL (buf, 15 + 29) = 0x0012f654; //29-32ソスソスソスラゑソスソスソスソスソスナ抵ソス + WBUFL (buf, 15 + 33) = 0x77527bbc; //33-36ソスソスソスラゑソスソスソスソスソスナ抵ソス + //37-39 + WBUFB (buf, 15 + 40) = 0x2d; //40ソスソスソスラゑソスソスソスソスソスナ抵ソス + WBUFL (buf, 15 + 41) = 0; //41-44ソスソスソスラゑソスソスソスソス0ソスナ抵ソス + WBUFL (buf, 15 + 45) = 0; //45-48ソスソスソスラゑソスソスソスソス0ソスナ抵ソス + WBUFL (buf, 15 + 49) = 0; //49-52ソスソスソスラゑソスソスソスソス0ソスナ抵ソス + WBUFL (buf, 15 + 53) = 0x0048d919; //53-56ソスソスソスラゑソスソスソスソスソスナ抵ソス(0x01b2ソスソス0x00495119ソスソスソスソスソス) + WBUFL (buf, 15 + 57) = 0x0000003e; //57-60ソスソスソスラゑソスソスソスソスソスナ抵ソス + WBUFL (buf, 15 + 61) = 0x0012f66c; //61-64ソスソスソスラゑソスソスソスソスソスナ抵ソス + //65-68 + //69-72 + if (bl) + WBUFL (buf, 15 + 73) = bl->y; //73-76ソスpソスメゑソスYソスソスW + WBUFL (buf, 15 + 77) = unit->bl.m; //77-80ソス}ソスbソスvIDソスソスソスネゑソスソスHソスソスソスネゑソス2ソスoソスCソスgソスナ托ソスソス閧サソスソスソスネ撰ソスソスソス + WBUFB (buf, 15 + 81) = 0xaa; //81ソスIソス[ソスソスソスソス0xaa + + /* Graffiti [Valaris] */ + if (unit->group->unit_id == 0xb0) + { + WBUFL (buf, 15) = 1; + WBUFL (buf, 16) = 1; + memcpy (WBUFP (buf, 17), unit->group->valstr, 80); + } + + clif_send (buf, packet_len_table[0x1c9], &unit->bl, AREA); + return 0; } + /*========================================== * ソス齒奇ソスXソスLソスソスソスGソスtソスFソスNソスgソス除 *------------------------------------------ */ -int clif_skill_delunit(struct skill_unit *unit) +int clif_skill_delunit (struct skill_unit *unit) { - unsigned char buf[16]; + unsigned char buf[16]; - nullpo_retr(0, unit); + nullpo_retr (0, unit); - WBUFW(buf, 0)=0x120; - WBUFL(buf, 2)=unit->bl.id; - clif_send(buf,packet_len_table[0x120],&unit->bl,AREA); - return 0; + WBUFW (buf, 0) = 0x120; + WBUFL (buf, 2) = unit->bl.id; + clif_send (buf, packet_len_table[0x120], &unit->bl, AREA); + return 0; } + /*========================================== * ソスソスソス[ソスvソス齒奇ソスIソスソス *------------------------------------------ */ -int clif_skill_warppoint(struct map_session_data *sd,int skill_num, - const char *map1,const char *map2,const char *map3,const char *map4) +int clif_skill_warppoint (struct map_session_data *sd, int skill_num, + const char *map1, const char *map2, + const char *map3, const char *map4) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x11c; - WFIFOW(fd,2)=skill_num; - memcpy(WFIFOP(fd, 4),map1,16); - memcpy(WFIFOP(fd,20),map2,16); - memcpy(WFIFOP(fd,36),map3,16); - memcpy(WFIFOP(fd,52),map4,16); - WFIFOSET(fd,packet_len_table[0x11c]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x11c; + WFIFOW (fd, 2) = skill_num; + memcpy (WFIFOP (fd, 4), map1, 16); + memcpy (WFIFOP (fd, 20), map2, 16); + memcpy (WFIFOP (fd, 36), map3, 16); + memcpy (WFIFOP (fd, 52), map4, 16); + WFIFOSET (fd, packet_len_table[0x11c]); + return 0; } + /*========================================== * ソスソスソスソスソスソスソスソス *------------------------------------------ */ -int clif_skill_memo(struct map_session_data *sd,int flag) +int clif_skill_memo (struct map_session_data *sd, int flag) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; + fd = sd->fd; - WFIFOW(fd,0)=0x11e; - WFIFOB(fd,2)=flag; - WFIFOSET(fd,packet_len_table[0x11e]); - return 0; + WFIFOW (fd, 0) = 0x11e; + WFIFOB (fd, 2) = flag; + WFIFOSET (fd, packet_len_table[0x11e]); + return 0; } -int clif_skill_teleportmessage(struct map_session_data *sd,int flag) + +int clif_skill_teleportmessage (struct map_session_data *sd, int flag) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x189; - WFIFOW(fd,2)=flag; - WFIFOSET(fd,packet_len_table[0x189]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x189; + WFIFOW (fd, 2) = flag; + WFIFOSET (fd, packet_len_table[0x189]); + return 0; } /*========================================== * ソスソスソスソスソスXソス^ソス[ソスソスソスソス *------------------------------------------ */ -int clif_skill_estimation(struct map_session_data *sd,struct block_list *dst) +int clif_skill_estimation (struct map_session_data *sd, + struct block_list *dst) { - struct mob_data *md; - unsigned char buf[64]; - int i; - - nullpo_retr(0, sd); - nullpo_retr(0, dst); - - if(dst->type!=BL_MOB ) - return 0; - if((md=(struct mob_data *)dst) == NULL) - return 0; - - WBUFW(buf, 0)=0x18c; - WBUFW(buf, 2)=mob_get_viewclass(md->class); - WBUFW(buf, 4)=mob_db[md->class].lv; - WBUFW(buf, 6)=mob_db[md->class].size; - WBUFL(buf, 8)=md->hp; - WBUFW(buf,12)=battle_get_def2(&md->bl); - WBUFW(buf,14)=mob_db[md->class].race; - WBUFW(buf,16)=battle_get_mdef2(&md->bl) - (mob_db[md->class].vit>>1); - WBUFW(buf,18)=battle_get_elem_type(&md->bl); - for(i=0;i<9;i++) - WBUFB(buf,20+i)= battle_attr_fix(100,i+1,md->def_ele); - - if(sd->status.party_id>0) - clif_send(buf,packet_len_table[0x18c],&sd->bl,PARTY_AREA); - else{ - memcpy(WFIFOP(sd->fd,0),buf,packet_len_table[0x18c]); - WFIFOSET(sd->fd,packet_len_table[0x18c]); - } - return 0; + struct mob_data *md; + unsigned char buf[64]; + int i; + + nullpo_retr (0, sd); + nullpo_retr (0, dst); + + if (dst->type != BL_MOB) + return 0; + if ((md = (struct mob_data *) dst) == NULL) + return 0; + + WBUFW (buf, 0) = 0x18c; + WBUFW (buf, 2) = mob_get_viewclass (md->class); + WBUFW (buf, 4) = mob_db[md->class].lv; + WBUFW (buf, 6) = mob_db[md->class].size; + WBUFL (buf, 8) = md->hp; + WBUFW (buf, 12) = battle_get_def2 (&md->bl); + WBUFW (buf, 14) = mob_db[md->class].race; + WBUFW (buf, 16) = + battle_get_mdef2 (&md->bl) - (mob_db[md->class].vit >> 1); + WBUFW (buf, 18) = battle_get_elem_type (&md->bl); + for (i = 0; i < 9; i++) + WBUFB (buf, 20 + i) = battle_attr_fix (100, i + 1, md->def_ele); + + if (sd->status.party_id > 0) + clif_send (buf, packet_len_table[0x18c], &sd->bl, PARTY_AREA); + else + { + memcpy (WFIFOP (sd->fd, 0), buf, packet_len_table[0x18c]); + WFIFOSET (sd->fd, packet_len_table[0x18c]); + } + return 0; } /*========================================== * ソスソスソスヤ異擾ソスソスAソスCソスRソスソス/ソスソスソスbソスZソス[ソスWソス\ソスソス *------------------------------------------ */ -int clif_status_change(struct block_list *bl,int type,int flag) +int clif_status_change (struct block_list *bl, int type, int flag) { - unsigned char buf[16]; + unsigned char buf[16]; - nullpo_retr(0, bl); + nullpo_retr (0, bl); - WBUFW(buf,0)=0x0196; - WBUFW(buf,2)=type; - WBUFL(buf,4)=bl->id; - WBUFB(buf,8)=flag; - clif_send(buf,packet_len_table[0x196],bl,AREA); - return 0; + WBUFW (buf, 0) = 0x0196; + WBUFW (buf, 2) = type; + WBUFL (buf, 4) = bl->id; + WBUFB (buf, 8) = flag; + clif_send (buf, packet_len_table[0x196], bl, AREA); + return 0; } /*========================================== * Send message (modified by [Yor]) *------------------------------------------ */ -int clif_displaymessage(const int fd, char* mes) +int clif_displaymessage (const int fd, char *mes) { - int len_mes = strlen(mes); + int len_mes = strlen (mes); - if (len_mes > 0) { // don't send a void message (it's not displaying on the client chat). @help can send void line. - WFIFOW(fd,0) = 0x8e; - WFIFOW(fd,2) = 5 + len_mes; // 4 + len + NULL teminate - memcpy(WFIFOP(fd,4), mes, len_mes + 1); - WFIFOSET(fd, 5 + len_mes); - } + if (len_mes > 0) + { // don't send a void message (it's not displaying on the client chat). @help can send void line. + WFIFOW (fd, 0) = 0x8e; + WFIFOW (fd, 2) = 5 + len_mes; // 4 + len + NULL teminate + memcpy (WFIFOP (fd, 4), mes, len_mes + 1); + WFIFOSET (fd, 5 + len_mes); + } - return 0; + return 0; } /*========================================== * ソスVソスフ撰ソスソス送信ソスソスソスソス *------------------------------------------ */ -int clif_GMmessage(struct block_list *bl, char* mes, int len, int flag) -{ - unsigned char lbuf[255]; - unsigned char *buf = ((len + 16) >= sizeof(lbuf)) ? malloc(len+16) : lbuf; - int lp = (flag&0x10) ? 8 : 4; - - WBUFW(buf,0) = 0x9a; - WBUFW(buf,2) = len + lp; - WBUFL(buf,4) = 0x65756c62; - memcpy(WBUFP(buf,lp), mes, len); - flag &= 0x07; - clif_send(buf, WBUFW(buf,2), bl, - (flag==1) ? ALL_SAMEMAP: - (flag==2) ? AREA: - (flag==3) ? SELF: - ALL_CLIENT); - if (buf != lbuf) - free(buf); - return 0; +int clif_GMmessage (struct block_list *bl, char *mes, int len, int flag) +{ + unsigned char lbuf[255]; + unsigned char *buf = + ((len + 16) >= sizeof (lbuf)) ? malloc (len + 16) : lbuf; + int lp = (flag & 0x10) ? 8 : 4; + + WBUFW (buf, 0) = 0x9a; + WBUFW (buf, 2) = len + lp; + WBUFL (buf, 4) = 0x65756c62; + memcpy (WBUFP (buf, lp), mes, len); + flag &= 0x07; + clif_send (buf, WBUFW (buf, 2), bl, + (flag == 1) ? ALL_SAMEMAP : + (flag == 2) ? AREA : (flag == 3) ? SELF : ALL_CLIENT); + if (buf != lbuf) + free (buf); + return 0; } /*========================================== * HPSPソス復エソスtソスFソスNソスgソス送信ソスソスソスソス *------------------------------------------ */ -int clif_heal(int fd,int type,int val) +int clif_heal (int fd, int type, int val) { - WFIFOW(fd,0)=0x13d; - WFIFOW(fd,2)=type; - WFIFOW(fd,4)=val; - WFIFOSET(fd,packet_len_table[0x13d]); + WFIFOW (fd, 0) = 0x13d; + WFIFOW (fd, 2) = type; + WFIFOW (fd, 4) = val; + WFIFOSET (fd, packet_len_table[0x13d]); - return 0; + return 0; } /*========================================== * ソスソスソスソスソスソスソスソス *------------------------------------------ */ -int clif_resurrection(struct block_list *bl,int type) +int clif_resurrection (struct block_list *bl, int type) { - unsigned char buf[16]; + unsigned char buf[16]; - nullpo_retr(0, bl); + nullpo_retr (0, bl); - if(bl->type==BL_PC) { // disguises [Valaris] - struct map_session_data *sd=((struct map_session_data *)bl); - if(sd && sd->disguise > 23 && sd->disguise < 4001) - clif_spawnpc(sd); - } + if (bl->type == BL_PC) + { // disguises [Valaris] + struct map_session_data *sd = ((struct map_session_data *) bl); + if (sd && sd->disguise > 23 && sd->disguise < 4001) + clif_spawnpc (sd); + } - WBUFW(buf,0)=0x148; - WBUFL(buf,2)=bl->id; - WBUFW(buf,6)=type; + WBUFW (buf, 0) = 0x148; + WBUFL (buf, 2) = bl->id; + WBUFW (buf, 6) = type; - clif_send(buf,packet_len_table[0x148],bl,type==1 ? AREA : AREA_WOS); + clif_send (buf, packet_len_table[0x148], bl, type == 1 ? AREA : AREA_WOS); - return 0; + return 0; } /*========================================== * PVPソスソスソスソスHソスiソスソスソスj *------------------------------------------ */ -int clif_set0199(int fd,int type) +int clif_set0199 (int fd, int type) { - WFIFOW(fd,0)=0x199; - WFIFOW(fd,2)=type; - WFIFOSET(fd,packet_len_table[0x199]); + WFIFOW (fd, 0) = 0x199; + WFIFOW (fd, 2) = type; + WFIFOSET (fd, packet_len_table[0x199]); - return 0; + return 0; } /*========================================== * PVPソスソスソスソスH(ソスソス) *------------------------------------------ */ -int clif_pvpset(struct map_session_data *sd,int pvprank,int pvpnum,int type) -{ - nullpo_retr(0, sd); - - if(map[sd->bl.m].flag.nopvp) - return 0; - - if(type == 2) { - WFIFOW(sd->fd,0) = 0x19a; - WFIFOL(sd->fd,2) = sd->bl.id; - if(pvprank<=0) - pc_calc_pvprank(sd); - WFIFOL(sd->fd,6) = pvprank; - WFIFOL(sd->fd,10) = pvpnum; - WFIFOSET(sd->fd,packet_len_table[0x19a]); - } else { - char buf[32]; - - WBUFW(buf,0) = 0x19a; - WBUFL(buf,2) = sd->bl.id; - if(sd->status.option&0x46) - WBUFL(buf,6) = -1; - else - if(pvprank<=0) - pc_calc_pvprank(sd); - WBUFL(buf,6) = pvprank; - WBUFL(buf,10) = pvpnum; - if(!type) - clif_send(buf,packet_len_table[0x19a],&sd->bl,AREA); - else - clif_send(buf,packet_len_table[0x19a],&sd->bl,ALL_SAMEMAP); - } +int clif_pvpset (struct map_session_data *sd, int pvprank, int pvpnum, + int type) +{ + nullpo_retr (0, sd); - return 0; + if (map[sd->bl.m].flag.nopvp) + return 0; + + if (type == 2) + { + WFIFOW (sd->fd, 0) = 0x19a; + WFIFOL (sd->fd, 2) = sd->bl.id; + if (pvprank <= 0) + pc_calc_pvprank (sd); + WFIFOL (sd->fd, 6) = pvprank; + WFIFOL (sd->fd, 10) = pvpnum; + WFIFOSET (sd->fd, packet_len_table[0x19a]); + } + else + { + char buf[32]; + + WBUFW (buf, 0) = 0x19a; + WBUFL (buf, 2) = sd->bl.id; + if (sd->status.option & 0x46) + WBUFL (buf, 6) = -1; + else if (pvprank <= 0) + pc_calc_pvprank (sd); + WBUFL (buf, 6) = pvprank; + WBUFL (buf, 10) = pvpnum; + if (!type) + clif_send (buf, packet_len_table[0x19a], &sd->bl, AREA); + else + clif_send (buf, packet_len_table[0x19a], &sd->bl, ALL_SAMEMAP); + } + + return 0; } /*========================================== * *------------------------------------------ */ -int clif_send0199(int map,int type) +int clif_send0199 (int map, int type) { - struct block_list bl; - char buf[16]; + struct block_list bl; + char buf[16]; - bl.m = map; - WBUFW(buf,0)=0x199; - WBUFW(buf,2)=type; - clif_send(buf,packet_len_table[0x199],&bl,ALL_SAMEMAP); + bl.m = map; + WBUFW (buf, 0) = 0x199; + WBUFW (buf, 2) = type; + clif_send (buf, packet_len_table[0x199], &bl, ALL_SAMEMAP); - return 0; + return 0; } /*========================================== * ソスソスソスBソスGソスtソスFソスNソスgソス送信ソスソスソスソス *------------------------------------------ */ -int clif_refine(int fd,struct map_session_data *sd,int fail,int index,int val) +int clif_refine (int fd, struct map_session_data *sd, int fail, int index, + int val) { - WFIFOW(fd,0)=0x188; - WFIFOW(fd,2)=fail; - WFIFOW(fd,4)=index+2; - WFIFOW(fd,6)=val; - WFIFOSET(fd,packet_len_table[0x188]); + WFIFOW (fd, 0) = 0x188; + WFIFOW (fd, 2) = fail; + WFIFOW (fd, 4) = index + 2; + WFIFOW (fd, 6) = val; + WFIFOSET (fd, packet_len_table[0x188]); - return 0; + return 0; } /*========================================== * Wisp/page is transmitted to the destination player *------------------------------------------ */ -int clif_wis_message(int fd, char *nick, char *mes, int mes_len) // R 0097 <len>.w <nick>.24B <message>.?B +int clif_wis_message (int fd, char *nick, char *mes, int mes_len) // R 0097 <len>.w <nick>.24B <message>.?B { - WFIFOW(fd,0) = 0x97; - WFIFOW(fd,2) = mes_len + 24 + 4; - memcpy(WFIFOP(fd,4), nick, 24); - memcpy(WFIFOP(fd,28), mes, mes_len); - WFIFOSET(fd,WFIFOW(fd,2)); - return 0; + WFIFOW (fd, 0) = 0x97; + WFIFOW (fd, 2) = mes_len + 24 + 4; + memcpy (WFIFOP (fd, 4), nick, 24); + memcpy (WFIFOP (fd, 28), mes, mes_len); + WFIFOSET (fd, WFIFOW (fd, 2)); + return 0; } /*========================================== * The transmission result of Wisp/page is transmitted to the source player *------------------------------------------ */ -int clif_wis_end(int fd, int flag) // R 0098 <type>.B: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target -{ - WFIFOW(fd,0) = 0x98; - WFIFOW(fd,2) = flag; - WFIFOSET(fd,packet_len_table[0x98]); - return 0; +int clif_wis_end (int fd, int flag) // R 0098 <type>.B: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target +{ + WFIFOW (fd, 0) = 0x98; + WFIFOW (fd, 2) = flag; + WFIFOSET (fd, packet_len_table[0x98]); + return 0; } /*========================================== * ソスLソスソスソスソスIDソスソスソスOソスソスソスソスソスソスソスハを送信ソスソスソスソス *------------------------------------------ */ -int clif_solved_charname(struct map_session_data *sd,int char_id) +int clif_solved_charname (struct map_session_data *sd, int char_id) { - char *p= map_charid2nick(char_id); - int fd; + char *p = map_charid2nick (char_id); + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - if(p!=NULL){ - WFIFOW(fd,0)=0x194; - WFIFOL(fd,2)=char_id; - memcpy(WFIFOP(fd,6), p,24 ); - WFIFOSET(fd,packet_len_table[0x194]); - }else{ - map_reqchariddb(sd,char_id); - chrif_searchcharid(char_id); - } - return 0; + fd = sd->fd; + if (p != NULL) + { + WFIFOW (fd, 0) = 0x194; + WFIFOL (fd, 2) = char_id; + memcpy (WFIFOP (fd, 6), p, 24); + WFIFOSET (fd, packet_len_table[0x194]); + } + else + { + map_reqchariddb (sd, char_id); + chrif_searchcharid (char_id); + } + return 0; } /*========================================== * ソスJソス[ソスhソスフ挿ソスソスソスツ能ソスソスソスXソスgソスソスソスヤゑソス *------------------------------------------ */ -int clif_use_card(struct map_session_data *sd,int idx) -{ - nullpo_retr(0, sd); - - if(sd->inventory_data[idx]) { - int i,c; - int ep=sd->inventory_data[idx]->equip; - int fd=sd->fd; - WFIFOW(fd,0)=0x017b; - - for(i=c=0;i<MAX_INVENTORY;i++){ - int j; - - if(sd->inventory_data[i] == NULL) - continue; - if(sd->inventory_data[i]->type!=4 && sd->inventory_data[i]->type!=5) // ソスソスソスソスソスhソスじソスソスソスネゑソス - continue; - if(sd->status.inventory[i].card[0]==0x00ff) // ソスソスソスソスソスソスソスソス - continue; - if(sd->status.inventory[i].card[0]==(short)0xff00 || sd->status.inventory[i].card[0]==0x00fe) - continue; - if(sd->status.inventory[i].identify==0 ) // ソスソスソスモ抵ソス - continue; - - if((sd->inventory_data[i]->equip&ep)==0) // ソスソスソスソスソスツ擾ソスソスソスソス痰、 - continue; - if(sd->inventory_data[i]->type==4 && ep==32) // ソスソスソスJソス[ソスhソスニ暦ソスソス阨撰ソスソス - continue; - - for(j=0;j<sd->inventory_data[i]->slot;j++){ - if( sd->status.inventory[i].card[j]==0 ) - break; - } - if(j==sd->inventory_data[i]->slot) // ソスソスソスナにカソス[ソスhソスソスソスソスソスt - continue; - - WFIFOW(fd,4+c*2)=i+2; - c++; - } - WFIFOW(fd,2)=4+c*2; - WFIFOSET(fd,WFIFOW(fd,2)); - } +int clif_use_card (struct map_session_data *sd, int idx) +{ + nullpo_retr (0, sd); + + if (sd->inventory_data[idx]) + { + int i, c; + int ep = sd->inventory_data[idx]->equip; + int fd = sd->fd; + WFIFOW (fd, 0) = 0x017b; + + for (i = c = 0; i < MAX_INVENTORY; i++) + { + int j; + + if (sd->inventory_data[i] == NULL) + continue; + if (sd->inventory_data[i]->type != 4 && sd->inventory_data[i]->type != 5) // ソスソスソスソスソスhソスじソスソスソスネゑソス + continue; + if (sd->status.inventory[i].card[0] == 0x00ff) // ソスソスソスソスソスソスソスソス + continue; + if (sd->status.inventory[i].card[0] == (short) 0xff00 + || sd->status.inventory[i].card[0] == 0x00fe) + continue; + if (sd->status.inventory[i].identify == 0) // ソスソスソスモ抵ソス + continue; + + if ((sd->inventory_data[i]->equip & ep) == 0) // ソスソスソスソスソスツ擾ソスソスソスソス痰、 + continue; + if (sd->inventory_data[i]->type == 4 && ep == 32) // ソスソスソスJソス[ソスhソスニ暦ソスソス阨撰ソスソス + continue; + + for (j = 0; j < sd->inventory_data[i]->slot; j++) + { + if (sd->status.inventory[i].card[j] == 0) + break; + } + if (j == sd->inventory_data[i]->slot) // ソスソスソスナにカソス[ソスhソスソスソスソスソスt + continue; - return 0; + WFIFOW (fd, 4 + c * 2) = i + 2; + c++; + } + WFIFOW (fd, 2) = 4 + c * 2; + WFIFOSET (fd, WFIFOW (fd, 2)); + } + + return 0; } + /*========================================== * ソスJソス[ソスhソスフ挿ソスソスソスIソスソス *------------------------------------------ */ -int clif_insert_card(struct map_session_data *sd,int idx_equip,int idx_card,int flag) +int clif_insert_card (struct map_session_data *sd, int idx_equip, + int idx_card, int flag) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x17d; - WFIFOW(fd,2)=idx_equip+2; - WFIFOW(fd,4)=idx_card+2; - WFIFOB(fd,6)=flag; - WFIFOSET(fd,packet_len_table[0x17d]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x17d; + WFIFOW (fd, 2) = idx_equip + 2; + WFIFOW (fd, 4) = idx_card + 2; + WFIFOB (fd, 6) = flag; + WFIFOSET (fd, packet_len_table[0x17d]); + return 0; } /*========================================== * ソスモ抵ソスソスツ能ソスAソスCソスeソスソスソスソスソスXソスgソスソスソスM *------------------------------------------ */ -int clif_item_identify_list(struct map_session_data *sd) +int clif_item_identify_list (struct map_session_data *sd) { - int i,c; - int fd; + int i, c; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; + fd = sd->fd; - WFIFOW(fd,0)=0x177; - for(i=c=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].identify!=1){ - WFIFOW(fd,c*2+4)=i+2; - c++; - } - } - if(c > 0) { - WFIFOW(fd,2)=c*2+4; - WFIFOSET(fd,WFIFOW(fd,2)); - } - return 0; + WFIFOW (fd, 0) = 0x177; + for (i = c = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid > 0 + && sd->status.inventory[i].identify != 1) + { + WFIFOW (fd, c * 2 + 4) = i + 2; + c++; + } + } + if (c > 0) + { + WFIFOW (fd, 2) = c * 2 + 4; + WFIFOSET (fd, WFIFOW (fd, 2)); + } + return 0; } /*========================================== * ソスモ定結ソスソス *------------------------------------------ */ -int clif_item_identified(struct map_session_data *sd,int idx,int flag) +int clif_item_identified (struct map_session_data *sd, int idx, int flag) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd, 0)=0x179; - WFIFOW(fd, 2)=idx+2; - WFIFOB(fd, 4)=flag; - WFIFOSET(fd,packet_len_table[0x179]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x179; + WFIFOW (fd, 2) = idx + 2; + WFIFOB (fd, 4) = flag; + WFIFOSET (fd, packet_len_table[0x179]); + return 0; } /*========================================== @@ -4513,336 +4946,371 @@ int clif_item_identified(struct map_session_data *sd,int idx,int flag) * ソスソスソスソスロのパソスPソスbソスgソスソスソスかソスソスソスネゑソスソスフで難ソスソスしソスワゑソスソスソス *------------------------------------------ */ -int clif_item_repair_list(struct map_session_data *sd) +int clif_item_repair_list (struct map_session_data *sd) { - int i,c; - int fd; + int i, c; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; + fd = sd->fd; - WFIFOW(fd,0)=0x0; - for(i=c=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].broken!=0){ - WFIFOW(fd,c*2+4)=i+2; - c++; - } - } - if(c > 0) { - WFIFOW(fd,2)=c*2+4; - WFIFOSET(fd,WFIFOW(fd,2)); - } - return 0; + WFIFOW (fd, 0) = 0x0; + for (i = c = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid > 0 + && sd->status.inventory[i].broken != 0) + { + WFIFOW (fd, c * 2 + 4) = i + 2; + c++; + } + } + if (c > 0) + { + WFIFOW (fd, 2) = c * 2 + 4; + WFIFOSET (fd, WFIFOW (fd, 2)); + } + return 0; } /*========================================== * ソスAソスCソスeソスソスソスノゑソスソスソスソス齊橸ソスIソスネスソスLソスソスソスソスソスソス *------------------------------------------ */ -int clif_item_skill(struct map_session_data *sd,int skillid,int skilllv,const char *name) +int clif_item_skill (struct map_session_data *sd, int skillid, int skilllv, + const char *name) { - int range,fd; + int range, fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd, 0)=0x147; - WFIFOW(fd, 2)=skillid; - WFIFOW(fd, 4)=skill_get_inf(skillid); - WFIFOW(fd, 6)=0; - WFIFOW(fd, 8)=skilllv; - WFIFOW(fd,10)=skill_get_sp(skillid,skilllv); - range = skill_get_range(skillid,skilllv); - if(range < 0) - range = battle_get_range(&sd->bl) - (range + 1); - WFIFOW(fd,12)=range; - memcpy(WFIFOP(fd,14),name,24); - WFIFOB(fd,38)=0; - WFIFOSET(fd,packet_len_table[0x147]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x147; + WFIFOW (fd, 2) = skillid; + WFIFOW (fd, 4) = skill_get_inf (skillid); + WFIFOW (fd, 6) = 0; + WFIFOW (fd, 8) = skilllv; + WFIFOW (fd, 10) = skill_get_sp (skillid, skilllv); + range = skill_get_range (skillid, skilllv); + if (range < 0) + range = battle_get_range (&sd->bl) - (range + 1); + WFIFOW (fd, 12) = range; + memcpy (WFIFOP (fd, 14), name, 24); + WFIFOB (fd, 38) = 0; + WFIFOSET (fd, packet_len_table[0x147]); + return 0; } /*========================================== * ソスJソス[ソスgソスノアソスCソスeソスソスソスヌ会ソス *------------------------------------------ */ -int clif_cart_additem(struct map_session_data *sd,int n,int amount,int fail) -{ - int view,j,fd; - unsigned char *buf; - - nullpo_retr(0, sd); - - fd=sd->fd; - buf=WFIFOP(fd,0); - if(n<0 || n>=MAX_CART || sd->status.cart[n].nameid<=0) - return 1; - - WBUFW(buf,0)=0x124; - WBUFW(buf,2)=n+2; - WBUFL(buf,4)=amount; - if((view = itemdb_viewid(sd->status.cart[n].nameid)) > 0) - WBUFW(buf,8)=view; - else - WBUFW(buf,8)=sd->status.cart[n].nameid; - WBUFB(buf,10)=sd->status.cart[n].identify; - if(sd->status.cart[n].broken==1) //is weapon broken [Valaris] - WBUFB(buf,11)=1; - else - WBUFB(buf,11)=sd->status.cart[n].attribute; - WBUFB(buf,12)=sd->status.cart[n].refine; - if(sd->status.cart[n].card[0]==0x00ff || sd->status.cart[n].card[0]==0x00fe || sd->status.cart[n].card[0]==(short)0xff00) { - WBUFW(buf,13)=sd->status.cart[n].card[0]; - WBUFW(buf,15)=sd->status.cart[n].card[1]; - WBUFW(buf,17)=sd->status.cart[n].card[2]; - WBUFW(buf,19)=sd->status.cart[n].card[3]; - } else { - if(sd->status.cart[n].card[0] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[0])) > 0) - WBUFW(buf,13)= j; - else - WBUFW(buf,13)= sd->status.cart[n].card[0]; - if(sd->status.cart[n].card[1] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[1])) > 0) - WBUFW(buf,15)= j; - else - WBUFW(buf,15)= sd->status.cart[n].card[1]; - if(sd->status.cart[n].card[2] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[2])) > 0) - WBUFW(buf,17)= j; - else - WBUFW(buf,17)= sd->status.cart[n].card[2]; - if(sd->status.cart[n].card[3] > 0 && (j=itemdb_viewid(sd->status.cart[n].card[3])) > 0) - WBUFW(buf,19)= j; - else - WBUFW(buf,19)= sd->status.cart[n].card[3]; - } - WFIFOSET(fd,packet_len_table[0x124]); - return 0; +int clif_cart_additem (struct map_session_data *sd, int n, int amount, + int fail) +{ + int view, j, fd; + unsigned char *buf; + + nullpo_retr (0, sd); + + fd = sd->fd; + buf = WFIFOP (fd, 0); + if (n < 0 || n >= MAX_CART || sd->status.cart[n].nameid <= 0) + return 1; + + WBUFW (buf, 0) = 0x124; + WBUFW (buf, 2) = n + 2; + WBUFL (buf, 4) = amount; + if ((view = itemdb_viewid (sd->status.cart[n].nameid)) > 0) + WBUFW (buf, 8) = view; + else + WBUFW (buf, 8) = sd->status.cart[n].nameid; + WBUFB (buf, 10) = sd->status.cart[n].identify; + if (sd->status.cart[n].broken == 1) //is weapon broken [Valaris] + WBUFB (buf, 11) = 1; + else + WBUFB (buf, 11) = sd->status.cart[n].attribute; + WBUFB (buf, 12) = sd->status.cart[n].refine; + if (sd->status.cart[n].card[0] == 0x00ff + || sd->status.cart[n].card[0] == 0x00fe + || sd->status.cart[n].card[0] == (short) 0xff00) + { + WBUFW (buf, 13) = sd->status.cart[n].card[0]; + WBUFW (buf, 15) = sd->status.cart[n].card[1]; + WBUFW (buf, 17) = sd->status.cart[n].card[2]; + WBUFW (buf, 19) = sd->status.cart[n].card[3]; + } + else + { + if (sd->status.cart[n].card[0] > 0 + && (j = itemdb_viewid (sd->status.cart[n].card[0])) > 0) + WBUFW (buf, 13) = j; + else + WBUFW (buf, 13) = sd->status.cart[n].card[0]; + if (sd->status.cart[n].card[1] > 0 + && (j = itemdb_viewid (sd->status.cart[n].card[1])) > 0) + WBUFW (buf, 15) = j; + else + WBUFW (buf, 15) = sd->status.cart[n].card[1]; + if (sd->status.cart[n].card[2] > 0 + && (j = itemdb_viewid (sd->status.cart[n].card[2])) > 0) + WBUFW (buf, 17) = j; + else + WBUFW (buf, 17) = sd->status.cart[n].card[2]; + if (sd->status.cart[n].card[3] > 0 + && (j = itemdb_viewid (sd->status.cart[n].card[3])) > 0) + WBUFW (buf, 19) = j; + else + WBUFW (buf, 19) = sd->status.cart[n].card[3]; + } + WFIFOSET (fd, packet_len_table[0x124]); + return 0; } /*========================================== * ソスJソス[ソスgソスソスソスソスソスAソスCソスeソスソスソス除 *------------------------------------------ */ -int clif_cart_delitem(struct map_session_data *sd,int n,int amount) +int clif_cart_delitem (struct map_session_data *sd, int n, int amount) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; + fd = sd->fd; - WFIFOW(fd,0)=0x125; - WFIFOW(fd,2)=n+2; - WFIFOL(fd,4)=amount; + WFIFOW (fd, 0) = 0x125; + WFIFOW (fd, 2) = n + 2; + WFIFOL (fd, 4) = amount; - WFIFOSET(fd,packet_len_table[0x125]); + WFIFOSET (fd, packet_len_table[0x125]); - return 0; + return 0; } /*========================================== * ソスJソス[ソスgソスフアソスCソスeソスソスソスソスソスXソスg *------------------------------------------ */ -int clif_cart_itemlist(struct map_session_data *sd) -{ - struct item_data *id; - int i,n,fd; - unsigned char *buf; - - nullpo_retr(0, sd); - - fd=sd->fd; - buf = WFIFOP(fd,0); - WBUFW(buf,0)=0x1ef; - for(i=0,n=0;i<MAX_CART;i++){ - if(sd->status.cart[i].nameid<=0) - continue; - id = itemdb_search(sd->status.cart[i].nameid); - if(itemdb_isequip2(id)) - continue; - WBUFW(buf,n*18+4)=i+2; - if(id->view_id > 0) - WBUFW(buf,n*18+6)=id->view_id; - else - WBUFW(buf,n*18+6)=sd->status.cart[i].nameid; - WBUFB(buf,n*18+8)=id->type; - WBUFB(buf,n*18+9)=sd->status.cart[i].identify; - WBUFW(buf,n*18+10)=sd->status.cart[i].amount; - WBUFW(buf,n*18+12)=0; - WBUFW(buf,n*18+14)=sd->status.cart[i].card[0]; - WBUFW(buf,n*18+16)=sd->status.cart[i].card[1]; - WBUFW(buf,n*18+18)=sd->status.cart[i].card[2]; - WBUFW(buf,n*18+20)=sd->status.cart[i].card[3]; - n++; - } - if(n){ - WBUFW(buf,2)=4+n*18; - WFIFOSET(fd,WFIFOW(fd,2)); - } - return 0; +int clif_cart_itemlist (struct map_session_data *sd) +{ + struct item_data *id; + int i, n, fd; + unsigned char *buf; + + nullpo_retr (0, sd); + + fd = sd->fd; + buf = WFIFOP (fd, 0); + WBUFW (buf, 0) = 0x1ef; + for (i = 0, n = 0; i < MAX_CART; i++) + { + if (sd->status.cart[i].nameid <= 0) + continue; + id = itemdb_search (sd->status.cart[i].nameid); + if (itemdb_isequip2 (id)) + continue; + WBUFW (buf, n * 18 + 4) = i + 2; + if (id->view_id > 0) + WBUFW (buf, n * 18 + 6) = id->view_id; + else + WBUFW (buf, n * 18 + 6) = sd->status.cart[i].nameid; + WBUFB (buf, n * 18 + 8) = id->type; + WBUFB (buf, n * 18 + 9) = sd->status.cart[i].identify; + WBUFW (buf, n * 18 + 10) = sd->status.cart[i].amount; + WBUFW (buf, n * 18 + 12) = 0; + WBUFW (buf, n * 18 + 14) = sd->status.cart[i].card[0]; + WBUFW (buf, n * 18 + 16) = sd->status.cart[i].card[1]; + WBUFW (buf, n * 18 + 18) = sd->status.cart[i].card[2]; + WBUFW (buf, n * 18 + 20) = sd->status.cart[i].card[3]; + n++; + } + if (n) + { + WBUFW (buf, 2) = 4 + n * 18; + WFIFOSET (fd, WFIFOW (fd, 2)); + } + return 0; } /*========================================== * ソスJソス[ソスgソスフ托ソスソスソスソスiソスソスソスXソスg *------------------------------------------ */ -int clif_cart_equiplist(struct map_session_data *sd) -{ - struct item_data *id; - int i,j,n,fd; - unsigned char *buf; - - nullpo_retr(0, sd); - - fd=sd->fd; - buf = WFIFOP(fd,0); - - WBUFW(buf,0)=0x122; - for(i=0,n=0;i<MAX_INVENTORY;i++){ - if(sd->status.cart[i].nameid<=0) - continue; - id = itemdb_search(sd->status.cart[i].nameid); - if(!itemdb_isequip2(id)) - continue; - WBUFW(buf,n*20+4)=i+2; - if(id->view_id > 0) - WBUFW(buf,n*20+6)=id->view_id; - else - WBUFW(buf,n*20+6)=sd->status.cart[i].nameid; - WBUFB(buf,n*20+8)=id->type; - WBUFB(buf,n*20+9)=sd->status.cart[i].identify; - WBUFW(buf,n*20+10)=id->equip; - WBUFW(buf,n*20+12)=sd->status.cart[i].equip; - if(sd->status.cart[i].broken==1) - WBUFB(buf,n*20+14)=1; //is weapon broken [Valaris] - else - WBUFB(buf,n*20+14)=sd->status.cart[i].attribute; - WBUFB(buf,n*20+15)=sd->status.cart[i].refine; - if(sd->status.cart[i].card[0]==0x00ff || sd->status.cart[i].card[0]==0x00fe || sd->status.cart[i].card[0]==(short)0xff00) { - WBUFW(buf,n*20+16)=sd->status.cart[i].card[0]; - WBUFW(buf,n*20+18)=sd->status.cart[i].card[1]; - WBUFW(buf,n*20+20)=sd->status.cart[i].card[2]; - WBUFW(buf,n*20+22)=sd->status.cart[i].card[3]; - } else { - if(sd->status.cart[i].card[0] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[0])) > 0) - WBUFW(buf,n*20+16)= j; - else - WBUFW(buf,n*20+16)= sd->status.cart[i].card[0]; - if(sd->status.cart[i].card[1] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[1])) > 0) - WBUFW(buf,n*20+18)= j; - else - WBUFW(buf,n*20+18)= sd->status.cart[i].card[1]; - if(sd->status.cart[i].card[2] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[2])) > 0) - WBUFW(buf,n*20+20)= j; - else - WBUFW(buf,n*20+20)= sd->status.cart[i].card[2]; - if(sd->status.cart[i].card[3] > 0 && (j=itemdb_viewid(sd->status.cart[i].card[3])) > 0) - WBUFW(buf,n*20+22)= j; - else - WBUFW(buf,n*20+22)= sd->status.cart[i].card[3]; - } - n++; - } - if(n){ - WBUFW(buf,2)=4+n*20; - WFIFOSET(fd,WFIFOW(fd,2)); - } - return 0; +int clif_cart_equiplist (struct map_session_data *sd) +{ + struct item_data *id; + int i, j, n, fd; + unsigned char *buf; + + nullpo_retr (0, sd); + + fd = sd->fd; + buf = WFIFOP (fd, 0); + + WBUFW (buf, 0) = 0x122; + for (i = 0, n = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.cart[i].nameid <= 0) + continue; + id = itemdb_search (sd->status.cart[i].nameid); + if (!itemdb_isequip2 (id)) + continue; + WBUFW (buf, n * 20 + 4) = i + 2; + if (id->view_id > 0) + WBUFW (buf, n * 20 + 6) = id->view_id; + else + WBUFW (buf, n * 20 + 6) = sd->status.cart[i].nameid; + WBUFB (buf, n * 20 + 8) = id->type; + WBUFB (buf, n * 20 + 9) = sd->status.cart[i].identify; + WBUFW (buf, n * 20 + 10) = id->equip; + WBUFW (buf, n * 20 + 12) = sd->status.cart[i].equip; + if (sd->status.cart[i].broken == 1) + WBUFB (buf, n * 20 + 14) = 1; //is weapon broken [Valaris] + else + WBUFB (buf, n * 20 + 14) = sd->status.cart[i].attribute; + WBUFB (buf, n * 20 + 15) = sd->status.cart[i].refine; + if (sd->status.cart[i].card[0] == 0x00ff + || sd->status.cart[i].card[0] == 0x00fe + || sd->status.cart[i].card[0] == (short) 0xff00) + { + WBUFW (buf, n * 20 + 16) = sd->status.cart[i].card[0]; + WBUFW (buf, n * 20 + 18) = sd->status.cart[i].card[1]; + WBUFW (buf, n * 20 + 20) = sd->status.cart[i].card[2]; + WBUFW (buf, n * 20 + 22) = sd->status.cart[i].card[3]; + } + else + { + if (sd->status.cart[i].card[0] > 0 + && (j = itemdb_viewid (sd->status.cart[i].card[0])) > 0) + WBUFW (buf, n * 20 + 16) = j; + else + WBUFW (buf, n * 20 + 16) = sd->status.cart[i].card[0]; + if (sd->status.cart[i].card[1] > 0 + && (j = itemdb_viewid (sd->status.cart[i].card[1])) > 0) + WBUFW (buf, n * 20 + 18) = j; + else + WBUFW (buf, n * 20 + 18) = sd->status.cart[i].card[1]; + if (sd->status.cart[i].card[2] > 0 + && (j = itemdb_viewid (sd->status.cart[i].card[2])) > 0) + WBUFW (buf, n * 20 + 20) = j; + else + WBUFW (buf, n * 20 + 20) = sd->status.cart[i].card[2]; + if (sd->status.cart[i].card[3] > 0 + && (j = itemdb_viewid (sd->status.cart[i].card[3])) > 0) + WBUFW (buf, n * 20 + 22) = j; + else + WBUFW (buf, n * 20 + 22) = sd->status.cart[i].card[3]; + } + n++; + } + if (n) + { + WBUFW (buf, 2) = 4 + n * 20; + WFIFOSET (fd, WFIFOW (fd, 2)); + } + return 0; } /*========================================== * ソスpソス[ソスeソスBソス成ソスソスソスソス *------------------------------------------ */ -int clif_party_created(struct map_session_data *sd,int flag) +int clif_party_created (struct map_session_data *sd, int flag) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xfa; - WFIFOB(fd,2)=flag; - WFIFOSET(fd,packet_len_table[0xfa]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0xfa; + WFIFOB (fd, 2) = flag; + WFIFOSET (fd, packet_len_table[0xfa]); + return 0; } + /*========================================== * ソスpソス[ソスeソスBソスソスソス送信 *------------------------------------------ */ -int clif_party_info(struct party *p,int fd) -{ - unsigned char buf[1024]; - int i,c; - struct map_session_data *sd=NULL; - - nullpo_retr(0, p); - - WBUFW(buf,0)=0xfb; - memcpy(WBUFP(buf,4),p->name,24); - for(i=c=0;i<MAX_PARTY;i++){ - struct party_member *m=&p->member[i]; - if(m->account_id>0){ - if(sd==NULL) sd=m->sd; - WBUFL(buf,28+c*46)=m->account_id; - memcpy(WBUFP(buf,28+c*46+ 4),m->name,24); - memcpy(WBUFP(buf,28+c*46+28),m->map,16); - WBUFB(buf,28+c*46+44)=(m->leader)?0:1; - WBUFB(buf,28+c*46+45)=(m->online)?0:1; - c++; - } - } - WBUFW(buf,2)=28+c*46; - if(fd>=0){ // fdソスソスソスン定さソスソスソストゑソスソスネらそソスソスソスノ托ソスソスソス - memcpy(WFIFOP(fd,0),buf,WBUFW(buf,2)); - WFIFOSET(fd,WFIFOW(fd,2)); - return 9; - } - if(sd!=NULL) - clif_send(buf,WBUFW(buf,2),&sd->bl,PARTY); - return 0; +int clif_party_info (struct party *p, int fd) +{ + unsigned char buf[1024]; + int i, c; + struct map_session_data *sd = NULL; + + nullpo_retr (0, p); + + WBUFW (buf, 0) = 0xfb; + memcpy (WBUFP (buf, 4), p->name, 24); + for (i = c = 0; i < MAX_PARTY; i++) + { + struct party_member *m = &p->member[i]; + if (m->account_id > 0) + { + if (sd == NULL) + sd = m->sd; + WBUFL (buf, 28 + c * 46) = m->account_id; + memcpy (WBUFP (buf, 28 + c * 46 + 4), m->name, 24); + memcpy (WBUFP (buf, 28 + c * 46 + 28), m->map, 16); + WBUFB (buf, 28 + c * 46 + 44) = (m->leader) ? 0 : 1; + WBUFB (buf, 28 + c * 46 + 45) = (m->online) ? 0 : 1; + c++; + } + } + WBUFW (buf, 2) = 28 + c * 46; + if (fd >= 0) + { // fdソスソスソスン定さソスソスソストゑソスソスネらそソスソスソスノ托ソスソスソス + memcpy (WFIFOP (fd, 0), buf, WBUFW (buf, 2)); + WFIFOSET (fd, WFIFOW (fd, 2)); + return 9; + } + if (sd != NULL) + clif_send (buf, WBUFW (buf, 2), &sd->bl, PARTY); + return 0; } + /*========================================== * ソスpソス[ソスeソスBソスソスソスU *------------------------------------------ */ -int clif_party_invite(struct map_session_data *sd,struct map_session_data *tsd) +int clif_party_invite (struct map_session_data *sd, + struct map_session_data *tsd) { - int fd; - struct party *p; + int fd; + struct party *p; - nullpo_retr(0, sd); - nullpo_retr(0, tsd); + nullpo_retr (0, sd); + nullpo_retr (0, tsd); - fd=tsd->fd; + fd = tsd->fd; - if( (p=party_search(sd->status.party_id))==NULL ) - return 0; + if ((p = party_search (sd->status.party_id)) == NULL) + return 0; - WFIFOW(fd,0)=0xfe; - WFIFOL(fd,2)=sd->status.account_id; - memcpy(WFIFOP(fd,6),p->name,24); - WFIFOSET(fd,packet_len_table[0xfe]); - return 0; + WFIFOW (fd, 0) = 0xfe; + WFIFOL (fd, 2) = sd->status.account_id; + memcpy (WFIFOP (fd, 6), p->name, 24); + WFIFOSET (fd, packet_len_table[0xfe]); + return 0; } /*========================================== * ソスpソス[ソスeソスBソスソスソスUソスソスソスソス *------------------------------------------ */ -int clif_party_inviteack(struct map_session_data *sd,char *nick,int flag) +int clif_party_inviteack (struct map_session_data *sd, char *nick, int flag) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xfd; - memcpy(WFIFOP(fd,2),nick,24); - WFIFOB(fd,26)=flag; - WFIFOSET(fd,packet_len_table[0xfd]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0xfd; + memcpy (WFIFOP (fd, 2), nick, 24); + WFIFOB (fd, 26) = flag; + WFIFOSET (fd, packet_len_table[0xfd]); + return 0; } /*========================================== @@ -4852,998 +5320,1083 @@ int clif_party_inviteack(struct map_session_data *sd,char *nick,int flag) * 0x100=ソスソスソスlソスノのみ托ソスソスM *------------------------------------------ */ -int clif_party_option(struct party *p,struct map_session_data *sd,int flag) +int clif_party_option (struct party *p, struct map_session_data *sd, int flag) { - unsigned char buf[16]; + unsigned char buf[16]; - nullpo_retr(0, p); + nullpo_retr (0, p); -// if(battle_config.etc_log) -// printf("clif_party_option: %d %d %d\n",p->exp,p->item,flag); - if(sd==NULL && flag==0){ - int i; - for(i=0;i<MAX_PARTY;i++) - if((sd=map_id2sd(p->member[i].account_id))!=NULL) - break; - } - if(sd==NULL) - return 0; - WBUFW(buf,0)=0x101; - WBUFW(buf,2)=((flag&0x01)?2:p->exp); - WBUFW(buf,4)=((flag&0x10)?2:p->item); - if(flag==0) - clif_send(buf,packet_len_table[0x101],&sd->bl,PARTY); - else { - memcpy(WFIFOP(sd->fd,0),buf,packet_len_table[0x101]); - WFIFOSET(sd->fd,packet_len_table[0x101]); - } - return 0; +// if(battle_config.etc_log) +// printf("clif_party_option: %d %d %d\n",p->exp,p->item,flag); + if (sd == NULL && flag == 0) + { + int i; + for (i = 0; i < MAX_PARTY; i++) + if ((sd = map_id2sd (p->member[i].account_id)) != NULL) + break; + } + if (sd == NULL) + return 0; + WBUFW (buf, 0) = 0x101; + WBUFW (buf, 2) = ((flag & 0x01) ? 2 : p->exp); + WBUFW (buf, 4) = ((flag & 0x10) ? 2 : p->item); + if (flag == 0) + clif_send (buf, packet_len_table[0x101], &sd->bl, PARTY); + else + { + memcpy (WFIFOP (sd->fd, 0), buf, packet_len_table[0x101]); + WFIFOSET (sd->fd, packet_len_table[0x101]); + } + return 0; } + /*========================================== * ソスpソス[ソスeソスBソスEソズ(ソスEソズ前ソスノ呼ぶゑソスソスニ) *------------------------------------------ */ -int clif_party_leaved(struct party *p,struct map_session_data *sd,int account_id,char *name,int flag) +int clif_party_leaved (struct party *p, struct map_session_data *sd, + int account_id, char *name, int flag) { - unsigned char buf[64]; - int i; - - nullpo_retr(0, p); - - WBUFW(buf,0)=0x105; - WBUFL(buf,2)=account_id; - memcpy(WBUFP(buf,6),name,24); - WBUFB(buf,30)=flag&0x0f; - - if((flag&0xf0)==0){ - if(sd==NULL) - for(i=0;i<MAX_PARTY;i++) - if((sd=p->member[i].sd)!=NULL) - break; - if (sd!=NULL) - clif_send(buf,packet_len_table[0x105],&sd->bl,PARTY); - } else if (sd!=NULL) { - memcpy(WFIFOP(sd->fd,0),buf,packet_len_table[0x105]); - WFIFOSET(sd->fd,packet_len_table[0x105]); - } - return 0; + unsigned char buf[64]; + int i; + + nullpo_retr (0, p); + + WBUFW (buf, 0) = 0x105; + WBUFL (buf, 2) = account_id; + memcpy (WBUFP (buf, 6), name, 24); + WBUFB (buf, 30) = flag & 0x0f; + + if ((flag & 0xf0) == 0) + { + if (sd == NULL) + for (i = 0; i < MAX_PARTY; i++) + if ((sd = p->member[i].sd) != NULL) + break; + if (sd != NULL) + clif_send (buf, packet_len_table[0x105], &sd->bl, PARTY); + } + else if (sd != NULL) + { + memcpy (WFIFOP (sd->fd, 0), buf, packet_len_table[0x105]); + WFIFOSET (sd->fd, packet_len_table[0x105]); + } + return 0; } + /*========================================== * ソスpソス[ソスeソスBソスソスソスbソスZソス[ソスWソスソスソスM *------------------------------------------ */ -int clif_party_message(struct party *p,int account_id,char *mes,int len) +int clif_party_message (struct party *p, int account_id, char *mes, int len) { - struct map_session_data *sd; - int i; + struct map_session_data *sd; + int i; - nullpo_retr(0, p); + nullpo_retr (0, p); - for(i=0;i<MAX_PARTY;i++){ - if((sd=p->member[i].sd)!=NULL) - break; - } - if(sd!=NULL){ - unsigned char buf[1024]; - WBUFW(buf,0)=0x109; - WBUFW(buf,2)=len+8; - WBUFL(buf,4)=account_id; - memcpy(WBUFP(buf,8),mes,len); - clif_send(buf,len+8,&sd->bl,PARTY); - } - return 0; + for (i = 0; i < MAX_PARTY; i++) + { + if ((sd = p->member[i].sd) != NULL) + break; + } + if (sd != NULL) + { + unsigned char buf[1024]; + WBUFW (buf, 0) = 0x109; + WBUFW (buf, 2) = len + 8; + WBUFL (buf, 4) = account_id; + memcpy (WBUFP (buf, 8), mes, len); + clif_send (buf, len + 8, &sd->bl, PARTY); + } + return 0; } + /*========================================== * ソスpソス[ソスeソスBソスソスWソスハ知 *------------------------------------------ */ -int clif_party_xy(struct party *p,struct map_session_data *sd) +int clif_party_xy (struct party *p, struct map_session_data *sd) { - unsigned char buf[16]; + unsigned char buf[16]; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - WBUFW(buf,0)=0x107; - WBUFL(buf,2)=sd->status.account_id; - WBUFW(buf,6)=sd->bl.x; - WBUFW(buf,8)=sd->bl.y; - clif_send(buf,packet_len_table[0x107],&sd->bl,PARTY_SAMEMAP_WOS); -// if(battle_config.etc_log) -// printf("clif_party_xy %d\n",sd->status.account_id); - return 0; + WBUFW (buf, 0) = 0x107; + WBUFL (buf, 2) = sd->status.account_id; + WBUFW (buf, 6) = sd->bl.x; + WBUFW (buf, 8) = sd->bl.y; + clif_send (buf, packet_len_table[0x107], &sd->bl, PARTY_SAMEMAP_WOS); +// if(battle_config.etc_log) +// printf("clif_party_xy %d\n",sd->status.account_id); + return 0; } + /*========================================== * ソスpソス[ソスeソスBHPソスハ知 *------------------------------------------ */ -int clif_party_hp(struct party *p,struct map_session_data *sd) +int clif_party_hp (struct party *p, struct map_session_data *sd) { - unsigned char buf[16]; + unsigned char buf[16]; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - WBUFW(buf,0)=0x106; - WBUFL(buf,2)=sd->status.account_id; - WBUFW(buf,6)=(sd->status.hp > 0x7fff)? 0x7fff:sd->status.hp; - WBUFW(buf,8)=(sd->status.max_hp > 0x7fff)? 0x7fff:sd->status.max_hp; - clif_send(buf,packet_len_table[0x106],&sd->bl,PARTY_AREA_WOS); -// if(battle_config.etc_log) -// printf("clif_party_hp %d\n",sd->status.account_id); - return 0; + WBUFW (buf, 0) = 0x106; + WBUFL (buf, 2) = sd->status.account_id; + WBUFW (buf, 6) = (sd->status.hp > 0x7fff) ? 0x7fff : sd->status.hp; + WBUFW (buf, 8) = + (sd->status.max_hp > 0x7fff) ? 0x7fff : sd->status.max_hp; + clif_send (buf, packet_len_table[0x106], &sd->bl, PARTY_AREA_WOS); +// if(battle_config.etc_log) +// printf("clif_party_hp %d\n",sd->status.account_id); + return 0; } + /*========================================== * ソスpソス[ソスeソスBソス齒奇ソスレ難ソスソスiソスソスソスgソスpソスj *------------------------------------------ */ -int clif_party_move(struct party *p,struct map_session_data *sd,int online) +int clif_party_move (struct party *p, struct map_session_data *sd, int online) { - unsigned char buf[128]; + unsigned char buf[128]; - nullpo_retr(0, sd); - nullpo_retr(0, p); + nullpo_retr (0, sd); + nullpo_retr (0, p); - WBUFW(buf, 0)=0x104; - WBUFL(buf, 2)=sd->status.account_id; - WBUFL(buf, 6)=0; - WBUFW(buf,10)=sd->bl.x; - WBUFW(buf,12)=sd->bl.y; - WBUFB(buf,14)=!online; - memcpy(WBUFP(buf,15),p->name,24); - memcpy(WBUFP(buf,39),sd->status.name,24); - memcpy(WBUFP(buf,63),map[sd->bl.m].name,16); - clif_send(buf,packet_len_table[0x104],&sd->bl,PARTY); - return 0; + WBUFW (buf, 0) = 0x104; + WBUFL (buf, 2) = sd->status.account_id; + WBUFL (buf, 6) = 0; + WBUFW (buf, 10) = sd->bl.x; + WBUFW (buf, 12) = sd->bl.y; + WBUFB (buf, 14) = !online; + memcpy (WBUFP (buf, 15), p->name, 24); + memcpy (WBUFP (buf, 39), sd->status.name, 24); + memcpy (WBUFP (buf, 63), map[sd->bl.m].name, 16); + clif_send (buf, packet_len_table[0x104], &sd->bl, PARTY); + return 0; } + /*========================================== * ソスUソスソスソスソスソス驍スソス゚に移難ソスソスソスソスKソスv *------------------------------------------ */ -int clif_movetoattack(struct map_session_data *sd,struct block_list *bl) +int clif_movetoattack (struct map_session_data *sd, struct block_list *bl) { - int fd; + int fd; - nullpo_retr(0, sd); - nullpo_retr(0, bl); + nullpo_retr (0, sd); + nullpo_retr (0, bl); - fd=sd->fd; - WFIFOW(fd, 0)=0x139; - WFIFOL(fd, 2)=bl->id; - WFIFOW(fd, 6)=bl->x; - WFIFOW(fd, 8)=bl->y; - WFIFOW(fd,10)=sd->bl.x; - WFIFOW(fd,12)=sd->bl.y; - WFIFOW(fd,14)=sd->attackrange; - WFIFOSET(fd,packet_len_table[0x139]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x139; + WFIFOL (fd, 2) = bl->id; + WFIFOW (fd, 6) = bl->x; + WFIFOW (fd, 8) = bl->y; + WFIFOW (fd, 10) = sd->bl.x; + WFIFOW (fd, 12) = sd->bl.y; + WFIFOW (fd, 14) = sd->attackrange; + WFIFOSET (fd, packet_len_table[0x139]); + return 0; } + /*========================================== * ソスソスソスソスソスGソスtソスFソスNソスg *------------------------------------------ */ -int clif_produceeffect(struct map_session_data *sd,int flag,int nameid) +int clif_produceeffect (struct map_session_data *sd, int flag, int nameid) { - int view,fd; + int view, fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - // ソスソスソスOソスフ登ソス^ソスニ托ソスソスMソスソスソスソスソスノゑソスソストゑソスソスソス - if( map_charid2nick(sd->status.char_id)==NULL ) - map_addchariddb(sd->status.char_id,sd->status.name); - clif_solved_charname(sd,sd->status.char_id); + fd = sd->fd; + // ソスソスソスOソスフ登ソス^ソスニ托ソスソスMソスソスソスソスソスノゑソスソストゑソスソスソス + if (map_charid2nick (sd->status.char_id) == NULL) + map_addchariddb (sd->status.char_id, sd->status.name); + clif_solved_charname (sd, sd->status.char_id); - WFIFOW(fd, 0)=0x18f; - WFIFOW(fd, 2)=flag; - if((view = itemdb_viewid(nameid)) > 0) - WFIFOW(fd, 4)=view; - else - WFIFOW(fd, 4)=nameid; - WFIFOSET(fd,packet_len_table[0x18f]); - return 0; + WFIFOW (fd, 0) = 0x18f; + WFIFOW (fd, 2) = flag; + if ((view = itemdb_viewid (nameid)) > 0) + WFIFOW (fd, 4) = view; + else + WFIFOW (fd, 4) = nameid; + WFIFOSET (fd, packet_len_table[0x18f]); + return 0; } /*========================================== * ソスIソス[ソスgソスXソスyソスソス ソスソスソスXソスgソスソスソスM *------------------------------------------ */ -int clif_autospell(struct map_session_data *sd,int skilllv) -{ - int fd; - - nullpo_retr(0, sd); - - fd=sd->fd; - WFIFOW(fd, 0)=0x1cd; - - if(skilllv>0 && pc_checkskill(sd,MG_NAPALMBEAT)>0) - WFIFOL(fd,2)= MG_NAPALMBEAT; - else - WFIFOL(fd,2)= 0x00000000; - if(skilllv>1 && pc_checkskill(sd,MG_COLDBOLT)>0) - WFIFOL(fd,6)= MG_COLDBOLT; - else - WFIFOL(fd,6)= 0x00000000; - if(skilllv>1 && pc_checkskill(sd,MG_FIREBOLT)>0) - WFIFOL(fd,10)= MG_FIREBOLT; - else - WFIFOL(fd,10)= 0x00000000; - if(skilllv>1 && pc_checkskill(sd,MG_LIGHTNINGBOLT)>0) - WFIFOL(fd,14)= MG_LIGHTNINGBOLT; - else - WFIFOL(fd,14)= 0x00000000; - if(skilllv>4 && pc_checkskill(sd,MG_SOULSTRIKE)>0) - WFIFOL(fd,18)= MG_SOULSTRIKE; - else - WFIFOL(fd,18)= 0x00000000; - if(skilllv>7 && pc_checkskill(sd,MG_FIREBALL)>0) - WFIFOL(fd,22)= MG_FIREBALL; - else - WFIFOL(fd,22)= 0x00000000; - if(skilllv>9 && pc_checkskill(sd,MG_FROSTDIVER)>0) - WFIFOL(fd,26)= MG_FROSTDIVER; - else - WFIFOL(fd,26)= 0x00000000; - - WFIFOSET(fd,packet_len_table[0x1cd]); - return 0; +int clif_autospell (struct map_session_data *sd, int skilllv) +{ + int fd; + + nullpo_retr (0, sd); + + fd = sd->fd; + WFIFOW (fd, 0) = 0x1cd; + + if (skilllv > 0 && pc_checkskill (sd, MG_NAPALMBEAT) > 0) + WFIFOL (fd, 2) = MG_NAPALMBEAT; + else + WFIFOL (fd, 2) = 0x00000000; + if (skilllv > 1 && pc_checkskill (sd, MG_COLDBOLT) > 0) + WFIFOL (fd, 6) = MG_COLDBOLT; + else + WFIFOL (fd, 6) = 0x00000000; + if (skilllv > 1 && pc_checkskill (sd, MG_FIREBOLT) > 0) + WFIFOL (fd, 10) = MG_FIREBOLT; + else + WFIFOL (fd, 10) = 0x00000000; + if (skilllv > 1 && pc_checkskill (sd, MG_LIGHTNINGBOLT) > 0) + WFIFOL (fd, 14) = MG_LIGHTNINGBOLT; + else + WFIFOL (fd, 14) = 0x00000000; + if (skilllv > 4 && pc_checkskill (sd, MG_SOULSTRIKE) > 0) + WFIFOL (fd, 18) = MG_SOULSTRIKE; + else + WFIFOL (fd, 18) = 0x00000000; + if (skilllv > 7 && pc_checkskill (sd, MG_FIREBALL) > 0) + WFIFOL (fd, 22) = MG_FIREBALL; + else + WFIFOL (fd, 22) = 0x00000000; + if (skilllv > 9 && pc_checkskill (sd, MG_FROSTDIVER) > 0) + WFIFOL (fd, 26) = MG_FROSTDIVER; + else + WFIFOL (fd, 26) = 0x00000000; + + WFIFOSET (fd, packet_len_table[0x1cd]); + return 0; } /*========================================== * ソスfソスBソス{ソス[ソスVソスソスソスソスソスフ青ゑソスソスソス *------------------------------------------ */ -int clif_devotion(struct map_session_data *sd,int target) +int clif_devotion (struct map_session_data *sd, int target) { - unsigned char buf[56]; - int n; + unsigned char buf[56]; + int n; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - WBUFW(buf,0)=0x1cf; - WBUFL(buf,2)=sd->bl.id; -// WBUFL(buf,6)=target; - for(n=0;n<5;n++) - WBUFL(buf,6+4*n)=sd->dev.val2[n]; -// WBUFL(buf,10+4*n)=0; - WBUFB(buf,26)=8; - WBUFB(buf,27)=0; + WBUFW (buf, 0) = 0x1cf; + WBUFL (buf, 2) = sd->bl.id; +// WBUFL(buf,6)=target; + for (n = 0; n < 5; n++) + WBUFL (buf, 6 + 4 * n) = sd->dev.val2[n]; +// WBUFL(buf,10+4*n)=0; + WBUFB (buf, 26) = 8; + WBUFB (buf, 27) = 0; - clif_send(buf,packet_len_table[0x1cf],&sd->bl,AREA); - return 0; + clif_send (buf, packet_len_table[0x1cf], &sd->bl, AREA); + return 0; } /*========================================== * ソスソスソスソス *------------------------------------------ */ -int clif_spiritball(struct map_session_data *sd) +int clif_spiritball (struct map_session_data *sd) { - unsigned char buf[16]; + unsigned char buf[16]; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - WBUFW(buf,0)=0x1d0; - WBUFL(buf,2)=sd->bl.id; - WBUFW(buf,6)=sd->spiritball; - clif_send(buf,packet_len_table[0x1d0],&sd->bl,AREA); - return 0; + WBUFW (buf, 0) = 0x1d0; + WBUFL (buf, 2) = sd->bl.id; + WBUFW (buf, 6) = sd->spiritball; + clif_send (buf, packet_len_table[0x1d0], &sd->bl, AREA); + return 0; } /*========================================== * *------------------------------------------ */ -int clif_combo_delay(struct block_list *bl,int wait) +int clif_combo_delay (struct block_list *bl, int wait) { - unsigned char buf[32]; + unsigned char buf[32]; - nullpo_retr(0, bl); + nullpo_retr (0, bl); - WBUFW(buf,0)=0x1d2; - WBUFL(buf,2)=bl->id; - WBUFL(buf,6)=wait; - clif_send(buf,packet_len_table[0x1d2],bl,AREA); + WBUFW (buf, 0) = 0x1d2; + WBUFL (buf, 2) = bl->id; + WBUFL (buf, 6) = wait; + clif_send (buf, packet_len_table[0x1d2], bl, AREA); - return 0; + return 0; } + /*========================================== *ソスソスソスnソスソスソスソス *------------------------------------------ */ -int clif_bladestop(struct block_list *src,struct block_list *dst, - int bool) +int clif_bladestop (struct block_list *src, struct block_list *dst, int bool) { - unsigned char buf[32]; + unsigned char buf[32]; - nullpo_retr(0, src); - nullpo_retr(0, dst); + nullpo_retr (0, src); + nullpo_retr (0, dst); - WBUFW(buf,0)=0x1d1; - WBUFL(buf,2)=src->id; - WBUFL(buf,6)=dst->id; - WBUFL(buf,10)=bool; + WBUFW (buf, 0) = 0x1d1; + WBUFL (buf, 2) = src->id; + WBUFL (buf, 6) = dst->id; + WBUFL (buf, 10) = bool; - clif_send(buf,packet_len_table[0x1d1],src,AREA); + clif_send (buf, packet_len_table[0x1d1], src, AREA); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int clif_changemapcell(int m,int x,int y,int cell_type,int type) +int clif_changemapcell (int m, int x, int y, int cell_type, int type) { - struct block_list bl; - char buf[32]; + struct block_list bl; + char buf[32]; - bl.m = m; - bl.x = x; - bl.y = y; - WBUFW(buf,0) = 0x192; - WBUFW(buf,2) = x; - WBUFW(buf,4) = y; - WBUFW(buf,6) = cell_type; - memcpy(WBUFP(buf,8),map[m].name,16); - if(!type) - clif_send(buf,packet_len_table[0x192],&bl,AREA); - else - clif_send(buf,packet_len_table[0x192],&bl,ALL_SAMEMAP); + bl.m = m; + bl.x = x; + bl.y = y; + WBUFW (buf, 0) = 0x192; + WBUFW (buf, 2) = x; + WBUFW (buf, 4) = y; + WBUFW (buf, 6) = cell_type; + memcpy (WBUFP (buf, 8), map[m].name, 16); + if (!type) + clif_send (buf, packet_len_table[0x192], &bl, AREA); + else + clif_send (buf, packet_len_table[0x192], &bl, ALL_SAMEMAP); - return 0; + return 0; } /*========================================== * MVPソスGソスtソスFソスNソスg *------------------------------------------ */ -int clif_mvp_effect(struct map_session_data *sd) +int clif_mvp_effect (struct map_session_data *sd) { - unsigned char buf[16]; + unsigned char buf[16]; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - WBUFW(buf,0)=0x10c; - WBUFL(buf,2)=sd->bl.id; - clif_send(buf,packet_len_table[0x10c],&sd->bl,AREA); - return 0; + WBUFW (buf, 0) = 0x10c; + WBUFL (buf, 2) = sd->bl.id; + clif_send (buf, packet_len_table[0x10c], &sd->bl, AREA); + return 0; } + /*========================================== * MVPソスAソスCソスeソスソスソスソスソスソス *------------------------------------------ */ -int clif_mvp_item(struct map_session_data *sd,int nameid) +int clif_mvp_item (struct map_session_data *sd, int nameid) { - int view,fd; + int view, fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x10a; - if((view = itemdb_viewid(nameid)) > 0) - WFIFOW(fd,2)=view; - else - WFIFOW(fd,2)=nameid; - WFIFOSET(fd,packet_len_table[0x10a]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x10a; + if ((view = itemdb_viewid (nameid)) > 0) + WFIFOW (fd, 2) = view; + else + WFIFOW (fd, 2) = nameid; + WFIFOSET (fd, packet_len_table[0x10a]); + return 0; } + /*========================================== * MVPソスoソスソスソスlソスソスソスソス *------------------------------------------ */ -int clif_mvp_exp(struct map_session_data *sd,int exp) +int clif_mvp_exp (struct map_session_data *sd, int exp) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x10b; - WFIFOL(fd,2)=exp; - WFIFOSET(fd,packet_len_table[0x10b]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x10b; + WFIFOL (fd, 2) = exp; + WFIFOSET (fd, packet_len_table[0x10b]); + return 0; } /*========================================== * ソスMソスソスソスhソス成ソスツ否通知 *------------------------------------------ */ -int clif_guild_created(struct map_session_data *sd,int flag) +int clif_guild_created (struct map_session_data *sd, int flag) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x167; - WFIFOB(fd,2)=flag; - WFIFOSET(fd,packet_len_table[0x167]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x167; + WFIFOB (fd, 2) = flag; + WFIFOSET (fd, packet_len_table[0x167]); + return 0; } + /*========================================== * ソスMソスソスソスhソスソスソスソスソスハ知 *------------------------------------------ */ -int clif_guild_belonginfo(struct map_session_data *sd,struct guild *g) +int clif_guild_belonginfo (struct map_session_data *sd, struct guild *g) { - int ps,fd; + int ps, fd; - nullpo_retr(0, sd); - nullpo_retr(0, g); + nullpo_retr (0, sd); + nullpo_retr (0, g); - fd=sd->fd; - ps=guild_getposition(sd,g); + fd = sd->fd; + ps = guild_getposition (sd, g); - memset(WFIFOP(fd,0),0,packet_len_table[0x16c]); - WFIFOW(fd,0)=0x16c; - WFIFOL(fd,2)=g->guild_id; - WFIFOL(fd,6)=g->emblem_id; - WFIFOL(fd,10)=g->position[ps].mode; - memcpy(WFIFOP(fd,19),g->name,24); - WFIFOSET(fd,packet_len_table[0x16c]); - return 0; + memset (WFIFOP (fd, 0), 0, packet_len_table[0x16c]); + WFIFOW (fd, 0) = 0x16c; + WFIFOL (fd, 2) = g->guild_id; + WFIFOL (fd, 6) = g->emblem_id; + WFIFOL (fd, 10) = g->position[ps].mode; + memcpy (WFIFOP (fd, 19), g->name, 24); + WFIFOSET (fd, packet_len_table[0x16c]); + return 0; } + /*========================================== * ソスMソスソスソスhソスソスソスソスソスoソスソスソスOソスCソスソスソスハ知 *------------------------------------------ */ -int clif_guild_memberlogin_notice(struct guild *g,int idx,int flag) +int clif_guild_memberlogin_notice (struct guild *g, int idx, int flag) { - unsigned char buf[64]; + unsigned char buf[64]; - nullpo_retr(0, g); - - WBUFW(buf, 0)=0x16d; - WBUFL(buf, 2)=g->member[idx].account_id; - WBUFL(buf, 6)=g->member[idx].char_id; - WBUFL(buf,10)=flag; - if(g->member[idx].sd==NULL){ - struct map_session_data *sd=guild_getavailablesd(g); - if(sd!=NULL) - clif_send(buf,packet_len_table[0x16d],&sd->bl,GUILD); - }else - clif_send(buf,packet_len_table[0x16d],&g->member[idx].sd->bl,GUILD_WOS); - return 0; + nullpo_retr (0, g); + + WBUFW (buf, 0) = 0x16d; + WBUFL (buf, 2) = g->member[idx].account_id; + WBUFL (buf, 6) = g->member[idx].char_id; + WBUFL (buf, 10) = flag; + if (g->member[idx].sd == NULL) + { + struct map_session_data *sd = guild_getavailablesd (g); + if (sd != NULL) + clif_send (buf, packet_len_table[0x16d], &sd->bl, GUILD); + } + else + clif_send (buf, packet_len_table[0x16d], &g->member[idx].sd->bl, + GUILD_WOS); + return 0; } + /*========================================== * ソスMソスソスソスhソス}ソスXソス^ソス[ソスハ知(14dソスヨの会ソスソスソス) *------------------------------------------ */ -int clif_guild_masterormember(struct map_session_data *sd) +int clif_guild_masterormember (struct map_session_data *sd) { - int type=0x57,fd; - struct guild *g; + int type = 0x57, fd; + struct guild *g; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - g=guild_search(sd->status.guild_id); - if(g!=NULL && strcmp(g->master,sd->status.name)==0) - type=0xd7; - WFIFOW(fd,0)=0x14e; - WFIFOL(fd,2)=type; - WFIFOSET(fd,packet_len_table[0x14e]); - return 0; + fd = sd->fd; + g = guild_search (sd->status.guild_id); + if (g != NULL && strcmp (g->master, sd->status.name) == 0) + type = 0xd7; + WFIFOW (fd, 0) = 0x14e; + WFIFOL (fd, 2) = type; + WFIFOSET (fd, packet_len_table[0x14e]); + return 0; } + /*========================================== * Basic Info (Territories [Valaris]) *------------------------------------------ */ -int clif_guild_basicinfo(struct map_session_data *sd) -{ - int fd,i,t=0; - struct guild *g; - struct guild_castle *gc=NULL; - - nullpo_retr(0, sd); - - fd=sd->fd; - g=guild_search(sd->status.guild_id); - if(g==NULL) - return 0; - - WFIFOW(fd, 0)=0x1b6;//0x150; - WFIFOL(fd, 2)=g->guild_id; - WFIFOL(fd, 6)=g->guild_lv; - WFIFOL(fd,10)=g->connect_member; - WFIFOL(fd,14)=g->max_member; - WFIFOL(fd,18)=g->average_lv; - WFIFOL(fd,22)=g->exp; - WFIFOL(fd,26)=g->next_exp; - WFIFOL(fd,30)=0; // ソスソスソス[ - WFIFOL(fd,34)=0; // VWソスiソスソスソスiソスフ茨ソスソスソスソスHソスFソスソスソスソスソスOソスソスソスtソスソスソスEソスj - WFIFOL(fd,38)=0; // RFソスiソスソスソス`ソスフ度ソスソスソスソスソスHソスFソスソスソスソスソスOソスソスソスtソス繪コソスj - WFIFOL(fd,42)=0; // ソスlソスソスソスH - memcpy(WFIFOP(fd,46),g->name,24); - memcpy(WFIFOP(fd,70),g->master,24); - - for(i=0;i<MAX_GUILDCASTLE;i++){ - gc=guild_castle_search(i); - if(!gc) continue; - if(g->guild_id == gc->guild_id) t++; - } +int clif_guild_basicinfo (struct map_session_data *sd) +{ + int fd, i, t = 0; + struct guild *g; + struct guild_castle *gc = NULL; - if (t==1) memcpy(WFIFOP(fd,94),"One Castle",20); - else if (t==2) memcpy(WFIFOP(fd,94),"Two Castles",20); - else if (t==3) memcpy(WFIFOP(fd,94),"Three Castles",20); - else if (t==4) memcpy(WFIFOP(fd,94),"Four Castles",20); - else if (t==5) memcpy(WFIFOP(fd,94),"Five Castles",20); - else if (t==6) memcpy(WFIFOP(fd,94),"Six Castles",20); - else if (t==7) memcpy(WFIFOP(fd,94),"Seven Castles",20); - else if (t==8) memcpy(WFIFOP(fd,94),"Eight Castles",20); - else if (t==9) memcpy(WFIFOP(fd,94),"Nine Castles",20); - else if (t==10) memcpy(WFIFOP(fd,94),"Ten Castles",20); - else if (t==11) memcpy(WFIFOP(fd,94),"Eleven Castles",20); - else if (t==12) memcpy(WFIFOP(fd,94),"Twelve Castles",20); - else if (t==13) memcpy(WFIFOP(fd,94),"Thirteen Castles",20); - else if (t==14) memcpy(WFIFOP(fd,94),"Fourteen Castles",20); - else if (t==15) memcpy(WFIFOP(fd,94),"Fifteen Castles",20); - else if (t==16) memcpy(WFIFOP(fd,94),"Sixteen Castles",20); - else if (t==17) memcpy(WFIFOP(fd,94),"Seventeen Castles",20); - else if (t==18) memcpy(WFIFOP(fd,94),"Eighteen Castles",20); - else if (t==19) memcpy(WFIFOP(fd,94),"Nineteen Castles",20); - else if (t==20) memcpy(WFIFOP(fd,94),"Twenty Castles",20); - else if (t==21) memcpy(WFIFOP(fd,94),"Twenty One Castles",20); - else if (t==22) memcpy(WFIFOP(fd,94),"Twenty Two Castles",20); - else if (t==23) memcpy(WFIFOP(fd,94),"Twenty Three Castles",20); - else if (t==24) memcpy(WFIFOP(fd,94),"Twenty Four Castles",20); - else if (t==MAX_GUILDCASTLE) memcpy(WFIFOP(fd,94),"Total Domination",20); - else memcpy(WFIFOP(fd,94),"None Taken",20); - - WFIFOSET(fd,packet_len_table[WFIFOW(fd,0)]); - clif_guild_emblem(sd,g); // Guild emblem vanish fix [Valaris] - return 0; + nullpo_retr (0, sd); + + fd = sd->fd; + g = guild_search (sd->status.guild_id); + if (g == NULL) + return 0; + + WFIFOW (fd, 0) = 0x1b6; //0x150; + WFIFOL (fd, 2) = g->guild_id; + WFIFOL (fd, 6) = g->guild_lv; + WFIFOL (fd, 10) = g->connect_member; + WFIFOL (fd, 14) = g->max_member; + WFIFOL (fd, 18) = g->average_lv; + WFIFOL (fd, 22) = g->exp; + WFIFOL (fd, 26) = g->next_exp; + WFIFOL (fd, 30) = 0; // ソスソスソス[ + WFIFOL (fd, 34) = 0; // VWソスiソスソスソスiソスフ茨ソスソスソスソスHソスFソスソスソスソスソスOソスソスソスtソスソスソスEソスj + WFIFOL (fd, 38) = 0; // RFソスiソスソスソス`ソスフ度ソスソスソスソスソスHソスFソスソスソスソスソスOソスソスソスtソス繪コソスj + WFIFOL (fd, 42) = 0; // ソスlソスソスソスH + memcpy (WFIFOP (fd, 46), g->name, 24); + memcpy (WFIFOP (fd, 70), g->master, 24); + + for (i = 0; i < MAX_GUILDCASTLE; i++) + { + gc = guild_castle_search (i); + if (!gc) + continue; + if (g->guild_id == gc->guild_id) + t++; + } + + if (t == 1) + memcpy (WFIFOP (fd, 94), "One Castle", 20); + else if (t == 2) + memcpy (WFIFOP (fd, 94), "Two Castles", 20); + else if (t == 3) + memcpy (WFIFOP (fd, 94), "Three Castles", 20); + else if (t == 4) + memcpy (WFIFOP (fd, 94), "Four Castles", 20); + else if (t == 5) + memcpy (WFIFOP (fd, 94), "Five Castles", 20); + else if (t == 6) + memcpy (WFIFOP (fd, 94), "Six Castles", 20); + else if (t == 7) + memcpy (WFIFOP (fd, 94), "Seven Castles", 20); + else if (t == 8) + memcpy (WFIFOP (fd, 94), "Eight Castles", 20); + else if (t == 9) + memcpy (WFIFOP (fd, 94), "Nine Castles", 20); + else if (t == 10) + memcpy (WFIFOP (fd, 94), "Ten Castles", 20); + else if (t == 11) + memcpy (WFIFOP (fd, 94), "Eleven Castles", 20); + else if (t == 12) + memcpy (WFIFOP (fd, 94), "Twelve Castles", 20); + else if (t == 13) + memcpy (WFIFOP (fd, 94), "Thirteen Castles", 20); + else if (t == 14) + memcpy (WFIFOP (fd, 94), "Fourteen Castles", 20); + else if (t == 15) + memcpy (WFIFOP (fd, 94), "Fifteen Castles", 20); + else if (t == 16) + memcpy (WFIFOP (fd, 94), "Sixteen Castles", 20); + else if (t == 17) + memcpy (WFIFOP (fd, 94), "Seventeen Castles", 20); + else if (t == 18) + memcpy (WFIFOP (fd, 94), "Eighteen Castles", 20); + else if (t == 19) + memcpy (WFIFOP (fd, 94), "Nineteen Castles", 20); + else if (t == 20) + memcpy (WFIFOP (fd, 94), "Twenty Castles", 20); + else if (t == 21) + memcpy (WFIFOP (fd, 94), "Twenty One Castles", 20); + else if (t == 22) + memcpy (WFIFOP (fd, 94), "Twenty Two Castles", 20); + else if (t == 23) + memcpy (WFIFOP (fd, 94), "Twenty Three Castles", 20); + else if (t == 24) + memcpy (WFIFOP (fd, 94), "Twenty Four Castles", 20); + else if (t == MAX_GUILDCASTLE) + memcpy (WFIFOP (fd, 94), "Total Domination", 20); + else + memcpy (WFIFOP (fd, 94), "None Taken", 20); + + WFIFOSET (fd, packet_len_table[WFIFOW (fd, 0)]); + clif_guild_emblem (sd, g); // Guild emblem vanish fix [Valaris] + return 0; } /*========================================== * ソスMソスソスソスhソスソスソスソス/ソスGソスホ擾ソスソスソス *------------------------------------------ */ -int clif_guild_allianceinfo(struct map_session_data *sd) +int clif_guild_allianceinfo (struct map_session_data *sd) { - int fd,i,c; - struct guild *g; + int fd, i, c; + struct guild *g; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - g=guild_search(sd->status.guild_id); - if(g==NULL) - return 0; - WFIFOW(fd, 0)=0x14c; - for(i=c=0;i<MAX_GUILDALLIANCE;i++){ - struct guild_alliance *a=&g->alliance[i]; - if(a->guild_id>0){ - WFIFOL(fd,c*32+4)=a->opposition; - WFIFOL(fd,c*32+8)=a->guild_id; - memcpy(WFIFOP(fd,c*32+12),a->name,24); - c++; - } - } - WFIFOW(fd, 2)=c*32+4; - WFIFOSET(fd,WFIFOW(fd,2)); - return 0; + fd = sd->fd; + g = guild_search (sd->status.guild_id); + if (g == NULL) + return 0; + WFIFOW (fd, 0) = 0x14c; + for (i = c = 0; i < MAX_GUILDALLIANCE; i++) + { + struct guild_alliance *a = &g->alliance[i]; + if (a->guild_id > 0) + { + WFIFOL (fd, c * 32 + 4) = a->opposition; + WFIFOL (fd, c * 32 + 8) = a->guild_id; + memcpy (WFIFOP (fd, c * 32 + 12), a->name, 24); + c++; + } + } + WFIFOW (fd, 2) = c * 32 + 4; + WFIFOSET (fd, WFIFOW (fd, 2)); + return 0; } /*========================================== * ソスMソスソスソスhソスソスソスソスソスoソス[ソスソスソスXソスg *------------------------------------------ */ -int clif_guild_memberlist(struct map_session_data *sd) -{ - int fd; - int i,c; - struct guild *g; - - nullpo_retr(0, sd); - - fd=sd->fd; - g=guild_search(sd->status.guild_id); - if(g==NULL) - return 0; - - WFIFOW(fd, 0)=0x154; - for(i=0,c=0;i<g->max_member;i++){ - struct guild_member *m=&g->member[i]; - if(m->account_id==0) - continue; - WFIFOL(fd,c*104+ 4)=m->account_id; - WFIFOL(fd,c*104+ 8)=m->char_id; - WFIFOW(fd,c*104+12)=m->hair; - WFIFOW(fd,c*104+14)=m->hair_color; - WFIFOW(fd,c*104+16)=m->gender; - WFIFOW(fd,c*104+18)=m->class; - WFIFOW(fd,c*104+20)=m->lv; - WFIFOL(fd,c*104+22)=m->exp; - WFIFOL(fd,c*104+26)=m->online; - WFIFOL(fd,c*104+30)=m->position; - memset(WFIFOP(fd,c*104+34),0,50); // ソスソスソスソスソスH - memcpy(WFIFOP(fd,c*104+84),m->name,24); - c++; - } - WFIFOW(fd, 2)=c*104+4; - WFIFOSET(fd,WFIFOW(fd,2)); - return 0; +int clif_guild_memberlist (struct map_session_data *sd) +{ + int fd; + int i, c; + struct guild *g; + + nullpo_retr (0, sd); + + fd = sd->fd; + g = guild_search (sd->status.guild_id); + if (g == NULL) + return 0; + + WFIFOW (fd, 0) = 0x154; + for (i = 0, c = 0; i < g->max_member; i++) + { + struct guild_member *m = &g->member[i]; + if (m->account_id == 0) + continue; + WFIFOL (fd, c * 104 + 4) = m->account_id; + WFIFOL (fd, c * 104 + 8) = m->char_id; + WFIFOW (fd, c * 104 + 12) = m->hair; + WFIFOW (fd, c * 104 + 14) = m->hair_color; + WFIFOW (fd, c * 104 + 16) = m->gender; + WFIFOW (fd, c * 104 + 18) = m->class; + WFIFOW (fd, c * 104 + 20) = m->lv; + WFIFOL (fd, c * 104 + 22) = m->exp; + WFIFOL (fd, c * 104 + 26) = m->online; + WFIFOL (fd, c * 104 + 30) = m->position; + memset (WFIFOP (fd, c * 104 + 34), 0, 50); // ソスソスソスソスソスH + memcpy (WFIFOP (fd, c * 104 + 84), m->name, 24); + c++; + } + WFIFOW (fd, 2) = c * 104 + 4; + WFIFOSET (fd, WFIFOW (fd, 2)); + return 0; } + /*========================================== * ソスMソスソスソスhソスソスソスEソスソスソスソスソスXソスg *------------------------------------------ */ -int clif_guild_positionnamelist(struct map_session_data *sd) +int clif_guild_positionnamelist (struct map_session_data *sd) { - int i,fd; - struct guild *g; + int i, fd; + struct guild *g; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - g=guild_search(sd->status.guild_id); - if(g==NULL) - return 0; - WFIFOW(fd, 0)=0x166; - for(i=0;i<MAX_GUILDPOSITION;i++){ - WFIFOL(fd,i*28+4)=i; - memcpy(WFIFOP(fd,i*28+8),g->position[i].name,24); - } - WFIFOW(fd,2)=i*28+4; - WFIFOSET(fd,WFIFOW(fd,2)); - return 0; + fd = sd->fd; + g = guild_search (sd->status.guild_id); + if (g == NULL) + return 0; + WFIFOW (fd, 0) = 0x166; + for (i = 0; i < MAX_GUILDPOSITION; i++) + { + WFIFOL (fd, i * 28 + 4) = i; + memcpy (WFIFOP (fd, i * 28 + 8), g->position[i].name, 24); + } + WFIFOW (fd, 2) = i * 28 + 4; + WFIFOSET (fd, WFIFOW (fd, 2)); + return 0; } + /*========================================== * ソスMソスソスソスhソスソスソスEソスソスソスリスソスg *------------------------------------------ */ -int clif_guild_positioninfolist(struct map_session_data *sd) +int clif_guild_positioninfolist (struct map_session_data *sd) { - int i,fd; - struct guild *g; + int i, fd; + struct guild *g; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - g=guild_search(sd->status.guild_id); - if(g==NULL) - return 0; - WFIFOW(fd, 0)=0x160; - for(i=0;i<MAX_GUILDPOSITION;i++){ - struct guild_position *p=&g->position[i]; - WFIFOL(fd,i*16+ 4)=i; - WFIFOL(fd,i*16+ 8)=p->mode; - WFIFOL(fd,i*16+12)=i; - WFIFOL(fd,i*16+16)=p->exp_mode; - } - WFIFOW(fd, 2)=i*16+4; - WFIFOSET(fd,WFIFOW(fd,2)); - return 0; + fd = sd->fd; + g = guild_search (sd->status.guild_id); + if (g == NULL) + return 0; + WFIFOW (fd, 0) = 0x160; + for (i = 0; i < MAX_GUILDPOSITION; i++) + { + struct guild_position *p = &g->position[i]; + WFIFOL (fd, i * 16 + 4) = i; + WFIFOL (fd, i * 16 + 8) = p->mode; + WFIFOL (fd, i * 16 + 12) = i; + WFIFOL (fd, i * 16 + 16) = p->exp_mode; + } + WFIFOW (fd, 2) = i * 16 + 4; + WFIFOSET (fd, WFIFOW (fd, 2)); + return 0; } + /*========================================== * ソスMソスソスソスhソスソスソスEソスマ更ソスハ知 *------------------------------------------ */ -int clif_guild_positionchanged(struct guild *g,int idx) +int clif_guild_positionchanged (struct guild *g, int idx) { - struct map_session_data *sd; - unsigned char buf[128]; + struct map_session_data *sd; + unsigned char buf[128]; - nullpo_retr(0, g); + nullpo_retr (0, g); - WBUFW(buf, 0)=0x174; - WBUFW(buf, 2)=44; - WBUFL(buf, 4)=idx; - WBUFL(buf, 8)=g->position[idx].mode; - WBUFL(buf,12)=idx; - WBUFL(buf,16)=g->position[idx].exp_mode; - memcpy(WBUFP(buf,20),g->position[idx].name,24); - if( (sd=guild_getavailablesd(g))!=NULL ) - clif_send(buf,WBUFW(buf,2),&sd->bl,GUILD); - return 0; + WBUFW (buf, 0) = 0x174; + WBUFW (buf, 2) = 44; + WBUFL (buf, 4) = idx; + WBUFL (buf, 8) = g->position[idx].mode; + WBUFL (buf, 12) = idx; + WBUFL (buf, 16) = g->position[idx].exp_mode; + memcpy (WBUFP (buf, 20), g->position[idx].name, 24); + if ((sd = guild_getavailablesd (g)) != NULL) + clif_send (buf, WBUFW (buf, 2), &sd->bl, GUILD); + return 0; } + /*========================================== * ソスMソスソスソスhソスソスソスソスソスoソスマ更ソスハ知 *------------------------------------------ */ -int clif_guild_memberpositionchanged(struct guild *g,int idx) +int clif_guild_memberpositionchanged (struct guild *g, int idx) { - struct map_session_data *sd; - unsigned char buf[64]; + struct map_session_data *sd; + unsigned char buf[64]; - nullpo_retr(0, g); + nullpo_retr (0, g); - WBUFW(buf, 0)=0x156; - WBUFW(buf, 2)=16; - WBUFL(buf, 4)=g->member[idx].account_id; - WBUFL(buf, 8)=g->member[idx].char_id; - WBUFL(buf,12)=g->member[idx].position; - if( (sd=guild_getavailablesd(g))!=NULL ) - clif_send(buf,WBUFW(buf,2),&sd->bl,GUILD); - return 0; + WBUFW (buf, 0) = 0x156; + WBUFW (buf, 2) = 16; + WBUFL (buf, 4) = g->member[idx].account_id; + WBUFL (buf, 8) = g->member[idx].char_id; + WBUFL (buf, 12) = g->member[idx].position; + if ((sd = guild_getavailablesd (g)) != NULL) + clif_send (buf, WBUFW (buf, 2), &sd->bl, GUILD); + return 0; } + /*========================================== * ソスMソスソスソスhソスGソスソスソスuソスソスソスソスソスソスソスM *------------------------------------------ */ -int clif_guild_emblem(struct map_session_data *sd,struct guild *g) +int clif_guild_emblem (struct map_session_data *sd, struct guild *g) { - int fd; + int fd; - nullpo_retr(0, sd); - nullpo_retr(0, g); + nullpo_retr (0, sd); + nullpo_retr (0, g); - fd=sd->fd; + fd = sd->fd; - if(g->emblem_len<=0) - return 0; - WFIFOW(fd,0)=0x152; - WFIFOW(fd,2)=g->emblem_len+12; - WFIFOL(fd,4)=g->guild_id; - WFIFOL(fd,8)=g->emblem_id; - memcpy(WFIFOP(fd,12),g->emblem_data,g->emblem_len); - WFIFOSET(fd,WFIFOW(fd,2)); - return 0; + if (g->emblem_len <= 0) + return 0; + WFIFOW (fd, 0) = 0x152; + WFIFOW (fd, 2) = g->emblem_len + 12; + WFIFOL (fd, 4) = g->guild_id; + WFIFOL (fd, 8) = g->emblem_id; + memcpy (WFIFOP (fd, 12), g->emblem_data, g->emblem_len); + WFIFOSET (fd, WFIFOW (fd, 2)); + return 0; } + /*========================================== * ソスMソスソスソスhソスXソスLソスソスソスソスソスM *------------------------------------------ */ -int clif_guild_skillinfo(struct map_session_data *sd) -{ - int fd; - int i,id,c; - struct guild *g; - - nullpo_retr(0, sd); - - fd=sd->fd; - g=guild_search(sd->status.guild_id); - if(g==NULL) - return 0; - WFIFOW(fd,0)=0x0162; - WFIFOW(fd,4)=g->skill_point; - for(i=c=0;i<MAX_GUILDSKILL;i++){ - if(g->skill[i].id>0){ - WFIFOW(fd,c*37+ 6) = id = g->skill[i].id; - WFIFOW(fd,c*37+ 8) = guild_skill_get_inf(id); - WFIFOW(fd,c*37+10) = 0; - WFIFOW(fd,c*37+12) = g->skill[i].lv; - WFIFOW(fd,c*37+14) = guild_skill_get_sp(id,g->skill[i].lv); - WFIFOW(fd,c*37+16) = guild_skill_get_range(id); - memset(WFIFOP(fd,c*37+18),0,24); - WFIFOB(fd,c*37+42)= //up; - (g->skill[i].lv < guild_skill_get_max(id))? 1:0; - c++; - } - } - WFIFOW(fd,2)=c*37+6; - WFIFOSET(fd,WFIFOW(fd,2)); - return 0; +int clif_guild_skillinfo (struct map_session_data *sd) +{ + int fd; + int i, id, c; + struct guild *g; + + nullpo_retr (0, sd); + + fd = sd->fd; + g = guild_search (sd->status.guild_id); + if (g == NULL) + return 0; + WFIFOW (fd, 0) = 0x0162; + WFIFOW (fd, 4) = g->skill_point; + for (i = c = 0; i < MAX_GUILDSKILL; i++) + { + if (g->skill[i].id > 0) + { + WFIFOW (fd, c * 37 + 6) = id = g->skill[i].id; + WFIFOW (fd, c * 37 + 8) = guild_skill_get_inf (id); + WFIFOW (fd, c * 37 + 10) = 0; + WFIFOW (fd, c * 37 + 12) = g->skill[i].lv; + WFIFOW (fd, c * 37 + 14) = + guild_skill_get_sp (id, g->skill[i].lv); + WFIFOW (fd, c * 37 + 16) = guild_skill_get_range (id); + memset (WFIFOP (fd, c * 37 + 18), 0, 24); + WFIFOB (fd, c * 37 + 42) = //up; + (g->skill[i].lv < guild_skill_get_max (id)) ? 1 : 0; + c++; + } + } + WFIFOW (fd, 2) = c * 37 + 6; + WFIFOSET (fd, WFIFOW (fd, 2)); + return 0; } + /*========================================== * ソスMソスソスソスhソスソスソスmソスソスソスM *------------------------------------------ */ -int clif_guild_notice(struct map_session_data *sd,struct guild *g) +int clif_guild_notice (struct map_session_data *sd, struct guild *g) { - int fd; + int fd; - nullpo_retr(0, sd); - nullpo_retr(0, g); + nullpo_retr (0, sd); + nullpo_retr (0, g); - fd=sd->fd; - if(*g->mes1==0 && *g->mes2==0) - return 0; - WFIFOW(fd,0)=0x16f; - memcpy(WFIFOP(fd,2),g->mes1,60); - memcpy(WFIFOP(fd,62),g->mes2,120); - WFIFOSET(fd,packet_len_table[0x16f]); - return 0; + fd = sd->fd; + if (*g->mes1 == 0 && *g->mes2 == 0) + return 0; + WFIFOW (fd, 0) = 0x16f; + memcpy (WFIFOP (fd, 2), g->mes1, 60); + memcpy (WFIFOP (fd, 62), g->mes2, 120); + WFIFOSET (fd, packet_len_table[0x16f]); + return 0; } /*========================================== * ソスMソスソスソスhソスソスソスソスソスoソスソスソスU *------------------------------------------ */ -int clif_guild_invite(struct map_session_data *sd,struct guild *g) +int clif_guild_invite (struct map_session_data *sd, struct guild *g) { - int fd; + int fd; - nullpo_retr(0, sd); - nullpo_retr(0, g); + nullpo_retr (0, sd); + nullpo_retr (0, g); - fd=sd->fd; - WFIFOW(fd,0)=0x16a; - WFIFOL(fd,2)=g->guild_id; - memcpy(WFIFOP(fd,6),g->name,24); - WFIFOSET(fd,packet_len_table[0x16a]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x16a; + WFIFOL (fd, 2) = g->guild_id; + memcpy (WFIFOP (fd, 6), g->name, 24); + WFIFOSET (fd, packet_len_table[0x16a]); + return 0; } + /*========================================== * ソスMソスソスソスhソスソスソスソスソスoソスソスソスUソスソスソスソス *------------------------------------------ */ -int clif_guild_inviteack(struct map_session_data *sd,int flag) +int clif_guild_inviteack (struct map_session_data *sd, int flag) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x169; - WFIFOB(fd,2)=flag; - WFIFOSET(fd,packet_len_table[0x169]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x169; + WFIFOB (fd, 2) = flag; + WFIFOSET (fd, packet_len_table[0x169]); + return 0; } + /*========================================== * ソスMソスソスソスhソスソスソスソスソスoソスEソズ通知 *------------------------------------------ */ -int clif_guild_leave(struct map_session_data *sd,const char *name,const char *mes) +int clif_guild_leave (struct map_session_data *sd, const char *name, + const char *mes) { - unsigned char buf[128]; + unsigned char buf[128]; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - WBUFW(buf, 0)=0x15a; - memcpy(WBUFP(buf, 2),name,24); - memcpy(WBUFP(buf,26),mes,40); - clif_send(buf,packet_len_table[0x15a],&sd->bl,GUILD); - return 0; + WBUFW (buf, 0) = 0x15a; + memcpy (WBUFP (buf, 2), name, 24); + memcpy (WBUFP (buf, 26), mes, 40); + clif_send (buf, packet_len_table[0x15a], &sd->bl, GUILD); + return 0; } + /*========================================== * ソスMソスソスソスhソスソスソスソスソスoソスヌ包ソスソスハ知 *------------------------------------------ */ -int clif_guild_explusion(struct map_session_data *sd,const char *name,const char *mes, - int account_id) +int clif_guild_explusion (struct map_session_data *sd, const char *name, + const char *mes, int account_id) { - unsigned char buf[128]; + unsigned char buf[128]; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - WBUFW(buf, 0)=0x15c; - memcpy(WBUFP(buf, 2),name,24); - memcpy(WBUFP(buf,26),mes,40); - memcpy(WBUFP(buf,66),"dummy",24); - clif_send(buf,packet_len_table[0x15c],&sd->bl,GUILD); - return 0; + WBUFW (buf, 0) = 0x15c; + memcpy (WBUFP (buf, 2), name, 24); + memcpy (WBUFP (buf, 26), mes, 40); + memcpy (WBUFP (buf, 66), "dummy", 24); + clif_send (buf, packet_len_table[0x15c], &sd->bl, GUILD); + return 0; } + /*========================================== * ソスMソスソスソスhソスヌ包ソスソスソスソスソスソスoソスソスソスXソスg *------------------------------------------ */ -int clif_guild_explusionlist(struct map_session_data *sd) +int clif_guild_explusionlist (struct map_session_data *sd) { - int fd; - int i,c; - struct guild *g; + int fd; + int i, c; + struct guild *g; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - g=guild_search(sd->status.guild_id); - if(g==NULL) - return 0; - WFIFOW(fd,0)=0x163; - for(i=c=0;i<MAX_GUILDEXPLUSION;i++){ - struct guild_explusion *e=&g->explusion[i]; - if(e->account_id>0){ - memcpy(WFIFOP(fd,c*88+ 4),e->name,24); - memcpy(WFIFOP(fd,c*88+28),e->acc,24); - memcpy(WFIFOP(fd,c*88+52),e->mes,44); - c++; - } - } - WFIFOW(fd,2)=c*88+4; - WFIFOSET(fd,WFIFOW(fd,2)); - return 0; + fd = sd->fd; + g = guild_search (sd->status.guild_id); + if (g == NULL) + return 0; + WFIFOW (fd, 0) = 0x163; + for (i = c = 0; i < MAX_GUILDEXPLUSION; i++) + { + struct guild_explusion *e = &g->explusion[i]; + if (e->account_id > 0) + { + memcpy (WFIFOP (fd, c * 88 + 4), e->name, 24); + memcpy (WFIFOP (fd, c * 88 + 28), e->acc, 24); + memcpy (WFIFOP (fd, c * 88 + 52), e->mes, 44); + c++; + } + } + WFIFOW (fd, 2) = c * 88 + 4; + WFIFOSET (fd, WFIFOW (fd, 2)); + return 0; } /*========================================== * ソスMソスソスソスhソスソスソスb *------------------------------------------ */ -int clif_guild_message(struct guild *g,int account_id,const char *mes,int len) +int clif_guild_message (struct guild *g, int account_id, const char *mes, + int len) { - struct map_session_data *sd; - unsigned char lbuf[255]; - unsigned char *buf = lbuf; - if (len + 32 >= sizeof(lbuf)) - buf = malloc(len + 32); - WBUFW(buf, 0)=0x17f; - WBUFW(buf, 2)=len+4; - memcpy(WBUFP(buf,4),mes,len); + struct map_session_data *sd; + unsigned char lbuf[255]; + unsigned char *buf = lbuf; + if (len + 32 >= sizeof (lbuf)) + buf = malloc (len + 32); + WBUFW (buf, 0) = 0x17f; + WBUFW (buf, 2) = len + 4; + memcpy (WBUFP (buf, 4), mes, len); - if( (sd=guild_getavailablesd(g))!=NULL ) - clif_send(buf,WBUFW(buf,2),&sd->bl,GUILD); - if ( buf != lbuf) - free(buf); - return 0; + if ((sd = guild_getavailablesd (g)) != NULL) + clif_send (buf, WBUFW (buf, 2), &sd->bl, GUILD); + if (buf != lbuf) + free (buf); + return 0; } + /*========================================== * ソスMソスソスソスhソスXソスLソスソスソスソスソスソスソスUソスソスソスハ知 *------------------------------------------ */ -int clif_guild_skillup(struct map_session_data *sd,int skill_num,int lv) +int clif_guild_skillup (struct map_session_data *sd, int skill_num, int lv) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0) = 0x10e; - WFIFOW(fd,2) = skill_num; - WFIFOW(fd,4) = lv; - WFIFOW(fd,6) = guild_skill_get_sp(skill_num,lv); - WFIFOW(fd,8) = guild_skill_get_range(skill_num); - WFIFOB(fd,10) = 1; - WFIFOSET(fd,11); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x10e; + WFIFOW (fd, 2) = skill_num; + WFIFOW (fd, 4) = lv; + WFIFOW (fd, 6) = guild_skill_get_sp (skill_num, lv); + WFIFOW (fd, 8) = guild_skill_get_range (skill_num); + WFIFOB (fd, 10) = 1; + WFIFOSET (fd, 11); + return 0; } + /*========================================== * ソスMソスソスソスhソスソスソスソスソスvソスソス *------------------------------------------ */ -int clif_guild_reqalliance(struct map_session_data *sd,int account_id,const char *name) +int clif_guild_reqalliance (struct map_session_data *sd, int account_id, + const char *name) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x171; - WFIFOL(fd,2)=account_id; - memcpy(WFIFOP(fd,6),name,24); - WFIFOSET(fd,packet_len_table[0x171]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x171; + WFIFOL (fd, 2) = account_id; + memcpy (WFIFOP (fd, 6), name, 24); + WFIFOSET (fd, packet_len_table[0x171]); + return 0; } + /*========================================== * ソスMソスソスソスhソスソスソスソスソスソスソスソス *------------------------------------------ */ -int clif_guild_allianceack(struct map_session_data *sd,int flag) +int clif_guild_allianceack (struct map_session_data *sd, int flag) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x173; - WFIFOL(fd,2)=flag; - WFIFOSET(fd,packet_len_table[0x173]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x173; + WFIFOL (fd, 2) = flag; + WFIFOSET (fd, packet_len_table[0x173]); + return 0; } + /*========================================== * ソスMソスソスソスhソスヨ係ソスソスソスソスハ知 *------------------------------------------ */ -int clif_guild_delalliance(struct map_session_data *sd,int guild_id,int flag) +int clif_guild_delalliance (struct map_session_data *sd, int guild_id, + int flag) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x184; - WFIFOL(fd,2)=guild_id; - WFIFOL(fd,6)=flag; - WFIFOSET(fd,packet_len_table[0x184]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x184; + WFIFOL (fd, 2) = guild_id; + WFIFOL (fd, 6) = flag; + WFIFOSET (fd, packet_len_table[0x184]); + return 0; } + /*========================================== * ソスMソスソスソスhソスGソスホ鯉ソスソスソス *------------------------------------------ */ -int clif_guild_oppositionack(struct map_session_data *sd,int flag) +int clif_guild_oppositionack (struct map_session_data *sd, int flag) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x181; - WFIFOB(fd,2)=flag; - WFIFOSET(fd,packet_len_table[0x181]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x181; + WFIFOB (fd, 2) = flag; + WFIFOSET (fd, packet_len_table[0x181]); + return 0; } + /*========================================== * ソスMソスソスソスhソスヨ係ソスヌ会ソス *------------------------------------------ @@ -5863,84 +6416,87 @@ int clif_guild_oppositionack(struct map_session_data *sd,int flag) * ソスMソスソスソスhソスソスソスUソスハ知 *------------------------------------------ */ -int clif_guild_broken(struct map_session_data *sd,int flag) +int clif_guild_broken (struct map_session_data *sd, int flag) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0x15e; - WFIFOL(fd,2)=flag; - WFIFOSET(fd,packet_len_table[0x15e]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0x15e; + WFIFOL (fd, 2) = flag; + WFIFOSET (fd, packet_len_table[0x15e]); + return 0; } /*========================================== * ソスGソスソスソス[ソスVソスソスソスソス *------------------------------------------ */ -void clif_emotion(struct block_list *bl,int type) +void clif_emotion (struct block_list *bl, int type) { - unsigned char buf[8]; + unsigned char buf[8]; - nullpo_retv(bl); + nullpo_retv (bl); - WBUFW(buf,0)=0xc0; - WBUFL(buf,2)=bl->id; - WBUFB(buf,6)=type; - clif_send(buf,packet_len_table[0xc0],bl,AREA); + WBUFW (buf, 0) = 0xc0; + WBUFL (buf, 2) = bl->id; + WBUFB (buf, 6) = type; + clif_send (buf, packet_len_table[0xc0], bl, AREA); } -static void clif_emotion_towards(struct block_list *bl, struct block_list *target, int type) +static void clif_emotion_towards (struct block_list *bl, + struct block_list *target, int type) { - unsigned char buf[8]; - int len = packet_len_table[0xc0]; - struct map_session_data *sd = (struct map_session_data *) target; + unsigned char buf[8]; + int len = packet_len_table[0xc0]; + struct map_session_data *sd = (struct map_session_data *) target; - nullpo_retv(bl); - nullpo_retv(target); + nullpo_retv (bl); + nullpo_retv (target); - if (target->type != BL_PC) - return; + if (target->type != BL_PC) + return; - WBUFW(buf,0)=0xc0; - WBUFL(buf,2)=bl->id; - WBUFB(buf,6)=type; + WBUFW (buf, 0) = 0xc0; + WBUFL (buf, 2) = bl->id; + WBUFB (buf, 6) = type; - memcpy(WFIFOP(sd->fd,0), buf, len); - WFIFOSET(sd->fd,len); + memcpy (WFIFOP (sd->fd, 0), buf, len); + WFIFOSET (sd->fd, len); } /*========================================== * ソスgソス[ソスLソス[ソス{ソスbソスNソスX *------------------------------------------ */ -void clif_talkiebox(struct block_list *bl,char* talkie) +void clif_talkiebox (struct block_list *bl, char *talkie) { - unsigned char buf[86]; + unsigned char buf[86]; - nullpo_retv(bl); + nullpo_retv (bl); - WBUFW(buf,0)=0x191; - WBUFL(buf,2)=bl->id; - memcpy(WBUFP(buf,6),talkie,80); - clif_send(buf,packet_len_table[0x191],bl,AREA); + WBUFW (buf, 0) = 0x191; + WBUFL (buf, 2) = bl->id; + memcpy (WBUFP (buf, 6), talkie, 80); + clif_send (buf, packet_len_table[0x191], bl, AREA); } /*========================================== * ソスソスソスソスソスGソスtソスFソスNソスg *------------------------------------------ */ -void clif_wedding_effect(struct block_list *bl) { - unsigned char buf[6]; +void clif_wedding_effect (struct block_list *bl) +{ + unsigned char buf[6]; - nullpo_retv(bl); + nullpo_retv (bl); - WBUFW(buf,0) = 0x1ea; - WBUFL(buf,2) = bl->id; - clif_send(buf, packet_len_table[0x1ea], bl, AREA); + WBUFW (buf, 0) = 0x1ea; + WBUFL (buf, 2) = bl->id; + clif_send (buf, packet_len_table[0x1ea], bl, AREA); } + /*========================================== * ソスソスソスネゑソスソスノ茨ソスソスソスソスソスソスソスソスgソスpソスソスソスソスソスOソスソスソスソス *------------------------------------------ @@ -5971,39 +6527,40 @@ void clif_callpartner(struct map_session_data *sd) * ソスソスソス *------------------------------------------ */ -void clif_sitting(int fd, struct map_session_data *sd) +void clif_sitting (int fd, struct map_session_data *sd) { - unsigned char buf[64]; + unsigned char buf[64]; - nullpo_retv(sd); + nullpo_retv (sd); - WBUFW(buf, 0) = 0x8a; - WBUFL(buf, 2) = sd->bl.id; - WBUFB(buf,26) = 2; - clif_send(buf, packet_len_table[0x8a], &sd->bl, AREA); + WBUFW (buf, 0) = 0x8a; + WBUFL (buf, 2) = sd->bl.id; + WBUFB (buf, 26) = 2; + clif_send (buf, packet_len_table[0x8a], &sd->bl, AREA); } /*========================================== * *------------------------------------------ */ -int clif_disp_onlyself(struct map_session_data *sd, char *mes, int len) +int clif_disp_onlyself (struct map_session_data *sd, char *mes, int len) { - unsigned char lbuf[255]; - unsigned char *buf = (len + 32 >= sizeof(lbuf)) ? malloc(len + 32) : lbuf; + unsigned char lbuf[255]; + unsigned char *buf = + (len + 32 >= sizeof (lbuf)) ? malloc (len + 32) : lbuf; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - WBUFW(buf, 0) = 0x17f; - WBUFW(buf, 2) = len + 8; - memcpy(WBUFP(buf,4), mes, len + 4); + WBUFW (buf, 0) = 0x17f; + WBUFW (buf, 2) = len + 8; + memcpy (WBUFP (buf, 4), mes, len + 4); - clif_send(buf, WBUFW(buf,2), &sd->bl, SELF); + clif_send (buf, WBUFW (buf, 2), &sd->bl, SELF); - if (buf != lbuf) - free(buf); + if (buf != lbuf) + free (buf); - return 0; + return 0; } /*========================================== @@ -6011,118 +6568,129 @@ int clif_disp_onlyself(struct map_session_data *sd, char *mes, int len) *------------------------------------------ */ -int clif_GM_kickack(struct map_session_data *sd, int id) +int clif_GM_kickack (struct map_session_data *sd, int id) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd = sd->fd; - WFIFOW(fd,0) = 0xcd; - WFIFOL(fd,2) = id; - WFIFOSET(fd, packet_len_table[0xcd]); - return 0; + fd = sd->fd; + WFIFOW (fd, 0) = 0xcd; + WFIFOL (fd, 2) = id; + WFIFOSET (fd, packet_len_table[0xcd]); + return 0; } -void clif_parse_QuitGame(int fd,struct map_session_data *sd); +void clif_parse_QuitGame (int fd, struct map_session_data *sd); -int clif_GM_kick(struct map_session_data *sd,struct map_session_data *tsd,int type) +int clif_GM_kick (struct map_session_data *sd, struct map_session_data *tsd, + int type) { - nullpo_retr(0, tsd); + nullpo_retr (0, tsd); - if(type) - clif_GM_kickack(sd,tsd->status.account_id); - tsd->opt1 = tsd->opt2 = 0; - clif_parse_QuitGame(tsd->fd,tsd); + if (type) + clif_GM_kickack (sd, tsd->status.account_id); + tsd->opt1 = tsd->opt2 = 0; + clif_parse_QuitGame (tsd->fd, tsd); - return 0; + return 0; } + /*========================================== * Wisソスソスソスロ具ソスソスツ会ソスソスソス *------------------------------------------ */ -int clif_wisexin(struct map_session_data *sd,int type,int flag) +int clif_wisexin (struct map_session_data *sd, int type, int flag) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xd1; - WFIFOB(fd,2)=type; - WFIFOB(fd,3)=flag; - WFIFOSET(fd,packet_len_table[0xd1]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xd1; + WFIFOB (fd, 2) = type; + WFIFOB (fd, 3) = flag; + WFIFOSET (fd, packet_len_table[0xd1]); - return 0; + return 0; } + /*========================================== * WisソスSソスソスソスロ具ソスソスツ会ソスソスソス *------------------------------------------ */ -int clif_wisall(struct map_session_data *sd,int type,int flag) +int clif_wisall (struct map_session_data *sd, int type, int flag) { - int fd; + int fd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - fd=sd->fd; - WFIFOW(fd,0)=0xd2; - WFIFOB(fd,2)=type; - WFIFOB(fd,3)=flag; - WFIFOSET(fd,packet_len_table[0xd2]); + fd = sd->fd; + WFIFOW (fd, 0) = 0xd2; + WFIFOB (fd, 2) = type; + WFIFOB (fd, 3) = flag; + WFIFOSET (fd, packet_len_table[0xd2]); - return 0; + return 0; } + /*========================================== * ソスTソスEソスソスソスhソスGソスtソスFソスNソスg *------------------------------------------ */ -void clif_soundeffect(struct map_session_data *sd,struct block_list *bl,char *name,int type) +void clif_soundeffect (struct map_session_data *sd, struct block_list *bl, + char *name, int type) { - int fd; + int fd; - nullpo_retv(sd); - nullpo_retv(bl); + nullpo_retv (sd); + nullpo_retv (bl); - fd=sd->fd; - WFIFOW(fd,0)=0x1d3; - memcpy(WFIFOP(fd,2),name,24); - WFIFOB(fd,26)=type; - WFIFOL(fd,27)=0; - WFIFOL(fd,31)=bl->id; - WFIFOSET(fd,packet_len_table[0x1d3]); + fd = sd->fd; + WFIFOW (fd, 0) = 0x1d3; + memcpy (WFIFOP (fd, 2), name, 24); + WFIFOB (fd, 26) = type; + WFIFOL (fd, 27) = 0; + WFIFOL (fd, 31) = bl->id; + WFIFOSET (fd, packet_len_table[0x1d3]); - return; + return; } + // displaying special effects (npcs, weather, etc) [Valaris] -int clif_specialeffect(struct block_list *bl, int type, int flag) { - unsigned char buf[24]; +int clif_specialeffect (struct block_list *bl, int type, int flag) +{ + unsigned char buf[24]; - nullpo_retr(0, bl); + nullpo_retr (0, bl); - memset(buf, 0, packet_len_table[0x19b]); + memset (buf, 0, packet_len_table[0x19b]); - WBUFW(buf,0) = 0x19b; - WBUFL(buf,2) = bl->id; - WBUFL(buf,6) = type; + WBUFW (buf, 0) = 0x19b; + WBUFL (buf, 2) = bl->id; + WBUFL (buf, 6) = type; - if (flag==2) { - struct map_session_data *sd=NULL; - int i; - for(i=0; i < fd_max; i++) { - if (session[i] && (sd = session[i]->session_data) != NULL && sd->state.auth && sd->bl.m == bl->m) - clif_specialeffect(&sd->bl,type,1); - } - } - - else if (flag==1) - clif_send(buf, packet_len_table[0x19b], bl, SELF); - else if (!flag) - clif_send(buf, packet_len_table[0x19b], bl, AREA); + if (flag == 2) + { + struct map_session_data *sd = NULL; + int i; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data) != NULL + && sd->state.auth && sd->bl.m == bl->m) + clif_specialeffect (&sd->bl, type, 1); + } + } - return 0; + else if (flag == 1) + clif_send (buf, packet_len_table[0x19b], bl, SELF); + else if (!flag) + clif_send (buf, packet_len_table[0x19b], bl, AREA); + + return 0; } + // ------------ // clif_parse_* // ------------ @@ -6131,45 +6699,56 @@ int clif_specialeffect(struct block_list *bl, int type, int flag) { * *------------------------------------------ */ -void clif_parse_WantToConnection(int fd, struct map_session_data *sd) -{ - struct map_session_data *old_sd; - int account_id; // account_id in the packet - - if (sd) { - if (battle_config.error_log) - printf("clif_parse_WantToConnection : invalid request?\n"); - return; - } - - if (RFIFOW(fd,0) == 0x72) { - account_id = RFIFOL(fd,2); - } else return; // Not the auth packet - - WFIFOL(fd,0) = account_id; - WFIFOSET(fd,4); - - // if same account already connected, we disconnect the 2 sessions - if ((old_sd = map_id2sd(account_id)) != NULL) { - clif_authfail_fd(fd, 2); // same id - clif_authfail_fd(old_sd->fd, 2); // same id - printf("clif_parse_WantToConnection: Double connection for account %d (sessions: #%d (new) and #%d (old)).\n", account_id, fd, old_sd->fd); - } else { - sd = session[fd]->session_data = calloc(sizeof(*sd), 1); - if (sd == NULL) { - printf("out of memory : clif_parse_WantToConnection\n"); - exit(1); - } - sd->fd = fd; +void clif_parse_WantToConnection (int fd, struct map_session_data *sd) +{ + struct map_session_data *old_sd; + int account_id; // account_id in the packet + + if (sd) + { + if (battle_config.error_log) + printf ("clif_parse_WantToConnection : invalid request?\n"); + return; + } + + if (RFIFOW (fd, 0) == 0x72) + { + account_id = RFIFOL (fd, 2); + } + else + return; // Not the auth packet + + WFIFOL (fd, 0) = account_id; + WFIFOSET (fd, 4); + + // if same account already connected, we disconnect the 2 sessions + if ((old_sd = map_id2sd (account_id)) != NULL) + { + clif_authfail_fd (fd, 2); // same id + clif_authfail_fd (old_sd->fd, 2); // same id + printf + ("clif_parse_WantToConnection: Double connection for account %d (sessions: #%d (new) and #%d (old)).\n", + account_id, fd, old_sd->fd); + } + else + { + sd = session[fd]->session_data = calloc (sizeof (*sd), 1); + if (sd == NULL) + { + printf ("out of memory : clif_parse_WantToConnection\n"); + exit (1); + } + sd->fd = fd; - pc_setnewpc(sd, account_id, RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14), RFIFOB(fd,18), fd); + pc_setnewpc (sd, account_id, RFIFOL (fd, 6), RFIFOL (fd, 10), + RFIFOL (fd, 14), RFIFOB (fd, 18), fd); - map_addiddb(&sd->bl); + map_addiddb (&sd->bl); - chrif_authreq(sd); - } + chrif_authreq (sd); + } - return; + return; } /*========================================== @@ -6177,189 +6756,218 @@ void clif_parse_WantToConnection(int fd, struct map_session_data *sd) * mapソスNソスソスソスソスソスノ必ソスvソスネデソス[ソス^ソスソスソスSソスト托ソスソスソスソスツゑソスソスソス *------------------------------------------ */ -void clif_parse_LoadEndAck(int fd,struct map_session_data *sd) -{ -// struct item_data* item; - int i; - nullpo_retv(sd); - - if(sd->bl.prev != NULL) - return; - - // ソスレ托ソスokソスソス - //clif_authok(); - if(sd->npc_id) npc_event_dequeue(sd); - clif_skillinfoblock(sd); - pc_checkitem(sd); - //guild_info(); - - // loadendackソスソス - // next exp - clif_updatestatus(sd,SP_NEXTBASEEXP); - clif_updatestatus(sd,SP_NEXTJOBEXP); - // skill point - clif_updatestatus(sd,SP_SKILLPOINT); - // item - clif_itemlist(sd); - clif_equiplist(sd); - // cart - if(pc_iscarton(sd)){ - clif_cart_itemlist(sd); - clif_cart_equiplist(sd); - clif_updatestatus(sd,SP_CARTINFO); - } - // param all - clif_initialstatus(sd); - // party - party_send_movemap(sd); - // guild - guild_send_memberinfoshort(sd,1); - // 119 - // 78 - - if(battle_config.pc_invincible_time > 0) { - if(map[sd->bl.m].flag.gvg) - pc_setinvincibletimer(sd,battle_config.pc_invincible_time<<1); - else - pc_setinvincibletimer(sd,battle_config.pc_invincible_time); - } - - map_addblock(&sd->bl); // ソスuソスソスソスbソスNソスoソス^ - clif_spawnpc(sd); // spawn - - // weight max , now - clif_updatestatus(sd,SP_MAXWEIGHT); - clif_updatestatus(sd,SP_WEIGHT); - - // pvp - if(sd->pvp_timer!=-1 && !battle_config.pk_mode) - delete_timer(sd->pvp_timer,pc_calc_pvprank_timer); - if(map[sd->bl.m].flag.pvp){ - if(!battle_config.pk_mode) { // remove pvp stuff for pk_mode [Valaris] - sd->pvp_timer=add_timer(gettick()+200,pc_calc_pvprank_timer,sd->bl.id,0); - sd->pvp_rank=0; - sd->pvp_lastusers=0; - sd->pvp_point=5; - } - clif_set0199(sd->fd,1); - } else { - sd->pvp_timer=-1; - } - if(map[sd->bl.m].flag.gvg) { - clif_set0199(sd->fd,3); - } - - if(sd->state.connect_new) { - sd->state.connect_new = 0; - if(sd->status.class != sd->view_class) - clif_changelook(&sd->bl,LOOK_BASE,sd->view_class); +void clif_parse_LoadEndAck (int fd, struct map_session_data *sd) +{ +// struct item_data* item; + int i; + nullpo_retv (sd); + + if (sd->bl.prev != NULL) + return; + + // ソスレ托ソスokソスソス + //clif_authok(); + if (sd->npc_id) + npc_event_dequeue (sd); + clif_skillinfoblock (sd); + pc_checkitem (sd); + //guild_info(); + + // loadendackソスソス + // next exp + clif_updatestatus (sd, SP_NEXTBASEEXP); + clif_updatestatus (sd, SP_NEXTJOBEXP); + // skill point + clif_updatestatus (sd, SP_SKILLPOINT); + // item + clif_itemlist (sd); + clif_equiplist (sd); + // cart + if (pc_iscarton (sd)) + { + clif_cart_itemlist (sd); + clif_cart_equiplist (sd); + clif_updatestatus (sd, SP_CARTINFO); + } + // param all + clif_initialstatus (sd); + // party + party_send_movemap (sd); + // guild + guild_send_memberinfoshort (sd, 1); + // 119 + // 78 + + if (battle_config.pc_invincible_time > 0) + { + if (map[sd->bl.m].flag.gvg) + pc_setinvincibletimer (sd, battle_config.pc_invincible_time << 1); + else + pc_setinvincibletimer (sd, battle_config.pc_invincible_time); + } + + map_addblock (&sd->bl); // ソスuソスソスソスbソスNソスoソス^ + clif_spawnpc (sd); // spawn + + // weight max , now + clif_updatestatus (sd, SP_MAXWEIGHT); + clif_updatestatus (sd, SP_WEIGHT); + + // pvp + if (sd->pvp_timer != -1 && !battle_config.pk_mode) + delete_timer (sd->pvp_timer, pc_calc_pvprank_timer); + if (map[sd->bl.m].flag.pvp) + { + if (!battle_config.pk_mode) + { // remove pvp stuff for pk_mode [Valaris] + sd->pvp_timer = + add_timer (gettick () + 200, pc_calc_pvprank_timer, sd->bl.id, + 0); + sd->pvp_rank = 0; + sd->pvp_lastusers = 0; + sd->pvp_point = 5; + } + clif_set0199 (sd->fd, 1); + } + else + { + sd->pvp_timer = -1; + } + if (map[sd->bl.m].flag.gvg) + { + clif_set0199 (sd->fd, 3); + } + + if (sd->state.connect_new) + { + sd->state.connect_new = 0; + if (sd->status.class != sd->view_class) + clif_changelook (&sd->bl, LOOK_BASE, sd->view_class); /* Stop players from spawning inside castles [Valaris] */ - { - struct guild_castle *gc=guild_mapname2gc(map[sd->bl.m].name); - if (gc) - pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,2); - } + { + struct guild_castle *gc = guild_mapname2gc (map[sd->bl.m].name); + if (gc) + pc_setpos (sd, sd->status.save_point.map, + sd->status.save_point.x, sd->status.save_point.y, + 2); + } /* End Addition [Valaris] */ - } - - // view equipment item - clif_changelook(&sd->bl,LOOK_WEAPON,0); - if(battle_config.save_clothcolor==1 && sd->status.clothes_color > 0) - clif_changelook(&sd->bl,LOOK_CLOTHES_COLOR,sd->status.clothes_color); - - if(sd->status.hp<sd->status.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 && - (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 )) - // ソスIソス[ソスgソスoソス[ソスTソス[ソスNソスソスソスソス - skill_status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0); - -// if(time(&timer) < ((weddingtime=pc_readglobalreg(sd,"PC_WEDDING_TIME")) + 3600)) -// skill_status_change_start(&sd->bl,SC_WEDDING,0,weddingtime,0,0,36000,0); - - if(battle_config.muting_players && sd->status.manner < 0) - skill_status_change_start(&sd->bl,SC_NOCHAT,0,0,0,0,0,0); - - // option - clif_changeoption(&sd->bl); - if(sd->sc_data[SC_TRICKDEAD].timer != -1) - skill_status_change_end(&sd->bl,SC_TRICKDEAD,-1); - if(sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele)) - skill_status_change_end(&sd->bl,SC_SIGNUMCRUCIS,-1); - if(sd->special_state.infinite_endure && sd->sc_data[SC_ENDURE].timer == -1) - skill_status_change_start(&sd->bl,SC_ENDURE,10,1,0,0,0,0); - for(i=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0002 && sd->status.inventory[i].broken==1) - skill_status_change_start(&sd->bl,SC_BROKNWEAPON,0,0,0,0,0,0); - if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0010 && sd->status.inventory[i].broken==1) - skill_status_change_start(&sd->bl,SC_BROKNARMOR,0,0,0,0,0,0); - } + } + + // view equipment item + clif_changelook (&sd->bl, LOOK_WEAPON, 0); + if (battle_config.save_clothcolor == 1 && sd->status.clothes_color > 0) + clif_changelook (&sd->bl, LOOK_CLOTHES_COLOR, + sd->status.clothes_color); + + if (sd->status.hp < sd->status.max_hp >> 2 + && pc_checkskill (sd, SM_AUTOBERSERK) > 0 + && (sd->sc_data[SC_PROVOKE].timer == -1 + || sd->sc_data[SC_PROVOKE].val2 == 0)) + // ソスIソス[ソスgソスoソス[ソスTソス[ソスNソスソスソスソス + skill_status_change_start (&sd->bl, SC_PROVOKE, 10, 1, 0, 0, 0, 0); + +// if(time(&timer) < ((weddingtime=pc_readglobalreg(sd,"PC_WEDDING_TIME")) + 3600)) +// skill_status_change_start(&sd->bl,SC_WEDDING,0,weddingtime,0,0,36000,0); + + if (battle_config.muting_players && sd->status.manner < 0) + skill_status_change_start (&sd->bl, SC_NOCHAT, 0, 0, 0, 0, 0, 0); + + // option + clif_changeoption (&sd->bl); + if (sd->sc_data[SC_TRICKDEAD].timer != -1) + skill_status_change_end (&sd->bl, SC_TRICKDEAD, -1); + if (sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 + && !battle_check_undead (7, sd->def_ele)) + skill_status_change_end (&sd->bl, SC_SIGNUMCRUCIS, -1); + if (sd->special_state.infinite_endure + && sd->sc_data[SC_ENDURE].timer == -1) + skill_status_change_start (&sd->bl, SC_ENDURE, 10, 1, 0, 0, 0, 0); + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].equip + && sd->status.inventory[i].equip & 0x0002 + && sd->status.inventory[i].broken == 1) + skill_status_change_start (&sd->bl, SC_BROKNWEAPON, 0, 0, 0, 0, 0, + 0); + if (sd->status.inventory[i].equip + && sd->status.inventory[i].equip & 0x0010 + && sd->status.inventory[i].broken == 1) + skill_status_change_start (&sd->bl, SC_BROKNARMOR, 0, 0, 0, 0, 0, + 0); + } // clif_changelook_accessories(sd, NULL); - map_foreachinarea(clif_getareachar,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,0,sd); + map_foreachinarea (clif_getareachar, sd->bl.m, sd->bl.x - AREA_SIZE, + sd->bl.y - AREA_SIZE, sd->bl.x + AREA_SIZE, + sd->bl.y + AREA_SIZE, 0, sd); } /*========================================== * *------------------------------------------ */ -void clif_parse_TickSend(int fd, struct map_session_data *sd) { - nullpo_retv(sd); +void clif_parse_TickSend (int fd, struct map_session_data *sd) +{ + nullpo_retv (sd); - sd->client_tick = RFIFOL(fd,2); - sd->server_tick = gettick(); - clif_servertick(sd); + sd->client_tick = RFIFOL (fd, 2); + sd->server_tick = gettick (); + clif_servertick (sd); } /*========================================== * *------------------------------------------ */ -void clif_parse_WalkToXY(int fd, struct map_session_data *sd) { - int x, y; +void clif_parse_WalkToXY (int fd, struct map_session_data *sd) +{ + int x, y; - nullpo_retv(sd); + nullpo_retv (sd); - if (pc_isdead(sd)) { - clif_clearchar_area(&sd->bl, 1); - return; - } + if (pc_isdead (sd)) + { + clif_clearchar_area (&sd->bl, 1); + return; + } - if (sd->npc_id != 0 || sd->state.storage_flag) - return; + if (sd->npc_id != 0 || sd->state.storage_flag) + return; - if (sd->skilltimer != -1 && pc_checkskill(sd, SA_FREECAST) <= 0) // ソスtソスソスソス[ソスLソスソスソスXソスg - return; + if (sd->skilltimer != -1 && pc_checkskill (sd, SA_FREECAST) <= 0) // ソスtソスソスソス[ソスLソスソスソスXソスg + return; - if (sd->chatID) - return; + if (sd->chatID) + return; - if (sd->canmove_tick > gettick()) - return; + if (sd->canmove_tick > gettick ()) + return; - // ソスXソスeソス[ソス^ソスXソスル擾ソスソスソスソスnソスCソスfソスBソスソスソスOソスソス(ソスgソスソスソスlソスソスソスhソスソスソスCソスuソスソス)ソスナ難ソスソスソスソスネゑソス - if ((sd->opt1 > 0 && sd->opt1 != 6) || - sd->sc_data[SC_ANKLE].timer !=-1 || //ソスAソスソスソスNソスソスソスXソスlソスA - sd->sc_data[SC_AUTOCOUNTER].timer !=-1 || //ソスIソス[ソスgソスJソスEソスソスソス^ソス[ - sd->sc_data[SC_TRICKDEAD].timer !=-1 || //ソスソスソスだふゑソス - sd->sc_data[SC_BLADESTOP].timer !=-1 || //ソスソスソスnソスソスソスソス - sd->sc_data[SC_SPIDERWEB].timer !=-1 || //ソスXソスpソスCソス_ソス[ソスEソスFソスbソスu - (sd->sc_data[SC_DANCING].timer !=-1 && sd->sc_data[SC_DANCING].val4)) //ソスソスソスtソスXソスLソスソスソスソスソスtソスソスソスヘ難ソスソスソスソスネゑソス - return; - if ((sd->status.option & 2) && pc_checkskill(sd, RG_TUNNELDRIVE) <= 0) - return; + // ソスXソスeソス[ソス^ソスXソスル擾ソスソスソスソスnソスCソスfソスBソスソスソスOソスソス(ソスgソスソスソスlソスソスソスhソスソスソスCソスuソスソス)ソスナ難ソスソスソスソスネゑソス + if ((sd->opt1 > 0 && sd->opt1 != 6) || sd->sc_data[SC_ANKLE].timer != -1 || //ソスAソスソスソスNソスソスソスXソスlソスA + sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //ソスIソス[ソスgソスJソスEソスソスソス^ソス[ + sd->sc_data[SC_TRICKDEAD].timer != -1 || //ソスソスソスだふゑソス + sd->sc_data[SC_BLADESTOP].timer != -1 || //ソスソスソスnソスソスソスソス + sd->sc_data[SC_SPIDERWEB].timer != -1 || //ソスXソスpソスCソス_ソス[ソスEソスFソスbソスu + (sd->sc_data[SC_DANCING].timer != -1 && sd->sc_data[SC_DANCING].val4)) //ソスソスソスtソスXソスLソスソスソスソスソスtソスソスソスヘ難ソスソスソスソスネゑソス + return; + if ((sd->status.option & 2) && pc_checkskill (sd, RG_TUNNELDRIVE) <= 0) + return; - if (sd->invincible_timer != -1) - pc_delinvincibletimer(sd); + if (sd->invincible_timer != -1) + pc_delinvincibletimer (sd); - pc_stopattack(sd); + pc_stopattack (sd); - x = RFIFOB(fd,2) * 4 + (RFIFOB(fd,3) >> 6); - y = ((RFIFOB(fd,3) & 0x3f) << 4) + (RFIFOB(fd,4) >> 4); - pc_walktoxy(sd, x, y); + x = RFIFOB (fd, 2) * 4 + (RFIFOB (fd, 3) >> 6); + y = ((RFIFOB (fd, 3) & 0x3f) << 4) + (RFIFOB (fd, 4) >> 4); + pc_walktoxy (sd, x, y); } @@ -6367,30 +6975,41 @@ void clif_parse_WalkToXY(int fd, struct map_session_data *sd) { * *------------------------------------------ */ -void clif_parse_QuitGame(int fd, struct map_session_data *sd) { - unsigned int tick=gettick(); - struct skill_unit_group* sg; +void clif_parse_QuitGame (int fd, struct map_session_data *sd) +{ + unsigned int tick = gettick (); + struct skill_unit_group *sg; - nullpo_retv(sd); + nullpo_retv (sd); - WFIFOW(fd,0) = 0x18b; - if ((!pc_isdead(sd) && (sd->opt1 || (sd->opt2 && !(night_flag == 1 && sd->opt2 == STATE_BLIND)))) || - sd->skilltimer != -1 || - (DIFF_TICK(tick , sd->canact_tick) < 0) || - (sd->sc_data && sd->sc_data[SC_DANCING].timer!=-1 && sd->sc_data[SC_DANCING].val4 && (sg=(struct skill_unit_group *)sd->sc_data[SC_DANCING].val2) && sg->src_id == sd->bl.id)) { - WFIFOW(fd,2)=1; - WFIFOSET(fd,packet_len_table[0x18b]); - return; - } + WFIFOW (fd, 0) = 0x18b; + if ((!pc_isdead (sd) + && (sd->opt1 + || (sd->opt2 && !(night_flag == 1 && sd->opt2 == STATE_BLIND)))) + || sd->skilltimer != -1 || (DIFF_TICK (tick, sd->canact_tick) < 0) + || (sd->sc_data && sd->sc_data[SC_DANCING].timer != -1 + && sd->sc_data[SC_DANCING].val4 + && (sg = (struct skill_unit_group *) sd->sc_data[SC_DANCING].val2) + && sg->src_id == sd->bl.id)) + { + WFIFOW (fd, 2) = 1; + WFIFOSET (fd, packet_len_table[0x18b]); + return; + } - /* Rovert's prevent logout option fixed [Valaris] */ - if ((battle_config.prevent_logout && (gettick() - sd->canlog_tick) >= 10000) || (!battle_config.prevent_logout)) { - clif_setwaitclose(fd); - WFIFOW(fd,2)=0; - } else { - WFIFOW(fd,2)=1; - } - WFIFOSET(fd,packet_len_table[0x18b]); + /* Rovert's prevent logout option fixed [Valaris] */ + if ((battle_config.prevent_logout + && (gettick () - sd->canlog_tick) >= 10000) + || (!battle_config.prevent_logout)) + { + clif_setwaitclose (fd); + WFIFOW (fd, 2) = 0; + } + else + { + WFIFOW (fd, 2) = 1; + } + WFIFOSET (fd, packet_len_table[0x18b]); } @@ -6398,237 +7017,261 @@ void clif_parse_QuitGame(int fd, struct map_session_data *sd) { * *------------------------------------------ */ -void clif_parse_GetCharNameRequest(int fd, struct map_session_data *sd) { - struct block_list *bl; - int account_id; - - account_id = RFIFOL(fd,2); - bl = map_id2bl(account_id); - if (bl == NULL) - return; - - WFIFOW(fd,0) = 0x95; - WFIFOL(fd,2) = account_id; - - switch(bl->type) { - case BL_PC: - { - struct map_session_data *ssd = (struct map_session_data *)bl; - struct party *p = NULL; - struct guild *g = NULL; - - nullpo_retv(ssd); - - if (ssd->state.shroud_active) - memset(WFIFOP(fd,6), 0, 24); +void clif_parse_GetCharNameRequest (int fd, struct map_session_data *sd) +{ + struct block_list *bl; + int account_id; + + account_id = RFIFOL (fd, 2); + bl = map_id2bl (account_id); + if (bl == NULL) + return; + + WFIFOW (fd, 0) = 0x95; + WFIFOL (fd, 2) = account_id; + + switch (bl->type) + { + case BL_PC: + { + struct map_session_data *ssd = (struct map_session_data *) bl; + struct party *p = NULL; + struct guild *g = NULL; + + nullpo_retv (ssd); + + if (ssd->state.shroud_active) + memset (WFIFOP (fd, 6), 0, 24); + else + memcpy (WFIFOP (fd, 6), ssd->status.name, 24); + if (ssd->status.guild_id > 0 + && (g = guild_search (ssd->status.guild_id)) != NULL + && (ssd->status.party_id == 0 + || (p = party_search (ssd->status.party_id)) != NULL)) + { + // ソスMソスソスソスhソスソスソスソスソスネゑソスソスpソスPソスbソスg0195ソスソスソスヤゑソス + int i, ps = -1; + for (i = 0; i < g->max_member; i++) + { + if (g->member[i].account_id == ssd->status.account_id && + g->member[i].char_id == ssd->status.char_id) + ps = g->member[i].position; + } + if (ps >= 0 && ps < MAX_GUILDPOSITION) + { + WFIFOW (fd, 0) = 0x195; + if (p) + memcpy (WFIFOP (fd, 30), p->name, 24); + else + WFIFOB (fd, 30) = 0; + memcpy (WFIFOP (fd, 54), g->name, 24); + memcpy (WFIFOP (fd, 78), g->position[ps].name, 24); + WFIFOSET (fd, packet_len_table[0x195]); + break; + } + } + WFIFOSET (fd, packet_len_table[0x95]); + } + break; + case BL_NPC: + memcpy (WFIFOP (fd, 6), ((struct npc_data *) bl)->name, 24); + { + char *start = WFIFOP (fd, 6); + char *end = strchr (start, '#'); // [fate] elim hashed out/invisible names for the client + if (end) + while (*end) + *end++ = 0; + + // [fate] Elim preceding underscores for (hackish) name position fine-tuning + while (*start == '_') + *start++ = ' '; + } + WFIFOSET (fd, packet_len_table[0x95]); + break; + case BL_MOB: + { + struct mob_data *md = (struct mob_data *) bl; + + nullpo_retv (md); + + memcpy (WFIFOP (fd, 6), md->name, 24); + if (md->class >= 1285 && md->class <= 1288) + { + struct guild *g; + struct guild_castle *gc = + guild_mapname2gc (map[md->bl.m].name); + if (gc && gc->guild_id > 0 + && (g = guild_search (gc->guild_id)) != NULL) + { + WFIFOW (fd, 0) = 0x195; + WFIFOB (fd, 30) = 0; + memcpy (WFIFOP (fd, 54), g->name, 24); + memcpy (WFIFOP (fd, 78), gc->castle_name, 24); + WFIFOSET (fd, packet_len_table[0x195]); + } else - memcpy(WFIFOP(fd,6), ssd->status.name, 24); - if (ssd->status.guild_id > 0 && (g = guild_search(ssd->status.guild_id)) != NULL && - (ssd->status.party_id == 0 || (p = party_search(ssd->status.party_id)) != NULL)) { - // ソスMソスソスソスhソスソスソスソスソスネゑソスソスpソスPソスbソスg0195ソスソスソスヤゑソス - int i, ps = -1; - for(i = 0; i < g->max_member; i++) { - if (g->member[i].account_id == ssd->status.account_id && - g->member[i].char_id == ssd->status.char_id ) - ps = g->member[i].position; - } - if (ps >= 0 && ps < MAX_GUILDPOSITION) { - WFIFOW(fd, 0) = 0x195; - if (p) - memcpy(WFIFOP(fd,30), p->name, 24); - else - WFIFOB(fd,30) = 0; - memcpy(WFIFOP(fd,54), g->name,24); - memcpy(WFIFOP(fd,78), g->position[ps].name, 24); - WFIFOSET(fd,packet_len_table[0x195]); - break; - } - } - WFIFOSET(fd,packet_len_table[0x95]); - } - break; - case BL_NPC: - memcpy(WFIFOP(fd,6), ((struct npc_data*)bl)->name, 24); { - char *start = WFIFOP(fd, 6); - char *end = strchr(start, '#'); // [fate] elim hashed out/invisible names for the client - if (end) - while (*end) - *end++ = 0; - - // [fate] Elim preceding underscores for (hackish) name position fine-tuning - while (*start == '_') - *start++ = ' '; + WFIFOSET (fd, packet_len_table[0x95]); } - WFIFOSET(fd,packet_len_table[0x95]); - break; - case BL_MOB: - { - struct mob_data *md = (struct mob_data *)bl; - - nullpo_retv(md); - - memcpy(WFIFOP(fd,6), md->name, 24); - if (md->class >= 1285 && md->class <= 1288) { - struct guild *g; - struct guild_castle *gc = guild_mapname2gc(map[md->bl.m].name); - if (gc && gc->guild_id > 0 && (g = guild_search(gc->guild_id)) != NULL) { - WFIFOW(fd, 0) = 0x195; - WFIFOB(fd,30) = 0; - memcpy(WFIFOP(fd,54), g->name, 24); - memcpy(WFIFOP(fd,78), gc->castle_name, 24); - WFIFOSET(fd,packet_len_table[0x195]); - } else { - WFIFOSET(fd,packet_len_table[0x95]); - } - } else if (battle_config.show_mob_hp == 1) { - char mobhp[50]; - sprintf(mobhp, "hp: %d/%d", md->hp, mob_db[md->class].max_hp); - WFIFOW(fd, 0) = 0x195; - memcpy(WFIFOP(fd,30), mobhp, 24); - WFIFOB(fd,54) = 0; - WFIFOB(fd,78) = 0; - WFIFOSET(fd,packet_len_table[0x195]); - } else { - WFIFOSET(fd,packet_len_table[0x95]); - } - } - break; - default: - if (battle_config.error_log) - printf("clif_parse_GetCharNameRequest : bad type %d(%d)\n", bl->type, account_id); - break; - } + } + else if (battle_config.show_mob_hp == 1) + { + char mobhp[50]; + sprintf (mobhp, "hp: %d/%d", md->hp, + mob_db[md->class].max_hp); + WFIFOW (fd, 0) = 0x195; + memcpy (WFIFOP (fd, 30), mobhp, 24); + WFIFOB (fd, 54) = 0; + WFIFOB (fd, 78) = 0; + WFIFOSET (fd, packet_len_table[0x195]); + } + else + { + WFIFOSET (fd, packet_len_table[0x95]); + } + } + break; + default: + if (battle_config.error_log) + printf ("clif_parse_GetCharNameRequest : bad type %d(%d)\n", + bl->type, account_id); + break; + } } - /*========================================== * *------------------------------------------ */ -void clif_parse_GlobalMessage(int fd, struct map_session_data *sd) { // S 008c <len>.w <str>.?B - int malformed = 0; - - nullpo_retv(sd); - - - if ((is_atcommand(fd, sd, RFIFOP(fd, 4), 0) != AtCommand_None) || - ( sd->sc_data && - (sd->sc_data[SC_BERSERK].timer!=-1 || //ソスoソス[ソスTソス[ソスNソスソスソスヘ会ソスソスbソスソスソスsソスソス - sd->sc_data[SC_NOCHAT].timer!=-1 ) )) //ソス`ソスソスソスbソスgソスヨ止 - { - return; - } +void clif_parse_GlobalMessage (int fd, struct map_session_data *sd) +{ // S 008c <len>.w <str>.?B + int malformed = 0; + nullpo_retv (sd); - if (strlen(RFIFOP(fd,4)) >= battle_config.chat_maxline) - malformed = 1; + if ((is_atcommand (fd, sd, RFIFOP (fd, 4), 0) != AtCommand_None) || (sd->sc_data && (sd->sc_data[SC_BERSERK].timer != -1 || //ソスoソス[ソスTソス[ソスNソスソスソスヘ会ソスソスbソスソスソスsソスソス + sd->sc_data[SC_NOCHAT].timer != -1))) //ソス`ソスソスソスbソスgソスヨ止 + { + return; + } - // Simply ignore messages with spoofed/incorrect source names. - if (strncmp(RFIFOP(fd,4), sd->status.name, strlen(sd->status.name)) != 0) - malformed = 1; + if (strlen (RFIFOP (fd, 4)) >= battle_config.chat_maxline) + malformed = 1; - char *buf = (char *) malloc(RFIFOW(fd,2) + 4); - int msg_len = RFIFOW(fd,2) + 4; // len of message - 4 + 8 - // Prepare to send message to others - WBUFW(buf,0) = 0x8d; - WBUFW(buf,2) = msg_len; - WBUFL(buf,4) = sd->bl.id; - memcpy(WBUFP(buf,8), RFIFOP(fd,4), RFIFOW(fd,2) - 4); + // Simply ignore messages with spoofed/incorrect source names. + if (strncmp (RFIFOP (fd, 4), sd->status.name, strlen (sd->status.name)) != + 0) + malformed = 1; - if (malformed || !magic_message(sd, buf, msg_len)) { - if (tmw_CheckChatSpam(sd, RFIFOP(fd,4))) - return; + char *buf = (char *) malloc (RFIFOW (fd, 2) + 4); + int msg_len = RFIFOW (fd, 2) + 4; // len of message - 4 + 8 + // Prepare to send message to others + WBUFW (buf, 0) = 0x8d; + WBUFW (buf, 2) = msg_len; + WBUFL (buf, 4) = sd->bl.id; + memcpy (WBUFP (buf, 8), RFIFOP (fd, 4), RFIFOW (fd, 2) - 4); - if (malformed) { - free(buf); - return; - } + if (malformed || !magic_message (sd, buf, msg_len)) + { + if (tmw_CheckChatSpam (sd, RFIFOP (fd, 4))) + return; - clif_send(buf, WBUFW(buf,2), &sd->bl, sd->chatID ? CHAT_WOS : AREA_CHAT_WOC); + if (malformed) + { + free (buf); + return; } - // send back message to the speaker - memcpy(WFIFOP(fd,0), RFIFOP(fd,0), RFIFOW(fd,2)); - WFIFOW(fd,0) = 0x8e; - WFIFOSET(fd, WFIFOW(fd,2)); + clif_send (buf, WBUFW (buf, 2), &sd->bl, + sd->chatID ? CHAT_WOS : AREA_CHAT_WOC); + } - free(buf); - return; + // send back message to the speaker + memcpy (WFIFOP (fd, 0), RFIFOP (fd, 0), RFIFOW (fd, 2)); + WFIFOW (fd, 0) = 0x8e; + WFIFOSET (fd, WFIFOW (fd, 2)); + + free (buf); + return; } -int clif_message(struct block_list *bl, char* msg) +int clif_message (struct block_list *bl, char *msg) { - unsigned short msg_len = strlen(msg) + 1; - static int buf_len = -1; - static unsigned char *buf = NULL; + unsigned short msg_len = strlen (msg) + 1; + static int buf_len = -1; + static unsigned char *buf = NULL; - if (buf_len < msg_len) { - if (buf) - free(buf); - buf = malloc(buf_len = (msg_len + 16)); - } + if (buf_len < msg_len) + { + if (buf) + free (buf); + buf = malloc (buf_len = (msg_len + 16)); + } - nullpo_retr(0, bl); + nullpo_retr (0, bl); - WBUFW(buf, 0) = 0x8d; - WBUFW(buf, 2) = msg_len + 8; - WBUFL(buf, 4) = bl->id; - memcpy(WBUFP(buf, 8), msg, msg_len); + WBUFW (buf, 0) = 0x8d; + WBUFW (buf, 2) = msg_len + 8; + WBUFL (buf, 4) = bl->id; + memcpy (WBUFP (buf, 8), msg, msg_len); - clif_send(buf, WBUFW(buf,2), bl, AREA); + clif_send (buf, WBUFW (buf, 2), bl, AREA); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -void clif_parse_MapMove(int fd, struct map_session_data *sd) { +void clif_parse_MapMove (int fd, struct map_session_data *sd) +{ // /m /mapmove (as @rura GM command) - char output[100]; - char map_name[17]; + char output[100]; + char map_name[17]; - nullpo_retv(sd); + nullpo_retv (sd); - memset(output, '\0', sizeof(output)); - memset(map_name, '\0', sizeof(map_name)); + memset (output, '\0', sizeof (output)); + memset (map_name, '\0', sizeof (map_name)); - if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && - (pc_isGM(sd) >= get_atcommand_level(AtCommand_MapMove))) { - memcpy(map_name, RFIFOP(fd,2), 16); - sprintf(output, "%s %d %d", map_name, RFIFOW(fd,18), RFIFOW(fd,20)); - log_atcommand(sd, "@warp %s", output); - atcommand_warp(fd, sd, "@warp", output); - } + if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) && + (pc_isGM (sd) >= get_atcommand_level (AtCommand_MapMove))) + { + memcpy (map_name, RFIFOP (fd, 2), 16); + sprintf (output, "%s %d %d", map_name, RFIFOW (fd, 18), + RFIFOW (fd, 20)); + log_atcommand (sd, "@warp %s", output); + atcommand_warp (fd, sd, "@warp", output); + } - return; + return; } /*========================================== * *------------------------------------------ */ -void clif_parse_ChangeDir(int fd, struct map_session_data *sd) { - unsigned char buf[64]; - short dir; +void clif_parse_ChangeDir (int fd, struct map_session_data *sd) +{ + unsigned char buf[64]; + short dir; - nullpo_retv(sd); + nullpo_retv (sd); -// RFIFOW(fd,2); // Apparently does nothing? - dir = RFIFOB(fd,4); +// RFIFOW(fd,2); // Apparently does nothing? + dir = RFIFOB (fd, 4); - pc_setdir(sd, dir); + pc_setdir (sd, dir); - WBUFW(buf,0) = 0x9c; - WBUFL(buf,2) = sd->bl.id; - WBUFW(buf,6) = 0; - WBUFB(buf,8) = dir; - if (sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris] - clif_send(buf, packet_len_table[0x9c], &sd->bl, AREA); - else - clif_send(buf, packet_len_table[0x9c], &sd->bl, AREA_WOS); + WBUFW (buf, 0) = 0x9c; + WBUFL (buf, 2) = sd->bl.id; + WBUFW (buf, 6) = 0; + WBUFB (buf, 8) = dir; + if (sd->disguise > 23 && sd->disguise < 4001) // mob disguises [Valaris] + clif_send (buf, packet_len_table[0x9c], &sd->bl, AREA); + else + clif_send (buf, packet_len_table[0x9c], &sd->bl, AREA_WOS); } @@ -6636,1910 +7279,2277 @@ void clif_parse_ChangeDir(int fd, struct map_session_data *sd) { * *------------------------------------------ */ -void clif_parse_Emotion(int fd, struct map_session_data *sd) { - unsigned char buf[64]; +void clif_parse_Emotion (int fd, struct map_session_data *sd) +{ + unsigned char buf[64]; - nullpo_retv(sd); + nullpo_retv (sd); - if (battle_config.basic_skill_check == 0 || pc_checkskill(sd, NV_EMOTE) >= 1) { - WBUFW(buf,0) = 0xc0; - WBUFL(buf,2) = sd->bl.id; - WBUFB(buf,6) = RFIFOB(fd,2); - clif_send(buf, packet_len_table[0xc0], &sd->bl, AREA); - } else - clif_skill_fail(sd, 1, 0, 1); + if (battle_config.basic_skill_check == 0 + || pc_checkskill (sd, NV_EMOTE) >= 1) + { + WBUFW (buf, 0) = 0xc0; + WBUFL (buf, 2) = sd->bl.id; + WBUFB (buf, 6) = RFIFOB (fd, 2); + clif_send (buf, packet_len_table[0xc0], &sd->bl, AREA); + } + else + clif_skill_fail (sd, 1, 0, 1); } /*========================================== * *------------------------------------------ */ -void clif_parse_HowManyConnections(int fd, struct map_session_data *sd) { - WFIFOW(fd,0) = 0xc2; - WFIFOL(fd,2) = map_getusers(); - WFIFOSET(fd,packet_len_table[0xc2]); +void clif_parse_HowManyConnections (int fd, struct map_session_data *sd) +{ + WFIFOW (fd, 0) = 0xc2; + WFIFOL (fd, 2) = map_getusers (); + WFIFOSET (fd, packet_len_table[0xc2]); } /*========================================== * *------------------------------------------ */ -void clif_parse_ActionRequest(int fd, struct map_session_data *sd) { - unsigned int tick; - unsigned char buf[64]; - int action_type, target_id; +void clif_parse_ActionRequest (int fd, struct map_session_data *sd) +{ + unsigned int tick; + unsigned char buf[64]; + int action_type, target_id; - nullpo_retv(sd); + nullpo_retv (sd); - if (pc_isdead(sd)) { - clif_clearchar_area(&sd->bl, 1); - return; - } - if (sd->npc_id != 0 || sd->opt1 > 0 || sd->status.option & 2 || sd->state.storage_flag || - (sd->sc_data && - (sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //ソスIソス[ソスgソスJソスEソスソスソス^ソス[ - sd->sc_data[SC_BLADESTOP].timer != -1 || //ソスソスソスnソスソスソスソス - sd->sc_data[SC_DANCING].timer != -1))) - return; - - tick = gettick(); - - pc_stop_walking(sd, 0); - pc_stopattack(sd); - - target_id = RFIFOL(fd,2); - action_type = RFIFOB(fd,6); - - switch(action_type) { - case 0x00: // once attack - case 0x07: // continuous attack - if(sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class==22 || sd->status.option & OPTION_HIDE) - return; - if (!battle_config.sdelay_attack_enable && pc_checkskill(sd, SA_FREECAST) <= 0) { - if (DIFF_TICK(tick, sd->canact_tick) < 0) { - clif_skill_fail(sd, 1, 4, 0); - return; - } - } - if (sd->invincible_timer != -1) - pc_delinvincibletimer(sd); - if (sd->attacktarget > 0) // [Valaris] - sd->attacktarget = 0; - pc_attack(sd, target_id, action_type != 0); - break; - case 0x02: // sitdown - if (tmw_CheckSitSpam(sd)) - break; - pc_stop_walking(sd, 1); - skill_gangsterparadise(sd, 1); // ソスMソスソスソスソスソスOソスXソス^ソス[ソスpソスソスソス_ソスCソスXソスン抵ソス - pc_setsit(sd); - clif_sitting(fd, sd); - break; - case 0x03: // standup - skill_gangsterparadise(sd, 0); // ソスMソスソスソスソスソスOソスXソス^ソス[ソスpソスソスソス_ソスCソスXソスソスソスソス - pc_setstand(sd); - WBUFW(buf, 0) = 0x8a; - WBUFL(buf, 2) = sd->bl.id; - WBUFB(buf,26) = 3; - clif_send(buf, packet_len_table[0x8a], &sd->bl, AREA); - break; - } + if (pc_isdead (sd)) + { + clif_clearchar_area (&sd->bl, 1); + return; + } + if (sd->npc_id != 0 || sd->opt1 > 0 || sd->status.option & 2 || sd->state.storage_flag || (sd->sc_data && (sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //ソスIソス[ソスgソスJソスEソスソスソス^ソス[ + sd->sc_data[SC_BLADESTOP].timer != -1 || //ソスソスソスnソスソスソスソス + sd->sc_data + [SC_DANCING].timer + != + -1))) + return; + + tick = gettick (); + + pc_stop_walking (sd, 0); + pc_stopattack (sd); + + target_id = RFIFOL (fd, 2); + action_type = RFIFOB (fd, 6); + + switch (action_type) + { + case 0x00: // once attack + case 0x07: // continuous attack + if (sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class == 22 + || sd->status.option & OPTION_HIDE) + return; + if (!battle_config.sdelay_attack_enable + && pc_checkskill (sd, SA_FREECAST) <= 0) + { + if (DIFF_TICK (tick, sd->canact_tick) < 0) + { + clif_skill_fail (sd, 1, 4, 0); + return; + } + } + if (sd->invincible_timer != -1) + pc_delinvincibletimer (sd); + if (sd->attacktarget > 0) // [Valaris] + sd->attacktarget = 0; + pc_attack (sd, target_id, action_type != 0); + break; + case 0x02: // sitdown + if (tmw_CheckSitSpam (sd)) + break; + pc_stop_walking (sd, 1); + skill_gangsterparadise (sd, 1); // ソスMソスソスソスソスソスOソスXソス^ソス[ソスpソスソスソス_ソスCソスXソスン抵ソス + pc_setsit (sd); + clif_sitting (fd, sd); + break; + case 0x03: // standup + skill_gangsterparadise (sd, 0); // ソスMソスソスソスソスソスOソスXソス^ソス[ソスpソスソスソス_ソスCソスXソスソスソスソス + pc_setstand (sd); + WBUFW (buf, 0) = 0x8a; + WBUFL (buf, 2) = sd->bl.id; + WBUFB (buf, 26) = 3; + clif_send (buf, packet_len_table[0x8a], &sd->bl, AREA); + break; + } } /*========================================== * *------------------------------------------ */ -void clif_parse_Restart(int fd, struct map_session_data *sd) { - nullpo_retv(sd); +void clif_parse_Restart (int fd, struct map_session_data *sd) +{ + nullpo_retv (sd); - switch(RFIFOB(fd,2)) { - case 0x00: - if (pc_isdead(sd)) { - pc_setstand(sd); - pc_setrestartvalue(sd, 3); - pc_setpos(sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, 2); - } - break; - case 0x01: - /*if(!pc_isdead(sd) && (sd->opt1 || (sd->opt2 && !(night_flag == 1 && sd->opt2 == STATE_BLIND)))) - return;*/ - - /* Rovert's Prevent logout option - Fixed [Valaris] */ - if ((battle_config.prevent_logout && (gettick() - sd->canlog_tick) >= 10000) || (!battle_config.prevent_logout)) { - chrif_charselectreq(sd); - } else { - WFIFOW(fd,0)=0x18b; - WFIFOW(fd,2)=1; - - WFIFOSET(fd,packet_len_table[0x018b]); - } - break; - } + switch (RFIFOB (fd, 2)) + { + case 0x00: + if (pc_isdead (sd)) + { + pc_setstand (sd); + pc_setrestartvalue (sd, 3); + pc_setpos (sd, sd->status.save_point.map, + sd->status.save_point.x, sd->status.save_point.y, + 2); + } + break; + case 0x01: + /*if(!pc_isdead(sd) && (sd->opt1 || (sd->opt2 && !(night_flag == 1 && sd->opt2 == STATE_BLIND)))) + * return; */ + + /* Rovert's Prevent logout option - Fixed [Valaris] */ + if ((battle_config.prevent_logout + && (gettick () - sd->canlog_tick) >= 10000) + || (!battle_config.prevent_logout)) + { + chrif_charselectreq (sd); + } + else + { + WFIFOW (fd, 0) = 0x18b; + WFIFOW (fd, 2) = 1; + + WFIFOSET (fd, packet_len_table[0x018b]); + } + break; + } } /*========================================== * Transmission of a wisp (S 0096 <len>.w <nick>.24B <message>.?B) *------------------------------------------ */ -void clif_parse_Wis(int fd, struct map_session_data *sd) { // S 0096 <len>.w <nick>.24B <message>.?B // rewritten by [Yor] - struct map_session_data *dstsd; - int i; - int gmlen = strlen(RFIFOP(fd,28)); - - if (RFIFOW(fd,2)-28 <= 0 || ( sd && sd->sc_data && (sd->sc_data[SC_BERSERK].timer!=-1 || sd->sc_data[SC_NOCHAT].timer!=-1 ) )) - return; - - char gmbuf[512]; - char *gm_command = ((gmlen+28) > sizeof(gmbuf)) ? (char *) malloc(gmlen + 28) : gmbuf; - - memset(gm_command, 0, gmlen); - sprintf(gm_command, "%s : %s", sd->status.name, RFIFOP(fd,28)); - if ((is_atcommand(fd, sd, gm_command, 0) != AtCommand_None)) - { - if (gm_command != gmbuf) - free(gm_command); - return; - } - - if (tmw_CheckChatSpam(sd, RFIFOP(fd,28))) - return; - - if (strlen(RFIFOP(fd,28)) >= battle_config.chat_maxline) - return; - - // searching destination character - dstsd = map_nick2sd(RFIFOP(fd,4)); - // player is not on this map-server - if (dstsd == NULL || - // At this point, don't send wisp/page if it's not exactly the same name, because (example) - // if there are 'Test' player on an other map-server and 'test' player on this map-server, - // and if we ask for 'Test', we must not contact 'test' player - // so, we send information to inter-server, which is the only one which decide (and copy correct name). - strcmp(dstsd->status.name, RFIFOP(fd,4)) != 0) // not exactly same name - // send message to inter-server - intif_wis_message(sd, RFIFOP(fd,4), RFIFOP(fd,28), RFIFOW(fd,2)-28); - // player is on this map-server - else { - // if you send to your self, don't send anything to others - if (dstsd->fd == fd) // but, normaly, it's impossible! - clif_wis_message(fd, wisp_server_name, "You can not page yourself. Sorry.", strlen("You can not page yourself. Sorry.") + 1); - // otherwise, send message and answer immediatly - else { - if (dstsd->ignoreAll == 1) - clif_wis_end(fd, 2); // type: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - else { - // if player ignore the source character - for(i = 0; i < (sizeof(dstsd->ignore) / sizeof(dstsd->ignore[0])); i++) - if (strcmp(dstsd->ignore[i].name, sd->status.name) == 0) { - clif_wis_end(fd, 2); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - break; - } - // if source player not found in ignore list - if (i == (sizeof(sd->ignore) / sizeof(sd->ignore[0]))) { - clif_wis_message(dstsd->fd, sd->status.name, RFIFOP(fd,28), RFIFOW(fd,2) - 28); - clif_wis_end(fd, 0); // type: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - } - } - } - } +void clif_parse_Wis (int fd, struct map_session_data *sd) +{ // S 0096 <len>.w <nick>.24B <message>.?B // rewritten by [Yor] + struct map_session_data *dstsd; + int i; + int gmlen = strlen (RFIFOP (fd, 28)); + + if (RFIFOW (fd, 2) - 28 <= 0 + || (sd && sd->sc_data + && (sd->sc_data[SC_BERSERK].timer != -1 + || sd->sc_data[SC_NOCHAT].timer != -1))) + return; + + char gmbuf[512]; + char *gm_command = + ((gmlen + 28) > + sizeof (gmbuf)) ? (char *) malloc (gmlen + 28) : gmbuf; + + memset (gm_command, 0, gmlen); + sprintf (gm_command, "%s : %s", sd->status.name, RFIFOP (fd, 28)); + if ((is_atcommand (fd, sd, gm_command, 0) != AtCommand_None)) + { + if (gm_command != gmbuf) + free (gm_command); + return; + } + + if (tmw_CheckChatSpam (sd, RFIFOP (fd, 28))) + return; + + if (strlen (RFIFOP (fd, 28)) >= battle_config.chat_maxline) + return; + + // searching destination character + dstsd = map_nick2sd (RFIFOP (fd, 4)); + // player is not on this map-server + if (dstsd == NULL || + // At this point, don't send wisp/page if it's not exactly the same name, because (example) + // if there are 'Test' player on an other map-server and 'test' player on this map-server, + // and if we ask for 'Test', we must not contact 'test' player + // so, we send information to inter-server, which is the only one which decide (and copy correct name). + strcmp (dstsd->status.name, RFIFOP (fd, 4)) != 0) // not exactly same name + // send message to inter-server + intif_wis_message (sd, RFIFOP (fd, 4), RFIFOP (fd, 28), + RFIFOW (fd, 2) - 28); + // player is on this map-server + else + { + // if you send to your self, don't send anything to others + if (dstsd->fd == fd) // but, normaly, it's impossible! + clif_wis_message (fd, wisp_server_name, + "You can not page yourself. Sorry.", + strlen ("You can not page yourself. Sorry.") + + 1); + // otherwise, send message and answer immediatly + else + { + if (dstsd->ignoreAll == 1) + clif_wis_end (fd, 2); // type: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + else + { + // if player ignore the source character + for (i = 0; + i < (sizeof (dstsd->ignore) / sizeof (dstsd->ignore[0])); + i++) + if (strcmp (dstsd->ignore[i].name, sd->status.name) == 0) + { + clif_wis_end (fd, 2); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + break; + } + // if source player not found in ignore list + if (i == (sizeof (sd->ignore) / sizeof (sd->ignore[0]))) + { + clif_wis_message (dstsd->fd, sd->status.name, + RFIFOP (fd, 28), RFIFOW (fd, 2) - 28); + clif_wis_end (fd, 0); // type: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + } + } + } + } - return; + return; } /*========================================== * *------------------------------------------ */ -void clif_parse_GMmessage(int fd, struct map_session_data *sd) { - char m[512]; - char output[200]; - nullpo_retv(sd); +void clif_parse_GMmessage (int fd, struct map_session_data *sd) +{ + char m[512]; + char output[200]; + nullpo_retv (sd); - if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && - (pc_isGM(sd) >= get_atcommand_level(AtCommand_Broadcast))) - { - strncpy(m, RFIFOP(fd,4), RFIFOW(fd,2) - 4); - m[RFIFOW(fd,2) - 4] = 0; - log_atcommand(sd, "/announce %s", m); + if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) && + (pc_isGM (sd) >= get_atcommand_level (AtCommand_Broadcast))) + { + strncpy (m, RFIFOP (fd, 4), RFIFOW (fd, 2) - 4); + m[RFIFOW (fd, 2) - 4] = 0; + log_atcommand (sd, "/announce %s", m); - memset(output, '\0', sizeof(output)); - snprintf(output, 199, "%s : %s", sd->status.name, m); + memset (output, '\0', sizeof (output)); + snprintf (output, 199, "%s : %s", sd->status.name, m); - intif_GMmessage(output, strlen(output) + 1, 0); - } + intif_GMmessage (output, strlen (output) + 1, 0); + } } /*========================================== * *------------------------------------------ */ -void clif_parse_TakeItem(int fd, struct map_session_data *sd) { - struct flooritem_data *fitem; - int map_object_id; +void clif_parse_TakeItem (int fd, struct map_session_data *sd) +{ + struct flooritem_data *fitem; + int map_object_id; - nullpo_retv(sd); + nullpo_retv (sd); - map_object_id = RFIFOL(fd,2); - fitem = (struct flooritem_data*)map_id2bl(map_object_id); + map_object_id = RFIFOL (fd, 2); + fitem = (struct flooritem_data *) map_id2bl (map_object_id); - if (pc_isdead(sd)) { - clif_clearchar_area(&sd->bl, 1); - return; - } + if (pc_isdead (sd)) + { + clif_clearchar_area (&sd->bl, 1); + return; + } - if( sd->npc_id!=0 || sd->opt1 > 0 || - (sd->sc_data && (sd->sc_data[SC_TRICKDEAD].timer != -1 || //ソスソスソスだふゑソス - sd->sc_data[SC_BLADESTOP].timer != -1 || //ソスソスソスnソスソスソスソス - sd->sc_data[SC_BERSERK].timer!=-1 || //ソスoソス[ソスTソス[ソスN - sd->sc_data[SC_NOCHAT].timer!=-1 )) ) //ソスソスソスbソスヨ止 - return; + if (sd->npc_id != 0 || sd->opt1 > 0 || (sd->sc_data && (sd->sc_data[SC_TRICKDEAD].timer != -1 || //ソスソスソスだふゑソス + sd->sc_data[SC_BLADESTOP].timer != -1 || //ソスソスソスnソスソスソスソス + sd->sc_data[SC_BERSERK].timer != -1 || //ソスoソス[ソスTソス[ソスN + sd->sc_data[SC_NOCHAT].timer != -1))) //ソスソスソスbソスヨ止 + return; - if (fitem == NULL || fitem->bl.m != sd->bl.m) - return; + if (fitem == NULL || fitem->bl.m != sd->bl.m) + return; - if (abs(sd->bl.x - fitem->bl.x) >= 2 || abs(sd->bl.y - fitem->bl.y) >= 2) - return; // too far away to pick up + if (abs (sd->bl.x - fitem->bl.x) >= 2 + || abs (sd->bl.y - fitem->bl.y) >= 2) + return; // too far away to pick up - if (sd->state.shroud_active - && sd->state.shroud_disappears_on_pickup) - magic_unshroud(sd); + if (sd->state.shroud_active && sd->state.shroud_disappears_on_pickup) + magic_unshroud (sd); - pc_takeitem(sd, fitem); + pc_takeitem (sd, fitem); } /*========================================== * *------------------------------------------ */ -void clif_parse_DropItem(int fd, struct map_session_data *sd) { - int item_index, item_amount; +void clif_parse_DropItem (int fd, struct map_session_data *sd) +{ + int item_index, item_amount; - nullpo_retv(sd); + nullpo_retv (sd); - if (pc_isdead(sd)) { - clif_clearchar_area(&sd->bl, 1); - return; - } - if (sd->npc_id != 0 || sd->opt1 > 0 || map[sd->bl.m].flag.no_player_drops || - (sd->sc_data && (sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //ソスIソス[ソスgソスJソスEソスソスソス^ソス[ - sd->sc_data[SC_BLADESTOP].timer != -1 || //ソスソスソスnソスソスソスソス - sd->sc_data[SC_BERSERK].timer != -1)) ) //ソスoソス[ソスTソス[ソスN - return; + if (pc_isdead (sd)) + { + clif_clearchar_area (&sd->bl, 1); + return; + } + if (sd->npc_id != 0 || sd->opt1 > 0 || map[sd->bl.m].flag.no_player_drops || (sd->sc_data && (sd->sc_data[SC_AUTOCOUNTER].timer != -1 || //ソスIソス[ソスgソスJソスEソスソスソス^ソス[ + sd->sc_data[SC_BLADESTOP].timer != -1 || //ソスソスソスnソスソスソスソス + sd->sc_data[SC_BERSERK].timer != -1))) //ソスoソス[ソスTソス[ソスN + return; - item_index = RFIFOW(fd,2) - 2; - item_amount = RFIFOW(fd,4); + item_index = RFIFOW (fd, 2) - 2; + item_amount = RFIFOW (fd, 4); - pc_dropitem(sd, item_index, item_amount); + pc_dropitem (sd, item_index, item_amount); } /*========================================== * *------------------------------------------ */ -void clif_parse_UseItem(int fd, struct map_session_data *sd) { - nullpo_retv(sd); +void clif_parse_UseItem (int fd, struct map_session_data *sd) +{ + nullpo_retv (sd); - if (pc_isdead(sd)) { - clif_clearchar_area(&sd->bl, 1); - return; - } - if (sd->npc_id!=0 || sd->opt1 > 0 || - (sd->sc_data && (sd->sc_data[SC_TRICKDEAD].timer != -1 || //ソスソスソスだふゑソス - sd->sc_data[SC_BLADESTOP].timer != -1 || //ソスソスソスnソスソスソスソス - sd->sc_data[SC_BERSERK].timer!=-1 || //ソスoソス[ソスTソス[ソスN - sd->sc_data[SC_NOCHAT].timer!=-1 )) ) //ソスソスソスbソスヨ止 - return; + if (pc_isdead (sd)) + { + clif_clearchar_area (&sd->bl, 1); + return; + } + if (sd->npc_id != 0 || sd->opt1 > 0 || (sd->sc_data && (sd->sc_data[SC_TRICKDEAD].timer != -1 || //ソスソスソスだふゑソス + sd->sc_data[SC_BLADESTOP].timer != -1 || //ソスソスソスnソスソスソスソス + sd->sc_data[SC_BERSERK].timer != -1 || //ソスoソス[ソスTソス[ソスN + sd->sc_data[SC_NOCHAT].timer != -1))) //ソスソスソスbソスヨ止 + return; - if (sd->invincible_timer != -1) - pc_delinvincibletimer(sd); + if (sd->invincible_timer != -1) + pc_delinvincibletimer (sd); - pc_useitem(sd,RFIFOW(fd,2)-2); + pc_useitem (sd, RFIFOW (fd, 2) - 2); } /*========================================== * *------------------------------------------ */ -void clif_parse_EquipItem(int fd,struct map_session_data *sd) +void clif_parse_EquipItem (int fd, struct map_session_data *sd) { - int index; + int index; - nullpo_retv(sd); + nullpo_retv (sd); - if(pc_isdead(sd)) { - clif_clearchar_area(&sd->bl,1); - return; - } - index = RFIFOW(fd,2)-2; - if(sd->npc_id!=0) return; - if(sd->sc_data && ( sd->sc_data[SC_BLADESTOP].timer!=-1 || sd->sc_data[SC_BERSERK].timer!=-1 )) return; - - if(sd->status.inventory[index].identify != 1) { // ソスソスソスモ抵ソス - // Bjorn: Auto-identify items when equipping them as there - // is no nice way to do this in the client yet. - sd->status.inventory[index].identify = 1; - //clif_equipitemack(sd,index,0,0); // fail - //return; - } - //ソスyソスbソスgソスpソスソスソスソスソスナゑソスソス驍ゥソスネゑソスソスソス - if(sd->inventory_data[index]) { - if(sd->inventory_data[index]->type == 10) - RFIFOW(fd,4)=0x8000; // ソスソスソス無暦ソスソスソスソス闡包ソスソスソスナゑソスソスソスソス謔、ソスノ(ソス|ソス|ソスG - pc_equipitem(sd,index,RFIFOW(fd,4)); - } + if (pc_isdead (sd)) + { + clif_clearchar_area (&sd->bl, 1); + return; + } + index = RFIFOW (fd, 2) - 2; + if (sd->npc_id != 0) + return; + if (sd->sc_data + && (sd->sc_data[SC_BLADESTOP].timer != -1 + || sd->sc_data[SC_BERSERK].timer != -1)) + return; + + if (sd->status.inventory[index].identify != 1) + { // ソスソスソスモ抵ソス + // Bjorn: Auto-identify items when equipping them as there + // is no nice way to do this in the client yet. + sd->status.inventory[index].identify = 1; + //clif_equipitemack(sd,index,0,0); // fail + //return; + } + //ソスyソスbソスgソスpソスソスソスソスソスナゑソスソス驍ゥソスネゑソスソスソス + if (sd->inventory_data[index]) + { + if (sd->inventory_data[index]->type == 10) + RFIFOW (fd, 4) = 0x8000; // ソスソスソス無暦ソスソスソスソス闡包ソスソスソスナゑソスソスソスソス謔、ソスノ(ソス|ソス|ソスG + pc_equipitem (sd, index, RFIFOW (fd, 4)); + } } /*========================================== * *------------------------------------------ */ -void clif_parse_UnequipItem(int fd,struct map_session_data *sd) +void clif_parse_UnequipItem (int fd, struct map_session_data *sd) { - int index; + int index; - nullpo_retv(sd); + nullpo_retv (sd); - if(pc_isdead(sd)) { - clif_clearchar_area(&sd->bl,1); - return; - } - index = RFIFOW(fd,2)-2; - if(sd->status.inventory[index].broken == 1 && sd->sc_data && sd->sc_data[SC_BROKNWEAPON].timer!=-1) - skill_status_change_end(&sd->bl,SC_BROKNWEAPON,-1); - if(sd->status.inventory[index].broken == 1 && sd->sc_data && sd->sc_data[SC_BROKNARMOR].timer!=-1) - skill_status_change_end(&sd->bl,SC_BROKNARMOR,-1); - if(sd->sc_data && ( sd->sc_data[SC_BLADESTOP].timer!=-1 || sd->sc_data[SC_BERSERK].timer!=-1 )) - return; + if (pc_isdead (sd)) + { + clif_clearchar_area (&sd->bl, 1); + return; + } + index = RFIFOW (fd, 2) - 2; + if (sd->status.inventory[index].broken == 1 && sd->sc_data + && sd->sc_data[SC_BROKNWEAPON].timer != -1) + skill_status_change_end (&sd->bl, SC_BROKNWEAPON, -1); + if (sd->status.inventory[index].broken == 1 && sd->sc_data + && sd->sc_data[SC_BROKNARMOR].timer != -1) + skill_status_change_end (&sd->bl, SC_BROKNARMOR, -1); + if (sd->sc_data + && (sd->sc_data[SC_BLADESTOP].timer != -1 + || sd->sc_data[SC_BERSERK].timer != -1)) + return; - if(sd->npc_id!=0 || sd->opt1 > 0) - return; - pc_unequipitem(sd,index,0); + if (sd->npc_id != 0 || sd->opt1 > 0) + return; + pc_unequipitem (sd, index, 0); } /*========================================== * *------------------------------------------ */ -void clif_parse_NpcClicked(int fd,struct map_session_data *sd) +void clif_parse_NpcClicked (int fd, struct map_session_data *sd) { - nullpo_retv(sd); + nullpo_retv (sd); - if(pc_isdead(sd)) { - clif_clearchar_area(&sd->bl,1); - return; - } - if(sd->npc_id!=0) - return; - npc_click(sd,RFIFOL(fd,2)); + if (pc_isdead (sd)) + { + clif_clearchar_area (&sd->bl, 1); + return; + } + if (sd->npc_id != 0) + return; + npc_click (sd, RFIFOL (fd, 2)); } /*========================================== * *------------------------------------------ */ -void clif_parse_NpcBuySellSelected(int fd,struct map_session_data *sd) +void clif_parse_NpcBuySellSelected (int fd, struct map_session_data *sd) { - npc_buysellsel(sd,RFIFOL(fd,2),RFIFOB(fd,6)); + npc_buysellsel (sd, RFIFOL (fd, 2), RFIFOB (fd, 6)); } /*========================================== * *------------------------------------------ */ -void clif_parse_NpcBuyListSend(int fd,struct map_session_data *sd) +void clif_parse_NpcBuyListSend (int fd, struct map_session_data *sd) { - int fail=0,n; - unsigned short *item_list; + int fail = 0, n; + unsigned short *item_list; - n = (RFIFOW(fd,2)-4) /4; - item_list = (unsigned short*)RFIFOP(fd,4); + n = (RFIFOW (fd, 2) - 4) / 4; + item_list = (unsigned short *) RFIFOP (fd, 4); - fail = npc_buylist(sd,n,item_list); + fail = npc_buylist (sd, n, item_list); - WFIFOW(fd,0)=0xca; - WFIFOB(fd,2)=fail; - WFIFOSET(fd,packet_len_table[0xca]); + WFIFOW (fd, 0) = 0xca; + WFIFOB (fd, 2) = fail; + WFIFOSET (fd, packet_len_table[0xca]); } /*========================================== * *------------------------------------------ */ -void clif_parse_NpcSellListSend(int fd,struct map_session_data *sd) +void clif_parse_NpcSellListSend (int fd, struct map_session_data *sd) { - int fail=0,n; - unsigned short *item_list; + int fail = 0, n; + unsigned short *item_list; - n = (RFIFOW(fd,2)-4) /4; - item_list = (unsigned short*)RFIFOP(fd,4); + n = (RFIFOW (fd, 2) - 4) / 4; + item_list = (unsigned short *) RFIFOP (fd, 4); - fail = npc_selllist(sd,n,item_list); + fail = npc_selllist (sd, n, item_list); - WFIFOW(fd,0)=0xcb; - WFIFOB(fd,2)=fail; - WFIFOSET(fd,packet_len_table[0xcb]); + WFIFOW (fd, 0) = 0xcb; + WFIFOB (fd, 2) = fail; + WFIFOSET (fd, packet_len_table[0xcb]); } /*========================================== * *------------------------------------------ */ -void clif_parse_CreateChatRoom(int fd,struct map_session_data *sd) +void clif_parse_CreateChatRoom (int fd, struct map_session_data *sd) { - chat_createchat(sd,RFIFOW(fd,4),RFIFOB(fd,6),RFIFOP(fd,7),RFIFOP(fd,15),RFIFOW(fd,2)-15); + chat_createchat (sd, RFIFOW (fd, 4), RFIFOB (fd, 6), RFIFOP (fd, 7), + RFIFOP (fd, 15), RFIFOW (fd, 2) - 15); } /*========================================== * *------------------------------------------ */ -void clif_parse_ChatAddMember(int fd,struct map_session_data *sd) +void clif_parse_ChatAddMember (int fd, struct map_session_data *sd) { - chat_joinchat(sd,RFIFOL(fd,2),RFIFOP(fd,6)); + chat_joinchat (sd, RFIFOL (fd, 2), RFIFOP (fd, 6)); } /*========================================== * *------------------------------------------ */ -void clif_parse_ChatRoomStatusChange(int fd,struct map_session_data *sd) +void clif_parse_ChatRoomStatusChange (int fd, struct map_session_data *sd) { - chat_changechatstatus(sd,RFIFOW(fd,4),RFIFOB(fd,6),RFIFOP(fd,7),RFIFOP(fd,15),RFIFOW(fd,2)-15); + chat_changechatstatus (sd, RFIFOW (fd, 4), RFIFOB (fd, 6), RFIFOP (fd, 7), + RFIFOP (fd, 15), RFIFOW (fd, 2) - 15); } /*========================================== * *------------------------------------------ */ -void clif_parse_ChangeChatOwner(int fd,struct map_session_data *sd) +void clif_parse_ChangeChatOwner (int fd, struct map_session_data *sd) { - chat_changechatowner(sd,RFIFOP(fd,6)); + chat_changechatowner (sd, RFIFOP (fd, 6)); } /*========================================== * *------------------------------------------ */ -void clif_parse_KickFromChat(int fd,struct map_session_data *sd) +void clif_parse_KickFromChat (int fd, struct map_session_data *sd) { - chat_kickchat(sd,RFIFOP(fd,2)); + chat_kickchat (sd, RFIFOP (fd, 2)); } /*========================================== * *------------------------------------------ */ -void clif_parse_ChatLeave(int fd,struct map_session_data *sd) +void clif_parse_ChatLeave (int fd, struct map_session_data *sd) { - chat_leavechat(sd); + chat_leavechat (sd); } /*========================================== * ソスソスソスソスソスvソスソスソス相趣ソスソスノ托ソスソスソス *------------------------------------------ */ -void clif_parse_TradeRequest(int fd,struct map_session_data *sd) +void clif_parse_TradeRequest (int fd, struct map_session_data *sd) { - nullpo_retv(sd); + nullpo_retv (sd); - if(battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_TRADE) >= 1){ - if (tmw_CheckTradeSpam(sd)) - return; - trade_traderequest(sd,RFIFOL(sd->fd,2)); - } else - clif_skill_fail(sd,1,0,0); + if (battle_config.basic_skill_check == 0 + || pc_checkskill (sd, NV_TRADE) >= 1) + { + if (tmw_CheckTradeSpam (sd)) + return; + trade_traderequest (sd, RFIFOL (sd->fd, 2)); + } + else + clif_skill_fail (sd, 1, 0, 0); } /*========================================== * ソスソスソスソスソスvソスソス *------------------------------------------ */ -void clif_parse_TradeAck(int fd,struct map_session_data *sd) +void clif_parse_TradeAck (int fd, struct map_session_data *sd) { - nullpo_retv(sd); + nullpo_retv (sd); - trade_tradeack(sd,RFIFOB(sd->fd,2)); + trade_tradeack (sd, RFIFOB (sd->fd, 2)); } /*========================================== * ソスAソスCソスeソスソスソスヌ会ソス *------------------------------------------ */ -void clif_parse_TradeAddItem(int fd,struct map_session_data *sd) +void clif_parse_TradeAddItem (int fd, struct map_session_data *sd) { - nullpo_retv(sd); + nullpo_retv (sd); - trade_tradeadditem(sd,RFIFOW(sd->fd,2),RFIFOL(sd->fd,4)); + trade_tradeadditem (sd, RFIFOW (sd->fd, 2), RFIFOL (sd->fd, 4)); } /*========================================== * ソスAソスCソスeソスソスソスヌ会ソスソスソスソス(okソスソスソスソス) *------------------------------------------ */ -void clif_parse_TradeOk(int fd,struct map_session_data *sd) +void clif_parse_TradeOk (int fd, struct map_session_data *sd) { - trade_tradeok(sd); + trade_tradeok (sd); } /*========================================== * ソスソスソスソスソスLソスソスソスソスソスZソスソス *------------------------------------------ */ -void clif_parse_TradeCansel(int fd,struct map_session_data *sd) +void clif_parse_TradeCansel (int fd, struct map_session_data *sd) { - trade_tradecancel(sd); + trade_tradecancel (sd); } /*========================================== * ソスソスソスソスソスソスソスソス(tradeソスソスソスソス) *------------------------------------------ */ -void clif_parse_TradeCommit(int fd,struct map_session_data *sd) +void clif_parse_TradeCommit (int fd, struct map_session_data *sd) { - trade_tradecommit(sd); + trade_tradecommit (sd); } /*========================================== * *------------------------------------------ */ -void clif_parse_StopAttack(int fd,struct map_session_data *sd) +void clif_parse_StopAttack (int fd, struct map_session_data *sd) { - pc_stopattack(sd); + pc_stopattack (sd); } /*========================================== * ソスJソス[ソスgソスヨアソスCソスeソスソスソスソスソスレゑソス *------------------------------------------ */ -void clif_parse_PutItemToCart(int fd,struct map_session_data *sd) +void clif_parse_PutItemToCart (int fd, struct map_session_data *sd) { - nullpo_retv(sd); + nullpo_retv (sd); - if(sd->npc_id!=0 || sd->trade_partner != 0) - return; - pc_putitemtocart(sd,RFIFOW(fd,2)-2,RFIFOL(fd,4)); + if (sd->npc_id != 0 || sd->trade_partner != 0) + return; + pc_putitemtocart (sd, RFIFOW (fd, 2) - 2, RFIFOL (fd, 4)); } + /*========================================== * ソスJソス[ソスgソスソスソスソスソスAソスCソスeソスソスソスソスソスoソスソス *------------------------------------------ */ -void clif_parse_GetItemFromCart(int fd,struct map_session_data *sd) +void clif_parse_GetItemFromCart (int fd, struct map_session_data *sd) { - nullpo_retv(sd); + nullpo_retv (sd); - if(sd->npc_id!=0 || sd->trade_partner != 0) return; - pc_getitemfromcart(sd,RFIFOW(fd,2)-2,RFIFOL(fd,4)); + if (sd->npc_id != 0 || sd->trade_partner != 0) + return; + pc_getitemfromcart (sd, RFIFOW (fd, 2) - 2, RFIFOL (fd, 4)); } /*========================================== * ソスtソスソスソスi(ソスソス,ソスyソスR,ソスJソス[ソスg)ソスソスソスヘゑソスソスソス *------------------------------------------ */ -void clif_parse_RemoveOption(int fd,struct map_session_data *sd) +void clif_parse_RemoveOption (int fd, struct map_session_data *sd) { - if(pc_isriding(sd)) { // jobchange when removing peco [Valaris] - if(sd->status.class==13) - sd->status.class=sd->view_class=7; + if (pc_isriding (sd)) + { // jobchange when removing peco [Valaris] + if (sd->status.class == 13) + sd->status.class = sd->view_class = 7; - if(sd->status.class==21) - sd->status.class=sd->view_class=14; + if (sd->status.class == 21) + sd->status.class = sd->view_class = 14; - if(sd->status.class==4014) - sd->status.class=sd->view_class=4008; + if (sd->status.class == 4014) + sd->status.class = sd->view_class = 4008; - if(sd->status.class==4022) - sd->status.class=sd->view_class=4015; - } + if (sd->status.class == 4022) + sd->status.class = sd->view_class = 4015; + } - pc_setoption(sd,0); + pc_setoption (sd, 0); } /*========================================== * ソス`ソスFソスソスソスWソスJソス[ソスg *------------------------------------------ */ -void clif_parse_ChangeCart(int fd,struct map_session_data *sd) +void clif_parse_ChangeCart (int fd, struct map_session_data *sd) { - pc_setcart(sd,RFIFOW(fd,2)); + pc_setcart (sd, RFIFOW (fd, 2)); } /*========================================== * ソスXソスeソス[ソス^ソスXソスAソスbソスv *------------------------------------------ */ -void clif_parse_StatusUp(int fd,struct map_session_data *sd) +void clif_parse_StatusUp (int fd, struct map_session_data *sd) { - pc_statusup(sd,RFIFOW(fd,2)); + pc_statusup (sd, RFIFOW (fd, 2)); } /*========================================== * ソスXソスLソスソスソスソスソスxソスソスソスAソスbソスv *------------------------------------------ */ -void clif_parse_SkillUp(int fd,struct map_session_data *sd) +void clif_parse_SkillUp (int fd, struct map_session_data *sd) { - pc_skillup(sd,RFIFOW(fd,2)); + pc_skillup (sd, RFIFOW (fd, 2)); } /*========================================== * ソスXソスLソスソスソスgソスpソスiIDソスwソスソスソスj *------------------------------------------ */ -void clif_parse_UseSkillToId(int fd, struct map_session_data *sd) { - int skillnum, skilllv, lv, target_id; - unsigned int tick = gettick(); - - nullpo_retv(sd); +void clif_parse_UseSkillToId (int fd, struct map_session_data *sd) +{ + int skillnum, skilllv, lv, target_id; + unsigned int tick = gettick (); - if(map[sd->bl.m].flag.noskill) return; - if (sd->chatID || sd->npc_id != 0 || sd->state.storage_flag) - return; + nullpo_retv (sd); - skilllv = RFIFOW(fd,2); - skillnum = RFIFOW(fd,4); - target_id = RFIFOL(fd,6); + if (map[sd->bl.m].flag.noskill) + return; + if (sd->chatID || sd->npc_id != 0 || sd->state.storage_flag) + return; - if (sd->skilltimer != -1) { - if (skillnum != SA_CASTCANCEL) - return; - } else if (DIFF_TICK(tick, sd->canact_tick) < 0) { - clif_skill_fail(sd, skillnum, 4, 0); - return; - } + skilllv = RFIFOW (fd, 2); + skillnum = RFIFOW (fd, 4); + target_id = RFIFOL (fd, 6); - if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) || - sd->sc_data[SC_BERSERK].timer != -1 || sd->sc_data[SC_NOCHAT].timer!=-1 || - sd->sc_data[SC_WEDDING].timer!=-1 || sd->view_class==22) - return; - if (sd->invincible_timer != -1) - pc_delinvincibletimer(sd); - if (sd->skillitem >= 0 && sd->skillitem == skillnum) { - if (skilllv != sd->skillitemlv) - skilllv = sd->skillitemlv; - skill_use_id(sd, target_id, skillnum, skilllv); - } else { - sd->skillitem = sd->skillitemlv = -1; - if (skillnum == MO_EXTREMITYFIST) { - if ((sd->sc_data[SC_COMBO].timer == -1 || (sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH && sd->sc_data[SC_COMBO].val1 != CH_CHAINCRUSH))) { - if (!sd->state.skill_flag ) { - sd->state.skill_flag = 1; - clif_skillinfo(sd, MO_EXTREMITYFIST, 1, -1); - return; - } else if (sd->bl.id == target_id) { - clif_skillinfo(sd, MO_EXTREMITYFIST, 1, -1); - return; - } - } - } - if ((lv = pc_checkskill(sd, skillnum)) > 0) { - if (skilllv > lv) - skilllv = lv; - skill_use_id(sd, target_id, skillnum, skilllv); - if (sd->state.skill_flag) - sd->state.skill_flag = 0; - } - } + if (sd->skilltimer != -1) + { + if (skillnum != SA_CASTCANCEL) + return; + } + else if (DIFF_TICK (tick, sd->canact_tick) < 0) + { + clif_skill_fail (sd, skillnum, 4, 0); + return; + } + + if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) || + sd->sc_data[SC_BERSERK].timer != -1 + || sd->sc_data[SC_NOCHAT].timer != -1 + || sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class == 22) + return; + if (sd->invincible_timer != -1) + pc_delinvincibletimer (sd); + if (sd->skillitem >= 0 && sd->skillitem == skillnum) + { + if (skilllv != sd->skillitemlv) + skilllv = sd->skillitemlv; + skill_use_id (sd, target_id, skillnum, skilllv); + } + else + { + sd->skillitem = sd->skillitemlv = -1; + if (skillnum == MO_EXTREMITYFIST) + { + if ((sd->sc_data[SC_COMBO].timer == -1 + || (sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH + && sd->sc_data[SC_COMBO].val1 != CH_CHAINCRUSH))) + { + if (!sd->state.skill_flag) + { + sd->state.skill_flag = 1; + clif_skillinfo (sd, MO_EXTREMITYFIST, 1, -1); + return; + } + else if (sd->bl.id == target_id) + { + clif_skillinfo (sd, MO_EXTREMITYFIST, 1, -1); + return; + } + } + } + if ((lv = pc_checkskill (sd, skillnum)) > 0) + { + if (skilllv > lv) + skilllv = lv; + skill_use_id (sd, target_id, skillnum, skilllv); + if (sd->state.skill_flag) + sd->state.skill_flag = 0; + } + } } /*========================================== * ソスXソスLソスソスソスgソスpソスiソス齒奇ソスwソスソスソスj *------------------------------------------ */ -void clif_parse_UseSkillToPos(int fd, struct map_session_data *sd) { - int skillnum, skilllv, lv, x, y; - unsigned int tick = gettick(); - int skillmoreinfo; +void clif_parse_UseSkillToPos (int fd, struct map_session_data *sd) +{ + int skillnum, skilllv, lv, x, y; + unsigned int tick = gettick (); + int skillmoreinfo; - nullpo_retv(sd); + nullpo_retv (sd); - if(map[sd->bl.m].flag.noskill) return; - if (sd->npc_id != 0 || sd->state.storage_flag) return; - if(sd->chatID) return; - - skillmoreinfo = -1; - skilllv = RFIFOW(fd,2); - skillnum = RFIFOW(fd,4); - x = RFIFOW(fd,6); - y = RFIFOW(fd,8); - if (RFIFOW(fd,0) == 0x190) - skillmoreinfo = 10; - - if (skillmoreinfo != -1) { - if (pc_issit(sd)) { - clif_skill_fail(sd, skillnum, 0, 0); - return; - } - memcpy(talkie_mes, RFIFOP(fd,skillmoreinfo), 80); - } + if (map[sd->bl.m].flag.noskill) + return; + if (sd->npc_id != 0 || sd->state.storage_flag) + return; + if (sd->chatID) + return; - if (sd->skilltimer != -1) - return; - else if (DIFF_TICK(tick, sd->canact_tick) < 0) { - clif_skill_fail(sd, skillnum, 4, 0); - return; - } + skillmoreinfo = -1; + skilllv = RFIFOW (fd, 2); + skillnum = RFIFOW (fd, 4); + x = RFIFOW (fd, 6); + y = RFIFOW (fd, 8); + if (RFIFOW (fd, 0) == 0x190) + skillmoreinfo = 10; - if((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) || - sd->sc_data[SC_BERSERK].timer!=-1 || sd->sc_data[SC_NOCHAT].timer!=-1 || - sd->sc_data[SC_WEDDING].timer!=-1 || sd->view_class==22) - return; - if (sd->invincible_timer != -1) - pc_delinvincibletimer(sd); - if (sd->skillitem >= 0 && sd->skillitem == skillnum) { - if (skilllv != sd->skillitemlv) - skilllv = sd->skillitemlv; - skill_use_pos(sd, x, y, skillnum, skilllv); - } else { - sd->skillitem = sd->skillitemlv = -1; - if ((lv = pc_checkskill(sd, skillnum)) > 0) { - if (skilllv > lv) - skilllv = lv; - skill_use_pos(sd, x, y, skillnum,skilllv); - } - } + if (skillmoreinfo != -1) + { + if (pc_issit (sd)) + { + clif_skill_fail (sd, skillnum, 0, 0); + return; + } + memcpy (talkie_mes, RFIFOP (fd, skillmoreinfo), 80); + } + + if (sd->skilltimer != -1) + return; + else if (DIFF_TICK (tick, sd->canact_tick) < 0) + { + clif_skill_fail (sd, skillnum, 4, 0); + return; + } + + if ((sd->sc_data[SC_TRICKDEAD].timer != -1 && skillnum != NV_TRICKDEAD) || + sd->sc_data[SC_BERSERK].timer != -1 + || sd->sc_data[SC_NOCHAT].timer != -1 + || sd->sc_data[SC_WEDDING].timer != -1 || sd->view_class == 22) + return; + if (sd->invincible_timer != -1) + pc_delinvincibletimer (sd); + if (sd->skillitem >= 0 && sd->skillitem == skillnum) + { + if (skilllv != sd->skillitemlv) + skilllv = sd->skillitemlv; + skill_use_pos (sd, x, y, skillnum, skilllv); + } + else + { + sd->skillitem = sd->skillitemlv = -1; + if ((lv = pc_checkskill (sd, skillnum)) > 0) + { + if (skilllv > lv) + skilllv = lv; + skill_use_pos (sd, x, y, skillnum, skilllv); + } + } } /*========================================== * ソスXソスLソスソスソスgソスpソスimapソスwソスソスソスj *------------------------------------------ */ -void clif_parse_UseSkillMap(int fd,struct map_session_data *sd) +void clif_parse_UseSkillMap (int fd, struct map_session_data *sd) { - nullpo_retv(sd); + nullpo_retv (sd); - if(map[sd->bl.m].flag.noskill) return; - if(sd->chatID) return; + if (map[sd->bl.m].flag.noskill) + return; + if (sd->chatID) + return; - if(sd->npc_id!=0 || (sd->sc_data && - (sd->sc_data[SC_TRICKDEAD].timer != -1 || - sd->sc_data[SC_BERSERK].timer!=-1 || - sd->sc_data[SC_NOCHAT].timer!=-1 || - sd->sc_data[SC_WEDDING].timer!=-1 || - sd->view_class==22))) - return; + if (sd->npc_id != 0 || (sd->sc_data && + (sd->sc_data[SC_TRICKDEAD].timer != -1 || + sd->sc_data[SC_BERSERK].timer != -1 || + sd->sc_data[SC_NOCHAT].timer != -1 || + sd->sc_data[SC_WEDDING].timer != -1 || + sd->view_class == 22))) + return; - if(sd->invincible_timer != -1) - pc_delinvincibletimer(sd); + if (sd->invincible_timer != -1) + pc_delinvincibletimer (sd); - skill_castend_map(sd,RFIFOW(fd,2),RFIFOP(fd,4)); + skill_castend_map (sd, RFIFOW (fd, 2), RFIFOP (fd, 4)); } + /*========================================== * ソスソスソスソスソスvソスソス *------------------------------------------ */ -void clif_parse_RequestMemo(int fd,struct map_session_data *sd) +void clif_parse_RequestMemo (int fd, struct map_session_data *sd) { - pc_memo(sd,-1); + pc_memo (sd, -1); } /*========================================== * *------------------------------------------ */ -void clif_parse_NpcSelectMenu(int fd,struct map_session_data *sd) +void clif_parse_NpcSelectMenu (int fd, struct map_session_data *sd) { - nullpo_retv(sd); + nullpo_retv (sd); - sd->npc_menu=RFIFOB(fd,6); - map_scriptcont(sd,RFIFOL(fd,2)); + sd->npc_menu = RFIFOB (fd, 6); + map_scriptcont (sd, RFIFOL (fd, 2)); } /*========================================== * *------------------------------------------ */ -void clif_parse_NpcNextClicked(int fd,struct map_session_data *sd) +void clif_parse_NpcNextClicked (int fd, struct map_session_data *sd) { - map_scriptcont(sd,RFIFOL(fd,2)); + map_scriptcont (sd, RFIFOL (fd, 2)); } /*========================================== * *------------------------------------------ */ -void clif_parse_NpcAmountInput(int fd,struct map_session_data *sd) +void clif_parse_NpcAmountInput (int fd, struct map_session_data *sd) { - nullpo_retv(sd); + nullpo_retv (sd); #define RFIFOL_(fd,pos) (*(int*)(session[fd]->rdata+session[fd]->rdata_pos+(pos))) - //Input Value overflow Exploit FIX - sd->npc_amount=RFIFOL_(fd,6); //fixed by Lupus. npc_amount is (int) but was RFIFOL changing it to (unsigned int) + //Input Value overflow Exploit FIX + sd->npc_amount = RFIFOL_ (fd, 6); //fixed by Lupus. npc_amount is (int) but was RFIFOL changing it to (unsigned int) #undef RFIFOL_ - map_scriptcont(sd,RFIFOL(fd,2)); + map_scriptcont (sd, RFIFOL (fd, 2)); } /*========================================== * *------------------------------------------ */ -void clif_parse_NpcStringInput(int fd,struct map_session_data *sd) +void clif_parse_NpcStringInput (int fd, struct map_session_data *sd) { - int len; - nullpo_retv(sd); + int len; + nullpo_retv (sd); - len = RFIFOW(fd,2)-7; + len = RFIFOW (fd, 2) - 7; - if(len >= sizeof(sd->npc_str)){ - printf("clif: input string too long !\n"); - memcpy(sd->npc_str,RFIFOP(fd,8),sizeof(sd->npc_str)); - sd->npc_str[sizeof(sd->npc_str)-1]=0; - } else - strncpy(sd->npc_str,RFIFOP(fd,8), len); - map_scriptcont(sd,RFIFOL(fd,4)); + if (len >= sizeof (sd->npc_str)) + { + printf ("clif: input string too long !\n"); + memcpy (sd->npc_str, RFIFOP (fd, 8), sizeof (sd->npc_str)); + sd->npc_str[sizeof (sd->npc_str) - 1] = 0; + } + else + strncpy (sd->npc_str, RFIFOP (fd, 8), len); + map_scriptcont (sd, RFIFOL (fd, 4)); } /*========================================== * *------------------------------------------ */ -void clif_parse_NpcCloseClicked(int fd,struct map_session_data *sd) +void clif_parse_NpcCloseClicked (int fd, struct map_session_data *sd) { - map_scriptcont(sd,RFIFOL(fd,2)); + map_scriptcont (sd, RFIFOL (fd, 2)); } /*========================================== * ソスAソスCソスeソスソスソスモ抵ソス *------------------------------------------ */ -void clif_parse_ItemIdentify(int fd,struct map_session_data *sd) +void clif_parse_ItemIdentify (int fd, struct map_session_data *sd) { - pc_item_identify(sd,RFIFOW(fd,2)-2); + pc_item_identify (sd, RFIFOW (fd, 2) - 2); } + /*========================================== * ソスIソス[ソスgソスXソスyソスソスソスソスソスM *------------------------------------------ */ -void clif_parse_AutoSpell(int fd,struct map_session_data *sd) +void clif_parse_AutoSpell (int fd, struct map_session_data *sd) { - skill_autospell(sd,RFIFOW(fd,2)); + skill_autospell (sd, RFIFOW (fd, 2)); } + /*========================================== * ソスJソス[ソスhソスgソスp *------------------------------------------ */ -void clif_parse_UseCard(int fd,struct map_session_data *sd) +void clif_parse_UseCard (int fd, struct map_session_data *sd) { - clif_use_card(sd,RFIFOW(fd,2)-2); + clif_use_card (sd, RFIFOW (fd, 2) - 2); } + /*========================================== * ソスJソス[ソスhソス}ソスソスソスソスソスソスソスIソスソス *------------------------------------------ */ -void clif_parse_InsertCard(int fd,struct map_session_data *sd) +void clif_parse_InsertCard (int fd, struct map_session_data *sd) { - pc_insert_card(sd,RFIFOW(fd,2)-2,RFIFOW(fd,4)-2); + pc_insert_card (sd, RFIFOW (fd, 2) - 2, RFIFOW (fd, 4) - 2); } /*========================================== * 0193 ソスLソスソスソスソスIDソスソスソスOソスソスソスソス *------------------------------------------ */ -void clif_parse_SolveCharName(int fd, struct map_session_data *sd) { - int char_id; +void clif_parse_SolveCharName (int fd, struct map_session_data *sd) +{ + int char_id; - char_id = RFIFOL(fd,2); - clif_solved_charname(sd, char_id); + char_id = RFIFOL (fd, 2); + clif_solved_charname (sd, char_id); } /*========================================== * 0197 /resetskill /resetstate *------------------------------------------ */ -void clif_parse_ResetChar(int fd, struct map_session_data *sd) { - nullpo_retv(sd); - - if (battle_config.atc_gmonly == 0 || pc_isGM(sd)) { - switch(RFIFOW(fd,2)){ - case 0: - log_atcommand(sd, "@charstreset %s", sd->status.name); - if (pc_isGM(sd) >= get_atcommand_level(AtCommand_ResetState)) - pc_resetstate(sd); - break; - case 1: - log_atcommand(sd, "@charskreset %s", sd->status.name); - if (pc_isGM(sd) >= get_atcommand_level(AtCommand_ResetState)) - pc_resetskill(sd); - break; - } - } +void clif_parse_ResetChar (int fd, struct map_session_data *sd) +{ + nullpo_retv (sd); + + if (battle_config.atc_gmonly == 0 || pc_isGM (sd)) + { + switch (RFIFOW (fd, 2)) + { + case 0: + log_atcommand (sd, "@charstreset %s", sd->status.name); + if (pc_isGM (sd) >= + get_atcommand_level (AtCommand_ResetState)) + pc_resetstate (sd); + break; + case 1: + log_atcommand (sd, "@charskreset %s", sd->status.name); + if (pc_isGM (sd) >= + get_atcommand_level (AtCommand_ResetState)) + pc_resetskill (sd); + break; + } + } } /*========================================== * 019c /lbソスソス *------------------------------------------ */ -void clif_parse_LGMmessage(int fd, struct map_session_data *sd) { - unsigned char buf[64]; +void clif_parse_LGMmessage (int fd, struct map_session_data *sd) +{ + unsigned char buf[64]; - nullpo_retv(sd); + nullpo_retv (sd); - if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && - (pc_isGM(sd) >= get_atcommand_level(AtCommand_LocalBroadcast))) { - WBUFW(buf,0) = 0x9a; - WBUFW(buf,2) = RFIFOW(fd,2); - memcpy(WBUFP(buf,4), RFIFOP(fd,4), RFIFOW(fd,2) - 4); - clif_send(buf, RFIFOW(fd,2), &sd->bl, ALL_SAMEMAP); - } + if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) && + (pc_isGM (sd) >= get_atcommand_level (AtCommand_LocalBroadcast))) + { + WBUFW (buf, 0) = 0x9a; + WBUFW (buf, 2) = RFIFOW (fd, 2); + memcpy (WBUFP (buf, 4), RFIFOP (fd, 4), RFIFOW (fd, 2) - 4); + clif_send (buf, RFIFOW (fd, 2), &sd->bl, ALL_SAMEMAP); + } } /*========================================== * ソスJソスvソスソスソスqソスノへ難ソスソスソスソスソス *------------------------------------------ */ -void clif_parse_MoveToKafra(int fd, struct map_session_data *sd) { - int item_index, item_amount; +void clif_parse_MoveToKafra (int fd, struct map_session_data *sd) +{ + int item_index, item_amount; - nullpo_retv(sd); + nullpo_retv (sd); - item_index = RFIFOW(fd,2) - 2; - item_amount = RFIFOL(fd,4); + item_index = RFIFOW (fd, 2) - 2; + item_amount = RFIFOL (fd, 4); - if ((sd->npc_id != 0 && !sd->npc_flags.storage) || sd->trade_partner != 0 || !sd->state.storage_flag) - return; + if ((sd->npc_id != 0 && !sd->npc_flags.storage) || sd->trade_partner != 0 + || !sd->state.storage_flag) + return; - if (sd->state.storage_flag == 1) - storage_storageadd(sd, item_index, item_amount); - else if (sd->state.storage_flag == 2) - storage_guild_storageadd(sd, item_index, item_amount); + if (sd->state.storage_flag == 1) + storage_storageadd (sd, item_index, item_amount); + else if (sd->state.storage_flag == 2) + storage_guild_storageadd (sd, item_index, item_amount); } /*========================================== * ソスJソスvソスソスソスqソスノゑソスソスソスソスoソスソス *------------------------------------------ */ -void clif_parse_MoveFromKafra(int fd,struct map_session_data *sd) { - int item_index, item_amount; +void clif_parse_MoveFromKafra (int fd, struct map_session_data *sd) +{ + int item_index, item_amount; - nullpo_retv(sd); + nullpo_retv (sd); - item_index = RFIFOW(fd,2) - 1; - item_amount = RFIFOL(fd,4); + item_index = RFIFOW (fd, 2) - 1; + item_amount = RFIFOL (fd, 4); - if ((sd->npc_id != 0 && !sd->npc_flags.storage) || sd->trade_partner != 0 || !sd->state.storage_flag) - return; + if ((sd->npc_id != 0 && !sd->npc_flags.storage) || sd->trade_partner != 0 + || !sd->state.storage_flag) + return; - if (sd->state.storage_flag == 1) - storage_storageget(sd, item_index, item_amount); - else if(sd->state.storage_flag == 2) - storage_guild_storageget(sd, item_index, item_amount); + if (sd->state.storage_flag == 1) + storage_storageget (sd, item_index, item_amount); + else if (sd->state.storage_flag == 2) + storage_guild_storageget (sd, item_index, item_amount); } /*========================================== * ソスJソスvソスソスソスqソスノへカソス[ソスgソスソスソスソスソスソスソスソスソスソス *------------------------------------------ */ -void clif_parse_MoveToKafraFromCart(int fd, struct map_session_data *sd) { - nullpo_retv(sd); +void clif_parse_MoveToKafraFromCart (int fd, struct map_session_data *sd) +{ + nullpo_retv (sd); - if ((sd->npc_id != 0 && !sd->npc_flags.storage) || sd->trade_partner != 0 || !sd->state.storage_flag) - return; - if (sd->state.storage_flag == 1) - storage_storageaddfromcart(sd, RFIFOW(fd,2) - 2, RFIFOL(fd,4)); - else if (sd->state.storage_flag == 2) - storage_guild_storageaddfromcart(sd, RFIFOW(fd,2) - 2, RFIFOL(fd,4)); + if ((sd->npc_id != 0 && !sd->npc_flags.storage) || sd->trade_partner != 0 + || !sd->state.storage_flag) + return; + if (sd->state.storage_flag == 1) + storage_storageaddfromcart (sd, RFIFOW (fd, 2) - 2, RFIFOL (fd, 4)); + else if (sd->state.storage_flag == 2) + storage_guild_storageaddfromcart (sd, RFIFOW (fd, 2) - 2, + RFIFOL (fd, 4)); } /*========================================== * ソスJソスvソスソスソスqソスノゑソスソスソスソスoソスソス *------------------------------------------ */ -void clif_parse_MoveFromKafraToCart(int fd, struct map_session_data *sd) { - nullpo_retv(sd); +void clif_parse_MoveFromKafraToCart (int fd, struct map_session_data *sd) +{ + nullpo_retv (sd); - if ((sd->npc_id != 0 && !sd->npc_flags.storage) || sd->trade_partner != 0 || !sd->state.storage_flag) - return; - if (sd->state.storage_flag == 1) - storage_storagegettocart(sd, RFIFOW(fd,2)-1, RFIFOL(fd,4)); - else if (sd->state.storage_flag == 2) - storage_guild_storagegettocart(sd, RFIFOW(fd,2)-1, RFIFOL(fd,4)); + if ((sd->npc_id != 0 && !sd->npc_flags.storage) || sd->trade_partner != 0 + || !sd->state.storage_flag) + return; + if (sd->state.storage_flag == 1) + storage_storagegettocart (sd, RFIFOW (fd, 2) - 1, RFIFOL (fd, 4)); + else if (sd->state.storage_flag == 2) + storage_guild_storagegettocart (sd, RFIFOW (fd, 2) - 1, + RFIFOL (fd, 4)); } /*========================================== * ソスJソスvソスソスソスqソスノゑソスソスツゑソスソスソス *------------------------------------------ */ -void clif_parse_CloseKafra(int fd, struct map_session_data *sd) { - nullpo_retv(sd); +void clif_parse_CloseKafra (int fd, struct map_session_data *sd) +{ + nullpo_retv (sd); - if (sd->state.storage_flag == 1) - storage_storageclose(sd); - else if (sd->state.storage_flag == 2) - storage_guild_storageclose(sd); + if (sd->state.storage_flag == 1) + storage_storageclose (sd); + else if (sd->state.storage_flag == 2) + storage_guild_storageclose (sd); } /*========================================== * ソスpソス[ソスeソスBソスソスソスソスソスソス *------------------------------------------ */ -void clif_parse_CreateParty(int fd, struct map_session_data *sd) { - if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_PARTY) >= 2) { - party_create(sd,RFIFOP(fd,2)); - } else - clif_skill_fail(sd,1,0,4); +void clif_parse_CreateParty (int fd, struct map_session_data *sd) +{ + if (battle_config.basic_skill_check == 0 + || pc_checkskill (sd, NV_PARTY) >= 2) + { + party_create (sd, RFIFOP (fd, 2)); + } + else + clif_skill_fail (sd, 1, 0, 4); } /*========================================== * ソスpソス[ソスeソスBソスソスソスソスソスソス *------------------------------------------ */ -void clif_parse_CreateParty2(int fd, struct map_session_data *sd) { - if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_PARTY) >= 2){ - party_create(sd, RFIFOP(fd,2)); - } else - clif_skill_fail(sd, 1, 0, 4); +void clif_parse_CreateParty2 (int fd, struct map_session_data *sd) +{ + if (battle_config.basic_skill_check == 0 + || pc_checkskill (sd, NV_PARTY) >= 2) + { + party_create (sd, RFIFOP (fd, 2)); + } + else + clif_skill_fail (sd, 1, 0, 4); } /*========================================== * ソスpソス[ソスeソスBソスノ奇ソスソスU *------------------------------------------ */ -void clif_parse_PartyInvite(int fd, struct map_session_data *sd) { - printf("Party Invite!\n"); - party_invite(sd, RFIFOL(fd,2)); +void clif_parse_PartyInvite (int fd, struct map_session_data *sd) +{ + printf ("Party Invite!\n"); + party_invite (sd, RFIFOL (fd, 2)); } /*========================================== * ソスpソス[ソスeソスBソスソスソスUソスヤ難ソス *------------------------------------------ */ -void clif_parse_ReplyPartyInvite(int fd,struct map_session_data *sd) { - if (battle_config.basic_skill_check == 0 || pc_checkskill(sd,NV_PARTY) >= 1){ - party_reply_invite(sd,RFIFOL(fd,2),RFIFOL(fd,6)); - } else { - party_reply_invite(sd,RFIFOL(fd,2),-1); - clif_skill_fail(sd,1,0,4); - } +void clif_parse_ReplyPartyInvite (int fd, struct map_session_data *sd) +{ + if (battle_config.basic_skill_check == 0 + || pc_checkskill (sd, NV_PARTY) >= 1) + { + party_reply_invite (sd, RFIFOL (fd, 2), RFIFOL (fd, 6)); + } + else + { + party_reply_invite (sd, RFIFOL (fd, 2), -1); + clif_skill_fail (sd, 1, 0, 4); + } } /*========================================== * ソスpソス[ソスeソスBソスEソズ要ソスソス *------------------------------------------ */ -void clif_parse_LeaveParty(int fd, struct map_session_data *sd) { - party_leave(sd); +void clif_parse_LeaveParty (int fd, struct map_session_data *sd) +{ + party_leave (sd); } /*========================================== * ソスpソス[ソスeソスBソスソスソスソスソスvソスソス *------------------------------------------ */ -void clif_parse_RemovePartyMember(int fd, struct map_session_data *sd) { - party_removemember(sd,RFIFOL(fd,2),RFIFOP(fd,6)); +void clif_parse_RemovePartyMember (int fd, struct map_session_data *sd) +{ + party_removemember (sd, RFIFOL (fd, 2), RFIFOP (fd, 6)); } /*========================================== * ソスpソス[ソスeソスBソスン抵ソスソスマ更ソスvソスソス *------------------------------------------ */ -void clif_parse_PartyChangeOption(int fd, struct map_session_data *sd) { - party_changeoption(sd, RFIFOW(fd,2), RFIFOW(fd,4)); +void clif_parse_PartyChangeOption (int fd, struct map_session_data *sd) +{ + party_changeoption (sd, RFIFOW (fd, 2), RFIFOW (fd, 4)); } /*========================================== * ソスpソス[ソスeソスBソスソスソスbソスZソス[ソスWソスソスソスMソスvソスソス *------------------------------------------ */ -void clif_parse_PartyMessage(int fd, struct map_session_data *sd) { - nullpo_retv(sd); +void clif_parse_PartyMessage (int fd, struct map_session_data *sd) +{ + nullpo_retv (sd); - if (is_atcommand(fd, sd, RFIFOP(fd,4), 0) != AtCommand_None) - return; - if(sd->sc_data && - (sd->sc_data[SC_BERSERK].timer!=-1 || //ソスoソス[ソスTソス[ソスNソスソスソスヘ会ソスソスbソスソスソスsソスソス - sd->sc_data[SC_NOCHAT].timer!=-1)) //ソス`ソスソスソスbソスgソスヨ止 - return; + if (is_atcommand (fd, sd, RFIFOP (fd, 4), 0) != AtCommand_None) + return; + if (sd->sc_data && (sd->sc_data[SC_BERSERK].timer != -1 || //ソスoソス[ソスTソス[ソスNソスソスソスヘ会ソスソスbソスソスソスsソスソス + sd->sc_data[SC_NOCHAT].timer != -1)) //ソス`ソスソスソスbソスgソスヨ止 + return; - party_send_message(sd, RFIFOP(fd,4), RFIFOW(fd,2)-4); + party_send_message (sd, RFIFOP (fd, 4), RFIFOW (fd, 2) - 4); } /*========================================== * /monster /item rewriten by [Yor] *------------------------------------------ */ -void clif_parse_GM_Monster_Item(int fd, struct map_session_data *sd) { - char monster_item_name[25]; +void clif_parse_GM_Monster_Item (int fd, struct map_session_data *sd) +{ + char monster_item_name[25]; - nullpo_retv(sd); + nullpo_retv (sd); - memset(monster_item_name, '\0', sizeof(monster_item_name)); - - if (battle_config.atc_gmonly == 0 || pc_isGM(sd)) { - memcpy(monster_item_name, RFIFOP(fd,2), 24); - - if (mobdb_searchname(monster_item_name) != 0) { - if (pc_isGM(sd) >= get_atcommand_level(AtCommand_Monster)) { - log_atcommand(sd, "@spawn %s", monster_item_name); - atcommand_spawn(fd, sd, "@spawn", monster_item_name); // as @spawn - } - } else if (itemdb_searchname(monster_item_name) != NULL) { - if (pc_isGM(sd) >= get_atcommand_level(AtCommand_Item)) { - log_atcommand(sd, "@item %s", monster_item_name); - atcommand_item(fd, sd, "@item", monster_item_name); // as @item - } - } + memset (monster_item_name, '\0', sizeof (monster_item_name)); - } + if (battle_config.atc_gmonly == 0 || pc_isGM (sd)) + { + memcpy (monster_item_name, RFIFOP (fd, 2), 24); + + if (mobdb_searchname (monster_item_name) != 0) + { + if (pc_isGM (sd) >= get_atcommand_level (AtCommand_Monster)) + { + log_atcommand (sd, "@spawn %s", monster_item_name); + atcommand_spawn (fd, sd, "@spawn", monster_item_name); // as @spawn + } + } + else if (itemdb_searchname (monster_item_name) != NULL) + { + if (pc_isGM (sd) >= get_atcommand_level (AtCommand_Item)) + { + log_atcommand (sd, "@item %s", monster_item_name); + atcommand_item (fd, sd, "@item", monster_item_name); // as @item + } + } + + } } /*========================================== * ソスMソスソスソスhソスソスソスソスソスソス *------------------------------------------ */ -void clif_parse_CreateGuild(int fd,struct map_session_data *sd) { - guild_create(sd, RFIFOP(fd,6)); +void clif_parse_CreateGuild (int fd, struct map_session_data *sd) +{ + guild_create (sd, RFIFOP (fd, 6)); } /*========================================== * ソスMソスソスソスhソス}ソスXソス^ソス[ソスソスソスヌゑソスソスソスソスmソスF *------------------------------------------ */ -void clif_parse_GuildCheckMaster(int fd, struct map_session_data *sd) { - clif_guild_masterormember(sd); +void clif_parse_GuildCheckMaster (int fd, struct map_session_data *sd) +{ + clif_guild_masterormember (sd); } /*========================================== * ソスMソスソスソスhソスソスソスソスソスvソスソス *------------------------------------------ */ -void clif_parse_GuildReqeustInfo(int fd, struct map_session_data *sd) { - switch(RFIFOL(fd,2)){ - case 0: // ソスMソスソスソスhソスソスソス{ソスソスソスソスソスAソスソスソスソスソスGソスホ擾ソスソスソス - clif_guild_basicinfo(sd); - clif_guild_allianceinfo(sd); - break; - case 1: // ソスソスソスソスソスoソス[ソスソスソスXソスgソスAソスソスソスEソスソスソスソスソスXソスg - clif_guild_positionnamelist(sd); - clif_guild_memberlist(sd); - break; - case 2: // ソスソスソスEソスソスソスソスソスXソスgソスAソスソスソスEソスソスソスリスソスg - clif_guild_positionnamelist(sd); - clif_guild_positioninfolist(sd); - break; - case 3: // ソスXソスLソスソスソスソスソスXソスg - clif_guild_skillinfo(sd); - break; - case 4: // ソスヌ包ソスソスソスソスXソスg - clif_guild_explusionlist(sd); - break; - default: - if (battle_config.error_log) - printf("clif: guild request info: unknown type %d\n", RFIFOL(fd,2)); - break; - } +void clif_parse_GuildReqeustInfo (int fd, struct map_session_data *sd) +{ + switch (RFIFOL (fd, 2)) + { + case 0: // ソスMソスソスソスhソスソスソス{ソスソスソスソスソスAソスソスソスソスソスGソスホ擾ソスソスソス + clif_guild_basicinfo (sd); + clif_guild_allianceinfo (sd); + break; + case 1: // ソスソスソスソスソスoソス[ソスソスソスXソスgソスAソスソスソスEソスソスソスソスソスXソスg + clif_guild_positionnamelist (sd); + clif_guild_memberlist (sd); + break; + case 2: // ソスソスソスEソスソスソスソスソスXソスgソスAソスソスソスEソスソスソスリスソスg + clif_guild_positionnamelist (sd); + clif_guild_positioninfolist (sd); + break; + case 3: // ソスXソスLソスソスソスソスソスXソスg + clif_guild_skillinfo (sd); + break; + case 4: // ソスヌ包ソスソスソスソスXソスg + clif_guild_explusionlist (sd); + break; + default: + if (battle_config.error_log) + printf ("clif: guild request info: unknown type %d\n", + RFIFOL (fd, 2)); + break; + } } /*========================================== * ソスMソスソスソスhソスソスソスEソスマ更 *------------------------------------------ */ -void clif_parse_GuildChangePositionInfo(int fd, struct map_session_data *sd) { - int i; +void clif_parse_GuildChangePositionInfo (int fd, struct map_session_data *sd) +{ + int i; - for(i = 4; i < RFIFOW(fd,2); i += 40 ){ - guild_change_position(sd, RFIFOL(fd,i), RFIFOL(fd,i+4), RFIFOL(fd,i+12), RFIFOP(fd,i+16)); - } + for (i = 4; i < RFIFOW (fd, 2); i += 40) + { + guild_change_position (sd, RFIFOL (fd, i), RFIFOL (fd, i + 4), + RFIFOL (fd, i + 12), RFIFOP (fd, i + 16)); + } } /*========================================== * ソスMソスソスソスhソスソスソスソスソスoソスソスソスEソスマ更 *------------------------------------------ */ -void clif_parse_GuildChangeMemberPosition(int fd, struct map_session_data *sd) { - int i; +void clif_parse_GuildChangeMemberPosition (int fd, + struct map_session_data *sd) +{ + int i; - nullpo_retv(sd); + nullpo_retv (sd); - for(i=4;i<RFIFOW(fd,2);i+=12){ - guild_change_memberposition(sd->status.guild_id, - RFIFOL(fd,i),RFIFOL(fd,i+4),RFIFOL(fd,i+8)); - } + for (i = 4; i < RFIFOW (fd, 2); i += 12) + { + guild_change_memberposition (sd->status.guild_id, + RFIFOL (fd, i), RFIFOL (fd, i + 4), + RFIFOL (fd, i + 8)); + } } /*========================================== * ソスMソスソスソスhソスGソスソスソスuソスソスソスソスソスvソスソス *------------------------------------------ */ -void clif_parse_GuildRequestEmblem(int fd,struct map_session_data *sd) { - struct guild *g=guild_search(RFIFOL(fd,2)); - if(g!=NULL) - clif_guild_emblem(sd,g); +void clif_parse_GuildRequestEmblem (int fd, struct map_session_data *sd) +{ + struct guild *g = guild_search (RFIFOL (fd, 2)); + if (g != NULL) + clif_guild_emblem (sd, g); } /*========================================== * ソスMソスソスソスhソスGソスソスソスuソスソスソスソスソスマ更 *------------------------------------------ */ -void clif_parse_GuildChangeEmblem(int fd,struct map_session_data *sd) { - guild_change_emblem(sd,RFIFOW(fd,2)-4,RFIFOP(fd,4)); +void clif_parse_GuildChangeEmblem (int fd, struct map_session_data *sd) +{ + guild_change_emblem (sd, RFIFOW (fd, 2) - 4, RFIFOP (fd, 4)); } /*========================================== * ソスMソスソスソスhソスソスソスmソスマ更 *------------------------------------------ */ -void clif_parse_GuildChangeNotice(int fd,struct map_session_data *sd) { - guild_change_notice(sd,RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,66)); +void clif_parse_GuildChangeNotice (int fd, struct map_session_data *sd) +{ + guild_change_notice (sd, RFIFOL (fd, 2), RFIFOP (fd, 6), RFIFOP (fd, 66)); } /*========================================== * ソスMソスソスソスhソスソスソスU *------------------------------------------ */ -void clif_parse_GuildInvite(int fd,struct map_session_data *sd) { - guild_invite(sd,RFIFOL(fd,2)); +void clif_parse_GuildInvite (int fd, struct map_session_data *sd) +{ + guild_invite (sd, RFIFOL (fd, 2)); } /*========================================== * ソスMソスソスソスhソスソスソスUソスヤ信 *------------------------------------------ */ -void clif_parse_GuildReplyInvite(int fd,struct map_session_data *sd) { - guild_reply_invite(sd,RFIFOL(fd,2),RFIFOB(fd,6)); +void clif_parse_GuildReplyInvite (int fd, struct map_session_data *sd) +{ + guild_reply_invite (sd, RFIFOL (fd, 2), RFIFOB (fd, 6)); } /*========================================== * ソスMソスソスソスhソスEソスソス *------------------------------------------ */ -void clif_parse_GuildLeave(int fd,struct map_session_data *sd) { - guild_leave(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOP(fd,14)); +void clif_parse_GuildLeave (int fd, struct map_session_data *sd) +{ + guild_leave (sd, RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10), + RFIFOP (fd, 14)); } /*========================================== * ソスMソスソスソスhソスヌ包ソス *------------------------------------------ */ -void clif_parse_GuildExplusion(int fd,struct map_session_data *sd) { - guild_explusion(sd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOP(fd,14)); +void clif_parse_GuildExplusion (int fd, struct map_session_data *sd) +{ + guild_explusion (sd, RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10), + RFIFOP (fd, 14)); } /*========================================== * ソスMソスソスソスhソスソスソスb *------------------------------------------ */ -void clif_parse_GuildMessage(int fd,struct map_session_data *sd) { - nullpo_retv(sd); +void clif_parse_GuildMessage (int fd, struct map_session_data *sd) +{ + nullpo_retv (sd); - if (is_atcommand(fd, sd, RFIFOP(fd, 4), 0) != AtCommand_None) - return; - if(sd->sc_data && - (sd->sc_data[SC_BERSERK].timer!=-1 || //ソスoソス[ソスTソス[ソスNソスソスソスヘ会ソスソスbソスソスソスsソスソス - sd->sc_data[SC_NOCHAT].timer!=-1)) //ソス`ソスソスソスbソスgソスヨ止 - return; + if (is_atcommand (fd, sd, RFIFOP (fd, 4), 0) != AtCommand_None) + return; + if (sd->sc_data && (sd->sc_data[SC_BERSERK].timer != -1 || //ソスoソス[ソスTソス[ソスNソスソスソスヘ会ソスソスbソスソスソスsソスソス + sd->sc_data[SC_NOCHAT].timer != -1)) //ソス`ソスソスソスbソスgソスヨ止 + return; - guild_send_message(sd, RFIFOP(fd,4), RFIFOW(fd,2)-4); + guild_send_message (sd, RFIFOP (fd, 4), RFIFOW (fd, 2) - 4); } /*========================================== * ソスMソスソスソスhソスソスソスソスソスvソスソス *------------------------------------------ */ -void clif_parse_GuildRequestAlliance(int fd, struct map_session_data *sd) { - guild_reqalliance(sd,RFIFOL(fd,2)); +void clif_parse_GuildRequestAlliance (int fd, struct map_session_data *sd) +{ + guild_reqalliance (sd, RFIFOL (fd, 2)); } /*========================================== * ソスMソスソスソスhソスソスソスソスソスvソスソスソスヤ信 *------------------------------------------ */ -void clif_parse_GuildReplyAlliance(int fd, struct map_session_data *sd) { - guild_reply_reqalliance(sd,RFIFOL(fd,2),RFIFOL(fd,6)); +void clif_parse_GuildReplyAlliance (int fd, struct map_session_data *sd) +{ + guild_reply_reqalliance (sd, RFIFOL (fd, 2), RFIFOL (fd, 6)); } /*========================================== * ソスMソスソスソスhソスヨ係ソスソスソスソス *------------------------------------------ */ -void clif_parse_GuildDelAlliance(int fd, struct map_session_data *sd) { - guild_delalliance(sd,RFIFOL(fd,2),RFIFOL(fd,6)); +void clif_parse_GuildDelAlliance (int fd, struct map_session_data *sd) +{ + guild_delalliance (sd, RFIFOL (fd, 2), RFIFOL (fd, 6)); } /*========================================== * ソスMソスソスソスhソスGソスソス *------------------------------------------ */ -void clif_parse_GuildOpposition(int fd, struct map_session_data *sd) { - guild_opposition(sd,RFIFOL(fd,2)); +void clif_parse_GuildOpposition (int fd, struct map_session_data *sd) +{ + guild_opposition (sd, RFIFOL (fd, 2)); } /*========================================== * ソスMソスソスソスhソスソスソスU *------------------------------------------ */ -void clif_parse_GuildBreak(int fd, struct map_session_data *sd) { - guild_break(sd,RFIFOP(fd,2)); +void clif_parse_GuildBreak (int fd, struct map_session_data *sd) +{ + guild_break (sd, RFIFOP (fd, 2)); } // Kick (right click menu for GM "(name) force to quit") -void clif_parse_GMKick(int fd, struct map_session_data *sd) { - struct block_list *target; - int tid = RFIFOL(fd,2); - - nullpo_retv(sd); - - if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && - (pc_isGM(sd) >= get_atcommand_level(AtCommand_Kick))) { - target = map_id2bl(tid); - if (target) { - if (target->type == BL_PC) { - struct map_session_data *tsd = (struct map_session_data *)target; - log_atcommand(sd, "@kick %s", tsd->status.name); - if (pc_isGM(sd) > pc_isGM(tsd)) - clif_GM_kick(sd, tsd, 1); - else - clif_GM_kickack(sd, 0); - } else if (target->type == BL_MOB) { - struct mob_data *md = (struct mob_data *)target; - sd->state.attack_type = 0; - mob_damage(&sd->bl, md, md->hp, 2); - } else - clif_GM_kickack(sd, 0); - } else - clif_GM_kickack(sd, 0); - } +void clif_parse_GMKick (int fd, struct map_session_data *sd) +{ + struct block_list *target; + int tid = RFIFOL (fd, 2); + + nullpo_retv (sd); + + if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) && + (pc_isGM (sd) >= get_atcommand_level (AtCommand_Kick))) + { + target = map_id2bl (tid); + if (target) + { + if (target->type == BL_PC) + { + struct map_session_data *tsd = + (struct map_session_data *) target; + log_atcommand (sd, "@kick %s", tsd->status.name); + if (pc_isGM (sd) > pc_isGM (tsd)) + clif_GM_kick (sd, tsd, 1); + else + clif_GM_kickack (sd, 0); + } + else if (target->type == BL_MOB) + { + struct mob_data *md = (struct mob_data *) target; + sd->state.attack_type = 0; + mob_damage (&sd->bl, md, md->hp, 2); + } + else + clif_GM_kickack (sd, 0); + } + else + clif_GM_kickack (sd, 0); + } } /*========================================== * /shift *------------------------------------------ */ -void clif_parse_Shift(int fd, struct map_session_data *sd) { // Rewriten by [Yor] - char player_name[25]; +void clif_parse_Shift (int fd, struct map_session_data *sd) +{ // Rewriten by [Yor] + char player_name[25]; - nullpo_retv(sd); + nullpo_retv (sd); - memset(player_name, '\0', sizeof(player_name)); + memset (player_name, '\0', sizeof (player_name)); - if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && - (pc_isGM(sd) >= get_atcommand_level(AtCommand_Goto))) { - memcpy(player_name, RFIFOP(fd,2), 24); - log_atcommand(sd, "@goto %s", player_name); - atcommand_goto(fd, sd, "@goto", player_name); // as @jumpto - } + if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) && + (pc_isGM (sd) >= get_atcommand_level (AtCommand_Goto))) + { + memcpy (player_name, RFIFOP (fd, 2), 24); + log_atcommand (sd, "@goto %s", player_name); + atcommand_goto (fd, sd, "@goto", player_name); // as @jumpto + } - return; + return; } /*========================================== * /recall *------------------------------------------ */ -void clif_parse_Recall(int fd, struct map_session_data *sd) { // Added by RoVeRT - char player_name[25]; +void clif_parse_Recall (int fd, struct map_session_data *sd) +{ // Added by RoVeRT + char player_name[25]; - nullpo_retv(sd); + nullpo_retv (sd); - memset(player_name, '\0', sizeof(player_name)); + memset (player_name, '\0', sizeof (player_name)); - if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && - (pc_isGM(sd) >= get_atcommand_level(AtCommand_Recall))) { - memcpy(player_name, RFIFOP(fd,2), 24); - log_atcommand(sd, "@recall %s", player_name); - atcommand_recall(fd, sd, "@recall", player_name); // as @recall - } + if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) && + (pc_isGM (sd) >= get_atcommand_level (AtCommand_Recall))) + { + memcpy (player_name, RFIFOP (fd, 2), 24); + log_atcommand (sd, "@recall %s", player_name); + atcommand_recall (fd, sd, "@recall", player_name); // as @recall + } - return; + return; } -void clif_parse_GMHide(int fd, struct map_session_data *sd) { // Modified by [Yor] - nullpo_retv(sd); +void clif_parse_GMHide (int fd, struct map_session_data *sd) +{ // Modified by [Yor] + nullpo_retv (sd); - //printf("%2x %2x %2x\n", RFIFOW(fd,0), RFIFOW(fd,2), RFIFOW(fd,4)); // R 019d <Option_value>.2B <flag>.2B - if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && - (pc_isGM(sd) >= get_atcommand_level(AtCommand_Hide))) { - log_atcommand(sd, "@hide"); - if (sd->status.option & OPTION_HIDE) { // OPTION_HIDE = 0x40 - sd->status.option &= ~OPTION_HIDE; // OPTION_HIDE = 0x40 - clif_displaymessage(fd, "Invisible: Off."); - } else { - sd->status.option |= OPTION_HIDE; // OPTION_HIDE = 0x40 - clif_displaymessage(fd, "Invisible: On."); - } - clif_changeoption(&sd->bl); - } + //printf("%2x %2x %2x\n", RFIFOW(fd,0), RFIFOW(fd,2), RFIFOW(fd,4)); // R 019d <Option_value>.2B <flag>.2B + if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) && + (pc_isGM (sd) >= get_atcommand_level (AtCommand_Hide))) + { + log_atcommand (sd, "@hide"); + if (sd->status.option & OPTION_HIDE) + { // OPTION_HIDE = 0x40 + sd->status.option &= ~OPTION_HIDE; // OPTION_HIDE = 0x40 + clif_displaymessage (fd, "Invisible: Off."); + } + else + { + sd->status.option |= OPTION_HIDE; // OPTION_HIDE = 0x40 + clif_displaymessage (fd, "Invisible: On."); + } + clif_changeoption (&sd->bl); + } } /*========================================== * GMソスノゑソスソスソスソス`ソスソスソスbソスgソスヨ止ソスソスソスヤ付ソス^ *------------------------------------------ */ -void clif_parse_GMReqNoChat(int fd,struct map_session_data *sd) -{ - int tid = RFIFOL(fd,2); - int type = RFIFOB(fd,6); - int limit = RFIFOW(fd,7); - struct block_list *bl = map_id2bl(tid); - struct map_session_data *dstsd; - int dstfd; - - nullpo_retv(sd); - - if(!battle_config.muting_players) { - clif_displaymessage(fd, "Muting is disabled."); - return; - } - - if(type == 0) - limit = 0 - limit; - if(bl->type == BL_PC && (dstsd =(struct map_session_data *)bl)){ - if((tid == bl->id && type == 2 && !pc_isGM(sd)) || (pc_isGM(sd) > pc_isGM(dstsd)) ){ - dstfd = dstsd->fd; - WFIFOW(dstfd,0)=0x14b; - WFIFOB(dstfd,2)=(type==2)?1:type; - memcpy(WFIFOP(dstfd,3),sd->status.name,24); - WFIFOSET(dstfd,packet_len_table[0x14b]); - dstsd->status.manner -= limit; - if(dstsd->status.manner < 0) - skill_status_change_start(bl,SC_NOCHAT,0,0,0,0,0,0); - else{ - dstsd->status.manner = 0; - skill_status_change_end(bl,SC_NOCHAT,-1); - } - printf("name:%s type:%d limit:%d manner:%d\n",dstsd->status.name,type,limit,dstsd->status.manner); - } - } +void clif_parse_GMReqNoChat (int fd, struct map_session_data *sd) +{ + int tid = RFIFOL (fd, 2); + int type = RFIFOB (fd, 6); + int limit = RFIFOW (fd, 7); + struct block_list *bl = map_id2bl (tid); + struct map_session_data *dstsd; + int dstfd; + + nullpo_retv (sd); + + if (!battle_config.muting_players) + { + clif_displaymessage (fd, "Muting is disabled."); + return; + } + + if (type == 0) + limit = 0 - limit; + if (bl->type == BL_PC && (dstsd = (struct map_session_data *) bl)) + { + if ((tid == bl->id && type == 2 && !pc_isGM (sd)) + || (pc_isGM (sd) > pc_isGM (dstsd))) + { + dstfd = dstsd->fd; + WFIFOW (dstfd, 0) = 0x14b; + WFIFOB (dstfd, 2) = (type == 2) ? 1 : type; + memcpy (WFIFOP (dstfd, 3), sd->status.name, 24); + WFIFOSET (dstfd, packet_len_table[0x14b]); + dstsd->status.manner -= limit; + if (dstsd->status.manner < 0) + skill_status_change_start (bl, SC_NOCHAT, 0, 0, 0, 0, 0, 0); + else + { + dstsd->status.manner = 0; + skill_status_change_end (bl, SC_NOCHAT, -1); + } + printf ("name:%s type:%d limit:%d manner:%d\n", + dstsd->status.name, type, limit, dstsd->status.manner); + } + } - return; + return; } + /*========================================== * GMソスノゑソスソスソスソス`ソスソスソスbソスgソスヨ止ソスソスソスヤ参ソスニ(ソスHソスj *------------------------------------------ */ -void clif_parse_GMReqNoChatCount(int fd,struct map_session_data *sd) +void clif_parse_GMReqNoChatCount (int fd, struct map_session_data *sd) { - int tid = RFIFOL(fd,2); + int tid = RFIFOL (fd, 2); - WFIFOW(fd,0)=0x1e0; - WFIFOL(fd,2)=tid; - sprintf(WFIFOP(fd,6),"%d",tid); -// memcpy(WFIFOP(fd,6),"TESTNAME",24); - WFIFOSET(fd,packet_len_table[0x1e0]); + WFIFOW (fd, 0) = 0x1e0; + WFIFOL (fd, 2) = tid; + sprintf (WFIFOP (fd, 6), "%d", tid); +// memcpy(WFIFOP(fd,6),"TESTNAME",24); + WFIFOSET (fd, packet_len_table[0x1e0]); - return; + return; } -void clif_parse_PMIgnore(int fd, struct map_session_data *sd) { // Rewritten by [Yor] - char output[1024]; - char *nick; // S 00cf <nick>.24B <type>.B: 00 (/ex nick) deny speech from nick, 01 (/in nick) allow speech from nick - int i; - int pos; - - memset(output, '\0', sizeof(output)); - - nick = RFIFOP(fd,2); // speed up - //printf("Ignore: char '%s' state: %d\n", nick, RFIFOB(fd,26)); - // we ask for deny (we add nick only if it's not already exist - if (RFIFOB(fd,26) == 0) { // type - if (strlen(nick) >= 4 && strlen(nick) < 24) { // do something only if nick can be exist - pos = -1; - for(i = 0; i < (sizeof(sd->ignore) / sizeof(sd->ignore[0])); i++) { - if (strcmp(sd->ignore[i].name, nick) == 0) - break; - else if (pos == -1 && sd->ignore[i].name[0] == '\0') - pos = i; - } - WFIFOW(fd,0) = 0x0d1; // R 00d1 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail - WFIFOB(fd,2) = 0; - // if a position is found and name not found, we add it in the list - if (pos != -1 && i == (sizeof(sd->ignore) / sizeof(sd->ignore[0]))) { - memcpy(sd->ignore[pos].name, nick, 24); - WFIFOB(fd,3) = 0; // success - WFIFOSET(fd, packet_len_table[0x0d1]); - if (strcmp(wisp_server_name, nick) == 0) { // to found possible bot users that automaticaly ignores people. - sprintf(output, "Character '%s' (account: %d) has tried to block wisps from '%s' (wisp name of the server). Bot user?", sd->status.name, sd->status.account_id, wisp_server_name); - intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, output, strlen(output) + 1); - // send something to be inform and force bot to ignore twice... If GM receiving block + block again, it's a bot :) - clif_wis_message(fd, wisp_server_name, "Add me in your ignore list, doesn't block my wisps.", strlen("Add me in your ignore list, doesn't block my wisps.") + 1); - } - } else { - WFIFOB(fd,3) = 1; // fail - if (i == (sizeof(sd->ignore) / sizeof(sd->ignore[0]))) { - clif_wis_message(fd, wisp_server_name, "You can not block more people.", strlen("You can not block more people.") + 1); - if (strcmp(wisp_server_name, nick) == 0) { // to found possible bot users that automaticaly ignores people. - sprintf(output, "Character '%s' (account: %d) has tried to block wisps from '%s' (wisp name of the server). Bot user?", sd->status.name, sd->status.account_id, wisp_server_name); - intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, output, strlen(output) + 1); - } - } else { - clif_wis_message(fd, wisp_server_name, "This player is already blocked.", strlen("This player is already blocked.") + 1); - if (strcmp(wisp_server_name, nick) == 0) { // to found possible bot users that automaticaly ignores people. - sprintf(output, "Character '%s' (account: %d) has tried AGAIN to block wisps from '%s' (wisp name of the server). Bot user?", sd->status.name, sd->status.account_id, wisp_server_name); - intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, output, strlen(output) + 1); - } - } - } - } else - clif_wis_message(fd, wisp_server_name, "It's impossible to block this player.", strlen("It's impossible to block this player.") + 1); - // we ask for allow (we remove all same nick if exist) - } else { - if (strlen(nick) >= 4 && strlen(nick) < 24) { // do something only if nick can be exist - WFIFOW(fd,0) = 0x0d1; // R 00d1 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail - WFIFOB(fd,2) = 1; - for(i = 0; i < (sizeof(sd->ignore) / sizeof(sd->ignore[0])); i++) - if (strcmp(sd->ignore[i].name, nick) == 0) { - memset(sd->ignore[i].name, 0, sizeof(sd->ignore[i].name)); - WFIFOB(fd,3) = 0; // success - WFIFOSET(fd, packet_len_table[0x0d1]); - break; - } - if (i == (sizeof(sd->ignore) / sizeof(sd->ignore[0]))) { - WFIFOB(fd,3) = 1; // fail - WFIFOSET(fd, packet_len_table[0x0d1]); - clif_wis_message(fd, wisp_server_name, "This player is not blocked by you.", strlen("This player is not blocked by you.") + 1); - } - } else - clif_wis_message(fd, wisp_server_name, "It's impossible to unblock this player.", strlen("It's impossible to unblock this player.") + 1); - } - -// for(i = 0; i < (sizeof(sd->ignore) / sizeof(sd->ignore[0])); i++) // for debug only -// if (sd->ignore[i].name[0] != '\0') -// printf("Ignored player: '%s'\n", sd->ignore[i].name); +void clif_parse_PMIgnore (int fd, struct map_session_data *sd) +{ // Rewritten by [Yor] + char output[1024]; + char *nick; // S 00cf <nick>.24B <type>.B: 00 (/ex nick) deny speech from nick, 01 (/in nick) allow speech from nick + int i; + int pos; - return; -} + memset (output, '\0', sizeof (output)); -void clif_parse_PMIgnoreAll(int fd, struct map_session_data *sd) { // Rewritten by [Yor] - //printf("Ignore all: state: %d\n", RFIFOB(fd,2)); - if (RFIFOB(fd,2) == 0) {// S 00d0 <type>len.B: 00 (/exall) deny all speech, 01 (/inall) allow all speech - WFIFOW(fd,0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail - WFIFOB(fd,2) = 0; - if (sd->ignoreAll == 0) { - sd->ignoreAll = 1; - WFIFOB(fd,3) = 0; // success - WFIFOSET(fd, packet_len_table[0x0d2]); - } else { - WFIFOB(fd,3) = 1; // fail - WFIFOSET(fd, packet_len_table[0x0d2]); - clif_wis_message(fd, wisp_server_name, "You already block everyone.", strlen("You already block everyone.") + 1); - } - } else { - WFIFOW(fd,0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail - WFIFOB(fd,2) = 1; - if (sd->ignoreAll == 1) { - sd->ignoreAll = 0; - WFIFOB(fd,3) = 0; // success - WFIFOSET(fd, packet_len_table[0x0d2]); - } else { - WFIFOB(fd,3) = 1; // fail - WFIFOSET(fd, packet_len_table[0x0d2]); - clif_wis_message(fd, wisp_server_name, "You already allow everyone.", strlen("You already allow everyone.") + 1); - } - } + nick = RFIFOP (fd, 2); // speed up + //printf("Ignore: char '%s' state: %d\n", nick, RFIFOB(fd,26)); + // we ask for deny (we add nick only if it's not already exist + if (RFIFOB (fd, 26) == 0) + { // type + if (strlen (nick) >= 4 && strlen (nick) < 24) + { // do something only if nick can be exist + pos = -1; + for (i = 0; i < (sizeof (sd->ignore) / sizeof (sd->ignore[0])); + i++) + { + if (strcmp (sd->ignore[i].name, nick) == 0) + break; + else if (pos == -1 && sd->ignore[i].name[0] == '\0') + pos = i; + } + WFIFOW (fd, 0) = 0x0d1; // R 00d1 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail + WFIFOB (fd, 2) = 0; + // if a position is found and name not found, we add it in the list + if (pos != -1 + && i == (sizeof (sd->ignore) / sizeof (sd->ignore[0]))) + { + memcpy (sd->ignore[pos].name, nick, 24); + WFIFOB (fd, 3) = 0; // success + WFIFOSET (fd, packet_len_table[0x0d1]); + if (strcmp (wisp_server_name, nick) == 0) + { // to found possible bot users that automaticaly ignores people. + sprintf (output, + "Character '%s' (account: %d) has tried to block wisps from '%s' (wisp name of the server). Bot user?", + sd->status.name, sd->status.account_id, + wisp_server_name); + intif_wis_message_to_gm (wisp_server_name, + battle_config.hack_info_GM_level, + output, strlen (output) + 1); + // send something to be inform and force bot to ignore twice... If GM receiving block + block again, it's a bot :) + clif_wis_message (fd, wisp_server_name, + "Add me in your ignore list, doesn't block my wisps.", + strlen + ("Add me in your ignore list, doesn't block my wisps.") + + 1); + } + } + else + { + WFIFOB (fd, 3) = 1; // fail + if (i == (sizeof (sd->ignore) / sizeof (sd->ignore[0]))) + { + clif_wis_message (fd, wisp_server_name, + "You can not block more people.", + strlen + ("You can not block more people.") + 1); + if (strcmp (wisp_server_name, nick) == 0) + { // to found possible bot users that automaticaly ignores people. + sprintf (output, + "Character '%s' (account: %d) has tried to block wisps from '%s' (wisp name of the server). Bot user?", + sd->status.name, sd->status.account_id, + wisp_server_name); + intif_wis_message_to_gm (wisp_server_name, + battle_config.hack_info_GM_level, + output, strlen (output) + 1); + } + } + else + { + clif_wis_message (fd, wisp_server_name, + "This player is already blocked.", + strlen + ("This player is already blocked.") + + 1); + if (strcmp (wisp_server_name, nick) == 0) + { // to found possible bot users that automaticaly ignores people. + sprintf (output, + "Character '%s' (account: %d) has tried AGAIN to block wisps from '%s' (wisp name of the server). Bot user?", + sd->status.name, sd->status.account_id, + wisp_server_name); + intif_wis_message_to_gm (wisp_server_name, + battle_config.hack_info_GM_level, + output, strlen (output) + 1); + } + } + } + } + else + clif_wis_message (fd, wisp_server_name, + "It's impossible to block this player.", + strlen ("It's impossible to block this player.") + + 1); + // we ask for allow (we remove all same nick if exist) + } + else + { + if (strlen (nick) >= 4 && strlen (nick) < 24) + { // do something only if nick can be exist + WFIFOW (fd, 0) = 0x0d1; // R 00d1 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail + WFIFOB (fd, 2) = 1; + for (i = 0; i < (sizeof (sd->ignore) / sizeof (sd->ignore[0])); + i++) + if (strcmp (sd->ignore[i].name, nick) == 0) + { + memset (sd->ignore[i].name, 0, + sizeof (sd->ignore[i].name)); + WFIFOB (fd, 3) = 0; // success + WFIFOSET (fd, packet_len_table[0x0d1]); + break; + } + if (i == (sizeof (sd->ignore) / sizeof (sd->ignore[0]))) + { + WFIFOB (fd, 3) = 1; // fail + WFIFOSET (fd, packet_len_table[0x0d1]); + clif_wis_message (fd, wisp_server_name, + "This player is not blocked by you.", + strlen + ("This player is not blocked by you.") + 1); + } + } + else + clif_wis_message (fd, wisp_server_name, + "It's impossible to unblock this player.", + strlen + ("It's impossible to unblock this player.") + + 1); + } + +// for(i = 0; i < (sizeof(sd->ignore) / sizeof(sd->ignore[0])); i++) // for debug only +// if (sd->ignore[i].name[0] != '\0') +// printf("Ignored player: '%s'\n", sd->ignore[i].name); + + return; +} + +void clif_parse_PMIgnoreAll (int fd, struct map_session_data *sd) +{ // Rewritten by [Yor] + //printf("Ignore all: state: %d\n", RFIFOB(fd,2)); + if (RFIFOB (fd, 2) == 0) + { // S 00d0 <type>len.B: 00 (/exall) deny all speech, 01 (/inall) allow all speech + WFIFOW (fd, 0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail + WFIFOB (fd, 2) = 0; + if (sd->ignoreAll == 0) + { + sd->ignoreAll = 1; + WFIFOB (fd, 3) = 0; // success + WFIFOSET (fd, packet_len_table[0x0d2]); + } + else + { + WFIFOB (fd, 3) = 1; // fail + WFIFOSET (fd, packet_len_table[0x0d2]); + clif_wis_message (fd, wisp_server_name, + "You already block everyone.", + strlen ("You already block everyone.") + 1); + } + } + else + { + WFIFOW (fd, 0) = 0x0d2; // R 00d2 <type>.B <fail>.B: type: 0: deny, 1: allow, fail: 0: success, 1: fail + WFIFOB (fd, 2) = 1; + if (sd->ignoreAll == 1) + { + sd->ignoreAll = 0; + WFIFOB (fd, 3) = 0; // success + WFIFOSET (fd, packet_len_table[0x0d2]); + } + else + { + WFIFOB (fd, 3) = 1; // fail + WFIFOSET (fd, packet_len_table[0x0d2]); + clif_wis_message (fd, wisp_server_name, + "You already allow everyone.", + strlen ("You already allow everyone.") + 1); + } + } - return; + return; } -void clif_parse_skillMessage(int fd, struct map_session_data *sd) { // Added by RoVeRT - int skillid,skilllv, x, y; - char *mes; +void clif_parse_skillMessage (int fd, struct map_session_data *sd) +{ // Added by RoVeRT + int skillid, skilllv, x, y; + char *mes; - skilllv = RFIFOW(fd,2); - skillid = RFIFOW(fd,4); + skilllv = RFIFOW (fd, 2); + skillid = RFIFOW (fd, 4); - y = RFIFOB(fd,6); - x = RFIFOB(fd,8); + y = RFIFOB (fd, 6); + x = RFIFOB (fd, 8); - mes = RFIFOP(fd,10); + mes = RFIFOP (fd, 10); - // skill 220 = graffiti -// printf("skill: %d %d location: %3d %3d message: %s\n", skillid, skilllv, x, y, (char*)mes); + // skill 220 = graffiti +// printf("skill: %d %d location: %3d %3d message: %s\n", skillid, skilllv, x, y, (char*)mes); } -int monk(struct map_session_data *sd, struct block_list *target, int type) { +int monk (struct map_session_data *sd, struct block_list *target, int type) +{ //R 01d1 <Monk id>L <Target monster id>L <Bool>L - int fd=sd->fd; - WFIFOW(fd,0)=0x1d1; - WFIFOL(fd,2)=sd->bl.id; - WFIFOL(fd,6)=target->id; - WFIFOL(fd,10)=type; - WFIFOSET(fd,packet_len_table[0x1d1]); + int fd = sd->fd; + WFIFOW (fd, 0) = 0x1d1; + WFIFOL (fd, 2) = sd->bl.id; + WFIFOL (fd, 6) = target->id; + WFIFOL (fd, 10) = type; + WFIFOSET (fd, packet_len_table[0x1d1]); - return 0; + return 0; } /*========================================== * ソスXソスpソスmソスrソスソス/doridoriソスノゑソスソスソスSPR2ソス{ *------------------------------------------ */ -void clif_parse_sn_doridori(int fd, struct map_session_data *sd) { - if (sd) - sd->doridori_counter = 1; +void clif_parse_sn_doridori (int fd, struct map_session_data *sd) +{ + if (sd) + sd->doridori_counter = 1; - return; + return; } + /*========================================== * ソスXソスpソスmソスrソスフ費ソスソスソスソスgソスソス *------------------------------------------ */ -void clif_parse_sn_explosionspirits(int fd, struct map_session_data *sd) -{ - if(sd){ - int nextbaseexp=pc_nextbaseexp(sd); - struct pc_base_job s_class = pc_calc_base_job(sd->status.class); - if (battle_config.etc_log){ - if(nextbaseexp != 0) - printf("SuperNovice explosionspirits!! %d %d %d %d\n",sd->bl.id,s_class.job,sd->status.base_exp,(int)((double)1000*sd->status.base_exp/nextbaseexp)); - else - printf("SuperNovice explosionspirits!! %d %d %d 000\n",sd->bl.id,s_class.job,sd->status.base_exp); - } - if(s_class.job == 23 && sd->status.base_exp > 0 && nextbaseexp > 0 && (int)((double)1000*sd->status.base_exp/nextbaseexp)%100==0){ - clif_skill_nodamage(&sd->bl,&sd->bl,MO_EXPLOSIONSPIRITS,5,1); - skill_status_change_start(&sd->bl,SkillStatusChangeTable[MO_EXPLOSIONSPIRITS],5,0,0,0,skill_get_time(MO_EXPLOSIONSPIRITS,5),0 ); - } - } - return; +void clif_parse_sn_explosionspirits (int fd, struct map_session_data *sd) +{ + if (sd) + { + int nextbaseexp = pc_nextbaseexp (sd); + struct pc_base_job s_class = pc_calc_base_job (sd->status.class); + if (battle_config.etc_log) + { + if (nextbaseexp != 0) + printf ("SuperNovice explosionspirits!! %d %d %d %d\n", + sd->bl.id, s_class.job, sd->status.base_exp, + (int) ((double) 1000 * sd->status.base_exp / + nextbaseexp)); + else + printf ("SuperNovice explosionspirits!! %d %d %d 000\n", + sd->bl.id, s_class.job, sd->status.base_exp); + } + if (s_class.job == 23 && sd->status.base_exp > 0 && nextbaseexp > 0 + && (int) ((double) 1000 * sd->status.base_exp / nextbaseexp) % + 100 == 0) + { + clif_skill_nodamage (&sd->bl, &sd->bl, MO_EXPLOSIONSPIRITS, 5, 1); + skill_status_change_start (&sd->bl, + SkillStatusChangeTable + [MO_EXPLOSIONSPIRITS], 5, 0, 0, 0, + skill_get_time (MO_EXPLOSIONSPIRITS, + 5), 0); + } + } + return; } // functions list -static void (*clif_parse_func_table[0x220])() = { - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - - // 40 - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - - // 70 - NULL, NULL, clif_parse_WantToConnection, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, clif_parse_LoadEndAck, clif_parse_TickSend, NULL, - - // 80 - NULL, NULL, NULL, NULL, NULL, clif_parse_WalkToXY, NULL, NULL, - NULL, clif_parse_ActionRequest, NULL, NULL, clif_parse_GlobalMessage, NULL, NULL, NULL, - // 90 - clif_parse_NpcClicked, NULL, NULL, NULL, clif_parse_GetCharNameRequest, NULL, clif_parse_Wis, NULL, - NULL, clif_parse_GMmessage, NULL, clif_parse_ChangeDir, NULL, NULL, NULL, clif_parse_TakeItem, - // a0 - NULL, NULL, clif_parse_DropItem, NULL, NULL, NULL, NULL, clif_parse_UseItem, - NULL, clif_parse_EquipItem, NULL, clif_parse_UnequipItem, NULL, NULL, NULL, NULL, - // b0 - NULL, NULL, clif_parse_Restart, NULL, NULL, NULL, NULL, NULL, - clif_parse_NpcSelectMenu, clif_parse_NpcNextClicked, NULL, clif_parse_StatusUp, NULL, NULL, NULL, clif_parse_Emotion, - - // c0 - NULL, clif_parse_HowManyConnections, NULL, NULL, NULL, clif_parse_NpcBuySellSelected, NULL, NULL, - clif_parse_NpcBuyListSend, clif_parse_NpcSellListSend, NULL, NULL, clif_parse_GMKick, NULL, NULL, clif_parse_PMIgnore, - // d0 - clif_parse_PMIgnoreAll, NULL, NULL, NULL, NULL, clif_parse_CreateChatRoom, NULL, NULL, - NULL, clif_parse_ChatAddMember, NULL, NULL, NULL, NULL, clif_parse_ChatRoomStatusChange, NULL, - // e0 - clif_parse_ChangeChatOwner, NULL, clif_parse_KickFromChat, clif_parse_ChatLeave, clif_parse_TradeRequest, NULL, clif_parse_TradeAck, NULL, - clif_parse_TradeAddItem, NULL, NULL, clif_parse_TradeOk, NULL, clif_parse_TradeCansel, NULL, clif_parse_TradeCommit, - // f0 - NULL, NULL, NULL, clif_parse_MoveToKafra, NULL, clif_parse_MoveFromKafra, NULL, clif_parse_CloseKafra, - NULL, clif_parse_CreateParty, NULL, NULL, clif_parse_PartyInvite, NULL, NULL, clif_parse_ReplyPartyInvite, - - // 100 - clif_parse_LeaveParty, NULL, clif_parse_PartyChangeOption, clif_parse_RemovePartyMember, NULL, NULL, NULL, NULL, - clif_parse_PartyMessage, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - // 110 - NULL, NULL, clif_parse_SkillUp, clif_parse_UseSkillToId, NULL, NULL, clif_parse_UseSkillToPos, NULL, - clif_parse_StopAttack, NULL, NULL, clif_parse_UseSkillMap, NULL, clif_parse_RequestMemo, NULL, NULL, - // 120 - NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_PutItemToCart, clif_parse_GetItemFromCart, - clif_parse_MoveFromKafraToCart, clif_parse_MoveToKafraFromCart, clif_parse_RemoveOption, NULL, NULL, NULL, NULL, NULL, - // 130 - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_GM_Monster_Item, - - // 140 - clif_parse_MapMove, NULL, NULL, clif_parse_NpcAmountInput, NULL, NULL, clif_parse_NpcCloseClicked, NULL, - NULL, clif_parse_GMReqNoChat, NULL, NULL, NULL, clif_parse_GuildCheckMaster, NULL, clif_parse_GuildReqeustInfo, - // 150 - NULL, clif_parse_GuildRequestEmblem, NULL, clif_parse_GuildChangeEmblem, NULL, clif_parse_GuildChangeMemberPosition, NULL, NULL, - NULL, clif_parse_GuildLeave, NULL, clif_parse_GuildExplusion, NULL, clif_parse_GuildBreak, NULL, NULL, - // 160 - NULL, clif_parse_GuildChangePositionInfo, NULL, NULL, NULL, clif_parse_CreateGuild, NULL, NULL, - clif_parse_GuildInvite, NULL, NULL, clif_parse_GuildReplyInvite, NULL, NULL, clif_parse_GuildChangeNotice, NULL, - // 170 - clif_parse_GuildRequestAlliance, NULL, clif_parse_GuildReplyAlliance, NULL, NULL, NULL, NULL, NULL, - clif_parse_ItemIdentify, NULL, clif_parse_UseCard, NULL, clif_parse_InsertCard, NULL, clif_parse_GuildMessage, NULL, - - // 180 - clif_parse_GuildOpposition, NULL, NULL, clif_parse_GuildDelAlliance, NULL, NULL, NULL, NULL, - NULL, NULL, clif_parse_QuitGame, NULL, NULL, NULL, NULL, NULL, - // 190 - clif_parse_UseSkillToPos, NULL, NULL, clif_parse_SolveCharName, NULL, NULL, NULL, clif_parse_ResetChar, - NULL, NULL, NULL, NULL, clif_parse_LGMmessage, clif_parse_GMHide, NULL, NULL, - // 1a0 - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_ChangeCart, - // 1b0 - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, clif_parse_Shift, clif_parse_Shift, clif_parse_Recall, clif_parse_Recall, NULL, NULL, - - // 1c0 - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_AutoSpell, - NULL, - // 1d0 - NULL, NULL, NULL, NULL, NULL, clif_parse_NpcStringInput, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_GMReqNoChatCount, - // 1e0 - NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_sn_doridori, - clif_parse_CreateParty2, NULL, NULL, NULL, NULL, clif_parse_sn_explosionspirits, NULL, NULL, - // 1f0 - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - - // 200 - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - // 210 - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL -}; +static void (*clif_parse_func_table[0x220]) () = +{ + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + // 40 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, + // 70 + NULL, NULL, clif_parse_WantToConnection, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, clif_parse_LoadEndAck, + clif_parse_TickSend, NULL, + // 80 + NULL, NULL, NULL, NULL, NULL, clif_parse_WalkToXY, NULL, NULL, + NULL, clif_parse_ActionRequest, NULL, NULL, clif_parse_GlobalMessage, + NULL, NULL, NULL, + // 90 + clif_parse_NpcClicked, NULL, NULL, NULL, + clif_parse_GetCharNameRequest, NULL, clif_parse_Wis, NULL, NULL, + clif_parse_GMmessage, NULL, clif_parse_ChangeDir, NULL, NULL, NULL, + clif_parse_TakeItem, + // a0 + NULL, NULL, clif_parse_DropItem, NULL, NULL, NULL, NULL, + clif_parse_UseItem, NULL, clif_parse_EquipItem, NULL, + clif_parse_UnequipItem, NULL, NULL, NULL, NULL, + // b0 + NULL, NULL, clif_parse_Restart, NULL, NULL, NULL, NULL, NULL, + clif_parse_NpcSelectMenu, clif_parse_NpcNextClicked, NULL, + clif_parse_StatusUp, NULL, NULL, NULL, clif_parse_Emotion, + // c0 + NULL, clif_parse_HowManyConnections, NULL, NULL, NULL, + clif_parse_NpcBuySellSelected, NULL, NULL, clif_parse_NpcBuyListSend, + clif_parse_NpcSellListSend, NULL, NULL, clif_parse_GMKick, NULL, NULL, + clif_parse_PMIgnore, + // d0 + clif_parse_PMIgnoreAll, NULL, NULL, NULL, NULL, + clif_parse_CreateChatRoom, NULL, NULL, NULL, clif_parse_ChatAddMember, + NULL, NULL, NULL, NULL, clif_parse_ChatRoomStatusChange, NULL, + // e0 + clif_parse_ChangeChatOwner, NULL, clif_parse_KickFromChat, + clif_parse_ChatLeave, clif_parse_TradeRequest, NULL, + clif_parse_TradeAck, NULL, clif_parse_TradeAddItem, NULL, NULL, + clif_parse_TradeOk, NULL, clif_parse_TradeCansel, NULL, + clif_parse_TradeCommit, + // f0 + NULL, NULL, NULL, clif_parse_MoveToKafra, NULL, + clif_parse_MoveFromKafra, NULL, clif_parse_CloseKafra, NULL, + clif_parse_CreateParty, NULL, NULL, clif_parse_PartyInvite, NULL, + NULL, clif_parse_ReplyPartyInvite, + // 100 + clif_parse_LeaveParty, NULL, clif_parse_PartyChangeOption, + clif_parse_RemovePartyMember, NULL, NULL, NULL, NULL, + clif_parse_PartyMessage, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + // 110 + NULL, NULL, clif_parse_SkillUp, clif_parse_UseSkillToId, NULL, NULL, + clif_parse_UseSkillToPos, NULL, clif_parse_StopAttack, NULL, NULL, + clif_parse_UseSkillMap, NULL, clif_parse_RequestMemo, NULL, NULL, + // 120 + NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_PutItemToCart, + clif_parse_GetItemFromCart, clif_parse_MoveFromKafraToCart, + clif_parse_MoveToKafraFromCart, clif_parse_RemoveOption, NULL, NULL, + NULL, NULL, NULL, + // 130 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_GM_Monster_Item, + // 140 + clif_parse_MapMove, NULL, NULL, clif_parse_NpcAmountInput, NULL, NULL, + clif_parse_NpcCloseClicked, NULL, NULL, clif_parse_GMReqNoChat, NULL, + NULL, NULL, clif_parse_GuildCheckMaster, NULL, + clif_parse_GuildReqeustInfo, + // 150 + NULL, clif_parse_GuildRequestEmblem, NULL, + clif_parse_GuildChangeEmblem, NULL, + clif_parse_GuildChangeMemberPosition, NULL, NULL, NULL, + clif_parse_GuildLeave, NULL, clif_parse_GuildExplusion, NULL, + clif_parse_GuildBreak, NULL, NULL, + // 160 + NULL, clif_parse_GuildChangePositionInfo, NULL, NULL, NULL, + clif_parse_CreateGuild, NULL, NULL, clif_parse_GuildInvite, NULL, + NULL, clif_parse_GuildReplyInvite, NULL, NULL, + clif_parse_GuildChangeNotice, NULL, + // 170 + clif_parse_GuildRequestAlliance, NULL, clif_parse_GuildReplyAlliance, + NULL, NULL, NULL, NULL, NULL, clif_parse_ItemIdentify, NULL, + clif_parse_UseCard, NULL, clif_parse_InsertCard, NULL, + clif_parse_GuildMessage, NULL, + // 180 + clif_parse_GuildOpposition, NULL, NULL, clif_parse_GuildDelAlliance, + NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_QuitGame, NULL, NULL, + NULL, NULL, NULL, + // 190 + clif_parse_UseSkillToPos, NULL, NULL, clif_parse_SolveCharName, NULL, + NULL, NULL, clif_parse_ResetChar, NULL, NULL, NULL, NULL, + clif_parse_LGMmessage, clif_parse_GMHide, NULL, NULL, + // 1a0 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_ChangeCart, + // 1b0 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, clif_parse_Shift, clif_parse_Shift, clif_parse_Recall, + clif_parse_Recall, NULL, NULL, + // 1c0 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_AutoSpell, NULL, + // 1d0 + NULL, NULL, NULL, NULL, NULL, clif_parse_NpcStringInput, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_GMReqNoChatCount, + // 1e0 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, clif_parse_sn_doridori, + clif_parse_CreateParty2, NULL, NULL, NULL, NULL, + clif_parse_sn_explosionspirits, NULL, NULL, + // 1f0 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + // 200 + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + // 210 +NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL}; /*========================================== * ソスNソスソスソスCソスAソスソスソスgソスソスソスソスソスフパソスPソスbソスgソスソスソスソス * socket.cソスソスdo_parsepacketソスソスソスソスソストび出ソスソスソスソスソスソス *------------------------------------------ */ -static int clif_parse(int fd) { - int packet_len = 0, cmd=0; - struct map_session_data *sd=NULL; - - sd = session[fd]->session_data; - - if (!sd || (sd && !sd->state.auth)) { - if (RFIFOREST(fd) < 2) { // too small a packet disconnect - session[fd]->eof = 1; - } - if (RFIFOW(fd,0) != 0x72) { // first packet not auth, disconnect - session[fd]->eof = 1; - } - } - - // ソスレ托ソスソスソスソスリゑソスソストゑソスソスフで鯉ソスソスnソスソス - if (!chrif_isconnect() || session[fd]->eof) { // charソスIソスノ繋ソスソスソスソストなゑソスソスヤは接托ソスソスヨ止 (!chrif_isconnect()) - if (sd && sd->state.auth) { - pc_logout(sd); - clif_quitsave(fd, sd); - if (sd->status.name != NULL) - printf("Player [%s] has logged off your server.\n", sd->status.name); // Player logout display [Valaris] - else - printf("Player with account [%d] has logged off your server.\n", sd->bl.id); // Player logout display [Yor] - } else if (sd) { // not authentified! (refused by char-server or disconnect before to be authentified) - printf("Player with account [%d] has logged off your server (not auth account).\n", sd->bl.id); // Player logout display [Yor] - map_deliddb(&sd->bl); // account_id has been included in the DB before auth answer - } - if(fd) close(fd); - if(fd) delete_session(fd); - return 0; - } - - if (RFIFOREST(fd) < 2) return 0; // Too small (no packet number) - - cmd = RFIFOW(fd,0); - - // ソスヌ暦ソスソスpソスpソスPソスbソスgソスソスソスソス - if (cmd >= 30000) { - switch(cmd) { - case 0x7530: // Athenaソスソスソス所難ソス - WFIFOW(fd,0) = 0x7531; - WFIFOB(fd,2) = ATHENA_MAJOR_VERSION; - WFIFOB(fd,3) = ATHENA_MINOR_VERSION; - WFIFOB(fd,4) = ATHENA_REVISION; - WFIFOB(fd,5) = ATHENA_RELEASE_FLAG; - WFIFOB(fd,6) = ATHENA_OFFICIAL_FLAG; - WFIFOB(fd,7) = ATHENA_SERVER_MAP; - WFIFOW(fd,8) = ATHENA_MOD_VERSION; - WFIFOSET(fd,10); - RFIFOSKIP(fd,2); - break; - case 0x7532: // ソスレ托ソスソスフ切断 - session[fd]->eof = 1; - break; - } - return 0; - } else if (cmd >= 0x200) return 0; - - // ソスpソスPソスbソスgソスソスソスソスソスvソスZ - packet_len = packet_len_table[cmd]; - if (packet_len == -1) { - if (RFIFOREST(fd) < 4) { - return 0; // Runt packet (variable length without a length sent) - } - packet_len = RFIFOW(fd,2); - if (packet_len < 4 || packet_len > 32768) { - session[fd]->eof = 1; - return 0; // Runt packet (variable out of bounds) - } - } +static int clif_parse (int fd) +{ + int packet_len = 0, cmd = 0; + struct map_session_data *sd = NULL; - if (RFIFOREST(fd) < packet_len) { - return 0; // Runt packet (sent legnth is too small) - } + sd = session[fd]->session_data; - if (sd && sd->state.auth == 1 && sd->state.waitingdisconnect == 1) { // ソスリ断ソスメゑソスソスフ場合ソスpソスPソスbソスgソスソスソスソスソスソスネゑソス + if (!sd || (sd && !sd->state.auth)) + { + if (RFIFOREST (fd) < 2) + { // too small a packet disconnect + session[fd]->eof = 1; + } + if (RFIFOW (fd, 0) != 0x72) + { // first packet not auth, disconnect + session[fd]->eof = 1; + } + } + + // ソスレ托ソスソスソスソスリゑソスソストゑソスソスフで鯉ソスソスnソスソス + if (!chrif_isconnect () || session[fd]->eof) + { // charソスIソスノ繋ソスソスソスソストなゑソスソスヤは接托ソスソスヨ止 (!chrif_isconnect()) + if (sd && sd->state.auth) + { + pc_logout (sd); + clif_quitsave (fd, sd); + if (sd->status.name != NULL) + printf ("Player [%s] has logged off your server.\n", sd->status.name); // Player logout display [Valaris] + else + printf ("Player with account [%d] has logged off your server.\n", sd->bl.id); // Player logout display [Yor] + } + else if (sd) + { // not authentified! (refused by char-server or disconnect before to be authentified) + printf ("Player with account [%d] has logged off your server (not auth account).\n", sd->bl.id); // Player logout display [Yor] + map_deliddb (&sd->bl); // account_id has been included in the DB before auth answer + } + if (fd) + close (fd); + if (fd) + delete_session (fd); + return 0; + } + + if (RFIFOREST (fd) < 2) + return 0; // Too small (no packet number) + + cmd = RFIFOW (fd, 0); + + // ソスヌ暦ソスソスpソスpソスPソスbソスgソスソスソスソス + if (cmd >= 30000) + { + switch (cmd) + { + case 0x7530: // Athenaソスソスソス所難ソス + WFIFOW (fd, 0) = 0x7531; + WFIFOB (fd, 2) = ATHENA_MAJOR_VERSION; + WFIFOB (fd, 3) = ATHENA_MINOR_VERSION; + WFIFOB (fd, 4) = ATHENA_REVISION; + WFIFOB (fd, 5) = ATHENA_RELEASE_FLAG; + WFIFOB (fd, 6) = ATHENA_OFFICIAL_FLAG; + WFIFOB (fd, 7) = ATHENA_SERVER_MAP; + WFIFOW (fd, 8) = ATHENA_MOD_VERSION; + WFIFOSET (fd, 10); + RFIFOSKIP (fd, 2); + break; + case 0x7532: // ソスレ托ソスソスフ切断 + session[fd]->eof = 1; + break; + } + return 0; + } + else if (cmd >= 0x200) + return 0; - } else if (clif_parse_func_table[cmd]) { - clif_parse_func_table[cmd](fd, sd); - } else { - // ソスsソスソスソスネパソスPソスbソスg - if (battle_config.error_log) { - if (fd) - printf("\nclif_parse: session #%d, packet 0x%x, lenght %d\n", fd, cmd, packet_len); + // ソスpソスPソスbソスgソスソスソスソスソスvソスZ + packet_len = packet_len_table[cmd]; + if (packet_len == -1) + { + if (RFIFOREST (fd) < 4) + { + return 0; // Runt packet (variable length without a length sent) + } + packet_len = RFIFOW (fd, 2); + if (packet_len < 4 || packet_len > 32768) + { + session[fd]->eof = 1; + return 0; // Runt packet (variable out of bounds) + } + } + + if (RFIFOREST (fd) < packet_len) + { + return 0; // Runt packet (sent legnth is too small) + } + + if (sd && sd->state.auth == 1 && sd->state.waitingdisconnect == 1) + { // ソスリ断ソスメゑソスソスフ場合ソスpソスPソスbソスgソスソスソスソスソスソスネゑソス + + } + else if (clif_parse_func_table[cmd]) + { + clif_parse_func_table[cmd] (fd, sd); + } + else + { + // ソスsソスソスソスネパソスPソスbソスg + if (battle_config.error_log) + { + if (fd) + printf ("\nclif_parse: session #%d, packet 0x%x, lenght %d\n", + fd, cmd, packet_len); #ifdef DUMP_UNKNOWN_PACKET - { - int i; - FILE *fp; - char packet_txt[256] = "save/packet.txt"; - time_t now; - printf("---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F"); - for(i = 0; i < packet_len; i++) { - if ((i & 15) == 0) - printf("\n%04X ",i); - printf("%02X ", RFIFOB(fd,i)); - } - if (sd && sd->state.auth) { - if (sd->status.name != NULL) - printf("\nAccount ID %d, character ID %d, player name %s.\n", - sd->status.account_id, sd->status.char_id, sd->status.name); - else - printf("\nAccount ID %d.\n", sd->bl.id); - } else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified) - printf("\nAccount ID %d.\n", sd->bl.id); - - if ((fp = fopen_(packet_txt, "a")) == NULL) { - printf("clif.c: cant write [%s] !!! data is lost !!!\n", packet_txt); - return 1; - } else { - time(&now); - if (sd && sd->state.auth) { - if (sd->status.name != NULL) - fprintf(fp, "%sPlayer with account ID %d (character ID %d, player name %s) sent wrong packet:\n", - asctime(gmtime(&now)), sd->status.account_id, sd->status.char_id, sd->status.name); - else - fprintf(fp, "%sPlayer with account ID %d sent wrong packet:\n", asctime(gmtime(&now)), sd->bl.id); - } else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified) - fprintf(fp, "%sPlayer with account ID %d sent wrong packet:\n", asctime(gmtime(&now)), sd->bl.id); - - fprintf(fp, "\t---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F"); - for(i = 0; i < packet_len; i++) { - if ((i & 15) == 0) - fprintf(fp, "\n\t%04X ", i); - fprintf(fp, "%02X ", RFIFOB(fd,i)); - } - fprintf(fp, "\n\n"); - fclose_(fp); - } - } + { + int i; + FILE *fp; + char packet_txt[256] = "save/packet.txt"; + time_t now; + printf + ("---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F"); + for (i = 0; i < packet_len; i++) + { + if ((i & 15) == 0) + printf ("\n%04X ", i); + printf ("%02X ", RFIFOB (fd, i)); + } + if (sd && sd->state.auth) + { + if (sd->status.name != NULL) + printf + ("\nAccount ID %d, character ID %d, player name %s.\n", + sd->status.account_id, sd->status.char_id, + sd->status.name); + else + printf ("\nAccount ID %d.\n", sd->bl.id); + } + else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified) + printf ("\nAccount ID %d.\n", sd->bl.id); + + if ((fp = fopen_ (packet_txt, "a")) == NULL) + { + printf ("clif.c: cant write [%s] !!! data is lost !!!\n", + packet_txt); + return 1; + } + else + { + time (&now); + if (sd && sd->state.auth) + { + if (sd->status.name != NULL) + fprintf (fp, + "%sPlayer with account ID %d (character ID %d, player name %s) sent wrong packet:\n", + asctime (gmtime (&now)), + sd->status.account_id, + sd->status.char_id, sd->status.name); + else + fprintf (fp, + "%sPlayer with account ID %d sent wrong packet:\n", + asctime (gmtime (&now)), sd->bl.id); + } + else if (sd) // not authentified! (refused by char-server or disconnect before to be authentified) + fprintf (fp, + "%sPlayer with account ID %d sent wrong packet:\n", + asctime (gmtime (&now)), sd->bl.id); + + fprintf (fp, + "\t---- 00-01-02-03-04-05-06-07-08-09-0A-0B-0C-0D-0E-0F"); + for (i = 0; i < packet_len; i++) + { + if ((i & 15) == 0) + fprintf (fp, "\n\t%04X ", i); + fprintf (fp, "%02X ", RFIFOB (fd, i)); + } + fprintf (fp, "\n\n"); + fclose_ (fp); + } + } #endif - } - } - RFIFOSKIP(fd, packet_len); + } + } + RFIFOSKIP (fd, packet_len); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int do_init_clif(void) { - int i; +int do_init_clif (void) +{ + int i; - set_defaultparse(clif_parse); - for(i = 0; i < 10; i++) { - if (make_listen_port(map_port)) - break; + set_defaultparse (clif_parse); + for (i = 0; i < 10; i++) + { + if (make_listen_port (map_port)) + break; #ifdef LCCWIN32 - Sleep(20000); + Sleep (20000); #else - sleep(20); + sleep (20); #endif - } - if (i == 10) { - printf("cant bind game port\n"); - exit(1); - } - - add_timer_func_list(clif_waitclose, "clif_waitclose"); - add_timer_func_list(clif_clearchar_delay_sub, "clif_clearchar_delay_sub"); - - return 0; + } + if (i == 10) + { + printf ("cant bind game port\n"); + exit (1); + } + + add_timer_func_list (clif_waitclose, "clif_waitclose"); + add_timer_func_list (clif_clearchar_delay_sub, + "clif_clearchar_delay_sub"); + + return 0; } diff --git a/src/map/clif.h b/src/map/clif.h index 198bbff..a7da92d 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -15,241 +15,271 @@ typedef unsigned int in_addr_t; #include "map.h" -void clif_setip(char*); -void clif_setport(int); - -in_addr_t clif_getip(void); -int clif_getport(void); -int clif_countusers(void); -void clif_setwaitclose(int); - -int clif_authok(struct map_session_data *); -int clif_authfail_fd(int,int); -int clif_charselectok(int); -int clif_dropflooritem(struct flooritem_data *); -int clif_clearflooritem(struct flooritem_data *,int); -int clif_clearchar(struct block_list*,int); // area or fd -int clif_clearchar_delay(unsigned int,struct block_list *,int); +void clif_setip (char *); +void clif_setport (int); + +in_addr_t clif_getip (void); +int clif_getport (void); +int clif_countusers (void); +void clif_setwaitclose (int); + +int clif_authok (struct map_session_data *); +int clif_authfail_fd (int, int); +int clif_charselectok (int); +int clif_dropflooritem (struct flooritem_data *); +int clif_clearflooritem (struct flooritem_data *, int); +int clif_clearchar (struct block_list *, int); // area or fd +int clif_clearchar_delay (unsigned int, struct block_list *, int); #define clif_clearchar_area(bl,type) clif_clearchar(bl,type) -int clif_clearchar_id(int,int,int); -int clif_spawnpc(struct map_session_data*); //area -int clif_spawnnpc(struct npc_data*); // area -int clif_spawn_fake_npc_for_player(struct map_session_data *sd, int fake_npc_id); -int clif_spawnmob(struct mob_data*); // area -int clif_walkok(struct map_session_data*); // self -int clif_movechar(struct map_session_data*); // area -int clif_movemob(struct mob_data*); //area -int clif_changemap(struct map_session_data*,char*,int,int); //self -int clif_changemapserver(struct map_session_data*,char*,int,int,int,int); //self -int clif_fixpos(struct block_list *); // area -int clif_fixmobpos(struct mob_data *md); -int clif_fixpcpos(struct map_session_data *sd); -int clif_npcbuysell(struct map_session_data*,int); //self -int clif_buylist(struct map_session_data*,struct npc_data*); //self -int clif_selllist(struct map_session_data*); //self -int clif_scriptmes(struct map_session_data*,int,char*); //self -int clif_scriptnext(struct map_session_data*,int); //self -int clif_scriptclose(struct map_session_data*,int); //self -int clif_scriptmenu(struct map_session_data*,int,char*); //self -int clif_scriptinput(struct map_session_data*,int); //self -int clif_scriptinputstr(struct map_session_data *sd,int npcid); // self -int clif_cutin(struct map_session_data*,char*,int); //self -int clif_viewpoint(struct map_session_data*,int,int,int,int,int,int); //self -int clif_additem(struct map_session_data*,int,int,int); //self -int clif_delitem(struct map_session_data*,int,int); //self -int clif_updatestatus(struct map_session_data*,int); //self -int clif_changestatus(struct block_list*,int,int); //area -int clif_damage(struct block_list *,struct block_list *,unsigned int,int,int,int,int,int,int); // area +int clif_clearchar_id (int, int, int); +int clif_spawnpc (struct map_session_data *); //area +int clif_spawnnpc (struct npc_data *); // area +int clif_spawn_fake_npc_for_player (struct map_session_data *sd, + int fake_npc_id); +int clif_spawnmob (struct mob_data *); // area +int clif_walkok (struct map_session_data *); // self +int clif_movechar (struct map_session_data *); // area +int clif_movemob (struct mob_data *); //area +int clif_changemap (struct map_session_data *, char *, int, int); //self +int clif_changemapserver (struct map_session_data *, char *, int, int, int, int); //self +int clif_fixpos (struct block_list *); // area +int clif_fixmobpos (struct mob_data *md); +int clif_fixpcpos (struct map_session_data *sd); +int clif_npcbuysell (struct map_session_data *, int); //self +int clif_buylist (struct map_session_data *, struct npc_data *); //self +int clif_selllist (struct map_session_data *); //self +int clif_scriptmes (struct map_session_data *, int, char *); //self +int clif_scriptnext (struct map_session_data *, int); //self +int clif_scriptclose (struct map_session_data *, int); //self +int clif_scriptmenu (struct map_session_data *, int, char *); //self +int clif_scriptinput (struct map_session_data *, int); //self +int clif_scriptinputstr (struct map_session_data *sd, int npcid); // self +int clif_cutin (struct map_session_data *, char *, int); //self +int clif_viewpoint (struct map_session_data *, int, int, int, int, int, int); //self +int clif_additem (struct map_session_data *, int, int, int); //self +int clif_delitem (struct map_session_data *, int, int); //self +int clif_updatestatus (struct map_session_data *, int); //self +int clif_changestatus (struct block_list *, int, int); //area +int clif_damage (struct block_list *, struct block_list *, unsigned int, int, int, int, int, int, int); // area #define clif_takeitem(src,dst) clif_damage(src,dst,0,0,0,0,0,1,0) -int clif_changelook(struct block_list *,int,int); // area -int clif_changelook_towards(struct block_list *,int,int, struct map_session_data *dst); // area or target -void clif_changelook_accessories(struct block_list *bl, struct map_session_data *dst); // area or target; list gloves, boots etc. -int clif_arrowequip(struct map_session_data *sd,int val); //self -int clif_arrow_fail(struct map_session_data *sd,int type); //self -int clif_statusupack(struct map_session_data *,int,int,int); // self -int clif_equipitemack(struct map_session_data *,int,int,int); // self -int clif_unequipitemack(struct map_session_data *,int,int,int); // self -int clif_misceffect(struct block_list*,int); // area -int clif_changeoption(struct block_list*); // area -int clif_useitemack(struct map_session_data*,int,int,int); // self - -int clif_createchat(struct map_session_data*,int); // self -int clif_dispchat(struct chat_data*,int); // area or fd -int clif_joinchatfail(struct map_session_data*,int); // self -int clif_joinchatok(struct map_session_data*,struct chat_data*); // self -int clif_addchat(struct chat_data*,struct map_session_data*); // chat -int clif_changechatowner(struct chat_data*,struct map_session_data*); // chat -int clif_clearchat(struct chat_data*,int); // area or fd -int clif_leavechat(struct chat_data*,struct map_session_data*); // chat -int clif_changechatstatus(struct chat_data*); // chat - -void clif_emotion(struct block_list *bl,int type); -void clif_talkiebox(struct block_list *bl,char* talkie); -void clif_wedding_effect(struct block_list *bl); -void clif_sitting(int fd, struct map_session_data *sd); +int clif_changelook (struct block_list *, int, int); // area +int clif_changelook_towards (struct block_list *, int, int, struct map_session_data *dst); // area or target +void clif_changelook_accessories (struct block_list *bl, struct map_session_data *dst); // area or target; list gloves, boots etc. +int clif_arrowequip (struct map_session_data *sd, int val); //self +int clif_arrow_fail (struct map_session_data *sd, int type); //self +int clif_statusupack (struct map_session_data *, int, int, int); // self +int clif_equipitemack (struct map_session_data *, int, int, int); // self +int clif_unequipitemack (struct map_session_data *, int, int, int); // self +int clif_misceffect (struct block_list *, int); // area +int clif_changeoption (struct block_list *); // area +int clif_useitemack (struct map_session_data *, int, int, int); // self + +int clif_createchat (struct map_session_data *, int); // self +int clif_dispchat (struct chat_data *, int); // area or fd +int clif_joinchatfail (struct map_session_data *, int); // self +int clif_joinchatok (struct map_session_data *, struct chat_data *); // self +int clif_addchat (struct chat_data *, struct map_session_data *); // chat +int clif_changechatowner (struct chat_data *, struct map_session_data *); // chat +int clif_clearchat (struct chat_data *, int); // area or fd +int clif_leavechat (struct chat_data *, struct map_session_data *); // chat +int clif_changechatstatus (struct chat_data *); // chat + +void clif_emotion (struct block_list *bl, int type); +void clif_talkiebox (struct block_list *bl, char *talkie); +void clif_wedding_effect (struct block_list *bl); +void clif_sitting (int fd, struct map_session_data *sd); //void clif_callpartner(struct map_session_data *sd); //void clif_sitting(struct map_session_data *sd); -void clif_soundeffect(struct map_session_data *sd,struct block_list *bl,char *name,int type); +void clif_soundeffect (struct map_session_data *sd, struct block_list *bl, + char *name, int type); // trade -int clif_traderequest(struct map_session_data *sd,char *name); -int clif_tradestart(struct map_session_data *sd,int type); -int clif_tradeadditem(struct map_session_data *sd,struct map_session_data *tsd,int index,int amount); -int clif_tradeitemok(struct map_session_data *sd,int index,int amount,int fail); -int clif_tradedeal_lock(struct map_session_data *sd,int fail); -int clif_tradecancelled(struct map_session_data *sd); -int clif_tradecompleted(struct map_session_data *sd,int fail); +int clif_traderequest (struct map_session_data *sd, char *name); +int clif_tradestart (struct map_session_data *sd, int type); +int clif_tradeadditem (struct map_session_data *sd, + struct map_session_data *tsd, int index, int amount); +int clif_tradeitemok (struct map_session_data *sd, int index, int amount, + int fail); +int clif_tradedeal_lock (struct map_session_data *sd, int fail); +int clif_tradecancelled (struct map_session_data *sd); +int clif_tradecompleted (struct map_session_data *sd, int fail); // storage #include "storage.h" -int clif_storageitemlist(struct map_session_data *sd,struct storage *stor); -int clif_storageequiplist(struct map_session_data *sd,struct storage *stor); -int clif_updatestorageamount(struct map_session_data *sd,struct storage *stor); -int clif_storageitemadded(struct map_session_data *sd,struct storage *stor,int index,int amount); -int clif_storageitemremoved(struct map_session_data *sd,int index,int amount); -int clif_storageclose(struct map_session_data *sd); -int clif_guildstorageitemlist(struct map_session_data *sd,struct guild_storage *stor); -int clif_guildstorageequiplist(struct map_session_data *sd,struct guild_storage *stor); -int clif_updateguildstorageamount(struct map_session_data *sd,struct guild_storage *stor); -int clif_guildstorageitemadded(struct map_session_data *sd,struct guild_storage *stor,int index,int amount); - -int clif_pcinsight(struct block_list *,va_list); // map_forallinmovearea callback -int clif_pcoutsight(struct block_list *,va_list); // map_forallinmovearea callback -int clif_mobinsight(struct block_list *,va_list); // map_forallinmovearea callback -int clif_moboutsight(struct block_list *,va_list); // map_forallinmovearea callback - -int clif_class_change(struct block_list *bl,int class,int type); -int clif_mob_class_change(struct mob_data *md,int class); -int clif_mob_equip(struct mob_data *md,int nameid); // [Valaris] - -int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range); -int clif_skillinfoblock(struct map_session_data *sd); -int clif_skillup(struct map_session_data *sd,int skill_num); - -int clif_skillcasting(struct block_list* bl, - int src_id,int dst_id,int dst_x,int dst_y,int skill_num,int casttime); -int clif_skillcastcancel(struct block_list* bl); -int clif_skill_fail(struct map_session_data *sd,int skill_id,int type,int btype); -int clif_skill_damage(struct block_list *src,struct block_list *dst, - unsigned int tick,int sdelay,int ddelay,int damage,int div, - int skill_id,int skill_lv,int type); -int clif_skill_damage2(struct block_list *src,struct block_list *dst, - unsigned int tick,int sdelay,int ddelay,int damage,int div, - int skill_id,int skill_lv,int type); -int clif_skill_nodamage(struct block_list *src,struct block_list *dst, - int skill_id,int heal,int fail); -int clif_skill_poseffect(struct block_list *src,int skill_id, - int val,int x,int y,int tick); -int clif_skill_estimation(struct map_session_data *sd,struct block_list *dst); -int clif_skill_warppoint(struct map_session_data *sd,int skill_num, - const char *map1,const char *map2,const char *map3,const char *map4); -int clif_skill_memo(struct map_session_data *sd,int flag); -int clif_skill_teleportmessage(struct map_session_data *sd,int flag); - -int clif_produceeffect(struct map_session_data *sd,int flag,int nameid); - -int clif_skill_setunit(struct skill_unit *unit); -int clif_skill_delunit(struct skill_unit *unit); - -int clif_01ac(struct block_list *bl); - -int clif_autospell(struct map_session_data *sd,int skilllv); -int clif_devotion(struct map_session_data *sd,int target); -int clif_spiritball(struct map_session_data *sd); -int clif_combo_delay(struct block_list *src,int wait); -int clif_bladestop(struct block_list *src,struct block_list *dst,int bool); -int clif_changemapcell(int m,int x,int y,int cell_type,int type); - -int clif_status_change(struct block_list *bl,int type,int flag); - -int clif_wis_message(int fd,char *nick,char *mes,int mes_len); -int clif_wis_end(int fd,int flag); - -int clif_solved_charname(struct map_session_data *sd,int char_id); - -int clif_use_card(struct map_session_data *sd,int idx); -int clif_insert_card(struct map_session_data *sd,int idx_equip,int idx_card,int flag); - -int clif_itemlist(struct map_session_data *sd); -int clif_equiplist(struct map_session_data *sd); - -int clif_cart_additem(struct map_session_data*,int,int,int); -int clif_cart_delitem(struct map_session_data*,int,int); -int clif_cart_itemlist(struct map_session_data *sd); -int clif_cart_equiplist(struct map_session_data *sd); - -int clif_item_identify_list(struct map_session_data *sd); -int clif_item_identified(struct map_session_data *sd,int idx,int flag); -int clif_item_repair_list(struct map_session_data *sd); - -int clif_item_skill(struct map_session_data *sd,int skillid,int skilllv,const char *name); - -int clif_mvp_effect(struct map_session_data *sd); -int clif_mvp_item(struct map_session_data *sd,int nameid); -int clif_mvp_exp(struct map_session_data *sd,int exp); - -int clif_movetoattack(struct map_session_data *sd,struct block_list *bl); +int clif_storageitemlist (struct map_session_data *sd, struct storage *stor); +int clif_storageequiplist (struct map_session_data *sd, + struct storage *stor); +int clif_updatestorageamount (struct map_session_data *sd, + struct storage *stor); +int clif_storageitemadded (struct map_session_data *sd, struct storage *stor, + int index, int amount); +int clif_storageitemremoved (struct map_session_data *sd, int index, + int amount); +int clif_storageclose (struct map_session_data *sd); +int clif_guildstorageitemlist (struct map_session_data *sd, + struct guild_storage *stor); +int clif_guildstorageequiplist (struct map_session_data *sd, + struct guild_storage *stor); +int clif_updateguildstorageamount (struct map_session_data *sd, + struct guild_storage *stor); +int clif_guildstorageitemadded (struct map_session_data *sd, + struct guild_storage *stor, int index, + int amount); + +int clif_pcinsight (struct block_list *, va_list); // map_forallinmovearea callback +int clif_pcoutsight (struct block_list *, va_list); // map_forallinmovearea callback +int clif_mobinsight (struct block_list *, va_list); // map_forallinmovearea callback +int clif_moboutsight (struct block_list *, va_list); // map_forallinmovearea callback + +int clif_class_change (struct block_list *bl, int class, int type); +int clif_mob_class_change (struct mob_data *md, int class); +int clif_mob_equip (struct mob_data *md, int nameid); // [Valaris] + +int clif_skillinfo (struct map_session_data *sd, int skillid, int type, + int range); +int clif_skillinfoblock (struct map_session_data *sd); +int clif_skillup (struct map_session_data *sd, int skill_num); + +int clif_skillcasting (struct block_list *bl, + int src_id, int dst_id, int dst_x, int dst_y, + int skill_num, int casttime); +int clif_skillcastcancel (struct block_list *bl); +int clif_skill_fail (struct map_session_data *sd, int skill_id, int type, + int btype); +int clif_skill_damage (struct block_list *src, struct block_list *dst, + unsigned int tick, int sdelay, int ddelay, int damage, + int div, int skill_id, int skill_lv, int type); +int clif_skill_damage2 (struct block_list *src, struct block_list *dst, + unsigned int tick, int sdelay, int ddelay, + int damage, int div, int skill_id, int skill_lv, + int type); +int clif_skill_nodamage (struct block_list *src, struct block_list *dst, + int skill_id, int heal, int fail); +int clif_skill_poseffect (struct block_list *src, int skill_id, int val, + int x, int y, int tick); +int clif_skill_estimation (struct map_session_data *sd, + struct block_list *dst); +int clif_skill_warppoint (struct map_session_data *sd, int skill_num, + const char *map1, const char *map2, + const char *map3, const char *map4); +int clif_skill_memo (struct map_session_data *sd, int flag); +int clif_skill_teleportmessage (struct map_session_data *sd, int flag); + +int clif_produceeffect (struct map_session_data *sd, int flag, int nameid); + +int clif_skill_setunit (struct skill_unit *unit); +int clif_skill_delunit (struct skill_unit *unit); + +int clif_01ac (struct block_list *bl); + +int clif_autospell (struct map_session_data *sd, int skilllv); +int clif_devotion (struct map_session_data *sd, int target); +int clif_spiritball (struct map_session_data *sd); +int clif_combo_delay (struct block_list *src, int wait); +int clif_bladestop (struct block_list *src, struct block_list *dst, + int bool); +int clif_changemapcell (int m, int x, int y, int cell_type, int type); + +int clif_status_change (struct block_list *bl, int type, int flag); + +int clif_wis_message (int fd, char *nick, char *mes, int mes_len); +int clif_wis_end (int fd, int flag); + +int clif_solved_charname (struct map_session_data *sd, int char_id); + +int clif_use_card (struct map_session_data *sd, int idx); +int clif_insert_card (struct map_session_data *sd, int idx_equip, + int idx_card, int flag); + +int clif_itemlist (struct map_session_data *sd); +int clif_equiplist (struct map_session_data *sd); + +int clif_cart_additem (struct map_session_data *, int, int, int); +int clif_cart_delitem (struct map_session_data *, int, int); +int clif_cart_itemlist (struct map_session_data *sd); +int clif_cart_equiplist (struct map_session_data *sd); + +int clif_item_identify_list (struct map_session_data *sd); +int clif_item_identified (struct map_session_data *sd, int idx, int flag); +int clif_item_repair_list (struct map_session_data *sd); + +int clif_item_skill (struct map_session_data *sd, int skillid, int skilllv, + const char *name); + +int clif_mvp_effect (struct map_session_data *sd); +int clif_mvp_item (struct map_session_data *sd, int nameid); +int clif_mvp_exp (struct map_session_data *sd, int exp); + +int clif_movetoattack (struct map_session_data *sd, struct block_list *bl); // party -int clif_party_created(struct map_session_data *sd,int flag); -int clif_party_info(struct party *p,int fd); -int clif_party_invite(struct map_session_data *sd,struct map_session_data *tsd); -int clif_party_inviteack(struct map_session_data *sd,char *nick,int flag); -int clif_party_option(struct party *p,struct map_session_data *sd,int flag); -int clif_party_leaved(struct party *p,struct map_session_data *sd,int account_id,char *name,int flag); -int clif_party_message(struct party *p,int account_id,char *mes,int len); -int clif_party_move(struct party *p,struct map_session_data *sd,int online); -int clif_party_xy(struct party *p,struct map_session_data *sd); -int clif_party_hp(struct party *p,struct map_session_data *sd); +int clif_party_created (struct map_session_data *sd, int flag); +int clif_party_info (struct party *p, int fd); +int clif_party_invite (struct map_session_data *sd, + struct map_session_data *tsd); +int clif_party_inviteack (struct map_session_data *sd, char *nick, int flag); +int clif_party_option (struct party *p, struct map_session_data *sd, + int flag); +int clif_party_leaved (struct party *p, struct map_session_data *sd, + int account_id, char *name, int flag); +int clif_party_message (struct party *p, int account_id, char *mes, int len); +int clif_party_move (struct party *p, struct map_session_data *sd, + int online); +int clif_party_xy (struct party *p, struct map_session_data *sd); +int clif_party_hp (struct party *p, struct map_session_data *sd); // guild -int clif_guild_created(struct map_session_data *sd,int flag); -int clif_guild_belonginfo(struct map_session_data *sd,struct guild *g); -int clif_guild_basicinfo(struct map_session_data *sd); -int clif_guild_allianceinfo(struct map_session_data *sd); -int clif_guild_memberlist(struct map_session_data *sd); -int clif_guild_skillinfo(struct map_session_data *sd); -int clif_guild_memberlogin_notice(struct guild *g,int idx,int flag); -int clif_guild_invite(struct map_session_data *sd,struct guild *g); -int clif_guild_inviteack(struct map_session_data *sd,int flag); -int clif_guild_leave(struct map_session_data *sd,const char *name,const char *mes); -int clif_guild_explusion(struct map_session_data *sd,const char *name,const char *mes, - int account_id); -int clif_guild_positionchanged(struct guild *g,int idx); -int clif_guild_memberpositionchanged(struct guild *g,int idx); -int clif_guild_emblem(struct map_session_data *sd,struct guild *g); -int clif_guild_notice(struct map_session_data *sd,struct guild *g); -int clif_guild_message(struct guild *g,int account_id,const char *mes,int len); -int clif_guild_skillup(struct map_session_data *sd,int skill_num,int lv); -int clif_guild_reqalliance(struct map_session_data *sd,int account_id,const char *name); -int clif_guild_allianceack(struct map_session_data *sd,int flag); -int clif_guild_delalliance(struct map_session_data *sd,int guild_id,int flag); -int clif_guild_oppositionack(struct map_session_data *sd,int flag); -int clif_guild_broken(struct map_session_data *sd,int flag); - +int clif_guild_created (struct map_session_data *sd, int flag); +int clif_guild_belonginfo (struct map_session_data *sd, struct guild *g); +int clif_guild_basicinfo (struct map_session_data *sd); +int clif_guild_allianceinfo (struct map_session_data *sd); +int clif_guild_memberlist (struct map_session_data *sd); +int clif_guild_skillinfo (struct map_session_data *sd); +int clif_guild_memberlogin_notice (struct guild *g, int idx, int flag); +int clif_guild_invite (struct map_session_data *sd, struct guild *g); +int clif_guild_inviteack (struct map_session_data *sd, int flag); +int clif_guild_leave (struct map_session_data *sd, const char *name, + const char *mes); +int clif_guild_explusion (struct map_session_data *sd, const char *name, + const char *mes, int account_id); +int clif_guild_positionchanged (struct guild *g, int idx); +int clif_guild_memberpositionchanged (struct guild *g, int idx); +int clif_guild_emblem (struct map_session_data *sd, struct guild *g); +int clif_guild_notice (struct map_session_data *sd, struct guild *g); +int clif_guild_message (struct guild *g, int account_id, const char *mes, + int len); +int clif_guild_skillup (struct map_session_data *sd, int skill_num, int lv); +int clif_guild_reqalliance (struct map_session_data *sd, int account_id, + const char *name); +int clif_guild_allianceack (struct map_session_data *sd, int flag); +int clif_guild_delalliance (struct map_session_data *sd, int guild_id, + int flag); +int clif_guild_oppositionack (struct map_session_data *sd, int flag); +int clif_guild_broken (struct map_session_data *sd, int flag); // atcommand -int clif_displaymessage(const int fd,char* mes); -int clif_disp_onlyself(struct map_session_data *sd,char *mes,int len); -int clif_GMmessage(struct block_list *bl,char* mes,int len,int flag); -int clif_heal(int fd,int type,int val); -int clif_resurrection(struct block_list *bl,int type); -int clif_set0199(int fd,int type); -int clif_pvpset(struct map_session_data *sd, int pvprank, int pvpnum,int type); -int clif_send0199(int map,int type); -int clif_refine(int fd,struct map_session_data *sd,int fail,int index,int val); - -int clif_specialeffect(struct block_list *bl,int type, int flag); // special effects [Valaris] -int clif_message(struct block_list *bl, char* msg); // messages (from mobs/npcs) [Valaris] - -int clif_GM_kickack(struct map_session_data *sd,int id); -int clif_GM_kick(struct map_session_data *sd,struct map_session_data *tsd,int type); - -int clif_foreachclient(int (*)(struct map_session_data*,va_list),...); - -int do_final_clif(void); -int do_init_clif(void); +int clif_displaymessage (const int fd, char *mes); +int clif_disp_onlyself (struct map_session_data *sd, char *mes, int len); +int clif_GMmessage (struct block_list *bl, char *mes, int len, int flag); +int clif_heal (int fd, int type, int val); +int clif_resurrection (struct block_list *bl, int type); +int clif_set0199 (int fd, int type); +int clif_pvpset (struct map_session_data *sd, int pvprank, int pvpnum, + int type); +int clif_send0199 (int map, int type); +int clif_refine (int fd, struct map_session_data *sd, int fail, int index, + int val); + +int clif_specialeffect (struct block_list *bl, int type, int flag); // special effects [Valaris] +int clif_message (struct block_list *bl, char *msg); // messages (from mobs/npcs) [Valaris] + +int clif_GM_kickack (struct map_session_data *sd, int id); +int clif_GM_kick (struct map_session_data *sd, struct map_session_data *tsd, + int type); + +int clif_foreachclient (int (*)(struct map_session_data *, va_list), ...); + +int do_final_clif (void); +int do_init_clif (void); #endif - - diff --git a/src/map/guild.c b/src/map/guild.c index 1509a37..36b3e0f 100644 --- a/src/map/guild.c +++ b/src/map/guild.c @@ -28,1518 +28,1852 @@ static struct dbt *guild_expcache_db; static struct dbt *guild_infoevent_db; static struct dbt *guild_castleinfoevent_db; -struct eventlist { - char name[50]; - struct eventlist *next; +struct eventlist +{ + char name[50]; + struct eventlist *next; }; // ギルドのEXPキャッシュのフラッシュに関連する定数 -#define GUILD_PAYEXP_INVERVAL 10000 // 間隔(キャッシュの最大生存時間、ミリ秒) -#define GUILD_PAYEXP_LIST 8192 // キャッシュの最大数 +#define GUILD_PAYEXP_INVERVAL 10000 // 間隔(キャッシュの最大生存時間、ミリ秒) +#define GUILD_PAYEXP_LIST 8192 // キャッシュの最大数 // ギルドのEXPキャッシュ -struct guild_expcache { - int guild_id, account_id, char_id, exp; +struct guild_expcache +{ + int guild_id, account_id, char_id, exp; }; // ギルドスキルdbのアクセサ(今は直打ちで代用) -int guild_skill_get_inf(int id){ return 0; } -int guild_skill_get_sp(int id,int lv){ return 0; } -int guild_skill_get_range(int id){ return 0; } -int guild_skill_get_max(int id){ return (id==10004)?10:1; } - -// ギルドスキルがあるか確認 -int guild_checkskill(struct guild *g,int id){ return g->skill[id-10000].lv; } - - -int guild_payexp_timer(int tid,unsigned int tick,int id,int data); -int guild_gvg_eliminate_timer(int tid,unsigned int tick,int id,int data); - - -static int guild_read_castledb(void) +int guild_skill_get_inf (int id) { - FILE *fp; - char line[1024]; - int j,ln=0; - char *str[32],*p; - struct guild_castle *gc; - - if( (fp=fopen_("db/castle_db.txt","r"))==NULL){ - printf("can't read db/castle_db.txt\n"); - return -1; - } + return 0; +} - while(fgets(line,1020,fp)){ - if(line[0]=='/' && line[1]=='/') - continue; - memset(str,0,sizeof(str)); - gc=(struct guild_castle *)aCalloc(1,sizeof(struct guild_castle)); - for(j=0,p=line;j<6 && p;j++){ - str[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } +int guild_skill_get_sp (int id, int lv) +{ + return 0; +} - gc->guild_id=0; // <Agit> Clear Data for Initialize - gc->economy=0; gc->defense=0; gc->triggerE=0; gc->triggerD=0; gc->nextTime=0; gc->payTime=0; - gc->createTime=0; gc->visibleC=0; gc->visibleG0=0; gc->visibleG1=0; gc->visibleG2=0; - gc->visibleG3=0; gc->visibleG4=0; gc->visibleG5=0; gc->visibleG6=0; gc->visibleG7=0; - gc->Ghp0=0; gc->Ghp1=0; gc->Ghp2=0; gc->Ghp3=0; gc->Ghp4=0; gc->Ghp5=0; gc->Ghp6=0; gc->Ghp7=0; // guardian HP [Valaris] +int guild_skill_get_range (int id) +{ + return 0; +} - gc->castle_id=atoi(str[0]); - memcpy(gc->map_name,str[1],24); - memcpy(gc->castle_name,str[2],24); - memcpy(gc->castle_event,str[3],24); +int guild_skill_get_max (int id) +{ + return (id == 10004) ? 10 : 1; +} - numdb_insert(castle_db,gc->castle_id,gc); +// ギルドスキルがあるか確認 +int guild_checkskill (struct guild *g, int id) +{ + return g->skill[id - 10000].lv; +} - //intif_guild_castle_info(gc->castle_id); +int guild_payexp_timer (int tid, unsigned int tick, int id, int data); +int guild_gvg_eliminate_timer (int tid, unsigned int tick, int id, int data); - ln++; - } - fclose_(fp); - printf("read db/castle_db.txt done (count=%d)\n",ln); - return 0; +static int guild_read_castledb (void) +{ + FILE *fp; + char line[1024]; + int j, ln = 0; + char *str[32], *p; + struct guild_castle *gc; + + if ((fp = fopen_ ("db/castle_db.txt", "r")) == NULL) + { + printf ("can't read db/castle_db.txt\n"); + return -1; + } + + while (fgets (line, 1020, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + memset (str, 0, sizeof (str)); + gc = (struct guild_castle *) aCalloc (1, + sizeof (struct guild_castle)); + for (j = 0, p = line; j < 6 && p; j++) + { + str[j] = p; + p = strchr (p, ','); + if (p) + *p++ = 0; + } + + gc->guild_id = 0; // <Agit> Clear Data for Initialize + gc->economy = 0; + gc->defense = 0; + gc->triggerE = 0; + gc->triggerD = 0; + gc->nextTime = 0; + gc->payTime = 0; + gc->createTime = 0; + gc->visibleC = 0; + gc->visibleG0 = 0; + gc->visibleG1 = 0; + gc->visibleG2 = 0; + gc->visibleG3 = 0; + gc->visibleG4 = 0; + gc->visibleG5 = 0; + gc->visibleG6 = 0; + gc->visibleG7 = 0; + gc->Ghp0 = 0; + gc->Ghp1 = 0; + gc->Ghp2 = 0; + gc->Ghp3 = 0; + gc->Ghp4 = 0; + gc->Ghp5 = 0; + gc->Ghp6 = 0; + gc->Ghp7 = 0; // guardian HP [Valaris] + + gc->castle_id = atoi (str[0]); + memcpy (gc->map_name, str[1], 24); + memcpy (gc->castle_name, str[2], 24); + memcpy (gc->castle_event, str[3], 24); + + numdb_insert (castle_db, gc->castle_id, gc); + + //intif_guild_castle_info(gc->castle_id); + + ln++; + } + fclose_ (fp); + printf ("read db/castle_db.txt done (count=%d)\n", ln); + return 0; } // 初期化 -void do_init_guild(void) +void do_init_guild (void) { - guild_db=numdb_init(); - castle_db=numdb_init(); - guild_expcache_db=numdb_init(); - guild_infoevent_db=numdb_init(); - guild_castleinfoevent_db=numdb_init(); + guild_db = numdb_init (); + castle_db = numdb_init (); + guild_expcache_db = numdb_init (); + guild_infoevent_db = numdb_init (); + guild_castleinfoevent_db = numdb_init (); - guild_read_castledb(); + guild_read_castledb (); - add_timer_func_list(guild_gvg_eliminate_timer,"guild_gvg_eliminate_timer"); - add_timer_func_list(guild_payexp_timer,"guild_payexp_timer"); - add_timer_interval(gettick()+GUILD_PAYEXP_INVERVAL,guild_payexp_timer,0,0,GUILD_PAYEXP_INVERVAL); + add_timer_func_list (guild_gvg_eliminate_timer, + "guild_gvg_eliminate_timer"); + add_timer_func_list (guild_payexp_timer, "guild_payexp_timer"); + add_timer_interval (gettick () + GUILD_PAYEXP_INVERVAL, + guild_payexp_timer, 0, 0, GUILD_PAYEXP_INVERVAL); } - // 検索 -struct guild *guild_search(int guild_id) +struct guild *guild_search (int guild_id) { - return numdb_search(guild_db,guild_id); + return numdb_search (guild_db, guild_id); } -int guild_searchname_sub(void *key,void *data,va_list ap) + +int guild_searchname_sub (void *key, void *data, va_list ap) { - struct guild *g=(struct guild *)data,**dst; - char *str; - str=va_arg(ap,char *); - dst=va_arg(ap,struct guild **); - if(strcmpi(g->name,str)==0) - *dst=g; - return 0; + struct guild *g = (struct guild *) data, **dst; + char *str; + str = va_arg (ap, char *); + dst = va_arg (ap, struct guild **); + if (strcmpi (g->name, str) == 0) + *dst = g; + return 0; } + // ギルド名検索 -struct guild* guild_searchname(char *str) +struct guild *guild_searchname (char *str) { - struct guild *g=NULL; - numdb_foreach(guild_db,guild_searchname_sub,str,&g); - return g; + struct guild *g = NULL; + numdb_foreach (guild_db, guild_searchname_sub, str, &g); + return g; } -struct guild_castle *guild_castle_search(int gcid) + +struct guild_castle *guild_castle_search (int gcid) { - return numdb_search(castle_db,gcid); + return numdb_search (castle_db, gcid); } // mapnameに対応したアジトのgcを返す -struct guild_castle *guild_mapname2gc(char *mapname) +struct guild_castle *guild_mapname2gc (char *mapname) { - int i; - struct guild_castle *gc=NULL; - for(i=0;i<MAX_GUILDCASTLE;i++){ - gc=guild_castle_search(i); - if(!gc) continue; - if(strcmp(gc->map_name,mapname)==0) return gc; - } - return NULL; + int i; + struct guild_castle *gc = NULL; + for (i = 0; i < MAX_GUILDCASTLE; i++) + { + gc = guild_castle_search (i); + if (!gc) + continue; + if (strcmp (gc->map_name, mapname) == 0) + return gc; + } + return NULL; } // ログイン中のギルドメンバーの1人のsdを返す -struct map_session_data *guild_getavailablesd(struct guild *g) +struct map_session_data *guild_getavailablesd (struct guild *g) { - int i; + int i; - nullpo_retr(NULL, g); + nullpo_retr (NULL, g); - for(i=0;i<g->max_member;i++) - if(g->member[i].sd!=NULL) - return g->member[i].sd; - return NULL; + for (i = 0; i < g->max_member; i++) + if (g->member[i].sd != NULL) + return g->member[i].sd; + return NULL; } // ギルドメンバーのインデックスを返す -int guild_getindex(struct guild *g,int account_id,int char_id) +int guild_getindex (struct guild *g, int account_id, int char_id) { - int i; - if(g==NULL) - return -1; - for(i=0;i<g->max_member;i++) - if( g->member[i].account_id==account_id && - g->member[i].char_id==char_id ) - return i; - return -1; + int i; + if (g == NULL) + return -1; + for (i = 0; i < g->max_member; i++) + if (g->member[i].account_id == account_id && + g->member[i].char_id == char_id) + return i; + return -1; } + // ギルドメンバーの役職を返す -int guild_getposition(struct map_session_data *sd,struct guild *g) +int guild_getposition (struct map_session_data *sd, struct guild *g) { - int i; + int i; - nullpo_retr(-1, sd); + nullpo_retr (-1, sd); - if(g==NULL && (g=guild_search(sd->status.guild_id))==NULL) - return -1; - for(i=0;i<g->max_member;i++) - if( g->member[i].account_id==sd->status.account_id && - g->member[i].char_id==sd->status.char_id ) - return g->member[i].position; - return -1; + if (g == NULL && (g = guild_search (sd->status.guild_id)) == NULL) + return -1; + for (i = 0; i < g->max_member; i++) + if (g->member[i].account_id == sd->status.account_id && + g->member[i].char_id == sd->status.char_id) + return g->member[i].position; + return -1; } // メンバー情報の作成 -void guild_makemember(struct guild_member *m,struct map_session_data *sd) -{ - nullpo_retv(sd); - - memset(m,0,sizeof(struct guild_member)); - m->account_id =sd->status.account_id; - m->char_id =sd->status.char_id; - m->hair =sd->status.hair; - m->hair_color =sd->status.hair_color; - m->gender =sd->sex; - m->class =sd->status.class; - m->lv =sd->status.base_level; - m->exp =0; - m->exp_payper =0; - m->online =1; - m->position =MAX_GUILDPOSITION-1; - memcpy(m->name,sd->status.name,24); - return; +void guild_makemember (struct guild_member *m, struct map_session_data *sd) +{ + nullpo_retv (sd); + + memset (m, 0, sizeof (struct guild_member)); + m->account_id = sd->status.account_id; + m->char_id = sd->status.char_id; + m->hair = sd->status.hair; + m->hair_color = sd->status.hair_color; + m->gender = sd->sex; + m->class = sd->status.class; + m->lv = sd->status.base_level; + m->exp = 0; + m->exp_payper = 0; + m->online = 1; + m->position = MAX_GUILDPOSITION - 1; + memcpy (m->name, sd->status.name, 24); + return; } + // ギルド競合確認 -int guild_check_conflict(struct map_session_data *sd) +int guild_check_conflict (struct map_session_data *sd) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - intif_guild_checkconflict(sd->status.guild_id, - sd->status.account_id,sd->status.char_id); - return 0; + intif_guild_checkconflict (sd->status.guild_id, + sd->status.account_id, sd->status.char_id); + return 0; } // ギルドのEXPキャッシュをinter鯖にフラッシュする -int guild_payexp_timer_sub(void *key,void *data,va_list ap) +int guild_payexp_timer_sub (void *key, void *data, va_list ap) { - int i, *dellist,*delp, dataid=(int)key; - struct guild_expcache *c; - struct guild *g; + int i, *dellist, *delp, dataid = (int) key; + struct guild_expcache *c; + struct guild *g; - nullpo_retr(0, ap); - nullpo_retr(0, c=(struct guild_expcache *)data); - nullpo_retr(0, dellist=va_arg(ap,int *)); - nullpo_retr(0, delp=va_arg(ap,int *)); + nullpo_retr (0, ap); + nullpo_retr (0, c = (struct guild_expcache *) data); + nullpo_retr (0, dellist = va_arg (ap, int *)); + nullpo_retr (0, delp = va_arg (ap, int *)); - if( *delp>=GUILD_PAYEXP_LIST || (g=guild_search(c->guild_id))==NULL ) - return 0; - if( ( i=guild_getindex(g,c->account_id,c->char_id) )<0 ) - return 0; + if (*delp >= GUILD_PAYEXP_LIST + || (g = guild_search (c->guild_id)) == NULL) + return 0; + if ((i = guild_getindex (g, c->account_id, c->char_id)) < 0) + return 0; - g->member[i].exp+=c->exp; - intif_guild_change_memberinfo(g->guild_id,c->account_id,c->char_id, - GMI_EXP,&g->member[i].exp,sizeof(g->member[i].exp)); - c->exp=0; + g->member[i].exp += c->exp; + intif_guild_change_memberinfo (g->guild_id, c->account_id, c->char_id, + GMI_EXP, &g->member[i].exp, + sizeof (g->member[i].exp)); + c->exp = 0; - dellist[(*delp)++]=dataid; - free(c); - return 0; + dellist[(*delp)++] = dataid; + free (c); + return 0; } -int guild_payexp_timer(int tid,unsigned int tick,int id,int data) + +int guild_payexp_timer (int tid, unsigned int tick, int id, int data) { - int dellist[GUILD_PAYEXP_LIST],delp=0,i; - numdb_foreach(guild_expcache_db,guild_payexp_timer_sub, - dellist,&delp); - for(i=0;i<delp;i++) - numdb_erase(guild_expcache_db,dellist[i]); -// if(battle_config.etc_log) -// printf("guild exp %d charactor's exp flushed !\n",delp); - return 0; + int dellist[GUILD_PAYEXP_LIST], delp = 0, i; + numdb_foreach (guild_expcache_db, guild_payexp_timer_sub, dellist, &delp); + for (i = 0; i < delp; i++) + numdb_erase (guild_expcache_db, dellist[i]); +// if(battle_config.etc_log) +// printf("guild exp %d charactor's exp flushed !\n",delp); + return 0; } //------------------------------------------------------------------------ // 作成要求 -int guild_create(struct map_session_data *sd,char *name) +int guild_create (struct map_session_data *sd, char *name) { - nullpo_retr(0, sd); - - if(sd->status.guild_id==0){ - if(!battle_config.guild_emperium_check || pc_search_inventory(sd,714) >= 0) { - struct guild_member m; - guild_makemember(&m,sd); - m.position=0; - intif_guild_create(name,&m); - } else - clif_guild_created(sd,3); // エンペリウムがいない - }else - clif_guild_created(sd,1); // すでに所属している - - return 0; + nullpo_retr (0, sd); + + if (sd->status.guild_id == 0) + { + if (!battle_config.guild_emperium_check + || pc_search_inventory (sd, 714) >= 0) + { + struct guild_member m; + guild_makemember (&m, sd); + m.position = 0; + intif_guild_create (name, &m); + } + else + clif_guild_created (sd, 3); // エンペリウムがいない + } + else + clif_guild_created (sd, 1); // すでに所属している + + return 0; } // 作成可否 -int guild_created(int account_id,int guild_id) -{ - struct map_session_data *sd=map_id2sd(account_id); - - if(sd==NULL) - return 0; - if(guild_id>0) { - struct guild *g; - sd->status.guild_id=guild_id; - sd->guild_sended=0; - if((g=numdb_search(guild_db,guild_id))!=NULL){ - printf("guild: id already exists!\n"); - exit(1); - } - clif_guild_created(sd,0); - if(battle_config.guild_emperium_check) - pc_delitem(sd,pc_search_inventory(sd,714),1,0); // エンペリウム消耗 - } else { - clif_guild_created(sd,2); // 作成失敗(同名ギルド存在) - } - return 0; +int guild_created (int account_id, int guild_id) +{ + struct map_session_data *sd = map_id2sd (account_id); + + if (sd == NULL) + return 0; + if (guild_id > 0) + { + struct guild *g; + sd->status.guild_id = guild_id; + sd->guild_sended = 0; + if ((g = numdb_search (guild_db, guild_id)) != NULL) + { + printf ("guild: id already exists!\n"); + exit (1); + } + clif_guild_created (sd, 0); + if (battle_config.guild_emperium_check) + pc_delitem (sd, pc_search_inventory (sd, 714), 1, 0); // エンペリウム消耗 + } + else + { + clif_guild_created (sd, 2); // 作成失敗(同名ギルド存在) + } + return 0; } // 情報要求 -int guild_request_info(int guild_id) +int guild_request_info (int guild_id) { -// if(battle_config.etc_log) -// printf("guild_request_info\n"); - return intif_guild_request_info(guild_id); +// if(battle_config.etc_log) +// printf("guild_request_info\n"); + return intif_guild_request_info (guild_id); } + // イベント付き情報要求 -int guild_npc_request_info(int guild_id,const char *event) +int guild_npc_request_info (int guild_id, const char *event) { - struct eventlist *ev; + struct eventlist *ev; - if( guild_search(guild_id) ){ - if(event && *event) - npc_event_do(event); - return 0; - } + if (guild_search (guild_id)) + { + if (event && *event) + npc_event_do (event); + return 0; + } - if(event==NULL || *event==0) - return guild_request_info(guild_id); + if (event == NULL || *event == 0) + return guild_request_info (guild_id); - ev=(struct eventlist *)aCalloc(1,sizeof(struct eventlist)); - memcpy(ev->name,event,sizeof(ev->name)); - ev->next=(struct eventlist *)numdb_search(guild_infoevent_db,guild_id); - numdb_insert(guild_infoevent_db,guild_id,ev); - return guild_request_info(guild_id); + ev = (struct eventlist *) aCalloc (1, sizeof (struct eventlist)); + memcpy (ev->name, event, sizeof (ev->name)); + ev->next = + (struct eventlist *) numdb_search (guild_infoevent_db, guild_id); + numdb_insert (guild_infoevent_db, guild_id, ev); + return guild_request_info (guild_id); } // 所属キャラの確認 -int guild_check_member(const struct guild *g) -{ - int i; - struct map_session_data *sd; - - nullpo_retr(0, g); - - for(i=0;i<fd_max;i++){ - if(session[i] && (sd=session[i]->session_data) && sd->state.auth){ - if(sd->status.guild_id==g->guild_id){ - int j,f=1; - for(j=0;j<MAX_GUILD;j++){ // データがあるか - if( g->member[j].account_id==sd->status.account_id && - g->member[j].char_id==sd->status.char_id) - f=0; - } - if(f){ - sd->status.guild_id=0; - sd->guild_sended=0; - sd->guild_emblem_id=0; - if(battle_config.error_log) - printf("guild: check_member %d[%s] is not member\n",sd->status.account_id,sd->status.name); - } - } - } - } - return 0; +int guild_check_member (const struct guild *g) +{ + int i; + struct map_session_data *sd; + + nullpo_retr (0, g); + + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data) && sd->state.auth) + { + if (sd->status.guild_id == g->guild_id) + { + int j, f = 1; + for (j = 0; j < MAX_GUILD; j++) + { // データがあるか + if (g->member[j].account_id == sd->status.account_id && + g->member[j].char_id == sd->status.char_id) + f = 0; + } + if (f) + { + sd->status.guild_id = 0; + sd->guild_sended = 0; + sd->guild_emblem_id = 0; + if (battle_config.error_log) + printf ("guild: check_member %d[%s] is not member\n", + sd->status.account_id, sd->status.name); + } + } + } + } + return 0; } + // 情報所得失敗(そのIDのキャラを全部未所属にする) -int guild_recv_noinfo(int guild_id) -{ - int i; - struct map_session_data *sd; - for(i=0;i<fd_max;i++){ - if(session[i] && (sd=session[i]->session_data) && sd->state.auth){ - if(sd->status.guild_id==guild_id) - sd->status.guild_id=0; - } - } - return 0; +int guild_recv_noinfo (int guild_id) +{ + int i; + struct map_session_data *sd; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data) && sd->state.auth) + { + if (sd->status.guild_id == guild_id) + sd->status.guild_id = 0; + } + } + return 0; } + // 情報所得 -int guild_recv_info(struct guild *sg) -{ - struct guild *g,before; - int i,bm,m; - struct eventlist *ev,*ev2; - - nullpo_retr(0, sg); - - if((g=numdb_search(guild_db,sg->guild_id))==NULL){ - g=(struct guild *)aCalloc(1,sizeof(struct guild)); - numdb_insert(guild_db,sg->guild_id,g); - before=*sg; - - // 最初のロードなのでユーザーのチェックを行う - guild_check_member(sg); - }else - before=*g; - memcpy(g,sg,sizeof(struct guild)); - - for(i=bm=m=0;i<g->max_member;i++){ // sdの設定と人数の確認 - if(g->member[i].account_id>0){ - struct map_session_data *sd = map_id2sd(g->member[i].account_id); - g->member[i].sd=(sd!=NULL && - sd->status.char_id==g->member[i].char_id && - sd->status.guild_id==g->guild_id)? sd:NULL; - m++; - }else - g->member[i].sd=NULL; - if(before.member[i].account_id>0) - bm++; - } - - for(i=0;i<g->max_member;i++){ // 情報の送信 - struct map_session_data *sd = g->member[i].sd; - if( sd==NULL ) - continue; - - if( before.guild_lv!=g->guild_lv || bm!=m || - before.max_member!=g->max_member ){ - clif_guild_basicinfo(sd); // 基本情報送信 - clif_guild_emblem(sd,g); // エンブレム送信 - } - - if(bm!=m){ // メンバー情報送信 - clif_guild_memberlist(g->member[i].sd); - } - - if( before.skill_point!=g->skill_point) - clif_guild_skillinfo(sd); // スキル情報送信 - - if( sd->guild_sended==0){ // 未送信なら所属情報も送る - clif_guild_belonginfo(sd,g); - clif_guild_notice(sd,g); - sd->guild_emblem_id=g->emblem_id; - sd->guild_sended=1; - } - } - - // イベントの発生 - if( (ev=numdb_search(guild_infoevent_db,sg->guild_id))!=NULL ){ - numdb_erase(guild_infoevent_db,sg->guild_id); - for(;ev;ev2=ev->next,free(ev),ev=ev2){ - npc_event_do(ev->name); - } - } - - return 0; +int guild_recv_info (struct guild *sg) +{ + struct guild *g, before; + int i, bm, m; + struct eventlist *ev, *ev2; + + nullpo_retr (0, sg); + + if ((g = numdb_search (guild_db, sg->guild_id)) == NULL) + { + g = (struct guild *) aCalloc (1, sizeof (struct guild)); + numdb_insert (guild_db, sg->guild_id, g); + before = *sg; + + // 最初のロードなのでユーザーのチェックを行う + guild_check_member (sg); + } + else + before = *g; + memcpy (g, sg, sizeof (struct guild)); + + for (i = bm = m = 0; i < g->max_member; i++) + { // sdの設定と人数の確認 + if (g->member[i].account_id > 0) + { + struct map_session_data *sd = map_id2sd (g->member[i].account_id); + g->member[i].sd = (sd != NULL && + sd->status.char_id == g->member[i].char_id && + sd->status.guild_id == + g->guild_id) ? sd : NULL; + m++; + } + else + g->member[i].sd = NULL; + if (before.member[i].account_id > 0) + bm++; + } + + for (i = 0; i < g->max_member; i++) + { // 情報の送信 + struct map_session_data *sd = g->member[i].sd; + if (sd == NULL) + continue; + + if (before.guild_lv != g->guild_lv || bm != m || + before.max_member != g->max_member) + { + clif_guild_basicinfo (sd); // 基本情報送信 + clif_guild_emblem (sd, g); // エンブレム送信 + } + + if (bm != m) + { // メンバー情報送信 + clif_guild_memberlist (g->member[i].sd); + } + + if (before.skill_point != g->skill_point) + clif_guild_skillinfo (sd); // スキル情報送信 + + if (sd->guild_sended == 0) + { // 未送信なら所属情報も送る + clif_guild_belonginfo (sd, g); + clif_guild_notice (sd, g); + sd->guild_emblem_id = g->emblem_id; + sd->guild_sended = 1; + } + } + + // イベントの発生 + if ((ev = numdb_search (guild_infoevent_db, sg->guild_id)) != NULL) + { + numdb_erase (guild_infoevent_db, sg->guild_id); + for (; ev; ev2 = ev->next, free (ev), ev = ev2) + { + npc_event_do (ev->name); + } + } + + return 0; } - // ギルドへの勧誘 -int guild_invite(struct map_session_data *sd,int account_id) -{ - struct map_session_data *tsd; - struct guild *g; - int i; - - nullpo_retr(0, sd); - - tsd= map_id2sd(account_id); - g=guild_search(sd->status.guild_id); - - if(tsd==NULL || g==NULL) - return 0; - if(!battle_config.invite_request_check) { - if (tsd->party_invite>0 || tsd->trade_partner) { // 相手が取引中かどうか - clif_guild_inviteack(sd,0); - return 0; - } - } - if( tsd->status.guild_id>0 || tsd->guild_invite>0 ){ // 相手の所属確認 - clif_guild_inviteack(sd,0); - return 0; - } - - // 定員確認 - for(i=0;i<g->max_member;i++) - if(g->member[i].account_id==0) - break; - if(i==g->max_member){ - clif_guild_inviteack(sd,3); - return 0; - } - - tsd->guild_invite=sd->status.guild_id; - tsd->guild_invite_account=sd->status.account_id; - - clif_guild_invite(tsd,g); - return 0; +int guild_invite (struct map_session_data *sd, int account_id) +{ + struct map_session_data *tsd; + struct guild *g; + int i; + + nullpo_retr (0, sd); + + tsd = map_id2sd (account_id); + g = guild_search (sd->status.guild_id); + + if (tsd == NULL || g == NULL) + return 0; + if (!battle_config.invite_request_check) + { + if (tsd->party_invite > 0 || tsd->trade_partner) + { // 相手が取引中かどうか + clif_guild_inviteack (sd, 0); + return 0; + } + } + if (tsd->status.guild_id > 0 || tsd->guild_invite > 0) + { // 相手の所属確認 + clif_guild_inviteack (sd, 0); + return 0; + } + + // 定員確認 + for (i = 0; i < g->max_member; i++) + if (g->member[i].account_id == 0) + break; + if (i == g->max_member) + { + clif_guild_inviteack (sd, 3); + return 0; + } + + tsd->guild_invite = sd->status.guild_id; + tsd->guild_invite_account = sd->status.account_id; + + clif_guild_invite (tsd, g); + return 0; } + // ギルド勧誘への返答 -int guild_reply_invite(struct map_session_data *sd,int guild_id,int flag) -{ - struct map_session_data *tsd; - - nullpo_retr(0, sd); - nullpo_retr(0, tsd= map_id2sd( sd->guild_invite_account )); - - if(sd->guild_invite!=guild_id) // 勧誘とギルドIDが違う - return 0; - - if(flag==1){ // 承諾 - struct guild_member m; - struct guild *g; - int i; - - // 定員確認 - if( (g=guild_search(tsd->status.guild_id))==NULL ){ - sd->guild_invite=0; - sd->guild_invite_account=0; - return 0; - } - for(i=0;i<g->max_member;i++) - if(g->member[i].account_id==0) - break; - if(i==g->max_member){ - sd->guild_invite=0; - sd->guild_invite_account=0; - clif_guild_inviteack(tsd,3); - return 0; - } - - - //inter鯖へ追加要求 - guild_makemember(&m,sd); - intif_guild_addmember( sd->guild_invite, &m ); - return 0; - }else{ // 拒否 - sd->guild_invite=0; - sd->guild_invite_account=0; - if(tsd==NULL) - return 0; - clif_guild_inviteack(tsd,1); - } - return 0; +int guild_reply_invite (struct map_session_data *sd, int guild_id, int flag) +{ + struct map_session_data *tsd; + + nullpo_retr (0, sd); + nullpo_retr (0, tsd = map_id2sd (sd->guild_invite_account)); + + if (sd->guild_invite != guild_id) // 勧誘とギルドIDが違う + return 0; + + if (flag == 1) + { // 承諾 + struct guild_member m; + struct guild *g; + int i; + + // 定員確認 + if ((g = guild_search (tsd->status.guild_id)) == NULL) + { + sd->guild_invite = 0; + sd->guild_invite_account = 0; + return 0; + } + for (i = 0; i < g->max_member; i++) + if (g->member[i].account_id == 0) + break; + if (i == g->max_member) + { + sd->guild_invite = 0; + sd->guild_invite_account = 0; + clif_guild_inviteack (tsd, 3); + return 0; + } + + //inter鯖へ追加要求 + guild_makemember (&m, sd); + intif_guild_addmember (sd->guild_invite, &m); + return 0; + } + else + { // 拒否 + sd->guild_invite = 0; + sd->guild_invite_account = 0; + if (tsd == NULL) + return 0; + clif_guild_inviteack (tsd, 1); + } + return 0; } + // ギルドメンバが追加された -int guild_member_added(int guild_id,int account_id,int char_id,int flag) +int guild_member_added (int guild_id, int account_id, int char_id, int flag) { - struct map_session_data *sd= map_id2sd(account_id),*sd2; - struct guild *g; + struct map_session_data *sd = map_id2sd (account_id), *sd2; + struct guild *g; - if( (g=guild_search(guild_id))==NULL ) - return 0; + if ((g = guild_search (guild_id)) == NULL) + return 0; - if((sd==NULL || sd->guild_invite==0) && flag==0){ - // キャラ側に登録できなかったため脱退要求を出す - if(battle_config.error_log) - printf("guild: member added error %d is not online\n",account_id); - intif_guild_leave(guild_id,account_id,char_id,0,"**登録失敗**"); - return 0; - } - sd->guild_invite=0; - sd->guild_invite_account=0; + if ((sd == NULL || sd->guild_invite == 0) && flag == 0) + { + // キャラ側に登録できなかったため脱退要求を出す + if (battle_config.error_log) + printf ("guild: member added error %d is not online\n", + account_id); + intif_guild_leave (guild_id, account_id, char_id, 0, "**登録失敗**"); + return 0; + } + sd->guild_invite = 0; + sd->guild_invite_account = 0; - sd2=map_id2sd(sd->guild_invite_account); + sd2 = map_id2sd (sd->guild_invite_account); - if(flag==1){ // 失敗 - if( sd2!=NULL ) - clif_guild_inviteack(sd2,3); - return 0; - } + if (flag == 1) + { // 失敗 + if (sd2 != NULL) + clif_guild_inviteack (sd2, 3); + return 0; + } - // 成功 - sd->guild_sended=0; - sd->status.guild_id=guild_id; + // 成功 + sd->guild_sended = 0; + sd->status.guild_id = guild_id; - if( sd2!=NULL ) - clif_guild_inviteack(sd2,2); + if (sd2 != NULL) + clif_guild_inviteack (sd2, 2); - // いちおう競合確認 - guild_check_conflict(sd); + // いちおう競合確認 + guild_check_conflict (sd); - return 0; + return 0; } // ギルド脱退要求 -int guild_leave(struct map_session_data *sd,int guild_id, - int account_id,int char_id,const char *mes) +int guild_leave (struct map_session_data *sd, int guild_id, + int account_id, int char_id, const char *mes) { - struct guild *g; - int i; + struct guild *g; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - g = guild_search(sd->status.guild_id); + g = guild_search (sd->status.guild_id); - if(g==NULL) - return 0; + if (g == NULL) + return 0; - if( sd->status.account_id!=account_id || - sd->status.char_id!=char_id || sd->status.guild_id!=guild_id) - return 0; + if (sd->status.account_id != account_id || + sd->status.char_id != char_id || sd->status.guild_id != guild_id) + return 0; - for(i=0;i<g->max_member;i++){ // 所属しているか - if( g->member[i].account_id==sd->status.account_id && - g->member[i].char_id==sd->status.char_id ){ - intif_guild_leave(g->guild_id,sd->status.account_id,sd->status.char_id,0,mes); - return 0; - } - } - return 0; + for (i = 0; i < g->max_member; i++) + { // 所属しているか + if (g->member[i].account_id == sd->status.account_id && + g->member[i].char_id == sd->status.char_id) + { + intif_guild_leave (g->guild_id, sd->status.account_id, + sd->status.char_id, 0, mes); + return 0; + } + } + return 0; } + // ギルド追放要求 -int guild_explusion(struct map_session_data *sd,int guild_id, - int account_id,int char_id,const char *mes) +int guild_explusion (struct map_session_data *sd, int guild_id, + int account_id, int char_id, const char *mes) { - struct guild *g; - int i,ps; + struct guild *g; + int i, ps; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - g = guild_search(sd->status.guild_id); + g = guild_search (sd->status.guild_id); - if(g==NULL) - return 0; + if (g == NULL) + return 0; - if( sd->status.guild_id!=guild_id) - return 0; + if (sd->status.guild_id != guild_id) + return 0; - if( (ps=guild_getposition(sd,g))<0 || !(g->position[ps].mode&0x0010) ) - return 0; // 処罰権限無し + if ((ps = guild_getposition (sd, g)) < 0 + || !(g->position[ps].mode & 0x0010)) + return 0; // 処罰権限無し - for(i=0;i<g->max_member;i++){ // 所属しているか - if( g->member[i].account_id==account_id && - g->member[i].char_id==char_id ){ - intif_guild_leave(g->guild_id,account_id,char_id,1,mes); - return 0; - } - } - return 0; + for (i = 0; i < g->max_member; i++) + { // 所属しているか + if (g->member[i].account_id == account_id && + g->member[i].char_id == char_id) + { + intif_guild_leave (g->guild_id, account_id, char_id, 1, mes); + return 0; + } + } + return 0; } + // ギルドメンバが脱退した -int guild_member_leaved(int guild_id,int account_id,int char_id,int flag, - const char *name,const char *mes) -{ - struct map_session_data *sd=map_id2sd(account_id); - struct guild *g=guild_search(guild_id); - int i; - - if(g!=NULL){ - int i; - for(i=0;i<g->max_member;i++) - if( g->member[i].account_id==account_id && - g->member[i].char_id==char_id ){ - struct map_session_data *sd2=sd; - if(sd2==NULL) - sd2=guild_getavailablesd(g); - else - { - if(flag==0) - clif_guild_leave(sd2,name,mes); - else - clif_guild_explusion(sd2,name,mes,account_id); - } - g->member[i].account_id=0; - g->member[i].sd=NULL; - } - } - if(sd!=NULL && sd->status.guild_id==guild_id){ - if (sd->state.storage_flag == 2) //Close the guild storage. - storage_guild_storageclose(sd); - sd->status.guild_id=0; - sd->guild_emblem_id=0; - sd->guild_sended=0; - } - - // メンバーリストを全員に再通知 - for(i=0;i<g->max_member;i++){ - if( g->member[i].sd!=NULL ) - clif_guild_memberlist(g->member[i].sd); - } - - return 0; +int guild_member_leaved (int guild_id, int account_id, int char_id, int flag, + const char *name, const char *mes) +{ + struct map_session_data *sd = map_id2sd (account_id); + struct guild *g = guild_search (guild_id); + int i; + + if (g != NULL) + { + int i; + for (i = 0; i < g->max_member; i++) + if (g->member[i].account_id == account_id && + g->member[i].char_id == char_id) + { + struct map_session_data *sd2 = sd; + if (sd2 == NULL) + sd2 = guild_getavailablesd (g); + else + { + if (flag == 0) + clif_guild_leave (sd2, name, mes); + else + clif_guild_explusion (sd2, name, mes, account_id); + } + g->member[i].account_id = 0; + g->member[i].sd = NULL; + } + } + if (sd != NULL && sd->status.guild_id == guild_id) + { + if (sd->state.storage_flag == 2) //Close the guild storage. + storage_guild_storageclose (sd); + sd->status.guild_id = 0; + sd->guild_emblem_id = 0; + sd->guild_sended = 0; + } + + // メンバーリストを全員に再通知 + for (i = 0; i < g->max_member; i++) + { + if (g->member[i].sd != NULL) + clif_guild_memberlist (g->member[i].sd); + } + + return 0; } + // ギルドメンバのオンライン状態/Lv更新送信 -int guild_send_memberinfoshort(struct map_session_data *sd,int online) -{ - struct guild *g; - - nullpo_retr(0, sd); - - if(sd->status.guild_id<=0) - return 0; - g=guild_search(sd->status.guild_id); - if(g==NULL) - return 0; - - intif_guild_memberinfoshort(g->guild_id, - sd->status.account_id,sd->status.char_id,online,sd->status.base_level,sd->status.class); - - if( !online ){ // ログアウトするならsdをクリアして終了 - int i=guild_getindex(g,sd->status.account_id,sd->status.char_id); - if(i>=0) - g->member[i].sd=NULL; - return 0; - } - - if( sd->guild_sended!=0 ) // ギルド初期送信データは送信済み - return 0; - - // 競合確認 - guild_check_conflict(sd); - - // あるならギルド初期送信データ送信 - if( (g=guild_search(sd->status.guild_id))!=NULL ){ - guild_check_member(g); // 所属を確認する - if(sd->status.guild_id==g->guild_id){ - clif_guild_belonginfo(sd,g); - clif_guild_notice(sd,g); - sd->guild_sended=1; - sd->guild_emblem_id=g->emblem_id; - } - } - return 0; +int guild_send_memberinfoshort (struct map_session_data *sd, int online) +{ + struct guild *g; + + nullpo_retr (0, sd); + + if (sd->status.guild_id <= 0) + return 0; + g = guild_search (sd->status.guild_id); + if (g == NULL) + return 0; + + intif_guild_memberinfoshort (g->guild_id, + sd->status.account_id, sd->status.char_id, + online, sd->status.base_level, + sd->status.class); + + if (!online) + { // ログアウトするならsdをクリアして終了 + int i = + guild_getindex (g, sd->status.account_id, sd->status.char_id); + if (i >= 0) + g->member[i].sd = NULL; + return 0; + } + + if (sd->guild_sended != 0) // ギルド初期送信データは送信済み + return 0; + + // 競合確認 + guild_check_conflict (sd); + + // あるならギルド初期送信データ送信 + if ((g = guild_search (sd->status.guild_id)) != NULL) + { + guild_check_member (g); // 所属を確認する + if (sd->status.guild_id == g->guild_id) + { + clif_guild_belonginfo (sd, g); + clif_guild_notice (sd, g); + sd->guild_sended = 1; + sd->guild_emblem_id = g->emblem_id; + } + } + return 0; } + // ギルドメンバのオンライン状態/Lv更新通知 -int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class) -{ - int i,alv,c,idx=0,om=0,oldonline=-1; - struct guild *g=guild_search(guild_id); - if(g==NULL) - return 0; - for(i=0,alv=0,c=0,om=0;i<g->max_member;i++){ - struct guild_member *m=&g->member[i]; - if(m->account_id==account_id && m->char_id==char_id ){ - oldonline=m->online; - m->online=online; - m->lv=lv; - m->class=class; - idx=i; - } - if(m->account_id>0){ - alv+=m->lv; - c++; - } - if(m->online) - om++; - } - if(idx==g->max_member){ - if(battle_config.error_log) - printf("guild: not found member %d,%d on %d[%s]\n", account_id,char_id,guild_id,g->name); - return 0; - } - g->average_lv=alv/c; - g->connect_member=om; - - if(oldonline!=online) // オンライン状態が変わったので通知 - clif_guild_memberlogin_notice(g,idx,online); - - for(i=0;i<g->max_member;i++){ // sd再設定 - struct map_session_data *sd= map_id2sd(g->member[i].account_id); - g->member[i].sd=(sd!=NULL && - sd->status.char_id==g->member[i].char_id && - sd->status.guild_id==guild_id)?sd:NULL; - } - - // ここにクライアントに送信処理が必要 - - return 0; +int guild_recv_memberinfoshort (int guild_id, int account_id, int char_id, + int online, int lv, int class) +{ + int i, alv, c, idx = 0, om = 0, oldonline = -1; + struct guild *g = guild_search (guild_id); + if (g == NULL) + return 0; + for (i = 0, alv = 0, c = 0, om = 0; i < g->max_member; i++) + { + struct guild_member *m = &g->member[i]; + if (m->account_id == account_id && m->char_id == char_id) + { + oldonline = m->online; + m->online = online; + m->lv = lv; + m->class = class; + idx = i; + } + if (m->account_id > 0) + { + alv += m->lv; + c++; + } + if (m->online) + om++; + } + if (idx == g->max_member) + { + if (battle_config.error_log) + printf ("guild: not found member %d,%d on %d[%s]\n", account_id, + char_id, guild_id, g->name); + return 0; + } + g->average_lv = alv / c; + g->connect_member = om; + + if (oldonline != online) // オンライン状態が変わったので通知 + clif_guild_memberlogin_notice (g, idx, online); + + for (i = 0; i < g->max_member; i++) + { // sd再設定 + struct map_session_data *sd = map_id2sd (g->member[i].account_id); + g->member[i].sd = (sd != NULL && + sd->status.char_id == g->member[i].char_id && + sd->status.guild_id == guild_id) ? sd : NULL; + } + + // ここにクライアントに送信処理が必要 + + return 0; } + // ギルド会話送信 -int guild_send_message(struct map_session_data *sd,char *mes,int len) +int guild_send_message (struct map_session_data *sd, char *mes, int len) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->status.guild_id==0) - return 0; - intif_guild_message(sd->status.guild_id,sd->status.account_id,mes,len); - return 0; + if (sd->status.guild_id == 0) + return 0; + intif_guild_message (sd->status.guild_id, sd->status.account_id, mes, + len); + return 0; } + // ギルド会話受信 -int guild_recv_message(int guild_id,int account_id,char *mes,int len) +int guild_recv_message (int guild_id, int account_id, char *mes, int len) { - struct guild *g; - if( (g=guild_search(guild_id))==NULL) - return 0; - clif_guild_message(g,account_id,mes,len); - return 0; + struct guild *g; + if ((g = guild_search (guild_id)) == NULL) + return 0; + clif_guild_message (g, account_id, mes, len); + return 0; } + // ギルドメンバの役職変更 -int guild_change_memberposition(int guild_id,int account_id,int char_id,int idx) +int guild_change_memberposition (int guild_id, int account_id, int char_id, + int idx) { - return intif_guild_change_memberinfo( - guild_id,account_id,char_id,GMI_POSITION,&idx,sizeof(idx)); + return intif_guild_change_memberinfo (guild_id, account_id, char_id, + GMI_POSITION, &idx, sizeof (idx)); } + // ギルドメンバの役職変更通知 -int guild_memberposition_changed(struct guild *g,int idx,int pos) +int guild_memberposition_changed (struct guild *g, int idx, int pos) { - nullpo_retr(0, g); + nullpo_retr (0, g); - g->member[idx].position=pos; - clif_guild_memberpositionchanged(g,idx); - return 0; + g->member[idx].position = pos; + clif_guild_memberpositionchanged (g, idx); + return 0; } + // ギルド役職変更 -int guild_change_position(struct map_session_data *sd,int idx, - int mode,int exp_mode,const char *name) +int guild_change_position (struct map_session_data *sd, int idx, + int mode, int exp_mode, const char *name) { - struct guild_position p; + struct guild_position p; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(exp_mode>battle_config.guild_exp_limit) - exp_mode=battle_config.guild_exp_limit; - if(exp_mode<0)exp_mode=0; - p.mode=mode; - p.exp_mode=exp_mode; - memcpy(p.name,name,24); - return intif_guild_position(sd->status.guild_id,idx,&p); + if (exp_mode > battle_config.guild_exp_limit) + exp_mode = battle_config.guild_exp_limit; + if (exp_mode < 0) + exp_mode = 0; + p.mode = mode; + p.exp_mode = exp_mode; + memcpy (p.name, name, 24); + return intif_guild_position (sd->status.guild_id, idx, &p); } + // ギルド役職変更通知 -int guild_position_changed(int guild_id,int idx,struct guild_position *p) +int guild_position_changed (int guild_id, int idx, struct guild_position *p) { - struct guild *g=guild_search(guild_id); - if(g==NULL) - return 0; - memcpy(&g->position[idx],p,sizeof(struct guild_position)); - clif_guild_positionchanged(g,idx); - return 0; + struct guild *g = guild_search (guild_id); + if (g == NULL) + return 0; + memcpy (&g->position[idx], p, sizeof (struct guild_position)); + clif_guild_positionchanged (g, idx); + return 0; } + // ギルド告知変更 -int guild_change_notice(struct map_session_data *sd,int guild_id,const char *mes1,const char *mes2) +int guild_change_notice (struct map_session_data *sd, int guild_id, + const char *mes1, const char *mes2) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(guild_id!=sd->status.guild_id) - return 0; - return intif_guild_notice(guild_id,mes1,mes2); + if (guild_id != sd->status.guild_id) + return 0; + return intif_guild_notice (guild_id, mes1, mes2); } + // ギルド告知変更通知 -int guild_notice_changed(int guild_id,const char *mes1,const char *mes2) +int guild_notice_changed (int guild_id, const char *mes1, const char *mes2) { - int i; - struct map_session_data *sd; - struct guild *g=guild_search(guild_id); - if(g==NULL) - return 0; + int i; + struct map_session_data *sd; + struct guild *g = guild_search (guild_id); + if (g == NULL) + return 0; - memcpy(g->mes1,mes1,60); - memcpy(g->mes2,mes2,120); + memcpy (g->mes1, mes1, 60); + memcpy (g->mes2, mes2, 120); - for(i=0;i<g->max_member;i++){ - if((sd=g->member[i].sd)!=NULL) - clif_guild_notice(sd,g); - } - return 0; + for (i = 0; i < g->max_member; i++) + { + if ((sd = g->member[i].sd) != NULL) + clif_guild_notice (sd, g); + } + return 0; } + // ギルドエンブレム変更 -int guild_change_emblem(struct map_session_data *sd,int len,const char *data) +int guild_change_emblem (struct map_session_data *sd, int len, + const char *data) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - return intif_guild_emblem(sd->status.guild_id,len,data); + return intif_guild_emblem (sd->status.guild_id, len, data); } + // ギルドエンブレム変更通知 -int guild_emblem_changed(int len,int guild_id,int emblem_id,const char *data) +int guild_emblem_changed (int len, int guild_id, int emblem_id, + const char *data) { - int i; - struct map_session_data *sd; - struct guild *g=guild_search(guild_id); - if(g==NULL) - return 0; - - memcpy(g->emblem_data,data,len); - g->emblem_len=len; - g->emblem_id=emblem_id; - - for(i=0;i<g->max_member;i++){ - if((sd=g->member[i].sd)!=NULL){ - sd->guild_emblem_id=emblem_id; - clif_guild_belonginfo(sd,g); - clif_guild_emblem(sd,g); - } - } - return 0; + int i; + struct map_session_data *sd; + struct guild *g = guild_search (guild_id); + if (g == NULL) + return 0; + + memcpy (g->emblem_data, data, len); + g->emblem_len = len; + g->emblem_id = emblem_id; + + for (i = 0; i < g->max_member; i++) + { + if ((sd = g->member[i].sd) != NULL) + { + sd->guild_emblem_id = emblem_id; + clif_guild_belonginfo (sd, g); + clif_guild_emblem (sd, g); + } + } + return 0; } // ギルドのEXP上納 -int guild_payexp(struct map_session_data *sd,int exp) +int guild_payexp (struct map_session_data *sd, int exp) { - struct guild *g; - struct guild_expcache *c; - int per,exp2; - - nullpo_retr(0, sd); - - if(sd->status.guild_id==0 || (g=guild_search(sd->status.guild_id))==NULL ) - return 0; - if( (per=g->position[guild_getposition(sd,g)].exp_mode)<=0 ) - return 0; - if( per>100 )per=100; - - if( (exp2=exp*per/100)<=0 ) - return 0; - - if( (c=numdb_search(guild_expcache_db,sd->status.char_id))==NULL ){ - c=(struct guild_expcache *)aCalloc(1,sizeof(struct guild_expcache)); - c->guild_id=sd->status.guild_id; - c->account_id=sd->status.account_id; - c->char_id=sd->status.char_id; - c->exp=exp2; - numdb_insert(guild_expcache_db,c->char_id,c); - }else{ - c->exp+=exp2; - } - return exp2; + struct guild *g; + struct guild_expcache *c; + int per, exp2; + + nullpo_retr (0, sd); + + if (sd->status.guild_id == 0 + || (g = guild_search (sd->status.guild_id)) == NULL) + return 0; + if ((per = g->position[guild_getposition (sd, g)].exp_mode) <= 0) + return 0; + if (per > 100) + per = 100; + + if ((exp2 = exp * per / 100) <= 0) + return 0; + + if ((c = numdb_search (guild_expcache_db, sd->status.char_id)) == NULL) + { + c = (struct guild_expcache *) aCalloc (1, + sizeof (struct + guild_expcache)); + c->guild_id = sd->status.guild_id; + c->account_id = sd->status.account_id; + c->char_id = sd->status.char_id; + c->exp = exp2; + numdb_insert (guild_expcache_db, c->char_id, c); + } + else + { + c->exp += exp2; + } + return exp2; } // スキルポイント割り振り -int guild_skillup(struct map_session_data *sd,int skill_num) +int guild_skillup (struct map_session_data *sd, int skill_num) { - struct guild *g; - int idx; + struct guild *g; + int idx; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->status.guild_id==0 || (g=guild_search(sd->status.guild_id))==NULL) - return 0; - if(strcmp(sd->status.name,g->master)) - return 0; + if (sd->status.guild_id == 0 + || (g = guild_search (sd->status.guild_id)) == NULL) + return 0; + if (strcmp (sd->status.name, g->master)) + return 0; - if( g->skill_point>0 && - g->skill[(idx=skill_num-10000)].id!=0 && - g->skill[idx].lv < guild_skill_get_max(skill_num) ){ - intif_guild_skillup(g->guild_id,skill_num,sd->status.account_id); - } - return 0; + if (g->skill_point > 0 && + g->skill[(idx = skill_num - 10000)].id != 0 && + g->skill[idx].lv < guild_skill_get_max (skill_num)) + { + intif_guild_skillup (g->guild_id, skill_num, sd->status.account_id); + } + return 0; } + // スキルポイント割り振り通知 -int guild_skillupack(int guild_id,int skill_num,int account_id) -{ - struct map_session_data *sd=map_id2sd(account_id); - struct guild *g=guild_search(guild_id); - int i; - if(g==NULL) - return 0; - if(sd!=NULL) - clif_guild_skillup(sd,skill_num,g->skill[skill_num-10000].lv); - // 全員に通知 - for(i=0;i<g->max_member;i++) - if((sd=g->member[i].sd)!=NULL) - clif_guild_skillinfo(sd); - return 0; +int guild_skillupack (int guild_id, int skill_num, int account_id) +{ + struct map_session_data *sd = map_id2sd (account_id); + struct guild *g = guild_search (guild_id); + int i; + if (g == NULL) + return 0; + if (sd != NULL) + clif_guild_skillup (sd, skill_num, g->skill[skill_num - 10000].lv); + // 全員に通知 + for (i = 0; i < g->max_member; i++) + if ((sd = g->member[i].sd) != NULL) + clif_guild_skillinfo (sd); + return 0; } // ギルド同盟数所得 -int guild_get_alliance_count(struct guild *g,int flag) +int guild_get_alliance_count (struct guild *g, int flag) { - int i,c; + int i, c; - nullpo_retr(0, g); + nullpo_retr (0, g); - for(i=c=0;i<MAX_GUILDALLIANCE;i++){ - if( g->alliance[i].guild_id>0 && - g->alliance[i].opposition==flag ) - c++; - } - return c; + for (i = c = 0; i < MAX_GUILDALLIANCE; i++) + { + if (g->alliance[i].guild_id > 0 && g->alliance[i].opposition == flag) + c++; + } + return c; } + // ギルド同盟要求 -int guild_reqalliance(struct map_session_data *sd,int account_id) +int guild_reqalliance (struct map_session_data *sd, int account_id) { - struct map_session_data *tsd= map_id2sd(account_id); - struct guild *g[2]; - int i; + struct map_session_data *tsd = map_id2sd (account_id); + struct guild *g[2]; + int i; - if(agit_flag) { // Disable alliance creation during woe [Valaris] - clif_displaymessage(sd->fd,"Alliances cannot be made during Guild Wars!"); - return 0; - } // end addition [Valaris] + if (agit_flag) + { // Disable alliance creation during woe [Valaris] + clif_displaymessage (sd->fd, + "Alliances cannot be made during Guild Wars!"); + return 0; + } // end addition [Valaris] + nullpo_retr (0, sd); - nullpo_retr(0, sd); + if (tsd == NULL || tsd->status.guild_id <= 0) + return 0; - if(tsd==NULL || tsd->status.guild_id<=0) - return 0; + g[0] = guild_search (sd->status.guild_id); + g[1] = guild_search (tsd->status.guild_id); - g[0]=guild_search(sd->status.guild_id); - g[1]=guild_search(tsd->status.guild_id); + if (g[0] == NULL || g[1] == NULL) + return 0; - if(g[0]==NULL || g[1]==NULL) - return 0; + if (guild_get_alliance_count (g[0], 0) > 3) // 同盟数確認 + clif_guild_allianceack (sd, 4); + if (guild_get_alliance_count (g[1], 0) > 3) + clif_guild_allianceack (sd, 3); - if( guild_get_alliance_count(g[0],0)>3 ) // 同盟数確認 - clif_guild_allianceack(sd,4); - if( guild_get_alliance_count(g[1],0)>3 ) - clif_guild_allianceack(sd,3); + if (tsd->guild_alliance > 0) + { // 相手が同盟要請状態かどうか確認 + clif_guild_allianceack (sd, 1); + return 0; + } - if( tsd->guild_alliance>0 ){ // 相手が同盟要請状態かどうか確認 - clif_guild_allianceack(sd,1); - return 0; - } + for (i = 0; i < MAX_GUILDALLIANCE; i++) + { // すでに同盟状態か確認 + if (g[0]->alliance[i].guild_id == tsd->status.guild_id && + g[0]->alliance[i].opposition == 0) + { + clif_guild_allianceack (sd, 0); + return 0; + } + } - for(i=0;i<MAX_GUILDALLIANCE;i++){ // すでに同盟状態か確認 - if( g[0]->alliance[i].guild_id==tsd->status.guild_id && - g[0]->alliance[i].opposition==0){ - clif_guild_allianceack(sd,0); - return 0; - } - } + tsd->guild_alliance = sd->status.guild_id; + tsd->guild_alliance_account = sd->status.account_id; - tsd->guild_alliance=sd->status.guild_id; - tsd->guild_alliance_account=sd->status.account_id; - - clif_guild_reqalliance(tsd,sd->status.account_id,g[0]->name); - return 0; + clif_guild_reqalliance (tsd, sd->status.account_id, g[0]->name); + return 0; } + // ギルド勧誘への返答 -int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag) -{ - struct map_session_data *tsd; - - nullpo_retr(0, sd); - nullpo_retr(0, tsd= map_id2sd( account_id )); - - if(sd->guild_alliance!=tsd->status.guild_id) // 勧誘とギルドIDが違う - return 0; - - if(flag==1){ // 承諾 - int i; - - struct guild *g; // 同盟数再確認 - if( (g=guild_search(sd->status.guild_id))==NULL || - guild_get_alliance_count(g,0)>3 ){ - clif_guild_allianceack(sd,4); - clif_guild_allianceack(tsd,3); - return 0; - } - if( (g=guild_search(tsd->status.guild_id))==NULL || - guild_get_alliance_count(g,0)>3 ){ - clif_guild_allianceack(sd,3); - clif_guild_allianceack(tsd,4); - return 0; - } - - // 敵対関係なら敵対を止める - if((g=guild_search(sd->status.guild_id)) == NULL) - return 0; - for(i=0;i<MAX_GUILDALLIANCE;i++){ - if( g->alliance[i].guild_id==tsd->status.guild_id && - g->alliance[i].opposition==1) - intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id, - sd->status.account_id,tsd->status.account_id,9 ); - } - if((g=guild_search(tsd->status.guild_id)) == NULL) - return 0; - for(i=0;i<MAX_GUILDALLIANCE;i++){ - if( g->alliance[i].guild_id==sd->status.guild_id && - g->alliance[i].opposition==1) - intif_guild_alliance( tsd->status.guild_id,sd->status.guild_id, - tsd->status.account_id,sd->status.account_id,9 ); - } - - // inter鯖へ同盟要請 - intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id, - sd->status.account_id,tsd->status.account_id,0 ); - return 0; - }else{ // 拒否 - sd->guild_alliance=0; - sd->guild_alliance_account=0; - if(tsd!=NULL) - clif_guild_allianceack(tsd,3); - } - return 0; +int guild_reply_reqalliance (struct map_session_data *sd, int account_id, + int flag) +{ + struct map_session_data *tsd; + + nullpo_retr (0, sd); + nullpo_retr (0, tsd = map_id2sd (account_id)); + + if (sd->guild_alliance != tsd->status.guild_id) // 勧誘とギルドIDが違う + return 0; + + if (flag == 1) + { // 承諾 + int i; + + struct guild *g; // 同盟数再確認 + if ((g = guild_search (sd->status.guild_id)) == NULL || + guild_get_alliance_count (g, 0) > 3) + { + clif_guild_allianceack (sd, 4); + clif_guild_allianceack (tsd, 3); + return 0; + } + if ((g = guild_search (tsd->status.guild_id)) == NULL || + guild_get_alliance_count (g, 0) > 3) + { + clif_guild_allianceack (sd, 3); + clif_guild_allianceack (tsd, 4); + return 0; + } + + // 敵対関係なら敵対を止める + if ((g = guild_search (sd->status.guild_id)) == NULL) + return 0; + for (i = 0; i < MAX_GUILDALLIANCE; i++) + { + if (g->alliance[i].guild_id == tsd->status.guild_id && + g->alliance[i].opposition == 1) + intif_guild_alliance (sd->status.guild_id, + tsd->status.guild_id, + sd->status.account_id, + tsd->status.account_id, 9); + } + if ((g = guild_search (tsd->status.guild_id)) == NULL) + return 0; + for (i = 0; i < MAX_GUILDALLIANCE; i++) + { + if (g->alliance[i].guild_id == sd->status.guild_id && + g->alliance[i].opposition == 1) + intif_guild_alliance (tsd->status.guild_id, + sd->status.guild_id, + tsd->status.account_id, + sd->status.account_id, 9); + } + + // inter鯖へ同盟要請 + intif_guild_alliance (sd->status.guild_id, tsd->status.guild_id, + sd->status.account_id, tsd->status.account_id, + 0); + return 0; + } + else + { // 拒否 + sd->guild_alliance = 0; + sd->guild_alliance_account = 0; + if (tsd != NULL) + clif_guild_allianceack (tsd, 3); + } + return 0; } + // ギルド関係解消 -int guild_delalliance(struct map_session_data *sd,int guild_id,int flag) +int guild_delalliance (struct map_session_data *sd, int guild_id, int flag) { - if(agit_flag) { // Disable alliance breaking during woe [Valaris] - clif_displaymessage(sd->fd,"Alliances cannot be broken during Guild Wars!"); - return 0; - } // end addition [Valaris] + if (agit_flag) + { // Disable alliance breaking during woe [Valaris] + clif_displaymessage (sd->fd, + "Alliances cannot be broken during Guild Wars!"); + return 0; + } // end addition [Valaris] - nullpo_retr(0, sd); + nullpo_retr (0, sd); - intif_guild_alliance( sd->status.guild_id,guild_id, - sd->status.account_id,0,flag|8 ); - return 0; + intif_guild_alliance (sd->status.guild_id, guild_id, + sd->status.account_id, 0, flag | 8); + return 0; } + // ギルド敵対 -int guild_opposition(struct map_session_data *sd,int char_id) +int guild_opposition (struct map_session_data *sd, int char_id) { - struct map_session_data *tsd=map_id2sd(char_id); - struct guild *g; - int i; - - nullpo_retr(0, sd); - - g=guild_search(sd->status.guild_id); - if(g==NULL || tsd==NULL) - return 0; - - if( guild_get_alliance_count(g,1)>3 ) // 敵対数確認 - clif_guild_oppositionack(sd,1); - - for(i=0;i<MAX_GUILDALLIANCE;i++){ // すでに関係を持っているか確認 - if(g->alliance[i].guild_id==tsd->status.guild_id){ - if(g->alliance[i].opposition==1){ // すでに敵対 - clif_guild_oppositionack(sd,2); - return 0; - }else // 同盟破棄 - intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id, - sd->status.account_id,tsd->status.account_id,8 ); - } - } - - // inter鯖に敵対要請 - intif_guild_alliance( sd->status.guild_id,tsd->status.guild_id, - sd->status.account_id,tsd->status.account_id,1 ); - return 0; + struct map_session_data *tsd = map_id2sd (char_id); + struct guild *g; + int i; + + nullpo_retr (0, sd); + + g = guild_search (sd->status.guild_id); + if (g == NULL || tsd == NULL) + return 0; + + if (guild_get_alliance_count (g, 1) > 3) // 敵対数確認 + clif_guild_oppositionack (sd, 1); + + for (i = 0; i < MAX_GUILDALLIANCE; i++) + { // すでに関係を持っているか確認 + if (g->alliance[i].guild_id == tsd->status.guild_id) + { + if (g->alliance[i].opposition == 1) + { // すでに敵対 + clif_guild_oppositionack (sd, 2); + return 0; + } + else // 同盟破棄 + intif_guild_alliance (sd->status.guild_id, + tsd->status.guild_id, + sd->status.account_id, + tsd->status.account_id, 8); + } + } + + // inter鯖に敵対要請 + intif_guild_alliance (sd->status.guild_id, tsd->status.guild_id, + sd->status.account_id, tsd->status.account_id, 1); + return 0; } + // ギルド同盟/敵対通知 -int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id2, - int flag,const char *name1,const char *name2) -{ - struct guild *g[2]; - int guild_id[2]={guild_id1,guild_id2}; - const char *guild_name[2]={name1,name2}; - struct map_session_data *sd[2]={map_id2sd(account_id1),map_id2sd(account_id2)}; - int j,i; - - g[0]=guild_search(guild_id1); - g[1]=guild_search(guild_id2); - - if(sd[0]!=NULL && (flag&0x0f)==0){ - sd[0]->guild_alliance=0; - sd[0]->guild_alliance_account=0; - } - - if(flag&0x70){ // 失敗 - for(i=0;i<2-(flag&1);i++) - if( sd[i]!=NULL ) - clif_guild_allianceack(sd[i],((flag>>4)==i+1)?3:4); - return 0; - } -// if(battle_config.etc_log) -// printf("guild alliance_ack %d %d %d %d %d %s %s\n",guild_id1,guild_id2,account_id1,account_id2,flag,name1,name2); - - if(!(flag&0x08)){ // 関係追加 - for(i=0;i<2-(flag&1);i++) - if(g[i]!=NULL) - for(j=0;j<MAX_GUILDALLIANCE;j++) - if(g[i]->alliance[j].guild_id==0){ - g[i]->alliance[j].guild_id=guild_id[1-i]; - memcpy(g[i]->alliance[j].name,guild_name[1-i],24); - g[i]->alliance[j].opposition=flag&1; - break; - } - }else{ // 関係解消 - for(i=0;i<2-(flag&1);i++){ - if(g[i]!=NULL) - for(j=0;j<MAX_GUILDALLIANCE;j++) - if( g[i]->alliance[j].guild_id==guild_id[1-i] && - g[i]->alliance[j].opposition==(flag&1)){ - g[i]->alliance[j].guild_id=0; - break; - } - if( sd[i]!=NULL ) // 解消通知 - clif_guild_delalliance(sd[i],guild_id[1-i],(flag&1)); - } - } - - if((flag&0x0f)==0){ // 同盟通知 - if( sd[1]!=NULL ) - clif_guild_allianceack(sd[1],2); - }else if((flag&0x0f)==1){ // 敵対通知 - if( sd[0]!=NULL ) - clif_guild_oppositionack(sd[0],0); - } - - - for(i=0;i<2-(flag&1);i++){ // 同盟/敵対リストの再送信 - struct map_session_data *sd; - if(g[i]!=NULL) - for(j=0;j<g[i]->max_member;j++) - if((sd=g[i]->member[j].sd)!=NULL) - clif_guild_allianceinfo(sd); - } - return 0; +int guild_allianceack (int guild_id1, int guild_id2, int account_id1, + int account_id2, int flag, const char *name1, + const char *name2) +{ + struct guild *g[2]; + int guild_id[2] = { guild_id1, guild_id2 }; + const char *guild_name[2] = { name1, name2 }; + struct map_session_data *sd[2] = + { map_id2sd (account_id1), map_id2sd (account_id2) }; + int j, i; + + g[0] = guild_search (guild_id1); + g[1] = guild_search (guild_id2); + + if (sd[0] != NULL && (flag & 0x0f) == 0) + { + sd[0]->guild_alliance = 0; + sd[0]->guild_alliance_account = 0; + } + + if (flag & 0x70) + { // 失敗 + for (i = 0; i < 2 - (flag & 1); i++) + if (sd[i] != NULL) + clif_guild_allianceack (sd[i], + ((flag >> 4) == i + 1) ? 3 : 4); + return 0; + } +// if(battle_config.etc_log) +// printf("guild alliance_ack %d %d %d %d %d %s %s\n",guild_id1,guild_id2,account_id1,account_id2,flag,name1,name2); + + if (!(flag & 0x08)) + { // 関係追加 + for (i = 0; i < 2 - (flag & 1); i++) + if (g[i] != NULL) + for (j = 0; j < MAX_GUILDALLIANCE; j++) + if (g[i]->alliance[j].guild_id == 0) + { + g[i]->alliance[j].guild_id = guild_id[1 - i]; + memcpy (g[i]->alliance[j].name, guild_name[1 - i], + 24); + g[i]->alliance[j].opposition = flag & 1; + break; + } + } + else + { // 関係解消 + for (i = 0; i < 2 - (flag & 1); i++) + { + if (g[i] != NULL) + for (j = 0; j < MAX_GUILDALLIANCE; j++) + if (g[i]->alliance[j].guild_id == guild_id[1 - i] && + g[i]->alliance[j].opposition == (flag & 1)) + { + g[i]->alliance[j].guild_id = 0; + break; + } + if (sd[i] != NULL) // 解消通知 + clif_guild_delalliance (sd[i], guild_id[1 - i], (flag & 1)); + } + } + + if ((flag & 0x0f) == 0) + { // 同盟通知 + if (sd[1] != NULL) + clif_guild_allianceack (sd[1], 2); + } + else if ((flag & 0x0f) == 1) + { // 敵対通知 + if (sd[0] != NULL) + clif_guild_oppositionack (sd[0], 0); + } + + for (i = 0; i < 2 - (flag & 1); i++) + { // 同盟/敵対リストの再送信 + struct map_session_data *sd; + if (g[i] != NULL) + for (j = 0; j < g[i]->max_member; j++) + if ((sd = g[i]->member[j].sd) != NULL) + clif_guild_allianceinfo (sd); + } + return 0; } + // ギルド解散通知用 -int guild_broken_sub(void *key,void *data,va_list ap) +int guild_broken_sub (void *key, void *data, va_list ap) { - struct guild *g=(struct guild *)data; - int guild_id=va_arg(ap,int); - int i,j; - struct map_session_data *sd=NULL; - - nullpo_retr(0, g); - - for(i=0;i<MAX_GUILDALLIANCE;i++){ // 関係を破棄 - if(g->alliance[i].guild_id==guild_id){ - for(j=0;j<g->max_member;j++) - if( (sd=g->member[j].sd)!=NULL ) - clif_guild_delalliance(sd,guild_id,g->alliance[i].opposition); - g->alliance[i].guild_id=0; - } - } - return 0; + struct guild *g = (struct guild *) data; + int guild_id = va_arg (ap, int); + int i, j; + struct map_session_data *sd = NULL; + + nullpo_retr (0, g); + + for (i = 0; i < MAX_GUILDALLIANCE; i++) + { // 関係を破棄 + if (g->alliance[i].guild_id == guild_id) + { + for (j = 0; j < g->max_member; j++) + if ((sd = g->member[j].sd) != NULL) + clif_guild_delalliance (sd, guild_id, + g->alliance[i].opposition); + g->alliance[i].guild_id = 0; + } + } + return 0; } + // ギルド解散通知 -int guild_broken(int guild_id,int flag) -{ - struct guild *g=guild_search(guild_id); - struct map_session_data *sd; - int i; - if(flag!=0 || g==NULL) - return 0; - - for(i=0;i<g->max_member;i++){ // ギルド解散を通知 - if((sd=g->member[i].sd)!=NULL){ - if(sd->state.storage_flag == 2) - storage_guild_storage_quit(sd,1); - sd->status.guild_id=0; - sd->guild_sended=0; - clif_guild_broken(g->member[i].sd,0); - } - } - - numdb_foreach(guild_db,guild_broken_sub,guild_id); - numdb_erase(guild_db,guild_id); - guild_storage_delete(guild_id); - free(g); - return 0; +int guild_broken (int guild_id, int flag) +{ + struct guild *g = guild_search (guild_id); + struct map_session_data *sd; + int i; + if (flag != 0 || g == NULL) + return 0; + + for (i = 0; i < g->max_member; i++) + { // ギルド解散を通知 + if ((sd = g->member[i].sd) != NULL) + { + if (sd->state.storage_flag == 2) + storage_guild_storage_quit (sd, 1); + sd->status.guild_id = 0; + sd->guild_sended = 0; + clif_guild_broken (g->member[i].sd, 0); + } + } + + numdb_foreach (guild_db, guild_broken_sub, guild_id); + numdb_erase (guild_db, guild_id); + guild_storage_delete (guild_id); + free (g); + return 0; } // ギルド解散 -int guild_break(struct map_session_data *sd,char *name) -{ - struct guild *g; - int i; - - nullpo_retr(0, sd); - - if( (g=guild_search(sd->status.guild_id))==NULL ) - return 0; - if(strcmp(g->name,name)!=0) - return 0; - if(strcmp(sd->status.name,g->master)!=0) - return 0; - for(i=0;i<g->max_member;i++){ - if( g->member[i].account_id>0 && ( - g->member[i].account_id!=sd->status.account_id || - g->member[i].char_id!=sd->status.char_id )) - break; - } - if(i<g->max_member){ - clif_guild_broken(sd,2); - return 0; - } - - intif_guild_break(g->guild_id); - return 0; +int guild_break (struct map_session_data *sd, char *name) +{ + struct guild *g; + int i; + + nullpo_retr (0, sd); + + if ((g = guild_search (sd->status.guild_id)) == NULL) + return 0; + if (strcmp (g->name, name) != 0) + return 0; + if (strcmp (sd->status.name, g->master) != 0) + return 0; + for (i = 0; i < g->max_member; i++) + { + if (g->member[i].account_id > 0 + && (g->member[i].account_id != sd->status.account_id + || g->member[i].char_id != sd->status.char_id)) + break; + } + if (i < g->max_member) + { + clif_guild_broken (sd, 2); + return 0; + } + + intif_guild_break (g->guild_id); + return 0; } // ギルド城データ要求 -int guild_castledataload(int castle_id,int index) +int guild_castledataload (int castle_id, int index) { - return intif_guild_castle_dataload(castle_id,index); + return intif_guild_castle_dataload (castle_id, index); } + // ギルド城情報所得時イベント追加 -int guild_addcastleinfoevent(int castle_id,int index,const char *name) +int guild_addcastleinfoevent (int castle_id, int index, const char *name) { - struct eventlist *ev; - int code=castle_id|(index<<16); + struct eventlist *ev; + int code = castle_id | (index << 16); - if( name==NULL || *name==0 ) - return 0; + if (name == NULL || *name == 0) + return 0; - ev=(struct eventlist *)aCalloc(1,sizeof(struct eventlist)); - memcpy(ev->name,name,sizeof(ev->name)); - ev->next=numdb_search(guild_castleinfoevent_db,code); - numdb_insert(guild_castleinfoevent_db,code,ev); - return 0; + ev = (struct eventlist *) aCalloc (1, sizeof (struct eventlist)); + memcpy (ev->name, name, sizeof (ev->name)); + ev->next = numdb_search (guild_castleinfoevent_db, code); + numdb_insert (guild_castleinfoevent_db, code, ev); + return 0; } // ギルド城データ要求返信 -int guild_castledataloadack(int castle_id,int index,int value) -{ - struct guild_castle *gc=guild_castle_search(castle_id); - int code=castle_id|(index<<16); - struct eventlist *ev,*ev2; - - if(gc==NULL){ - return 0; - } - switch(index){ - case 1: gc->guild_id = value; break; - case 2: gc->economy = value; break; - case 3: gc->defense = value; break; - case 4: gc->triggerE = value; break; - case 5: gc->triggerD = value; break; - case 6: gc->nextTime = value; break; - case 7: gc->payTime = value; break; - case 8: gc->createTime = value; break; - case 9: gc->visibleC = value; break; - case 10: gc->visibleG0 = value; break; - case 11: gc->visibleG1 = value; break; - case 12: gc->visibleG2 = value; break; - case 13: gc->visibleG3 = value; break; - case 14: gc->visibleG4 = value; break; - case 15: gc->visibleG5 = value; break; - case 16: gc->visibleG6 = value; break; - case 17: gc->visibleG7 = value; break; - case 18: gc->Ghp0 = value; break; // guardian HP [Valaris] - case 19: gc->Ghp1 = value; break; - case 20: gc->Ghp2 = value; break; - case 21: gc->Ghp3 = value; break; - case 22: gc->Ghp4 = value; break; - case 23: gc->Ghp5 = value; break; - case 24: gc->Ghp6 = value; break; - case 25: gc->Ghp7 = value; break; // end additions [Valaris] - default: - printf("guild_castledataloadack ERROR!! (Not found index=%d)\n", index); - return 0; - } - if( (ev=numdb_search(guild_castleinfoevent_db,code))!=NULL ){ - numdb_erase(guild_castleinfoevent_db,code); - for(;ev;ev2=ev->next,free(ev),ev=ev2){ - npc_event_do(ev->name); - } - } - return 1; +int guild_castledataloadack (int castle_id, int index, int value) +{ + struct guild_castle *gc = guild_castle_search (castle_id); + int code = castle_id | (index << 16); + struct eventlist *ev, *ev2; + + if (gc == NULL) + { + return 0; + } + switch (index) + { + case 1: + gc->guild_id = value; + break; + case 2: + gc->economy = value; + break; + case 3: + gc->defense = value; + break; + case 4: + gc->triggerE = value; + break; + case 5: + gc->triggerD = value; + break; + case 6: + gc->nextTime = value; + break; + case 7: + gc->payTime = value; + break; + case 8: + gc->createTime = value; + break; + case 9: + gc->visibleC = value; + break; + case 10: + gc->visibleG0 = value; + break; + case 11: + gc->visibleG1 = value; + break; + case 12: + gc->visibleG2 = value; + break; + case 13: + gc->visibleG3 = value; + break; + case 14: + gc->visibleG4 = value; + break; + case 15: + gc->visibleG5 = value; + break; + case 16: + gc->visibleG6 = value; + break; + case 17: + gc->visibleG7 = value; + break; + case 18: + gc->Ghp0 = value; + break; // guardian HP [Valaris] + case 19: + gc->Ghp1 = value; + break; + case 20: + gc->Ghp2 = value; + break; + case 21: + gc->Ghp3 = value; + break; + case 22: + gc->Ghp4 = value; + break; + case 23: + gc->Ghp5 = value; + break; + case 24: + gc->Ghp6 = value; + break; + case 25: + gc->Ghp7 = value; + break; // end additions [Valaris] + default: + printf ("guild_castledataloadack ERROR!! (Not found index=%d)\n", + index); + return 0; + } + if ((ev = numdb_search (guild_castleinfoevent_db, code)) != NULL) + { + numdb_erase (guild_castleinfoevent_db, code); + for (; ev; ev2 = ev->next, free (ev), ev = ev2) + { + npc_event_do (ev->name); + } + } + return 1; } + // ギルド城データ変更要求 -int guild_castledatasave(int castle_id,int index,int value) +int guild_castledatasave (int castle_id, int index, int value) { - return intif_guild_castle_datasave(castle_id,index,value); + return intif_guild_castle_datasave (castle_id, index, value); } // ギルド城データ変更通知 -int guild_castledatasaveack(int castle_id,int index,int value) -{ - struct guild_castle *gc=guild_castle_search(castle_id); - if(gc==NULL){ - return 0; - } - switch(index){ - case 1: gc->guild_id = value; break; - case 2: gc->economy = value; break; - case 3: gc->defense = value; break; - case 4: gc->triggerE = value; break; - case 5: gc->triggerD = value; break; - case 6: gc->nextTime = value; break; - case 7: gc->payTime = value; break; - case 8: gc->createTime = value; break; - case 9: gc->visibleC = value; break; - case 10: gc->visibleG0 = value; break; - case 11: gc->visibleG1 = value; break; - case 12: gc->visibleG2 = value; break; - case 13: gc->visibleG3 = value; break; - case 14: gc->visibleG4 = value; break; - case 15: gc->visibleG5 = value; break; - case 16: gc->visibleG6 = value; break; - case 17: gc->visibleG7 = value; break; - case 18: gc->Ghp0 = value; break; // guardian HP [Valaris] - case 19: gc->Ghp1 = value; break; - case 20: gc->Ghp2 = value; break; - case 21: gc->Ghp3 = value; break; - case 22: gc->Ghp4 = value; break; - case 23: gc->Ghp5 = value; break; - case 24: gc->Ghp6 = value; break; - case 25: gc->Ghp7 = value; break; // end additions [Valaris] - default: - printf("guild_castledatasaveack ERROR!! (Not found index=%d)\n", index); - return 0; - } - return 1; +int guild_castledatasaveack (int castle_id, int index, int value) +{ + struct guild_castle *gc = guild_castle_search (castle_id); + if (gc == NULL) + { + return 0; + } + switch (index) + { + case 1: + gc->guild_id = value; + break; + case 2: + gc->economy = value; + break; + case 3: + gc->defense = value; + break; + case 4: + gc->triggerE = value; + break; + case 5: + gc->triggerD = value; + break; + case 6: + gc->nextTime = value; + break; + case 7: + gc->payTime = value; + break; + case 8: + gc->createTime = value; + break; + case 9: + gc->visibleC = value; + break; + case 10: + gc->visibleG0 = value; + break; + case 11: + gc->visibleG1 = value; + break; + case 12: + gc->visibleG2 = value; + break; + case 13: + gc->visibleG3 = value; + break; + case 14: + gc->visibleG4 = value; + break; + case 15: + gc->visibleG5 = value; + break; + case 16: + gc->visibleG6 = value; + break; + case 17: + gc->visibleG7 = value; + break; + case 18: + gc->Ghp0 = value; + break; // guardian HP [Valaris] + case 19: + gc->Ghp1 = value; + break; + case 20: + gc->Ghp2 = value; + break; + case 21: + gc->Ghp3 = value; + break; + case 22: + gc->Ghp4 = value; + break; + case 23: + gc->Ghp5 = value; + break; + case 24: + gc->Ghp6 = value; + break; + case 25: + gc->Ghp7 = value; + break; // end additions [Valaris] + default: + printf ("guild_castledatasaveack ERROR!! (Not found index=%d)\n", + index); + return 0; + } + return 1; } // ギルドデータ一括受信(初期化時) -int guild_castlealldataload(int len,struct guild_castle *gc) -{ - int i; - int n = (len-4) / sizeof(struct guild_castle), ev = -1; - - nullpo_retr(0, gc); - - // イベント付きで要求するデータ位置を探す(最後の占拠データ) - for(i = 0; i < n; i++) { - if ((gc + i)->guild_id) - ev = i; - } - - // 城データ格納とギルド情報要求 - for(i = 0; i < n; i++, gc++) { - struct guild_castle *c = guild_castle_search(gc->castle_id); - if (!c) { - printf("guild_castlealldataload ??\n"); - continue; - } - memcpy(&c->guild_id,&gc->guild_id, - sizeof(struct guild_castle) - ((int)&c->guild_id - (int)c) ); - if( c->guild_id ){ - if(i!=ev) - guild_request_info(c->guild_id); - else - guild_npc_request_info(c->guild_id, "::OnAgitInit"); - } - } - if (ev == -1) - npc_event_doall("OnAgitInit"); - return 0; -} - -int guild_agit_start(void) -{ // Run All NPC_Event[OnAgitStart] - int c = npc_event_doall("OnAgitStart"); - printf("NPC_Event:[OnAgitStart] Run (%d) Events by @AgitStart.\n",c); - return 0; -} - -int guild_agit_end(void) -{ // Run All NPC_Event[OnAgitEnd] - int c = npc_event_doall("OnAgitEnd"); - printf("NPC_Event:[OnAgitEnd] Run (%d) Events by @AgitEnd.\n",c); - return 0; -} - -int guild_gvg_eliminate_timer(int tid,unsigned int tick,int id,int data) -{ // Run One NPC_Event[OnAgitEliminate] - size_t len = strlen((const char*)data); - char *evname=(char*)aCalloc(len + 4,sizeof(char)); - int c=0; - - if(!agit_flag) return 0; // Agit already End - memcpy(evname,(const char *)data,len - 5); - strcpy(evname + len - 5,"Eliminate"); - c = npc_event_do(evname); - printf("NPC_Event:[%s] Run (%d) Events.\n",evname,c); - return 0; -} - -int guild_agit_break(struct mob_data *md) -{ // Run One NPC_Event[OnAgitBreak] - char *evname; - - nullpo_retr(0, md); - - evname=(char *)aCalloc(strlen(md->npc_event) + 1, sizeof(char)); - - strcpy(evname,md->npc_event); +int guild_castlealldataload (int len, struct guild_castle *gc) +{ + int i; + int n = (len - 4) / sizeof (struct guild_castle), ev = -1; + + nullpo_retr (0, gc); + + // イベント付きで要求するデータ位置を探す(最後の占拠データ) + for (i = 0; i < n; i++) + { + if ((gc + i)->guild_id) + ev = i; + } + + // 城データ格納とギルド情報要求 + for (i = 0; i < n; i++, gc++) + { + struct guild_castle *c = guild_castle_search (gc->castle_id); + if (!c) + { + printf ("guild_castlealldataload ??\n"); + continue; + } + memcpy (&c->guild_id, &gc->guild_id, + sizeof (struct guild_castle) - ((int) &c->guild_id - + (int) c)); + if (c->guild_id) + { + if (i != ev) + guild_request_info (c->guild_id); + else + guild_npc_request_info (c->guild_id, "::OnAgitInit"); + } + } + if (ev == -1) + npc_event_doall ("OnAgitInit"); + return 0; +} + +int guild_agit_start (void) +{ // Run All NPC_Event[OnAgitStart] + int c = npc_event_doall ("OnAgitStart"); + printf ("NPC_Event:[OnAgitStart] Run (%d) Events by @AgitStart.\n", c); + return 0; +} + +int guild_agit_end (void) +{ // Run All NPC_Event[OnAgitEnd] + int c = npc_event_doall ("OnAgitEnd"); + printf ("NPC_Event:[OnAgitEnd] Run (%d) Events by @AgitEnd.\n", c); + return 0; +} + +int guild_gvg_eliminate_timer (int tid, unsigned int tick, int id, int data) +{ // Run One NPC_Event[OnAgitEliminate] + size_t len = strlen ((const char *) data); + char *evname = (char *) aCalloc (len + 4, sizeof (char)); + int c = 0; + + if (!agit_flag) + return 0; // Agit already End + memcpy (evname, (const char *) data, len - 5); + strcpy (evname + len - 5, "Eliminate"); + c = npc_event_do (evname); + printf ("NPC_Event:[%s] Run (%d) Events.\n", evname, c); + return 0; +} + +int guild_agit_break (struct mob_data *md) +{ // Run One NPC_Event[OnAgitBreak] + char *evname; + + nullpo_retr (0, md); + + evname = (char *) aCalloc (strlen (md->npc_event) + 1, sizeof (char)); + + strcpy (evname, md->npc_event); // Now By User to Run [OnAgitBreak] NPC Event... // It's a little impossible to null point with player disconnect in this! // But Script will be stop, so nothing... // Maybe will be changed in the futher.. // int c = npc_event_do(evname); - if(!agit_flag) return 0; // Agit already End - add_timer(gettick()+battle_config.gvg_eliminate_time,guild_gvg_eliminate_timer,md->bl.m,(int)evname); - return 0; + if (!agit_flag) + return 0; // Agit already End + add_timer (gettick () + battle_config.gvg_eliminate_time, + guild_gvg_eliminate_timer, md->bl.m, (int) evname); + return 0; } // [MouseJstr] // How many castles does this guild have? -int guild_checkcastles(struct guild *g) { - int i,nb_cas=0, id,cas_id=0; - struct guild_castle *gc; - id=g->guild_id; - for(i=0;i<MAX_GUILDCASTLE;i++){ - gc=guild_castle_search(i); - cas_id=gc->guild_id; - if(g->guild_id==cas_id) - nb_cas=nb_cas+1; - } //end for - return nb_cas; +int guild_checkcastles (struct guild *g) +{ + int i, nb_cas = 0, id, cas_id = 0; + struct guild_castle *gc; + id = g->guild_id; + for (i = 0; i < MAX_GUILDCASTLE; i++) + { + gc = guild_castle_search (i); + cas_id = gc->guild_id; + if (g->guild_id == cas_id) + nb_cas = nb_cas + 1; + } //end for + return nb_cas; } // [MouseJstr] // is this guild allied with this castle? -int guild_isallied(struct guild *g, struct guild_castle *gc) +int guild_isallied (struct guild *g, struct guild_castle *gc) { - int i; + int i; - nullpo_retr(0, g); + nullpo_retr (0, g); - if(g->guild_id == gc->guild_id) - return 1; + if (g->guild_id == gc->guild_id) + return 1; - if (gc->guild_id == 0) - return 0; + if (gc->guild_id == 0) + return 0; + for (i = 0; i < MAX_GUILDALLIANCE; i++) + if (g->alliance[i].guild_id == gc->guild_id) + { + if (g->alliance[i].opposition == 0) + return 1; + else + return 0; + } - for(i=0;i<MAX_GUILDALLIANCE;i++) - if(g->alliance[i].guild_id == gc->guild_id) { - if(g->alliance[i].opposition == 0) - return 1; - else - return 0; - } - - return 0; + return 0; } - -static int guild_db_final(void *key,void *data,va_list ap) + +static int guild_db_final (void *key, void *data, va_list ap) { - struct guild *g=data; + struct guild *g = data; - free(g); + free (g); - return 0; + return 0; } -static int castle_db_final(void *key,void *data,va_list ap) + +static int castle_db_final (void *key, void *data, va_list ap) { - struct guild_castle *gc=data; + struct guild_castle *gc = data; - free(gc); + free (gc); - return 0; + return 0; } -static int guild_expcache_db_final(void *key,void *data,va_list ap) + +static int guild_expcache_db_final (void *key, void *data, va_list ap) { - struct guild_expcache *c=data; + struct guild_expcache *c = data; - free(c); + free (c); - return 0; + return 0; } -static int guild_infoevent_db_final(void *key,void *data,va_list ap) + +static int guild_infoevent_db_final (void *key, void *data, va_list ap) { - struct eventlist *ev=data; + struct eventlist *ev = data; - free(ev); + free (ev); - return 0; + return 0; } -void do_final_guild(void) + +void do_final_guild (void) { - if(guild_db) - numdb_final(guild_db,guild_db_final); - if(castle_db) - numdb_final(castle_db,castle_db_final); - if(guild_expcache_db) - numdb_final(guild_expcache_db,guild_expcache_db_final); - if(guild_infoevent_db) - numdb_final(guild_infoevent_db,guild_infoevent_db_final); - if(guild_castleinfoevent_db) - numdb_final(guild_castleinfoevent_db,guild_infoevent_db_final); + if (guild_db) + numdb_final (guild_db, guild_db_final); + if (castle_db) + numdb_final (castle_db, castle_db_final); + if (guild_expcache_db) + numdb_final (guild_expcache_db, guild_expcache_db_final); + if (guild_infoevent_db) + numdb_final (guild_infoevent_db, guild_infoevent_db_final); + if (guild_castleinfoevent_db) + numdb_final (guild_castleinfoevent_db, guild_infoevent_db_final); } diff --git a/src/map/guild.h b/src/map/guild.h index 53e91f0..6ac13f9 100644 --- a/src/map/guild.h +++ b/src/map/guild.h @@ -9,79 +9,87 @@ struct guild_member; struct guild_position; struct guild_castle; -int guild_skill_get_inf(int id); -int guild_skill_get_sp(int id,int lv); -int guild_skill_get_range(int id); -int guild_skill_get_max(int id); +int guild_skill_get_inf (int id); +int guild_skill_get_sp (int id, int lv); +int guild_skill_get_range (int id); +int guild_skill_get_max (int id); -int guild_checkskill(struct guild *g,int id); -int guild_checkcastles(struct guild *g); // [MouseJstr] -int guild_isallied(struct guild *g, struct guild_castle *gc); +int guild_checkskill (struct guild *g, int id); +int guild_checkcastles (struct guild *g); // [MouseJstr] +int guild_isallied (struct guild *g, struct guild_castle *gc); -void do_init_guild(void); -struct guild *guild_search(int guild_id); -struct guild *guild_searchname(char *str); -struct guild_castle *guild_castle_search(int gcid); +void do_init_guild (void); +struct guild *guild_search (int guild_id); +struct guild *guild_searchname (char *str); +struct guild_castle *guild_castle_search (int gcid); -struct guild_castle *guild_mapname2gc(char *mapname); +struct guild_castle *guild_mapname2gc (char *mapname); -struct map_session_data *guild_getavailablesd(struct guild *g); -int guild_getindex(struct guild *g,int account_id,int char_id); -int guild_getposition(struct map_session_data *sd,struct guild *g); -int guild_payexp(struct map_session_data *sd,int exp); +struct map_session_data *guild_getavailablesd (struct guild *g); +int guild_getindex (struct guild *g, int account_id, int char_id); +int guild_getposition (struct map_session_data *sd, struct guild *g); +int guild_payexp (struct map_session_data *sd, int exp); -int guild_create(struct map_session_data *sd,char *name); -int guild_created(int account_id,int guild_id); -int guild_request_info(int guild_id); -int guild_recv_noinfo(int guild_id); -int guild_recv_info(struct guild *sg); -int guild_npc_request_info(int guild_id,const char *ev); -int guild_invite(struct map_session_data *sd,int account_id); -int guild_reply_invite(struct map_session_data *sd,int guild_id,int flag); -int guild_member_added(int guild_id,int account_id,int char_id,int flag); -int guild_leave(struct map_session_data *sd,int guild_id, - int account_id,int char_id,const char *mes); -int guild_member_leaved(int guild_id,int account_id,int char_id,int flag, - const char *name,const char *mes); -int guild_explusion(struct map_session_data *sd,int guild_id, - int account_id,int char_id,const char *mes); -int guild_skillup(struct map_session_data *sd,int skill_num); -int guild_reqalliance(struct map_session_data *sd,int account_id); -int guild_reply_reqalliance(struct map_session_data *sd,int account_id,int flag); -int guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2); -int guild_allianceack(int guild_id1,int guild_id2,int account_id1,int account_id2, - int flag,const char *name1,const char *name2); -int guild_delalliance(struct map_session_data *sd,int guild_id,int flag); -int guild_opposition(struct map_session_data *sd,int char_id); +int guild_create (struct map_session_data *sd, char *name); +int guild_created (int account_id, int guild_id); +int guild_request_info (int guild_id); +int guild_recv_noinfo (int guild_id); +int guild_recv_info (struct guild *sg); +int guild_npc_request_info (int guild_id, const char *ev); +int guild_invite (struct map_session_data *sd, int account_id); +int guild_reply_invite (struct map_session_data *sd, int guild_id, int flag); +int guild_member_added (int guild_id, int account_id, int char_id, int flag); +int guild_leave (struct map_session_data *sd, int guild_id, + int account_id, int char_id, const char *mes); +int guild_member_leaved (int guild_id, int account_id, int char_id, int flag, + const char *name, const char *mes); +int guild_explusion (struct map_session_data *sd, int guild_id, + int account_id, int char_id, const char *mes); +int guild_skillup (struct map_session_data *sd, int skill_num); +int guild_reqalliance (struct map_session_data *sd, int account_id); +int guild_reply_reqalliance (struct map_session_data *sd, int account_id, + int flag); +int guild_alliance (int guild_id1, int guild_id2, int account_id1, + int account_id2); +int guild_allianceack (int guild_id1, int guild_id2, int account_id1, + int account_id2, int flag, const char *name1, + const char *name2); +int guild_delalliance (struct map_session_data *sd, int guild_id, int flag); +int guild_opposition (struct map_session_data *sd, int char_id); -int guild_send_memberinfoshort(struct map_session_data *sd,int online); -int guild_recv_memberinfoshort(int guild_id,int account_id,int char_id,int online,int lv,int class); -int guild_change_memberposition(int guild_id,int account_id,int char_id,int idx); -int guild_memberposition_changed(struct guild *g,int idx,int pos); -int guild_change_position(struct map_session_data *sd,int idx, - int mode,int exp_mode,const char *name); -int guild_position_changed(int guild_id,int idx,struct guild_position *p); -int guild_change_notice(struct map_session_data *sd,int guild_id,const char *mes1,const char *mes2); -int guild_notice_changed(int guild_id,const char *mes1,const char *mes2); -int guild_change_emblem(struct map_session_data *sd,int len,const char *data); -int guild_emblem_changed(int len,int guild_id,int emblem_id,const char *data); -int guild_send_message(struct map_session_data *sd,char *mes,int len); -int guild_recv_message(int guild_id,int account_id,char *mes,int len); -int guild_skillupack(int guild_id,int skill_num,int account_id); -int guild_break(struct map_session_data *sd,char *name); -int guild_broken(int guild_id,int flag); +int guild_send_memberinfoshort (struct map_session_data *sd, int online); +int guild_recv_memberinfoshort (int guild_id, int account_id, int char_id, + int online, int lv, int class); +int guild_change_memberposition (int guild_id, int account_id, int char_id, + int idx); +int guild_memberposition_changed (struct guild *g, int idx, int pos); +int guild_change_position (struct map_session_data *sd, int idx, + int mode, int exp_mode, const char *name); +int guild_position_changed (int guild_id, int idx, struct guild_position *p); +int guild_change_notice (struct map_session_data *sd, int guild_id, + const char *mes1, const char *mes2); +int guild_notice_changed (int guild_id, const char *mes1, const char *mes2); +int guild_change_emblem (struct map_session_data *sd, int len, + const char *data); +int guild_emblem_changed (int len, int guild_id, int emblem_id, + const char *data); +int guild_send_message (struct map_session_data *sd, char *mes, int len); +int guild_recv_message (int guild_id, int account_id, char *mes, int len); +int guild_skillupack (int guild_id, int skill_num, int account_id); +int guild_break (struct map_session_data *sd, char *name); +int guild_broken (int guild_id, int flag); -int guild_addcastleinfoevent(int castle_id,int index,const char *name); -int guild_castledataload(int castle_id,int index); -int guild_castledataloadack(int castle_id,int index,int value); -int guild_castledatasave(int castle_id,int index,int value); -int guild_castledatasaveack(int castle_id,int index,int value); -int guild_castlealldataload(int len,struct guild_castle *gc); +int guild_addcastleinfoevent (int castle_id, int index, const char *name); +int guild_castledataload (int castle_id, int index); +int guild_castledataloadack (int castle_id, int index, int value); +int guild_castledatasave (int castle_id, int index, int value); +int guild_castledatasaveack (int castle_id, int index, int value); +int guild_castlealldataload (int len, struct guild_castle *gc); -int guild_agit_start(void); -int guild_agit_end(void); -int guild_agit_break(struct mob_data *md); +int guild_agit_start (void); +int guild_agit_end (void); +int guild_agit_break (struct mob_data *md); -void do_final_guild(void); +void do_final_guild (void); #endif diff --git a/src/map/intif.c b/src/map/intif.c index 228af46..6945486 100644 --- a/src/map/intif.c +++ b/src/map/intif.c @@ -36,944 +36,1166 @@ #include "memwatch.h" #endif -static const int packet_len_table[]={ - -1,-1,27,-1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - -1, 7, 0, 0, 0, 0, 0, 0, -1,11, 0, 0, 0, 0, 0, 0, - 35,-1,11,15, 34,29, 7,-1, 0, 0, 0, 0, 0, 0, 0, 0, - 10,-1,15, 0, 79,19, 7,-1, 0,-1,-1,-1, 14,67,186,-1, - 9, 9,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 11,-1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +static const int packet_len_table[] = { + -1, -1, 27, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -1, 7, 0, 0, 0, 0, 0, 0, -1, 11, 0, 0, 0, 0, 0, 0, + 35, -1, 11, 15, 34, 29, 7, -1, 0, 0, 0, 0, 0, 0, 0, 0, + 10, -1, 15, 0, 79, 19, 7, -1, 0, -1, -1, -1, 14, 67, 186, -1, + 9, 9, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, -1, 7, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; -extern int char_fd; // inter serverのfdはchar_fdを使う -#define inter_fd (char_fd) // エイリアス +extern int char_fd; // inter serverのfdはchar_fdを使う +#define inter_fd (char_fd) // エイリアス //----------------------------------------------------------------- // inter serverへの送信 // Message for all GMs on all map servers -int intif_GMmessage(char* mes,int len,int flag) +int intif_GMmessage (char *mes, int len, int flag) { - int lp = (flag&0x10) ? 8 : 4; - WFIFOW(inter_fd,0) = 0x3000; - WFIFOW(inter_fd,2) = lp + len; - WFIFOL(inter_fd,4) = 0x65756c62; - memcpy(WFIFOP(inter_fd,lp), mes, len); - WFIFOSET(inter_fd, WFIFOW(inter_fd,2)); + int lp = (flag & 0x10) ? 8 : 4; + WFIFOW (inter_fd, 0) = 0x3000; + WFIFOW (inter_fd, 2) = lp + len; + WFIFOL (inter_fd, 4) = 0x65756c62; + memcpy (WFIFOP (inter_fd, lp), mes, len); + WFIFOSET (inter_fd, WFIFOW (inter_fd, 2)); - return 0; + return 0; } // The transmission of Wisp/Page to inter-server (player not found on this server) -int intif_wis_message(struct map_session_data *sd, char *nick, char *mes, int mes_len) { - nullpo_retr(0, sd); +int intif_wis_message (struct map_session_data *sd, char *nick, char *mes, + int mes_len) +{ + nullpo_retr (0, sd); - WFIFOW(inter_fd,0) = 0x3001; - WFIFOW(inter_fd,2) = mes_len + 52; - memcpy(WFIFOP(inter_fd,4), sd->status.name, 24); - memcpy(WFIFOP(inter_fd,28), nick, 24); - memcpy(WFIFOP(inter_fd,52), mes, mes_len); - WFIFOSET(inter_fd, WFIFOW(inter_fd,2)); + WFIFOW (inter_fd, 0) = 0x3001; + WFIFOW (inter_fd, 2) = mes_len + 52; + memcpy (WFIFOP (inter_fd, 4), sd->status.name, 24); + memcpy (WFIFOP (inter_fd, 28), nick, 24); + memcpy (WFIFOP (inter_fd, 52), mes, mes_len); + WFIFOSET (inter_fd, WFIFOW (inter_fd, 2)); - if (battle_config.etc_log) - printf("intif_wis_message from %s to %s (message: '%s')\n", sd->status.name, nick, mes); + if (battle_config.etc_log) + printf ("intif_wis_message from %s to %s (message: '%s')\n", + sd->status.name, nick, mes); - return 0; + return 0; } // The reply of Wisp/page -int intif_wis_replay(int id, int flag) { - WFIFOW(inter_fd,0) = 0x3002; - WFIFOL(inter_fd,2) = id; - WFIFOB(inter_fd,6) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - WFIFOSET(inter_fd,7); +int intif_wis_replay (int id, int flag) +{ + WFIFOW (inter_fd, 0) = 0x3002; + WFIFOL (inter_fd, 2) = id; + WFIFOB (inter_fd, 6) = flag; // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + WFIFOSET (inter_fd, 7); - if (battle_config.etc_log) - printf("intif_wis_replay: id: %d, flag:%d\n", id, flag); + if (battle_config.etc_log) + printf ("intif_wis_replay: id: %d, flag:%d\n", id, flag); - return 0; + return 0; } // The transmission of GM only Wisp/Page from server to inter-server -int intif_wis_message_to_gm(char *Wisp_name, int min_gm_level, char *mes, int mes_len) { - WFIFOW(inter_fd,0) = 0x3003; - WFIFOW(inter_fd,2) = mes_len + 30; - memcpy(WFIFOP(inter_fd,4), Wisp_name, 24); - WFIFOW(inter_fd,28) = (short)min_gm_level; - memcpy(WFIFOP(inter_fd,30), mes, mes_len); - WFIFOSET(inter_fd, WFIFOW(inter_fd,2)); +int intif_wis_message_to_gm (char *Wisp_name, int min_gm_level, char *mes, + int mes_len) +{ + WFIFOW (inter_fd, 0) = 0x3003; + WFIFOW (inter_fd, 2) = mes_len + 30; + memcpy (WFIFOP (inter_fd, 4), Wisp_name, 24); + WFIFOW (inter_fd, 28) = (short) min_gm_level; + memcpy (WFIFOP (inter_fd, 30), mes, mes_len); + WFIFOSET (inter_fd, WFIFOW (inter_fd, 2)); - if (battle_config.etc_log) - printf("intif_wis_message_to_gm: from: '%s', min level: %d, message: '%s'.\n", Wisp_name, min_gm_level, mes); + if (battle_config.etc_log) + printf + ("intif_wis_message_to_gm: from: '%s', min level: %d, message: '%s'.\n", + Wisp_name, min_gm_level, mes); - return 0; + return 0; } // アカウント変数送信 -int intif_saveaccountreg(struct map_session_data *sd) { - int j,p; +int intif_saveaccountreg (struct map_session_data *sd) +{ + int j, p; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - WFIFOW(inter_fd,0) = 0x3004; - WFIFOL(inter_fd,4) = sd->bl.id; - for(j=0,p=8;j<sd->status.account_reg_num;j++,p+=36){ - memcpy(WFIFOP(inter_fd,p),sd->status.account_reg[j].str,32); - WFIFOL(inter_fd,p+32)=sd->status.account_reg[j].value; - } - WFIFOW(inter_fd,2)=p; - WFIFOSET(inter_fd,p); - return 0; + WFIFOW (inter_fd, 0) = 0x3004; + WFIFOL (inter_fd, 4) = sd->bl.id; + for (j = 0, p = 8; j < sd->status.account_reg_num; j++, p += 36) + { + memcpy (WFIFOP (inter_fd, p), sd->status.account_reg[j].str, 32); + WFIFOL (inter_fd, p + 32) = sd->status.account_reg[j].value; + } + WFIFOW (inter_fd, 2) = p; + WFIFOSET (inter_fd, p); + return 0; } + // アカウント変数要求 -int intif_request_accountreg(struct map_session_data *sd) +int intif_request_accountreg (struct map_session_data *sd) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - WFIFOW(inter_fd,0) = 0x3005; - WFIFOL(inter_fd,2) = sd->bl.id; - WFIFOSET(inter_fd,6); - return 0; + WFIFOW (inter_fd, 0) = 0x3005; + WFIFOL (inter_fd, 2) = sd->bl.id; + WFIFOSET (inter_fd, 6); + return 0; } // 倉庫データ要求 -int intif_request_storage(int account_id) +int intif_request_storage (int account_id) { - WFIFOW(inter_fd,0) = 0x3010; - WFIFOL(inter_fd,2) = account_id; - WFIFOSET(inter_fd,6); - return 0; + WFIFOW (inter_fd, 0) = 0x3010; + WFIFOL (inter_fd, 2) = account_id; + WFIFOSET (inter_fd, 6); + return 0; } + // 倉庫データ送信 -int intif_send_storage(struct storage *stor) +int intif_send_storage (struct storage *stor) { - nullpo_retr(0, stor); - WFIFOW(inter_fd,0) = 0x3011; - WFIFOW(inter_fd,2) = sizeof(struct storage)+8; - WFIFOL(inter_fd,4) = stor->account_id; - memcpy( WFIFOP(inter_fd,8),stor, sizeof(struct storage) ); - WFIFOSET(inter_fd,WFIFOW(inter_fd,2)); - return 0; + nullpo_retr (0, stor); + WFIFOW (inter_fd, 0) = 0x3011; + WFIFOW (inter_fd, 2) = sizeof (struct storage) + 8; + WFIFOL (inter_fd, 4) = stor->account_id; + memcpy (WFIFOP (inter_fd, 8), stor, sizeof (struct storage)); + WFIFOSET (inter_fd, WFIFOW (inter_fd, 2)); + return 0; } -int intif_request_guild_storage(int account_id,int guild_id) +int intif_request_guild_storage (int account_id, int guild_id) { - WFIFOW(inter_fd,0) = 0x3018; - WFIFOL(inter_fd,2) = account_id; - WFIFOL(inter_fd,6) = guild_id; - WFIFOSET(inter_fd,10); - return 0; + WFIFOW (inter_fd, 0) = 0x3018; + WFIFOL (inter_fd, 2) = account_id; + WFIFOL (inter_fd, 6) = guild_id; + WFIFOSET (inter_fd, 10); + return 0; } -int intif_send_guild_storage(int account_id,struct guild_storage *gstor) + +int intif_send_guild_storage (int account_id, struct guild_storage *gstor) { - WFIFOW(inter_fd,0) = 0x3019; - WFIFOW(inter_fd,2) = sizeof(struct guild_storage)+12; - WFIFOL(inter_fd,4) = account_id; - WFIFOL(inter_fd,8) = gstor->guild_id; - memcpy( WFIFOP(inter_fd,12),gstor, sizeof(struct guild_storage) ); - WFIFOSET(inter_fd,WFIFOW(inter_fd,2)); - return 0; + WFIFOW (inter_fd, 0) = 0x3019; + WFIFOW (inter_fd, 2) = sizeof (struct guild_storage) + 12; + WFIFOL (inter_fd, 4) = account_id; + WFIFOL (inter_fd, 8) = gstor->guild_id; + memcpy (WFIFOP (inter_fd, 12), gstor, sizeof (struct guild_storage)); + WFIFOSET (inter_fd, WFIFOW (inter_fd, 2)); + return 0; } // パーティ作成要求 -int intif_create_party(struct map_session_data *sd,char *name) +int intif_create_party (struct map_session_data *sd, char *name) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - WFIFOW(inter_fd,0) = 0x3020; - WFIFOL(inter_fd,2) = sd->status.account_id; - memcpy(WFIFOP(inter_fd, 6),name,24); - memcpy(WFIFOP(inter_fd,30),sd->status.name,24); - memcpy(WFIFOP(inter_fd,54),map[sd->bl.m].name,16); - WFIFOW(inter_fd,70)= sd->status.base_level; - WFIFOSET(inter_fd,72); -// if(battle_config.etc_log) -// printf("intif: create party\n"); - return 0; + WFIFOW (inter_fd, 0) = 0x3020; + WFIFOL (inter_fd, 2) = sd->status.account_id; + memcpy (WFIFOP (inter_fd, 6), name, 24); + memcpy (WFIFOP (inter_fd, 30), sd->status.name, 24); + memcpy (WFIFOP (inter_fd, 54), map[sd->bl.m].name, 16); + WFIFOW (inter_fd, 70) = sd->status.base_level; + WFIFOSET (inter_fd, 72); +// if(battle_config.etc_log) +// printf("intif: create party\n"); + return 0; } + // パーティ情報要求 -int intif_request_partyinfo(int party_id) +int intif_request_partyinfo (int party_id) { - WFIFOW(inter_fd,0) = 0x3021; - WFIFOL(inter_fd,2) = party_id; - WFIFOSET(inter_fd,6); -// if(battle_config.etc_log) -// printf("intif: request party info\n"); - return 0; + WFIFOW (inter_fd, 0) = 0x3021; + WFIFOL (inter_fd, 2) = party_id; + WFIFOSET (inter_fd, 6); +// if(battle_config.etc_log) +// printf("intif: request party info\n"); + return 0; } + // パーティ追加要求 -int intif_party_addmember(int party_id,int account_id) -{ - struct map_session_data *sd; - sd=map_id2sd(account_id); -// if(battle_config.etc_log) -// printf("intif: party add member %d %d\n",party_id,account_id); - if(sd!=NULL){ - WFIFOW(inter_fd,0)=0x3022; - WFIFOL(inter_fd,2)=party_id; - WFIFOL(inter_fd,6)=account_id; - memcpy(WFIFOP(inter_fd,10),sd->status.name,24); - memcpy(WFIFOP(inter_fd,34),map[sd->bl.m].name,16); - WFIFOW(inter_fd,50)=sd->status.base_level; - WFIFOSET(inter_fd,52); - } - return 0; +int intif_party_addmember (int party_id, int account_id) +{ + struct map_session_data *sd; + sd = map_id2sd (account_id); +// if(battle_config.etc_log) +// printf("intif: party add member %d %d\n",party_id,account_id); + if (sd != NULL) + { + WFIFOW (inter_fd, 0) = 0x3022; + WFIFOL (inter_fd, 2) = party_id; + WFIFOL (inter_fd, 6) = account_id; + memcpy (WFIFOP (inter_fd, 10), sd->status.name, 24); + memcpy (WFIFOP (inter_fd, 34), map[sd->bl.m].name, 16); + WFIFOW (inter_fd, 50) = sd->status.base_level; + WFIFOSET (inter_fd, 52); + } + return 0; } + // パーティ設定変更 -int intif_party_changeoption(int party_id,int account_id,int exp,int item) +int intif_party_changeoption (int party_id, int account_id, int exp, int item) { - WFIFOW(inter_fd,0)=0x3023; - WFIFOL(inter_fd,2)=party_id; - WFIFOL(inter_fd,6)=account_id; - WFIFOW(inter_fd,10)=exp; - WFIFOW(inter_fd,12)=item; - WFIFOSET(inter_fd,14); - return 0; + WFIFOW (inter_fd, 0) = 0x3023; + WFIFOL (inter_fd, 2) = party_id; + WFIFOL (inter_fd, 6) = account_id; + WFIFOW (inter_fd, 10) = exp; + WFIFOW (inter_fd, 12) = item; + WFIFOSET (inter_fd, 14); + return 0; } + // パーティ脱退要求 -int intif_party_leave(int party_id,int account_id) +int intif_party_leave (int party_id, int account_id) { -// if(battle_config.etc_log) -// printf("intif: party leave %d %d\n",party_id,account_id); - WFIFOW(inter_fd,0)=0x3024; - WFIFOL(inter_fd,2)=party_id; - WFIFOL(inter_fd,6)=account_id; - WFIFOSET(inter_fd,10); - return 0; +// if(battle_config.etc_log) +// printf("intif: party leave %d %d\n",party_id,account_id); + WFIFOW (inter_fd, 0) = 0x3024; + WFIFOL (inter_fd, 2) = party_id; + WFIFOL (inter_fd, 6) = account_id; + WFIFOSET (inter_fd, 10); + return 0; } + // パーティ移動要求 -int intif_party_changemap(struct map_session_data *sd,int online) -{ - if(sd!=NULL){ - WFIFOW(inter_fd,0)=0x3025; - WFIFOL(inter_fd,2)=sd->status.party_id; - WFIFOL(inter_fd,6)=sd->status.account_id; - memcpy(WFIFOP(inter_fd,10),map[sd->bl.m].name,16); - WFIFOB(inter_fd,26)=online; - WFIFOW(inter_fd,27)=sd->status.base_level; - WFIFOSET(inter_fd,29); - } -// if(battle_config.etc_log) -// printf("party: change map\n"); - return 0; +int intif_party_changemap (struct map_session_data *sd, int online) +{ + if (sd != NULL) + { + WFIFOW (inter_fd, 0) = 0x3025; + WFIFOL (inter_fd, 2) = sd->status.party_id; + WFIFOL (inter_fd, 6) = sd->status.account_id; + memcpy (WFIFOP (inter_fd, 10), map[sd->bl.m].name, 16); + WFIFOB (inter_fd, 26) = online; + WFIFOW (inter_fd, 27) = sd->status.base_level; + WFIFOSET (inter_fd, 29); + } +// if(battle_config.etc_log) +// printf("party: change map\n"); + return 0; } + // パーティー解散要求 -int intif_break_party(int party_id) +int intif_break_party (int party_id) { - WFIFOW(inter_fd,0)=0x3026; - WFIFOL(inter_fd,2)=party_id; - WFIFOSET(inter_fd,6); - return 0; + WFIFOW (inter_fd, 0) = 0x3026; + WFIFOL (inter_fd, 2) = party_id; + WFIFOSET (inter_fd, 6); + return 0; } + // パーティ会話送信 -int intif_party_message(int party_id,int account_id,char *mes,int len) -{ -// if(battle_config.etc_log) -// printf("intif_party_message: %s\n",mes); - WFIFOW(inter_fd,0)=0x3027; - WFIFOW(inter_fd,2)=len+12; - WFIFOL(inter_fd,4)=party_id; - WFIFOL(inter_fd,8)=account_id; - memcpy(WFIFOP(inter_fd,12),mes,len); - WFIFOSET(inter_fd,len+12); - return 0; +int intif_party_message (int party_id, int account_id, char *mes, int len) +{ +// if(battle_config.etc_log) +// printf("intif_party_message: %s\n",mes); + WFIFOW (inter_fd, 0) = 0x3027; + WFIFOW (inter_fd, 2) = len + 12; + WFIFOL (inter_fd, 4) = party_id; + WFIFOL (inter_fd, 8) = account_id; + memcpy (WFIFOP (inter_fd, 12), mes, len); + WFIFOSET (inter_fd, len + 12); + return 0; } + // パーティ競合チェック要求 -int intif_party_checkconflict(int party_id,int account_id,char *nick) +int intif_party_checkconflict (int party_id, int account_id, char *nick) { - WFIFOW(inter_fd,0)=0x3028; - WFIFOL(inter_fd,2)=party_id; - WFIFOL(inter_fd,6)=account_id; - memcpy(WFIFOP(inter_fd,10),nick,24); - WFIFOSET(inter_fd,34); - return 0; + WFIFOW (inter_fd, 0) = 0x3028; + WFIFOL (inter_fd, 2) = party_id; + WFIFOL (inter_fd, 6) = account_id; + memcpy (WFIFOP (inter_fd, 10), nick, 24); + WFIFOSET (inter_fd, 34); + return 0; } // ギルド作成要求 -int intif_guild_create(const char *name,const struct guild_member *master) +int intif_guild_create (const char *name, const struct guild_member *master) { - nullpo_retr(0, master); + nullpo_retr (0, master); - WFIFOW(inter_fd,0)=0x3030; - WFIFOW(inter_fd,2)=sizeof(struct guild_member)+32; - WFIFOL(inter_fd,4)=master->account_id; - memcpy(WFIFOP(inter_fd,8),name,24); - memcpy(WFIFOP(inter_fd,32),master,sizeof(struct guild_member)); - WFIFOSET(inter_fd,WFIFOW(inter_fd,2)); - return 0; + WFIFOW (inter_fd, 0) = 0x3030; + WFIFOW (inter_fd, 2) = sizeof (struct guild_member) + 32; + WFIFOL (inter_fd, 4) = master->account_id; + memcpy (WFIFOP (inter_fd, 8), name, 24); + memcpy (WFIFOP (inter_fd, 32), master, sizeof (struct guild_member)); + WFIFOSET (inter_fd, WFIFOW (inter_fd, 2)); + return 0; } + // ギルド情報要求 -int intif_guild_request_info(int guild_id) +int intif_guild_request_info (int guild_id) { - WFIFOW(inter_fd,0) = 0x3031; - WFIFOL(inter_fd,2) = guild_id; - WFIFOSET(inter_fd,6); - return 0; + WFIFOW (inter_fd, 0) = 0x3031; + WFIFOL (inter_fd, 2) = guild_id; + WFIFOSET (inter_fd, 6); + return 0; } + // ギルドメンバ追加要求 -int intif_guild_addmember(int guild_id,struct guild_member *m) +int intif_guild_addmember (int guild_id, struct guild_member *m) { - WFIFOW(inter_fd,0) = 0x3032; - WFIFOW(inter_fd,2) = sizeof(struct guild_member)+8; - WFIFOL(inter_fd,4) = guild_id; - memcpy(WFIFOP(inter_fd,8),m,sizeof(struct guild_member)); - WFIFOSET(inter_fd,WFIFOW(inter_fd,2)); - return 0; + WFIFOW (inter_fd, 0) = 0x3032; + WFIFOW (inter_fd, 2) = sizeof (struct guild_member) + 8; + WFIFOL (inter_fd, 4) = guild_id; + memcpy (WFIFOP (inter_fd, 8), m, sizeof (struct guild_member)); + WFIFOSET (inter_fd, WFIFOW (inter_fd, 2)); + return 0; } + // ギルドメンバ脱退/追放要求 -int intif_guild_leave(int guild_id,int account_id,int char_id,int flag,const char *mes) +int intif_guild_leave (int guild_id, int account_id, int char_id, int flag, + const char *mes) { - WFIFOW(inter_fd, 0) = 0x3034; - WFIFOL(inter_fd, 2) = guild_id; - WFIFOL(inter_fd, 6) = account_id; - WFIFOL(inter_fd,10) = char_id; - WFIFOB(inter_fd,14) = flag; - memcpy(WFIFOP(inter_fd,15),mes,40); - WFIFOSET(inter_fd,55); - return 0; + WFIFOW (inter_fd, 0) = 0x3034; + WFIFOL (inter_fd, 2) = guild_id; + WFIFOL (inter_fd, 6) = account_id; + WFIFOL (inter_fd, 10) = char_id; + WFIFOB (inter_fd, 14) = flag; + memcpy (WFIFOP (inter_fd, 15), mes, 40); + WFIFOSET (inter_fd, 55); + return 0; } + // ギルドメンバのオンライン状況/Lv更新要求 -int intif_guild_memberinfoshort(int guild_id, - int account_id,int char_id,int online,int lv,int class) -{ - WFIFOW(inter_fd, 0) = 0x3035; - WFIFOL(inter_fd, 2) = guild_id; - WFIFOL(inter_fd, 6) = account_id; - WFIFOL(inter_fd,10) = char_id; - WFIFOB(inter_fd,14) = online; - WFIFOW(inter_fd,15) = lv; - WFIFOW(inter_fd,17) = class; - WFIFOSET(inter_fd,19); - return 0; +int intif_guild_memberinfoshort (int guild_id, + int account_id, int char_id, int online, + int lv, int class) +{ + WFIFOW (inter_fd, 0) = 0x3035; + WFIFOL (inter_fd, 2) = guild_id; + WFIFOL (inter_fd, 6) = account_id; + WFIFOL (inter_fd, 10) = char_id; + WFIFOB (inter_fd, 14) = online; + WFIFOW (inter_fd, 15) = lv; + WFIFOW (inter_fd, 17) = class; + WFIFOSET (inter_fd, 19); + return 0; } + // ギルド解散通知 -int intif_guild_break(int guild_id) +int intif_guild_break (int guild_id) { - WFIFOW(inter_fd, 0) = 0x3036; - WFIFOL(inter_fd, 2) = guild_id; - WFIFOSET(inter_fd,6); - return 0; + WFIFOW (inter_fd, 0) = 0x3036; + WFIFOL (inter_fd, 2) = guild_id; + WFIFOSET (inter_fd, 6); + return 0; } + // ギルド会話送信 -int intif_guild_message(int guild_id,int account_id,char *mes,int len) +int intif_guild_message (int guild_id, int account_id, char *mes, int len) { - WFIFOW(inter_fd,0)=0x3037; - WFIFOW(inter_fd,2)=len+12; - WFIFOL(inter_fd,4)=guild_id; - WFIFOL(inter_fd,8)=account_id; - memcpy(WFIFOP(inter_fd,12),mes,len); - WFIFOSET(inter_fd,len+12); - return 0; + WFIFOW (inter_fd, 0) = 0x3037; + WFIFOW (inter_fd, 2) = len + 12; + WFIFOL (inter_fd, 4) = guild_id; + WFIFOL (inter_fd, 8) = account_id; + memcpy (WFIFOP (inter_fd, 12), mes, len); + WFIFOSET (inter_fd, len + 12); + return 0; } + // ギルド競合チェック要求 -int intif_guild_checkconflict(int guild_id,int account_id,int char_id) +int intif_guild_checkconflict (int guild_id, int account_id, int char_id) { - WFIFOW(inter_fd, 0)=0x3038; - WFIFOL(inter_fd, 2)=guild_id; - WFIFOL(inter_fd, 6)=account_id; - WFIFOL(inter_fd,10)=char_id; - WFIFOSET(inter_fd,14); - return 0; + WFIFOW (inter_fd, 0) = 0x3038; + WFIFOL (inter_fd, 2) = guild_id; + WFIFOL (inter_fd, 6) = account_id; + WFIFOL (inter_fd, 10) = char_id; + WFIFOSET (inter_fd, 14); + return 0; } + // ギルド基本情報変更要求 -int intif_guild_change_basicinfo(int guild_id,int type,const void *data,int len) +int intif_guild_change_basicinfo (int guild_id, int type, const void *data, + int len) { - WFIFOW(inter_fd,0)=0x3039; - WFIFOW(inter_fd,2)=len+10; - WFIFOL(inter_fd,4)=guild_id; - WFIFOW(inter_fd,8)=type; - memcpy(WFIFOP(inter_fd,10),data,len); - WFIFOSET(inter_fd,len+10); - return 0; + WFIFOW (inter_fd, 0) = 0x3039; + WFIFOW (inter_fd, 2) = len + 10; + WFIFOL (inter_fd, 4) = guild_id; + WFIFOW (inter_fd, 8) = type; + memcpy (WFIFOP (inter_fd, 10), data, len); + WFIFOSET (inter_fd, len + 10); + return 0; } + // ギルドメンバ情報変更要求 -int intif_guild_change_memberinfo(int guild_id,int account_id,int char_id, - int type,const void *data,int len) -{ - WFIFOW(inter_fd, 0)=0x303a; - WFIFOW(inter_fd, 2)=len+18; - WFIFOL(inter_fd, 4)=guild_id; - WFIFOL(inter_fd, 8)=account_id; - WFIFOL(inter_fd,12)=char_id; - WFIFOW(inter_fd,16)=type; - memcpy(WFIFOP(inter_fd,18),data,len); - WFIFOSET(inter_fd,len+18); - return 0; +int intif_guild_change_memberinfo (int guild_id, int account_id, int char_id, + int type, const void *data, int len) +{ + WFIFOW (inter_fd, 0) = 0x303a; + WFIFOW (inter_fd, 2) = len + 18; + WFIFOL (inter_fd, 4) = guild_id; + WFIFOL (inter_fd, 8) = account_id; + WFIFOL (inter_fd, 12) = char_id; + WFIFOW (inter_fd, 16) = type; + memcpy (WFIFOP (inter_fd, 18), data, len); + WFIFOSET (inter_fd, len + 18); + return 0; } + // ギルド役職変更要求 -int intif_guild_position(int guild_id,int idx,struct guild_position *p) +int intif_guild_position (int guild_id, int idx, struct guild_position *p) { - WFIFOW(inter_fd,0)=0x303b; - WFIFOW(inter_fd,2)=sizeof(struct guild_position)+12; - WFIFOL(inter_fd,4)=guild_id; - WFIFOL(inter_fd,8)=idx; - memcpy(WFIFOP(inter_fd,12),p,sizeof(struct guild_position)); - WFIFOSET(inter_fd,WFIFOW(inter_fd,2)); - return 0; + WFIFOW (inter_fd, 0) = 0x303b; + WFIFOW (inter_fd, 2) = sizeof (struct guild_position) + 12; + WFIFOL (inter_fd, 4) = guild_id; + WFIFOL (inter_fd, 8) = idx; + memcpy (WFIFOP (inter_fd, 12), p, sizeof (struct guild_position)); + WFIFOSET (inter_fd, WFIFOW (inter_fd, 2)); + return 0; } + // ギルドスキルアップ要求 -int intif_guild_skillup(int guild_id,int skill_num,int account_id) +int intif_guild_skillup (int guild_id, int skill_num, int account_id) { - WFIFOW(inter_fd, 0)=0x303c; - WFIFOL(inter_fd, 2)=guild_id; - WFIFOL(inter_fd, 6)=skill_num; - WFIFOL(inter_fd,10)=account_id; - WFIFOSET(inter_fd,14); - return 0; + WFIFOW (inter_fd, 0) = 0x303c; + WFIFOL (inter_fd, 2) = guild_id; + WFIFOL (inter_fd, 6) = skill_num; + WFIFOL (inter_fd, 10) = account_id; + WFIFOSET (inter_fd, 14); + return 0; } + // ギルド同盟/敵対要求 -int intif_guild_alliance(int guild_id1,int guild_id2,int account_id1,int account_id2,int flag) +int intif_guild_alliance (int guild_id1, int guild_id2, int account_id1, + int account_id2, int flag) { - WFIFOW(inter_fd, 0)=0x303d; - WFIFOL(inter_fd, 2)=guild_id1; - WFIFOL(inter_fd, 6)=guild_id2; - WFIFOL(inter_fd,10)=account_id1; - WFIFOL(inter_fd,14)=account_id2; - WFIFOB(inter_fd,18)=flag; - WFIFOSET(inter_fd,19); - return 0; + WFIFOW (inter_fd, 0) = 0x303d; + WFIFOL (inter_fd, 2) = guild_id1; + WFIFOL (inter_fd, 6) = guild_id2; + WFIFOL (inter_fd, 10) = account_id1; + WFIFOL (inter_fd, 14) = account_id2; + WFIFOB (inter_fd, 18) = flag; + WFIFOSET (inter_fd, 19); + return 0; } + // ギルド告知変更要求 -int intif_guild_notice(int guild_id,const char *mes1,const char *mes2) +int intif_guild_notice (int guild_id, const char *mes1, const char *mes2) { - WFIFOW(inter_fd,0)=0x303e; - WFIFOL(inter_fd,2)=guild_id; - memcpy(WFIFOP(inter_fd,6),mes1,60); - memcpy(WFIFOP(inter_fd,66),mes2,120); - WFIFOSET(inter_fd,186); - return 0; + WFIFOW (inter_fd, 0) = 0x303e; + WFIFOL (inter_fd, 2) = guild_id; + memcpy (WFIFOP (inter_fd, 6), mes1, 60); + memcpy (WFIFOP (inter_fd, 66), mes2, 120); + WFIFOSET (inter_fd, 186); + return 0; } + // ギルドエンブレム変更要求 -int intif_guild_emblem(int guild_id,int len,const char *data) -{ - if(guild_id<=0 || len<0 || len>2000) - return 0; - WFIFOW(inter_fd,0)=0x303f; - WFIFOW(inter_fd,2)=len+12; - WFIFOL(inter_fd,4)=guild_id; - WFIFOL(inter_fd,8)=0; - memcpy(WFIFOP(inter_fd,12),data,len); - WFIFOSET(inter_fd,len+12); - return 0; +int intif_guild_emblem (int guild_id, int len, const char *data) +{ + if (guild_id <= 0 || len < 0 || len > 2000) + return 0; + WFIFOW (inter_fd, 0) = 0x303f; + WFIFOW (inter_fd, 2) = len + 12; + WFIFOL (inter_fd, 4) = guild_id; + WFIFOL (inter_fd, 8) = 0; + memcpy (WFIFOP (inter_fd, 12), data, len); + WFIFOSET (inter_fd, len + 12); + return 0; } + //現在のギルド城占領ギルドを調べる -int intif_guild_castle_dataload(int castle_id,int index) +int intif_guild_castle_dataload (int castle_id, int index) { - WFIFOW(inter_fd,0)=0x3040; - WFIFOW(inter_fd,2)=castle_id; - WFIFOB(inter_fd,4)=index; - WFIFOSET(inter_fd,5); - return 0; + WFIFOW (inter_fd, 0) = 0x3040; + WFIFOW (inter_fd, 2) = castle_id; + WFIFOB (inter_fd, 4) = index; + WFIFOSET (inter_fd, 5); + return 0; } //ギルド城占領ギルド変更要求 -int intif_guild_castle_datasave(int castle_id,int index, int value) +int intif_guild_castle_datasave (int castle_id, int index, int value) { - WFIFOW(inter_fd,0)=0x3041; - WFIFOW(inter_fd,2)=castle_id; - WFIFOB(inter_fd,4)=index; - WFIFOL(inter_fd,5)=value; - WFIFOSET(inter_fd,9); - return 0; + WFIFOW (inter_fd, 0) = 0x3041; + WFIFOW (inter_fd, 2) = castle_id; + WFIFOB (inter_fd, 4) = index; + WFIFOL (inter_fd, 5) = value; + WFIFOSET (inter_fd, 9); + return 0; } + //----------------------------------------------------------------- // Packets receive from inter server // Wisp/Page reception -int intif_parse_WisMessage(int fd) { // rewritten by [Yor] - struct map_session_data* sd; - int i; - char *wisp_source; - - if (battle_config.etc_log) - printf("intif_parse_wismessage: id: %d, from: %s, to: %s, message: '%s'\n", RFIFOL(fd,4), RFIFOP(fd,8), RFIFOP(fd,32), RFIFOP(fd,56)); - sd = map_nick2sd(RFIFOP(fd,32)); // Searching destination player - if (sd != NULL && strcmp(sd->status.name, RFIFOP(fd,32)) == 0) { // exactly same name (inter-server have checked the name before) - // if player ignore all - if (sd->ignoreAll == 1) - intif_wis_replay(RFIFOL(fd,4), 2); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - else { - wisp_source = RFIFOP(fd,8); // speed up - // if player ignore the source character - for(i = 0; i < (sizeof(sd->ignore) / sizeof(sd->ignore[0])); i++) - if (strcmp(sd->ignore[i].name, wisp_source) == 0) { - intif_wis_replay(RFIFOL(fd,4), 2); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - break; - } - // if source player not found in ignore list - if (i == (sizeof(sd->ignore) / sizeof(sd->ignore[0]))) { - clif_wis_message(sd->fd,RFIFOP(fd,8),RFIFOP(fd,56),RFIFOW(fd,2)-56); - intif_wis_replay(RFIFOL(fd,4), 0); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - } - } - } else - intif_wis_replay(RFIFOL(fd,4), 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - return 0; +int intif_parse_WisMessage (int fd) +{ // rewritten by [Yor] + struct map_session_data *sd; + int i; + char *wisp_source; + + if (battle_config.etc_log) + printf + ("intif_parse_wismessage: id: %d, from: %s, to: %s, message: '%s'\n", + RFIFOL (fd, 4), RFIFOP (fd, 8), RFIFOP (fd, 32), RFIFOP (fd, + 56)); + sd = map_nick2sd (RFIFOP (fd, 32)); // Searching destination player + if (sd != NULL && strcmp (sd->status.name, RFIFOP (fd, 32)) == 0) + { // exactly same name (inter-server have checked the name before) + // if player ignore all + if (sd->ignoreAll == 1) + intif_wis_replay (RFIFOL (fd, 4), 2); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + else + { + wisp_source = RFIFOP (fd, 8); // speed up + // if player ignore the source character + for (i = 0; i < (sizeof (sd->ignore) / sizeof (sd->ignore[0])); + i++) + if (strcmp (sd->ignore[i].name, wisp_source) == 0) + { + intif_wis_replay (RFIFOL (fd, 4), 2); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + break; + } + // if source player not found in ignore list + if (i == (sizeof (sd->ignore) / sizeof (sd->ignore[0]))) + { + clif_wis_message (sd->fd, RFIFOP (fd, 8), RFIFOP (fd, 56), + RFIFOW (fd, 2) - 56); + intif_wis_replay (RFIFOL (fd, 4), 0); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + } + } + } + else + intif_wis_replay (RFIFOL (fd, 4), 1); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + return 0; } // Wisp/page transmission result reception -int intif_parse_WisEnd(int fd) { - struct map_session_data* sd; +int intif_parse_WisEnd (int fd) +{ + struct map_session_data *sd; - if (battle_config.etc_log) - printf("intif_parse_wisend: player: %s, flag: %d\n", RFIFOP(fd,2), RFIFOB(fd,26)); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target - sd = map_nick2sd(RFIFOP(fd,2)); - if (sd != NULL) - clif_wis_end(sd->fd, RFIFOB(fd,26)); + if (battle_config.etc_log) + printf ("intif_parse_wisend: player: %s, flag: %d\n", RFIFOP (fd, 2), RFIFOB (fd, 26)); // flag: 0: success to send wisper, 1: target character is not loged in?, 2: ignored by target + sd = map_nick2sd (RFIFOP (fd, 2)); + if (sd != NULL) + clif_wis_end (sd->fd, RFIFOB (fd, 26)); - return 0; + return 0; } // Received wisp message from map-server via char-server for ALL gm -int mapif_parse_WisToGM(int fd) { // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B - int i, min_gm_level, len; - struct map_session_data *pl_sd; - char Wisp_name[24]; - char mbuf[255]; +int mapif_parse_WisToGM (int fd) +{ // 0x3003/0x3803 <packet_len>.w <wispname>.24B <min_gm_level>.w <message>.?B + int i, min_gm_level, len; + struct map_session_data *pl_sd; + char Wisp_name[24]; + char mbuf[255]; - if (RFIFOW(fd,2)-30 <= 0) - return 0; + if (RFIFOW (fd, 2) - 30 <= 0) + return 0; - len = RFIFOW(fd,2) - 30; - char *message = ((len) >= 255) ? (char *) malloc(len) : mbuf; + len = RFIFOW (fd, 2) - 30; + char *message = ((len) >= 255) ? (char *) malloc (len) : mbuf; - min_gm_level = (int)RFIFOW(fd,28); - memcpy(Wisp_name, RFIFOP(fd,4), 24); - Wisp_name[23] = '\0'; - memcpy(message, RFIFOP(fd,30), len); - message[len - 1] = '\0'; - // information is sended to all online GM - for (i = 0; i < fd_max; i++) - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) - if (pc_isGM(pl_sd) >= min_gm_level) - clif_wis_message(i, Wisp_name, message, strlen(message) + 1); + min_gm_level = (int) RFIFOW (fd, 28); + memcpy (Wisp_name, RFIFOP (fd, 4), 24); + Wisp_name[23] = '\0'; + memcpy (message, RFIFOP (fd, 30), len); + message[len - 1] = '\0'; + // information is sended to all online GM + for (i = 0; i < fd_max; i++) + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + if (pc_isGM (pl_sd) >= min_gm_level) + clif_wis_message (i, Wisp_name, message, + strlen (message) + 1); - if (message != mbuf) - free(message); + if (message != mbuf) + free (message); - return 0; + return 0; } // アカウント変数通知 -int intif_parse_AccountReg(int fd) { - int j,p; - struct map_session_data *sd; +int intif_parse_AccountReg (int fd) +{ + int j, p; + struct map_session_data *sd; - if( (sd=map_id2sd(RFIFOL(fd,4)))==NULL ) - return 1; - for(p=8,j=0;p<RFIFOW(fd,2) && j<ACCOUNT_REG_NUM;p+=36,j++){ - memcpy(sd->status.account_reg[j].str,RFIFOP(fd,p),32); - sd->status.account_reg[j].value=RFIFOL(fd,p+32); - } - sd->status.account_reg_num = j; -// printf("intif: accountreg\n"); + if ((sd = map_id2sd (RFIFOL (fd, 4))) == NULL) + return 1; + for (p = 8, j = 0; p < RFIFOW (fd, 2) && j < ACCOUNT_REG_NUM; + p += 36, j++) + { + memcpy (sd->status.account_reg[j].str, RFIFOP (fd, p), 32); + sd->status.account_reg[j].value = RFIFOL (fd, p + 32); + } + sd->status.account_reg_num = j; +// printf("intif: accountreg\n"); - return 0; + return 0; } // 倉庫データ受信 -int intif_parse_LoadStorage(int fd) { - struct storage *stor; - struct map_session_data *sd; - - sd=map_id2sd( RFIFOL(fd,4) ); - if(sd==NULL){ - if(battle_config.error_log) - printf("intif_parse_LoadStorage: user not found %d\n",RFIFOL(fd,4)); - return 1; - } - stor = account2storage( RFIFOL(fd,4)); - if (stor->storage_status == 1) { // Already open.. lets ignore this update - if (battle_config.error_log) - printf("intif_parse_LoadStorage: storage received for a client already open (User %d:%d)\n", sd->status.account_id, sd->status.char_id); - return 1; - } - if (stor->dirty) { // Already have storage, and it has been modified and not saved yet! Exploit! [Skotlex] - if (battle_config.error_log) - printf("intif_parse_LoadStorage: received storage for an already modified non-saved storage! (User %d:%d)\n", sd->status.account_id, sd->status.char_id); - return 1; - } - - if (RFIFOW(fd,2)-8 != sizeof(struct storage)) { - if (battle_config.error_log) - printf("intif_parse_LoadStorage: data size error %d %d\n", RFIFOW(fd,2)-8, sizeof(struct storage)); - return 1; - } - if(battle_config.save_log) - printf("intif_openstorage: %d\n",RFIFOL(fd,4) ); - memcpy(stor,RFIFOP(fd,8),sizeof(struct storage)); - stor->dirty=0; - stor->storage_status=1; - sd->state.storage_flag = 1; - clif_storageitemlist(sd,stor); - clif_storageequiplist(sd,stor); - clif_updatestorageamount(sd,stor); - - return 0; +int intif_parse_LoadStorage (int fd) +{ + struct storage *stor; + struct map_session_data *sd; + + sd = map_id2sd (RFIFOL (fd, 4)); + if (sd == NULL) + { + if (battle_config.error_log) + printf ("intif_parse_LoadStorage: user not found %d\n", + RFIFOL (fd, 4)); + return 1; + } + stor = account2storage (RFIFOL (fd, 4)); + if (stor->storage_status == 1) + { // Already open.. lets ignore this update + if (battle_config.error_log) + printf + ("intif_parse_LoadStorage: storage received for a client already open (User %d:%d)\n", + sd->status.account_id, sd->status.char_id); + return 1; + } + if (stor->dirty) + { // Already have storage, and it has been modified and not saved yet! Exploit! [Skotlex] + if (battle_config.error_log) + printf + ("intif_parse_LoadStorage: received storage for an already modified non-saved storage! (User %d:%d)\n", + sd->status.account_id, sd->status.char_id); + return 1; + } + + if (RFIFOW (fd, 2) - 8 != sizeof (struct storage)) + { + if (battle_config.error_log) + printf ("intif_parse_LoadStorage: data size error %d %d\n", + RFIFOW (fd, 2) - 8, sizeof (struct storage)); + return 1; + } + if (battle_config.save_log) + printf ("intif_openstorage: %d\n", RFIFOL (fd, 4)); + memcpy (stor, RFIFOP (fd, 8), sizeof (struct storage)); + stor->dirty = 0; + stor->storage_status = 1; + sd->state.storage_flag = 1; + clif_storageitemlist (sd, stor); + clif_storageequiplist (sd, stor); + clif_updatestorageamount (sd, stor); + + return 0; } // 倉庫データ送信成功 -int intif_parse_SaveStorage(int fd) -{ - if(battle_config.save_log) - printf("intif_savestorage: done %d %d\n",RFIFOL(fd,2),RFIFOB(fd,6) ); - storage_storage_saved(RFIFOL(fd,2)); - return 0; -} - -int intif_parse_LoadGuildStorage(int fd) -{ - struct guild_storage *gstor; - struct map_session_data *sd; - int guild_id; - - guild_id = RFIFOL(fd,8); - if(guild_id > 0) { - gstor=guild2storage(guild_id); - if(!gstor) { - if(battle_config.error_log) - printf("intif_parse_LoadGuildStorage: error guild_id %d not exist\n",guild_id); - return 1; - } - if( RFIFOW(fd,2)-12 != sizeof(struct guild_storage) ){ - gstor->storage_status = 0; - if(battle_config.error_log) - printf("intif_parse_LoadGuildStorage: data size error %d %d\n",RFIFOW(fd,2)-12 , sizeof(struct guild_storage)); - return 1; - } - sd=map_id2sd( RFIFOL(fd,4) ); - if(sd==NULL){ - if(battle_config.error_log) - printf("intif_parse_LoadGuildStorage: user not found %d\n",RFIFOL(fd,4)); - return 1; - } - if (gstor->storage_status == 1) { // Already open.. lets ignore this update - if (battle_config.error_log) - printf("intif_parse_LoadGuildStorage: storage received for a client already open (User %d:%d)\n", sd->status.account_id, sd->status.char_id); - return 1; - } - if (gstor->dirty) { // Already have storage, and it has been modified and not saved yet! Exploit! [Skotlex] - if (battle_config.error_log) - printf("intif_parse_LoadGuildStorage: received storage for an already modified non-saved storage! (User %d:%d)\n", sd->status.account_id, sd->status.char_id); - return 1; - } - if(battle_config.save_log) - printf("intif_open_guild_storage: %d\n",RFIFOL(fd,4) ); - memcpy(gstor,RFIFOP(fd,12),sizeof(struct guild_storage)); - gstor->storage_status = 1; - sd->state.storage_flag = 2; - clif_guildstorageitemlist(sd,gstor); - clif_guildstorageequiplist(sd,gstor); - clif_updateguildstorageamount(sd,gstor); - } - return 0; -} -int intif_parse_SaveGuildStorage(int fd) -{ - if(battle_config.save_log) { - printf("intif_save_guild_storage: done %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOB(fd,10) ); - } - storage_guild_storagesaved(/*RFIFOL(fd,2), */RFIFOL(fd,6)); - return 0; +int intif_parse_SaveStorage (int fd) +{ + if (battle_config.save_log) + printf ("intif_savestorage: done %d %d\n", RFIFOL (fd, 2), + RFIFOB (fd, 6)); + storage_storage_saved (RFIFOL (fd, 2)); + return 0; +} + +int intif_parse_LoadGuildStorage (int fd) +{ + struct guild_storage *gstor; + struct map_session_data *sd; + int guild_id; + + guild_id = RFIFOL (fd, 8); + if (guild_id > 0) + { + gstor = guild2storage (guild_id); + if (!gstor) + { + if (battle_config.error_log) + printf + ("intif_parse_LoadGuildStorage: error guild_id %d not exist\n", + guild_id); + return 1; + } + if (RFIFOW (fd, 2) - 12 != sizeof (struct guild_storage)) + { + gstor->storage_status = 0; + if (battle_config.error_log) + printf + ("intif_parse_LoadGuildStorage: data size error %d %d\n", + RFIFOW (fd, 2) - 12, sizeof (struct guild_storage)); + return 1; + } + sd = map_id2sd (RFIFOL (fd, 4)); + if (sd == NULL) + { + if (battle_config.error_log) + printf ("intif_parse_LoadGuildStorage: user not found %d\n", + RFIFOL (fd, 4)); + return 1; + } + if (gstor->storage_status == 1) + { // Already open.. lets ignore this update + if (battle_config.error_log) + printf + ("intif_parse_LoadGuildStorage: storage received for a client already open (User %d:%d)\n", + sd->status.account_id, sd->status.char_id); + return 1; + } + if (gstor->dirty) + { // Already have storage, and it has been modified and not saved yet! Exploit! [Skotlex] + if (battle_config.error_log) + printf + ("intif_parse_LoadGuildStorage: received storage for an already modified non-saved storage! (User %d:%d)\n", + sd->status.account_id, sd->status.char_id); + return 1; + } + if (battle_config.save_log) + printf ("intif_open_guild_storage: %d\n", RFIFOL (fd, 4)); + memcpy (gstor, RFIFOP (fd, 12), sizeof (struct guild_storage)); + gstor->storage_status = 1; + sd->state.storage_flag = 2; + clif_guildstorageitemlist (sd, gstor); + clif_guildstorageequiplist (sd, gstor); + clif_updateguildstorageamount (sd, gstor); + } + return 0; +} + +int intif_parse_SaveGuildStorage (int fd) +{ + if (battle_config.save_log) + { + printf ("intif_save_guild_storage: done %d %d %d\n", RFIFOL (fd, 2), + RFIFOL (fd, 6), RFIFOB (fd, 10)); + } + storage_guild_storagesaved ( /*RFIFOL(fd,2), */ RFIFOL (fd, 6)); + return 0; } // パーティ作成可否 -int intif_parse_PartyCreated(int fd) +int intif_parse_PartyCreated (int fd) { - if(battle_config.etc_log) - printf("intif: party created\n"); - party_created(RFIFOL(fd,2),RFIFOB(fd,6),RFIFOL(fd,7),RFIFOP(fd,11)); - return 0; + if (battle_config.etc_log) + printf ("intif: party created\n"); + party_created (RFIFOL (fd, 2), RFIFOB (fd, 6), RFIFOL (fd, 7), + RFIFOP (fd, 11)); + return 0; } + // パーティ情報 -int intif_parse_PartyInfo(int fd) -{ - if( RFIFOW(fd,2)==8){ - if(battle_config.error_log) - printf("intif: party noinfo %d\n",RFIFOL(fd,4)); - party_recv_noinfo(RFIFOL(fd,4)); - return 0; - } - -// printf("intif: party info %d\n",RFIFOL(fd,4)); - if( RFIFOW(fd,2)!=sizeof(struct party)+4 ){ - if(battle_config.error_log) - printf("intif: party info : data size error %d %d %d\n",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct party)+4); - } - party_recv_info((struct party *)RFIFOP(fd,4)); - return 0; +int intif_parse_PartyInfo (int fd) +{ + if (RFIFOW (fd, 2) == 8) + { + if (battle_config.error_log) + printf ("intif: party noinfo %d\n", RFIFOL (fd, 4)); + party_recv_noinfo (RFIFOL (fd, 4)); + return 0; + } + +// printf("intif: party info %d\n",RFIFOL(fd,4)); + if (RFIFOW (fd, 2) != sizeof (struct party) + 4) + { + if (battle_config.error_log) + printf ("intif: party info : data size error %d %d %d\n", + RFIFOL (fd, 4), RFIFOW (fd, 2), + sizeof (struct party) + 4); + } + party_recv_info ((struct party *) RFIFOP (fd, 4)); + return 0; } + // パーティ追加通知 -int intif_parse_PartyMemberAdded(int fd) +int intif_parse_PartyMemberAdded (int fd) { - if(battle_config.etc_log) - printf("intif: party member added %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOB(fd,10)); - party_member_added(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOB(fd,10)); - return 0; + if (battle_config.etc_log) + printf ("intif: party member added %d %d %d\n", RFIFOL (fd, 2), + RFIFOL (fd, 6), RFIFOB (fd, 10)); + party_member_added (RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOB (fd, 10)); + return 0; } + // パーティ設定変更通知 -int intif_parse_PartyOptionChanged(int fd) +int intif_parse_PartyOptionChanged (int fd) { - party_optionchanged(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12),RFIFOB(fd,14)); - return 0; + party_optionchanged (RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOW (fd, 10), + RFIFOW (fd, 12), RFIFOB (fd, 14)); + return 0; } + // パーティ脱退通知 -int intif_parse_PartyMemberLeaved(int fd) +int intif_parse_PartyMemberLeaved (int fd) { - if(battle_config.etc_log) - printf("intif: party member leaved %d %d %s\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10)); - party_member_leaved(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10)); - return 0; + if (battle_config.etc_log) + printf ("intif: party member leaved %d %d %s\n", RFIFOL (fd, 2), + RFIFOL (fd, 6), RFIFOP (fd, 10)); + party_member_leaved (RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOP (fd, 10)); + return 0; } + // パーティ解散通知 -int intif_parse_PartyBroken(int fd) +int intif_parse_PartyBroken (int fd) { - party_broken(RFIFOL(fd,2)); - return 0; + party_broken (RFIFOL (fd, 2)); + return 0; } + // パーティ移動通知 -int intif_parse_PartyMove(int fd) +int intif_parse_PartyMove (int fd) { -// if(battle_config.etc_log) -// printf("intif: party move %d %d %s %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27)); - party_recv_movemap(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27)); - return 0; +// if(battle_config.etc_log) +// printf("intif: party move %d %d %s %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOP(fd,10),RFIFOB(fd,26),RFIFOW(fd,27)); + party_recv_movemap (RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOP (fd, 10), + RFIFOB (fd, 26), RFIFOW (fd, 27)); + return 0; } + // パーティメッセージ -int intif_parse_PartyMessage(int fd) +int intif_parse_PartyMessage (int fd) { -// if(battle_config.etc_log) -// printf("intif_parse_PartyMessage: %s\n",RFIFOP(fd,12)); - party_recv_message(RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12); - return 0; +// if(battle_config.etc_log) +// printf("intif_parse_PartyMessage: %s\n",RFIFOP(fd,12)); + party_recv_message (RFIFOL (fd, 4), RFIFOL (fd, 8), RFIFOP (fd, 12), + RFIFOW (fd, 2) - 12); + return 0; } // ギルド作成可否 -int intif_parse_GuildCreated(int fd) +int intif_parse_GuildCreated (int fd) { - guild_created(RFIFOL(fd,2),RFIFOL(fd,6)); - return 0; + guild_created (RFIFOL (fd, 2), RFIFOL (fd, 6)); + return 0; } + // ギルド情報 -int intif_parse_GuildInfo(int fd) -{ - if( RFIFOW(fd,2)==8){ - if(battle_config.error_log) - printf("intif: guild noinfo %d\n",RFIFOL(fd,4)); - guild_recv_noinfo(RFIFOL(fd,4)); - return 0; - } - -// if(battle_config.etc_log) -// printf("intif: guild info %d\n",RFIFOL(fd,4)); - if( RFIFOW(fd,2)!=sizeof(struct guild)+4 ){ - if(battle_config.error_log) - printf("intif: guild info : data size error\n %d %d %d",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct guild)+4); - } - guild_recv_info((struct guild *)RFIFOP(fd,4)); - return 0; +int intif_parse_GuildInfo (int fd) +{ + if (RFIFOW (fd, 2) == 8) + { + if (battle_config.error_log) + printf ("intif: guild noinfo %d\n", RFIFOL (fd, 4)); + guild_recv_noinfo (RFIFOL (fd, 4)); + return 0; + } + +// if(battle_config.etc_log) +// printf("intif: guild info %d\n",RFIFOL(fd,4)); + if (RFIFOW (fd, 2) != sizeof (struct guild) + 4) + { + if (battle_config.error_log) + printf ("intif: guild info : data size error\n %d %d %d", + RFIFOL (fd, 4), RFIFOW (fd, 2), + sizeof (struct guild) + 4); + } + guild_recv_info ((struct guild *) RFIFOP (fd, 4)); + return 0; } + // ギルドメンバ追加通知 -int intif_parse_GuildMemberAdded(int fd) +int intif_parse_GuildMemberAdded (int fd) { - if(battle_config.etc_log) - printf("intif: guild member added %d %d %d %d\n",RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14)); - guild_member_added(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14)); - return 0; + if (battle_config.etc_log) + printf ("intif: guild member added %d %d %d %d\n", RFIFOL (fd, 2), + RFIFOL (fd, 6), RFIFOL (fd, 10), RFIFOB (fd, 14)); + guild_member_added (RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10), + RFIFOB (fd, 14)); + return 0; } + // ギルドメンバ脱退/追放通知 -int intif_parse_GuildMemberLeaved(int fd) +int intif_parse_GuildMemberLeaved (int fd) { - guild_member_leaved(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14), - RFIFOP(fd,55),RFIFOP(fd,15)); - return 0; + guild_member_leaved (RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10), + RFIFOB (fd, 14), RFIFOP (fd, 55), RFIFOP (fd, 15)); + return 0; } // ギルドメンバオンライン状態/Lv変更通知 -int intif_parse_GuildMemberInfoShort(int fd) +int intif_parse_GuildMemberInfoShort (int fd) { - guild_recv_memberinfoshort(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOB(fd,14),RFIFOW(fd,15),RFIFOW(fd,17)); - return 0; + guild_recv_memberinfoshort (RFIFOL (fd, 2), RFIFOL (fd, 6), + RFIFOL (fd, 10), RFIFOB (fd, 14), RFIFOW (fd, + 15), + RFIFOW (fd, 17)); + return 0; } + // ギルド解散通知 -int intif_parse_GuildBroken(int fd) +int intif_parse_GuildBroken (int fd) { - guild_broken(RFIFOL(fd,2),RFIFOB(fd,6)); - return 0; + guild_broken (RFIFOL (fd, 2), RFIFOB (fd, 6)); + return 0; } // ギルド基本情報変更通知 -int intif_parse_GuildBasicInfoChanged(int fd) -{ - int type=RFIFOW(fd,8),guild_id=RFIFOL(fd,4); - void *data=RFIFOP(fd,10); - struct guild *g=guild_search(guild_id); - short dw=*((short *)data); - int dd=*((int *)data); - if( g==NULL ) - return 0; - switch(type){ - case GBI_EXP: g->exp=dd; break; - case GBI_GUILDLV: g->guild_lv=dw; break; - case GBI_SKILLPOINT: g->skill_point=dd; break; - } - return 0; +int intif_parse_GuildBasicInfoChanged (int fd) +{ + int type = RFIFOW (fd, 8), guild_id = RFIFOL (fd, 4); + void *data = RFIFOP (fd, 10); + struct guild *g = guild_search (guild_id); + short dw = *((short *) data); + int dd = *((int *) data); + if (g == NULL) + return 0; + switch (type) + { + case GBI_EXP: + g->exp = dd; + break; + case GBI_GUILDLV: + g->guild_lv = dw; + break; + case GBI_SKILLPOINT: + g->skill_point = dd; + break; + } + return 0; } + // ギルドメンバ情報変更通知 -int intif_parse_GuildMemberInfoChanged(int fd) -{ - int type=RFIFOW(fd,16),guild_id=RFIFOL(fd,4); - int account_id=RFIFOL(fd,8),char_id=RFIFOL(fd,12); - void *data=RFIFOP(fd,18); - struct guild *g=guild_search(guild_id); - int idx,dd=*((int *)data); - if( g==NULL ) - return 0; - idx=guild_getindex(g,account_id,char_id); - switch(type){ - case GMI_POSITION: - g->member[idx].position=dd; - guild_memberposition_changed(g,idx,dd); - break; - case GMI_EXP: - g->member[idx].exp=dd; - break; - } - return 0; +int intif_parse_GuildMemberInfoChanged (int fd) +{ + int type = RFIFOW (fd, 16), guild_id = RFIFOL (fd, 4); + int account_id = RFIFOL (fd, 8), char_id = RFIFOL (fd, 12); + void *data = RFIFOP (fd, 18); + struct guild *g = guild_search (guild_id); + int idx, dd = *((int *) data); + if (g == NULL) + return 0; + idx = guild_getindex (g, account_id, char_id); + switch (type) + { + case GMI_POSITION: + g->member[idx].position = dd; + guild_memberposition_changed (g, idx, dd); + break; + case GMI_EXP: + g->member[idx].exp = dd; + break; + } + return 0; } // ギルド役職変更通知 -int intif_parse_GuildPosition(int fd) +int intif_parse_GuildPosition (int fd) { - if( RFIFOW(fd,2)!=sizeof(struct guild_position)+12 ){ - if(battle_config.error_log) - printf("intif: guild info : data size error\n %d %d %d",RFIFOL(fd,4),RFIFOW(fd,2),sizeof(struct guild_position)+12); - } - guild_position_changed(RFIFOL(fd,4),RFIFOL(fd,8),(struct guild_position *)RFIFOP(fd,12)); - return 0; + if (RFIFOW (fd, 2) != sizeof (struct guild_position) + 12) + { + if (battle_config.error_log) + printf ("intif: guild info : data size error\n %d %d %d", + RFIFOL (fd, 4), RFIFOW (fd, 2), + sizeof (struct guild_position) + 12); + } + guild_position_changed (RFIFOL (fd, 4), RFIFOL (fd, 8), + (struct guild_position *) RFIFOP (fd, 12)); + return 0; } + // ギルドスキル割り振り通知 -int intif_parse_GuildSkillUp(int fd) +int intif_parse_GuildSkillUp (int fd) { - guild_skillupack(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10)); - return 0; + guild_skillupack (RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10)); + return 0; } + // ギルド同盟/敵対通知 -int intif_parse_GuildAlliance(int fd) +int intif_parse_GuildAlliance (int fd) { - guild_allianceack(RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10),RFIFOL(fd,14), - RFIFOB(fd,18),RFIFOP(fd,19),RFIFOP(fd,43)); - return 0; + guild_allianceack (RFIFOL (fd, 2), RFIFOL (fd, 6), RFIFOL (fd, 10), + RFIFOL (fd, 14), RFIFOB (fd, 18), RFIFOP (fd, 19), + RFIFOP (fd, 43)); + return 0; } + // ギルド告知変更通知 -int intif_parse_GuildNotice(int fd) +int intif_parse_GuildNotice (int fd) { - guild_notice_changed(RFIFOL(fd,2),RFIFOP(fd,6),RFIFOP(fd,66)); - return 0; + guild_notice_changed (RFIFOL (fd, 2), RFIFOP (fd, 6), RFIFOP (fd, 66)); + return 0; } + // ギルドエンブレム変更通知 -int intif_parse_GuildEmblem(int fd) +int intif_parse_GuildEmblem (int fd) { - guild_emblem_changed(RFIFOW(fd,2)-12,RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12)); - return 0; + guild_emblem_changed (RFIFOW (fd, 2) - 12, RFIFOL (fd, 4), RFIFOL (fd, 8), + RFIFOP (fd, 12)); + return 0; } + // ギルド会話受信 -int intif_parse_GuildMessage(int fd) +int intif_parse_GuildMessage (int fd) { - guild_recv_message(RFIFOL(fd,4),RFIFOL(fd,8),RFIFOP(fd,12),RFIFOW(fd,2)-12); - return 0; + guild_recv_message (RFIFOL (fd, 4), RFIFOL (fd, 8), RFIFOP (fd, 12), + RFIFOW (fd, 2) - 12); + return 0; } + // ギルド城データ要求返信 -int intif_parse_GuildCastleDataLoad(int fd) +int intif_parse_GuildCastleDataLoad (int fd) { - return guild_castledataloadack(RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5)); + return guild_castledataloadack (RFIFOW (fd, 2), RFIFOB (fd, 4), + RFIFOL (fd, 5)); } + // ギルド城データ変更通知 -int intif_parse_GuildCastleDataSave(int fd) +int intif_parse_GuildCastleDataSave (int fd) { - return guild_castledatasaveack(RFIFOW(fd,2),RFIFOB(fd,4),RFIFOL(fd,5)); + return guild_castledatasaveack (RFIFOW (fd, 2), RFIFOB (fd, 4), + RFIFOL (fd, 5)); } // ギルド城データ一括受信(初期化時) -int intif_parse_GuildCastleAllDataLoad(int fd) +int intif_parse_GuildCastleAllDataLoad (int fd) { - return guild_castlealldataload(RFIFOW(fd,2),(struct guild_castle *)RFIFOP(fd,4)); + return guild_castlealldataload (RFIFOW (fd, 2), + (struct guild_castle *) RFIFOP (fd, 4)); } //----------------------------------------------------------------- // inter serverからの通信 // エラーがあれば0(false)を返すこと // パケットが処理できれば1,パケット長が足りなければ2を返すこと -int intif_parse(int fd) -{ - int packet_len; - int cmd = RFIFOW(fd,0); - // パケットのID確認 - if(cmd<0x3800 || cmd>=0x3800+(sizeof(packet_len_table)/sizeof(packet_len_table[0])) || - packet_len_table[cmd-0x3800]==0){ - return 0; - } - // パケットの長さ確認 - packet_len = packet_len_table[cmd-0x3800]; - if(packet_len==-1){ - if(RFIFOREST(fd)<4) - return 2; - packet_len = RFIFOW(fd,2); - } -// if(battle_config.etc_log) -// printf("intif_parse %d %x %d %d\n",fd,cmd,packet_len,RFIFOREST(fd)); - if(RFIFOREST(fd)<packet_len){ - return 2; - } - // 処理分岐 - switch(cmd){ - case 0x3800: clif_GMmessage(NULL,RFIFOP(fd,4),packet_len-4,0); break; - case 0x3801: intif_parse_WisMessage(fd); break; - case 0x3802: intif_parse_WisEnd(fd); break; - case 0x3803: mapif_parse_WisToGM(fd); break; - case 0x3804: intif_parse_AccountReg(fd); break; - case 0x3810: intif_parse_LoadStorage(fd); break; - case 0x3811: intif_parse_SaveStorage(fd); break; - case 0x3818: intif_parse_LoadGuildStorage(fd); break; - case 0x3819: intif_parse_SaveGuildStorage(fd); break; - case 0x3820: intif_parse_PartyCreated(fd); break; - case 0x3821: intif_parse_PartyInfo(fd); break; - case 0x3822: intif_parse_PartyMemberAdded(fd); break; - case 0x3823: intif_parse_PartyOptionChanged(fd); break; - case 0x3824: intif_parse_PartyMemberLeaved(fd); break; - case 0x3825: intif_parse_PartyMove(fd); break; - case 0x3826: intif_parse_PartyBroken(fd); break; - case 0x3827: intif_parse_PartyMessage(fd); break; - case 0x3830: intif_parse_GuildCreated(fd); break; - case 0x3831: intif_parse_GuildInfo(fd); break; - case 0x3832: intif_parse_GuildMemberAdded(fd); break; - case 0x3834: intif_parse_GuildMemberLeaved(fd); break; - case 0x3835: intif_parse_GuildMemberInfoShort(fd); break; - case 0x3836: intif_parse_GuildBroken(fd); break; - case 0x3837: intif_parse_GuildMessage(fd); break; - case 0x3839: intif_parse_GuildBasicInfoChanged(fd); break; - case 0x383a: intif_parse_GuildMemberInfoChanged(fd); break; - case 0x383b: intif_parse_GuildPosition(fd); break; - case 0x383c: intif_parse_GuildSkillUp(fd); break; - case 0x383d: intif_parse_GuildAlliance(fd); break; - case 0x383e: intif_parse_GuildNotice(fd); break; - case 0x383f: intif_parse_GuildEmblem(fd); break; - case 0x3840: intif_parse_GuildCastleDataLoad(fd); break; - case 0x3841: intif_parse_GuildCastleDataSave(fd); break; - case 0x3842: intif_parse_GuildCastleAllDataLoad(fd); break; - //case 0x3880: intif_parse_CreateP.et(fd); break; - //case 0x3881: intif_parse_RecvP.etData(fd); break; - //case 0x3882: intif_parse_SaveP.etOk(fd); break; - //case 0x3883: intif_parse_DeleteP.etOk(fd); break; - default: - if(battle_config.error_log) - printf("intif_parse : unknown packet %d %x\n",fd,RFIFOW(fd,0)); - return 0; - } - // パケット読み飛ばし - RFIFOSKIP(fd,packet_len); - return 1; +int intif_parse (int fd) +{ + int packet_len; + int cmd = RFIFOW (fd, 0); + // パケットのID確認 + if (cmd < 0x3800 + || cmd >= + 0x3800 + (sizeof (packet_len_table) / sizeof (packet_len_table[0])) + || packet_len_table[cmd - 0x3800] == 0) + { + return 0; + } + // パケットの長さ確認 + packet_len = packet_len_table[cmd - 0x3800]; + if (packet_len == -1) + { + if (RFIFOREST (fd) < 4) + return 2; + packet_len = RFIFOW (fd, 2); + } +// if(battle_config.etc_log) +// printf("intif_parse %d %x %d %d\n",fd,cmd,packet_len,RFIFOREST(fd)); + if (RFIFOREST (fd) < packet_len) + { + return 2; + } + // 処理分岐 + switch (cmd) + { + case 0x3800: + clif_GMmessage (NULL, RFIFOP (fd, 4), packet_len - 4, 0); + break; + case 0x3801: + intif_parse_WisMessage (fd); + break; + case 0x3802: + intif_parse_WisEnd (fd); + break; + case 0x3803: + mapif_parse_WisToGM (fd); + break; + case 0x3804: + intif_parse_AccountReg (fd); + break; + case 0x3810: + intif_parse_LoadStorage (fd); + break; + case 0x3811: + intif_parse_SaveStorage (fd); + break; + case 0x3818: + intif_parse_LoadGuildStorage (fd); + break; + case 0x3819: + intif_parse_SaveGuildStorage (fd); + break; + case 0x3820: + intif_parse_PartyCreated (fd); + break; + case 0x3821: + intif_parse_PartyInfo (fd); + break; + case 0x3822: + intif_parse_PartyMemberAdded (fd); + break; + case 0x3823: + intif_parse_PartyOptionChanged (fd); + break; + case 0x3824: + intif_parse_PartyMemberLeaved (fd); + break; + case 0x3825: + intif_parse_PartyMove (fd); + break; + case 0x3826: + intif_parse_PartyBroken (fd); + break; + case 0x3827: + intif_parse_PartyMessage (fd); + break; + case 0x3830: + intif_parse_GuildCreated (fd); + break; + case 0x3831: + intif_parse_GuildInfo (fd); + break; + case 0x3832: + intif_parse_GuildMemberAdded (fd); + break; + case 0x3834: + intif_parse_GuildMemberLeaved (fd); + break; + case 0x3835: + intif_parse_GuildMemberInfoShort (fd); + break; + case 0x3836: + intif_parse_GuildBroken (fd); + break; + case 0x3837: + intif_parse_GuildMessage (fd); + break; + case 0x3839: + intif_parse_GuildBasicInfoChanged (fd); + break; + case 0x383a: + intif_parse_GuildMemberInfoChanged (fd); + break; + case 0x383b: + intif_parse_GuildPosition (fd); + break; + case 0x383c: + intif_parse_GuildSkillUp (fd); + break; + case 0x383d: + intif_parse_GuildAlliance (fd); + break; + case 0x383e: + intif_parse_GuildNotice (fd); + break; + case 0x383f: + intif_parse_GuildEmblem (fd); + break; + case 0x3840: + intif_parse_GuildCastleDataLoad (fd); + break; + case 0x3841: + intif_parse_GuildCastleDataSave (fd); + break; + case 0x3842: + intif_parse_GuildCastleAllDataLoad (fd); + break; + //case 0x3880: intif_parse_CreateP.et(fd); break; + //case 0x3881: intif_parse_RecvP.etData(fd); break; + //case 0x3882: intif_parse_SaveP.etOk(fd); break; + //case 0x3883: intif_parse_DeleteP.etOk(fd); break; + default: + if (battle_config.error_log) + printf ("intif_parse : unknown packet %d %x\n", fd, + RFIFOW (fd, 0)); + return 0; + } + // パケット読み飛ばし + RFIFOSKIP (fd, packet_len); + return 1; } diff --git a/src/map/intif.h b/src/map/intif.h index 6f8a342..b6abd78 100644 --- a/src/map/intif.h +++ b/src/map/intif.h @@ -2,49 +2,55 @@ #ifndef _INTIF_H_ #define _INFIF_H_ -int intif_parse(int fd); - -int intif_GMmessage(char* mes,int len,int flag); - -int intif_wis_message(struct map_session_data *sd,char *nick,char *mes,int mes_len); -int intif_wis_message_to_gm(char *Wisp_name, int min_gm_level, char *mes, int mes_len); - -int intif_saveaccountreg(struct map_session_data *sd); -int intif_request_accountreg(struct map_session_data *sd); - -int intif_request_storage(int account_id); -int intif_send_storage(struct storage *stor); -int intif_request_guild_storage(int account_id, int guild_id); -int intif_send_guild_storage(int account_id, struct guild_storage *gstor); - - -int intif_create_party(struct map_session_data *sd,char *name); -int intif_request_partyinfo(int party_id); -int intif_party_addmember(int party_id, int account_id); -int intif_party_changeoption(int party_id, int account_id, int exp, int item); -int intif_party_leave(int party_id, int accound_id); -int intif_party_changemap(struct map_session_data *sd, int online); -int intif_break_party(int party_id); -int intif_party_message(int party_id, int account_id, char *mes,int len); -int intif_party_checkconflict(int party_id, int account_id, char *nick); - - -int intif_guild_create(const char *name, const struct guild_member *master); -int intif_guild_request_info(int guild_id); -int intif_guild_addmember(int guild_id, struct guild_member *m); -int intif_guild_leave(int guild_id, int account_id, int char_id, int flag, const char *mes); -int intif_guild_memberinfoshort(int guild_id, int account_id, int char_id, int online, int lv, int class); -int intif_guild_break(int guild_id); -int intif_guild_message(int guild_id, int account_id, char *mes, int len); -int intif_guild_checkconflict(int guild_id, int account_id, int char_id); -int intif_guild_change_basicinfo(int guild_id, int type, const void *data, int len); -int intif_guild_change_memberinfo(int guild_id, int account_id, int char_id, int type, const void *data, int len); -int intif_guild_position(int guild_id, int idx, struct guild_position *p); -int intif_guild_skillup(int guild_id, int skill_num, int account_id); -int intif_guild_alliance(int guild_id1, int guild_id2, int account_id1, int account_id2, int flag); -int intif_guild_notice(int guild_id, const char *mes1, const char *mes2); -int intif_guild_emblem(int guild_id, int len, const char *data); -int intif_guild_castle_dataload(int castle_id, int index); -int intif_guild_castle_datasave(int castle_id, int index, int value); +int intif_parse (int fd); + +int intif_GMmessage (char *mes, int len, int flag); + +int intif_wis_message (struct map_session_data *sd, char *nick, char *mes, + int mes_len); +int intif_wis_message_to_gm (char *Wisp_name, int min_gm_level, char *mes, + int mes_len); + +int intif_saveaccountreg (struct map_session_data *sd); +int intif_request_accountreg (struct map_session_data *sd); + +int intif_request_storage (int account_id); +int intif_send_storage (struct storage *stor); +int intif_request_guild_storage (int account_id, int guild_id); +int intif_send_guild_storage (int account_id, struct guild_storage *gstor); + +int intif_create_party (struct map_session_data *sd, char *name); +int intif_request_partyinfo (int party_id); +int intif_party_addmember (int party_id, int account_id); +int intif_party_changeoption (int party_id, int account_id, int exp, + int item); +int intif_party_leave (int party_id, int accound_id); +int intif_party_changemap (struct map_session_data *sd, int online); +int intif_break_party (int party_id); +int intif_party_message (int party_id, int account_id, char *mes, int len); +int intif_party_checkconflict (int party_id, int account_id, char *nick); + +int intif_guild_create (const char *name, const struct guild_member *master); +int intif_guild_request_info (int guild_id); +int intif_guild_addmember (int guild_id, struct guild_member *m); +int intif_guild_leave (int guild_id, int account_id, int char_id, int flag, + const char *mes); +int intif_guild_memberinfoshort (int guild_id, int account_id, int char_id, + int online, int lv, int class); +int intif_guild_break (int guild_id); +int intif_guild_message (int guild_id, int account_id, char *mes, int len); +int intif_guild_checkconflict (int guild_id, int account_id, int char_id); +int intif_guild_change_basicinfo (int guild_id, int type, const void *data, + int len); +int intif_guild_change_memberinfo (int guild_id, int account_id, int char_id, + int type, const void *data, int len); +int intif_guild_position (int guild_id, int idx, struct guild_position *p); +int intif_guild_skillup (int guild_id, int skill_num, int account_id); +int intif_guild_alliance (int guild_id1, int guild_id2, int account_id1, + int account_id2, int flag); +int intif_guild_notice (int guild_id, const char *mes1, const char *mes2); +int intif_guild_emblem (int guild_id, int len, const char *data); +int intif_guild_castle_dataload (int castle_id, int index); +int intif_guild_castle_datasave (int castle_id, int index, int value); #endif diff --git a/src/map/itemdb.c b/src/map/itemdb.c index 3b49b50..cf2910a 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -22,213 +22,234 @@ // ** ITEMDB_OVERRIDE_NAME_VERBOSE ** // 定義すると、itemdb.txtとgrfで名前が異なる場合、表示します. -//#define ITEMDB_OVERRIDE_NAME_VERBOSE 1 +//#define ITEMDB_OVERRIDE_NAME_VERBOSE 1 -static struct dbt* item_db; +static struct dbt *item_db; -static struct random_item_data blue_box[MAX_RANDITEM],violet_box[MAX_RANDITEM],card_album[MAX_RANDITEM],gift_box[MAX_RANDITEM],scroll[MAX_RANDITEM]; -static int blue_box_count=0,violet_box_count=0,card_album_count=0,gift_box_count=0,scroll_count=0; -static int blue_box_default=0,violet_box_default=0,card_album_default=0,gift_box_default=0,scroll_default=0; +static struct random_item_data blue_box[MAX_RANDITEM], + violet_box[MAX_RANDITEM], card_album[MAX_RANDITEM], + gift_box[MAX_RANDITEM], scroll[MAX_RANDITEM]; +static int blue_box_count = 0, violet_box_count = 0, card_album_count = + 0, gift_box_count = 0, scroll_count = 0; +static int blue_box_default = 0, violet_box_default = 0, card_album_default = + 0, gift_box_default = 0, scroll_default = 0; // Function declarations -static void itemdb_read(void); -static int itemdb_readdb(void); -static int itemdb_read_randomitem(); -static int itemdb_read_itemavail(void); -static int itemdb_read_itemnametable(void); -static int itemdb_read_noequip(void); -void itemdb_reload(void); +static void itemdb_read (void); +static int itemdb_readdb (void); +static int itemdb_read_randomitem (); +static int itemdb_read_itemavail (void); +static int itemdb_read_itemnametable (void); +static int itemdb_read_noequip (void); +void itemdb_reload (void); /*========================================== * 名前で検索用 *------------------------------------------ */ // name = item alias, so we should find items aliases first. if not found then look for "jname" (full name) -int itemdb_searchname_sub(void *key,void *data,va_list ap) +int itemdb_searchname_sub (void *key, void *data, va_list ap) { - struct item_data *item=(struct item_data *)data,**dst; - char *str; - str=va_arg(ap,char *); - dst=va_arg(ap,struct item_data **); -// if( strcmpi(item->name,str)==0 || strcmp(item->jname,str)==0 || -// memcmp(item->name,str,24)==0 || memcmp(item->jname,str,24)==0 ) - if( strcmpi(item->name,str)==0 ) //by lupus - *dst=item; - return 0; + struct item_data *item = (struct item_data *) data, **dst; + char *str; + str = va_arg (ap, char *); + dst = va_arg (ap, struct item_data **); +// if( strcmpi(item->name,str)==0 || strcmp(item->jname,str)==0 || +// memcmp(item->name,str,24)==0 || memcmp(item->jname,str,24)==0 ) + if (strcmpi (item->name, str) == 0) //by lupus + *dst = item; + return 0; } /*========================================== * 名前で検索用 *------------------------------------------ */ -int itemdb_searchjname_sub(void *key,void *data,va_list ap) +int itemdb_searchjname_sub (void *key, void *data, va_list ap) { - struct item_data *item=(struct item_data *)data,**dst; - char *str; - str=va_arg(ap,char *); - dst=va_arg(ap,struct item_data **); - if( strcmpi(item->jname,str)==0 ) - *dst=item; - return 0; + struct item_data *item = (struct item_data *) data, **dst; + char *str; + str = va_arg (ap, char *); + dst = va_arg (ap, struct item_data **); + if (strcmpi (item->jname, str) == 0) + *dst = item; + return 0; } + /*========================================== * 名前で検索 *------------------------------------------ */ -struct item_data* itemdb_searchname(const char *str) +struct item_data *itemdb_searchname (const char *str) { - struct item_data *item=NULL; - numdb_foreach(item_db,itemdb_searchname_sub,str,&item); - return item; + struct item_data *item = NULL; + numdb_foreach (item_db, itemdb_searchname_sub, str, &item); + return item; } /*========================================== * 箱系アイテム検索 *------------------------------------------ */ -int itemdb_searchrandomid(int flags) +int itemdb_searchrandomid (int flags) { - int nameid=0,i,index,count; - struct random_item_data *list=NULL; - - struct { - int nameid,count; - struct random_item_data *list; - } data[] ={ - { 0,0,NULL }, - { blue_box_default ,blue_box_count ,blue_box }, - { violet_box_default,violet_box_count ,violet_box }, - { card_album_default,card_album_count ,card_album }, - { gift_box_default ,gift_box_count ,gift_box }, - { scroll_default ,scroll_count ,scroll }, - }; - - if(flags>=1 && flags<=5){ - nameid=data[flags].nameid; - count=data[flags].count; - list=data[flags].list; - - if(count > 0) { - for(i=0;i<1000;i++) { - index = MRAND(count); - if( MRAND(1000000) < list[index].per) { - nameid = list[index].nameid; - break; - } - } - } - } - return nameid; + int nameid = 0, i, index, count; + struct random_item_data *list = NULL; + + struct + { + int nameid, count; + struct random_item_data *list; + } data[] = + { + { + 0, 0, NULL}, + { + blue_box_default, blue_box_count, blue_box}, + { + violet_box_default, violet_box_count, violet_box}, + { + card_album_default, card_album_count, card_album}, + { + gift_box_default, gift_box_count, gift_box}, + { + scroll_default, scroll_count, scroll},}; + + if (flags >= 1 && flags <= 5) + { + nameid = data[flags].nameid; + count = data[flags].count; + list = data[flags].list; + + if (count > 0) + { + for (i = 0; i < 1000; i++) + { + index = MRAND (count); + if (MRAND (1000000) < list[index].per) + { + nameid = list[index].nameid; + break; + } + } + } + } + return nameid; } /*========================================== * DBの存在確認 *------------------------------------------ */ -struct item_data* itemdb_exists(int nameid) +struct item_data *itemdb_exists (int nameid) { - return numdb_search(item_db,nameid); + return numdb_search (item_db, nameid); } + /*========================================== * DBの検索 *------------------------------------------ */ -struct item_data* itemdb_search(int nameid) +struct item_data *itemdb_search (int nameid) { - struct item_data *id; - - id=numdb_search(item_db,nameid); - if(id) return id; - - id=(struct item_data *)aCalloc(1,sizeof(struct item_data)); - numdb_insert(item_db,nameid,id); - - id->nameid=nameid; - id->value_buy=10; - id->value_sell=id->value_buy/2; - id->weight=10; - id->sex=2; - id->elv=0; - id->flag.available=0; - id->flag.value_notdc=0; //一応・・・ - id->flag.value_notoc=0; - id->flag.no_equip=0; - id->view_id=0; - - if(nameid>500 && nameid<600) - id->type=0; //heal item - else if(nameid>600 && nameid<700) - id->type=2; //use item - else if((nameid>700 && nameid<1100) || - (nameid>7000 && nameid<8000)) - id->type=3; //correction - else if(nameid>=1750 && nameid<1771) - id->type=10; //arrow - else if(nameid>1100 && nameid<2000) - id->type=4; //weapon - else if((nameid>2100 && nameid<3000) || - (nameid>5000 && nameid<6000)) - id->type=5; //armor - else if(nameid>4000 && nameid<5000) - id->type=6; //card - - return id; + struct item_data *id; + + id = numdb_search (item_db, nameid); + if (id) + return id; + + id = (struct item_data *) aCalloc (1, sizeof (struct item_data)); + numdb_insert (item_db, nameid, id); + + id->nameid = nameid; + id->value_buy = 10; + id->value_sell = id->value_buy / 2; + id->weight = 10; + id->sex = 2; + id->elv = 0; + id->flag.available = 0; + id->flag.value_notdc = 0; //一応・・・ + id->flag.value_notoc = 0; + id->flag.no_equip = 0; + id->view_id = 0; + + if (nameid > 500 && nameid < 600) + id->type = 0; //heal item + else if (nameid > 600 && nameid < 700) + id->type = 2; //use item + else if ((nameid > 700 && nameid < 1100) || + (nameid > 7000 && nameid < 8000)) + id->type = 3; //correction + else if (nameid >= 1750 && nameid < 1771) + id->type = 10; //arrow + else if (nameid > 1100 && nameid < 2000) + id->type = 4; //weapon + else if ((nameid > 2100 && nameid < 3000) || + (nameid > 5000 && nameid < 6000)) + id->type = 5; //armor + else if (nameid > 4000 && nameid < 5000) + id->type = 6; //card + + return id; } /*========================================== * *------------------------------------------ */ -int itemdb_isequip(int nameid) +int itemdb_isequip (int nameid) { - int type=itemdb_type(nameid); - if(type==0 || type==2 || type==3 || type==6 || type==10) - return 0; - return 1; + int type = itemdb_type (nameid); + if (type == 0 || type == 2 || type == 3 || type == 6 || type == 10) + return 0; + return 1; } + /*========================================== * *------------------------------------------ */ -int itemdb_isequip2(struct item_data *data) +int itemdb_isequip2 (struct item_data *data) { - if(data) { - int type=data->type; - if(type==0 || type==2 || type==3 || type==6 || type==10) - return 0; - else - return 1; - } - return 0; + if (data) + { + int type = data->type; + if (type == 0 || type == 2 || type == 3 || type == 6 || type == 10) + return 0; + else + return 1; + } + return 0; } /*========================================== * *------------------------------------------ */ -int itemdb_isequip3(int nameid) +int itemdb_isequip3 (int nameid) { - int type=itemdb_type(nameid); - if(type==4 || type==5 || type == 8) - return 1; - return 0; + int type = itemdb_type (nameid); + if (type == 4 || type == 5 || type == 8) + return 1; + return 0; } /*========================================== * 捨てられるアイテムは1、そうでないアイテムは0 *------------------------------------------ */ -int itemdb_isdropable(int nameid) +int itemdb_isdropable (int nameid) { - //結婚指輪は捨てられない - switch(nameid){ - case 2634: //結婚指輪 - case 2635: //結婚指輪 - return 0; - } - - return 1; + //結婚指輪は捨てられない + switch (nameid) + { + case 2634: //結婚指輪 + case 2635: //結婚指輪 + return 0; + } + + return 1; } // @@ -238,121 +259,138 @@ int itemdb_isdropable(int nameid) * *------------------------------------------ */ -static int itemdb_read_itemslottable(void) +static int itemdb_read_itemslottable (void) { - char *buf,*p; - int s; - - buf=grfio_read("data\\itemslottable.txt"); - if(buf==NULL) - return -1; - s=grfio_size("data\\itemslottable.txt"); - buf[s]=0; - for(p=buf;p-buf<s;){ - int nameid,equip; - sscanf(p,"%d#%d#",&nameid,&equip); - itemdb_search(nameid)->equip=equip; - p=strchr(p,10); - if(!p) break; - p++; - p=strchr(p,10); - if(!p) break; - p++; - } - free(buf); - - return 0; + char *buf, *p; + int s; + + buf = grfio_read ("data\\itemslottable.txt"); + if (buf == NULL) + return -1; + s = grfio_size ("data\\itemslottable.txt"); + buf[s] = 0; + for (p = buf; p - buf < s;) + { + int nameid, equip; + sscanf (p, "%d#%d#", &nameid, &equip); + itemdb_search (nameid)->equip = equip; + p = strchr (p, 10); + if (!p) + break; + p++; + p = strchr (p, 10); + if (!p) + break; + p++; + } + free (buf); + + return 0; } /*========================================== * アイテムデータベースの読み込み *------------------------------------------ */ -static int itemdb_readdb(void) +static int itemdb_readdb (void) { - FILE *fp; - char line[1024]; - int ln=0,lines=0; - int nameid,j; - char *str[32],*p,*np; - struct item_data *id; - int i=0; - char *filename[]={ "db/item_db.txt","db/item_db2.txt" }; - - for(i=0;i<2;i++){ - - fp=fopen_(filename[i],"r"); - if(fp==NULL){ - if(i>0) - continue; - printf("can't read %s\n",filename[i]); - exit(1); - } - - lines=0; - while(fgets(line,1020,fp)){ - lines++; - if(line[0]=='/' && line[1]=='/') - continue; - memset(str,0,sizeof(str)); - for(j=0,np=p=line;j<17 && p;j++){ - while (*p == '\t' || *p == ' ') p++; - str[j]=p; - p=strchr(p,','); - if(p){ *p++=0; np=p; } - } - if(str[0]==NULL) - continue; - - nameid=atoi(str[0]); - if(nameid<=0 || nameid>=20000) - continue; - ln++; - - //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Gender,Loc,wLV,eLV,View - id=itemdb_search(nameid); - memcpy(id->name,str[1],24); - memcpy(id->jname,str[2],24); - id->type=atoi(str[3]); - id->value_buy=atoi(str[4]); - id->value_sell=atoi(str[5]); - if (id->value_buy == 0 && id->value_sell == 0) { - } else if (id->value_buy == 0) { - id->value_buy=id->value_sell*2; - } else if (id->value_sell == 0) { - id->value_sell=id->value_buy/2; - } - id->weight=atoi(str[6]); - id->atk=atoi(str[7]); - id->def=atoi(str[8]); - id->range=atoi(str[9]); - id->magic_bonus = atoi(str[10]); - id->slot=atoi(str[11]); - id->sex=atoi(str[12]); - id->equip=atoi(str[13]); - id->wlv=atoi(str[14]); - id->elv=atoi(str[15]); - id->look=atoi(str[16]); - id->flag.available=1; - id->flag.value_notdc=0; - id->flag.value_notoc=0; - id->view_id=0; - - id->use_script=NULL; - id->equip_script=NULL; - - if((p=strchr(np,'{'))==NULL) - continue; - id->use_script = parse_script(p,lines); - - if((p=strchr(p+1,'{'))==NULL) - continue; - id->equip_script = parse_script(p,lines); - } - fclose_(fp); - printf("read %s done (count=%d)\n",filename[i],ln); - } - return 0; + FILE *fp; + char line[1024]; + int ln = 0, lines = 0; + int nameid, j; + char *str[32], *p, *np; + struct item_data *id; + int i = 0; + char *filename[] = { "db/item_db.txt", "db/item_db2.txt" }; + + for (i = 0; i < 2; i++) + { + + fp = fopen_ (filename[i], "r"); + if (fp == NULL) + { + if (i > 0) + continue; + printf ("can't read %s\n", filename[i]); + exit (1); + } + + lines = 0; + while (fgets (line, 1020, fp)) + { + lines++; + if (line[0] == '/' && line[1] == '/') + continue; + memset (str, 0, sizeof (str)); + for (j = 0, np = p = line; j < 17 && p; j++) + { + while (*p == '\t' || *p == ' ') + p++; + str[j] = p; + p = strchr (p, ','); + if (p) + { + *p++ = 0; + np = p; + } + } + if (str[0] == NULL) + continue; + + nameid = atoi (str[0]); + if (nameid <= 0 || nameid >= 20000) + continue; + ln++; + + //ID,Name,Jname,Type,Price,Sell,Weight,ATK,DEF,Range,Slot,Job,Gender,Loc,wLV,eLV,View + id = itemdb_search (nameid); + memcpy (id->name, str[1], 24); + memcpy (id->jname, str[2], 24); + id->type = atoi (str[3]); + id->value_buy = atoi (str[4]); + id->value_sell = atoi (str[5]); + if (id->value_buy == 0 && id->value_sell == 0) + { + } + else if (id->value_buy == 0) + { + id->value_buy = id->value_sell * 2; + } + else if (id->value_sell == 0) + { + id->value_sell = id->value_buy / 2; + } + id->weight = atoi (str[6]); + id->atk = atoi (str[7]); + id->def = atoi (str[8]); + id->range = atoi (str[9]); + id->magic_bonus = atoi (str[10]); + id->slot = atoi (str[11]); + id->sex = atoi (str[12]); + id->equip = atoi (str[13]); + id->wlv = atoi (str[14]); + id->elv = atoi (str[15]); + id->look = atoi (str[16]); + id->flag.available = 1; + id->flag.value_notdc = 0; + id->flag.value_notoc = 0; + id->view_id = 0; + + id->use_script = NULL; + id->equip_script = NULL; + + if ((p = strchr (np, '{')) == NULL) + continue; + id->use_script = parse_script (p, lines); + + if ((p = strchr (p + 1, '{')) == NULL) + continue; + id->equip_script = parse_script (p, lines); + } + fclose_ (fp); + printf ("read %s done (count=%d)\n", filename[i], ln); + } + return 0; } // Removed item_value_db, don't re-add! @@ -361,285 +399,319 @@ static int itemdb_readdb(void) * ランダムアイテム出現データの読み込み *------------------------------------------ */ -static int itemdb_read_randomitem() +static int itemdb_read_randomitem () { - FILE *fp; - char line[1024]; - int ln=0; - int nameid,i,j; - char *str[10],*p; - - const struct { - char filename[64]; - struct random_item_data *pdata; - int *pcount,*pdefault; - } data[] = { - {"db/item_bluebox.txt", blue_box, &blue_box_count, &blue_box_default }, - {"db/item_violetbox.txt", violet_box, &violet_box_count, &violet_box_default }, - {"db/item_cardalbum.txt", card_album, &card_album_count, &card_album_default }, - {"db/item_giftbox.txt", gift_box, &gift_box_count, &gift_box_default }, - {"db/item_scroll.txt", scroll, &scroll_count, &scroll_default }, - }; - - for(i=0;i<sizeof(data)/sizeof(data[0]);i++){ - struct random_item_data *pd=data[i].pdata; - int *pc=data[i].pcount; - int *pdefault=data[i].pdefault; - const char *fn=data[i].filename; - - - *pdefault = 0; - if( (fp=fopen_(fn,"r"))==NULL ){ - printf("can't read %s\n",fn); - continue; - } - - while(fgets(line,1020,fp)){ - if(line[0]=='/' && line[1]=='/') - continue; - memset(str,0,sizeof(str)); - for(j=0,p=line;j<3 && p;j++){ - str[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } - - if(str[0]==NULL) - continue; - - nameid=atoi(str[0]); - if(nameid<0 || nameid>=20000) - continue; - if(nameid == 0) { - if(str[2]) - *pdefault = atoi(str[2]); - continue; - } - - if(str[2]){ - pd[ *pc ].nameid = nameid; - pd[(*pc)++].per = atoi(str[2]); - } - - if(ln >= MAX_RANDITEM) - break; - ln++; - } - fclose_(fp); - printf("read %s done (count=%d)\n",fn,*pc); - } - - return 0; + FILE *fp; + char line[1024]; + int ln = 0; + int nameid, i, j; + char *str[10], *p; + + const struct + { + char filename[64]; + struct random_item_data *pdata; + int *pcount, *pdefault; + } data[] = + { + { + "db/item_bluebox.txt", blue_box, &blue_box_count, + &blue_box_default}, + { + "db/item_violetbox.txt", violet_box, &violet_box_count, + &violet_box_default}, + { + "db/item_cardalbum.txt", card_album, &card_album_count, + &card_album_default}, + { + "db/item_giftbox.txt", gift_box, &gift_box_count, + &gift_box_default}, + { + "db/item_scroll.txt", scroll, &scroll_count, &scroll_default},}; + + for (i = 0; i < sizeof (data) / sizeof (data[0]); i++) + { + struct random_item_data *pd = data[i].pdata; + int *pc = data[i].pcount; + int *pdefault = data[i].pdefault; + const char *fn = data[i].filename; + + *pdefault = 0; + if ((fp = fopen_ (fn, "r")) == NULL) + { + printf ("can't read %s\n", fn); + continue; + } + + while (fgets (line, 1020, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + memset (str, 0, sizeof (str)); + for (j = 0, p = line; j < 3 && p; j++) + { + str[j] = p; + p = strchr (p, ','); + if (p) + *p++ = 0; + } + + if (str[0] == NULL) + continue; + + nameid = atoi (str[0]); + if (nameid < 0 || nameid >= 20000) + continue; + if (nameid == 0) + { + if (str[2]) + *pdefault = atoi (str[2]); + continue; + } + + if (str[2]) + { + pd[*pc].nameid = nameid; + pd[(*pc)++].per = atoi (str[2]); + } + + if (ln >= MAX_RANDITEM) + break; + ln++; + } + fclose_ (fp); + printf ("read %s done (count=%d)\n", fn, *pc); + } + + return 0; } + /*========================================== * アイテム使用可能フラグのオーバーライド *------------------------------------------ */ -static int itemdb_read_itemavail(void) +static int itemdb_read_itemavail (void) { - FILE *fp; - char line[1024]; - int ln=0; - int nameid,j,k; - char *str[10],*p; - - if( (fp=fopen_("db/item_avail.txt","r"))==NULL ){ - printf("can't read db/item_avail.txt\n"); - return -1; - } - - while(fgets(line,1020,fp)){ - struct item_data *id; - if(line[0]=='/' && line[1]=='/') - continue; - memset(str,0,sizeof(str)); - for(j=0,p=line;j<2 && p;j++){ - str[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } - - if(str[0]==NULL) - continue; - - nameid=atoi(str[0]); - if(nameid<0 || nameid>=20000 || !(id=itemdb_exists(nameid)) ) - continue; - k=atoi(str[1]); - if(k > 0) { - id->flag.available = 1; - id->view_id = k; - } - else - id->flag.available = 0; - ln++; - } - fclose_(fp); - printf("read db/item_avail.txt done (count=%d)\n",ln); - return 0; + FILE *fp; + char line[1024]; + int ln = 0; + int nameid, j, k; + char *str[10], *p; + + if ((fp = fopen_ ("db/item_avail.txt", "r")) == NULL) + { + printf ("can't read db/item_avail.txt\n"); + return -1; + } + + while (fgets (line, 1020, fp)) + { + struct item_data *id; + if (line[0] == '/' && line[1] == '/') + continue; + memset (str, 0, sizeof (str)); + for (j = 0, p = line; j < 2 && p; j++) + { + str[j] = p; + p = strchr (p, ','); + if (p) + *p++ = 0; + } + + if (str[0] == NULL) + continue; + + nameid = atoi (str[0]); + if (nameid < 0 || nameid >= 20000 || !(id = itemdb_exists (nameid))) + continue; + k = atoi (str[1]); + if (k > 0) + { + id->flag.available = 1; + id->view_id = k; + } + else + id->flag.available = 0; + ln++; + } + fclose_ (fp); + printf ("read db/item_avail.txt done (count=%d)\n", ln); + return 0; } /*========================================== * アイテムの名前テーブルを読み込む *------------------------------------------ */ -static int itemdb_read_itemnametable(void) +static int itemdb_read_itemnametable (void) { - char *buf,*p; - int s; + char *buf, *p; + int s; - buf=grfio_reads("data\\idnum2itemdisplaynametable.txt",&s); + buf = grfio_reads ("data\\idnum2itemdisplaynametable.txt", &s); - if(buf==NULL) - return -1; + if (buf == NULL) + return -1; - buf[s]=0; - for(p=buf;p-buf<s;){ - int nameid; - char buf2[64]; + buf[s] = 0; + for (p = buf; p - buf < s;) + { + int nameid; + char buf2[64]; - if( sscanf(p,"%d#%[^#]#",&nameid,buf2)==2 ){ + if (sscanf (p, "%d#%[^#]#", &nameid, buf2) == 2) + { #ifdef ITEMDB_OVERRIDE_NAME_VERBOSE - if( itemdb_exists(nameid) && - strncmp(itemdb_search(nameid)->jname,buf2,24)!=0 ){ - printf("[override] %d %s => %s\n",nameid - ,itemdb_search(nameid)->jname,buf2); - } + if (itemdb_exists (nameid) && + strncmp (itemdb_search (nameid)->jname, buf2, 24) != 0) + { + printf ("[override] %d %s => %s\n", nameid, + itemdb_search (nameid)->jname, buf2); + } #endif - memcpy(itemdb_search(nameid)->jname,buf2,24); - } + memcpy (itemdb_search (nameid)->jname, buf2, 24); + } - p=strchr(p,10); - if(!p) break; - p++; - } - free(buf); - printf("read data\\idnum2itemdisplaynametable.txt done.\n"); + p = strchr (p, 10); + if (!p) + break; + p++; + } + free (buf); + printf ("read data\\idnum2itemdisplaynametable.txt done.\n"); - return 0; + return 0; } /*========================================== * カードイラストのリソース名前テーブルを読み込む *------------------------------------------ */ -static int itemdb_read_cardillustnametable(void) +static int itemdb_read_cardillustnametable (void) { - char *buf,*p; - int s; - - buf=grfio_reads("data\\num2cardillustnametable.txt",&s); - - if(buf==NULL) - return -1; - - buf[s]=0; - for(p=buf;p-buf<s;){ - int nameid; - char buf2[64]; - - if( sscanf(p,"%d#%[^#]#",&nameid,buf2)==2 ){ - strcat(buf2,".bmp"); - memcpy(itemdb_search(nameid)->cardillustname,buf2,64); -// printf("%d %s\n",nameid,itemdb_search(nameid)->cardillustname); - } - - p=strchr(p,10); - if(!p) break; - p++; - } - free(buf); - printf("read data\\num2cardillustnametable.txt done.\n"); - - return 0; + char *buf, *p; + int s; + + buf = grfio_reads ("data\\num2cardillustnametable.txt", &s); + + if (buf == NULL) + return -1; + + buf[s] = 0; + for (p = buf; p - buf < s;) + { + int nameid; + char buf2[64]; + + if (sscanf (p, "%d#%[^#]#", &nameid, buf2) == 2) + { + strcat (buf2, ".bmp"); + memcpy (itemdb_search (nameid)->cardillustname, buf2, 64); +// printf("%d %s\n",nameid,itemdb_search(nameid)->cardillustname); + } + + p = strchr (p, 10); + if (!p) + break; + p++; + } + free (buf); + printf ("read data\\num2cardillustnametable.txt done.\n"); + + return 0; } /*========================================== * 装備制限ファイル読み出し *------------------------------------------ */ -static int itemdb_read_noequip(void) +static int itemdb_read_noequip (void) { - FILE *fp; - char line[1024]; - int ln=0; - int nameid,j; - char *str[32],*p; - struct item_data *id; - - if( (fp=fopen_("db/item_noequip.txt","r"))==NULL ){ - printf("can't read db/item_noequip.txt\n"); - return -1; - } - while(fgets(line,1020,fp)){ - if(line[0]=='/' && line[1]=='/') - continue; - memset(str,0,sizeof(str)); - for(j=0,p=line;j<2 && p;j++){ - str[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } - if(str[0]==NULL) - continue; - - nameid=atoi(str[0]); - if(nameid<=0 || nameid>=20000 || !(id=itemdb_exists(nameid))) - continue; - - id->flag.no_equip=atoi(str[1]); - - ln++; - - } - fclose_(fp); - printf("read db/item_noequip.txt done (count=%d)\n",ln); - return 0; + FILE *fp; + char line[1024]; + int ln = 0; + int nameid, j; + char *str[32], *p; + struct item_data *id; + + if ((fp = fopen_ ("db/item_noequip.txt", "r")) == NULL) + { + printf ("can't read db/item_noequip.txt\n"); + return -1; + } + while (fgets (line, 1020, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + memset (str, 0, sizeof (str)); + for (j = 0, p = line; j < 2 && p; j++) + { + str[j] = p; + p = strchr (p, ','); + if (p) + *p++ = 0; + } + if (str[0] == NULL) + continue; + + nameid = atoi (str[0]); + if (nameid <= 0 || nameid >= 20000 || !(id = itemdb_exists (nameid))) + continue; + + id->flag.no_equip = atoi (str[1]); + + ln++; + + } + fclose_ (fp); + printf ("read db/item_noequip.txt done (count=%d)\n", ln); + return 0; } /*========================================== * *------------------------------------------ */ -static int itemdb_final(void *key,void *data,va_list ap) +static int itemdb_final (void *key, void *data, va_list ap) { - struct item_data *id; + struct item_data *id; - nullpo_retr(0, id=data); + nullpo_retr (0, id = data); - if(id->use_script) - free(id->use_script); - if(id->equip_script) - free(id->equip_script); - free(id); + if (id->use_script) + free (id->use_script); + if (id->equip_script) + free (id->equip_script); + free (id); - return 0; + return 0; } -void itemdb_reload(void) +void itemdb_reload (void) { - /* - - <empty item databases> - itemdb_read(); - - */ - - do_init_itemdb(); + /* + * + * <empty item databases> + * itemdb_read(); + * + */ + + do_init_itemdb (); } /*========================================== * *------------------------------------------ */ -void do_final_itemdb(void) +void do_final_itemdb (void) { - if(item_db){ - numdb_final(item_db,itemdb_final); - item_db=NULL; - } + if (item_db) + { + numdb_final (item_db, itemdb_final); + item_db = NULL; + } } /* @@ -661,27 +733,27 @@ void itemdebugtxt() * Removed item_value_db, don't re-add *------------------------------------ */ -static void itemdb_read(void) +static void itemdb_read (void) { - itemdb_read_itemslottable(); - itemdb_readdb(); - itemdb_read_randomitem(); - itemdb_read_itemavail(); - itemdb_read_noequip(); - itemdb_read_cardillustnametable(); - if (!battle_config.item_name_override_grffile) - itemdb_read_itemnametable(); + itemdb_read_itemslottable (); + itemdb_readdb (); + itemdb_read_randomitem (); + itemdb_read_itemavail (); + itemdb_read_noequip (); + itemdb_read_cardillustnametable (); + if (!battle_config.item_name_override_grffile) + itemdb_read_itemnametable (); } /*========================================== * *------------------------------------------ */ -int do_init_itemdb(void) +int do_init_itemdb (void) { - item_db = numdb_init(); + item_db = numdb_init (); - itemdb_read(); + itemdb_read (); - return 0; + return 0; } diff --git a/src/map/itemdb.h b/src/map/itemdb.h index 9c971a3..de07822 100644 --- a/src/map/itemdb.h +++ b/src/map/itemdb.h @@ -4,47 +4,50 @@ #include "map.h" -struct item_data { - int nameid; - char name[24],jname[24]; - char prefix[24],suffix[24]; - char cardillustname[64]; - int value_buy; - int value_sell; - int type; - int sex; - int equip; - int weight; - int atk; - int def; - int range; - int magic_bonus; - int slot; - int look; - int elv; - int wlv; - int refine; - char *use_script; - char *equip_script; - struct { - unsigned available : 1; - unsigned value_notdc : 1; - unsigned value_notoc : 1; - unsigned no_equip : 3; - unsigned no_drop : 1; - unsigned no_use : 1; - } flag; - int view_id; +struct item_data +{ + int nameid; + char name[24], jname[24]; + char prefix[24], suffix[24]; + char cardillustname[64]; + int value_buy; + int value_sell; + int type; + int sex; + int equip; + int weight; + int atk; + int def; + int range; + int magic_bonus; + int slot; + int look; + int elv; + int wlv; + int refine; + char *use_script; + char *equip_script; + struct + { + unsigned available:1; + unsigned value_notdc:1; + unsigned value_notoc:1; + unsigned no_equip:3; + unsigned no_drop:1; + unsigned no_use:1; + } flag; + int view_id; }; -struct random_item_data { - int nameid; - int per; +struct random_item_data +{ + int nameid; + int per; }; -struct item_data* itemdb_searchname(const char *name); -struct item_data* itemdb_search(int nameid); -struct item_data* itemdb_exists(int nameid); +struct item_data *itemdb_searchname (const char *name); +struct item_data *itemdb_search (int nameid); +struct item_data *itemdb_exists (int nameid); #define itemdb_type(n) itemdb_search(n)->type #define itemdb_atk(n) itemdb_search(n)->atk #define itemdb_def(n) itemdb_search(n)->def @@ -59,21 +62,21 @@ struct item_data* itemdb_exists(int nameid); #define itemdb_available(n) (itemdb_exists(n) && itemdb_search(n)->flag.available) #define itemdb_viewid(n) (itemdb_search(n)->view_id) -int itemdb_searchrandomid(int flags); +int itemdb_searchrandomid (int flags); #define itemdb_value_buy(n) itemdb_search(n)->value_buy #define itemdb_value_sell(n) itemdb_search(n)->value_sell #define itemdb_value_notdc(n) itemdb_search(n)->flag.value_notdc #define itemdb_value_notoc(n) itemdb_search(n)->flag.value_notoc -int itemdb_isequip(int); -int itemdb_isequip2(struct item_data *); -int itemdb_isequip3(int); -int itemdb_isdropable(int nameid); +int itemdb_isequip (int); +int itemdb_isequip2 (struct item_data *); +int itemdb_isequip3 (int); +int itemdb_isdropable (int nameid); -void itemdb_reload(void); +void itemdb_reload (void); -void do_final_itemdb(void); -int do_init_itemdb(void); +void do_final_itemdb (void); +int do_init_itemdb (void); #endif diff --git a/src/map/magic-expr-eval.h b/src/map/magic-expr-eval.h index b859919..71c1d86 100644 --- a/src/map/magic-expr-eval.h +++ b/src/map/magic-expr-eval.h @@ -3,15 +3,16 @@ /* Helper definitions for dealing with functions and operations */ -static int heading_x[8] = { 0, -1, -1, -1, 0, 1, 1, 1 }; -static int heading_y[8] = { 1, 1, 0, -1, -1, -1, 0, 1 }; +static int heading_x[8] = { 0, -1, -1, -1, 0, 1, 1, 1 }; +static int heading_y[8] = { 1, 1, 0, -1, -1, -1, 0, 1 }; int -magic_signature_check(char *opname, char *funname, char *signature, int args_nr, val_t *args, int line, int column); + magic_signature_check (char *opname, char *funname, char *signature, + int args_nr, val_t * args, int line, int column); void -magic_area_rect(int *m, int *x, int *y, int *width, int *height, area_t *area); - +magic_area_rect (int *m, int *x, int *y, int *width, int *height, + area_t * area); #define ARGINT(x) args[x].v.v_int #define ARGDIR(x) args[x].v.v_int diff --git a/src/map/magic-expr.c b/src/map/magic-expr.c index 9d3c751..e78247a 100644 --- a/src/map/magic-expr.c +++ b/src/map/magic-expr.c @@ -5,1564 +5,1638 @@ #define IS_SOLID(c) ((c) == 1 || (c) == 5) -int -map_is_solid(int m, int x, int y) +int map_is_solid (int m, int x, int y) { - return (IS_SOLID(map_getcell(m, x, y))); + return (IS_SOLID (map_getcell (m, x, y))); } #undef IS_SOLID -static void -free_area(area_t *area) +static void free_area (area_t * area) { - if (!area) - return; + if (!area) + return; - switch (area->ty) { + switch (area->ty) + { case AREA_UNION: - free_area(area->a.a_union[0]); - free_area(area->a.a_union[1]); - break; - default: break; - } + free_area (area->a.a_union[0]); + free_area (area->a.a_union[1]); + break; + default: + break; + } - free(area); + free (area); } -static area_t * -dup_area(area_t *area) +static area_t *dup_area (area_t * area) { - area_t *retval = malloc(sizeof(area_t)); - *retval = *area; + area_t *retval = malloc (sizeof (area_t)); + *retval = *area; - switch (area->ty) { + switch (area->ty) + { case AREA_UNION: - retval->a.a_union[0] = dup_area(retval->a.a_union[0]); - retval->a.a_union[1] = dup_area(retval->a.a_union[1]); - break; - default: break; - } + retval->a.a_union[0] = dup_area (retval->a.a_union[0]); + retval->a.a_union[1] = dup_area (retval->a.a_union[1]); + break; + default: + break; + } - return retval; + return retval; } -void -magic_copy_var(val_t *dest, val_t *src) +void magic_copy_var (val_t * dest, val_t * src) { - *dest = *src; + *dest = *src; + + switch (dest->ty) + { + case TY_STRING: + dest->v.v_string = strdup (dest->v.v_string); + break; + case TY_AREA: + dest->v.v_area = dup_area (dest->v.v_area); + break; + default: + break; + } - switch (dest->ty) { - case TY_STRING: dest->v.v_string = strdup(dest->v.v_string); - break; - case TY_AREA: dest->v.v_area = dup_area(dest->v.v_area); - break; - default: break; - } - } -void -magic_clear_var(val_t *v) -{ - switch (v->ty) { - case TY_STRING: free(v->v.v_string); - break; - case TY_AREA: free_area(v->v.v_area); - break; - default: break; - } +void magic_clear_var (val_t * v) +{ + switch (v->ty) + { + case TY_STRING: + free (v->v.v_string); + break; + case TY_AREA: + free_area (v->v.v_area); + break; + default: + break; + } } -static char * -show_entity(entity_t *entity) +static char *show_entity (entity_t * entity) { - switch (entity->type) { + switch (entity->type) + { case BL_PC: - return ((struct map_session_data *)entity)->status.name; + return ((struct map_session_data *) entity)->status.name; case BL_NPC: - return ((struct npc_data *)entity)->name; + return ((struct npc_data *) entity)->name; case BL_MOB: - return ((struct mob_data *)entity)->name; + return ((struct mob_data *) entity)->name; case BL_ITEM: - /* Sorry about this one... */ - return ((struct item_data *)(&((struct flooritem_data *)entity)->item_data))->name; + /* Sorry about this one... */ + return ((struct item_data + *) (&((struct flooritem_data *) entity)-> + item_data))->name; case BL_SKILL: - return "%skill"; + return "%skill"; case BL_SPELL: - return "%invocation(ERROR:this-should-not-be-an-entity)"; + return "%invocation(ERROR:this-should-not-be-an-entity)"; default: - return "%unknown-entity"; - } + return "%unknown-entity"; + } } -static void -stringify(val_t *v, int within_op) +static void stringify (val_t * v, int within_op) { - static char *dirs[8] = {"south", "south-west", "west", "north-west", "north", "north-east", "east", "south-east"}; - char *buf; + static char *dirs[8] = + { "south", "south-west", "west", "north-west", "north", "north-east", + "east", "south-east" + }; + char *buf; - switch (v->ty) { + switch (v->ty) + { case TY_UNDEF: - buf = strdup("UNDEF"); - break; + buf = strdup ("UNDEF"); + break; case TY_INT: - buf = malloc(32); - sprintf(buf, "%i", v->v.v_int); - break; + buf = malloc (32); + sprintf (buf, "%i", v->v.v_int); + break; case TY_STRING: - return; + return; case TY_DIR: - buf = strdup(dirs[v->v.v_int]); - break; + buf = strdup (dirs[v->v.v_int]); + break; case TY_ENTITY: - buf = strdup(show_entity(v->v.v_entity)); - break; + buf = strdup (show_entity (v->v.v_entity)); + break; case TY_LOCATION: - buf = malloc(128); - sprintf(buf, "<\"%s\", %d, %d>", map[v->v.v_location.m].name, - v->v.v_location.x, v->v.v_location.y); - break; + buf = malloc (128); + sprintf (buf, "<\"%s\", %d, %d>", map[v->v.v_location.m].name, + v->v.v_location.x, v->v.v_location.y); + break; case TY_AREA: - buf = strdup("%area"); - free_area(v->v.v_area); - break; + buf = strdup ("%area"); + free_area (v->v.v_area); + break; case TY_SPELL: - buf = strdup(v->v.v_spell->name); - break; - - case TY_INVOCATION: { - invocation_t *invocation = within_op - ? v->v.v_invocation - : (invocation_t *) map_id2bl(v->v.v_int); - buf = strdup(invocation->spell->name); + buf = strdup (v->v.v_spell->name); + break; + + case TY_INVOCATION: + { + invocation_t *invocation = within_op + ? v->v.v_invocation : (invocation_t *) map_id2bl (v->v.v_int); + buf = strdup (invocation->spell->name); } - break; + break; default: - fprintf(stderr, "[magic] INTERNAL ERROR: Cannot stringify %d\n", v->ty); - return; - } + fprintf (stderr, "[magic] INTERNAL ERROR: Cannot stringify %d\n", + v->ty); + return; + } - v->v.v_string = buf; - v->ty = TY_STRING; + v->v.v_string = buf; + v->ty = TY_STRING; } -static void -intify(val_t *v) +static void intify (val_t * v) { - if (v->ty == TY_INT) - return; + if (v->ty == TY_INT) + return; - magic_clear_var(v); - v->ty = TY_INT; - v->v.v_int = 1; + magic_clear_var (v); + v->ty = TY_INT; + v->v.v_int = 1; } - -area_t * -area_new(int ty) +area_t *area_new (int ty) { - area_t *retval = (area_t *)aCalloc(sizeof(area_t), 1); - retval->ty = ty; - return retval; + area_t *retval = (area_t *) aCalloc (sizeof (area_t), 1); + retval->ty = ty; + return retval; } -area_t * -area_union(area_t *area, area_t *other_area) +area_t *area_union (area_t * area, area_t * other_area) { - area_t *retval = area_new(AREA_UNION); - retval->a.a_union[0] = area; - retval->a.a_union[1] = other_area; - retval->size = area->size + other_area->size; /* Assume no overlap */ - return retval; + area_t *retval = area_new (AREA_UNION); + retval->a.a_union[0] = area; + retval->a.a_union[1] = other_area; + retval->size = area->size + other_area->size; /* Assume no overlap */ + return retval; } /** * Turns location into area, leaves other types untouched */ -static void -make_area(val_t *v) -{ - if (v->ty == TY_LOCATION) { - area_t *a = malloc(sizeof (area_t)); - v->ty = TY_AREA; - a->ty = AREA_LOCATION; - a->a.a_loc = v->v.v_location; - v->v.v_area = a; - } -} - -static void -make_location(val_t *v) +static void make_area (val_t * v) { - if (v->ty == TY_AREA && - v->v.v_area->ty == AREA_LOCATION) { - location_t location = v->v.v_area->a.a_loc; - free_area(v->v.v_area); - v->ty = TY_LOCATION; - v->v.v_location = location; - } + if (v->ty == TY_LOCATION) + { + area_t *a = malloc (sizeof (area_t)); + v->ty = TY_AREA; + a->ty = AREA_LOCATION; + a->a.a_loc = v->v.v_location; + v->v.v_area = a; + } } -static void -make_spell(val_t *v) +static void make_location (val_t * v) { - if (v->ty == TY_INVOCATION) { - invocation_t *invoc = v->v.v_invocation; //(invocation_t *) map_id2bl(v->v.v_int); - if (!invoc) - v->ty = TY_FAIL; - else { - v->ty = TY_SPELL; - v->v.v_spell = invoc->spell; - } - } + if (v->ty == TY_AREA && v->v.v_area->ty == AREA_LOCATION) + { + location_t location = v->v.v_area->a.a_loc; + free_area (v->v.v_area); + v->ty = TY_LOCATION; + v->v.v_location = location; + } } -static int -fun_add(env_t *env, int args_nr, val_t *result, val_t *args) -{ - if (TY(0) == TY_INT && TY(1) == TY_INT) { - /* Integer addition */ - RESULTINT = ARGINT(0) + ARGINT(1); - result->ty = TY_INT; - } else if (ARG_MAY_BE_AREA(0) && ARG_MAY_BE_AREA(1)) { - /* Area union */ - make_area(&args[0]); - make_area(&args[1]); - RESULTAREA = area_union(ARGAREA(0), ARGAREA(1)); - ARGAREA(0) = NULL; - ARGAREA(1) = NULL; - result->ty = TY_AREA; - } else { - /* Anything else -> string concatenation */ - stringify(&args[0], 1); - stringify(&args[1], 1); - /* Yes, we could speed this up. */ - RESULTSTR = (char *) malloc(1 + strlen(ARGSTR(0)) + strlen(ARGSTR(1))); - strcpy(RESULTSTR, ARGSTR(0)); - strcat(RESULTSTR, ARGSTR(1)); - result->ty = TY_STRING; +static void make_spell (val_t * v) +{ + if (v->ty == TY_INVOCATION) + { + invocation_t *invoc = v->v.v_invocation; //(invocation_t *) map_id2bl(v->v.v_int); + if (!invoc) + v->ty = TY_FAIL; + else + { + v->ty = TY_SPELL; + v->v.v_spell = invoc->spell; } - return 0; + } } -static int -fun_sub(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_add (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = ARGINT(0) - ARGINT(1); - return 0; + if (TY (0) == TY_INT && TY (1) == TY_INT) + { + /* Integer addition */ + RESULTINT = ARGINT (0) + ARGINT (1); + result->ty = TY_INT; + } + else if (ARG_MAY_BE_AREA (0) && ARG_MAY_BE_AREA (1)) + { + /* Area union */ + make_area (&args[0]); + make_area (&args[1]); + RESULTAREA = area_union (ARGAREA (0), ARGAREA (1)); + ARGAREA (0) = NULL; + ARGAREA (1) = NULL; + result->ty = TY_AREA; + } + else + { + /* Anything else -> string concatenation */ + stringify (&args[0], 1); + stringify (&args[1], 1); + /* Yes, we could speed this up. */ + RESULTSTR = + (char *) malloc (1 + strlen (ARGSTR (0)) + strlen (ARGSTR (1))); + strcpy (RESULTSTR, ARGSTR (0)); + strcat (RESULTSTR, ARGSTR (1)); + result->ty = TY_STRING; + } + return 0; } - -static int -fun_mul(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_sub (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = ARGINT(0) * ARGINT(1); - return 0; + RESULTINT = ARGINT (0) - ARGINT (1); + return 0; } - -static int -fun_div(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_mul (env_t * env, int args_nr, val_t * result, val_t * args) { - if (!ARGINT(1)) - return 1; /* division by zero */ - RESULTINT = ARGINT(0) / ARGINT(1); - return 0; + RESULTINT = ARGINT (0) * ARGINT (1); + return 0; +} + +static int fun_div (env_t * env, int args_nr, val_t * result, val_t * args) +{ + if (!ARGINT (1)) + return 1; /* division by zero */ + RESULTINT = ARGINT (0) / ARGINT (1); + return 0; } -static int -fun_mod(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_mod (env_t * env, int args_nr, val_t * result, val_t * args) { - if (!ARGINT(1)) - return 1; /* division by zero */ - RESULTINT = ARGINT(0) % ARGINT(1); - return 0; + if (!ARGINT (1)) + return 1; /* division by zero */ + RESULTINT = ARGINT (0) % ARGINT (1); + return 0; } -static int -fun_or(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_or (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = ARGINT(0) || ARGINT(1); - return 0; + RESULTINT = ARGINT (0) || ARGINT (1); + return 0; } -static int -fun_and(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_and (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = ARGINT(0) && ARGINT(1); - return 0; + RESULTINT = ARGINT (0) && ARGINT (1); + return 0; } -static int -fun_not(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_not (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = !ARGINT(0); - return 0; + RESULTINT = !ARGINT (0); + return 0; } -static int -fun_neg(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_neg (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = ~ARGINT(0); - return 0; + RESULTINT = ~ARGINT (0); + return 0; } -static int -fun_gte(env_t *env, int args_nr, val_t *result, val_t *args) -{ - if (TY(0) == TY_STRING || TY(1) == TY_STRING) { - stringify(&args[0], 1); - stringify(&args[1], 1); - RESULTINT = strcmp(ARGSTR(0), ARGSTR(1)) >= 0; - } else { - intify(&args[0]); - intify(&args[1]); - RESULTINT = ARGINT(0) >= ARGINT(1); - } - return 0; +static int fun_gte (env_t * env, int args_nr, val_t * result, val_t * args) +{ + if (TY (0) == TY_STRING || TY (1) == TY_STRING) + { + stringify (&args[0], 1); + stringify (&args[1], 1); + RESULTINT = strcmp (ARGSTR (0), ARGSTR (1)) >= 0; + } + else + { + intify (&args[0]); + intify (&args[1]); + RESULTINT = ARGINT (0) >= ARGINT (1); + } + return 0; } -static int -fun_gt(env_t *env, int args_nr, val_t *result, val_t *args) -{ - if (TY(0) == TY_STRING || TY(1) == TY_STRING) { - stringify(&args[0], 1); - stringify(&args[1], 1); - RESULTINT = strcmp(ARGSTR(0), ARGSTR(1)) > 0; - } else { - intify(&args[0]); - intify(&args[1]); - RESULTINT = ARGINT(0) > ARGINT(1); - } - return 0; +static int fun_gt (env_t * env, int args_nr, val_t * result, val_t * args) +{ + if (TY (0) == TY_STRING || TY (1) == TY_STRING) + { + stringify (&args[0], 1); + stringify (&args[1], 1); + RESULTINT = strcmp (ARGSTR (0), ARGSTR (1)) > 0; + } + else + { + intify (&args[0]); + intify (&args[1]); + RESULTINT = ARGINT (0) > ARGINT (1); + } + return 0; } - -static int -fun_eq(env_t *env, int args_nr, val_t *result, val_t *args) -{ - if (TY(0) == TY_STRING || TY(1) == TY_STRING) { - stringify(&args[0], 1); - stringify(&args[1], 1); - RESULTINT = strcmp(ARGSTR(0), ARGSTR(1)) == 0; - } else if (TY(0) == TY_DIR && TY(1) == TY_DIR) - RESULTINT = ARGDIR(0) == ARGDIR(1); - else if (TY(0) == TY_ENTITY && TY(1) == TY_ENTITY) - RESULTINT = ARGENTITY(0) == ARGENTITY(1); - else if (TY(0) == TY_LOCATION && TY(1) == TY_LOCATION) - RESULTINT = (ARGLOCATION(0).x == ARGLOCATION(1).x - && ARGLOCATION(0).y == ARGLOCATION(1).y - && ARGLOCATION(0).m == ARGLOCATION(1).m); - else if (TY(0) == TY_AREA && TY(1) == TY_AREA) - RESULTINT = ARGAREA(0) == ARGAREA(1); /* Probably not that great an idea... */ - else if (TY(0) == TY_SPELL && TY(1) == TY_SPELL) - RESULTINT = ARGSPELL(0) == ARGSPELL(1); - else if (TY(0) == TY_INVOCATION && TY(1) == TY_INVOCATION) - RESULTINT = ARGINVOCATION(0) == ARGINVOCATION(1); - else { - intify(&args[0]); - intify(&args[1]); - RESULTINT = ARGINT(0) == ARGINT(1); - } - return 0; +static int fun_eq (env_t * env, int args_nr, val_t * result, val_t * args) +{ + if (TY (0) == TY_STRING || TY (1) == TY_STRING) + { + stringify (&args[0], 1); + stringify (&args[1], 1); + RESULTINT = strcmp (ARGSTR (0), ARGSTR (1)) == 0; + } + else if (TY (0) == TY_DIR && TY (1) == TY_DIR) + RESULTINT = ARGDIR (0) == ARGDIR (1); + else if (TY (0) == TY_ENTITY && TY (1) == TY_ENTITY) + RESULTINT = ARGENTITY (0) == ARGENTITY (1); + else if (TY (0) == TY_LOCATION && TY (1) == TY_LOCATION) + RESULTINT = (ARGLOCATION (0).x == ARGLOCATION (1).x + && ARGLOCATION (0).y == ARGLOCATION (1).y + && ARGLOCATION (0).m == ARGLOCATION (1).m); + else if (TY (0) == TY_AREA && TY (1) == TY_AREA) + RESULTINT = ARGAREA (0) == ARGAREA (1); /* Probably not that great an idea... */ + else if (TY (0) == TY_SPELL && TY (1) == TY_SPELL) + RESULTINT = ARGSPELL (0) == ARGSPELL (1); + else if (TY (0) == TY_INVOCATION && TY (1) == TY_INVOCATION) + RESULTINT = ARGINVOCATION (0) == ARGINVOCATION (1); + else + { + intify (&args[0]); + intify (&args[1]); + RESULTINT = ARGINT (0) == ARGINT (1); + } + return 0; } -static int -fun_bitand(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_bitand (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = ARGINT(0) & ARGINT(1); - return 0; + RESULTINT = ARGINT (0) & ARGINT (1); + return 0; } -static int -fun_bitor(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_bitor (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = ARGINT(0) | ARGINT(1); - return 0; + RESULTINT = ARGINT (0) | ARGINT (1); + return 0; } -static int -fun_bitxor(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_bitxor (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = ARGINT(0) ^ ARGINT(1); - return 0; + RESULTINT = ARGINT (0) ^ ARGINT (1); + return 0; } -static int -fun_bitshl(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_bitshl (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = ARGINT(0) << ARGINT(1); - return 0; + RESULTINT = ARGINT (0) << ARGINT (1); + return 0; } -static int -fun_bitshr(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_bitshr (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = ARGINT(0) >> ARGINT(1); - return 0; + RESULTINT = ARGINT (0) >> ARGINT (1); + return 0; } -static int -fun_max(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_max (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = MAX(ARGINT(0), ARGINT(1)); - return 0; + RESULTINT = MAX (ARGINT (0), ARGINT (1)); + return 0; } -static int -fun_min(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_min (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = MIN(ARGINT(0), ARGINT(1)); - return 0; + RESULTINT = MIN (ARGINT (0), ARGINT (1)); + return 0; } static int -fun_if_then_else(env_t *env, int args_nr, val_t *result, val_t *args) +fun_if_then_else (env_t * env, int args_nr, val_t * result, val_t * args) { - if (ARGINT(0)) - magic_copy_var(result, &args[1]); - else - magic_copy_var(result, &args[2]); - return 0; + if (ARGINT (0)) + magic_copy_var (result, &args[1]); + else + magic_copy_var (result, &args[2]); + return 0; } void -magic_area_rect(int *m, int *x, int *y, int *width, int *height, area_t *area) +magic_area_rect (int *m, int *x, int *y, int *width, int *height, + area_t * area) { - switch (area->ty) { - case AREA_UNION: break; + switch (area->ty) + { + case AREA_UNION: + break; case AREA_LOCATION: - *m = area->a.a_loc.m; - *x = area->a.a_loc.x; - *y = area->a.a_loc.y; - *width = 1; - *height = 1; - break; + *m = area->a.a_loc.m; + *x = area->a.a_loc.x; + *y = area->a.a_loc.y; + *width = 1; + *height = 1; + break; case AREA_RECT: - *m = area->a.a_rect.loc.m; - *x = area->a.a_rect.loc.x; - *y = area->a.a_rect.loc.y; - *width = area->a.a_rect.width; - *height = area->a.a_rect.height; - break; - - case AREA_BAR: { - int tx = area->a.a_bar.loc.x; - int ty = area->a.a_bar.loc.y; - int twidth = area->a.a_bar.width; - int tdepth = area->a.a_bar.width; - *m = area->a.a_bar.loc.m; - - switch (area->a.a_bar.dir) { + *m = area->a.a_rect.loc.m; + *x = area->a.a_rect.loc.x; + *y = area->a.a_rect.loc.y; + *width = area->a.a_rect.width; + *height = area->a.a_rect.height; + break; + + case AREA_BAR: + { + int tx = area->a.a_bar.loc.x; + int ty = area->a.a_bar.loc.y; + int twidth = area->a.a_bar.width; + int tdepth = area->a.a_bar.width; + *m = area->a.a_bar.loc.m; + + switch (area->a.a_bar.dir) + { case DIR_S: - *x = tx - twidth; - *y = ty; - *width = twidth * 2 + 1; - *height = tdepth; - break; + *x = tx - twidth; + *y = ty; + *width = twidth * 2 + 1; + *height = tdepth; + break; case DIR_W: - *x = tx - tdepth; - *y = ty - twidth; - *width = tdepth; - *height = twidth * 2 + 1; - break; + *x = tx - tdepth; + *y = ty - twidth; + *width = tdepth; + *height = twidth * 2 + 1; + break; case DIR_N: - *x = tx - twidth; - *y = ty - tdepth; - *width = twidth * 2 + 1; - *height = tdepth; - break; + *x = tx - twidth; + *y = ty - tdepth; + *width = twidth * 2 + 1; + *height = tdepth; + break; case DIR_E: - *x = tx; - *y = ty - twidth; - *width = tdepth; - *height = twidth * 2 + 1; - break; + *x = tx; + *y = ty - twidth; + *width = tdepth; + *height = twidth * 2 + 1; + break; default: - fprintf(stderr, "Error: Trying to compute area of NE/SE/NW/SW-facing bar"); - *x = tx; *y = ty; *width = *height = 1; - } - break; - } + fprintf (stderr, + "Error: Trying to compute area of NE/SE/NW/SW-facing bar"); + *x = tx; + *y = ty; + *width = *height = 1; + } + break; } + } } -int -magic_location_in_area(int m, int x, int y, area_t *area) +int magic_location_in_area (int m, int x, int y, area_t * area) { - switch (area->ty) { + switch (area->ty) + { case AREA_UNION: - return magic_location_in_area(m, x, y, area->a.a_union[0]) - || magic_location_in_area(m, x, y, area->a.a_union[1]); + return magic_location_in_area (m, x, y, area->a.a_union[0]) + || magic_location_in_area (m, x, y, area->a.a_union[1]); case AREA_LOCATION: case AREA_RECT: - case AREA_BAR: { - int am; - int ax, ay, awidth, aheight; - magic_area_rect(&am, &ax, &ay, &awidth, &aheight, area); - return (am == m - && (x >= ax) && (y >= ay) - && (x < ax + awidth) && (y < ay + aheight)); + case AREA_BAR: + { + int am; + int ax, ay, awidth, aheight; + magic_area_rect (&am, &ax, &ay, &awidth, &aheight, area); + return (am == m + && (x >= ax) && (y >= ay) + && (x < ax + awidth) && (y < ay + aheight)); } default: - fprintf(stderr, "INTERNAL ERROR: Invalid area\n"); - return 0; - } + fprintf (stderr, "INTERNAL ERROR: Invalid area\n"); + return 0; + } } - -static int -fun_is_in(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_is_in (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = magic_location_in_area(ARGLOCATION(0).m, - ARGLOCATION(0).x, - ARGLOCATION(0).y, - ARGAREA(1)); - return 0; + RESULTINT = magic_location_in_area (ARGLOCATION (0).m, + ARGLOCATION (0).x, + ARGLOCATION (0).y, ARGAREA (1)); + return 0; } -static int -fun_skill(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_skill (env_t * env, int args_nr, val_t * result, val_t * args) { - if (ETY(0) != BL_PC - || ARGINT(1) < 0 - || ARGINT(1) >= MAX_SKILL - || ARGPC(0)->status.skill[ARGINT(1)].id != ARGINT(1)) - RESULTINT = 0; - else - RESULTINT = ARGPC(0)->status.skill[ARGINT(1)].lv; - return 0; + if (ETY (0) != BL_PC + || ARGINT (1) < 0 + || ARGINT (1) >= MAX_SKILL + || ARGPC (0)->status.skill[ARGINT (1)].id != ARGINT (1)) + RESULTINT = 0; + else + RESULTINT = ARGPC (0)->status.skill[ARGINT (1)].lv; + return 0; } static int -fun_has_shroud(env_t *env, int args_nr, val_t *result, val_t *args) +fun_has_shroud (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = (ETY(0) == BL_PC - && ARGPC(0)->state.shroud_active); - return 0; + RESULTINT = (ETY (0) == BL_PC && ARGPC (0)->state.shroud_active); + return 0; } #define BATTLE_GETTER(name) static int fun_get_##name(env_t *env, int args_nr, val_t *result, val_t *args) { RESULTINT = battle_get_##name(ARGENTITY(0)); return 0; } -BATTLE_GETTER(str); -BATTLE_GETTER(agi); -BATTLE_GETTER(vit); -BATTLE_GETTER(dex); -BATTLE_GETTER(luk); -BATTLE_GETTER(int); -BATTLE_GETTER(lv); -BATTLE_GETTER(hp); -BATTLE_GETTER(mdef); -BATTLE_GETTER(def); -BATTLE_GETTER(max_hp); -BATTLE_GETTER(dir); +BATTLE_GETTER (str); +BATTLE_GETTER (agi); +BATTLE_GETTER (vit); +BATTLE_GETTER (dex); +BATTLE_GETTER (luk); +BATTLE_GETTER (int); +BATTLE_GETTER (lv); +BATTLE_GETTER (hp); +BATTLE_GETTER (mdef); +BATTLE_GETTER (def); +BATTLE_GETTER (max_hp); +BATTLE_GETTER (dir); #define MMO_GETTER(name) static int fun_get_##name(env_t *env, int args_nr, val_t *result, val_t *args) { \ if (ETY(0) == BL_PC) \ RESULTINT = ARGPC(0)->status.name; \ else \ RESULTINT = 0; \ - return 0; } + return 0; } -MMO_GETTER(sp); -MMO_GETTER(max_sp); +MMO_GETTER (sp); +MMO_GETTER (max_sp); static int -fun_name_of(env_t *env, int args_nr, val_t *result, val_t *args) -{ - if (TY(0) == TY_ENTITY) { - RESULTSTR = strdup(show_entity(ARGENTITY(0))); - return 0; - } else if (TY(0) == TY_SPELL) { - RESULTSTR = strdup(ARGSPELL(0)->name); - return 0; - } else if (TY(0) == TY_INVOCATION) { - RESULTSTR = strdup(ARGINVOCATION(0)->spell->name); - return 0; - } - return 1; +fun_name_of (env_t * env, int args_nr, val_t * result, val_t * args) +{ + if (TY (0) == TY_ENTITY) + { + RESULTSTR = strdup (show_entity (ARGENTITY (0))); + return 0; + } + else if (TY (0) == TY_SPELL) + { + RESULTSTR = strdup (ARGSPELL (0)->name); + return 0; + } + else if (TY (0) == TY_INVOCATION) + { + RESULTSTR = strdup (ARGINVOCATION (0)->spell->name); + return 0; + } + return 1; } #define COPY_LOCATION(dest, src) (dest).x = (src).x; (dest).y = (src).y; (dest).m = (src).m; static int -fun_location(env_t *env, int args_nr, val_t *result, val_t *args) +fun_location (env_t * env, int args_nr, val_t * result, val_t * args) { - COPY_LOCATION(RESULTLOCATION, *(ARGENTITY(0))); - return 0; + COPY_LOCATION (RESULTLOCATION, *(ARGENTITY (0))); + return 0; } -static int -fun_random(env_t *env, int args_nr, val_t *result, val_t *args) -{ - int delta = ARGINT(0); - if (delta < 0) - delta = -delta; - if (delta == 0) { - RESULTINT = 0; - return 0; - } - RESULTINT = MRAND(delta); - - if (ARGINT(0) < 0) - RESULTINT = -RESULTINT; +static int fun_random (env_t * env, int args_nr, val_t * result, val_t * args) +{ + int delta = ARGINT (0); + if (delta < 0) + delta = -delta; + if (delta == 0) + { + RESULTINT = 0; return 0; + } + RESULTINT = MRAND (delta); + + if (ARGINT (0) < 0) + RESULTINT = -RESULTINT; + return 0; } static int -fun_random_dir(env_t *env, int args_nr, val_t *result, val_t *args) +fun_random_dir (env_t * env, int args_nr, val_t * result, val_t * args) { - if (ARGINT(0)) - RESULTDIR = mt_random() & 0x7; - else - RESULTDIR = (mt_random() & 0x3) * 2; - return 0; + if (ARGINT (0)) + RESULTDIR = mt_random () & 0x7; + else + RESULTDIR = (mt_random () & 0x3) * 2; + return 0; } static int -fun_hash_entity(env_t *env, int args_nr, val_t *result, val_t *args) +fun_hash_entity (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = ARGENTITY(0)->id; - return 0; + RESULTINT = ARGENTITY (0)->id; + return 0; } -int // ret -1: not a string, ret 1: no such item, ret 0: OK -magic_find_item(val_t *args, int index, struct item *item, int *stackable) +int // ret -1: not a string, ret 1: no such item, ret 0: OK +magic_find_item (val_t * args, int index, struct item *item, int *stackable) { - struct item_data *item_data; - int must_add_sequentially; + struct item_data *item_data; + int must_add_sequentially; - if (TY(index) == TY_INT) - item_data = itemdb_exists(ARGINT(index)); - else if (TY(index) == TY_STRING) - item_data = itemdb_searchname(ARGSTR(index)); - else - return -1; + if (TY (index) == TY_INT) + item_data = itemdb_exists (ARGINT (index)); + else if (TY (index) == TY_STRING) + item_data = itemdb_searchname (ARGSTR (index)); + else + return -1; - if (!item_data) - return 1; + if (!item_data) + return 1; - must_add_sequentially = (item_data->type == 4 - || item_data->type == 5 - || item_data->type == 7 - || item_data->type == 8); /* Very elegant. */ + must_add_sequentially = (item_data->type == 4 || item_data->type == 5 || item_data->type == 7 || item_data->type == 8); /* Very elegant. */ - if (stackable) - *stackable = !must_add_sequentially; + if (stackable) + *stackable = !must_add_sequentially; - memset(item, 0, sizeof(struct item)); - item->nameid = item_data->nameid; - item->identify = 1; + memset (item, 0, sizeof (struct item)); + item->nameid = item_data->nameid; + item->identify = 1; - return 0; + return 0; } static int -fun_count_item(env_t *env, int args_nr, val_t *result, val_t *args) +fun_count_item (env_t * env, int args_nr, val_t * result, val_t * args) { - character_t *chr = (ETY(0) == BL_PC) ? ARGPC(0) : NULL; - int stackable; - struct item item; + character_t *chr = (ETY (0) == BL_PC) ? ARGPC (0) : NULL; + int stackable; + struct item item; - GET_ARG_ITEM(1, item, stackable); + GET_ARG_ITEM (1, item, stackable); - if (!chr) - return 1; + if (!chr) + return 1; - RESULTINT = pc_count_all_items(chr, item.nameid); - return 0; + RESULTINT = pc_count_all_items (chr, item.nameid); + return 0; } static int -fun_is_equipped(env_t *env, int args_nr, val_t *result, val_t *args) +fun_is_equipped (env_t * env, int args_nr, val_t * result, val_t * args) { - character_t *chr = (ETY(0) == BL_PC) ? ARGPC(0) : NULL; - int stackable; - struct item item; - int i; - int retval = 0; + character_t *chr = (ETY (0) == BL_PC) ? ARGPC (0) : NULL; + int stackable; + struct item item; + int i; + int retval = 0; - GET_ARG_ITEM(1, item, stackable); + GET_ARG_ITEM (1, item, stackable); - if (!chr) - return 1; + if (!chr) + return 1; - for (i = 0; i < 11; i++) - if (chr->equip_index[i] >= 0 - && chr->status.inventory[chr->equip_index[i]].nameid == item.nameid) { - retval = i + 1; - break; - } + for (i = 0; i < 11; i++) + if (chr->equip_index[i] >= 0 + && chr->status.inventory[chr->equip_index[i]].nameid == + item.nameid) + { + retval = i + 1; + break; + } - RESULTINT = retval; - return 0; + RESULTINT = retval; + return 0; } static int -fun_is_married(env_t *env, int args_nr, val_t *result, val_t *args) +fun_is_married (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = (ETY(0) == BL_PC - && ARGPC(0)->status.partner_id); - return 0; + RESULTINT = (ETY (0) == BL_PC && ARGPC (0)->status.partner_id); + return 0; } static int -fun_is_dead(env_t *env, int args_nr, val_t *result, val_t *args) +fun_is_dead (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = (ETY(0) == BL_PC - && pc_isdead(ARGPC(0))); - return 0; + RESULTINT = (ETY (0) == BL_PC && pc_isdead (ARGPC (0))); + return 0; } -static int -fun_is_pc(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_is_pc (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = (ETY(0) == BL_PC); - return 0; + RESULTINT = (ETY (0) == BL_PC); + return 0; } static int -fun_partner(env_t *env, int args_nr, val_t *result, val_t *args) +fun_partner (env_t * env, int args_nr, val_t * result, val_t * args) { - if (ETY(0) == BL_PC - && ARGPC(0)->status.partner_id) { - RESULTENTITY = (entity_t *) map_nick2sd(map_charid2nick(ARGPC(0)->status.partner_id)); - return 0; - } else - return 1; + if (ETY (0) == BL_PC && ARGPC (0)->status.partner_id) + { + RESULTENTITY = + (entity_t *) + map_nick2sd (map_charid2nick (ARGPC (0)->status.partner_id)); + return 0; + } + else + return 1; } static int -fun_awayfrom(env_t *env, int args_nr, val_t *result, val_t *args) -{ - location_t *loc = &ARGLOCATION(0); - int dx = heading_x[ARGDIR(1)]; - int dy = heading_y[ARGDIR(1)]; - int distance = ARGINT(2); - while (distance-- && !map_is_solid(loc->m, loc->x + dx, loc->y + dy)) { - loc->x += dx; - loc->y += dy; - } +fun_awayfrom (env_t * env, int args_nr, val_t * result, val_t * args) +{ + location_t *loc = &ARGLOCATION (0); + int dx = heading_x[ARGDIR (1)]; + int dy = heading_y[ARGDIR (1)]; + int distance = ARGINT (2); + while (distance-- && !map_is_solid (loc->m, loc->x + dx, loc->y + dy)) + { + loc->x += dx; + loc->y += dy; + } - RESULTLOCATION = *loc; - return 0; + RESULTLOCATION = *loc; + return 0; } -static int -fun_failed(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_failed (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = TY(0) == TY_FAIL; - return 0; + RESULTINT = TY (0) == TY_FAIL; + return 0; } -static int -fun_npc(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_npc (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTENTITY = (entity_t *)npc_name2id(ARGSTR(0)); - return RESULTENTITY == NULL; + RESULTENTITY = (entity_t *) npc_name2id (ARGSTR (0)); + return RESULTENTITY == NULL; } -static int -fun_pc(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_pc (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTENTITY = (entity_t *)map_nick2sd(ARGSTR(0)); - return RESULTENTITY == NULL; + RESULTENTITY = (entity_t *) map_nick2sd (ARGSTR (0)); + return RESULTENTITY == NULL; } static int -fun_distance(env_t *env, int args_nr, val_t *result, val_t *args) +fun_distance (env_t * env, int args_nr, val_t * result, val_t * args) { - if (ARGLOCATION(0).m != ARGLOCATION(1).m) - RESULTINT = INT_MAX; - else - RESULTINT = MAX(abs(ARGLOCATION(0).x - ARGLOCATION(1).x), - abs(ARGLOCATION(0).y - ARGLOCATION(1).y)); - return 0; + if (ARGLOCATION (0).m != ARGLOCATION (1).m) + RESULTINT = INT_MAX; + else + RESULTINT = MAX (abs (ARGLOCATION (0).x - ARGLOCATION (1).x), + abs (ARGLOCATION (0).y - ARGLOCATION (1).y)); + return 0; } - static int -fun_rdistance(env_t *env, int args_nr, val_t *result, val_t *args) -{ - if (ARGLOCATION(0).m != ARGLOCATION(1).m) - RESULTINT = INT_MAX; - else { - int dx = ARGLOCATION(0).x - ARGLOCATION(1).x; - int dy = ARGLOCATION(0).y - ARGLOCATION(1).y; - RESULTINT = (int) (sqrt((dx*dx) + (dy*dy))); - } - return 0; +fun_rdistance (env_t * env, int args_nr, val_t * result, val_t * args) +{ + if (ARGLOCATION (0).m != ARGLOCATION (1).m) + RESULTINT = INT_MAX; + else + { + int dx = ARGLOCATION (0).x - ARGLOCATION (1).x; + int dy = ARGLOCATION (0).y - ARGLOCATION (1).y; + RESULTINT = (int) (sqrt ((dx * dx) + (dy * dy))); + } + return 0; } - -static int -fun_anchor(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_anchor (env_t * env, int args_nr, val_t * result, val_t * args) { - teleport_anchor_t *anchor = magic_find_anchor(ARGSTR(0)); + teleport_anchor_t *anchor = magic_find_anchor (ARGSTR (0)); - if (!anchor) - return 1; + if (!anchor) + return 1; - magic_eval(env, result, anchor->location); + magic_eval (env, result, anchor->location); - make_area(result); - if (result->ty != TY_AREA) { - magic_clear_var(result); - return 1; - } + make_area (result); + if (result->ty != TY_AREA) + { + magic_clear_var (result); + return 1; + } - return 0; + return 0; } - - static int -fun_line_of_sight(env_t *env, int args_nr, val_t *result, val_t *args) +fun_line_of_sight (env_t * env, int args_nr, val_t * result, val_t * args) { - entity_t e1, e2; + entity_t e1, e2; - COPY_LOCATION(e1, ARGLOCATION(0)); - COPY_LOCATION(e2, ARGLOCATION(1)); + COPY_LOCATION (e1, ARGLOCATION (0)); + COPY_LOCATION (e2, ARGLOCATION (1)); - RESULTINT = battle_check_range(&e1, &e2, 0); + RESULTINT = battle_check_range (&e1, &e2, 0); - return 0; + return 0; } -void -magic_random_location(location_t *dest, area_t *area) +void magic_random_location (location_t * dest, area_t * area) { - switch (area->ty) { - case AREA_UNION: { - int rv = MRAND(area->size); - if (rv < area->a.a_union[0]->size) - magic_random_location(dest, area->a.a_union[0]); - else - magic_random_location(dest, area->a.a_union[1]); - break; + switch (area->ty) + { + case AREA_UNION: + { + int rv = MRAND (area->size); + if (rv < area->a.a_union[0]->size) + magic_random_location (dest, area->a.a_union[0]); + else + magic_random_location (dest, area->a.a_union[1]); + break; } case AREA_LOCATION: case AREA_RECT: - case AREA_BAR: { - int m, x, y, w, h; - magic_area_rect(&m, &x, &y, &w, &h, area); - - if (w <= 1) - w = 1; - - if (h <= 1) - h = 1; - - x += MRAND(w); - y += MRAND(h); - - if (!map_is_solid(m, x, y)) { - int start_x = x; - int start_y = y; - int i; - int initial_dir = mt_random() & 0x7; - int dir = initial_dir; - - /* try all directions, up to a distance to 10, for a free slot */ - do { - x = start_x; - y = start_y; - - for (i = 0; i < 10 && map_is_solid(m, x, y); i++) { - x += heading_x[dir]; - y += heading_y[dir]; - } - - dir = (dir + 1) & 0x7; - } while (map_is_solid(m, x, y) && dir != initial_dir); - + case AREA_BAR: + { + int m, x, y, w, h; + magic_area_rect (&m, &x, &y, &w, &h, area); + + if (w <= 1) + w = 1; + + if (h <= 1) + h = 1; + + x += MRAND (w); + y += MRAND (h); + + if (!map_is_solid (m, x, y)) + { + int start_x = x; + int start_y = y; + int i; + int initial_dir = mt_random () & 0x7; + int dir = initial_dir; + + /* try all directions, up to a distance to 10, for a free slot */ + do + { + x = start_x; + y = start_y; + + for (i = 0; i < 10 && map_is_solid (m, x, y); i++) + { + x += heading_x[dir]; + y += heading_y[dir]; + } + + dir = (dir + 1) & 0x7; } - /* We've tried our best. If the map is still solid, the engine will automatically randomise the target location if we try to warp. */ + while (map_is_solid (m, x, y) && dir != initial_dir); + + } + /* We've tried our best. If the map is still solid, the engine will automatically randomise the target location if we try to warp. */ - dest->m = m; - dest->x = x; - dest->y = y; - break; + dest->m = m; + dest->x = x; + dest->y = y; + break; } default: - fprintf(stderr, "Unknown area type %d\n", area->ty); - } + fprintf (stderr, "Unknown area type %d\n", area->ty); + } } static int -fun_pick_location(env_t *env, int args_nr, val_t *result, val_t *args) +fun_pick_location (env_t * env, int args_nr, val_t * result, val_t * args) { - magic_random_location(&result->v.v_location, ARGAREA(0)); - return 0; + magic_random_location (&result->v.v_location, ARGAREA (0)); + return 0; } static int -fun_read_script_int(env_t *env, int args_nr, val_t *result, val_t *args) +fun_read_script_int (env_t * env, int args_nr, val_t * result, val_t * args) { - entity_t *subject_p = ARGENTITY(0); - char *var_name = ARGSTR(1); + entity_t *subject_p = ARGENTITY (0); + char *var_name = ARGSTR (1); - if (subject_p->type != BL_PC) - return 1; + if (subject_p->type != BL_PC) + return 1; - RESULTINT = pc_readglobalreg((character_t *) subject_p, var_name); - return 0; + RESULTINT = pc_readglobalreg ((character_t *) subject_p, var_name); + return 0; } -static int -fun_rbox(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_rbox (env_t * env, int args_nr, val_t * result, val_t * args) { - location_t loc = ARGLOCATION(0); - int radius = ARGINT(1); + location_t loc = ARGLOCATION (0); + int radius = ARGINT (1); - RESULTAREA = area_new(AREA_RECT); - RESULTAREA->a.a_rect.loc.m = loc.m; - RESULTAREA->a.a_rect.loc.x = loc.x - radius; - RESULTAREA->a.a_rect.loc.y = loc.y - radius; - RESULTAREA->a.a_rect.width = radius * 2 + 1; - RESULTAREA->a.a_rect.height = radius * 2 + 1; + RESULTAREA = area_new (AREA_RECT); + RESULTAREA->a.a_rect.loc.m = loc.m; + RESULTAREA->a.a_rect.loc.x = loc.x - radius; + RESULTAREA->a.a_rect.loc.y = loc.y - radius; + RESULTAREA->a.a_rect.width = radius * 2 + 1; + RESULTAREA->a.a_rect.height = radius * 2 + 1; - return 0; + return 0; } static int -fun_running_status_update(env_t *env, int args_nr, val_t *result, val_t *args) +fun_running_status_update (env_t * env, int args_nr, val_t * result, + val_t * args) { - if (ETY(0) != BL_PC && ETY(0) != BL_MOB) - return 1; + if (ETY (0) != BL_PC && ETY (0) != BL_MOB) + return 1; - RESULTINT = battle_get_sc_data(ARGENTITY(0))[ARGINT(1)].timer != -1; - return 0; + RESULTINT = battle_get_sc_data (ARGENTITY (0))[ARGINT (1)].timer != -1; + return 0; } static int -fun_status_option(env_t *env, int args_nr, val_t *result, val_t *args) +fun_status_option (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = ((((struct map_session_data *)ARGENTITY(0))->status.option & ARGINT(0)) != 0); - return 0; + RESULTINT = + ((((struct map_session_data *) ARGENTITY (0))-> + status.option & ARGINT (0)) != 0); + return 0; } static int -fun_element(env_t *env, int args_nr, val_t *result, val_t *args) +fun_element (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = battle_get_element(ARGENTITY(0)) % 10; - return 0; + RESULTINT = battle_get_element (ARGENTITY (0)) % 10; + return 0; } static int -fun_element_level(env_t *env, int args_nr, val_t *result, val_t *args) +fun_element_level (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = battle_get_element(ARGENTITY(0)) / 10; - return 0; + RESULTINT = battle_get_element (ARGENTITY (0)) / 10; + return 0; } -static int -fun_index(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_index (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = ARGSPELL(0)->index; - return 0; + RESULTINT = ARGSPELL (0)->index; + return 0; } static int -fun_is_exterior(env_t *env, int args_nr, val_t *result, val_t *args) +fun_is_exterior (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = map[ARGLOCATION(0).m].name[4] == '1'; - return 0; + RESULTINT = map[ARGLOCATION (0).m].name[4] == '1'; + return 0; } static int -fun_contains_string(env_t *env, int args_nr, val_t *result, val_t *args) +fun_contains_string (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = NULL != strstr(ARGSTR(0), ARGSTR(1)); - return 0; + RESULTINT = NULL != strstr (ARGSTR (0), ARGSTR (1)); + return 0; } -static int -fun_strstr(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_strstr (env_t * env, int args_nr, val_t * result, val_t * args) { - char *offset = strstr(ARGSTR(0), ARGSTR(1)); - RESULTINT = offset - ARGSTR(0); - return offset == NULL; + char *offset = strstr (ARGSTR (0), ARGSTR (1)); + RESULTINT = offset - ARGSTR (0); + return offset == NULL; } -static int -fun_strlen(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_strlen (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = strlen(ARGSTR(0)); - return 0; + RESULTINT = strlen (ARGSTR (0)); + return 0; } -static int -fun_substr(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_substr (env_t * env, int args_nr, val_t * result, val_t * args) { - const char *src = ARGSTR(0); - const int slen = strlen(src); - int offset = ARGINT(1); - int len = ARGINT(2); + const char *src = ARGSTR (0); + const int slen = strlen (src); + int offset = ARGINT (1); + int len = ARGINT (2); - if (len < 0) - len = 0; - if (offset < 0) - offset = 0; + if (len < 0) + len = 0; + if (offset < 0) + offset = 0; - if (offset > slen) - offset = slen; + if (offset > slen) + offset = slen; - if (offset + len > slen) - len = slen - offset; + if (offset + len > slen) + len = slen - offset; - RESULTSTR = (char *) calloc(1, 1 + len); - memcpy(RESULTSTR, src + offset, len); + RESULTSTR = (char *) calloc (1, 1 + len); + memcpy (RESULTSTR, src + offset, len); - return 0; + return 0; } -static int -fun_sqrt(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_sqrt (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = (int) sqrt(ARGINT(0)); - return 0; + RESULTINT = (int) sqrt (ARGINT (0)); + return 0; } static int -fun_map_level(env_t *env, int args_nr, val_t *result, val_t *args) +fun_map_level (env_t * env, int args_nr, val_t * result, val_t * args) { - RESULTINT = map[ARGLOCATION(0).m].name[4] - '0'; - return 0; + RESULTINT = map[ARGLOCATION (0).m].name[4] - '0'; + return 0; } -static int -fun_map_nr(env_t *env, int args_nr, val_t *result, val_t *args) +static int fun_map_nr (env_t * env, int args_nr, val_t * result, val_t * args) { - const char *mapname = map[ARGLOCATION(0).m].name; + const char *mapname = map[ARGLOCATION (0).m].name; - RESULTINT = ((mapname[0] - '0') * 100) - + ((mapname[1] - '0') * 10) - + ((mapname[2] - '0')); - return 0; + RESULTINT = ((mapname[0] - '0') * 100) + + ((mapname[1] - '0') * 10) + ((mapname[2] - '0')); + return 0; } static int -fun_dir_towards(env_t *env, int args_nr, val_t *result, val_t *args) -{ - int dx; - int dy; - - if (ARGLOCATION(0).m != ARGLOCATION(1).m) - return 1; - - dx = ARGLOCATION(1).x - ARGLOCATION(0).x; - dy = ARGLOCATION(1).y - ARGLOCATION(0).y; - - if (ARGINT(1)) { - /* 8-direction mode */ - if (abs(dx) > abs(dy) * 2) { /* east or west */ - if (dx < 0) - RESULTINT = 2/* west */; - else - RESULTINT = 6/* east */; - } else if (abs(dy) > abs(dx) * 2) { /* north or south */ - if (dy > 0) - RESULTINT = 0/* south */; - else - RESULTINT = 4/* north */; - } else if (dx < 0) { /* north-west or south-west */ - if (dy < 0) - RESULTINT = 3/* north-west */; - else - RESULTINT = 1/* south-west */; - } else { /* north-east or south-east */ - if (dy < 0) - RESULTINT = 5/* north-east */; - else - RESULTINT = 7/* south-east */; - } - } else { - /* 4-direction mode */ - if (abs(dx) > abs(dy)) { /* east or west */ - if (dx < 0) - RESULTINT = 2/* west */; - else - RESULTINT = 6/* east */; - } else { /* north or south */ - if (dy > 0) - RESULTINT = 0/* south */; - else - RESULTINT = 4/* north */; - } +fun_dir_towards (env_t * env, int args_nr, val_t * result, val_t * args) +{ + int dx; + int dy; + + if (ARGLOCATION (0).m != ARGLOCATION (1).m) + return 1; + + dx = ARGLOCATION (1).x - ARGLOCATION (0).x; + dy = ARGLOCATION (1).y - ARGLOCATION (0).y; + + if (ARGINT (1)) + { + /* 8-direction mode */ + if (abs (dx) > abs (dy) * 2) + { /* east or west */ + if (dx < 0) + RESULTINT = 2 /* west */ ; + else + RESULTINT = 6 /* east */ ; + } + else if (abs (dy) > abs (dx) * 2) + { /* north or south */ + if (dy > 0) + RESULTINT = 0 /* south */ ; + else + RESULTINT = 4 /* north */ ; + } + else if (dx < 0) + { /* north-west or south-west */ + if (dy < 0) + RESULTINT = 3 /* north-west */ ; + else + RESULTINT = 1 /* south-west */ ; + } + else + { /* north-east or south-east */ + if (dy < 0) + RESULTINT = 5 /* north-east */ ; + else + RESULTINT = 7 /* south-east */ ; + } + } + else + { + /* 4-direction mode */ + if (abs (dx) > abs (dy)) + { /* east or west */ + if (dx < 0) + RESULTINT = 2 /* west */ ; + else + RESULTINT = 6 /* east */ ; + } + else + { /* north or south */ + if (dy > 0) + RESULTINT = 0 /* south */ ; + else + RESULTINT = 4 /* north */ ; } + } - return 0; + return 0; } static int -fun_extract_healer_xp(env_t *env, int args_nr, val_t *result, val_t *args) +fun_extract_healer_xp (env_t * env, int args_nr, val_t * result, val_t * args) { - character_t *sd = (ETY(0) == BL_PC) ? ARGPC(0) : NULL; + character_t *sd = (ETY (0) == BL_PC) ? ARGPC (0) : NULL; - if (!sd) - RESULTINT = 0; - else - RESULTINT = pc_extract_healer_exp(sd, ARGINT(1)); - return 0; + if (!sd) + RESULTINT = 0; + else + RESULTINT = pc_extract_healer_exp (sd, ARGINT (1)); + return 0; } - - #define BATTLE_RECORD2(sname, name) { sname, "e", 'i', fun_get_##name } #define BATTLE_RECORD(name) BATTLE_RECORD2(#name, name) static fun_t functions[] = { - { "+", "..", '.', fun_add }, - { "-", "ii", 'i', fun_sub }, - { "*", "ii", 'i', fun_mul }, - { "/", "ii", 'i', fun_div }, - { "%", "ii", 'i', fun_mod }, - { "||", "ii", 'i', fun_or }, - { "&&", "ii", 'i', fun_and }, - { ">", "..", 'i', fun_gt }, - { ">=", "..", 'i', fun_gte }, - { "=", "..", 'i', fun_eq }, - { "|", "..", 'i', fun_bitor }, - { "&", "ii", 'i', fun_bitand }, - { "^", "ii", 'i', fun_bitxor }, - { "<<", "ii", 'i', fun_bitshl }, - { ">>", "ii", 'i', fun_bitshr }, - { "not", "i", 'i', fun_not }, - { "neg", "i", 'i', fun_neg }, - { "max", "ii", 'i', fun_max }, - { "min", "ii", 'i', fun_min }, - { "is_in", "la", 'i', fun_is_in }, - { "if_then_else", "i__", '_', fun_if_then_else }, - { "skill", "ei", 'i', fun_skill }, - BATTLE_RECORD(str), - BATTLE_RECORD(agi), - BATTLE_RECORD(vit), - BATTLE_RECORD(dex), - BATTLE_RECORD(luk), - BATTLE_RECORD(int), - BATTLE_RECORD2("level", lv), - BATTLE_RECORD(mdef), - BATTLE_RECORD(def), - BATTLE_RECORD(hp), - BATTLE_RECORD(max_hp), - BATTLE_RECORD(sp), - BATTLE_RECORD(max_sp), - { "dir", "e", 'd', fun_get_dir }, - { "name_of", ".", 's', fun_name_of }, - { "location", "e", 'l', fun_location }, - { "random", "i", 'i', fun_random }, - { "random_dir", "i", 'd', fun_random_dir }, - { "hash_entity", "e", 'i', fun_hash_entity }, - { "is_married", "e", 'i', fun_is_married }, - { "partner", "e", 'e', fun_partner }, - { "awayfrom", "ldi", 'l', fun_awayfrom }, - { "failed", "_", 'i', fun_failed }, - { "pc", "s", 'e', fun_pc }, - { "npc", "s", 'e', fun_npc }, - { "distance", "ll", 'i', fun_distance }, - { "rdistance", "ll", 'i', fun_rdistance }, - { "anchor", "s", 'a', fun_anchor }, - { "random_location", "a", 'l', fun_pick_location }, - { "script_int", "es", 'i', fun_read_script_int }, - { "rbox", "li", 'a', fun_rbox }, - { "count_item", "e.", 'i', fun_count_item }, - { "line_of_sight", "ll", 'i', fun_line_of_sight }, - { "running_status_update", "ei", 'i', fun_running_status_update }, - { "status_option", "ei", 'i', fun_status_option }, - { "element", "e", 'i', fun_element }, - { "element_level", "e", 'i', fun_element_level }, - { "has_shroud", "e", 'i', fun_has_shroud }, - { "is_equipped", "e.", 'i', fun_is_equipped }, - { "spell_index", "S", 'i', fun_index }, - { "is_exterior", "l", 'i', fun_is_exterior }, - { "contains_string", "ss", 'i', fun_contains_string }, - { "strstr", "ss", 'i', fun_strstr }, - { "strlen", "s", 'i', fun_strlen }, - { "substr", "sii", 's', fun_substr }, - { "sqrt", "i", 'i', fun_sqrt }, - { "map_level", "l", 'i', fun_map_level }, - { "map_nr", "l", 'i', fun_map_nr }, - { "dir_towards", "lli", 'd', fun_dir_towards }, - { "is_dead", "e", 'i', fun_is_dead }, - { "is_pc", "e", 'i', fun_is_pc }, - { "extract_healer_experience", "ei", 'i', fun_extract_healer_xp }, - { NULL, NULL, '.', NULL } + {"+", "..", '.', fun_add}, + {"-", "ii", 'i', fun_sub}, + {"*", "ii", 'i', fun_mul}, + {"/", "ii", 'i', fun_div}, + {"%", "ii", 'i', fun_mod}, + {"||", "ii", 'i', fun_or}, + {"&&", "ii", 'i', fun_and}, + {">", "..", 'i', fun_gt}, + {">=", "..", 'i', fun_gte}, + {"=", "..", 'i', fun_eq}, + {"|", "..", 'i', fun_bitor}, + {"&", "ii", 'i', fun_bitand}, + {"^", "ii", 'i', fun_bitxor}, + {"<<", "ii", 'i', fun_bitshl}, + {">>", "ii", 'i', fun_bitshr}, + {"not", "i", 'i', fun_not}, + {"neg", "i", 'i', fun_neg}, + {"max", "ii", 'i', fun_max}, + {"min", "ii", 'i', fun_min}, + {"is_in", "la", 'i', fun_is_in}, + {"if_then_else", "i__", '_', fun_if_then_else}, + {"skill", "ei", 'i', fun_skill}, + BATTLE_RECORD (str), + BATTLE_RECORD (agi), + BATTLE_RECORD (vit), + BATTLE_RECORD (dex), + BATTLE_RECORD (luk), + BATTLE_RECORD (int), + BATTLE_RECORD2 ("level", lv), + BATTLE_RECORD (mdef), + BATTLE_RECORD (def), + BATTLE_RECORD (hp), + BATTLE_RECORD (max_hp), + BATTLE_RECORD (sp), + BATTLE_RECORD (max_sp), + {"dir", "e", 'd', fun_get_dir}, + {"name_of", ".", 's', fun_name_of}, + {"location", "e", 'l', fun_location}, + {"random", "i", 'i', fun_random}, + {"random_dir", "i", 'd', fun_random_dir}, + {"hash_entity", "e", 'i', fun_hash_entity}, + {"is_married", "e", 'i', fun_is_married}, + {"partner", "e", 'e', fun_partner}, + {"awayfrom", "ldi", 'l', fun_awayfrom}, + {"failed", "_", 'i', fun_failed}, + {"pc", "s", 'e', fun_pc}, + {"npc", "s", 'e', fun_npc}, + {"distance", "ll", 'i', fun_distance}, + {"rdistance", "ll", 'i', fun_rdistance}, + {"anchor", "s", 'a', fun_anchor}, + {"random_location", "a", 'l', fun_pick_location}, + {"script_int", "es", 'i', fun_read_script_int}, + {"rbox", "li", 'a', fun_rbox}, + {"count_item", "e.", 'i', fun_count_item}, + {"line_of_sight", "ll", 'i', fun_line_of_sight}, + {"running_status_update", "ei", 'i', fun_running_status_update}, + {"status_option", "ei", 'i', fun_status_option}, + {"element", "e", 'i', fun_element}, + {"element_level", "e", 'i', fun_element_level}, + {"has_shroud", "e", 'i', fun_has_shroud}, + {"is_equipped", "e.", 'i', fun_is_equipped}, + {"spell_index", "S", 'i', fun_index}, + {"is_exterior", "l", 'i', fun_is_exterior}, + {"contains_string", "ss", 'i', fun_contains_string}, + {"strstr", "ss", 'i', fun_strstr}, + {"strlen", "s", 'i', fun_strlen}, + {"substr", "sii", 's', fun_substr}, + {"sqrt", "i", 'i', fun_sqrt}, + {"map_level", "l", 'i', fun_map_level}, + {"map_nr", "l", 'i', fun_map_nr}, + {"dir_towards", "lli", 'd', fun_dir_towards}, + {"is_dead", "e", 'i', fun_is_dead}, + {"is_pc", "e", 'i', fun_is_pc}, + {"extract_healer_experience", "ei", 'i', fun_extract_healer_xp}, + {NULL, NULL, '.', NULL} }; static int functions_are_sorted = 0; -int -compare_fun(const void *lhs, const void *rhs) +int compare_fun (const void *lhs, const void *rhs) { - return strcmp(((fun_t *)lhs)->name, - ((fun_t *)rhs)->name); + return strcmp (((fun_t *) lhs)->name, ((fun_t *) rhs)->name); } -fun_t * -magic_get_fun(char *name, int *index) +fun_t *magic_get_fun (char *name, int *index) { - static int functions_nr; - fun_t *result; - fun_t key; + static int functions_nr; + fun_t *result; + fun_t key; - if (!functions_are_sorted) { - fun_t *it = functions; + if (!functions_are_sorted) + { + fun_t *it = functions; - while (it->name) ++it; - functions_nr = it - functions; - - qsort(functions, functions_nr, sizeof(fun_t), - compare_fun); - functions_are_sorted = 1; - } + while (it->name) + ++it; + functions_nr = it - functions; - key.name = name; - result = (fun_t *) bsearch(&key, functions, functions_nr, sizeof(fun_t), - compare_fun); - - if (result && index) - *index = result - functions; - - return result; -} - -static int // 1 on failure -eval_location(env_t *env, location_t *dest, e_location_t *expr) -{ - val_t m, x, y; - magic_eval(env, &m, expr->m); - magic_eval(env, &x, expr->x); - magic_eval(env, &y, expr->y); - - if (CHECK_TYPE(&m, TY_STRING) - && CHECK_TYPE(&x, TY_INT) - && CHECK_TYPE(&y, TY_INT)) { - int map_id = map_mapname2mapid(m.v.v_string); - magic_clear_var(&m); - if (map_id < 0) - return 1; - dest->m = map_id; - dest->x = x.v.v_int; - dest->y = y.v.v_int; - return 0; - } else { - magic_clear_var(&m); - magic_clear_var(&x); - magic_clear_var(&y); - return 1; - } + qsort (functions, functions_nr, sizeof (fun_t), compare_fun); + functions_are_sorted = 1; + } + + key.name = name; + result = (fun_t *) bsearch (&key, functions, functions_nr, sizeof (fun_t), + compare_fun); + + if (result && index) + *index = result - functions; + + return result; } -static area_t * -eval_area(env_t *env, e_area_t *expr) +static int // 1 on failure +eval_location (env_t * env, location_t * dest, e_location_t * expr) { - area_t *area = malloc(sizeof(area_t)); - area->ty = expr->ty; + val_t m, x, y; + magic_eval (env, &m, expr->m); + magic_eval (env, &x, expr->x); + magic_eval (env, &y, expr->y); - switch (expr->ty) { - case AREA_LOCATION: - area->size = 1; - if (eval_location(env, &area->a.a_loc, &expr->a.a_loc)) { - free(area); - return NULL; - } else - return area; - - case AREA_UNION: { - int i, fail = 0; - for (i = 0; i < 2; i++) { - area->a.a_union[i] = eval_area(env, expr->a.a_union[i]); - if (!area->a.a_union[i]) - fail = 1; - } + if (CHECK_TYPE (&m, TY_STRING) + && CHECK_TYPE (&x, TY_INT) && CHECK_TYPE (&y, TY_INT)) + { + int map_id = map_mapname2mapid (m.v.v_string); + magic_clear_var (&m); + if (map_id < 0) + return 1; + dest->m = map_id; + dest->x = x.v.v_int; + dest->y = y.v.v_int; + return 0; + } + else + { + magic_clear_var (&m); + magic_clear_var (&x); + magic_clear_var (&y); + return 1; + } +} - if (fail) { - for (i = 0; i < 2; i++) { - if (area->a.a_union[i]) - free_area(area->a.a_union[i]); - } - free(area); - return NULL; - } - area->size = area->a.a_union[0]->size + area->a.a_union[1]->size; +static area_t *eval_area (env_t * env, e_area_t * expr) +{ + area_t *area = malloc (sizeof (area_t)); + area->ty = expr->ty; + + switch (expr->ty) + { + case AREA_LOCATION: + area->size = 1; + if (eval_location (env, &area->a.a_loc, &expr->a.a_loc)) + { + free (area); + return NULL; + } + else return area; - } - case AREA_RECT: { - val_t width, height; - magic_eval(env, &width, expr->a.a_rect.width); - magic_eval(env, &height, expr->a.a_rect.height); - - area->a.a_rect.width = width.v.v_int; - area->a.a_rect.height = height.v.v_int; - - if (CHECK_TYPE(&width, TY_INT) - && CHECK_TYPE(&height, TY_INT) - && !eval_location (env, &(area->a.a_rect.loc), &expr->a.a_rect.loc)) { - area->size = area->a.a_rect.width * area->a.a_rect.height; - magic_clear_var(&width); - magic_clear_var(&height); - return area; - } else { - free(area); - magic_clear_var(&width); - magic_clear_var(&height); - return NULL; + case AREA_UNION: + { + int i, fail = 0; + for (i = 0; i < 2; i++) + { + area->a.a_union[i] = eval_area (env, expr->a.a_union[i]); + if (!area->a.a_union[i]) + fail = 1; + } + + if (fail) + { + for (i = 0; i < 2; i++) + { + if (area->a.a_union[i]) + free_area (area->a.a_union[i]); } + free (area); + return NULL; + } + area->size = area->a.a_union[0]->size + area->a.a_union[1]->size; + return area; } - case AREA_BAR: { - val_t width, depth, dir; - magic_eval(env, &width, expr->a.a_bar.width); - magic_eval(env, &depth, expr->a.a_bar.depth); - magic_eval(env, &dir, expr->a.a_bar.dir); - - area->a.a_bar.width = width.v.v_int; - area->a.a_bar.depth = depth.v.v_int; - area->a.a_bar.dir = dir.v.v_int; - - if (CHECK_TYPE(&width, TY_INT) - && CHECK_TYPE(&depth, TY_INT) - && CHECK_TYPE(&dir, TY_DIR) - && !eval_location (env, &area->a.a_bar.loc, &expr->a.a_bar.loc)) { - area->size = (area->a.a_bar.width * 2 + 1) * area->a.a_bar.depth; - magic_clear_var(&width); - magic_clear_var(&depth); - magic_clear_var(&dir); - return area; - } else { - free(area); - magic_clear_var(&width); - magic_clear_var(&depth); - magic_clear_var(&dir); - return NULL; - } + case AREA_RECT: + { + val_t width, height; + magic_eval (env, &width, expr->a.a_rect.width); + magic_eval (env, &height, expr->a.a_rect.height); + + area->a.a_rect.width = width.v.v_int; + area->a.a_rect.height = height.v.v_int; + + if (CHECK_TYPE (&width, TY_INT) + && CHECK_TYPE (&height, TY_INT) + && !eval_location (env, &(area->a.a_rect.loc), + &expr->a.a_rect.loc)) + { + area->size = area->a.a_rect.width * area->a.a_rect.height; + magic_clear_var (&width); + magic_clear_var (&height); + return area; + } + else + { + free (area); + magic_clear_var (&width); + magic_clear_var (&height); + return NULL; + } } - default: - fprintf(stderr, "INTERNAL ERROR: Unknown area type %d\n", area->ty); - free(area); + case AREA_BAR: + { + val_t width, depth, dir; + magic_eval (env, &width, expr->a.a_bar.width); + magic_eval (env, &depth, expr->a.a_bar.depth); + magic_eval (env, &dir, expr->a.a_bar.dir); + + area->a.a_bar.width = width.v.v_int; + area->a.a_bar.depth = depth.v.v_int; + area->a.a_bar.dir = dir.v.v_int; + + if (CHECK_TYPE (&width, TY_INT) + && CHECK_TYPE (&depth, TY_INT) + && CHECK_TYPE (&dir, TY_DIR) + && !eval_location (env, &area->a.a_bar.loc, + &expr->a.a_bar.loc)) + { + area->size = + (area->a.a_bar.width * 2 + 1) * area->a.a_bar.depth; + magic_clear_var (&width); + magic_clear_var (&depth); + magic_clear_var (&dir); + return area; + } + else + { + free (area); + magic_clear_var (&width); + magic_clear_var (&depth); + magic_clear_var (&dir); return NULL; + } } -} -static int -type_key(char ty_key) -{ - switch (ty_key) { - case 'i': return TY_INT; - case 'd': return TY_DIR; - case 's': return TY_STRING; - case 'e': return TY_ENTITY; - case 'l': return TY_LOCATION; - case 'a': return TY_AREA; - case 'S': return TY_SPELL; - case 'I': return TY_INVOCATION; - default: return -1; - } + default: + fprintf (stderr, "INTERNAL ERROR: Unknown area type %d\n", + area->ty); + free (area); + return NULL; + } +} + +static int type_key (char ty_key) +{ + switch (ty_key) + { + case 'i': + return TY_INT; + case 'd': + return TY_DIR; + case 's': + return TY_STRING; + case 'e': + return TY_ENTITY; + case 'l': + return TY_LOCATION; + case 'a': + return TY_AREA; + case 'S': + return TY_SPELL; + case 'I': + return TY_INVOCATION; + default: + return -1; + } } int -magic_signature_check(char *opname, char *funname, char *signature, int args_nr, val_t *args, int line, int column) -{ - int i; - for (i = 0; i < args_nr; i++) { - val_t *arg = &args[i]; - char ty_key = signature[i]; - int ty = arg->ty; - int desired_ty = type_key(ty_key); - - if (ty == TY_ENTITY) { - /* Dereference entities in preparation for calling function */ - arg->v.v_entity = map_id2bl(arg->v.v_int); - if (!arg->v.v_entity) - ty = arg->ty = TY_FAIL; - } else if (ty == TY_INVOCATION) { - arg->v.v_invocation = (invocation_t *) map_id2bl(arg->v.v_int); - if (!arg->v.v_entity) - ty = arg->ty = TY_FAIL; - } +magic_signature_check (char *opname, char *funname, char *signature, + int args_nr, val_t * args, int line, int column) +{ + int i; + for (i = 0; i < args_nr; i++) + { + val_t *arg = &args[i]; + char ty_key = signature[i]; + int ty = arg->ty; + int desired_ty = type_key (ty_key); + + if (ty == TY_ENTITY) + { + /* Dereference entities in preparation for calling function */ + arg->v.v_entity = map_id2bl (arg->v.v_int); + if (!arg->v.v_entity) + ty = arg->ty = TY_FAIL; + } + else if (ty == TY_INVOCATION) + { + arg->v.v_invocation = (invocation_t *) map_id2bl (arg->v.v_int); + if (!arg->v.v_entity) + ty = arg->ty = TY_FAIL; + } - if (!ty_key) { - fprintf(stderr, "[magic-eval]: L%d:%d: Too many arguments (%d) to %s `%s'\n", - line, column, args_nr, opname, funname); - return 1; - } + if (!ty_key) + { + fprintf (stderr, + "[magic-eval]: L%d:%d: Too many arguments (%d) to %s `%s'\n", + line, column, args_nr, opname, funname); + return 1; + } - if (ty == TY_FAIL - && ty_key != '_') - return 1; /* Fail `in a sane way': This is a perfectly permissible error */ + if (ty == TY_FAIL && ty_key != '_') + return 1; /* Fail `in a sane way': This is a perfectly permissible error */ - if (ty == desired_ty - || desired_ty < 0 /* `dontcare' */) - continue; + if (ty == desired_ty || desired_ty < 0 /* `dontcare' */ ) + continue; - if (ty == TY_UNDEF) { - fprintf(stderr, "[magic-eval]: L%d:%d: Argument #%d to %s `%s' undefined\n", - line, column, i + 1, opname, funname); - return 1; - } + if (ty == TY_UNDEF) + { + fprintf (stderr, + "[magic-eval]: L%d:%d: Argument #%d to %s `%s' undefined\n", + line, column, i + 1, opname, funname); + return 1; + } - /* If we are here, we have a type mismatch but no failure _yet_. Try to coerce. */ - switch (desired_ty) { - case TY_INT: intify(arg); break; /* 100% success rate */ - case TY_STRING: stringify(arg, 1); break; /* 100% success rate */ - case TY_AREA: make_area(arg); break; /* Only works for locations */ - case TY_LOCATION: make_location(arg); break; /* Only works for some areas */ - case TY_SPELL: make_spell(arg); break; /* Only works for still-active invocatoins */ - default: break; /* We'll fail right below */ - } + /* If we are here, we have a type mismatch but no failure _yet_. Try to coerce. */ + switch (desired_ty) + { + case TY_INT: + intify (arg); + break; /* 100% success rate */ + case TY_STRING: + stringify (arg, 1); + break; /* 100% success rate */ + case TY_AREA: + make_area (arg); + break; /* Only works for locations */ + case TY_LOCATION: + make_location (arg); + break; /* Only works for some areas */ + case TY_SPELL: + make_spell (arg); + break; /* Only works for still-active invocatoins */ + default: + break; /* We'll fail right below */ + } - ty = arg->ty; - if (ty != desired_ty) { /* Coercion failed? */ - if (ty != TY_FAIL) - fprintf(stderr, "[magic-eval]: L%d:%d: Argument #%d to %s `%s' of incorrect type (%d)\n", - line, column, i + 1, opname, funname, ty); - return 1; - } + ty = arg->ty; + if (ty != desired_ty) + { /* Coercion failed? */ + if (ty != TY_FAIL) + fprintf (stderr, + "[magic-eval]: L%d:%d: Argument #%d to %s `%s' of incorrect type (%d)\n", + line, column, i + 1, opname, funname, ty); + return 1; } + } - return 0; + return 0; } -void -magic_eval(env_t *env, val_t *dest, expr_t *expr) +void magic_eval (env_t * env, val_t * dest, expr_t * expr) { - switch (expr->ty) { + switch (expr->ty) + { case EXPR_VAL: - magic_copy_var(dest, &expr->e.e_val); - break; + magic_copy_var (dest, &expr->e.e_val); + break; case EXPR_LOCATION: - if (eval_location(env, &dest->v.v_location, &expr->e.e_location)) - dest->ty = TY_FAIL; - else - dest->ty = TY_LOCATION; - break; + if (eval_location (env, &dest->v.v_location, &expr->e.e_location)) + dest->ty = TY_FAIL; + else + dest->ty = TY_LOCATION; + break; case EXPR_AREA: - if ((dest->v.v_area = eval_area(env, &expr->e.e_area))) - dest->ty = TY_AREA; - else - dest->ty = TY_FAIL; - break; - - case EXPR_FUNAPP: { - val_t arguments[MAX_ARGS]; - int args_nr = expr->e.e_funapp.args_nr; - int i; - fun_t *f = functions + expr->e.e_funapp.id; - - for (i = 0; i < args_nr; ++i) - magic_eval(env, &arguments[i], expr->e.e_funapp.args[i]); - if (magic_signature_check("function", f->name, f->signature, args_nr, arguments, - expr->e.e_funapp.line_nr, expr->e.e_funapp.column) - || f->fun(env, args_nr, dest, arguments)) + if ((dest->v.v_area = eval_area (env, &expr->e.e_area))) + dest->ty = TY_AREA; + else + dest->ty = TY_FAIL; + break; + + case EXPR_FUNAPP: + { + val_t arguments[MAX_ARGS]; + int args_nr = expr->e.e_funapp.args_nr; + int i; + fun_t *f = functions + expr->e.e_funapp.id; + + for (i = 0; i < args_nr; ++i) + magic_eval (env, &arguments[i], expr->e.e_funapp.args[i]); + if (magic_signature_check + ("function", f->name, f->signature, args_nr, arguments, + expr->e.e_funapp.line_nr, expr->e.e_funapp.column) + || f->fun (env, args_nr, dest, arguments)) + dest->ty = TY_FAIL; + else + { + int dest_ty = type_key (f->ret_ty); + if (dest_ty != -1) + dest->ty = dest_ty; + + /* translate entity back into persistent int */ + if (dest->ty == TY_ENTITY) + { + if (dest->v.v_entity) + dest->v.v_int = dest->v.v_entity->id; + else dest->ty = TY_FAIL; - else { - int dest_ty = type_key(f->ret_ty); - if (dest_ty != -1) - dest->ty = dest_ty; - - /* translate entity back into persistent int */ - if (dest->ty == TY_ENTITY) { - if (dest->v.v_entity) - dest->v.v_int = dest->v.v_entity->id; - else - dest->ty = TY_FAIL; - } } + } - for (i = 0; i < args_nr; ++i) - magic_clear_var(&arguments[i]); - break; + for (i = 0; i < args_nr; ++i) + magic_clear_var (&arguments[i]); + break; } - case EXPR_ID: { - val_t v = VAR(expr->e.e_id); - magic_copy_var(dest, &v); - break; + case EXPR_ID: + { + val_t v = VAR (expr->e.e_id); + magic_copy_var (dest, &v); + break; } - case EXPR_SPELLFIELD: { - val_t v; - int id = expr->e.e_field.id; - magic_eval(env, &v, expr->e.e_field.expr); - - if (v.ty == TY_INVOCATION) { - invocation_t *t = (invocation_t *) map_id2bl(v.v.v_int); - - if (!t) - dest->ty = TY_UNDEF; - else { - env_t *env = t->env; - val_t v = VAR(id); - magic_copy_var(dest, &v); - } - } else { - fprintf(stderr, "[magic] Attempt to access field %s on non-spell\n", env->base_env->var_name[id]); - dest->ty = TY_FAIL; + case EXPR_SPELLFIELD: + { + val_t v; + int id = expr->e.e_field.id; + magic_eval (env, &v, expr->e.e_field.expr); + + if (v.ty == TY_INVOCATION) + { + invocation_t *t = (invocation_t *) map_id2bl (v.v.v_int); + + if (!t) + dest->ty = TY_UNDEF; + else + { + env_t *env = t->env; + val_t v = VAR (id); + magic_copy_var (dest, &v); } - break; + } + else + { + fprintf (stderr, + "[magic] Attempt to access field %s on non-spell\n", + env->base_env->var_name[id]); + dest->ty = TY_FAIL; + } + break; } default: - fprintf(stderr, "[magic] INTERNAL ERROR: Unknown expression type %d\n", expr->ty); - break; - } + fprintf (stderr, + "[magic] INTERNAL ERROR: Unknown expression type %d\n", + expr->ty); + break; + } } -int -magic_eval_int(env_t *env, expr_t *expr) +int magic_eval_int (env_t * env, expr_t * expr) { - val_t result; - magic_eval(env, &result, expr); + val_t result; + magic_eval (env, &result, expr); - if (result.ty == TY_FAIL - || result.ty == TY_UNDEF) - return 0; + if (result.ty == TY_FAIL || result.ty == TY_UNDEF) + return 0; - intify(&result); + intify (&result); - return result.v.v_int; + return result.v.v_int; } -char * -magic_eval_str(env_t *env, expr_t *expr) +char *magic_eval_str (env_t * env, expr_t * expr) { - val_t result; - magic_eval(env, &result, expr); + val_t result; + magic_eval (env, &result, expr); - if (result.ty == TY_FAIL - || result.ty == TY_UNDEF) - return strdup("?"); + if (result.ty == TY_FAIL || result.ty == TY_UNDEF) + return strdup ("?"); - stringify(&result, 0); + stringify (&result, 0); - return result.v.v_string; + return result.v.v_string; } -expr_t * -magic_new_expr(int ty) +expr_t *magic_new_expr (int ty) { - expr_t *expr = (expr_t *)malloc(sizeof(expr_t)); - expr->ty = ty; - return expr; + expr_t *expr = (expr_t *) malloc (sizeof (expr_t)); + expr->ty = ty; + return expr; } diff --git a/src/map/magic-expr.h b/src/map/magic-expr.h index d8221d0..657dcb7 100644 --- a/src/map/magic-expr.h +++ b/src/map/magic-expr.h @@ -11,7 +11,7 @@ #endif #ifndef INT_MAX -# define INT_MAX (1<<30) // It's more than that, but this is quite sufficient for our purposes. +# define INT_MAX (1<<30) // It's more than that, but this is quite sufficient for our purposes. #endif /* @@ -27,17 +27,19 @@ * . : any, except for fail/undef * _ : any, including fail, but not undef */ -typedef struct fun { - char *name; - char *signature; - char ret_ty; - int (*fun)(env_t *env, int args_nr, val_t *result, val_t *args); +typedef struct fun +{ + char *name; + char *signature; + char ret_ty; + int (*fun) (env_t * env, int args_nr, val_t * result, val_t * args); } fun_t; -typedef struct op { - char *name; - char *signature; - int (*op)(env_t *env, int args_nr, val_t *args); +typedef struct op +{ + char *name; + char *signature; + int (*op) (env_t * env, int args_nr, val_t * args); } op_t; /** @@ -45,56 +47,49 @@ typedef struct op { * @param name The name to look up * @return A function of that name, or NULL, and a function index */ -fun_t * -magic_get_fun(char *name, int *index); +fun_t *magic_get_fun (char *name, int *index); /** * Retrieves an operation by name * @param name The name to look up * @return An operation of that name, or NULL, and a function index */ -op_t * -magic_get_op(char *name, int *index); +op_t *magic_get_op (char *name, int *index); /** * Evaluates an expression and stores the result in `dest' */ -void -magic_eval(env_t *env, val_t *dest, expr_t *expr); +void magic_eval (env_t * env, val_t * dest, expr_t * expr); /** * Evaluates an expression and coerces the result into an integer */ -int -magic_eval_int(env_t *env, expr_t *expr); +int magic_eval_int (env_t * env, expr_t * expr); /** * Evaluates an expression and coerces the result into a string */ -char * -magic_eval_str(env_t *env, expr_t *expr); +char *magic_eval_str (env_t * env, expr_t * expr); -int -map_is_solid(int m, int x, int y); +int map_is_solid (int m, int x, int y); -expr_t * -magic_new_expr(int ty); +expr_t *magic_new_expr (int ty); -void -magic_clear_var(val_t *v); +void magic_clear_var (val_t * v); -void -magic_copy_var(val_t *dest, val_t *src); +void magic_copy_var (val_t * dest, val_t * src); -void -magic_random_location(location_t *dest, area_t *area); +void magic_random_location (location_t * dest, area_t * area); -int // ret -1: not a string, ret 1: no such item, ret 0: OK -magic_find_item(val_t *args, int index, struct item *item, int *stackable); +int // ret -1: not a string, ret 1: no such item, ret 0: OK + + + + + magic_find_item (val_t * args, int index, struct item *item, int *stackable); #define GET_ARG_ITEM(index, dest, stackable) switch(magic_find_item(args, index, &dest, &stackable)) { case -1 : return 1; case 1 : return 0; } -int -magic_location_in_area(int m, int x, int y, area_t *area); +int magic_location_in_area (int m, int x, int y, area_t * area); #endif /* !defined(MAGIC_EXPR_H_) */ diff --git a/src/map/magic-interpreter-base.c b/src/map/magic-interpreter-base.c index a6c5795..0ece700 100644 --- a/src/map/magic-interpreter-base.c +++ b/src/map/magic-interpreter-base.c @@ -3,36 +3,32 @@ #include "magic-expr.h" #include "magic-interpreter-aux.h" -static void -set_int_p(val_t *v, int i, int t) +static void set_int_p (val_t * v, int i, int t) { - v->ty = t; - v->v.v_int = i; + v->ty = t; + v->v.v_int = i; } + #define set_int(v, i) set_int_p(v, i, TY_INT) #define set_dir(v, i) set_int_p(v, i, TY_DIR) #define SETTER(tty, dyn_ty, field) (val_t *v, tty x) { v->ty = dyn_ty; v->v.field = x; } -static void -set_string SETTER(char *, TY_STRING, v_string); +static void set_string SETTER (char *, TY_STRING, v_string); -static void -set_entity(val_t *v, entity_t *e) +static void set_entity (val_t * v, entity_t * e) { - v->ty = TY_ENTITY; - v->v.v_int = e->id; + v->ty = TY_ENTITY; + v->v.v_int = e->id; } -static void -set_invocation(val_t *v, invocation_t *i) +static void set_invocation (val_t * v, invocation_t * i) { - v->ty = TY_INVOCATION; - v->v.v_int = i->bl.id; + v->ty = TY_INVOCATION; + v->v.v_int = i->bl.id; } -static void -set_spell SETTER(spell_t *, TY_SPELL, v_spell); +static void set_spell SETTER (spell_t *, TY_SPELL, v_spell); #define setenv(f, v, x) f(&(env->vars[v]), x) @@ -45,254 +41,253 @@ set_spell SETTER(spell_t *, TY_SPELL, v_spell); #define set_env_invocation(v, x) setenv(set_invocation, v, x) #define set_env_spell(v, x) setenv(set_spell, v, x) - - -magic_conf_t magic_conf; /* Global magic conf */ +magic_conf_t magic_conf; /* Global magic conf */ env_t magic_default_env = { &magic_conf, NULL }; static int spells_sorted = 0; -char * -magic_find_invocation(char *spellname) +char *magic_find_invocation (char *spellname) { - int i; + int i; - for (i = 0; i < abs(magic_conf.spells_nr); i++) - if (!strcmp(magic_conf.spells[i]->name, spellname)) - return magic_conf.spells[i]->invocation; + for (i = 0; i < abs (magic_conf.spells_nr); i++) + if (!strcmp (magic_conf.spells[i]->name, spellname)) + return magic_conf.spells[i]->invocation; - return NULL; + return NULL; } -static int -spell_compare(const void *lhs, const void *rhs) +static int spell_compare (const void *lhs, const void *rhs) { - return strcmp((*((spell_t **)lhs))->invocation, - (*((spell_t **)rhs))->invocation); + return strcmp ((*((spell_t **) lhs))->invocation, + (*((spell_t **) rhs))->invocation); } -spell_t * -magic_find_spell(char *invocation) +spell_t *magic_find_spell (char *invocation) { - spell_t key; - spell_t *keyp = &key; - spell_t **retval; + spell_t key; + spell_t *keyp = &key; + spell_t **retval; - if (!spells_sorted) { - qsort(magic_conf.spells, magic_conf.spells_nr, sizeof(spell_t *), spell_compare); - spells_sorted = 1; - } + if (!spells_sorted) + { + qsort (magic_conf.spells, magic_conf.spells_nr, sizeof (spell_t *), + spell_compare); + spells_sorted = 1; + } - key.invocation = invocation; + key.invocation = invocation; - retval = ((spell_t **)bsearch(&keyp, magic_conf.spells, magic_conf.spells_nr, sizeof(spell_t *), spell_compare)); + retval = + ((spell_t **) + bsearch (&keyp, magic_conf.spells, magic_conf.spells_nr, + sizeof (spell_t *), spell_compare)); - if (!retval) - return NULL; - else - return *retval; + if (!retval) + return NULL; + else + return *retval; } - /* -------------------------------------------------------------------------------- */ /* Spell anchors */ /* -------------------------------------------------------------------------------- */ -static int -compare_teleport_anchor(const void * lhs, const void *rhs) +static int compare_teleport_anchor (const void *lhs, const void *rhs) { - return strcmp((*((teleport_anchor_t **)lhs))->invocation, - (*((teleport_anchor_t **)rhs))->invocation); + return strcmp ((*((teleport_anchor_t **) lhs))->invocation, + (*((teleport_anchor_t **) rhs))->invocation); } - -char * -magic_find_anchor_invocation(char *anchor_name) + +char *magic_find_anchor_invocation (char *anchor_name) { - int i; + int i; - for (i = 0; i < abs(magic_conf.anchors_nr); i++) - if (!strcmp(magic_conf.anchors[i]->name, anchor_name)) - return magic_conf.anchors[i]->invocation; + for (i = 0; i < abs (magic_conf.anchors_nr); i++) + if (!strcmp (magic_conf.anchors[i]->name, anchor_name)) + return magic_conf.anchors[i]->invocation; - return NULL; + return NULL; } - -teleport_anchor_t * -magic_find_anchor(char *name) +teleport_anchor_t *magic_find_anchor (char *name) { - teleport_anchor_t key; - teleport_anchor_t *keyp = &key; - teleport_anchor_t **retval; - - if (magic_conf.anchors_nr > 0) { /* unsorted */ - qsort(magic_conf.anchors, magic_conf.anchors_nr, sizeof(teleport_anchor_t *), - compare_teleport_anchor); - magic_conf.anchors_nr = -magic_conf.anchors_nr; - } - - key.invocation = name; - - retval = (teleport_anchor_t **) bsearch(&keyp, - magic_conf.anchors, -magic_conf.anchors_nr, sizeof(teleport_anchor_t *), - compare_teleport_anchor); - - if (!retval) - return NULL; - else - return *retval; + teleport_anchor_t key; + teleport_anchor_t *keyp = &key; + teleport_anchor_t **retval; + + if (magic_conf.anchors_nr > 0) + { /* unsorted */ + qsort (magic_conf.anchors, magic_conf.anchors_nr, + sizeof (teleport_anchor_t *), compare_teleport_anchor); + magic_conf.anchors_nr = -magic_conf.anchors_nr; + } + + key.invocation = name; + + retval = (teleport_anchor_t **) bsearch (&keyp, + magic_conf.anchors, + -magic_conf.anchors_nr, + sizeof (teleport_anchor_t *), + compare_teleport_anchor); + + if (!retval) + return NULL; + else + return *retval; } - /* -------------------------------------------------------------------------------- */ /* Spell guard checks */ /* -------------------------------------------------------------------------------- */ -static env_t * -alloc_env(magic_conf_t *conf) +static env_t *alloc_env (magic_conf_t * conf) { - env_t *env = (env_t*) aCalloc(sizeof (env_t), 1); - env->vars = (val_t *) aCalloc(sizeof (val_t), conf->vars_nr); - env->base_env = conf; - return env; + env_t *env = (env_t *) aCalloc (sizeof (env_t), 1); + env->vars = (val_t *) aCalloc (sizeof (val_t), conf->vars_nr); + env->base_env = conf; + return env; } -static env_t * -clone_env(env_t *src) +static env_t *clone_env (env_t * src) { - env_t *retval = alloc_env(src->base_env); - int i; + env_t *retval = alloc_env (src->base_env); + int i; - for (i = 0; i < src->base_env->vars_nr; i++) - magic_copy_var(&retval->vars[i], - &src->vars[i]); + for (i = 0; i < src->base_env->vars_nr; i++) + magic_copy_var (&retval->vars[i], &src->vars[i]); - return retval; + return retval; } -void -magic_free_env(env_t *env) +void magic_free_env (env_t * env) { - int i; - for (i = 0; i < env->base_env->vars_nr; i++) - magic_clear_var(&env->vars[i]); - free(env); + int i; + for (i = 0; i < env->base_env->vars_nr; i++) + magic_clear_var (&env->vars[i]); + free (env); } -env_t * -spell_create_env(magic_conf_t *conf, spell_t *spell, character_t *caster, int spellpower, char *param) +env_t *spell_create_env (magic_conf_t * conf, spell_t * spell, + character_t * caster, int spellpower, char *param) { - env_t *env = alloc_env(conf); + env_t *env = alloc_env (conf); - switch (spell->spellarg_ty) { + switch (spell->spellarg_ty) + { case SPELLARG_STRING: - set_env_string(spell->arg, param); - break; - - case SPELLARG_PC:{ - character_t *subject = map_nick2sd(param); - if (!subject) - subject = caster; - set_env_entity(spell->arg, &subject->bl); - free(param); - break; + set_env_string (spell->arg, param); + break; + + case SPELLARG_PC: + { + character_t *subject = map_nick2sd (param); + if (!subject) + subject = caster; + set_env_entity (spell->arg, &subject->bl); + free (param); + break; } case SPELLARG_NONE: - break; + break; default: - fprintf(stderr, "Unexpected spellarg type %d\n", spell->spellarg_ty); - } + fprintf (stderr, "Unexpected spellarg type %d\n", + spell->spellarg_ty); + } - set_env_entity(VAR_CASTER, &caster->bl); - set_env_int(VAR_SPELLPOWER, spellpower); - set_env_spell(VAR_SPELL, spell); + set_env_entity (VAR_CASTER, &caster->bl); + set_env_int (VAR_SPELLPOWER, spellpower); + set_env_spell (VAR_SPELL, spell); - return env; + return env; } - - -static void -free_components(component_t **component_holder) +static void free_components (component_t ** component_holder) { - if (*component_holder == NULL) - return; - free_components(&(*component_holder)->next); - free(*component_holder); - *component_holder = NULL; + if (*component_holder == NULL) + return; + free_components (&(*component_holder)->next); + free (*component_holder); + *component_holder = NULL; } -void -magic_add_component(component_t **component_holder, int id, int count) +void magic_add_component (component_t ** component_holder, int id, int count) { - if (count <= 0) - return; - - if (*component_holder == NULL) { - component_t *component = (component_t *)malloc(sizeof(component_t)); - component->next = NULL; - component->item_id = id; - component->count = count; - *component_holder = component; - } else { - component_t *component = *component_holder; - if (component->item_id == id) { - component->count += count; - return; - } else magic_add_component(&component->next, id, count); - /* Tail-recurse; gcc can optimise this. Not that it matters. */ + if (count <= 0) + return; + + if (*component_holder == NULL) + { + component_t *component = + (component_t *) malloc (sizeof (component_t)); + component->next = NULL; + component->item_id = id; + component->count = count; + *component_holder = component; + } + else + { + component_t *component = *component_holder; + if (component->item_id == id) + { + component->count += count; + return; } + else + magic_add_component (&component->next, id, count); + /* Tail-recurse; gcc can optimise this. Not that it matters. */ + } } static void -copy_components(component_t **component_holder, component_t *component) +copy_components (component_t ** component_holder, component_t * component) { - if (component == NULL) - return; + if (component == NULL) + return; - magic_add_component(component_holder, component->item_id, component->count); - copy_components(component_holder, component->next); + magic_add_component (component_holder, component->item_id, + component->count); + copy_components (component_holder, component->next); } - -typedef struct spellguard_check { - component_t *catalysts, *components; - int mana, casttime; +typedef struct spellguard_check +{ + component_t *catalysts, *components; + int mana, casttime; } spellguard_check_t; - -static int -check_prerequisites(character_t *caster, component_t *component) +static int check_prerequisites (character_t * caster, component_t * component) { - while (component) { - if (pc_count_all_items(caster, component->item_id) - < component->count) - return 0; /* insufficient */ + while (component) + { + if (pc_count_all_items (caster, component->item_id) + < component->count) + return 0; /* insufficient */ - component = component->next; - } + component = component->next; + } - return 1; + return 1; } -static void -consume_components(character_t *caster, component_t *component) +static void consume_components (character_t * caster, component_t * component) { - while (component) { - pc_remove_items(caster, component->item_id, component->count); - component = component->next; - } + while (component) + { + pc_remove_items (caster, component->item_id, component->count); + component = component->next; + } } - static int -spellguard_can_satisfy(spellguard_check_t *check, character_t *caster, env_t *env, int *near_miss) +spellguard_can_satisfy (spellguard_check_t * check, character_t * caster, + env_t * env, int *near_miss) { - unsigned int tick = gettick(); + unsigned int tick = gettick (); - int retval = check_prerequisites(caster, check->catalysts); + int retval = check_prerequisites (caster, check->catalysts); /* fprintf(stderr, "MC(%d/%s)? %d%d%d%d (%u <= %u)\n", @@ -304,255 +299,260 @@ spellguard_can_satisfy(spellguard_check_t *check, character_t *caster, env_t *en caster->cast_tick, tick); */ - if (retval && near_miss) - *near_miss = 1; // close enough! + if (retval && near_miss) + *near_miss = 1; // close enough! - retval = retval - && caster->cast_tick <= tick /* Hasn't cast a spell too recently */ - && check->mana <= caster->status.sp - && check_prerequisites(caster, check->components); + retval = retval && caster->cast_tick <= tick /* Hasn't cast a spell too recently */ + && check->mana <= caster->status.sp + && check_prerequisites (caster, check->components); - if (retval) { - unsigned int casttime = (unsigned int) check->casttime; + if (retval) + { + unsigned int casttime = (unsigned int) check->casttime; - if (VAR(VAR_MIN_CASTTIME).ty == TY_INT) - casttime = MAX(casttime, VAR(VAR_MIN_CASTTIME).v.v_int); + if (VAR (VAR_MIN_CASTTIME).ty == TY_INT) + casttime = MAX (casttime, VAR (VAR_MIN_CASTTIME).v.v_int); - caster->cast_tick = tick + casttime; /* Make sure not to cast too frequently */ + caster->cast_tick = tick + casttime; /* Make sure not to cast too frequently */ - consume_components(caster, check->components); - pc_heal(caster, 0, -check->mana); - } + consume_components (caster, check->components); + pc_heal (caster, 0, -check->mana); + } - return retval; + return retval; } -static effect_set_t * -spellguard_check_sub(spellguard_check_t *check, spellguard_t *guard, character_t *caster, env_t *env, int *near_miss) +static effect_set_t *spellguard_check_sub (spellguard_check_t * check, + spellguard_t * guard, + character_t * caster, env_t * env, + int *near_miss) { - if (guard == NULL) - return NULL; + if (guard == NULL) + return NULL; - switch (guard->ty) { + switch (guard->ty) + { case SPELLGUARD_CONDITION: - if (!magic_eval_int(env, guard->s.s_condition)) - return NULL; - break; + if (!magic_eval_int (env, guard->s.s_condition)) + return NULL; + break; case SPELLGUARD_COMPONENTS: - copy_components(&check->components, guard->s.s_components); - break; + copy_components (&check->components, guard->s.s_components); + break; case SPELLGUARD_CATALYSTS: - copy_components(&check->catalysts, guard->s.s_catalysts); - break; - - case SPELLGUARD_CHOICE: { - spellguard_check_t altcheck = *check; - effect_set_t *retval; - - altcheck.components = NULL; - altcheck.catalysts = NULL; - - copy_components(&altcheck.catalysts, check->catalysts); - copy_components(&altcheck.components, check->components); - - retval = spellguard_check_sub(&altcheck, guard->next, caster, env, near_miss); - free_components(&altcheck.catalysts); - free_components(&altcheck.components); - if (retval) - return retval; - else - return spellguard_check_sub(check, guard->s.s_alt, caster, env, near_miss); + copy_components (&check->catalysts, guard->s.s_catalysts); + break; + + case SPELLGUARD_CHOICE: + { + spellguard_check_t altcheck = *check; + effect_set_t *retval; + + altcheck.components = NULL; + altcheck.catalysts = NULL; + + copy_components (&altcheck.catalysts, check->catalysts); + copy_components (&altcheck.components, check->components); + + retval = + spellguard_check_sub (&altcheck, guard->next, caster, env, + near_miss); + free_components (&altcheck.catalysts); + free_components (&altcheck.components); + if (retval) + return retval; + else + return spellguard_check_sub (check, guard->s.s_alt, caster, + env, near_miss); } case SPELLGUARD_MANA: - check->mana += magic_eval_int(env, guard->s.s_mana); - break; + check->mana += magic_eval_int (env, guard->s.s_mana); + break; case SPELLGUARD_CASTTIME: - check->casttime += magic_eval_int(env, guard->s.s_mana); - break; + check->casttime += magic_eval_int (env, guard->s.s_mana); + break; case SPELLGUARD_EFFECT: - if (spellguard_can_satisfy(check, caster, env, near_miss)) - return &guard->s.s_effect; - else - return NULL; + if (spellguard_can_satisfy (check, caster, env, near_miss)) + return &guard->s.s_effect; + else + return NULL; default: - fprintf(stderr, "Unexpected spellguard type %d\n", guard->ty); - return NULL; - } + fprintf (stderr, "Unexpected spellguard type %d\n", guard->ty); + return NULL; + } - return spellguard_check_sub(check, guard->next, caster, env, near_miss); + return spellguard_check_sub (check, guard->next, caster, env, near_miss); } -static effect_set_t * -check_spellguard(spellguard_t *guard, character_t *caster, env_t *env, int *near_miss) +static effect_set_t *check_spellguard (spellguard_t * guard, + character_t * caster, env_t * env, + int *near_miss) { - spellguard_check_t check; - effect_set_t *retval; - check.catalysts = NULL; - check.components = NULL; - check.mana = check.casttime = 0; + spellguard_check_t check; + effect_set_t *retval; + check.catalysts = NULL; + check.components = NULL; + check.mana = check.casttime = 0; - retval = spellguard_check_sub(&check, guard, caster, env, near_miss); + retval = spellguard_check_sub (&check, guard, caster, env, near_miss); - free_components(&check.catalysts); - free_components(&check.components); + free_components (&check.catalysts); + free_components (&check.components); - return retval; + return retval; } /* -------------------------------------------------------------------------------- */ /* Public API */ /* -------------------------------------------------------------------------------- */ - -effect_set_t * -spell_trigger(spell_t *spell, character_t *caster, env_t *env, int *near_miss) +effect_set_t *spell_trigger (spell_t * spell, character_t * caster, + env_t * env, int *near_miss) { - int i; - spellguard_t *guard = spell->spellguard; + int i; + spellguard_t *guard = spell->spellguard; - if (near_miss) - *near_miss = 0; + if (near_miss) + *near_miss = 0; - for (i = 0; i < spell->letdefs_nr; i++) - magic_eval(env, - &env->vars[spell->letdefs[i].id], - spell->letdefs[i].expr); + for (i = 0; i < spell->letdefs_nr; i++) + magic_eval (env, + &env->vars[spell->letdefs[i].id], spell->letdefs[i].expr); - return check_spellguard(guard, caster, env, near_miss); + return check_spellguard (guard, caster, env, near_miss); } -static void -spell_set_location(invocation_t *invocation, entity_t *entity) +static void spell_set_location (invocation_t * invocation, entity_t * entity) { - magic_clear_var(&invocation->env->vars[VAR_LOCATION]); - invocation->env->vars[VAR_LOCATION].ty = TY_LOCATION; - invocation->env->vars[VAR_LOCATION].v.v_location.m = entity->m; - invocation->env->vars[VAR_LOCATION].v.v_location.x = entity->x; - invocation->env->vars[VAR_LOCATION].v.v_location.y = entity->y; + magic_clear_var (&invocation->env->vars[VAR_LOCATION]); + invocation->env->vars[VAR_LOCATION].ty = TY_LOCATION; + invocation->env->vars[VAR_LOCATION].v.v_location.m = entity->m; + invocation->env->vars[VAR_LOCATION].v.v_location.x = entity->x; + invocation->env->vars[VAR_LOCATION].v.v_location.y = entity->y; } -void -spell_update_location(invocation_t *invocation) +void spell_update_location (invocation_t * invocation) { - if (invocation->spell->flags & SPELL_FLAG_LOCAL) - return; - else { - character_t *owner = (character_t *)map_id2bl(invocation->subject); - if (!owner) - return; - - spell_set_location(invocation, (entity_t *) owner); - } + if (invocation->spell->flags & SPELL_FLAG_LOCAL) + return; + else + { + character_t *owner = (character_t *) map_id2bl (invocation->subject); + if (!owner) + return; + + spell_set_location (invocation, (entity_t *) owner); + } } -invocation_t * -spell_instantiate(effect_set_t *effect_set, env_t *env) +invocation_t *spell_instantiate (effect_set_t * effect_set, env_t * env) { - invocation_t *retval = (invocation_t *)aCalloc(sizeof(invocation_t), 1); - entity_t *caster; - - retval->env = env; - - retval->caster = VAR(VAR_CASTER).v.v_int; - retval->spell = VAR(VAR_SPELL).v.v_spell; - retval->stack_size = 0; - retval->current_effect = effect_set->effect; - retval->trigger_effect = effect_set->at_trigger; - retval->end_effect = effect_set->at_end; - - caster = map_id2bl(retval->caster); // must still exist - retval->bl.id = map_addobject(&retval->bl); - retval->bl.type = BL_SPELL; - retval->bl.m = caster->m; - retval->bl.x = caster->x; - retval->bl.y = caster->y; - - map_addblock(&retval->bl); - set_env_invocation(VAR_INVOCATION, retval); - - return retval; + invocation_t *retval = + (invocation_t *) aCalloc (sizeof (invocation_t), 1); + entity_t *caster; + + retval->env = env; + + retval->caster = VAR (VAR_CASTER).v.v_int; + retval->spell = VAR (VAR_SPELL).v.v_spell; + retval->stack_size = 0; + retval->current_effect = effect_set->effect; + retval->trigger_effect = effect_set->at_trigger; + retval->end_effect = effect_set->at_end; + + caster = map_id2bl (retval->caster); // must still exist + retval->bl.id = map_addobject (&retval->bl); + retval->bl.type = BL_SPELL; + retval->bl.m = caster->m; + retval->bl.x = caster->x; + retval->bl.y = caster->y; + + map_addblock (&retval->bl); + set_env_invocation (VAR_INVOCATION, retval); + + return retval; } -invocation_t * -spell_clone_effect(invocation_t *base) +invocation_t *spell_clone_effect (invocation_t * base) { - invocation_t *retval = (invocation_t *)malloc(sizeof(invocation_t)); - env_t *env; - - memcpy(retval, base, sizeof(invocation_t)); - - retval->env = clone_env(retval->env); - env = retval->env; - retval->current_effect = retval->trigger_effect; - retval->next_invocation = NULL; - retval->end_effect = NULL; - retval->script_pos = 0; - retval->stack_size = 0; - retval->timer = 0; - retval->subject = 0; - retval->status_change_refs_nr = 0; - retval->status_change_refs = NULL; - retval->flags = 0; - - retval->bl.id = 0; - retval->bl.prev = NULL; - retval->bl.next = NULL; - - retval->bl.id = map_addobject(&retval->bl); - set_env_invocation(VAR_INVOCATION, retval); - - return retval; + invocation_t *retval = (invocation_t *) malloc (sizeof (invocation_t)); + env_t *env; + + memcpy (retval, base, sizeof (invocation_t)); + + retval->env = clone_env (retval->env); + env = retval->env; + retval->current_effect = retval->trigger_effect; + retval->next_invocation = NULL; + retval->end_effect = NULL; + retval->script_pos = 0; + retval->stack_size = 0; + retval->timer = 0; + retval->subject = 0; + retval->status_change_refs_nr = 0; + retval->status_change_refs = NULL; + retval->flags = 0; + + retval->bl.id = 0; + retval->bl.prev = NULL; + retval->bl.next = NULL; + + retval->bl.id = map_addobject (&retval->bl); + set_env_invocation (VAR_INVOCATION, retval); + + return retval; } - -void -spell_bind(character_t *subject, invocation_t *invocation) +void spell_bind (character_t * subject, invocation_t * invocation) { - /* Only bind nonlocal spells */ - - if (!(invocation->spell->flags & SPELL_FLAG_LOCAL)) { - if (invocation->flags & INVOCATION_FLAG_BOUND - || invocation->subject - || invocation->next_invocation) { - int *i = NULL; - fprintf(stderr, "[magic] INTERNAL ERROR: Attempt to re-bind spell invocation `%s'\n", invocation->spell->name); - *i = 1; - return; - } - - invocation->next_invocation = subject->active_spells; - subject->active_spells = invocation; - invocation->flags |= INVOCATION_FLAG_BOUND; - invocation->subject = subject->bl.id; + /* Only bind nonlocal spells */ + + if (!(invocation->spell->flags & SPELL_FLAG_LOCAL)) + { + if (invocation->flags & INVOCATION_FLAG_BOUND + || invocation->subject || invocation->next_invocation) + { + int *i = NULL; + fprintf (stderr, + "[magic] INTERNAL ERROR: Attempt to re-bind spell invocation `%s'\n", + invocation->spell->name); + *i = 1; + return; } - spell_set_location(invocation, (entity_t*) subject); + invocation->next_invocation = subject->active_spells; + subject->active_spells = invocation; + invocation->flags |= INVOCATION_FLAG_BOUND; + invocation->subject = subject->bl.id; + } + + spell_set_location (invocation, (entity_t *) subject); } -int -spell_unbind(character_t *subject, invocation_t *invocation) +int spell_unbind (character_t * subject, invocation_t * invocation) { - invocation_t **seeker = &subject->active_spells; + invocation_t **seeker = &subject->active_spells; - while (*seeker) { - if (*seeker == invocation) { - *seeker = invocation->next_invocation; + while (*seeker) + { + if (*seeker == invocation) + { + *seeker = invocation->next_invocation; - invocation->flags &= ~INVOCATION_FLAG_BOUND; - invocation->next_invocation = NULL; - invocation->subject = 0; + invocation->flags &= ~INVOCATION_FLAG_BOUND; + invocation->next_invocation = NULL; + invocation->subject = 0; - return 0; - } - seeker = &((*seeker)->next_invocation); + return 0; } + seeker = &((*seeker)->next_invocation); + } - return 1; + return 1; } - diff --git a/src/map/magic-interpreter-lexer.c b/src/map/magic-interpreter-lexer.c index 50b6865..5246eb0 100644 --- a/src/map/magic-interpreter-lexer.c +++ b/src/map/magic-interpreter-lexer.c @@ -70,7 +70,7 @@ typedef uint32_t flex_uint32_t; typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; -typedef unsigned char flex_uint8_t; +typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; @@ -112,15 +112,15 @@ typedef unsigned int flex_uint32_t; /* The "const" storage-class-modifier is valid. */ #define YY_USE_CONST -#else /* ! __cplusplus */ +#else /* ! __cplusplus */ /* C99 requires __STDC__ to be defined as 1. */ #if defined (__STDC__) #define YY_USE_CONST -#endif /* defined (__STDC__) */ -#endif /* ! __cplusplus */ +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ #ifdef YY_USE_CONST #define yyconst const @@ -188,14 +188,14 @@ extern FILE *magic_frontend_in, *magic_frontend_out; * a 5% performance hit in a non-magic_frontend_lineno scanner, because yy_act is * normally declared as a register variable-- so it is not worth it. */ - #define YY_LESS_LINENO(n) \ +#define YY_LESS_LINENO(n) \ do { \ int yyl;\ for ( yyl = n; yyl < magic_frontend_leng; ++yyl )\ if ( magic_frontend_text[yyl] == '\n' )\ --magic_frontend_lineno;\ }while(0) - + /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ @@ -220,72 +220,72 @@ typedef size_t yy_size_t; #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state - { - FILE *yy_input_file; - - char *yy_ch_buf; /* input buffer */ - char *yy_buf_pos; /* current position in input buffer */ - - /* Size of input buffer in bytes, not including room for EOB - * characters. - */ - yy_size_t yy_buf_size; - - /* Number of characters read into yy_ch_buf, not including EOB - * characters. - */ - int yy_n_chars; - - /* Whether we "own" the buffer - i.e., we know we created it, - * and can realloc() it to grow it, and should free() it to - * delete it. - */ - int yy_is_our_buffer; - - /* Whether this is an "interactive" input source; if so, and - * if we're using stdio for input, then we want to use getc() - * instead of fread(), to make sure we stop fetching input after - * each newline. - */ - int yy_is_interactive; - - /* Whether we're considered to be at the beginning of a line. - * If so, '^' rules will be active on the next match, otherwise - * not. - */ - int yy_at_bol; - - int yy_bs_lineno; /**< The line count. */ - int yy_bs_column; /**< The column count. */ - - /* Whether to try to fill the input buffer when we reach the - * end of it. - */ - int yy_fill_buffer; - - int yy_buffer_status; +{ + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno;/**< The line count. */ + int yy_bs_column;/**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 - /* When an EOF's been seen but there's still some text to process - * then we mark the buffer as YY_EOF_PENDING, to indicate that we - * shouldn't try reading from the input source any more. We might - * still have a bunch of tokens to match, though, because of - * possible backing-up. - * - * When we actually see the EOF, we change the status to "new" - * (via magic_frontend_restart()), so that the user can continue scanning by - * just pointing magic_frontend_in at a new input file. - */ + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via magic_frontend_restart()), so that the user can continue scanning by + * just pointing magic_frontend_in at a new input file. + */ #define YY_BUFFER_EOF_PENDING 2 - }; +}; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* Stack of input buffers. */ static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ -static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ +static YY_BUFFER_STATE *yy_buffer_stack = 0; /**< Stack as an array. */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general @@ -304,40 +304,40 @@ static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ /* yy_hold_char holds the character lost when magic_frontend_text is formed. */ static char yy_hold_char; -static int yy_n_chars; /* number of characters read into yy_ch_buf */ -int magic_frontend_leng; +static int yy_n_chars; /* number of characters read into yy_ch_buf */ +int magic_frontend_leng; /* Points to current character in buffer. */ static char *yy_c_buf_p = (char *) 0; -static int yy_init = 0; /* whether we need to initialize */ -static int yy_start = 0; /* start state number */ +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ /* Flag which is used to allow magic_frontend_wrap()'s to do buffer switches * instead of setting up a fresh magic_frontend_in. A bit of a hack ... */ static int yy_did_buffer_switch_on_eof; -void magic_frontend_restart (FILE *input_file ); -void magic_frontend__switch_to_buffer (YY_BUFFER_STATE new_buffer ); -YY_BUFFER_STATE magic_frontend__create_buffer (FILE *file,int size ); -void magic_frontend__delete_buffer (YY_BUFFER_STATE b ); -void magic_frontend__flush_buffer (YY_BUFFER_STATE b ); -void magic_frontend_push_buffer_state (YY_BUFFER_STATE new_buffer ); -void magic_frontend_pop_buffer_state (void ); +void magic_frontend_restart (FILE * input_file); +void magic_frontend__switch_to_buffer (YY_BUFFER_STATE new_buffer); +YY_BUFFER_STATE magic_frontend__create_buffer (FILE * file, int size); +void magic_frontend__delete_buffer (YY_BUFFER_STATE b); +void magic_frontend__flush_buffer (YY_BUFFER_STATE b); +void magic_frontend_push_buffer_state (YY_BUFFER_STATE new_buffer); +void magic_frontend_pop_buffer_state (void); -static void magic_frontend_ensure_buffer_stack (void ); -static void magic_frontend__load_buffer_state (void ); -static void magic_frontend__init_buffer (YY_BUFFER_STATE b,FILE *file ); +static void magic_frontend_ensure_buffer_stack (void); +static void magic_frontend__load_buffer_state (void); +static void magic_frontend__init_buffer (YY_BUFFER_STATE b, FILE * file); #define YY_FLUSH_BUFFER magic_frontend__flush_buffer(YY_CURRENT_BUFFER ) -YY_BUFFER_STATE magic_frontend__scan_buffer (char *base,yy_size_t size ); -YY_BUFFER_STATE magic_frontend__scan_string (yyconst char *yy_str ); -YY_BUFFER_STATE magic_frontend__scan_bytes (yyconst char *bytes,int len ); +YY_BUFFER_STATE magic_frontend__scan_buffer (char *base, yy_size_t size); +YY_BUFFER_STATE magic_frontend__scan_string (yyconst char *yy_str); +YY_BUFFER_STATE magic_frontend__scan_bytes (yyconst char *bytes, int len); -void *magic_frontend_alloc (yy_size_t ); -void *magic_frontend_realloc (void *,yy_size_t ); -void magic_frontend_free (void * ); +void *magic_frontend_alloc (yy_size_t); +void *magic_frontend_realloc (void *, yy_size_t); +void magic_frontend_free (void *); #define yy_new_buffer magic_frontend__create_buffer @@ -376,15 +376,15 @@ typedef int yy_state_type; extern int magic_frontend_lineno; -int magic_frontend_lineno = 1; +int magic_frontend_lineno = 1; extern char *magic_frontend_text; #define yytext_ptr magic_frontend_text -static yy_state_type yy_get_previous_state (void ); -static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); -static int yy_get_next_buffer (void ); -static void yy_fatal_error (yyconst char msg[] ); +static yy_state_type yy_get_previous_state (void); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state); +static int yy_get_next_buffer (void); +static void yy_fatal_error (yyconst char msg[]); /* Done after the current pattern has been matched and before the * corresponding action - sets up magic_frontend_text. @@ -401,242 +401,235 @@ static void yy_fatal_error (yyconst char msg[] ); /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info - { - flex_int32_t yy_verify; - flex_int32_t yy_nxt; - }; -static yyconst flex_int16_t yy_accept[240] = - { 0, - 0, 0, 87, 85, 84, 84, 85, 85, 85, 23, - 33, 17, 18, 21, 19, 28, 20, 35, 22, 79, - 79, 27, 26, 14, 9, 13, 29, 81, 81, 81, - 81, 7, 81, 81, 81, 81, 81, 5, 81, 81, - 81, 1, 81, 3, 31, 32, 34, 85, 30, 12, - 0, 78, 0, 0, 82, 24, 79, 0, 0, 36, - 16, 11, 10, 51, 15, 37, 81, 81, 81, 81, - 81, 81, 75, 81, 81, 81, 81, 70, 49, 81, - 81, 81, 81, 6, 81, 81, 4, 40, 65, 81, - 81, 8, 81, 81, 81, 81, 2, 81, 81, 81, - - 41, 81, 0, 0, 77, 25, 0, 78, 0, 0, - 83, 80, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 50, 81, 74, 48, 81, 81, 67, - 81, 66, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 0, 0, 77, 81, 81, 81, 81, - 39, 81, 81, 81, 81, 81, 72, 81, 81, 81, - 56, 81, 81, 81, 81, 58, 81, 81, 81, 81, - 71, 81, 76, 59, 62, 81, 60, 81, 81, 81, - 64, 81, 81, 81, 45, 81, 81, 81, 81, 47, - 81, 81, 81, 81, 81, 81, 81, 81, 61, 68, - - 81, 81, 81, 81, 44, 52, 69, 81, 81, 81, - 81, 81, 81, 73, 81, 81, 53, 81, 42, 81, - 57, 81, 81, 46, 81, 81, 63, 54, 81, 38, - 81, 55, 81, 81, 81, 81, 81, 43, 0 - } ; - -static yyconst flex_int32_t yy_ec[256] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, - 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 2, 4, 5, 6, 1, 7, 8, 1, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 35, 47, 35, 48, 35, - 49, 50, 51, 52, 24, 1, 53, 53, 53, 53, - - 53, 53, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 54, - 35, 35, 55, 56, 57, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1 - } ; - -static yyconst flex_int32_t yy_meta[58] = - { 0, - 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, - 1, 1, 1, 2, 1, 3, 3, 3, 3, 3, - 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, - 1, 1, 3, 2, 1, 1, 1 - } ; - -static yyconst flex_int16_t yy_base[248] = - { 0, - 0, 0, 289, 290, 290, 290, 266, 53, 284, 290, - 278, 290, 290, 290, 290, 290, 42, 290, 269, 44, - 46, 290, 290, 44, 46, 48, 290, 45, 241, 47, - 243, 43, 242, 0, 44, 46, 51, 48, 238, 51, - 250, 63, 76, 253, 290, 290, 290, 35, 222, 290, - 76, 290, 102, 274, 290, 290, 83, 273, 0, 290, - 290, 290, 290, 290, 290, 290, 0, 235, 66, 244, - 75, 75, 0, 242, 228, 86, 228, 0, 0, 225, - 241, 229, 240, 0, 227, 237, 0, 0, 0, 224, - 221, 0, 225, 227, 230, 216, 0, 215, 220, 226, - - 208, 220, 67, 115, 290, 290, 79, 116, 120, 250, - 290, 0, 209, 212, 207, 223, 211, 202, 220, 204, - 200, 213, 212, 0, 207, 210, 0, 213, 212, 0, - 199, 0, 208, 189, 204, 192, 195, 197, 198, 199, - 189, 201, 181, 77, 119, 78, 180, 195, 189, 186, - 0, 176, 183, 179, 173, 189, 0, 171, 189, 177, - 0, 187, 182, 177, 171, 0, 172, 169, 177, 165, - 0, 162, 0, 0, 0, 172, 0, 169, 154, 162, - 0, 155, 151, 170, 0, 165, 146, 131, 128, 0, - 139, 123, 127, 135, 131, 124, 117, 130, 0, 0, - - 126, 124, 111, 126, 0, 0, 0, 112, 110, 123, - 121, 105, 110, 0, 120, 104, 0, 101, 0, 102, - 0, 100, 98, 0, 112, 127, 0, 0, 96, 0, - 113, 0, 99, 109, 103, 93, 89, 0, 290, 176, - 179, 181, 184, 187, 190, 127, 193 - } ; - -static yyconst flex_int16_t yy_def[248] = - { 0, - 239, 1, 239, 239, 239, 239, 239, 240, 241, 239, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - 239, 239, 239, 239, 239, 239, 239, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 239, 239, 239, 243, 239, 239, - 240, 239, 244, 241, 239, 239, 239, 245, 246, 239, - 239, 239, 239, 239, 239, 239, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - - 242, 242, 243, 247, 239, 239, 240, 240, 244, 245, - 239, 246, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 243, 247, 243, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, - 242, 242, 242, 242, 242, 242, 242, 242, 0, 239, - 239, 239, 239, 239, 239, 239, 239 - } ; - -static yyconst flex_int16_t yy_nxt[348] = - { 0, - 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 4, 27, 28, 29, 30, 31, 32, - 33, 34, 34, 35, 34, 34, 36, 37, 38, 39, - 40, 34, 41, 42, 43, 34, 44, 34, 45, 4, - 46, 47, 34, 34, 48, 49, 4, 52, 57, 57, - 57, 57, 57, 57, 60, 61, 62, 63, 64, 65, - 66, 68, 71, 74, 78, 80, 82, 84, 89, 75, - 52, 76, 79, 52, 104, 81, 72, 85, 86, 69, - 83, 105, 92, 90, 87, 114, 93, 59, 94, 57, - - 57, 98, 53, 95, 51, 99, 108, 96, 100, 97, - 115, 117, 120, 121, 124, 101, 104, 103, 118, 119, - 52, 103, 51, 105, 108, 53, 104, 104, 53, 112, - 125, 238, 237, 105, 105, 236, 235, 234, 233, 232, - 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, - 221, 109, 220, 219, 218, 217, 216, 215, 214, 213, - 212, 211, 210, 209, 145, 53, 208, 207, 145, 109, - 206, 146, 205, 204, 203, 146, 51, 51, 51, 54, - 54, 54, 67, 67, 103, 103, 103, 107, 107, 107, - 110, 110, 110, 144, 144, 144, 202, 201, 200, 199, - - 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, - 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, - 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, - 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, - 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, - 148, 147, 111, 143, 142, 141, 140, 139, 138, 137, - 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, - 126, 123, 122, 116, 113, 111, 55, 106, 102, 91, - 88, 77, 73, 70, 58, 56, 55, 50, 239, 3, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - 239, 239, 239, 239, 239, 239, 239 - } ; - -static yyconst flex_int16_t yy_chk[348] = - { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 8, 17, 17, - 20, 20, 21, 21, 24, 24, 24, 25, 25, 26, - 26, 28, 30, 32, 35, 36, 37, 38, 40, 32, - 51, 32, 35, 107, 48, 36, 30, 38, 38, 28, - 37, 48, 42, 40, 38, 69, 42, 20, 42, 57, - - 57, 43, 8, 42, 53, 43, 53, 42, 43, 42, - 69, 71, 72, 72, 76, 43, 103, 104, 71, 71, - 108, 145, 109, 103, 109, 51, 144, 146, 107, 246, - 76, 237, 236, 144, 146, 235, 234, 233, 231, 229, - 226, 225, 223, 222, 220, 218, 216, 215, 213, 212, - 211, 53, 210, 209, 208, 204, 203, 202, 201, 198, - 197, 196, 195, 194, 104, 108, 193, 192, 145, 109, - 191, 104, 189, 188, 187, 145, 240, 240, 240, 241, - 241, 241, 242, 242, 243, 243, 243, 244, 244, 244, - 245, 245, 245, 247, 247, 247, 186, 184, 183, 182, - - 180, 179, 178, 176, 172, 170, 169, 168, 167, 165, - 164, 163, 162, 160, 159, 158, 156, 155, 154, 153, - 152, 150, 149, 148, 147, 143, 142, 141, 140, 139, - 138, 137, 136, 135, 134, 133, 131, 129, 128, 126, - 125, 123, 122, 121, 120, 119, 118, 117, 116, 115, - 114, 113, 110, 102, 101, 100, 99, 98, 96, 95, - 94, 93, 91, 90, 86, 85, 83, 82, 81, 80, - 77, 75, 74, 70, 68, 58, 54, 49, 44, 41, - 39, 33, 31, 29, 19, 11, 9, 7, 3, 239, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, - 239, 239, 239, 239, 239, 239, 239 - } ; +{ + flex_int32_t yy_verify; + flex_int32_t yy_nxt; +}; +static yyconst flex_int16_t yy_accept[240] = { 0, + 0, 0, 87, 85, 84, 84, 85, 85, 85, 23, + 33, 17, 18, 21, 19, 28, 20, 35, 22, 79, + 79, 27, 26, 14, 9, 13, 29, 81, 81, 81, + 81, 7, 81, 81, 81, 81, 81, 5, 81, 81, + 81, 1, 81, 3, 31, 32, 34, 85, 30, 12, + 0, 78, 0, 0, 82, 24, 79, 0, 0, 36, + 16, 11, 10, 51, 15, 37, 81, 81, 81, 81, + 81, 81, 75, 81, 81, 81, 81, 70, 49, 81, + 81, 81, 81, 6, 81, 81, 4, 40, 65, 81, + 81, 8, 81, 81, 81, 81, 2, 81, 81, 81, + + 41, 81, 0, 0, 77, 25, 0, 78, 0, 0, + 83, 80, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 50, 81, 74, 48, 81, 81, 67, + 81, 66, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 0, 0, 77, 81, 81, 81, 81, + 39, 81, 81, 81, 81, 81, 72, 81, 81, 81, + 56, 81, 81, 81, 81, 58, 81, 81, 81, 81, + 71, 81, 76, 59, 62, 81, 60, 81, 81, 81, + 64, 81, 81, 81, 45, 81, 81, 81, 81, 47, + 81, 81, 81, 81, 81, 81, 81, 81, 61, 68, + + 81, 81, 81, 81, 44, 52, 69, 81, 81, 81, + 81, 81, 81, 73, 81, 81, 53, 81, 42, 81, + 57, 81, 81, 46, 81, 81, 63, 54, 81, 38, + 81, 55, 81, 81, 81, 81, 81, 43, 0 +}; + +static yyconst flex_int32_t yy_ec[256] = { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 4, 5, 6, 1, 7, 8, 1, 9, + 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, + 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 35, 47, 35, 48, 35, + 49, 50, 51, 52, 24, 1, 53, 53, 53, 53, + + 53, 53, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 54, + 35, 35, 55, 56, 57, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 +}; + +static yyconst flex_int32_t yy_meta[58] = { 0, + 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, + 1, 1, 1, 2, 1, 3, 3, 3, 3, 3, + 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, + 1, 1, 3, 2, 1, 1, 1 +}; + +static yyconst flex_int16_t yy_base[248] = { 0, + 0, 0, 289, 290, 290, 290, 266, 53, 284, 290, + 278, 290, 290, 290, 290, 290, 42, 290, 269, 44, + 46, 290, 290, 44, 46, 48, 290, 45, 241, 47, + 243, 43, 242, 0, 44, 46, 51, 48, 238, 51, + 250, 63, 76, 253, 290, 290, 290, 35, 222, 290, + 76, 290, 102, 274, 290, 290, 83, 273, 0, 290, + 290, 290, 290, 290, 290, 290, 0, 235, 66, 244, + 75, 75, 0, 242, 228, 86, 228, 0, 0, 225, + 241, 229, 240, 0, 227, 237, 0, 0, 0, 224, + 221, 0, 225, 227, 230, 216, 0, 215, 220, 226, + + 208, 220, 67, 115, 290, 290, 79, 116, 120, 250, + 290, 0, 209, 212, 207, 223, 211, 202, 220, 204, + 200, 213, 212, 0, 207, 210, 0, 213, 212, 0, + 199, 0, 208, 189, 204, 192, 195, 197, 198, 199, + 189, 201, 181, 77, 119, 78, 180, 195, 189, 186, + 0, 176, 183, 179, 173, 189, 0, 171, 189, 177, + 0, 187, 182, 177, 171, 0, 172, 169, 177, 165, + 0, 162, 0, 0, 0, 172, 0, 169, 154, 162, + 0, 155, 151, 170, 0, 165, 146, 131, 128, 0, + 139, 123, 127, 135, 131, 124, 117, 130, 0, 0, + + 126, 124, 111, 126, 0, 0, 0, 112, 110, 123, + 121, 105, 110, 0, 120, 104, 0, 101, 0, 102, + 0, 100, 98, 0, 112, 127, 0, 0, 96, 0, + 113, 0, 99, 109, 103, 93, 89, 0, 290, 176, + 179, 181, 184, 187, 190, 127, 193 +}; + +static yyconst flex_int16_t yy_def[248] = { 0, + 239, 1, 239, 239, 239, 239, 239, 240, 241, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 239, 239, 239, 243, 239, 239, + 240, 239, 244, 241, 239, 239, 239, 245, 246, 239, + 239, 239, 239, 239, 239, 239, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + + 242, 242, 243, 247, 239, 239, 240, 240, 244, 245, + 239, 246, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 243, 247, 243, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 242, 242, + 242, 242, 242, 242, 242, 242, 242, 242, 0, 239, + 239, 239, 239, 239, 239, 239, 239 +}; + +static yyconst flex_int16_t yy_nxt[348] = { 0, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 4, 27, 28, 29, 30, 31, 32, + 33, 34, 34, 35, 34, 34, 36, 37, 38, 39, + 40, 34, 41, 42, 43, 34, 44, 34, 45, 4, + 46, 47, 34, 34, 48, 49, 4, 52, 57, 57, + 57, 57, 57, 57, 60, 61, 62, 63, 64, 65, + 66, 68, 71, 74, 78, 80, 82, 84, 89, 75, + 52, 76, 79, 52, 104, 81, 72, 85, 86, 69, + 83, 105, 92, 90, 87, 114, 93, 59, 94, 57, + + 57, 98, 53, 95, 51, 99, 108, 96, 100, 97, + 115, 117, 120, 121, 124, 101, 104, 103, 118, 119, + 52, 103, 51, 105, 108, 53, 104, 104, 53, 112, + 125, 238, 237, 105, 105, 236, 235, 234, 233, 232, + 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, + 221, 109, 220, 219, 218, 217, 216, 215, 214, 213, + 212, 211, 210, 209, 145, 53, 208, 207, 145, 109, + 206, 146, 205, 204, 203, 146, 51, 51, 51, 54, + 54, 54, 67, 67, 103, 103, 103, 107, 107, 107, + 110, 110, 110, 144, 144, 144, 202, 201, 200, 199, + + 198, 197, 196, 195, 194, 193, 192, 191, 190, 189, + 188, 187, 186, 185, 184, 183, 182, 181, 180, 179, + 178, 177, 176, 175, 174, 173, 172, 171, 170, 169, + 168, 167, 166, 165, 164, 163, 162, 161, 160, 159, + 158, 157, 156, 155, 154, 153, 152, 151, 150, 149, + 148, 147, 111, 143, 142, 141, 140, 139, 138, 137, + 136, 135, 134, 133, 132, 131, 130, 129, 128, 127, + 126, 123, 122, 116, 113, 111, 55, 106, 102, 91, + 88, 77, 73, 70, 58, 56, 55, 50, 239, 3, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239 +}; + +static yyconst flex_int16_t yy_chk[348] = { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 8, 17, 17, + 20, 20, 21, 21, 24, 24, 24, 25, 25, 26, + 26, 28, 30, 32, 35, 36, 37, 38, 40, 32, + 51, 32, 35, 107, 48, 36, 30, 38, 38, 28, + 37, 48, 42, 40, 38, 69, 42, 20, 42, 57, + + 57, 43, 8, 42, 53, 43, 53, 42, 43, 42, + 69, 71, 72, 72, 76, 43, 103, 104, 71, 71, + 108, 145, 109, 103, 109, 51, 144, 146, 107, 246, + 76, 237, 236, 144, 146, 235, 234, 233, 231, 229, + 226, 225, 223, 222, 220, 218, 216, 215, 213, 212, + 211, 53, 210, 209, 208, 204, 203, 202, 201, 198, + 197, 196, 195, 194, 104, 108, 193, 192, 145, 109, + 191, 104, 189, 188, 187, 145, 240, 240, 240, 241, + 241, 241, 242, 242, 243, 243, 243, 244, 244, 244, + 245, 245, 245, 247, 247, 247, 186, 184, 183, 182, + + 180, 179, 178, 176, 172, 170, 169, 168, 167, 165, + 164, 163, 162, 160, 159, 158, 156, 155, 154, 153, + 152, 150, 149, 148, 147, 143, 142, 141, 140, 139, + 138, 137, 136, 135, 134, 133, 131, 129, 128, 126, + 125, 123, 122, 121, 120, 119, 118, 117, 116, 115, + 114, 113, 110, 102, 101, 100, 99, 98, 96, 95, + 94, 93, 91, 90, 86, 85, 83, 82, 81, 80, + 77, 75, 74, 70, 68, 58, 54, 49, 44, 41, + 39, 33, 31, 29, 19, 11, 9, 7, 3, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239, 239, 239, 239, + 239, 239, 239, 239, 239, 239, 239 +}; /* Table of booleans, true if rule could match eol. */ -static yyconst flex_int32_t yy_rule_can_match_eol[87] = - { 0, -0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, - 0, 0, 0, 0, 1, 0, 0, }; +static yyconst flex_int32_t yy_rule_can_match_eol[87] = { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 1, 0, 0, +}; static yy_state_type yy_last_accepting_state; static char *yy_last_accepting_cpos; extern int magic_frontend__flex_debug; -int magic_frontend__flex_debug = 0; +int magic_frontend__flex_debug = 0; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. @@ -676,71 +669,71 @@ char *magic_frontend_text; #define YY_EXTRA_TYPE void * #endif -static int yy_init_globals (void ); +static int yy_init_globals (void); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ -int magic_frontend_lex_destroy (void ); +int magic_frontend_lex_destroy (void); -int magic_frontend_get_debug (void ); +int magic_frontend_get_debug (void); -void magic_frontend_set_debug (int debug_flag ); +void magic_frontend_set_debug (int debug_flag); -YY_EXTRA_TYPE magic_frontend_get_extra (void ); +YY_EXTRA_TYPE magic_frontend_get_extra (void); -void magic_frontend_set_extra (YY_EXTRA_TYPE user_defined ); +void magic_frontend_set_extra (YY_EXTRA_TYPE user_defined); -FILE *magic_frontend_get_in (void ); +FILE *magic_frontend_get_in (void); -void magic_frontend_set_in (FILE * in_str ); +void magic_frontend_set_in (FILE * in_str); -FILE *magic_frontend_get_out (void ); +FILE *magic_frontend_get_out (void); -void magic_frontend_set_out (FILE * out_str ); +void magic_frontend_set_out (FILE * out_str); -int magic_frontend_get_leng (void ); +int magic_frontend_get_leng (void); -char *magic_frontend_get_text (void ); +char *magic_frontend_get_text (void); -int magic_frontend_get_lineno (void ); +int magic_frontend_get_lineno (void); -void magic_frontend_set_lineno (int line_number ); +void magic_frontend_set_lineno (int line_number); -YYSTYPE * magic_frontend_get_lval (void ); +YYSTYPE *magic_frontend_get_lval (void); -void magic_frontend_set_lval (YYSTYPE * yylval_param ); +void magic_frontend_set_lval (YYSTYPE * yylval_param); + +YYLTYPE *magic_frontend_get_lloc (void); + +void magic_frontend_set_lloc (YYLTYPE * yylloc_param); - YYLTYPE *magic_frontend_get_lloc (void ); - - void magic_frontend_set_lloc (YYLTYPE * yylloc_param ); - /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus -extern "C" int magic_frontend_wrap (void ); +extern "C" int magic_frontend_wrap (void); #else -extern int magic_frontend_wrap (void ); +extern int magic_frontend_wrap (void); #endif #endif #ifndef yytext_ptr -static void yy_flex_strncpy (char *,yyconst char *,int ); +static void yy_flex_strncpy (char *, yyconst char *, int); #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * ); +static int yy_flex_strlen (yyconst char *); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus -static int yyinput (void ); +static int yyinput (void); #else -static int input (void ); +static int input (void); #endif #endif @@ -825,8 +818,8 @@ static int input (void ); #ifndef YY_DECL #define YY_DECL_IS_OURS 1 -extern int magic_frontend_lex \ - (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ); +extern int magic_frontend_lex + (YYSTYPE * yylval_param, YYLTYPE * yylloc_param); #define YY_DECL int magic_frontend_lex \ (YYSTYPE * yylval_param, YYLTYPE * yylloc_param ) @@ -851,16 +844,15 @@ extern int magic_frontend_lex \ */ YY_DECL { - register yy_state_type yy_current_state; - register char *yy_cp, *yy_bp; - register int yy_act; - - YYSTYPE * yylval; - - YYLTYPE * yylloc; - -#line 22 "magic-interpreter.l" + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + + YYSTYPE *yylval; + YYLTYPE *yylloc; + +#line 22 "magic-interpreter.l" #line 866 "magic-interpreter-lexer.c" @@ -868,691 +860,751 @@ YY_DECL yylloc = yylloc_param; - if ( !(yy_init) ) - { - (yy_init) = 1; + if (!(yy_init)) + { + (yy_init) = 1; #ifdef YY_USER_INIT - YY_USER_INIT; + YY_USER_INIT; #endif - if ( ! (yy_start) ) - (yy_start) = 1; /* first start state */ - - if ( ! magic_frontend_in ) - magic_frontend_in = stdin; - - if ( ! magic_frontend_out ) - magic_frontend_out = stdout; - - if ( ! YY_CURRENT_BUFFER ) { - magic_frontend_ensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - magic_frontend__create_buffer(magic_frontend_in,YY_BUF_SIZE ); - } - - magic_frontend__load_buffer_state( ); - } - - while ( 1 ) /* loops until end-of-file is reached */ - { - yy_cp = (yy_c_buf_p); - - /* Support of magic_frontend_text. */ - *yy_cp = (yy_hold_char); - - /* yy_bp points to the position in yy_ch_buf of the start of - * the current run. - */ - yy_bp = yy_cp; - - yy_current_state = (yy_start); -yy_match: - do - { - register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 240 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - ++yy_cp; - } - while ( yy_base[yy_current_state] != 290 ); - -yy_find_action: - yy_act = yy_accept[yy_current_state]; - if ( yy_act == 0 ) - { /* have to back up */ - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - yy_act = yy_accept[yy_current_state]; - } - - YY_DO_BEFORE_ACTION; - - if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) - { - int yyl; - for ( yyl = 0; yyl < magic_frontend_leng; ++yyl ) - if ( magic_frontend_text[yyl] == '\n' ) - - magic_frontend_lineno++; -; - } - -do_action: /* This label is used only to access EOF actions. */ - - switch ( yy_act ) - { /* beginning of action switch */ - case 0: /* must back up */ - /* undo the effects of YY_DO_BEFORE_ACTION */ - *yy_cp = (yy_hold_char); - yy_cp = (yy_last_accepting_cpos); - yy_current_state = (yy_last_accepting_state); - goto yy_find_action; - -case 1: -YY_RULE_SETUP + if (!(yy_start)) + (yy_start) = 1; /* first start state */ + + if (!magic_frontend_in) + magic_frontend_in = stdin; + + if (!magic_frontend_out) + magic_frontend_out = stdout; + + if (!YY_CURRENT_BUFFER) + { + magic_frontend_ensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + magic_frontend__create_buffer (magic_frontend_in, + YY_BUF_SIZE); + } + + magic_frontend__load_buffer_state (); + } + + while (1) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of magic_frontend_text. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); + yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI (*yy_cp)]; + if (yy_accept[yy_current_state]) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while (yy_chk[yy_base[yy_current_state] + yy_c] != + yy_current_state) + { + yy_current_state = (int) yy_def[yy_current_state]; + if (yy_current_state >= 240) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = + yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while (yy_base[yy_current_state] != 290); + + yy_find_action: + yy_act = yy_accept[yy_current_state]; + if (yy_act == 0) + { /* have to back up */ + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if (yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act]) + { + int yyl; + for (yyl = 0; yyl < magic_frontend_leng; ++yyl) + if (magic_frontend_text[yyl] == '\n') + + magic_frontend_lineno++; + ; + } + + do_action: /* This label is used only to access EOF actions. */ + + switch (yy_act) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + + case 1: + YY_RULE_SETUP #line 24 "magic-interpreter.l" -HEADING(0); - YY_BREAK -case 2: -YY_RULE_SETUP + HEADING (0); + YY_BREAK case 2:YY_RULE_SETUP #line 25 "magic-interpreter.l" -HEADING(1); - YY_BREAK -case 3: -YY_RULE_SETUP + HEADING (1); + YY_BREAK case 3:YY_RULE_SETUP #line 26 "magic-interpreter.l" -HEADING(2); - YY_BREAK -case 4: -YY_RULE_SETUP + HEADING (2); + YY_BREAK case 4:YY_RULE_SETUP #line 27 "magic-interpreter.l" -HEADING(3); - YY_BREAK -case 5: -YY_RULE_SETUP + HEADING (3); + YY_BREAK case 5:YY_RULE_SETUP #line 28 "magic-interpreter.l" -HEADING(4); - YY_BREAK -case 6: -YY_RULE_SETUP + HEADING (4); + YY_BREAK case 6:YY_RULE_SETUP #line 29 "magic-interpreter.l" -HEADING(5); - YY_BREAK -case 7: -YY_RULE_SETUP + HEADING (5); + YY_BREAK case 7:YY_RULE_SETUP #line 30 "magic-interpreter.l" -HEADING(6); - YY_BREAK -case 8: -YY_RULE_SETUP + HEADING (6); + YY_BREAK case 8:YY_RULE_SETUP #line 31 "magic-interpreter.l" -HEADING(7); - YY_BREAK -case 9: -YY_RULE_SETUP + HEADING (7); + YY_BREAK case 9:YY_RULE_SETUP #line 32 "magic-interpreter.l" -{FIXLOC; return '=';} - YY_BREAK -case 10: -YY_RULE_SETUP + { + FIXLOC; + return '='; + } + YY_BREAK case 10:YY_RULE_SETUP #line 33 "magic-interpreter.l" -{FIXLOC; return EQ;} - YY_BREAK -case 11: -YY_RULE_SETUP + { + FIXLOC; + return EQ; + } + YY_BREAK case 11:YY_RULE_SETUP #line 34 "magic-interpreter.l" -{FIXLOC; return NEQ;} - YY_BREAK -case 12: -YY_RULE_SETUP + { + FIXLOC; + return NEQ; + } + YY_BREAK case 12:YY_RULE_SETUP #line 35 "magic-interpreter.l" -{FIXLOC; return NEQ;} - YY_BREAK -case 13: -YY_RULE_SETUP + { + FIXLOC; + return NEQ; + } + YY_BREAK case 13:YY_RULE_SETUP #line 36 "magic-interpreter.l" -{FIXLOC; return '>';} - YY_BREAK -case 14: -YY_RULE_SETUP + { + FIXLOC; + return '>'; + } + YY_BREAK case 14:YY_RULE_SETUP #line 37 "magic-interpreter.l" -{FIXLOC; return '<';} - YY_BREAK -case 15: -YY_RULE_SETUP + { + FIXLOC; + return '<'; + } + YY_BREAK case 15:YY_RULE_SETUP #line 38 "magic-interpreter.l" -{FIXLOC; return GTE;} - YY_BREAK -case 16: -YY_RULE_SETUP + { + FIXLOC; + return GTE; + } + YY_BREAK case 16:YY_RULE_SETUP #line 39 "magic-interpreter.l" -{FIXLOC; return LTE;} - YY_BREAK -case 17: -YY_RULE_SETUP + { + FIXLOC; + return LTE; + } + YY_BREAK case 17:YY_RULE_SETUP #line 40 "magic-interpreter.l" -{FIXLOC; return '(';} - YY_BREAK -case 18: -YY_RULE_SETUP + { + FIXLOC; + return '('; + } + YY_BREAK case 18:YY_RULE_SETUP #line 41 "magic-interpreter.l" -{FIXLOC; return ')';} - YY_BREAK -case 19: -YY_RULE_SETUP + { + FIXLOC; + return ')'; + } + YY_BREAK case 19:YY_RULE_SETUP #line 42 "magic-interpreter.l" -{FIXLOC; return '+';} - YY_BREAK -case 20: -YY_RULE_SETUP + { + FIXLOC; + return '+'; + } + YY_BREAK case 20:YY_RULE_SETUP #line 43 "magic-interpreter.l" -{FIXLOC; return '-';} - YY_BREAK -case 21: -YY_RULE_SETUP + { + FIXLOC; + return '-'; + } + YY_BREAK case 21:YY_RULE_SETUP #line 44 "magic-interpreter.l" -{FIXLOC; return '*';} - YY_BREAK -case 22: -YY_RULE_SETUP + { + FIXLOC; + return '*'; + } + YY_BREAK case 22:YY_RULE_SETUP #line 45 "magic-interpreter.l" -{FIXLOC; return '/';} - YY_BREAK -case 23: -YY_RULE_SETUP + { + FIXLOC; + return '/'; + } + YY_BREAK case 23:YY_RULE_SETUP #line 46 "magic-interpreter.l" -{FIXLOC; return '%';} - YY_BREAK -case 24: -YY_RULE_SETUP + { + FIXLOC; + return '%'; + } + YY_BREAK case 24:YY_RULE_SETUP #line 47 "magic-interpreter.l" -{FIXLOC; return ANDAND;} - YY_BREAK -case 25: -YY_RULE_SETUP + { + FIXLOC; + return ANDAND; + } + YY_BREAK case 25:YY_RULE_SETUP #line 48 "magic-interpreter.l" -{FIXLOC; return OROR;} - YY_BREAK -case 26: -YY_RULE_SETUP + { + FIXLOC; + return OROR; + } + YY_BREAK case 26:YY_RULE_SETUP #line 49 "magic-interpreter.l" -{FIXLOC; return ';';} - YY_BREAK -case 27: -YY_RULE_SETUP + { + FIXLOC; + return ';'; + } + YY_BREAK case 27:YY_RULE_SETUP #line 50 "magic-interpreter.l" -{FIXLOC; return ':';} - YY_BREAK -case 28: -YY_RULE_SETUP + { + FIXLOC; + return ':'; + } + YY_BREAK case 28:YY_RULE_SETUP #line 51 "magic-interpreter.l" -{FIXLOC; return ',';} - YY_BREAK -case 29: -YY_RULE_SETUP + { + FIXLOC; + return ','; + } + YY_BREAK case 29:YY_RULE_SETUP #line 52 "magic-interpreter.l" -{FIXLOC; return '@';} - YY_BREAK -case 30: -YY_RULE_SETUP + { + FIXLOC; + return '@'; + } + YY_BREAK case 30:YY_RULE_SETUP #line 53 "magic-interpreter.l" -{FIXLOC; return '|';} - YY_BREAK -case 31: -YY_RULE_SETUP + { + FIXLOC; + return '|'; + } + YY_BREAK case 31:YY_RULE_SETUP #line 54 "magic-interpreter.l" -{FIXLOC; return '[';} - YY_BREAK -case 32: -YY_RULE_SETUP + { + FIXLOC; + return '['; + } + YY_BREAK case 32:YY_RULE_SETUP #line 55 "magic-interpreter.l" -{FIXLOC; return ']';} - YY_BREAK -case 33: -YY_RULE_SETUP + { + FIXLOC; + return ']'; + } + YY_BREAK case 33:YY_RULE_SETUP #line 56 "magic-interpreter.l" -{FIXLOC; return '&';} - YY_BREAK -case 34: -YY_RULE_SETUP + { + FIXLOC; + return '&'; + } + YY_BREAK case 34:YY_RULE_SETUP #line 57 "magic-interpreter.l" -{FIXLOC; return '^';} - YY_BREAK -case 35: -YY_RULE_SETUP + { + FIXLOC; + return '^'; + } + YY_BREAK case 35:YY_RULE_SETUP #line 58 "magic-interpreter.l" -{FIXLOC; return '.';} - YY_BREAK -case 36: -YY_RULE_SETUP + { + FIXLOC; + return '.'; + } + YY_BREAK case 36:YY_RULE_SETUP #line 59 "magic-interpreter.l" -{FIXLOC; return SHL;} - YY_BREAK -case 37: -YY_RULE_SETUP + { + FIXLOC; + return SHL; + } + YY_BREAK case 37:YY_RULE_SETUP #line 60 "magic-interpreter.l" -{FIXLOC; return SHR;} - YY_BREAK -case 38: -YY_RULE_SETUP + { + FIXLOC; + return SHR; + } + YY_BREAK case 38:YY_RULE_SETUP #line 61 "magic-interpreter.l" -{FIXLOC; return PROCEDURE;} - YY_BREAK -case 39: -YY_RULE_SETUP + { + FIXLOC; + return PROCEDURE; + } + YY_BREAK case 39:YY_RULE_SETUP #line 62 "magic-interpreter.l" -{FIXLOC; return CALL;} - YY_BREAK -case 40: -YY_RULE_SETUP + { + FIXLOC; + return CALL; + } + YY_BREAK case 40:YY_RULE_SETUP #line 63 "magic-interpreter.l" -{FIXLOC; return OR;} - YY_BREAK -case 41: -YY_RULE_SETUP + { + FIXLOC; + return OR; + } + YY_BREAK case 41:YY_RULE_SETUP #line 64 "magic-interpreter.l" -{FIXLOC; return TO;} - YY_BREAK -case 42: -YY_RULE_SETUP + { + FIXLOC; + return TO; + } + YY_BREAK case 42:YY_RULE_SETUP #line 65 "magic-interpreter.l" -{FIXLOC; return TOWARDS;} - YY_BREAK -case 43: -YY_RULE_SETUP + { + FIXLOC; + return TOWARDS; + } + YY_BREAK case 43:YY_RULE_SETUP #line 66 "magic-interpreter.l" -{FIXLOC; return TELEPORT_ANCHOR;} - YY_BREAK -case 44: -YY_RULE_SETUP + { + FIXLOC; + return TELEPORT_ANCHOR; + } + YY_BREAK case 44:YY_RULE_SETUP #line 67 "magic-interpreter.l" -{FIXLOC; return SILENT;} - YY_BREAK -case 45: -YY_RULE_SETUP + { + FIXLOC; + return SILENT; + } + YY_BREAK case 45:YY_RULE_SETUP #line 68 "magic-interpreter.l" -{FIXLOC; return LOCAL;} - YY_BREAK -case 46: -YY_RULE_SETUP + { + FIXLOC; + return LOCAL; + } + YY_BREAK case 46:YY_RULE_SETUP #line 69 "magic-interpreter.l" -{FIXLOC; return NONMAGIC;} - YY_BREAK -case 47: -YY_RULE_SETUP + { + FIXLOC; + return NONMAGIC; + } + YY_BREAK case 47:YY_RULE_SETUP #line 70 "magic-interpreter.l" -{FIXLOC; return SPELL;} - YY_BREAK -case 48: -YY_RULE_SETUP + { + FIXLOC; + return SPELL; + } + YY_BREAK case 48:YY_RULE_SETUP #line 71 "magic-interpreter.l" -{FIXLOC; return LET;} - YY_BREAK -case 49: -YY_RULE_SETUP + { + FIXLOC; + return LET; + } + YY_BREAK case 49:YY_RULE_SETUP #line 72 "magic-interpreter.l" -{FIXLOC; return IN;} - YY_BREAK -case 50: -YY_RULE_SETUP + { + FIXLOC; + return IN; + } + YY_BREAK case 50:YY_RULE_SETUP #line 73 "magic-interpreter.l" -{FIXLOC; return END;} - YY_BREAK -case 51: -YY_RULE_SETUP + { + FIXLOC; + return END; + } + YY_BREAK case 51:YY_RULE_SETUP #line 74 "magic-interpreter.l" -{FIXLOC; return DARROW;} - YY_BREAK -case 52: -YY_RULE_SETUP + { + FIXLOC; + return DARROW; + } + YY_BREAK case 52:YY_RULE_SETUP #line 75 "magic-interpreter.l" -{FIXLOC; return STRING_TY;} - YY_BREAK -case 53: -YY_RULE_SETUP + { + FIXLOC; + return STRING_TY; + } + YY_BREAK case 53:YY_RULE_SETUP #line 76 "magic-interpreter.l" -{FIXLOC; return REQUIRE;} - YY_BREAK -case 54: -YY_RULE_SETUP + { + FIXLOC; + return REQUIRE; + } + YY_BREAK case 54:YY_RULE_SETUP #line 77 "magic-interpreter.l" -{FIXLOC; return CATALYSTS;} - YY_BREAK -case 55: -YY_RULE_SETUP + { + FIXLOC; + return CATALYSTS; + } + YY_BREAK case 55:YY_RULE_SETUP #line 78 "magic-interpreter.l" -{FIXLOC; return COMPONENTS;} - YY_BREAK -case 56: -YY_RULE_SETUP + { + FIXLOC; + return COMPONENTS; + } + YY_BREAK case 56:YY_RULE_SETUP #line 79 "magic-interpreter.l" -{FIXLOC; return MANA;} - YY_BREAK -case 57: -YY_RULE_SETUP + { + FIXLOC; + return MANA; + } + YY_BREAK case 57:YY_RULE_SETUP #line 80 "magic-interpreter.l" -{FIXLOC; return CASTTIME;} - YY_BREAK -case 58: -YY_RULE_SETUP + { + FIXLOC; + return CASTTIME; + } + YY_BREAK case 58:YY_RULE_SETUP #line 81 "magic-interpreter.l" -{FIXLOC; return SKIP;} - YY_BREAK -case 59: -YY_RULE_SETUP + { + FIXLOC; + return SKIP; + } + YY_BREAK case 59:YY_RULE_SETUP #line 82 "magic-interpreter.l" -{FIXLOC; return ABORT;} - YY_BREAK -case 60: -YY_RULE_SETUP + { + FIXLOC; + return ABORT; + } + YY_BREAK case 60:YY_RULE_SETUP #line 83 "magic-interpreter.l" -{FIXLOC; return BREAK;} - YY_BREAK -case 61: -YY_RULE_SETUP + { + FIXLOC; + return BREAK; + } + YY_BREAK case 61:YY_RULE_SETUP #line 84 "magic-interpreter.l" -{FIXLOC; return EFFECT;} - YY_BREAK -case 62: -YY_RULE_SETUP + { + FIXLOC; + return EFFECT; + } + YY_BREAK case 62:YY_RULE_SETUP #line 85 "magic-interpreter.l" -{FIXLOC; return ATEND;} - YY_BREAK -case 63: -YY_RULE_SETUP + { + FIXLOC; + return ATEND; + } + YY_BREAK case 63:YY_RULE_SETUP #line 86 "magic-interpreter.l" -{FIXLOC; return ATTRIGGER;} - YY_BREAK -case 64: -YY_RULE_SETUP + { + FIXLOC; + return ATTRIGGER; + } + YY_BREAK case 64:YY_RULE_SETUP #line 87 "magic-interpreter.l" -{FIXLOC; return CONST;} - YY_BREAK -case 65: -YY_RULE_SETUP + { + FIXLOC; + return CONST; + } + YY_BREAK case 65:YY_RULE_SETUP #line 88 "magic-interpreter.l" -{FIXLOC; return PC_F;} - YY_BREAK -case 66: -YY_RULE_SETUP + { + FIXLOC; + return PC_F; + } + YY_BREAK case 66:YY_RULE_SETUP #line 89 "magic-interpreter.l" -{FIXLOC; return NPC_F;} - YY_BREAK -case 67: -YY_RULE_SETUP + { + FIXLOC; + return NPC_F; + } + YY_BREAK case 67:YY_RULE_SETUP #line 90 "magic-interpreter.l" -{FIXLOC; return MOB_F;} - YY_BREAK -case 68: -YY_RULE_SETUP + { + FIXLOC; + return MOB_F; + } + YY_BREAK case 68:YY_RULE_SETUP #line 91 "magic-interpreter.l" -{FIXLOC; return ENTITY_F;} - YY_BREAK -case 69: -YY_RULE_SETUP + { + FIXLOC; + return ENTITY_F; + } + YY_BREAK case 69:YY_RULE_SETUP #line 92 "magic-interpreter.l" -{FIXLOC; return TARGET_F;} - YY_BREAK -case 70: -YY_RULE_SETUP + { + FIXLOC; + return TARGET_F; + } + YY_BREAK case 70:YY_RULE_SETUP #line 93 "magic-interpreter.l" -{FIXLOC; return IF;} - YY_BREAK -case 71: -YY_RULE_SETUP + { + FIXLOC; + return IF; + } + YY_BREAK case 71:YY_RULE_SETUP #line 94 "magic-interpreter.l" -{FIXLOC; return THEN;} - YY_BREAK -case 72: -YY_RULE_SETUP + { + FIXLOC; + return THEN; + } + YY_BREAK case 72:YY_RULE_SETUP #line 95 "magic-interpreter.l" -{FIXLOC; return ELSE;} - YY_BREAK -case 73: -YY_RULE_SETUP + { + FIXLOC; + return ELSE; + } + YY_BREAK case 73:YY_RULE_SETUP #line 96 "magic-interpreter.l" -{FIXLOC; return FOREACH;} - YY_BREAK -case 74: -YY_RULE_SETUP + { + FIXLOC; + return FOREACH; + } + YY_BREAK case 74:YY_RULE_SETUP #line 97 "magic-interpreter.l" -{FIXLOC; return FOR;} - YY_BREAK -case 75: -YY_RULE_SETUP + { + FIXLOC; + return FOR; + } + YY_BREAK case 75:YY_RULE_SETUP #line 98 "magic-interpreter.l" -{FIXLOC; return DO;} - YY_BREAK -case 76: -YY_RULE_SETUP + { + FIXLOC; + return DO; + } + YY_BREAK case 76:YY_RULE_SETUP #line 99 "magic-interpreter.l" -{FIXLOC; return SLEEP;} - YY_BREAK -case 77: + { + FIXLOC; + return SLEEP; + } + YY_BREAK case 77: /* rule 77 can match eol */ -YY_RULE_SETUP + YY_RULE_SETUP #line 101 "magic-interpreter.l" -{ char *string = strdup(magic_frontend_text); - magic_frontend_lval.s = string; - FIXLOC; - return SCRIPT_DATA; - } - YY_BREAK -case 78: + { + char *string = strdup (magic_frontend_text); + magic_frontend_lval.s = string; + FIXLOC; + return SCRIPT_DATA; + } + YY_BREAK case 78: /* rule 78 can match eol */ -YY_RULE_SETUP + YY_RULE_SETUP #line 107 "magic-interpreter.l" -{ char *string = strdup(magic_frontend_text + 1); - char *src = string; - char *dst = string; - while (*src && *src != '"') - if (*src == '\\') { - *dst++ = src[1]; - src += 2; - } else - *dst++ = *src++; - *dst = '\0'; /* terminate */ - magic_frontend_lval.s = string; - FIXLOC; - return STRING; - } - YY_BREAK -case 79: -YY_RULE_SETUP + { + char *string = strdup (magic_frontend_text + 1); + char *src = string; + char *dst = string; + while (*src && *src != '"') + if (*src == '\\') + { + *dst++ = src[1]; + src += 2; + } + else + *dst++ = *src++; + *dst = '\0'; /* terminate */ + magic_frontend_lval.s = string; + FIXLOC; + return STRING; + } + YY_BREAK case 79:YY_RULE_SETUP #line 122 "magic-interpreter.l" -{ magic_frontend_lval.i = atoi(magic_frontend_text); - FIXLOC; - return INT; } - YY_BREAK -case 80: -YY_RULE_SETUP + { + magic_frontend_lval.i = atoi (magic_frontend_text); + FIXLOC; + return INT; + } + YY_BREAK case 80:YY_RULE_SETUP #line 126 "magic-interpreter.l" -{ magic_frontend_lval.i = strtol(magic_frontend_text + 2, NULL, 16); - FIXLOC; - return INT; } - YY_BREAK -case 81: -YY_RULE_SETUP + { + magic_frontend_lval.i = + strtol (magic_frontend_text + 2, NULL, 16); + FIXLOC; + return INT; + } + YY_BREAK case 81:YY_RULE_SETUP #line 130 "magic-interpreter.l" -{ magic_frontend_lval.s = strdup(magic_frontend_text); - FIXLOC; - return ID; } - YY_BREAK -case 82: -*yy_cp = (yy_hold_char); /* undo effects of setting up magic_frontend_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up magic_frontend_text again */ -YY_RULE_SETUP + { + magic_frontend_lval.s = strdup (magic_frontend_text); + FIXLOC; + return ID; + } + YY_BREAK case 82:*yy_cp = (yy_hold_char); /* undo effects of setting up magic_frontend_text */ + (yy_c_buf_p) = yy_cp -= 1; + YY_DO_BEFORE_ACTION; /* set up magic_frontend_text again */ + YY_RULE_SETUP #line 134 "magic-interpreter.l" /* Ignore comments */ - YY_BREAK -case 83: -*yy_cp = (yy_hold_char); /* undo effects of setting up magic_frontend_text */ -(yy_c_buf_p) = yy_cp -= 1; -YY_DO_BEFORE_ACTION; /* set up magic_frontend_text again */ -YY_RULE_SETUP + YY_BREAK case 83: + *yy_cp = (yy_hold_char); /* undo effects of setting up magic_frontend_text */ + (yy_c_buf_p) = yy_cp -= 1; + YY_DO_BEFORE_ACTION; /* set up magic_frontend_text again */ + YY_RULE_SETUP #line 135 "magic-interpreter.l" /* Ignore comments */ - YY_BREAK -case 84: + YY_BREAK case 84: /* rule 84 can match eol */ -YY_RULE_SETUP + YY_RULE_SETUP #line 136 "magic-interpreter.l" -/* ignore whitespace */ - YY_BREAK -case 85: -YY_RULE_SETUP +/* ignore whitespace */ + YY_BREAK case 85: + YY_RULE_SETUP #line 137 "magic-interpreter.l" -fprintf(stderr, "%s: Unexpected character in line %d\n", MAGIC_CONFIG_FILE, magic_frontend_lineno); - YY_BREAK -case 86: -YY_RULE_SETUP + fprintf (stderr, "%s: Unexpected character in line %d\n", + MAGIC_CONFIG_FILE, magic_frontend_lineno); + YY_BREAK case 86:YY_RULE_SETUP #line 140 "magic-interpreter.l" -ECHO; - YY_BREAK + ECHO; + YY_BREAK #line 1425 "magic-interpreter-lexer.c" -case YY_STATE_EOF(INITIAL): - yyterminate(); - - case YY_END_OF_BUFFER: - { - /* Amount of text matched not including the EOB char. */ - int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; - - /* Undo the effects of YY_DO_BEFORE_ACTION. */ - *yy_cp = (yy_hold_char); - YY_RESTORE_YY_MORE_OFFSET - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) - { - /* We're scanning a new file or input source. It's - * possible that this happened because the user - * just pointed magic_frontend_in at a new source and called - * magic_frontend_lex(). If so, then we have to assure - * consistency between YY_CURRENT_BUFFER and our - * globals. Here is the right place to do so, because - * this is the first action (other than possibly a - * back-up) that will match for the new input source. - */ - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - YY_CURRENT_BUFFER_LVALUE->yy_input_file = magic_frontend_in; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; - } - - /* Note that here we test for yy_c_buf_p "<=" to the position - * of the first EOB in the buffer, since yy_c_buf_p will - * already have been incremented past the NUL character - * (since all states make transitions on EOB to the - * end-of-buffer state). Contrast this with the test - * in input(). - */ - if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - { /* This was really a NUL. */ - yy_state_type yy_next_state; - - (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - /* Okay, we're now positioned to make the NUL - * transition. We couldn't have - * yy_get_previous_state() go ahead and do it - * for us because it doesn't know how to deal - * with the possibility of jamming (and we don't - * want to build jamming into it because then it - * will run more slowly). - */ - - yy_next_state = yy_try_NUL_trans( yy_current_state ); - - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - - if ( yy_next_state ) - { - /* Consume the NUL. */ - yy_cp = ++(yy_c_buf_p); - yy_current_state = yy_next_state; - goto yy_match; - } - - else - { - yy_cp = (yy_c_buf_p); - goto yy_find_action; - } - } - - else switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_END_OF_FILE: - { - (yy_did_buffer_switch_on_eof) = 0; - - if ( magic_frontend_wrap( ) ) - { - /* Note: because we've taken care in - * yy_get_next_buffer() to have set up - * magic_frontend_text, we can now set up - * yy_c_buf_p so that if some total - * hoser (like flex itself) wants to - * call the scanner after we return the - * YY_NULL, it'll still work - another - * YY_NULL will get returned. - */ - (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; - - yy_act = YY_STATE_EOF(YY_START); - goto do_action; - } - - else - { - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; - } - break; - } - - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = - (yytext_ptr) + yy_amount_of_matched_text; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_match; - - case EOB_ACT_LAST_MATCH: - (yy_c_buf_p) = - &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; - - yy_current_state = yy_get_previous_state( ); - - yy_cp = (yy_c_buf_p); - yy_bp = (yytext_ptr) + YY_MORE_ADJ; - goto yy_find_action; - } - break; - } - - default: - YY_FATAL_ERROR( - "fatal flex scanner internal error--no action found" ); - } /* end of action switch */ - } /* end of scanning one token */ -} /* end of magic_frontend_lex */ + case YY_STATE_EOF (INITIAL): + yyterminate (); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = + (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + if (YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == + YY_BUFFER_NEW) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed magic_frontend_in at a new source and called + * magic_frontend_lex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = + magic_frontend_in; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ((yy_c_buf_p) <= + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state (); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans (yy_current_state); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if (yy_next_state) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else + switch (yy_get_next_buffer ()) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if (magic_frontend_wrap ()) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * magic_frontend_text, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF (YY_START); + goto do_action; + } + + else + { + if (!(yy_did_buffer_switch_on_eof)) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state (); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state (); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR + ("fatal flex scanner internal error--no action found"); + } /* end of action switch */ + } /* end of scanning one token */ +} /* end of magic_frontend_lex */ /* yy_get_next_buffer - try to read in a new buffer * @@ -1563,163 +1615,171 @@ case YY_STATE_EOF(INITIAL): */ static int yy_get_next_buffer (void) { - register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; - register char *source = (yytext_ptr); - register int number_to_move, i; - int ret_val; - - if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) - YY_FATAL_ERROR( - "fatal flex scanner internal error--end of buffer missed" ); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) - { /* Don't try to fill the buffer, so this is an EOF. */ - if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) - { - /* We matched a single character, the EOB, so - * treat this as a final EOF. - */ - return EOB_ACT_END_OF_FILE; - } - - else - { - /* We matched some text prior to the EOB, first - * process it. - */ - return EOB_ACT_LAST_MATCH; - } - } - - /* Try to read more data. */ - - /* First move last chars to start of buffer. */ - number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; - - for ( i = 0; i < number_to_move; ++i ) - *(dest++) = *(source++); - - if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) - /* don't do the read, it's not guaranteed to return an EOF, - * just force an EOF - */ - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; - - else - { - int num_to_read = - YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; - - while ( num_to_read <= 0 ) - { /* Not enough room in the buffer - grow it. */ - - /* just a shorter name for the current buffer */ - YY_BUFFER_STATE b = YY_CURRENT_BUFFER; - - int yy_c_buf_p_offset = - (int) ((yy_c_buf_p) - b->yy_ch_buf); - - if ( b->yy_is_our_buffer ) - { - int new_size = b->yy_buf_size * 2; - - if ( new_size <= 0 ) - b->yy_buf_size += b->yy_buf_size / 8; - else - b->yy_buf_size *= 2; - - b->yy_ch_buf = (char *) - /* Include room in for 2 EOB chars. */ - magic_frontend_realloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); - } - else - /* Can't grow it, we don't own it. */ - b->yy_ch_buf = 0; - - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( - "fatal error - scanner input buffer overflow" ); - - (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; - - num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - - number_to_move - 1; - - } - - if ( num_to_read > YY_READ_BUF_SIZE ) - num_to_read = YY_READ_BUF_SIZE; - - /* Read in more data. */ - YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), - (yy_n_chars), (size_t) num_to_read ); - - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - if ( (yy_n_chars) == 0 ) - { - if ( number_to_move == YY_MORE_ADJ ) - { - ret_val = EOB_ACT_END_OF_FILE; - magic_frontend_restart(magic_frontend_in ); - } - - else - { - ret_val = EOB_ACT_LAST_MATCH; - YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = - YY_BUFFER_EOF_PENDING; - } - } - - else - ret_val = EOB_ACT_CONTINUE_SCAN; - - if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { - /* Extend the array by 50%, plus the number we really need. */ - yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) magic_frontend_realloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); - if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); - } + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ((yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1]) + YY_FATAL_ERROR + ("fatal flex scanner internal error--end of buffer missed"); + + if (YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ((yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for (i = 0; i < number_to_move; ++i) + *(dest++) = *(source++); + + if (YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + int num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while (num_to_read <= 0) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER; + + int yy_c_buf_p_offset = (int) ((yy_c_buf_p) - b->yy_ch_buf); - (yy_n_chars) += number_to_move; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; - YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + if (b->yy_is_our_buffer) + { + int new_size = b->yy_buf_size * 2; + + if (new_size <= 0) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + magic_frontend_realloc ((void *) b->yy_ch_buf, + b->yy_buf_size + 2); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if (!b->yy_ch_buf) + YY_FATAL_ERROR + ("fatal error - scanner input buffer overflow"); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if (num_to_read > YY_READ_BUF_SIZE) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT ((&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), (size_t) num_to_read); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ((yy_n_chars) == 0) + { + if (number_to_move == YY_MORE_ADJ) + { + ret_val = EOB_ACT_END_OF_FILE; + magic_frontend_restart (magic_frontend_in); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yy_size_t) ((yy_n_chars) + number_to_move) > + YY_CURRENT_BUFFER_LVALUE->yy_buf_size) + { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = + (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = + (char *) magic_frontend_realloc ((void *) + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, + new_size); + if (!YY_CURRENT_BUFFER_LVALUE->yy_ch_buf) + YY_FATAL_ERROR ("out of dynamic memory in yy_get_next_buffer()"); + } - (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = + YY_END_OF_BUFFER_CHAR; - return ret_val; + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; } /* yy_get_previous_state - get the state just before the EOB char was reached */ - static yy_state_type yy_get_previous_state (void) +static yy_state_type yy_get_previous_state (void) { - register yy_state_type yy_current_state; - register char *yy_cp; - - yy_current_state = (yy_start); - - for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) - { - register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 240 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - } - - return yy_current_state; + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + + for (yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI (*yy_cp)] : 1); + if (yy_accept[yy_current_state]) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) + { + yy_current_state = (int) yy_def[yy_current_state]; + if (yy_current_state >= 240) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = + yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; } /* yy_try_NUL_trans - try to make a transition on the NUL character @@ -1727,167 +1787,166 @@ static int yy_get_next_buffer (void) * synopsis * next_state = yy_try_NUL_trans( current_state ); */ - static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state) { - register int yy_is_jam; - register char *yy_cp = (yy_c_buf_p); - - register YY_CHAR yy_c = 1; - if ( yy_accept[yy_current_state] ) - { - (yy_last_accepting_state) = yy_current_state; - (yy_last_accepting_cpos) = yy_cp; - } - while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) - { - yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 240 ) - yy_c = yy_meta[(unsigned int) yy_c]; - } - yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; - yy_is_jam = (yy_current_state == 239); - - return yy_is_jam ? 0 : yy_current_state; + register int yy_is_jam; + register char *yy_cp = (yy_c_buf_p); + + register YY_CHAR yy_c = 1; + if (yy_accept[yy_current_state]) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while (yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state) + { + yy_current_state = (int) yy_def[yy_current_state]; + if (yy_current_state >= 240) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = + yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 239); + + return yy_is_jam ? 0 : yy_current_state; } #ifndef YY_NO_INPUT #ifdef __cplusplus - static int yyinput (void) +static int yyinput (void) #else - static int input (void) +static int input (void) #endif - { - int c; - - *(yy_c_buf_p) = (yy_hold_char); - - if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) - { - /* yy_c_buf_p now points to the character we want to return. - * If this occurs *before* the EOB characters, then it's a - * valid NUL; if not, then we've hit the end of the buffer. - */ - if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) - /* This was really a NUL. */ - *(yy_c_buf_p) = '\0'; - - else - { /* need more input */ - int offset = (yy_c_buf_p) - (yytext_ptr); - ++(yy_c_buf_p); - - switch ( yy_get_next_buffer( ) ) - { - case EOB_ACT_LAST_MATCH: - /* This happens because yy_g_n_b() - * sees that we've accumulated a - * token and flags that we need to - * try matching the token before - * proceeding. But for input(), - * there's no matching to consider. - * So convert the EOB_ACT_LAST_MATCH - * to EOB_ACT_END_OF_FILE. - */ - - /* Reset buffer status. */ - magic_frontend_restart(magic_frontend_in ); - - /*FALLTHROUGH*/ - - case EOB_ACT_END_OF_FILE: - { - if ( magic_frontend_wrap( ) ) - return EOF; - - if ( ! (yy_did_buffer_switch_on_eof) ) - YY_NEW_FILE; + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if (*(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ((yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + int offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch (yy_get_next_buffer ()) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + magic_frontend_restart (magic_frontend_in); + + /*FALLTHROUGH*/ case EOB_ACT_END_OF_FILE: + { + if (magic_frontend_wrap ()) + return EOF; + + if (!(yy_did_buffer_switch_on_eof)) + YY_NEW_FILE; #ifdef __cplusplus - return yyinput(); + return yyinput (); #else - return input(); + return input (); #endif - } + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } - case EOB_ACT_CONTINUE_SCAN: - (yy_c_buf_p) = (yytext_ptr) + offset; - break; - } - } - } + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve magic_frontend_text */ + (yy_hold_char) = *++(yy_c_buf_p); - c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ - *(yy_c_buf_p) = '\0'; /* preserve magic_frontend_text */ - (yy_hold_char) = *++(yy_c_buf_p); + if (c == '\n') - if ( c == '\n' ) - - magic_frontend_lineno++; -; + magic_frontend_lineno++; + ; - return c; + return c; } -#endif /* ifndef YY_NO_INPUT */ +#endif /* ifndef YY_NO_INPUT */ /** Immediately switch to a different input stream. * @param input_file A readable stream. * * @note This function does not reset the start condition to @c INITIAL . */ - void magic_frontend_restart (FILE * input_file ) +void magic_frontend_restart (FILE * input_file) { - - if ( ! YY_CURRENT_BUFFER ){ + + if (!YY_CURRENT_BUFFER) + { magic_frontend_ensure_buffer_stack (); - YY_CURRENT_BUFFER_LVALUE = - magic_frontend__create_buffer(magic_frontend_in,YY_BUF_SIZE ); - } + YY_CURRENT_BUFFER_LVALUE = + magic_frontend__create_buffer (magic_frontend_in, YY_BUF_SIZE); + } - magic_frontend__init_buffer(YY_CURRENT_BUFFER,input_file ); - magic_frontend__load_buffer_state( ); + magic_frontend__init_buffer (YY_CURRENT_BUFFER, input_file); + magic_frontend__load_buffer_state (); } /** Switch to a different input buffer. * @param new_buffer The new input buffer. * */ - void magic_frontend__switch_to_buffer (YY_BUFFER_STATE new_buffer ) +void magic_frontend__switch_to_buffer (YY_BUFFER_STATE new_buffer) { - - /* TODO. We should be able to replace this entire function body - * with - * magic_frontend_pop_buffer_state(); - * magic_frontend_push_buffer_state(new_buffer); + + /* TODO. We should be able to replace this entire function body + * with + * magic_frontend_pop_buffer_state(); + * magic_frontend_push_buffer_state(new_buffer); */ - magic_frontend_ensure_buffer_stack (); - if ( YY_CURRENT_BUFFER == new_buffer ) - return; - - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - YY_CURRENT_BUFFER_LVALUE = new_buffer; - magic_frontend__load_buffer_state( ); - - /* We don't actually know whether we did this switch during - * EOF (magic_frontend_wrap()) processing, but the only time this flag - * is looked at is after magic_frontend_wrap() is called, so it's safe - * to go ahead and always set it. - */ - (yy_did_buffer_switch_on_eof) = 1; + magic_frontend_ensure_buffer_stack (); + if (YY_CURRENT_BUFFER == new_buffer) + return; + + if (YY_CURRENT_BUFFER) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + magic_frontend__load_buffer_state (); + + /* We don't actually know whether we did this switch during + * EOF (magic_frontend_wrap()) processing, but the only time this flag + * is looked at is after magic_frontend_wrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; } -static void magic_frontend__load_buffer_state (void) +static void magic_frontend__load_buffer_state (void) { - (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; - (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; - magic_frontend_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file; - (yy_hold_char) = *(yy_c_buf_p); + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + magic_frontend_in = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); } /** Allocate and initialize an input buffer state. @@ -1896,106 +1955,109 @@ static void magic_frontend__load_buffer_state (void) * * @return the allocated buffer state. */ - YY_BUFFER_STATE magic_frontend__create_buffer (FILE * file, int size ) +YY_BUFFER_STATE magic_frontend__create_buffer (FILE * file, int size) { - YY_BUFFER_STATE b; - - b = (YY_BUFFER_STATE) magic_frontend_alloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in magic_frontend__create_buffer()" ); + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) + magic_frontend_alloc (sizeof (struct yy_buffer_state)); + if (!b) + YY_FATAL_ERROR + ("out of dynamic memory in magic_frontend__create_buffer()"); - b->yy_buf_size = size; + b->yy_buf_size = size; - /* yy_ch_buf has to be 2 characters longer than the size given because - * we need to put in 2 end-of-buffer characters. - */ - b->yy_ch_buf = (char *) magic_frontend_alloc(b->yy_buf_size + 2 ); - if ( ! b->yy_ch_buf ) - YY_FATAL_ERROR( "out of dynamic memory in magic_frontend__create_buffer()" ); + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) magic_frontend_alloc (b->yy_buf_size + 2); + if (!b->yy_ch_buf) + YY_FATAL_ERROR + ("out of dynamic memory in magic_frontend__create_buffer()"); - b->yy_is_our_buffer = 1; + b->yy_is_our_buffer = 1; - magic_frontend__init_buffer(b,file ); + magic_frontend__init_buffer (b, file); - return b; + return b; } /** Destroy the buffer. * @param b a buffer created with magic_frontend__create_buffer() * */ - void magic_frontend__delete_buffer (YY_BUFFER_STATE b ) +void magic_frontend__delete_buffer (YY_BUFFER_STATE b) { - - if ( ! b ) - return; - if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ - YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + if (!b) + return; - if ( b->yy_is_our_buffer ) - magic_frontend_free((void *) b->yy_ch_buf ); + if (b == YY_CURRENT_BUFFER) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; - magic_frontend_free((void *) b ); + if (b->yy_is_our_buffer) + magic_frontend_free ((void *) b->yy_ch_buf); + + magic_frontend_free ((void *) b); } #ifndef __cplusplus -extern int isatty (int ); +extern int isatty (int); #endif /* __cplusplus */ - + /* Initializes or reinitializes a buffer. * This function is sometimes called more than once on the same buffer, * such as during a magic_frontend_restart() or at EOF. */ - static void magic_frontend__init_buffer (YY_BUFFER_STATE b, FILE * file ) - +static void magic_frontend__init_buffer (YY_BUFFER_STATE b, FILE * file) { - int oerrno = errno; - - magic_frontend__flush_buffer(b ); + int oerrno = errno; + + magic_frontend__flush_buffer (b); - b->yy_input_file = file; - b->yy_fill_buffer = 1; + b->yy_input_file = file; + b->yy_fill_buffer = 1; /* If b is the current buffer, then magic_frontend__init_buffer was _probably_ * called from magic_frontend_restart() or through yy_get_next_buffer. * In that case, we don't want to reset the lineno or column. */ - if (b != YY_CURRENT_BUFFER){ + if (b != YY_CURRENT_BUFFER) + { b->yy_bs_lineno = 1; b->yy_bs_column = 0; } - b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; - - errno = oerrno; + b->yy_is_interactive = file ? (isatty (fileno (file)) > 0) : 0; + + errno = oerrno; } /** Discard all buffered characters. On the next scan, YY_INPUT will be called. * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. * */ - void magic_frontend__flush_buffer (YY_BUFFER_STATE b ) +void magic_frontend__flush_buffer (YY_BUFFER_STATE b) { - if ( ! b ) - return; + if (!b) + return; - b->yy_n_chars = 0; + b->yy_n_chars = 0; - /* We always need two end-of-buffer characters. The first causes - * a transition to the end-of-buffer state. The second causes - * a jam in that state. - */ - b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; - b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; - b->yy_buf_pos = &b->yy_ch_buf[0]; + b->yy_buf_pos = &b->yy_ch_buf[0]; - b->yy_at_bol = 1; - b->yy_buffer_status = YY_BUFFER_NEW; + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; - if ( b == YY_CURRENT_BUFFER ) - magic_frontend__load_buffer_state( ); + if (b == YY_CURRENT_BUFFER) + magic_frontend__load_buffer_state (); } /** Pushes the new state onto the stack. The new state becomes @@ -2004,30 +2066,30 @@ extern int isatty (int ); * @param new_buffer The new state. * */ -void magic_frontend_push_buffer_state (YY_BUFFER_STATE new_buffer ) +void magic_frontend_push_buffer_state (YY_BUFFER_STATE new_buffer) { - if (new_buffer == NULL) - return; - - magic_frontend_ensure_buffer_stack(); - - /* This block is copied from magic_frontend__switch_to_buffer. */ - if ( YY_CURRENT_BUFFER ) - { - /* Flush out information for old buffer. */ - *(yy_c_buf_p) = (yy_hold_char); - YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); - YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); - } - - /* Only push if top exists. Otherwise, replace top. */ - if (YY_CURRENT_BUFFER) - (yy_buffer_stack_top)++; - YY_CURRENT_BUFFER_LVALUE = new_buffer; - - /* copied from magic_frontend__switch_to_buffer. */ - magic_frontend__load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; + if (new_buffer == NULL) + return; + + magic_frontend_ensure_buffer_stack (); + + /* This block is copied from magic_frontend__switch_to_buffer. */ + if (YY_CURRENT_BUFFER) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from magic_frontend__switch_to_buffer. */ + magic_frontend__load_buffer_state (); + (yy_did_buffer_switch_on_eof) = 1; } /** Removes and deletes the top of the stack, if present. @@ -2036,18 +2098,19 @@ void magic_frontend_push_buffer_state (YY_BUFFER_STATE new_buffer ) */ void magic_frontend_pop_buffer_state (void) { - if (!YY_CURRENT_BUFFER) - return; - - magic_frontend__delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - if ((yy_buffer_stack_top) > 0) - --(yy_buffer_stack_top); - - if (YY_CURRENT_BUFFER) { - magic_frontend__load_buffer_state( ); - (yy_did_buffer_switch_on_eof) = 1; - } + if (!YY_CURRENT_BUFFER) + return; + + magic_frontend__delete_buffer (YY_CURRENT_BUFFER); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) + { + magic_frontend__load_buffer_state (); + (yy_did_buffer_switch_on_eof) = 1; + } } /* Allocates the stack if it does not exist. @@ -2055,45 +2118,49 @@ void magic_frontend_pop_buffer_state (void) */ static void magic_frontend_ensure_buffer_stack (void) { - int num_to_alloc; - - if (!(yy_buffer_stack)) { + int num_to_alloc; - /* First allocation is just for 2 elements, since we don't know if this - * scanner will even need a stack. We use 2 instead of 1 to avoid an - * immediate realloc on the next call. + if (!(yy_buffer_stack)) + { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. */ - num_to_alloc = 1; - (yy_buffer_stack) = (struct yy_buffer_state**)magic_frontend_alloc - (num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in magic_frontend_ensure_buffer_stack()" ); - - memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); - - (yy_buffer_stack_max) = num_to_alloc; - (yy_buffer_stack_top) = 0; - return; - } + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state **) magic_frontend_alloc + (num_to_alloc * sizeof (struct yy_buffer_state *)); + if (!(yy_buffer_stack)) + YY_FATAL_ERROR + ("out of dynamic memory in magic_frontend_ensure_buffer_stack()"); + + memset ((yy_buffer_stack), 0, + num_to_alloc * sizeof (struct yy_buffer_state *)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } - if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1) + { - /* Increase the buffer to prepare for a possible push. */ - int grow_size = 8 /* arbitrary grow size */; + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */ ; - num_to_alloc = (yy_buffer_stack_max) + grow_size; - (yy_buffer_stack) = (struct yy_buffer_state**)magic_frontend_realloc - ((yy_buffer_stack), - num_to_alloc * sizeof(struct yy_buffer_state*) - ); - if ( ! (yy_buffer_stack) ) - YY_FATAL_ERROR( "out of dynamic memory in magic_frontend_ensure_buffer_stack()" ); + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state **) magic_frontend_realloc + ((yy_buffer_stack), + num_to_alloc * sizeof (struct yy_buffer_state *)); + if (!(yy_buffer_stack)) + YY_FATAL_ERROR + ("out of dynamic memory in magic_frontend_ensure_buffer_stack()"); - /* zero only the new slots.*/ - memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); - (yy_buffer_stack_max) = num_to_alloc; - } + /* zero only the new slots. */ + memset ((yy_buffer_stack) + (yy_buffer_stack_max), 0, + grow_size * sizeof (struct yy_buffer_state *)); + (yy_buffer_stack_max) = num_to_alloc; + } } /** Setup the input buffer state to scan directly from a user-specified character buffer. @@ -2102,33 +2169,35 @@ static void magic_frontend_ensure_buffer_stack (void) * * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE magic_frontend__scan_buffer (char * base, yy_size_t size ) +YY_BUFFER_STATE magic_frontend__scan_buffer (char *base, yy_size_t size) { - YY_BUFFER_STATE b; - - if ( size < 2 || - base[size-2] != YY_END_OF_BUFFER_CHAR || - base[size-1] != YY_END_OF_BUFFER_CHAR ) - /* They forgot to leave room for the EOB's. */ - return 0; - - b = (YY_BUFFER_STATE) magic_frontend_alloc(sizeof( struct yy_buffer_state ) ); - if ( ! b ) - YY_FATAL_ERROR( "out of dynamic memory in magic_frontend__scan_buffer()" ); - - b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ - b->yy_buf_pos = b->yy_ch_buf = base; - b->yy_is_our_buffer = 0; - b->yy_input_file = 0; - b->yy_n_chars = b->yy_buf_size; - b->yy_is_interactive = 0; - b->yy_at_bol = 1; - b->yy_fill_buffer = 0; - b->yy_buffer_status = YY_BUFFER_NEW; - - magic_frontend__switch_to_buffer(b ); - - return b; + YY_BUFFER_STATE b; + + if (size < 2 || + base[size - 2] != YY_END_OF_BUFFER_CHAR || + base[size - 1] != YY_END_OF_BUFFER_CHAR) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) + magic_frontend_alloc (sizeof (struct yy_buffer_state)); + if (!b) + YY_FATAL_ERROR + ("out of dynamic memory in magic_frontend__scan_buffer()"); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + magic_frontend__switch_to_buffer (b); + + return b; } /** Setup the input buffer state to scan a string. The next call to magic_frontend_lex() will @@ -2139,10 +2208,10 @@ YY_BUFFER_STATE magic_frontend__scan_buffer (char * base, yy_size_t size ) * @note If you want to scan bytes that may contain NUL values, then use * magic_frontend__scan_bytes() instead. */ -YY_BUFFER_STATE magic_frontend__scan_string (yyconst char * yystr ) +YY_BUFFER_STATE magic_frontend__scan_string (yyconst char *yystr) { - - return magic_frontend__scan_bytes(yystr,strlen(yystr) ); + + return magic_frontend__scan_bytes (yystr, strlen (yystr)); } /** Setup the input buffer state to scan the given bytes. The next call to magic_frontend_lex() will @@ -2152,44 +2221,46 @@ YY_BUFFER_STATE magic_frontend__scan_string (yyconst char * yystr ) * * @return the newly allocated buffer state object. */ -YY_BUFFER_STATE magic_frontend__scan_bytes (yyconst char * yybytes, int _yybytes_len ) +YY_BUFFER_STATE magic_frontend__scan_bytes (yyconst char *yybytes, + int _yybytes_len) { - YY_BUFFER_STATE b; - char *buf; - yy_size_t n; - int i; - - /* Get memory for full buffer, including space for trailing EOB's. */ - n = _yybytes_len + 2; - buf = (char *) magic_frontend_alloc(n ); - if ( ! buf ) - YY_FATAL_ERROR( "out of dynamic memory in magic_frontend__scan_bytes()" ); - - for ( i = 0; i < _yybytes_len; ++i ) - buf[i] = yybytes[i]; - - buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; - - b = magic_frontend__scan_buffer(buf,n ); - if ( ! b ) - YY_FATAL_ERROR( "bad buffer in magic_frontend__scan_bytes()" ); - - /* It's okay to grow etc. this buffer, and we should throw it - * away when we're done. - */ - b->yy_is_our_buffer = 1; - - return b; + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) magic_frontend_alloc (n); + if (!buf) + YY_FATAL_ERROR + ("out of dynamic memory in magic_frontend__scan_bytes()"); + + for (i = 0; i < _yybytes_len; ++i) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len + 1] = YY_END_OF_BUFFER_CHAR; + + b = magic_frontend__scan_buffer (buf, n); + if (!b) + YY_FATAL_ERROR ("bad buffer in magic_frontend__scan_bytes()"); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; } #ifndef YY_EXIT_FAILURE #define YY_EXIT_FAILURE 2 #endif -static void yy_fatal_error (yyconst char* msg ) +static void yy_fatal_error (yyconst char *msg) { - (void) fprintf( stderr, "%s\n", msg ); - exit( YY_EXIT_FAILURE ); + (void) fprintf (stderr, "%s\n", msg); + exit (YY_EXIT_FAILURE); } /* Redefine yyless() so it works in section 3 code. */ @@ -2214,52 +2285,52 @@ static void yy_fatal_error (yyconst char* msg ) /** Get the current line number. * */ -int magic_frontend_get_lineno (void) +int magic_frontend_get_lineno (void) { - + return magic_frontend_lineno; } /** Get the input stream. * */ -FILE *magic_frontend_get_in (void) +FILE *magic_frontend_get_in (void) { - return magic_frontend_in; + return magic_frontend_in; } /** Get the output stream. * */ -FILE *magic_frontend_get_out (void) +FILE *magic_frontend_get_out (void) { - return magic_frontend_out; + return magic_frontend_out; } /** Get the length of the current token. * */ -int magic_frontend_get_leng (void) +int magic_frontend_get_leng (void) { - return magic_frontend_leng; + return magic_frontend_leng; } /** Get the current token. * */ -char *magic_frontend_get_text (void) +char *magic_frontend_get_text (void) { - return magic_frontend_text; + return magic_frontend_text; } /** Set the current line number. * @param line_number * */ -void magic_frontend_set_lineno (int line_number ) +void magic_frontend_set_lineno (int line_number) { - + magic_frontend_lineno = line_number; } @@ -2269,35 +2340,35 @@ void magic_frontend_set_lineno (int line_number ) * * @see magic_frontend__switch_to_buffer */ -void magic_frontend_set_in (FILE * in_str ) +void magic_frontend_set_in (FILE * in_str) { - magic_frontend_in = in_str ; + magic_frontend_in = in_str; } -void magic_frontend_set_out (FILE * out_str ) +void magic_frontend_set_out (FILE * out_str) { - magic_frontend_out = out_str ; + magic_frontend_out = out_str; } -int magic_frontend_get_debug (void) +int magic_frontend_get_debug (void) { - return magic_frontend__flex_debug; + return magic_frontend__flex_debug; } -void magic_frontend_set_debug (int bdebug ) +void magic_frontend_set_debug (int bdebug) { - magic_frontend__flex_debug = bdebug ; + magic_frontend__flex_debug = bdebug; } static int yy_init_globals (void) { - /* Initialization is the same as for the non-reentrant scanner. + /* Initialization is the same as for the non-reentrant scanner. * This function is called from magic_frontend_lex_destroy(), so don't allocate here. */ /* We do not touch magic_frontend_lineno unless the option is enabled. */ - magic_frontend_lineno = 1; - + magic_frontend_lineno = 1; + (yy_buffer_stack) = 0; (yy_buffer_stack_top) = 0; (yy_buffer_stack_max) = 0; @@ -2321,23 +2392,24 @@ static int yy_init_globals (void) } /* magic_frontend_lex_destroy is for both reentrant and non-reentrant scanners. */ -int magic_frontend_lex_destroy (void) +int magic_frontend_lex_destroy (void) { - + /* Pop the buffer stack, destroying each element. */ - while(YY_CURRENT_BUFFER){ - magic_frontend__delete_buffer(YY_CURRENT_BUFFER ); - YY_CURRENT_BUFFER_LVALUE = NULL; - magic_frontend_pop_buffer_state(); - } + while (YY_CURRENT_BUFFER) + { + magic_frontend__delete_buffer (YY_CURRENT_BUFFER); + YY_CURRENT_BUFFER_LVALUE = NULL; + magic_frontend_pop_buffer_state (); + } - /* Destroy the stack itself. */ - magic_frontend_free((yy_buffer_stack) ); - (yy_buffer_stack) = NULL; + /* Destroy the stack itself. */ + magic_frontend_free ((yy_buffer_stack)); + (yy_buffer_stack) = NULL; /* Reset the globals. This is important in a non-reentrant scanner so the next time * magic_frontend_lex() is called, initialization will occur. */ - yy_init_globals( ); + yy_init_globals (); return 0; } @@ -2347,50 +2419,47 @@ int magic_frontend_lex_destroy (void) */ #ifndef yytext_ptr -static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +static void yy_flex_strncpy (char *s1, yyconst char *s2, int n) { - register int i; - for ( i = 0; i < n; ++i ) - s1[i] = s2[i]; + register int i; + for (i = 0; i < n; ++i) + s1[i] = s2[i]; } #endif #ifdef YY_NEED_STRLEN -static int yy_flex_strlen (yyconst char * s ) +static int yy_flex_strlen (yyconst char *s) { - register int n; - for ( n = 0; s[n]; ++n ) - ; + register int n; + for (n = 0; s[n]; ++n) + ; - return n; + return n; } #endif -void *magic_frontend_alloc (yy_size_t size ) +void *magic_frontend_alloc (yy_size_t size) { - return (void *) malloc( size ); + return (void *) malloc (size); } -void *magic_frontend_realloc (void * ptr, yy_size_t size ) +void *magic_frontend_realloc (void *ptr, yy_size_t size) { - /* The cast to (char *) in the following accommodates both - * implementations that use char* generic pointers, and those - * that use void* generic pointers. It works with the latter - * because both ANSI C and C++ allow castless assignment from - * any pointer type to void*, and deal with argument conversions - * as though doing an assignment. - */ - return (void *) realloc( (char *) ptr, size ); + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc ((char *) ptr, size); } -void magic_frontend_free (void * ptr ) +void magic_frontend_free (void *ptr) { - free( (char *) ptr ); /* see magic_frontend_realloc() for (char *) cast */ + free ((char *) ptr); /* see magic_frontend_realloc() for (char *) cast */ } #define YYTABLES_NAME "yytables" #line 140 "magic-interpreter.l" - - - diff --git a/src/map/magic-interpreter-parser.c b/src/map/magic-interpreter-parser.c index 7ff9fb4..9449d75 100644 --- a/src/map/magic-interpreter-parser.c +++ b/src/map/magic-interpreter-parser.c @@ -72,61 +72,62 @@ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - INT = 258, - STRING = 259, - ID = 260, - DIR = 261, - CONST = 262, - PROCEDURE = 263, - CALL = 264, - SILENT = 265, - LOCAL = 266, - NONMAGIC = 267, - SHL = 268, - SHR = 269, - EQ = 270, - NEQ = 271, - GTE = 272, - LTE = 273, - ANDAND = 274, - OROR = 275, - SCRIPT_DATA = 276, - TO = 277, - TOWARDS = 278, - TELEPORT_ANCHOR = 279, - SPELL = 280, - LET = 281, - IN = 282, - END = 283, - DARROW = 284, - STRING_TY = 285, - REQUIRE = 286, - CATALYSTS = 287, - COMPONENTS = 288, - MANA = 289, - CASTTIME = 290, - SKIP = 291, - ABORT = 292, - BREAK = 293, - EFFECT = 294, - ATEND = 295, - ATTRIGGER = 296, - PC_F = 297, - NPC_F = 298, - MOB_F = 299, - ENTITY_F = 300, - TARGET_F = 301, - IF = 302, - THEN = 303, - ELSE = 304, - FOREACH = 305, - FOR = 306, - DO = 307, - SLEEP = 308, - OR = 309 - }; + * know about them. */ +enum yytokentype +{ + INT = 258, + STRING = 259, + ID = 260, + DIR = 261, + CONST = 262, + PROCEDURE = 263, + CALL = 264, + SILENT = 265, + LOCAL = 266, + NONMAGIC = 267, + SHL = 268, + SHR = 269, + EQ = 270, + NEQ = 271, + GTE = 272, + LTE = 273, + ANDAND = 274, + OROR = 275, + SCRIPT_DATA = 276, + TO = 277, + TOWARDS = 278, + TELEPORT_ANCHOR = 279, + SPELL = 280, + LET = 281, + IN = 282, + END = 283, + DARROW = 284, + STRING_TY = 285, + REQUIRE = 286, + CATALYSTS = 287, + COMPONENTS = 288, + MANA = 289, + CASTTIME = 290, + SKIP = 291, + ABORT = 292, + BREAK = 293, + EFFECT = 294, + ATEND = 295, + ATTRIGGER = 296, + PC_F = 297, + NPC_F = 298, + MOB_F = 299, + ENTITY_F = 300, + TARGET_F = 301, + IF = 302, + THEN = 303, + ELSE = 304, + FOREACH = 305, + FOR = 306, + DO = 307, + SLEEP = 308, + OR = 309 +}; #endif /* Tokens. */ #define INT 258 @@ -182,9 +183,6 @@ #define SLEEP 308 #define OR 309 - - - /* Copy the first part of user declarations. */ #line 1 "magic-interpreter-parser.y" @@ -194,67 +192,50 @@ magic_conf_t magic_conf; -static int -intern_id(char *id_name); +static int intern_id (char *id_name); +static expr_t *fun_expr (char *name, int args_nr, expr_t ** args, int line, + int column); -static expr_t * -fun_expr(char *name, int args_nr, expr_t **args, int line, int column); - -static expr_t * -dot_expr(expr_t *lhs, int id); +static expr_t *dot_expr (expr_t * lhs, int id); #define BIN_EXPR(x, name, arg1, arg2, line, column) { expr_t *e[2]; e[0] = arg1; e[1] = arg2; x = fun_expr(name, 2, e, line, column); } static int failed_flag = 0; -static void -magic_frontend_error(const char *msg); - -static void -fail(int line, int column, char *fmt, ...); - -static spell_t * -new_spell(spellguard_t *guard); +static void magic_frontend_error (const char *msg); -static spellguard_t * -spellguard_implication(spellguard_t *a, spellguard_t *b); +static void fail (int line, int column, char *fmt, ...); -static spellguard_t * -new_spellguard(int ty); +static spell_t *new_spell (spellguard_t * guard); -static effect_t * -new_effect(int ty); +static spellguard_t *spellguard_implication (spellguard_t * a, + spellguard_t * b); -static effect_t * -set_effect_continuation(effect_t *src, effect_t *continuation); +static spellguard_t *new_spellguard (int ty); -static void -add_spell(spell_t *spell, int line_nr); +static effect_t *new_effect (int ty); -static void -add_teleport_anchor(teleport_anchor_t *anchor, int line_nr); +static effect_t *set_effect_continuation (effect_t * src, + effect_t * continuation); -static effect_t * -op_effect(char *name, int args_nr, expr_t **args, int line, int column); +static void add_spell (spell_t * spell, int line_nr); -int -magic_frontend_lex(); +static void add_teleport_anchor (teleport_anchor_t * anchor, int line_nr); -static void -install_proc(proc_t *proc); +static effect_t *op_effect (char *name, int args_nr, expr_t ** args, int line, + int column); -static effect_t * -call_proc(char *name, int args_nr, expr_t **args, int line_nr, int column); - -static void -bind_constant(char *name, val_t *val, int line_nr); +int magic_frontend_lex (); -static val_t * -find_constant(char *name); +static void install_proc (proc_t * proc); +static effect_t *call_proc (char *name, int args_nr, expr_t ** args, + int line_nr, int column); +static void bind_constant (char *name, val_t * val, int line_nr); +static val_t *find_constant (char *name); /* Enabling traces. */ #ifndef YYDEBUG @@ -278,29 +259,39 @@ find_constant(char *name); typedef union YYSTYPE #line 74 "magic-interpreter-parser.y" { - int i; + int i; char *s; - int op; + int op; magic_conf_t *magic_conf; val_t value; expr_t *expr; e_location_t location; e_area_t area; args_rec_t arg_list; - struct { int letdefs_nr; letdef_t *letdefs; } letdefs; + struct + { + int letdefs_nr; + letdef_t *letdefs; + } letdefs; spell_t *spell; - struct { int id, ty; } spellarg_def; + struct + { + int id, ty; + } spellarg_def; letdef_t vardef; spellguard_t *spellguard; component_t *components; - struct {int id, count; } component; + struct + { + int id, count; + } component; effect_t *effect; proc_t *proc; } /* Line 187 of yacc.c. */ #line 302 "magic-interpreter-parser.c" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif @@ -308,20 +299,18 @@ typedef union YYSTYPE #if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED typedef struct YYLTYPE { - int first_line; - int first_column; - int last_line; - int last_column; + int first_line; + int first_column; + int last_line; + int last_column; } YYLTYPE; -# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ +# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ # define YYLTYPE_IS_DECLARED 1 # define YYLTYPE_IS_TRIVIAL 1 #endif - /* Copy the second part of user declarations. */ - /* Line 216 of yacc.c. */ #line 327 "magic-interpreter-parser.c" @@ -363,7 +352,7 @@ typedef short int yytype_int16; # define YYSIZE_T size_t # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) -# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ +# include <stddef.h> /* INFRINGES ON USER NAME SPACE */ # define YYSIZE_T size_t # else # define YYSIZE_T unsigned int @@ -375,7 +364,7 @@ typedef short int yytype_int16; #ifndef YY_ # if YYENABLE_NLS # if ENABLE_NLS -# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ +# include <libintl.h> /* INFRINGES ON USER NAME SPACE */ # define YY_(msgid) dgettext ("bison-runtime", msgid) # endif # endif @@ -388,7 +377,7 @@ typedef short int yytype_int16; #if ! defined lint || defined __GNUC__ # define YYUSE(e) ((void) (e)) #else -# define YYUSE(e) /* empty */ +# define YYUSE(e) /* empty */ #endif /* Identity function, used to suppress warnings about constant conditions. */ @@ -397,15 +386,13 @@ typedef short int yytype_int16; #else #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) -static int -YYID (int i) +static int YYID (int i) #else -static int -YYID (i) - int i; +static int YYID (i) + int i; #endif { - return i; + return i; } #endif @@ -418,17 +405,17 @@ YYID (i) # ifdef __GNUC__ # define YYSTACK_ALLOC __builtin_alloca # elif defined __BUILTIN_VA_ARG_INCR -# include <alloca.h> /* INFRINGES ON USER NAME SPACE */ +# include <alloca.h> /* INFRINGES ON USER NAME SPACE */ # elif defined _AIX # define YYSTACK_ALLOC __alloca # elif defined _MSC_VER -# include <malloc.h> /* INFRINGES ON USER NAME SPACE */ +# include <malloc.h> /* INFRINGES ON USER NAME SPACE */ # define alloca _alloca # else # define YYSTACK_ALLOC alloca # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) -# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif @@ -442,10 +429,10 @@ YYID (i) # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) # ifndef YYSTACK_ALLOC_MAXIMUM /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ + * and a page size can be as small as 4096 bytes. So we cannot safely + * invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + * to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ # endif # else # define YYSTACK_ALLOC YYMALLOC @@ -456,7 +443,7 @@ YYID (i) # if (defined __cplusplus && ! defined _STDLIB_H \ && ! ((defined YYMALLOC || defined malloc) \ && (defined YYFREE || defined free))) -# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ +# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ # ifndef _STDLIB_H # define _STDLIB_H 1 # endif @@ -465,20 +452,19 @@ YYID (i) # define YYMALLOC malloc # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ # endif # endif # ifndef YYFREE # define YYFREE free # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) -void free (void *); /* INFRINGES ON USER NAME SPACE */ +void free (void *); /* INFRINGES ON USER NAME SPACE */ # endif # endif # endif #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - #if (! defined yyoverflow \ && (! defined __cplusplus \ || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \ @@ -487,8 +473,8 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */ /* A type that is properly aligned for any stack member. */ union yyalloc { - yytype_int16 yyss; - YYSTYPE yyvs; + yytype_int16 yyss; + YYSTYPE yyvs; YYLTYPE yyls; }; @@ -559,279 +545,267 @@ union yyalloc ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 14, 23, 2, - 73, 74, 12, 10, 16, 11, 17, 13, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 18, 19, - 8, 7, 9, 2, 15, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 21, 2, 22, 24, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 20, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72 +static const yytype_uint8 yytranslate[] = { + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 14, 23, 2, + 73, 74, 12, 10, 16, 11, 17, 13, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 18, 19, + 8, 7, 9, 2, 15, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 21, 2, 22, 24, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 20, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 65, 66, 67, 68, 69, 70, 71, 72 }; #if YYDEBUG /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in YYRHS. */ -static const yytype_uint16 yyprhs[] = -{ - 0, 0, 3, 4, 8, 9, 12, 13, 15, 17, - 21, 25, 30, 37, 45, 54, 55, 58, 61, 64, - 65, 71, 73, 75, 77, 79, 81, 83, 85, 87, - 91, 95, 99, 103, 107, 111, 115, 119, 123, 127, - 131, 135, 139, 143, 147, 151, 155, 159, 163, 168, - 172, 176, 177, 179, 181, 185, 194, 196, 205, 215, - 217, 222, 224, 228, 232, 234, 238, 242, 246, 251, - 252, 255, 256, 259, 261, 265, 269, 271, 275, 278, - 281, 284, 287, 290, 294, 296, 300, 304, 306, 308, - 310, 312, 314, 316, 318, 320, 322, 326, 329, 332, - 335, 338, 343, 351, 360, 367, 372, 376, 382, 384, - 391, 392 +static const yytype_uint16 yyprhs[] = { + 0, 0, 3, 4, 8, 9, 12, 13, 15, 17, + 21, 25, 30, 37, 45, 54, 55, 58, 61, 64, + 65, 71, 73, 75, 77, 79, 81, 83, 85, 87, + 91, 95, 99, 103, 107, 111, 115, 119, 123, 127, + 131, 135, 139, 143, 147, 151, 155, 159, 163, 168, + 172, 176, 177, 179, 181, 185, 194, 196, 205, 215, + 217, 222, 224, 228, 232, 234, 238, 242, 246, 251, + 252, 255, 256, 259, 261, 265, 269, 271, 275, 278, + 281, 284, 287, 290, 294, 296, 300, 304, 306, 308, + 310, 312, 314, 316, 318, 320, 322, 326, 329, 332, + 335, 338, 343, 351, 360, 367, 372, 376, 382, 384, + 391, 392 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int8 yyrhs[] = -{ - 76, 0, -1, -1, 80, 77, 76, -1, -1, 77, - 19, -1, -1, 79, -1, 5, -1, 79, 16, 5, - -1, 5, 7, 85, -1, 25, 5, 7, 85, -1, - 42, 5, 18, 85, 7, 85, -1, 26, 5, 73, - 78, 74, 7, 106, -1, 81, 43, 5, 82, 18, - 85, 7, 90, -1, -1, 29, 81, -1, 30, 81, - -1, 28, 81, -1, -1, 73, 5, 18, 83, 74, - -1, 60, -1, 48, -1, 6, -1, 3, -1, 4, - -1, 84, -1, 5, -1, 89, -1, 85, 10, 85, - -1, 85, 11, 85, -1, 85, 12, 85, -1, 85, - 14, 85, -1, 85, 13, 85, -1, 85, 8, 85, - -1, 85, 9, 85, -1, 85, 23, 85, -1, 85, - 24, 85, -1, 85, 20, 85, -1, 85, 31, 85, - -1, 85, 32, 85, -1, 85, 36, 85, -1, 85, - 35, 85, -1, 85, 37, 85, -1, 85, 38, 85, - -1, 85, 33, 85, -1, 85, 7, 85, -1, 85, - 34, 85, -1, 5, 73, 86, 74, -1, 73, 85, - 74, -1, 85, 17, 5, -1, -1, 87, -1, 85, - -1, 87, 16, 85, -1, 15, 73, 85, 16, 85, - 16, 85, 74, -1, 88, -1, 88, 15, 10, 73, - 85, 16, 85, 74, -1, 88, 41, 85, 18, 73, - 85, 16, 85, 74, -1, 93, -1, 44, 91, 45, - 93, -1, 77, -1, 91, 92, 77, -1, 5, 7, - 85, -1, 94, -1, 94, 20, 93, -1, 97, 47, - 94, -1, 73, 93, 74, -1, 57, 106, 95, 96, - -1, -1, 59, 106, -1, -1, 58, 106, -1, 99, - -1, 97, 72, 97, -1, 73, 98, 74, -1, 97, - -1, 97, 16, 98, -1, 49, 85, -1, 50, 100, - -1, 51, 100, -1, 52, 85, -1, 53, 85, -1, - 21, 101, 22, -1, 102, -1, 101, 16, 102, -1, - 3, 12, 103, -1, 103, -1, 4, -1, 3, -1, - 60, -1, 62, -1, 63, -1, 43, -1, 64, -1, - 61, -1, 73, 106, 74, -1, 54, 19, -1, 55, - 19, -1, 46, 19, -1, 56, 19, -1, 5, 7, - 85, 19, -1, 68, 104, 5, 45, 85, 70, 105, - -1, 69, 5, 7, 85, 40, 85, 70, 105, -1, - 65, 85, 66, 105, 67, 105, -1, 65, 85, 66, - 105, -1, 71, 85, 19, -1, 5, 73, 86, 74, - 19, -1, 39, -1, 27, 5, 73, 86, 74, 19, - -1, -1, 105, 77, 106, -1 +static const yytype_int8 yyrhs[] = { + 76, 0, -1, -1, 80, 77, 76, -1, -1, 77, + 19, -1, -1, 79, -1, 5, -1, 79, 16, 5, + -1, 5, 7, 85, -1, 25, 5, 7, 85, -1, + 42, 5, 18, 85, 7, 85, -1, 26, 5, 73, + 78, 74, 7, 106, -1, 81, 43, 5, 82, 18, + 85, 7, 90, -1, -1, 29, 81, -1, 30, 81, + -1, 28, 81, -1, -1, 73, 5, 18, 83, 74, + -1, 60, -1, 48, -1, 6, -1, 3, -1, 4, + -1, 84, -1, 5, -1, 89, -1, 85, 10, 85, + -1, 85, 11, 85, -1, 85, 12, 85, -1, 85, + 14, 85, -1, 85, 13, 85, -1, 85, 8, 85, + -1, 85, 9, 85, -1, 85, 23, 85, -1, 85, + 24, 85, -1, 85, 20, 85, -1, 85, 31, 85, + -1, 85, 32, 85, -1, 85, 36, 85, -1, 85, + 35, 85, -1, 85, 37, 85, -1, 85, 38, 85, + -1, 85, 33, 85, -1, 85, 7, 85, -1, 85, + 34, 85, -1, 5, 73, 86, 74, -1, 73, 85, + 74, -1, 85, 17, 5, -1, -1, 87, -1, 85, + -1, 87, 16, 85, -1, 15, 73, 85, 16, 85, + 16, 85, 74, -1, 88, -1, 88, 15, 10, 73, + 85, 16, 85, 74, -1, 88, 41, 85, 18, 73, + 85, 16, 85, 74, -1, 93, -1, 44, 91, 45, + 93, -1, 77, -1, 91, 92, 77, -1, 5, 7, + 85, -1, 94, -1, 94, 20, 93, -1, 97, 47, + 94, -1, 73, 93, 74, -1, 57, 106, 95, 96, + -1, -1, 59, 106, -1, -1, 58, 106, -1, 99, + -1, 97, 72, 97, -1, 73, 98, 74, -1, 97, + -1, 97, 16, 98, -1, 49, 85, -1, 50, 100, + -1, 51, 100, -1, 52, 85, -1, 53, 85, -1, + 21, 101, 22, -1, 102, -1, 101, 16, 102, -1, + 3, 12, 103, -1, 103, -1, 4, -1, 3, -1, + 60, -1, 62, -1, 63, -1, 43, -1, 64, -1, + 61, -1, 73, 106, 74, -1, 54, 19, -1, 55, + 19, -1, 46, 19, -1, 56, 19, -1, 5, 7, + 85, 19, -1, 68, 104, 5, 45, 85, 70, 105, + -1, 69, 5, 7, 85, 40, 85, 70, 105, -1, + 65, 85, 66, 105, 67, 105, -1, 65, 85, 66, + 105, -1, 71, 85, 19, -1, 5, 73, 86, 74, + 19, -1, 39, -1, 27, 5, 73, 86, 74, 19, + -1, -1, 105, 77, 106, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint16 yyrline[] = -{ - 0, 213, 213, 214, 220, 221, 227, 228, 232, 238, - 245, 256, 262, 273, 282, 295, 296, 301, 306, 314, - 315, 321, 323, 328, 331, 334, 340, 343, 354, 357, - 359, 361, 363, 365, 367, 369, 371, 373, 375, 377, - 379, 381, 383, 385, 387, 389, 391, 393, 396, 401, - 403, 408, 409, 414, 419, 426, 430, 434, 440, 450, - 452, 461, 465, 474, 487, 489, 498, 500, 502, 513, - 514, 520, 521, 526, 528, 534, 539, 541, 546, 550, - 554, 558, 562, 569, 574, 578, 585, 587, 592, 601, - 606, 608, 610, 612, 614, 616, 621, 623, 625, 627, - 629, 631, 642, 649, 656, 662, 668, 672, 676, 683, - 690, 691 +static const yytype_uint16 yyrline[] = { + 0, 213, 213, 214, 220, 221, 227, 228, 232, 238, + 245, 256, 262, 273, 282, 295, 296, 301, 306, 314, + 315, 321, 323, 328, 331, 334, 340, 343, 354, 357, + 359, 361, 363, 365, 367, 369, 371, 373, 375, 377, + 379, 381, 383, 385, 387, 389, 391, 393, 396, 401, + 403, 408, 409, 414, 419, 426, 430, 434, 440, 450, + 452, 461, 465, 474, 487, 489, 498, 500, 502, 513, + 514, 520, 521, 526, 528, 534, 539, 541, 546, 550, + 554, 558, 562, 569, 574, 578, 585, 587, 592, 601, + 606, 608, 610, 612, 614, 616, 621, 623, 625, 627, + 629, 631, 642, 649, 656, 662, 668, 672, 676, 683, + 690, 691 }; #endif #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "INT", "STRING", "ID", "DIR", "'='", - "'<'", "'>'", "'+'", "'-'", "'*'", "'/'", "'%'", "'@'", "','", "'.'", - "':'", "';'", "'|'", "'['", "']'", "'&'", "'^'", "CONST", "PROCEDURE", - "CALL", "SILENT", "LOCAL", "NONMAGIC", "SHL", "SHR", "EQ", "NEQ", "GTE", - "LTE", "ANDAND", "OROR", "SCRIPT_DATA", "TO", "TOWARDS", - "TELEPORT_ANCHOR", "SPELL", "LET", "IN", "END", "DARROW", "STRING_TY", - "REQUIRE", "CATALYSTS", "COMPONENTS", "MANA", "CASTTIME", "SKIP", - "ABORT", "BREAK", "EFFECT", "ATEND", "ATTRIGGER", "PC_F", "NPC_F", - "MOB_F", "ENTITY_F", "TARGET_F", "IF", "THEN", "ELSE", "FOREACH", "FOR", - "DO", "SLEEP", "OR", "'('", "')'", "$accept", "spellconf", "semicolons", - "proc_formals_list", "proc_formals_list_ne", "spellconf_option", - "spell_flags", "argopt", "arg_ty", "value", "expr", "arg_list", - "arg_list_ne", "location", "area", "spelldef", "defs", "def", - "spellbody_list", "spellbody", "maybe_trigger", "maybe_end", - "spellguard", "spellguard_list", "prereq", "items", "item_list", "item", - "item_name", "selection", "effect", "effect_list", 0 +static const char *const yytname[] = { + "$end", "error", "$undefined", "INT", "STRING", "ID", "DIR", "'='", + "'<'", "'>'", "'+'", "'-'", "'*'", "'/'", "'%'", "'@'", "','", "'.'", + "':'", "';'", "'|'", "'['", "']'", "'&'", "'^'", "CONST", "PROCEDURE", + "CALL", "SILENT", "LOCAL", "NONMAGIC", "SHL", "SHR", "EQ", "NEQ", "GTE", + "LTE", "ANDAND", "OROR", "SCRIPT_DATA", "TO", "TOWARDS", + "TELEPORT_ANCHOR", "SPELL", "LET", "IN", "END", "DARROW", "STRING_TY", + "REQUIRE", "CATALYSTS", "COMPONENTS", "MANA", "CASTTIME", "SKIP", + "ABORT", "BREAK", "EFFECT", "ATEND", "ATTRIGGER", "PC_F", "NPC_F", + "MOB_F", "ENTITY_F", "TARGET_F", "IF", "THEN", "ELSE", "FOREACH", "FOR", + "DO", "SLEEP", "OR", "'('", "')'", "$accept", "spellconf", "semicolons", + "proc_formals_list", "proc_formals_list_ne", "spellconf_option", + "spell_flags", "argopt", "arg_ty", "value", "expr", "arg_list", + "arg_list_ne", "location", "area", "spelldef", "defs", "def", + "spellbody_list", "spellbody", "maybe_trigger", "maybe_end", + "spellguard", "spellguard_list", "prereq", "items", "item_list", "item", + "item_name", "selection", "effect", "effect_list", 0 }; #endif # ifdef YYPRINT /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 61, 60, 62, - 43, 45, 42, 47, 37, 64, 44, 46, 58, 59, - 124, 91, 93, 38, 94, 262, 263, 264, 265, 266, - 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, - 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, - 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, - 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, - 307, 308, 309, 40, 41 +static const yytype_uint16 yytoknum[] = { + 0, 256, 257, 258, 259, 260, 261, 61, 60, 62, + 43, 45, 42, 47, 37, 64, 44, 46, 58, 59, + 124, 91, 93, 38, 94, 262, 263, 264, 265, 266, + 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, + 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 40, 41 }; # endif /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 75, 76, 76, 77, 77, 78, 78, 79, 79, - 80, 80, 80, 80, 80, 81, 81, 81, 81, 82, - 82, 83, 83, 84, 84, 84, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 86, 86, 87, 87, 88, 89, 89, 89, 90, - 90, 91, 91, 92, 93, 93, 94, 94, 94, 95, - 95, 96, 96, 97, 97, 97, 98, 98, 99, 99, - 99, 99, 99, 100, 101, 101, 102, 102, 103, 103, - 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, - 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, - 106, 106 +static const yytype_uint8 yyr1[] = { + 0, 75, 76, 76, 77, 77, 78, 78, 79, 79, + 80, 80, 80, 80, 80, 81, 81, 81, 81, 82, + 82, 83, 83, 84, 84, 84, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 86, 86, 87, 87, 88, 89, 89, 89, 90, + 90, 91, 91, 92, 93, 93, 94, 94, 94, 95, + 95, 96, 96, 97, 97, 97, 98, 98, 99, 99, + 99, 99, 99, 100, 101, 101, 102, 102, 103, 103, + 104, 104, 104, 104, 104, 104, 105, 105, 105, 105, + 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, + 106, 106 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 0, 3, 0, 2, 0, 1, 1, 3, - 3, 4, 6, 7, 8, 0, 2, 2, 2, 0, - 5, 1, 1, 1, 1, 1, 1, 1, 1, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, - 3, 0, 1, 1, 3, 8, 1, 8, 9, 1, - 4, 1, 3, 3, 1, 3, 3, 3, 4, 0, - 2, 0, 2, 1, 3, 3, 1, 3, 2, 2, - 2, 2, 2, 3, 1, 3, 3, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, - 2, 4, 7, 8, 6, 4, 3, 5, 1, 6, - 0, 3 +static const yytype_uint8 yyr2[] = { + 0, 2, 0, 3, 0, 2, 0, 1, 1, 3, + 3, 4, 6, 7, 8, 0, 2, 2, 2, 0, + 5, 1, 1, 1, 1, 1, 1, 1, 1, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, + 3, 0, 1, 1, 3, 8, 1, 8, 9, 1, + 4, 1, 3, 3, 1, 3, 3, 3, 4, 0, + 2, 0, 2, 1, 3, 3, 1, 3, 2, 2, + 2, 2, 2, 3, 1, 3, 3, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, + 2, 4, 7, 8, 6, 4, 3, 5, 1, 6, + 0, 3 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state STATE-NUM when YYTABLE doesn't specify something else to do. Zero means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 2, 0, 0, 0, 15, 15, 15, 0, 0, 4, - 0, 0, 0, 0, 18, 16, 17, 0, 1, 2, - 0, 24, 25, 27, 23, 0, 0, 26, 10, 56, - 28, 0, 6, 0, 5, 3, 19, 51, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 11, 8, 0, 7, 0, 0, 0, 53, - 0, 52, 0, 49, 46, 34, 35, 29, 30, 31, - 33, 32, 50, 38, 36, 37, 39, 40, 45, 47, - 42, 41, 43, 44, 0, 0, 0, 0, 0, 0, - 0, 48, 0, 0, 0, 0, 110, 9, 46, 0, - 0, 54, 0, 0, 0, 0, 0, 108, 0, 0, - 0, 0, 0, 0, 0, 0, 110, 4, 13, 22, - 21, 0, 0, 0, 0, 0, 0, 51, 0, 99, - 97, 98, 100, 0, 93, 90, 95, 91, 92, 94, - 0, 0, 0, 0, 110, 20, 4, 0, 0, 0, - 0, 0, 110, 0, 14, 59, 64, 0, 73, 0, - 0, 0, 0, 0, 51, 0, 0, 0, 106, 96, - 111, 61, 0, 78, 0, 79, 80, 81, 82, 69, - 0, 76, 0, 0, 0, 0, 55, 57, 0, 101, - 0, 0, 105, 0, 0, 0, 0, 4, 89, 88, - 0, 84, 87, 110, 71, 67, 0, 75, 0, 65, - 66, 0, 74, 58, 107, 0, 0, 0, 0, 0, - 60, 62, 0, 0, 83, 70, 110, 68, 76, 77, - 109, 104, 0, 0, 63, 89, 86, 85, 72, 102, - 0, 103 +static const yytype_uint8 yydefact[] = { + 2, 0, 0, 0, 15, 15, 15, 0, 0, 4, + 0, 0, 0, 0, 18, 16, 17, 0, 1, 2, + 0, 24, 25, 27, 23, 0, 0, 26, 10, 56, + 28, 0, 6, 0, 5, 3, 19, 51, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 8, 0, 7, 0, 0, 0, 53, + 0, 52, 0, 49, 46, 34, 35, 29, 30, 31, + 33, 32, 50, 38, 36, 37, 39, 40, 45, 47, + 42, 41, 43, 44, 0, 0, 0, 0, 0, 0, + 0, 48, 0, 0, 0, 0, 110, 9, 46, 0, + 0, 54, 0, 0, 0, 0, 0, 108, 0, 0, + 0, 0, 0, 0, 0, 0, 110, 4, 13, 22, + 21, 0, 0, 0, 0, 0, 0, 51, 0, 99, + 97, 98, 100, 0, 93, 90, 95, 91, 92, 94, + 0, 0, 0, 0, 110, 20, 4, 0, 0, 0, + 0, 0, 110, 0, 14, 59, 64, 0, 73, 0, + 0, 0, 0, 0, 51, 0, 0, 0, 106, 96, + 111, 61, 0, 78, 0, 79, 80, 81, 82, 69, + 0, 76, 0, 0, 0, 0, 55, 57, 0, 101, + 0, 0, 105, 0, 0, 0, 0, 4, 89, 88, + 0, 84, 87, 110, 71, 67, 0, 75, 0, 65, + 66, 0, 74, 58, 107, 0, 0, 0, 0, 0, + 60, 62, 0, 0, 83, 70, 110, 68, 76, 77, + 109, 104, 0, 0, 63, 89, 86, 85, 72, 102, + 0, 103 }; /* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int16 yydefgoto[] = -{ - -1, 8, 19, 64, 65, 9, 10, 68, 131, 27, - 69, 70, 71, 29, 30, 164, 182, 207, 190, 166, - 214, 237, 167, 192, 168, 185, 210, 211, 212, 150, - 127, 128 +static const yytype_int16 yydefgoto[] = { + -1, 8, 19, 64, 65, 9, 10, 68, 131, 27, + 69, 70, 71, 29, 30, 164, 182, 207, 190, 166, + 214, 237, 167, 192, 168, 185, 210, 211, 212, 150, + 127, 128 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing STATE-NUM. */ #define YYPACT_NINF -175 -static const yytype_int16 yypact[] = -{ - 351, 7, 14, 18, 41, 41, 41, 51, 59, -175, - 22, 1, 60, 5, -175, -175, -175, 64, -175, 275, - 78, -175, -175, 17, -175, 28, 1, -175, 773, -13, - -175, 1, 81, 1, -175, -175, 29, 1, 1, 223, - 1, 1, 1, 1, 1, 1, 1, 1, 99, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 95, 1, 773, -175, 33, 96, 805, 104, 92, 773, - 39, 108, 549, -175, 46, 930, 930, 951, 951, 221, - 221, 221, -175, 46, 46, 46, 46, 46, 930, 930, - 930, 930, 900, 869, 47, 581, 125, 128, 1, 112, - 1, -175, 1, 1, 1, 61, 156, -175, 477, -35, - 837, 773, 613, 645, 1, 2, 140, -175, 139, 143, - 144, 146, 1, 93, 142, 1, 156, -175, -175, -175, - -175, 103, 91, 1, 1, 677, 1, 1, 97, -175, - -175, -175, -175, 455, -175, -175, -175, -175, -175, -175, - 162, 161, 709, 105, 132, -175, -175, 1, 148, 148, - 1, 1, 156, 123, -175, -175, 164, 13, -175, 255, - 299, 1, 741, 107, 1, 156, 137, 1, -175, -175, - -175, 166, 6, 773, 58, -175, -175, 773, 773, 130, - 116, 8, 117, 460, 460, 66, -175, -175, 331, -175, - 174, 120, 131, 1, 515, 192, 460, -175, 194, -175, - -4, -175, -175, 156, 149, -175, 66, -175, 460, -175, - -175, 66, -175, -175, -175, 185, 156, 375, 1, 1, - -175, 166, 69, 58, -175, -175, 156, -175, -6, -175, - -175, -175, 156, 415, 773, -175, -175, -175, -175, -175, - 156, -175 +static const yytype_int16 yypact[] = { + 351, 7, 14, 18, 41, 41, 41, 51, 59, -175, + 22, 1, 60, 5, -175, -175, -175, 64, -175, 275, + 78, -175, -175, 17, -175, 28, 1, -175, 773, -13, + -175, 1, 81, 1, -175, -175, 29, 1, 1, 223, + 1, 1, 1, 1, 1, 1, 1, 1, 99, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 95, 1, 773, -175, 33, 96, 805, 104, 92, 773, + 39, 108, 549, -175, 46, 930, 930, 951, 951, 221, + 221, 221, -175, 46, 46, 46, 46, 46, 930, 930, + 930, 930, 900, 869, 47, 581, 125, 128, 1, 112, + 1, -175, 1, 1, 1, 61, 156, -175, 477, -35, + 837, 773, 613, 645, 1, 2, 140, -175, 139, 143, + 144, 146, 1, 93, 142, 1, 156, -175, -175, -175, + -175, 103, 91, 1, 1, 677, 1, 1, 97, -175, + -175, -175, -175, 455, -175, -175, -175, -175, -175, -175, + 162, 161, 709, 105, 132, -175, -175, 1, 148, 148, + 1, 1, 156, 123, -175, -175, 164, 13, -175, 255, + 299, 1, 741, 107, 1, 156, 137, 1, -175, -175, + -175, 166, 6, 773, 58, -175, -175, 773, 773, 130, + 116, 8, 117, 460, 460, 66, -175, -175, 331, -175, + 174, 120, 131, 1, 515, 192, 460, -175, 194, -175, + -4, -175, -175, 156, 149, -175, 66, -175, 460, -175, + -175, 66, -175, -175, -175, 185, 156, 375, 1, 1, + -175, 166, 69, 58, -175, -175, 156, -175, -6, -175, + -175, -175, 156, 415, 773, -175, -175, -175, -175, -175, + 156, -175 }; /* YYPGOTO[NTERM-NUM]. */ -static const yytype_int16 yypgoto[] = -{ - -175, 189, -119, -175, -175, -175, 94, -175, -175, -175, - -11, -120, -175, -175, -175, -175, -175, -175, -129, 15, - -175, -175, -137, -3, -175, 55, -175, -18, -16, -175, - -174, -105 +static const yytype_int16 yypgoto[] = { + -175, 189, -119, -175, -175, -175, 94, -175, -175, -175, + -11, -120, -175, -175, -175, -175, -175, -175, -129, 15, + -175, -175, -137, -3, -175, 55, -175, -18, -16, -175, + -174, -105 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -839,242 +813,239 @@ static const yytype_int16 yypgoto[] = number is the opposite. If zero, do what YYDEFACT says. If YYTABLE_NINF, syntax error. */ #define YYTABLE_NINF -16 -static const yytype_int16 yytable[] = -{ - 28, 202, 60, 165, 21, 22, 23, 24, 154, 136, - 216, 205, 233, 129, 11, 39, 25, 173, 234, 12, - 62, 153, 66, 13, 216, 130, 191, 72, 61, 74, - 75, 76, 77, 78, 79, 80, 81, 181, 83, 84, - 85, 86, 87, 88, 89, 90, 91, 92, 93, 180, - 95, 206, 241, 40, 201, 194, 17, 189, 222, 18, - 194, 208, 209, 48, 219, 20, 195, 31, 249, 4, - 5, 6, 245, 209, 26, 137, 251, 230, 32, 238, - 195, 191, 33, 36, 238, 195, 63, 108, 231, 110, - 37, 111, 112, 113, 21, 22, 23, 24, 14, 15, - 16, 38, 67, 135, 82, 94, 25, 96, 235, 99, - 100, 143, 97, 101, 152, 157, 158, 159, 160, 161, - 104, 74, 169, 170, 102, 172, 21, 22, 23, 24, - 109, 248, 106, 107, 114, 156, 144, 115, 25, 221, - 157, 158, 159, 160, 161, 138, 183, 151, 162, 187, - 188, 34, 39, 145, 146, 147, 148, 149, 139, 116, - 198, 115, 140, 141, 163, 142, 204, 176, 177, 184, - 174, 117, 157, 158, 159, 160, 161, 155, 118, 179, - 162, 200, 203, 116, 193, 34, 119, 120, 121, 213, - 215, 217, 227, 224, 225, 117, 163, 122, 226, 229, - 123, 124, 118, 125, 240, 126, 232, 236, 35, 220, - 119, 120, 121, 239, 186, 247, 246, 243, 244, 0, - 0, 122, 0, 0, 123, 124, 0, 125, 40, 126, - 40, 41, 42, 43, 44, 45, 46, 47, 48, 0, - 48, 49, 0, 49, 50, 51, 50, 51, 0, 0, - 0, 0, 52, 53, 52, 53, 54, 55, 56, 57, - 58, 59, 40, 41, 42, 43, 44, 45, 46, 47, - 0, 0, 48, 0, 0, 49, 0, 0, 50, 51, - 1, 0, 0, 0, 0, 0, 52, 53, 54, 55, - 56, 57, 58, 59, 34, 0, 0, 73, 0, 0, - 2, 3, 0, 4, 5, 6, 40, 41, 42, 43, - 44, 45, 46, 47, 0, 0, 48, 7, -15, 49, - 0, 0, 50, 51, 0, 0, 0, 0, 0, 196, - 52, 53, 54, 55, 56, 57, 58, 59, 40, 41, - 42, 43, 44, 45, 46, 47, 0, 0, 48, 0, - 0, 49, 0, 0, 50, 51, 1, 0, 0, 0, - 0, 0, 52, 53, 54, 55, 56, 57, 58, 59, - 0, 0, 0, 197, 0, 0, 2, 3, 0, 4, - 5, 6, 40, 41, 42, 43, 44, 45, 46, 47, - 0, 0, 48, 7, -15, 49, 0, 0, 50, 51, - 0, 0, 0, 0, 0, 223, 52, 53, 54, 55, - 56, 57, 58, 59, 0, 0, 0, 0, 0, 0, - 0, 0, 40, 41, 42, 43, 44, 45, 46, 47, - 0, 0, 48, 0, 0, 49, 0, 0, 50, 51, - 0, 0, 0, 0, 0, 242, 52, 53, 54, 55, - 56, 57, 58, 59, 0, 0, 0, 0, 0, 0, - 0, 0, 40, 41, 42, 43, 44, 45, 46, 47, - 0, 0, 48, 0, 0, 49, 0, -12, 50, 51, - 0, 0, -12, 0, 40, 250, 52, 53, 54, 55, - 56, 57, 58, 59, 48, 0, -12, 0, 0, 0, - 0, 0, -12, -12, 0, -12, -12, -12, 0, 157, - 158, 159, 160, 161, 0, 0, 0, 162, 0, -12, - -12, 175, 40, 41, 42, 43, 44, 45, 46, 47, - 0, 0, 48, 218, 0, 49, 0, 0, 50, 51, - 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, - 56, 57, 58, 59, 0, 228, 40, 41, 42, 43, - 44, 45, 46, 47, 0, 103, 48, 0, 0, 49, - 0, 0, 50, 51, 0, 0, 0, 0, 0, 0, - 52, 53, 54, 55, 56, 57, 58, 59, 40, 41, - 42, 43, 44, 45, 46, 47, 0, 0, 48, 105, - 0, 49, 0, 0, 50, 51, 0, 0, 0, 0, - 0, 0, 52, 53, 54, 55, 56, 57, 58, 59, - 40, 41, 42, 43, 44, 45, 46, 47, 0, 133, - 48, 0, 0, 49, 0, 0, 50, 51, 0, 0, - 0, 0, 0, 0, 52, 53, 54, 55, 56, 57, - 58, 59, 40, 41, 42, 43, 44, 45, 46, 47, - 0, 134, 48, 0, 0, 49, 0, 0, 50, 51, - 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, - 56, 57, 58, 59, 40, 41, 42, 43, 44, 45, - 46, 47, 0, 171, 48, 0, 0, 49, 0, 0, - 50, 51, 0, 0, 0, 0, 0, 0, 52, 53, - 54, 55, 56, 57, 58, 59, 40, 41, 42, 43, - 44, 45, 46, 47, 0, 0, 48, 0, 178, 49, - 0, 0, 50, 51, 0, 0, 0, 0, 0, 0, - 52, 53, 54, 55, 56, 57, 58, 59, 40, 41, - 42, 43, 44, 45, 46, 47, 0, 0, 48, 0, - 199, 49, 0, 0, 50, 51, 0, 0, 0, 0, - 0, 0, 52, 53, 54, 55, 56, 57, 58, 59, - 40, 41, 42, 43, 44, 45, 46, 47, 0, 0, - 48, 0, 0, 49, 0, 0, 50, 51, 0, 0, - 0, 0, 0, 0, 52, 53, 54, 55, 56, 57, - 58, 59, 98, 41, 42, 43, 44, 45, 46, 47, - 0, 0, 48, 0, 0, 49, 0, 0, 50, 51, - 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, - 56, 57, 58, 59, 132, 41, 42, 43, 44, 45, - 46, 47, 0, 0, 48, 0, 0, 49, 0, 0, - 50, 51, 0, 0, 0, 0, 0, 0, 52, 53, - 54, 55, 56, 57, 58, 59, 40, 41, 42, 43, - 44, 45, 46, 47, 0, 0, 48, 0, 0, 49, - 0, 0, 50, 51, 0, 0, 0, 0, 0, 0, - 52, 53, 54, 55, 56, 57, 58, 40, 41, 42, - 43, 44, 45, 46, 47, 0, 0, 48, 0, 0, - 49, 0, 0, 50, 51, 0, 0, 0, 0, 0, - 0, 52, 53, 54, 55, 56, 57, 40, 0, 0, - 43, 44, 45, 46, 47, 0, 0, 48, 0, 0, - 49, 0, 0, 50, 51, 0, 0, 0, 40, 0, - 0, 52, 53, 45, 46, 47, 0, 0, 48, 0, - 0, 49, 0, 0, 50, 51, 0, 0, 0, 0, - 0, 0, 52, 53 +static const yytype_int16 yytable[] = { + 28, 202, 60, 165, 21, 22, 23, 24, 154, 136, + 216, 205, 233, 129, 11, 39, 25, 173, 234, 12, + 62, 153, 66, 13, 216, 130, 191, 72, 61, 74, + 75, 76, 77, 78, 79, 80, 81, 181, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 180, + 95, 206, 241, 40, 201, 194, 17, 189, 222, 18, + 194, 208, 209, 48, 219, 20, 195, 31, 249, 4, + 5, 6, 245, 209, 26, 137, 251, 230, 32, 238, + 195, 191, 33, 36, 238, 195, 63, 108, 231, 110, + 37, 111, 112, 113, 21, 22, 23, 24, 14, 15, + 16, 38, 67, 135, 82, 94, 25, 96, 235, 99, + 100, 143, 97, 101, 152, 157, 158, 159, 160, 161, + 104, 74, 169, 170, 102, 172, 21, 22, 23, 24, + 109, 248, 106, 107, 114, 156, 144, 115, 25, 221, + 157, 158, 159, 160, 161, 138, 183, 151, 162, 187, + 188, 34, 39, 145, 146, 147, 148, 149, 139, 116, + 198, 115, 140, 141, 163, 142, 204, 176, 177, 184, + 174, 117, 157, 158, 159, 160, 161, 155, 118, 179, + 162, 200, 203, 116, 193, 34, 119, 120, 121, 213, + 215, 217, 227, 224, 225, 117, 163, 122, 226, 229, + 123, 124, 118, 125, 240, 126, 232, 236, 35, 220, + 119, 120, 121, 239, 186, 247, 246, 243, 244, 0, + 0, 122, 0, 0, 123, 124, 0, 125, 40, 126, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 0, + 48, 49, 0, 49, 50, 51, 50, 51, 0, 0, + 0, 0, 52, 53, 52, 53, 54, 55, 56, 57, + 58, 59, 40, 41, 42, 43, 44, 45, 46, 47, + 0, 0, 48, 0, 0, 49, 0, 0, 50, 51, + 1, 0, 0, 0, 0, 0, 52, 53, 54, 55, + 56, 57, 58, 59, 34, 0, 0, 73, 0, 0, + 2, 3, 0, 4, 5, 6, 40, 41, 42, 43, + 44, 45, 46, 47, 0, 0, 48, 7, -15, 49, + 0, 0, 50, 51, 0, 0, 0, 0, 0, 196, + 52, 53, 54, 55, 56, 57, 58, 59, 40, 41, + 42, 43, 44, 45, 46, 47, 0, 0, 48, 0, + 0, 49, 0, 0, 50, 51, 1, 0, 0, 0, + 0, 0, 52, 53, 54, 55, 56, 57, 58, 59, + 0, 0, 0, 197, 0, 0, 2, 3, 0, 4, + 5, 6, 40, 41, 42, 43, 44, 45, 46, 47, + 0, 0, 48, 7, -15, 49, 0, 0, 50, 51, + 0, 0, 0, 0, 0, 223, 52, 53, 54, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 41, 42, 43, 44, 45, 46, 47, + 0, 0, 48, 0, 0, 49, 0, 0, 50, 51, + 0, 0, 0, 0, 0, 242, 52, 53, 54, 55, + 56, 57, 58, 59, 0, 0, 0, 0, 0, 0, + 0, 0, 40, 41, 42, 43, 44, 45, 46, 47, + 0, 0, 48, 0, 0, 49, 0, -12, 50, 51, + 0, 0, -12, 0, 40, 250, 52, 53, 54, 55, + 56, 57, 58, 59, 48, 0, -12, 0, 0, 0, + 0, 0, -12, -12, 0, -12, -12, -12, 0, 157, + 158, 159, 160, 161, 0, 0, 0, 162, 0, -12, + -12, 175, 40, 41, 42, 43, 44, 45, 46, 47, + 0, 0, 48, 218, 0, 49, 0, 0, 50, 51, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, + 56, 57, 58, 59, 0, 228, 40, 41, 42, 43, + 44, 45, 46, 47, 0, 103, 48, 0, 0, 49, + 0, 0, 50, 51, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 55, 56, 57, 58, 59, 40, 41, + 42, 43, 44, 45, 46, 47, 0, 0, 48, 105, + 0, 49, 0, 0, 50, 51, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 55, 56, 57, 58, 59, + 40, 41, 42, 43, 44, 45, 46, 47, 0, 133, + 48, 0, 0, 49, 0, 0, 50, 51, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 55, 56, 57, + 58, 59, 40, 41, 42, 43, 44, 45, 46, 47, + 0, 134, 48, 0, 0, 49, 0, 0, 50, 51, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, + 56, 57, 58, 59, 40, 41, 42, 43, 44, 45, + 46, 47, 0, 171, 48, 0, 0, 49, 0, 0, + 50, 51, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 55, 56, 57, 58, 59, 40, 41, 42, 43, + 44, 45, 46, 47, 0, 0, 48, 0, 178, 49, + 0, 0, 50, 51, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 55, 56, 57, 58, 59, 40, 41, + 42, 43, 44, 45, 46, 47, 0, 0, 48, 0, + 199, 49, 0, 0, 50, 51, 0, 0, 0, 0, + 0, 0, 52, 53, 54, 55, 56, 57, 58, 59, + 40, 41, 42, 43, 44, 45, 46, 47, 0, 0, + 48, 0, 0, 49, 0, 0, 50, 51, 0, 0, + 0, 0, 0, 0, 52, 53, 54, 55, 56, 57, + 58, 59, 98, 41, 42, 43, 44, 45, 46, 47, + 0, 0, 48, 0, 0, 49, 0, 0, 50, 51, + 0, 0, 0, 0, 0, 0, 52, 53, 54, 55, + 56, 57, 58, 59, 132, 41, 42, 43, 44, 45, + 46, 47, 0, 0, 48, 0, 0, 49, 0, 0, + 50, 51, 0, 0, 0, 0, 0, 0, 52, 53, + 54, 55, 56, 57, 58, 59, 40, 41, 42, 43, + 44, 45, 46, 47, 0, 0, 48, 0, 0, 49, + 0, 0, 50, 51, 0, 0, 0, 0, 0, 0, + 52, 53, 54, 55, 56, 57, 58, 40, 41, 42, + 43, 44, 45, 46, 47, 0, 0, 48, 0, 0, + 49, 0, 0, 50, 51, 0, 0, 0, 0, 0, + 0, 52, 53, 54, 55, 56, 57, 40, 0, 0, + 43, 44, 45, 46, 47, 0, 0, 48, 0, 0, + 49, 0, 0, 50, 51, 0, 0, 0, 40, 0, + 0, 52, 53, 45, 46, 47, 0, 0, 48, 0, + 0, 49, 0, 0, 50, 51, 0, 0, 0, 0, + 0, 0, 52, 53 }; -static const yytype_int16 yycheck[] = -{ - 11, 175, 15, 132, 3, 4, 5, 6, 127, 7, - 16, 5, 16, 48, 7, 26, 15, 137, 22, 5, - 31, 126, 33, 5, 16, 60, 163, 38, 41, 40, - 41, 42, 43, 44, 45, 46, 47, 156, 49, 50, - 51, 52, 53, 54, 55, 56, 57, 58, 59, 154, - 61, 45, 226, 7, 174, 47, 5, 162, 195, 0, - 47, 3, 4, 17, 193, 43, 72, 7, 242, 28, - 29, 30, 3, 4, 73, 73, 250, 206, 73, 216, - 72, 218, 18, 5, 221, 72, 5, 98, 207, 100, - 73, 102, 103, 104, 3, 4, 5, 6, 4, 5, - 6, 73, 73, 114, 5, 10, 15, 74, 213, 5, - 18, 122, 16, 74, 125, 49, 50, 51, 52, 53, - 73, 132, 133, 134, 16, 136, 3, 4, 5, 6, - 18, 236, 7, 5, 73, 44, 43, 5, 15, 73, - 49, 50, 51, 52, 53, 5, 157, 5, 57, 160, - 161, 19, 163, 60, 61, 62, 63, 64, 19, 27, - 171, 5, 19, 19, 73, 19, 177, 5, 7, 21, - 73, 39, 49, 50, 51, 52, 53, 74, 46, 74, - 57, 74, 45, 27, 20, 19, 54, 55, 56, 59, - 74, 74, 203, 19, 74, 39, 73, 65, 67, 7, - 68, 69, 46, 71, 19, 73, 12, 58, 19, 194, - 54, 55, 56, 216, 159, 233, 232, 228, 229, -1, - -1, 65, -1, -1, 68, 69, -1, 71, 7, 73, - 7, 8, 9, 10, 11, 12, 13, 14, 17, -1, - 17, 20, -1, 20, 23, 24, 23, 24, -1, -1, - -1, -1, 31, 32, 31, 32, 33, 34, 35, 36, - 37, 38, 7, 8, 9, 10, 11, 12, 13, 14, - -1, -1, 17, -1, -1, 20, -1, -1, 23, 24, - 5, -1, -1, -1, -1, -1, 31, 32, 33, 34, - 35, 36, 37, 38, 19, -1, -1, 74, -1, -1, - 25, 26, -1, 28, 29, 30, 7, 8, 9, 10, - 11, 12, 13, 14, -1, -1, 17, 42, 43, 20, - -1, -1, 23, 24, -1, -1, -1, -1, -1, 74, - 31, 32, 33, 34, 35, 36, 37, 38, 7, 8, - 9, 10, 11, 12, 13, 14, -1, -1, 17, -1, - -1, 20, -1, -1, 23, 24, 5, -1, -1, -1, - -1, -1, 31, 32, 33, 34, 35, 36, 37, 38, - -1, -1, -1, 74, -1, -1, 25, 26, -1, 28, - 29, 30, 7, 8, 9, 10, 11, 12, 13, 14, - -1, -1, 17, 42, 43, 20, -1, -1, 23, 24, - -1, -1, -1, -1, -1, 74, 31, 32, 33, 34, - 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, - -1, -1, 7, 8, 9, 10, 11, 12, 13, 14, - -1, -1, 17, -1, -1, 20, -1, -1, 23, 24, - -1, -1, -1, -1, -1, 70, 31, 32, 33, 34, - 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, - -1, -1, 7, 8, 9, 10, 11, 12, 13, 14, - -1, -1, 17, -1, -1, 20, -1, 0, 23, 24, - -1, -1, 5, -1, 7, 70, 31, 32, 33, 34, - 35, 36, 37, 38, 17, -1, 19, -1, -1, -1, - -1, -1, 25, 26, -1, 28, 29, 30, -1, 49, - 50, 51, 52, 53, -1, -1, -1, 57, -1, 42, - 43, 66, 7, 8, 9, 10, 11, 12, 13, 14, - -1, -1, 17, 73, -1, 20, -1, -1, 23, 24, - -1, -1, -1, -1, -1, -1, 31, 32, 33, 34, - 35, 36, 37, 38, -1, 40, 7, 8, 9, 10, - 11, 12, 13, 14, -1, 16, 17, -1, -1, 20, - -1, -1, 23, 24, -1, -1, -1, -1, -1, -1, - 31, 32, 33, 34, 35, 36, 37, 38, 7, 8, - 9, 10, 11, 12, 13, 14, -1, -1, 17, 18, - -1, 20, -1, -1, 23, 24, -1, -1, -1, -1, - -1, -1, 31, 32, 33, 34, 35, 36, 37, 38, - 7, 8, 9, 10, 11, 12, 13, 14, -1, 16, - 17, -1, -1, 20, -1, -1, 23, 24, -1, -1, - -1, -1, -1, -1, 31, 32, 33, 34, 35, 36, - 37, 38, 7, 8, 9, 10, 11, 12, 13, 14, - -1, 16, 17, -1, -1, 20, -1, -1, 23, 24, - -1, -1, -1, -1, -1, -1, 31, 32, 33, 34, - 35, 36, 37, 38, 7, 8, 9, 10, 11, 12, - 13, 14, -1, 16, 17, -1, -1, 20, -1, -1, - 23, 24, -1, -1, -1, -1, -1, -1, 31, 32, - 33, 34, 35, 36, 37, 38, 7, 8, 9, 10, - 11, 12, 13, 14, -1, -1, 17, -1, 19, 20, - -1, -1, 23, 24, -1, -1, -1, -1, -1, -1, - 31, 32, 33, 34, 35, 36, 37, 38, 7, 8, - 9, 10, 11, 12, 13, 14, -1, -1, 17, -1, - 19, 20, -1, -1, 23, 24, -1, -1, -1, -1, - -1, -1, 31, 32, 33, 34, 35, 36, 37, 38, - 7, 8, 9, 10, 11, 12, 13, 14, -1, -1, - 17, -1, -1, 20, -1, -1, 23, 24, -1, -1, - -1, -1, -1, -1, 31, 32, 33, 34, 35, 36, - 37, 38, 7, 8, 9, 10, 11, 12, 13, 14, - -1, -1, 17, -1, -1, 20, -1, -1, 23, 24, - -1, -1, -1, -1, -1, -1, 31, 32, 33, 34, - 35, 36, 37, 38, 7, 8, 9, 10, 11, 12, - 13, 14, -1, -1, 17, -1, -1, 20, -1, -1, - 23, 24, -1, -1, -1, -1, -1, -1, 31, 32, - 33, 34, 35, 36, 37, 38, 7, 8, 9, 10, - 11, 12, 13, 14, -1, -1, 17, -1, -1, 20, - -1, -1, 23, 24, -1, -1, -1, -1, -1, -1, - 31, 32, 33, 34, 35, 36, 37, 7, 8, 9, - 10, 11, 12, 13, 14, -1, -1, 17, -1, -1, - 20, -1, -1, 23, 24, -1, -1, -1, -1, -1, - -1, 31, 32, 33, 34, 35, 36, 7, -1, -1, - 10, 11, 12, 13, 14, -1, -1, 17, -1, -1, - 20, -1, -1, 23, 24, -1, -1, -1, 7, -1, - -1, 31, 32, 12, 13, 14, -1, -1, 17, -1, - -1, 20, -1, -1, 23, 24, -1, -1, -1, -1, - -1, -1, 31, 32 +static const yytype_int16 yycheck[] = { + 11, 175, 15, 132, 3, 4, 5, 6, 127, 7, + 16, 5, 16, 48, 7, 26, 15, 137, 22, 5, + 31, 126, 33, 5, 16, 60, 163, 38, 41, 40, + 41, 42, 43, 44, 45, 46, 47, 156, 49, 50, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 154, + 61, 45, 226, 7, 174, 47, 5, 162, 195, 0, + 47, 3, 4, 17, 193, 43, 72, 7, 242, 28, + 29, 30, 3, 4, 73, 73, 250, 206, 73, 216, + 72, 218, 18, 5, 221, 72, 5, 98, 207, 100, + 73, 102, 103, 104, 3, 4, 5, 6, 4, 5, + 6, 73, 73, 114, 5, 10, 15, 74, 213, 5, + 18, 122, 16, 74, 125, 49, 50, 51, 52, 53, + 73, 132, 133, 134, 16, 136, 3, 4, 5, 6, + 18, 236, 7, 5, 73, 44, 43, 5, 15, 73, + 49, 50, 51, 52, 53, 5, 157, 5, 57, 160, + 161, 19, 163, 60, 61, 62, 63, 64, 19, 27, + 171, 5, 19, 19, 73, 19, 177, 5, 7, 21, + 73, 39, 49, 50, 51, 52, 53, 74, 46, 74, + 57, 74, 45, 27, 20, 19, 54, 55, 56, 59, + 74, 74, 203, 19, 74, 39, 73, 65, 67, 7, + 68, 69, 46, 71, 19, 73, 12, 58, 19, 194, + 54, 55, 56, 216, 159, 233, 232, 228, 229, -1, + -1, 65, -1, -1, 68, 69, -1, 71, 7, 73, + 7, 8, 9, 10, 11, 12, 13, 14, 17, -1, + 17, 20, -1, 20, 23, 24, 23, 24, -1, -1, + -1, -1, 31, 32, 31, 32, 33, 34, 35, 36, + 37, 38, 7, 8, 9, 10, 11, 12, 13, 14, + -1, -1, 17, -1, -1, 20, -1, -1, 23, 24, + 5, -1, -1, -1, -1, -1, 31, 32, 33, 34, + 35, 36, 37, 38, 19, -1, -1, 74, -1, -1, + 25, 26, -1, 28, 29, 30, 7, 8, 9, 10, + 11, 12, 13, 14, -1, -1, 17, 42, 43, 20, + -1, -1, 23, 24, -1, -1, -1, -1, -1, 74, + 31, 32, 33, 34, 35, 36, 37, 38, 7, 8, + 9, 10, 11, 12, 13, 14, -1, -1, 17, -1, + -1, 20, -1, -1, 23, 24, 5, -1, -1, -1, + -1, -1, 31, 32, 33, 34, 35, 36, 37, 38, + -1, -1, -1, 74, -1, -1, 25, 26, -1, 28, + 29, 30, 7, 8, 9, 10, 11, 12, 13, 14, + -1, -1, 17, 42, 43, 20, -1, -1, 23, 24, + -1, -1, -1, -1, -1, 74, 31, 32, 33, 34, + 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, + -1, -1, 7, 8, 9, 10, 11, 12, 13, 14, + -1, -1, 17, -1, -1, 20, -1, -1, 23, 24, + -1, -1, -1, -1, -1, 70, 31, 32, 33, 34, + 35, 36, 37, 38, -1, -1, -1, -1, -1, -1, + -1, -1, 7, 8, 9, 10, 11, 12, 13, 14, + -1, -1, 17, -1, -1, 20, -1, 0, 23, 24, + -1, -1, 5, -1, 7, 70, 31, 32, 33, 34, + 35, 36, 37, 38, 17, -1, 19, -1, -1, -1, + -1, -1, 25, 26, -1, 28, 29, 30, -1, 49, + 50, 51, 52, 53, -1, -1, -1, 57, -1, 42, + 43, 66, 7, 8, 9, 10, 11, 12, 13, 14, + -1, -1, 17, 73, -1, 20, -1, -1, 23, 24, + -1, -1, -1, -1, -1, -1, 31, 32, 33, 34, + 35, 36, 37, 38, -1, 40, 7, 8, 9, 10, + 11, 12, 13, 14, -1, 16, 17, -1, -1, 20, + -1, -1, 23, 24, -1, -1, -1, -1, -1, -1, + 31, 32, 33, 34, 35, 36, 37, 38, 7, 8, + 9, 10, 11, 12, 13, 14, -1, -1, 17, 18, + -1, 20, -1, -1, 23, 24, -1, -1, -1, -1, + -1, -1, 31, 32, 33, 34, 35, 36, 37, 38, + 7, 8, 9, 10, 11, 12, 13, 14, -1, 16, + 17, -1, -1, 20, -1, -1, 23, 24, -1, -1, + -1, -1, -1, -1, 31, 32, 33, 34, 35, 36, + 37, 38, 7, 8, 9, 10, 11, 12, 13, 14, + -1, 16, 17, -1, -1, 20, -1, -1, 23, 24, + -1, -1, -1, -1, -1, -1, 31, 32, 33, 34, + 35, 36, 37, 38, 7, 8, 9, 10, 11, 12, + 13, 14, -1, 16, 17, -1, -1, 20, -1, -1, + 23, 24, -1, -1, -1, -1, -1, -1, 31, 32, + 33, 34, 35, 36, 37, 38, 7, 8, 9, 10, + 11, 12, 13, 14, -1, -1, 17, -1, 19, 20, + -1, -1, 23, 24, -1, -1, -1, -1, -1, -1, + 31, 32, 33, 34, 35, 36, 37, 38, 7, 8, + 9, 10, 11, 12, 13, 14, -1, -1, 17, -1, + 19, 20, -1, -1, 23, 24, -1, -1, -1, -1, + -1, -1, 31, 32, 33, 34, 35, 36, 37, 38, + 7, 8, 9, 10, 11, 12, 13, 14, -1, -1, + 17, -1, -1, 20, -1, -1, 23, 24, -1, -1, + -1, -1, -1, -1, 31, 32, 33, 34, 35, 36, + 37, 38, 7, 8, 9, 10, 11, 12, 13, 14, + -1, -1, 17, -1, -1, 20, -1, -1, 23, 24, + -1, -1, -1, -1, -1, -1, 31, 32, 33, 34, + 35, 36, 37, 38, 7, 8, 9, 10, 11, 12, + 13, 14, -1, -1, 17, -1, -1, 20, -1, -1, + 23, 24, -1, -1, -1, -1, -1, -1, 31, 32, + 33, 34, 35, 36, 37, 38, 7, 8, 9, 10, + 11, 12, 13, 14, -1, -1, 17, -1, -1, 20, + -1, -1, 23, 24, -1, -1, -1, -1, -1, -1, + 31, 32, 33, 34, 35, 36, 37, 7, 8, 9, + 10, 11, 12, 13, 14, -1, -1, 17, -1, -1, + 20, -1, -1, 23, 24, -1, -1, -1, -1, -1, + -1, 31, 32, 33, 34, 35, 36, 7, -1, -1, + 10, 11, 12, 13, 14, -1, -1, 17, -1, -1, + 20, -1, -1, 23, 24, -1, -1, -1, 7, -1, + -1, 31, 32, 12, 13, 14, -1, -1, 17, -1, + -1, 20, -1, -1, 23, 24, -1, -1, -1, -1, + -1, -1, 31, 32 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = -{ - 0, 5, 25, 26, 28, 29, 30, 42, 76, 80, - 81, 7, 5, 5, 81, 81, 81, 5, 0, 77, - 43, 3, 4, 5, 6, 15, 73, 84, 85, 88, - 89, 7, 73, 18, 19, 76, 5, 73, 73, 85, - 7, 8, 9, 10, 11, 12, 13, 14, 17, 20, - 23, 24, 31, 32, 33, 34, 35, 36, 37, 38, - 15, 41, 85, 5, 78, 79, 85, 73, 82, 85, - 86, 87, 85, 74, 85, 85, 85, 85, 85, 85, - 85, 85, 5, 85, 85, 85, 85, 85, 85, 85, - 85, 85, 85, 85, 10, 85, 74, 16, 7, 5, - 18, 74, 16, 16, 73, 18, 7, 5, 85, 18, - 85, 85, 85, 85, 73, 5, 27, 39, 46, 54, - 55, 56, 65, 68, 69, 71, 73, 105, 106, 48, - 60, 83, 7, 16, 16, 85, 7, 73, 5, 19, - 19, 19, 19, 85, 43, 60, 61, 62, 63, 64, - 104, 5, 85, 106, 77, 74, 44, 49, 50, 51, - 52, 53, 57, 73, 90, 93, 94, 97, 99, 85, - 85, 16, 85, 86, 73, 66, 5, 7, 19, 74, - 106, 77, 91, 85, 21, 100, 100, 85, 85, 106, - 93, 97, 98, 20, 47, 72, 74, 74, 85, 19, - 74, 86, 105, 45, 85, 5, 45, 92, 3, 4, - 101, 102, 103, 59, 95, 74, 16, 74, 73, 93, - 94, 73, 97, 74, 19, 74, 67, 85, 40, 7, - 93, 77, 12, 16, 22, 106, 58, 96, 97, 98, - 19, 105, 70, 85, 85, 3, 103, 102, 106, 105, - 70, 105 +static const yytype_uint8 yystos[] = { + 0, 5, 25, 26, 28, 29, 30, 42, 76, 80, + 81, 7, 5, 5, 81, 81, 81, 5, 0, 77, + 43, 3, 4, 5, 6, 15, 73, 84, 85, 88, + 89, 7, 73, 18, 19, 76, 5, 73, 73, 85, + 7, 8, 9, 10, 11, 12, 13, 14, 17, 20, + 23, 24, 31, 32, 33, 34, 35, 36, 37, 38, + 15, 41, 85, 5, 78, 79, 85, 73, 82, 85, + 86, 87, 85, 74, 85, 85, 85, 85, 85, 85, + 85, 85, 5, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 10, 85, 74, 16, 7, 5, + 18, 74, 16, 16, 73, 18, 7, 5, 85, 18, + 85, 85, 85, 85, 73, 5, 27, 39, 46, 54, + 55, 56, 65, 68, 69, 71, 73, 105, 106, 48, + 60, 83, 7, 16, 16, 85, 7, 73, 5, 19, + 19, 19, 19, 85, 43, 60, 61, 62, 63, 64, + 104, 5, 85, 106, 77, 74, 44, 49, 50, 51, + 52, 53, 57, 73, 90, 93, 94, 97, 99, 85, + 85, 16, 85, 86, 73, 66, 5, 7, 19, 74, + 106, 77, 91, 85, 21, 100, 100, 85, 85, 106, + 93, 97, 98, 20, 47, 72, 74, 74, 85, 19, + 74, 86, 105, 45, 85, 5, 45, 92, 3, 4, + 101, 102, 103, 59, 95, 74, 16, 74, 73, 93, + 94, 73, 97, 74, 19, 74, 67, 85, 40, 7, + 93, 77, 12, 16, 22, 106, 58, 96, 97, 98, + 19, 105, 70, 85, 85, 3, 103, 102, 106, 105, + 70, 105 }; #define yyerrok (yyerrstatus = 0) @@ -1086,7 +1057,6 @@ static const yytype_uint8 yystos[] = #define YYABORT goto yyabortlab #define YYERROR goto yyerrorlab - /* Like YYERROR except do call yyerror. This remains here temporarily to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ @@ -1112,11 +1082,9 @@ do \ } \ while (YYID (0)) - #define YYTERROR 1 #define YYERRCODE 256 - /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. If N is 0, then set CURRENT to the empty location which ends the previous symbol: RHS[0] (always defined). */ @@ -1142,7 +1110,6 @@ while (YYID (0)) while (YYID (0)) #endif - /* YY_LOCATION_PRINT -- Print the location on the stream. This macro was not mandated originally: define only if we know we won't break user code: when these are the locations we know. */ @@ -1158,7 +1125,6 @@ while (YYID (0)) # endif #endif - /* YYLEX -- calling `yylex' with the right arguments. */ #ifdef YYLEX_PARAM @@ -1171,7 +1137,7 @@ while (YYID (0)) #if YYDEBUG # ifndef YYFPRINTF -# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ +# include <stdio.h> /* INFRINGES ON USER NAME SPACE */ # define YYFPRINTF fprintf # endif @@ -1192,42 +1158,41 @@ do { \ } \ } while (YYID (0)) - /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ -/*ARGSUSED*/ + /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp) +yy_symbol_value_print (FILE * yyoutput, int yytype, + YYSTYPE const *const yyvaluep, + YYLTYPE const *const yylocationp) #else -static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; - YYLTYPE const * const yylocationp; +static void yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp) + FILE *yyoutput; + int yytype; + YYSTYPE const *const yyvaluep; + YYLTYPE const *const yylocationp; #endif { - if (!yyvaluep) - return; - YYUSE (yylocationp); + if (!yyvaluep) + return; + YYUSE (yylocationp); # ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); # else - YYUSE (yyoutput); + YYUSE (yyoutput); # endif - switch (yytype) + switch (yytype) { - default: - break; + default: + break; } } - /*--------------------------------. | Print this symbol on YYOUTPUT. | `--------------------------------*/ @@ -1235,25 +1200,25 @@ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp) #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp) +yy_symbol_print (FILE * yyoutput, int yytype, YYSTYPE const *const yyvaluep, + YYLTYPE const *const yylocationp) #else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; - YYLTYPE const * const yylocationp; +static void yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp) + FILE *yyoutput; + int yytype; + YYSTYPE const *const yyvaluep; + YYLTYPE const *const yylocationp; #endif { - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - - YY_LOCATION_PRINT (yyoutput, *yylocationp); - YYFPRINTF (yyoutput, ": "); - yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp); - YYFPRINTF (yyoutput, ")"); + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + YY_LOCATION_PRINT (yyoutput, *yylocationp); + YYFPRINTF (yyoutput, ": "); + yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp); + YYFPRINTF (yyoutput, ")"); } /*------------------------------------------------------------------. @@ -1263,19 +1228,17 @@ yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp) #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *bottom, yytype_int16 *top) +static void yy_stack_print (yytype_int16 * bottom, yytype_int16 * top) #else -static void -yy_stack_print (bottom, top) - yytype_int16 *bottom; - yytype_int16 *top; +static void yy_stack_print (bottom, top) + yytype_int16 *bottom; + yytype_int16 *top; #endif { - YYFPRINTF (stderr, "Stack now"); - for (; bottom <= top; ++bottom) - YYFPRINTF (stderr, " %d", *bottom); - YYFPRINTF (stderr, "\n"); + YYFPRINTF (stderr, "Stack now"); + for (; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); } # define YY_STACK_PRINT(Bottom, Top) \ @@ -1284,36 +1247,33 @@ do { \ yy_stack_print ((Bottom), (Top)); \ } while (YYID (0)) - /*------------------------------------------------. | Report that the YYRULE is going to be reduced. | `------------------------------------------------*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) -static void -yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule) +static void yy_reduce_print (YYSTYPE * yyvsp, YYLTYPE * yylsp, int yyrule) #else -static void -yy_reduce_print (yyvsp, yylsp, yyrule) - YYSTYPE *yyvsp; - YYLTYPE *yylsp; - int yyrule; +static void yy_reduce_print (yyvsp, yylsp, yyrule) + YYSTYPE *yyvsp; + YYLTYPE *yylsp; + int yyrule; #endif { - int yynrhs = yyr2[yyrule]; - int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) { - fprintf (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - , &(yylsp[(yyi + 1) - (yynrhs)]) ); - fprintf (stderr, "\n"); + fprintf (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]), + &(yylsp[(yyi + 1) - (yynrhs)])); + fprintf (stderr, "\n"); } } @@ -1325,7 +1285,7 @@ do { \ /* Nonzero means print parse trace. It is left uninitialized so that multiple parsers can coexist. */ -int yydebug; +int yydebug; #else /* !YYDEBUG */ # define YYDPRINTF(Args) # define YY_SYMBOL_PRINT(Title, Type, Value, Location) @@ -1333,7 +1293,6 @@ int yydebug; # define YY_REDUCE_PRINT(Rule) #endif /* !YYDEBUG */ - /* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH # define YYINITDEPTH 200 @@ -1349,9 +1308,7 @@ int yydebug; #ifndef YYMAXDEPTH # define YYMAXDEPTH 10000 #endif - - #if YYERROR_VERBOSE # ifndef yystrlen @@ -1361,18 +1318,16 @@ int yydebug; /* Return the length of YYSTR. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) +static YYSIZE_T yystrlen (const char *yystr) #else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; +static YYSIZE_T yystrlen (yystr) + const char *yystr; #endif { - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; } # endif # endif @@ -1385,22 +1340,20 @@ yystrlen (yystr) YYDEST. */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) +static char *yystpcpy (char *yydest, const char *yysrc) #else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; +static char *yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; #endif { - char *yyd = yydest; - const char *yys = yysrc; + char *yyd = yydest; + const char *yys = yysrc; - while ((*yyd++ = *yys++) != '\0') - continue; + while ((*yyd++ = *yys++) != '\0') + continue; - return yyd - 1; + return yyd - 1; } # endif # endif @@ -1413,43 +1366,42 @@ yystpcpy (yydest, yysrc) backslash-backslash). YYSTR is taken from yytname. If YYRES is null, do not copy; instead, return the length of what the result would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) +static YYSIZE_T yytnamerr (char *yyres, const char *yystr) { - if (*yystr == '"') + if (*yystr == '"') { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes:; } - if (! yyres) - return yystrlen (yystr); + if (!yyres) + return yystrlen (yystr); - return yystpcpy (yyres, yystr) - yyres; + return yystpcpy (yyres, yystr) - yyres; } # endif @@ -1460,174 +1412,168 @@ yytnamerr (char *yyres, const char *yystr) copied. As a special case, return 0 if an ordinary "syntax error" message will do. Return YYSIZE_MAXIMUM if overflow occurs during size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) +static YYSIZE_T yysyntax_error (char *yyresult, int yystate, int yychar) { - int yyn = yypact[yystate]; + int yyn = yypact[yystate]; - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else + if (!(YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum + { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; # if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); + /* This is so xgettext sees the translatable formats that are + * constructed on the fly. */ + YY_ ("syntax error, unexpected %s"); + YY_ ("syntax error, unexpected %s, expecting %s"); + YY_ ("syntax error, unexpected %s, expecting %s or %s"); + YY_ ("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_ ("syntax error, unexpected %s, expecting %s or %s or %s or %s"); # endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + * YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_ (yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + * Don't have undefined behavior even if the translation + * produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; } } #endif /* YYERROR_VERBOSE */ - /*-----------------------------------------------. | Release the memory associated to this symbol. | `-----------------------------------------------*/ -/*ARGSUSED*/ + /*ARGSUSED*/ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp) +yydestruct (const char *yymsg, int yytype, YYSTYPE * yyvaluep, + YYLTYPE * yylocationp) #else -static void -yydestruct (yymsg, yytype, yyvaluep, yylocationp) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; - YYLTYPE *yylocationp; +static void yydestruct (yymsg, yytype, yyvaluep, yylocationp) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; + YYLTYPE *yylocationp; #endif { - YYUSE (yyvaluep); - YYUSE (yylocationp); + YYUSE (yyvaluep); + YYUSE (yylocationp); - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - switch (yytype) + switch (yytype) { - default: - break; + default: + break; } } - /* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM #if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); +int yyparse (void *YYPARSE_PARAM); #else -int yyparse (); +int yyparse (); #endif #else /* ! YYPARSE_PARAM */ #if defined __STDC__ || defined __cplusplus -int yyparse (void); +int yyparse (void); #else -int yyparse (); +int yyparse (); #endif #endif /* ! YYPARSE_PARAM */ - - /* The look-ahead symbol. */ -int yychar; +int yychar; /* The semantic value of the look-ahead symbol. */ YYSTYPE yylval; /* Number of syntax errors so far. */ -int yynerrs; +int yynerrs; /* Location data for the look-ahead symbol. */ YYLTYPE yylloc; - - /*----------. | yyparse. | `----------*/ @@ -1635,1622 +1581,1968 @@ YYLTYPE yylloc; #ifdef YYPARSE_PARAM #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) +int yyparse (void *YYPARSE_PARAM) #else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; #endif #else /* ! YYPARSE_PARAM */ #if (defined __STDC__ || defined __C99__FUNC__ \ || defined __cplusplus || defined _MSC_VER) -int -yyparse (void) +int yyparse (void) #else -int -yyparse () - +int yyparse () #endif #endif { - - int yystate; - int yyn; - int yyresult; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - /* Look-ahead token as an internal (translated) token number. */ - int yytoken = 0; + + int yystate; + int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Look-ahead token as an internal (translated) token number. */ + int yytoken = 0; #if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; #endif - /* Three stacks and their tools: - `yyss': related to states, - `yyvs': related to semantic values, - `yyls': related to locations. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss = yyssa; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs = yyvsa; - YYSTYPE *yyvsp; + /* Three stacks and their tools: + * `yyss': related to states, + * `yyvs': related to semantic values, + * `yyls': related to locations. + * + * Refer to the stacks thru separate pointers, to allow yyoverflow + * to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss = yyssa; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp; - /* The location stack. */ - YYLTYPE yylsa[YYINITDEPTH]; - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; - /* The locations where the error started and ended. */ - YYLTYPE yyerror_range[2]; + /* The location stack. */ + YYLTYPE yylsa[YYINITDEPTH]; + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + /* The locations where the error started and ended. */ + YYLTYPE yyerror_range[2]; #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N)) - YYSIZE_T yystacksize = YYINITDEPTH; + YYSIZE_T yystacksize = YYINITDEPTH; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - YYLTYPE yyloc; + /* The variables used to return semantic value and location from the + * action routines. */ + YYSTYPE yyval; + YYLTYPE yyloc; - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; + /* The number of symbols on the RHS of the reduced rule. + * Keep to zero when no symbol should be popped. */ + int yylen = 0; - YYDPRINTF ((stderr, "Starting parse\n")); + YYDPRINTF ((stderr, "Starting parse\n")); - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ + /* Initialize stack pointers. + * Waste one element of value and location stack + * so that they stay on the same level as the state stack. + * The wasted elements are never initialized. */ - yyssp = yyss; - yyvsp = yyvs; - yylsp = yyls; + yyssp = yyss; + yyvsp = yyvs; + yylsp = yyls; #if YYLTYPE_IS_TRIVIAL - /* Initialize the default location before parsing starts. */ - yylloc.first_line = yylloc.last_line = 1; - yylloc.first_column = yylloc.last_column = 0; + /* Initialize the default location before parsing starts. */ + yylloc.first_line = yylloc.last_line = 1; + yylloc.first_column = yylloc.last_column = 0; #endif - goto yysetstate; + goto yysetstate; /*------------------------------------------------------------. | yynewstate -- Push a new state, which is found in yystate. | `------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; + yynewstate: + /* In all cases, when you get here, the value and location stacks + * have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; - yysetstate: - *yyssp = yystate; + yysetstate: + *yyssp = yystate; - if (yyss + yystacksize - 1 <= yyssp) + if (yyss + yystacksize - 1 <= yyssp) { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - YYLTYPE *yyls1 = yyls; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yyls1, yysize * sizeof (*yylsp), - &yystacksize); - yyls = yyls1; - yyss = yyss1; - yyvs = yyvs1; - } + { + /* Give user a chance to reallocate the stack. Use copies of + * these so that the &'s don't force the real ones into + * memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + YYLTYPE *yyls1 = yyls; + + /* Each stack pointer address is followed by the size of the + * data in use in that stack, in bytes. This used to be a + * conditional around just the two extra args, but that might + * be undefined if yyoverflow is a macro. */ + yyoverflow (YY_ ("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yyls1, yysize * sizeof (*yylsp), &yystacksize); + yyls = yyls1; + yyss = yyss1; + yyvs = yyvs1; + } #else /* no yyoverflow */ # ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; + goto yyexhaustedlab; # else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss); - YYSTACK_RELOCATE (yyvs); - YYSTACK_RELOCATE (yyls); + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (!yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + YYSTACK_RELOCATE (yyls); # undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } # endif #endif /* no yyoverflow */ - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - yylsp = yyls + yysize - 1; + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + yylsp = yyls + yysize - 1; - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; } - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - goto yybackup; + goto yybackup; /*-----------. | yybackup. | `-----------*/ -yybackup: + yybackup: - /* Do appropriate processing given the current state. Read a - look-ahead token if we need one and don't already have one. */ + /* Do appropriate processing given the current state. Read a + * look-ahead token if we need one and don't already have one. */ - /* First try to decide what to do without reference to look-ahead token. */ - yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) - goto yydefault; + /* First try to decide what to do without reference to look-ahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; - /* Not known => get a look-ahead token if don't already have one. */ + /* Not known => get a look-ahead token if don't already have one. */ - /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ - if (yychar == YYEMPTY) + /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */ + if (yychar == YYEMPTY) { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; } - if (yychar <= YYEOF) + if (yychar <= YYEOF) { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); } - else + else { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); } - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) + /* If the proper action on seeing token YYTOKEN is to reduce or to + * detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; } - if (yyn == YYFINAL) - YYACCEPT; - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; + if (yyn == YYFINAL) + YYACCEPT; - /* Shift the look-ahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + /* Count tokens shifted since error; after three, turn off error + * status. */ + if (yyerrstatus) + yyerrstatus--; - /* Discard the shifted token unless it is eof. */ - if (yychar != YYEOF) - yychar = YYEMPTY; + /* Shift the look-ahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - yystate = yyn; - *++yyvsp = yylval; - *++yylsp = yylloc; - goto yynewstate; + /* Discard the shifted token unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + yystate = yyn; + *++yyvsp = yylval; + *++yylsp = yylloc; + goto yynewstate; /*-----------------------------------------------------------. | yydefault -- do the default action for the current state. | `-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - + yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; /*-----------------------------. | yyreduce -- Do a reduction. | `-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - /* Default location. */ - YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); - YY_REDUCE_PRINT (yyn); - switch (yyn) + yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + * `$$ = $1'. + * + * Otherwise, the following line sets YYVAL to garbage. + * This behavior is undocumented and Bison + * users should not rely upon it. Assigning to YYVAL + * unconditionally makes the parser a bit smaller, and it avoids a + * GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1 - yylen]; + + /* Default location. */ + YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); + YY_REDUCE_PRINT (yyn); + switch (yyn) { case 2: #line 213 "magic-interpreter-parser.y" - {;} - break; + {; + } + break; - case 3: + case 3: #line 215 "magic-interpreter-parser.y" - {;} - break; + {; + } + break; - case 4: + case 4: #line 220 "magic-interpreter-parser.y" - {;} - break; + {; + } + break; - case 5: + case 5: #line 222 "magic-interpreter-parser.y" - {;} - break; + {; + } + break; - case 6: + case 6: #line 227 "magic-interpreter-parser.y" - { (yyval.proc) = aCalloc(sizeof(proc_t), 1); ;} - break; + { + (yyval.proc) = aCalloc (sizeof (proc_t), 1);; + } + break; - case 7: + case 7: #line 229 "magic-interpreter-parser.y" - { (yyval.proc) = (yyvsp[(1) - (1)].proc); ;} - break; + { + (yyval.proc) = (yyvsp[(1) - (1)].proc);; + } + break; - case 8: + case 8: #line 233 "magic-interpreter-parser.y" - { (yyval.proc) = aCalloc(sizeof(proc_t), 1); - (yyval.proc)->args_nr = 1; - (yyval.proc)->args = malloc(sizeof(int)); - (yyval.proc)->args[0] = intern_id((yyvsp[(1) - (1)].s)); - ;} - break; - - case 9: + { + (yyval.proc) = aCalloc (sizeof (proc_t), 1); + (yyval.proc)->args_nr = 1; + (yyval.proc)->args = malloc (sizeof (int)); + (yyval.proc)->args[0] = intern_id ((yyvsp[(1) - (1)].s)); + ; + } + break; + + case 9: #line 239 "magic-interpreter-parser.y" - { (yyval.proc) = (yyvsp[(1) - (3)].proc); - (yyval.proc)->args = realloc((yyval.proc)->args, sizeof(int) * (1 + (yyval.proc)->args_nr)); - (yyval.proc)->args[(yyval.proc)->args_nr++] = intern_id((yyvsp[(3) - (3)].s)); - ;} - break; + { + (yyval.proc) = (yyvsp[(1) - (3)].proc); + (yyval.proc)->args = + realloc ((yyval.proc)->args, + sizeof (int) * (1 + (yyval.proc)->args_nr)); + (yyval.proc)->args[(yyval.proc)->args_nr++] = + intern_id ((yyvsp[(3) - (3)].s)); + ; + } + break; - case 10: + case 10: #line 246 "magic-interpreter-parser.y" - { - int var_id; - if (find_constant((yyvsp[(1) - (3)].s))) { - fail((yylsp[(1) - (3)]).first_line, 0, "Attempt to redefine constant `%s' as global\n", (yyvsp[(1) - (3)].s)); - free((yyvsp[(1) - (3)].s)); - } else { - var_id = intern_id((yyvsp[(1) - (3)].s)); - magic_eval(&magic_default_env, &magic_conf.vars[var_id], (yyvsp[(3) - (3)].expr)); - } - ;} - break; - - case 11: + { + int var_id; + if (find_constant ((yyvsp[(1) - (3)].s))) + { + fail ((yylsp[(1) - (3)]).first_line, 0, + "Attempt to redefine constant `%s' as global\n", + (yyvsp[(1) - (3)].s)); + free ((yyvsp[(1) - (3)].s)); + } + else + { + var_id = intern_id ((yyvsp[(1) - (3)].s)); + magic_eval (&magic_default_env, &magic_conf.vars[var_id], + (yyvsp[(3) - (3)].expr)); + } + ; + } + break; + + case 11: #line 257 "magic-interpreter-parser.y" - { - val_t var; - magic_eval(&magic_default_env, &var, (yyvsp[(4) - (4)].expr)); - bind_constant((yyvsp[(2) - (4)].s), &var, (yylsp[(1) - (4)]).first_line); - ;} - break; + { + val_t var; + magic_eval (&magic_default_env, &var, (yyvsp[(4) - (4)].expr)); + bind_constant ((yyvsp[(2) - (4)].s), &var, + (yylsp[(1) - (4)]).first_line); + ; + } + break; - case 12: + case 12: #line 263 "magic-interpreter-parser.y" - { - teleport_anchor_t *anchor = calloc(sizeof(teleport_anchor_t), 1); - anchor->name = (yyvsp[(2) - (6)].s); - anchor->invocation = magic_eval_str(&magic_default_env, (yyvsp[(4) - (6)].expr)); - anchor->location = (yyvsp[(6) - (6)].expr); - - if (!failed_flag) - add_teleport_anchor(anchor, (yylsp[(1) - (6)]).first_line); - failed_flag = 0; - ;} - break; - - case 13: + { + teleport_anchor_t *anchor = + calloc (sizeof (teleport_anchor_t), 1); + anchor->name = (yyvsp[(2) - (6)].s); + anchor->invocation = + magic_eval_str (&magic_default_env, (yyvsp[(4) - (6)].expr)); + anchor->location = (yyvsp[(6) - (6)].expr); + + if (!failed_flag) + add_teleport_anchor (anchor, (yylsp[(1) - (6)]).first_line); + failed_flag = 0; + ; + } + break; + + case 13: #line 274 "magic-interpreter-parser.y" - { - proc_t *proc = (yyvsp[(4) - (7)].proc); - proc->name = (yyvsp[(2) - (7)].s); - proc->body = (yyvsp[(7) - (7)].effect); - if (!failed_flag) - install_proc(proc); - failed_flag = 0; - ;} - break; - - case 14: + { + proc_t *proc = (yyvsp[(4) - (7)].proc); + proc->name = (yyvsp[(2) - (7)].s); + proc->body = (yyvsp[(7) - (7)].effect); + if (!failed_flag) + install_proc (proc); + failed_flag = 0; + ; + } + break; + + case 14: #line 283 "magic-interpreter-parser.y" - { spell_t *spell = (yyvsp[(8) - (8)].spell); - spell->name = (yyvsp[(3) - (8)].s); - spell->invocation = magic_eval_str(&magic_default_env, (yyvsp[(6) - (8)].expr)); - spell->arg = (yyvsp[(4) - (8)].spellarg_def).id; - spell->spellarg_ty = (yyvsp[(4) - (8)].spellarg_def).ty; - spell->flags = (yyvsp[(1) - (8)].i); - if (!failed_flag) - add_spell(spell, (yylsp[(1) - (8)]).first_line); - failed_flag = 0; - ;} - break; - - case 15: + { + spell_t *spell = (yyvsp[(8) - (8)].spell); + spell->name = (yyvsp[(3) - (8)].s); + spell->invocation = + magic_eval_str (&magic_default_env, (yyvsp[(6) - (8)].expr)); + spell->arg = (yyvsp[(4) - (8)].spellarg_def).id; + spell->spellarg_ty = (yyvsp[(4) - (8)].spellarg_def).ty; + spell->flags = (yyvsp[(1) - (8)].i); + if (!failed_flag) + add_spell (spell, (yylsp[(1) - (8)]).first_line); + failed_flag = 0; + ; + } + break; + + case 15: #line 295 "magic-interpreter-parser.y" - { (yyval.i) = 0; ;} - break; + { + (yyval.i) = 0;; + } + break; - case 16: + case 16: #line 297 "magic-interpreter-parser.y" - { if ((yyvsp[(2) - (2)].i) & SPELL_FLAG_LOCAL) - fail((yylsp[(1) - (2)]).first_line, (yylsp[(1) - (2)]).first_column, "`LOCAL' specified more than once"); - (yyval.i) = (yyvsp[(2) - (2)].i) | SPELL_FLAG_LOCAL; - ;} - break; + { + if ((yyvsp[(2) - (2)].i) & SPELL_FLAG_LOCAL) + fail ((yylsp[(1) - (2)]).first_line, + (yylsp[(1) - (2)]).first_column, + "`LOCAL' specified more than once"); + (yyval.i) = (yyvsp[(2) - (2)].i) | SPELL_FLAG_LOCAL; + ; + } + break; - case 17: + case 17: #line 302 "magic-interpreter-parser.y" - { if ((yyvsp[(2) - (2)].i) & SPELL_FLAG_NONMAGIC) - fail((yylsp[(1) - (2)]).first_line, (yylsp[(1) - (2)]).first_column, "`NONMAGIC' specified more than once"); - (yyval.i) = (yyvsp[(2) - (2)].i) | SPELL_FLAG_NONMAGIC; - ;} - break; + { + if ((yyvsp[(2) - (2)].i) & SPELL_FLAG_NONMAGIC) + fail ((yylsp[(1) - (2)]).first_line, + (yylsp[(1) - (2)]).first_column, + "`NONMAGIC' specified more than once"); + (yyval.i) = (yyvsp[(2) - (2)].i) | SPELL_FLAG_NONMAGIC; + ; + } + break; - case 18: + case 18: #line 307 "magic-interpreter-parser.y" - { if ((yyvsp[(2) - (2)].i) & SPELL_FLAG_SILENT) - fail((yylsp[(1) - (2)]).first_line, (yylsp[(1) - (2)]).first_column, "`SILENT' specified more than once"); - (yyval.i) = (yyvsp[(2) - (2)].i) | SPELL_FLAG_SILENT; - ;} - break; + { + if ((yyvsp[(2) - (2)].i) & SPELL_FLAG_SILENT) + fail ((yylsp[(1) - (2)]).first_line, + (yylsp[(1) - (2)]).first_column, + "`SILENT' specified more than once"); + (yyval.i) = (yyvsp[(2) - (2)].i) | SPELL_FLAG_SILENT; + ; + } + break; - case 19: + case 19: #line 314 "magic-interpreter-parser.y" - { (yyval.spellarg_def).ty = SPELLARG_NONE; ;} - break; + { + (yyval.spellarg_def).ty = SPELLARG_NONE;; + } + break; - case 20: + case 20: #line 316 "magic-interpreter-parser.y" - { (yyval.spellarg_def).id = intern_id((yyvsp[(2) - (5)].s)); - (yyval.spellarg_def).ty = (yyvsp[(4) - (5)].i); ;} - break; + { + (yyval.spellarg_def).id = intern_id ((yyvsp[(2) - (5)].s)); + (yyval.spellarg_def).ty = (yyvsp[(4) - (5)].i);; + } + break; - case 21: + case 21: #line 322 "magic-interpreter-parser.y" - { (yyval.i) = SPELLARG_PC; ;} - break; + { + (yyval.i) = SPELLARG_PC;; + } + break; - case 22: + case 22: #line 324 "magic-interpreter-parser.y" - { (yyval.i) = SPELLARG_STRING; ;} - break; + { + (yyval.i) = SPELLARG_STRING;; + } + break; - case 23: + case 23: #line 329 "magic-interpreter-parser.y" - { (yyval.value).ty = TY_DIR; - (yyval.value).v.v_int = (yyvsp[(1) - (1)].i); ;} - break; + { + (yyval.value).ty = TY_DIR; + (yyval.value).v.v_int = (yyvsp[(1) - (1)].i);; + } + break; - case 24: + case 24: #line 332 "magic-interpreter-parser.y" - { (yyval.value).ty = TY_INT; - (yyval.value).v.v_int = (yyvsp[(1) - (1)].i); ;} - break; + { + (yyval.value).ty = TY_INT; + (yyval.value).v.v_int = (yyvsp[(1) - (1)].i);; + } + break; - case 25: + case 25: #line 335 "magic-interpreter-parser.y" - { (yyval.value).ty = TY_STRING; - (yyval.value).v.v_string = (yyvsp[(1) - (1)].s); ;} - break; + { + (yyval.value).ty = TY_STRING; + (yyval.value).v.v_string = (yyvsp[(1) - (1)].s);; + } + break; - case 26: + case 26: #line 341 "magic-interpreter-parser.y" - { (yyval.expr) = magic_new_expr(EXPR_VAL); - (yyval.expr)->e.e_val = (yyvsp[(1) - (1)].value); ;} - break; + { + (yyval.expr) = magic_new_expr (EXPR_VAL); + (yyval.expr)->e.e_val = (yyvsp[(1) - (1)].value);; + } + break; - case 27: + case 27: #line 344 "magic-interpreter-parser.y" - { - val_t *val; - if ((val = find_constant((yyvsp[(1) - (1)].s)))) { - (yyval.expr) = magic_new_expr(EXPR_VAL); - (yyval.expr)->e.e_val = *val; - } else { - (yyval.expr) = magic_new_expr(EXPR_ID); - (yyval.expr)->e.e_id = intern_id((yyvsp[(1) - (1)].s)); - } - ;} - break; - - case 28: + { + val_t *val; + if ((val = find_constant ((yyvsp[(1) - (1)].s)))) + { + (yyval.expr) = magic_new_expr (EXPR_VAL); + (yyval.expr)->e.e_val = *val; + } + else + { + (yyval.expr) = magic_new_expr (EXPR_ID); + (yyval.expr)->e.e_id = intern_id ((yyvsp[(1) - (1)].s)); + } + ; + } + break; + + case 28: #line 355 "magic-interpreter-parser.y" - { (yyval.expr) = magic_new_expr(EXPR_AREA); - (yyval.expr)->e.e_area = (yyvsp[(1) - (1)].area); ;} - break; + { + (yyval.expr) = magic_new_expr (EXPR_AREA); + (yyval.expr)->e.e_area = (yyvsp[(1) - (1)].area);; + } + break; - case 29: + case 29: #line 358 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), "+", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), "+", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 30: + case 30: #line 360 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), "-", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), "-", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 31: + case 31: #line 362 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), "*", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), "*", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 32: + case 32: #line 364 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), "%", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), "%", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 33: + case 33: #line 366 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), "/", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), "/", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 34: + case 34: #line 368 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), ">", (yyvsp[(3) - (3)].expr), (yyvsp[(1) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), ">", (yyvsp[(3) - (3)].expr), + (yyvsp[(1) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 35: + case 35: #line 370 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), ">", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), ">", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 36: + case 36: #line 372 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), "&", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), "&", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 37: + case 37: #line 374 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), "^", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), "^", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 38: + case 38: #line 376 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), "|", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), "|", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 39: + case 39: #line 378 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), "<<", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), "<<", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 40: + case 40: #line 380 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), ">>", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), ">>", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 41: + case 41: #line 382 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), ">=", (yyvsp[(3) - (3)].expr), (yyvsp[(1) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), ">=", (yyvsp[(3) - (3)].expr), + (yyvsp[(1) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 42: + case 42: #line 384 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), ">=", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), ">=", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 43: + case 43: #line 386 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), "&&", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), "&&", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 44: + case 44: #line 388 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), "||", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), "||", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 45: + case 45: #line 390 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), "=", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), "=", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 46: + case 46: #line 392 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), "=", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), "=", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 47: + case 47: #line 394 "magic-interpreter-parser.y" - { BIN_EXPR((yyval.expr), "=", (yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); - (yyval.expr) = fun_expr("not", 1, &(yyval.expr), (yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column); ;} - break; + { + BIN_EXPR ((yyval.expr), "=", (yyvsp[(1) - (3)].expr), + (yyvsp[(3) - (3)].expr), (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column); + (yyval.expr) = + fun_expr ("not", 1, &(yyval.expr), + (yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column);; + } + break; - case 48: + case 48: #line 397 "magic-interpreter-parser.y" - { (yyval.expr) = fun_expr((yyvsp[(1) - (4)].s), (yyvsp[(3) - (4)].arg_list).args_nr, (yyvsp[(3) - (4)].arg_list).args, (yylsp[(1) - (4)]).first_line, (yylsp[(1) - (4)]).first_column); - if ((yyvsp[(3) - (4)].arg_list).args) - free((yyvsp[(3) - (4)].arg_list).args); - free((yyvsp[(1) - (4)].s)); ;} - break; + { + (yyval.expr) = + fun_expr ((yyvsp[(1) - (4)].s), + (yyvsp[(3) - (4)].arg_list).args_nr, + (yyvsp[(3) - (4)].arg_list).args, + (yylsp[(1) - (4)]).first_line, + (yylsp[(1) - (4)]).first_column); + if ((yyvsp[(3) - (4)].arg_list).args) + free ((yyvsp[(3) - (4)].arg_list).args); + free ((yyvsp[(1) - (4)].s));; + } + break; - case 49: + case 49: #line 402 "magic-interpreter-parser.y" - { (yyval.expr) = (yyvsp[(2) - (3)].expr); ;} - break; + { + (yyval.expr) = (yyvsp[(2) - (3)].expr);; + } + break; - case 50: + case 50: #line 404 "magic-interpreter-parser.y" - { (yyval.expr) = dot_expr((yyvsp[(1) - (3)].expr), intern_id((yyvsp[(3) - (3)].s))); ;} - break; + { + (yyval.expr) = + dot_expr ((yyvsp[(1) - (3)].expr), + intern_id ((yyvsp[(3) - (3)].s)));; + } + break; - case 51: + case 51: #line 408 "magic-interpreter-parser.y" - { (yyval.arg_list).args_nr = 0; ;} - break; + { + (yyval.arg_list).args_nr = 0;; + } + break; - case 52: + case 52: #line 410 "magic-interpreter-parser.y" - { (yyval.arg_list) = (yyvsp[(1) - (1)].arg_list) ;} - break; + { + (yyval.arg_list) = (yyvsp[(1) - (1)].arg_list); + } + break; - case 53: + case 53: #line 415 "magic-interpreter-parser.y" - { (yyval.arg_list).args = aCalloc(sizeof(expr_t *), 1); - (yyval.arg_list).args_nr = 1; - (yyval.arg_list).args[0] = (yyvsp[(1) - (1)].expr); - ;} - break; + { + (yyval.arg_list).args = aCalloc (sizeof (expr_t *), 1); + (yyval.arg_list).args_nr = 1; + (yyval.arg_list).args[0] = (yyvsp[(1) - (1)].expr); + ; + } + break; - case 54: + case 54: #line 420 "magic-interpreter-parser.y" - { (yyval.arg_list).args = realloc((yyval.arg_list).args, (1 + (yyval.arg_list).args_nr) * sizeof(expr_t *)); - (yyval.arg_list).args[(yyval.arg_list).args_nr++] = (yyvsp[(3) - (3)].expr); - ;} - break; + { + (yyval.arg_list).args = + realloc ((yyval.arg_list).args, + (1 + (yyval.arg_list).args_nr) * sizeof (expr_t *)); + (yyval.arg_list).args[(yyval.arg_list).args_nr++] = + (yyvsp[(3) - (3)].expr); + ; + } + break; - case 55: + case 55: #line 427 "magic-interpreter-parser.y" - { (yyval.location).m = (yyvsp[(3) - (8)].expr); (yyval.location).x = (yyvsp[(5) - (8)].expr); (yyval.location).y = (yyvsp[(7) - (8)].expr); ;} - break; + { + (yyval.location).m = (yyvsp[(3) - (8)].expr); + (yyval.location).x = (yyvsp[(5) - (8)].expr); + (yyval.location).y = (yyvsp[(7) - (8)].expr);; + } + break; - case 56: + case 56: #line 431 "magic-interpreter-parser.y" - { (yyval.area).ty = AREA_LOCATION; - (yyval.area).a.a_loc = (yyvsp[(1) - (1)].location); - ;} - break; + { + (yyval.area).ty = AREA_LOCATION; + (yyval.area).a.a_loc = (yyvsp[(1) - (1)].location); + ; + } + break; - case 57: + case 57: #line 435 "magic-interpreter-parser.y" - { (yyval.area).ty = AREA_RECT; - (yyval.area).a.a_rect.loc = (yyvsp[(1) - (8)].location); - (yyval.area).a.a_rect.width = (yyvsp[(5) - (8)].expr); - (yyval.area).a.a_rect.height = (yyvsp[(7) - (8)].expr); - ;} - break; - - case 58: + { + (yyval.area).ty = AREA_RECT; + (yyval.area).a.a_rect.loc = (yyvsp[(1) - (8)].location); + (yyval.area).a.a_rect.width = (yyvsp[(5) - (8)].expr); + (yyval.area).a.a_rect.height = (yyvsp[(7) - (8)].expr); + ; + } + break; + + case 58: #line 441 "magic-interpreter-parser.y" - { (yyval.area).ty = AREA_BAR; - (yyval.area).a.a_bar.loc = (yyvsp[(1) - (9)].location); - (yyval.area).a.a_bar.width = (yyvsp[(6) - (9)].expr); - (yyval.area).a.a_bar.depth = (yyvsp[(8) - (9)].expr); - (yyval.area).a.a_bar.dir = (yyvsp[(3) - (9)].expr); - ;} - break; - - case 59: + { + (yyval.area).ty = AREA_BAR; + (yyval.area).a.a_bar.loc = (yyvsp[(1) - (9)].location); + (yyval.area).a.a_bar.width = (yyvsp[(6) - (9)].expr); + (yyval.area).a.a_bar.depth = (yyvsp[(8) - (9)].expr); + (yyval.area).a.a_bar.dir = (yyvsp[(3) - (9)].expr); + ; + } + break; + + case 59: #line 451 "magic-interpreter-parser.y" - { (yyval.spell) = new_spell((yyvsp[(1) - (1)].spellguard)); ;} - break; + { + (yyval.spell) = new_spell ((yyvsp[(1) - (1)].spellguard));; + } + break; - case 60: + case 60: #line 453 "magic-interpreter-parser.y" - { (yyval.spell) = new_spell((yyvsp[(4) - (4)].spellguard)); - (yyval.spell)->letdefs_nr = (yyvsp[(2) - (4)].letdefs).letdefs_nr; - (yyval.spell)->letdefs = (yyvsp[(2) - (4)].letdefs).letdefs; - (yyval.spell)->spellguard = (yyvsp[(4) - (4)].spellguard); - ;} - break; - - case 61: + { + (yyval.spell) = new_spell ((yyvsp[(4) - (4)].spellguard)); + (yyval.spell)->letdefs_nr = (yyvsp[(2) - (4)].letdefs).letdefs_nr; + (yyval.spell)->letdefs = (yyvsp[(2) - (4)].letdefs).letdefs; + (yyval.spell)->spellguard = (yyvsp[(4) - (4)].spellguard); + ; + } + break; + + case 61: #line 462 "magic-interpreter-parser.y" - { (yyval.letdefs).letdefs_nr = 0; - (yyval.letdefs).letdefs = (letdef_t *) malloc(1); - ;} - break; + { + (yyval.letdefs).letdefs_nr = 0; + (yyval.letdefs).letdefs = (letdef_t *) malloc (1); + ; + } + break; - case 62: + case 62: #line 466 "magic-interpreter-parser.y" - { (yyval.letdefs) = (yyvsp[(1) - (3)].letdefs); - (yyval.letdefs).letdefs_nr++; - (yyval.letdefs).letdefs = realloc((yyval.letdefs).letdefs, sizeof(letdef_t) * (yyval.letdefs).letdefs_nr); - (yyval.letdefs).letdefs[(yyvsp[(1) - (3)].letdefs).letdefs_nr] = (yyvsp[(2) - (3)].vardef); - ;} - break; - - case 63: + { + (yyval.letdefs) = (yyvsp[(1) - (3)].letdefs); + (yyval.letdefs).letdefs_nr++; + (yyval.letdefs).letdefs = + realloc ((yyval.letdefs).letdefs, + sizeof (letdef_t) * (yyval.letdefs).letdefs_nr); + (yyval.letdefs).letdefs[(yyvsp[(1) - (3)].letdefs).letdefs_nr] = + (yyvsp[(2) - (3)].vardef); + ; + } + break; + + case 63: #line 475 "magic-interpreter-parser.y" - { - if (find_constant((yyvsp[(1) - (3)].s))) { - fail((yylsp[(1) - (3)]).first_line, (yylsp[(1) - (3)]).first_column, "Attempt to re-define constant `%s' as LET-bound variable.\n", (yyvsp[(1) - (3)].s)); - free((yyvsp[(1) - (3)].s)); - } else { - (yyval.vardef).id = intern_id((yyvsp[(1) - (3)].s)); - (yyval.vardef).expr = (yyvsp[(3) - (3)].expr); - } - ;} - break; - - case 64: + { + if (find_constant ((yyvsp[(1) - (3)].s))) + { + fail ((yylsp[(1) - (3)]).first_line, + (yylsp[(1) - (3)]).first_column, + "Attempt to re-define constant `%s' as LET-bound variable.\n", + (yyvsp[(1) - (3)].s)); + free ((yyvsp[(1) - (3)].s)); + } + else + { + (yyval.vardef).id = intern_id ((yyvsp[(1) - (3)].s)); + (yyval.vardef).expr = (yyvsp[(3) - (3)].expr); + } + ; + } + break; + + case 64: #line 488 "magic-interpreter-parser.y" - { (yyval.spellguard) = (yyvsp[(1) - (1)].spellguard); ;} - break; + { + (yyval.spellguard) = (yyvsp[(1) - (1)].spellguard);; + } + break; - case 65: + case 65: #line 490 "magic-interpreter-parser.y" - { spellguard_t *sg = new_spellguard(SPELLGUARD_CHOICE); - sg->next = (yyvsp[(1) - (3)].spellguard); - sg->s.s_alt = (yyvsp[(3) - (3)].spellguard); - (yyval.spellguard) = sg; - ;} - break; - - case 66: + { + spellguard_t *sg = new_spellguard (SPELLGUARD_CHOICE); + sg->next = (yyvsp[(1) - (3)].spellguard); + sg->s.s_alt = (yyvsp[(3) - (3)].spellguard); + (yyval.spellguard) = sg; + ; + } + break; + + case 66: #line 499 "magic-interpreter-parser.y" - { (yyval.spellguard) = spellguard_implication((yyvsp[(1) - (3)].spellguard), (yyvsp[(3) - (3)].spellguard)); ;} - break; + { + (yyval.spellguard) = + spellguard_implication ((yyvsp[(1) - (3)].spellguard), + (yyvsp[(3) - (3)].spellguard));; + } + break; - case 67: + case 67: #line 501 "magic-interpreter-parser.y" - { (yyval.spellguard) = (yyvsp[(2) - (3)].spellguard); ;} - break; + { + (yyval.spellguard) = (yyvsp[(2) - (3)].spellguard);; + } + break; - case 68: + case 68: #line 503 "magic-interpreter-parser.y" - { spellguard_t *sg = new_spellguard(SPELLGUARD_EFFECT); - sg->s.s_effect.effect = (yyvsp[(2) - (4)].effect); - sg->s.s_effect.at_trigger = (yyvsp[(3) - (4)].effect); - sg->s.s_effect.at_end = (yyvsp[(4) - (4)].effect); - (yyval.spellguard) = sg; - ;} - break; - - case 69: + { + spellguard_t *sg = new_spellguard (SPELLGUARD_EFFECT); + sg->s.s_effect.effect = (yyvsp[(2) - (4)].effect); + sg->s.s_effect.at_trigger = (yyvsp[(3) - (4)].effect); + sg->s.s_effect.at_end = (yyvsp[(4) - (4)].effect); + (yyval.spellguard) = sg; + ; + } + break; + + case 69: #line 513 "magic-interpreter-parser.y" - { (yyval.effect) = NULL; ;} - break; + { + (yyval.effect) = NULL;; + } + break; - case 70: + case 70: #line 515 "magic-interpreter-parser.y" - { (yyval.effect) = (yyvsp[(2) - (2)].effect); ;} - break; + { + (yyval.effect) = (yyvsp[(2) - (2)].effect);; + } + break; - case 71: + case 71: #line 520 "magic-interpreter-parser.y" - { (yyval.effect) = NULL; ;} - break; + { + (yyval.effect) = NULL;; + } + break; - case 72: + case 72: #line 522 "magic-interpreter-parser.y" - { (yyval.effect) = (yyvsp[(2) - (2)].effect); ;} - break; + { + (yyval.effect) = (yyvsp[(2) - (2)].effect);; + } + break; - case 73: + case 73: #line 527 "magic-interpreter-parser.y" - { (yyval.spellguard) = (yyvsp[(1) - (1)].spellguard); ;} - break; + { + (yyval.spellguard) = (yyvsp[(1) - (1)].spellguard);; + } + break; - case 74: + case 74: #line 529 "magic-interpreter-parser.y" - { spellguard_t *sg = new_spellguard(SPELLGUARD_CHOICE); - sg->next = (yyvsp[(1) - (3)].spellguard); - sg->s.s_alt = (yyvsp[(3) - (3)].spellguard); - (yyval.spellguard) = sg; - ;} - break; - - case 75: + { + spellguard_t *sg = new_spellguard (SPELLGUARD_CHOICE); + sg->next = (yyvsp[(1) - (3)].spellguard); + sg->s.s_alt = (yyvsp[(3) - (3)].spellguard); + (yyval.spellguard) = sg; + ; + } + break; + + case 75: #line 535 "magic-interpreter-parser.y" - { (yyval.spellguard) = (yyvsp[(2) - (3)].spellguard); ;} - break; + { + (yyval.spellguard) = (yyvsp[(2) - (3)].spellguard);; + } + break; - case 76: + case 76: #line 540 "magic-interpreter-parser.y" - { (yyval.spellguard) = (yyvsp[(1) - (1)].spellguard); ;} - break; + { + (yyval.spellguard) = (yyvsp[(1) - (1)].spellguard);; + } + break; - case 77: + case 77: #line 542 "magic-interpreter-parser.y" - { (yyval.spellguard) = spellguard_implication ((yyvsp[(1) - (3)].spellguard), (yyvsp[(3) - (3)].spellguard)); ;} - break; + { + (yyval.spellguard) = + spellguard_implication ((yyvsp[(1) - (3)].spellguard), + (yyvsp[(3) - (3)].spellguard));; + } + break; - case 78: + case 78: #line 547 "magic-interpreter-parser.y" - { (yyval.spellguard) = new_spellguard(SPELLGUARD_CONDITION); - (yyval.spellguard)->s.s_condition = (yyvsp[(2) - (2)].expr); - ;} - break; + { + (yyval.spellguard) = new_spellguard (SPELLGUARD_CONDITION); + (yyval.spellguard)->s.s_condition = (yyvsp[(2) - (2)].expr); + ; + } + break; - case 79: + case 79: #line 551 "magic-interpreter-parser.y" - { (yyval.spellguard) = new_spellguard(SPELLGUARD_CATALYSTS); - (yyval.spellguard)->s.s_catalysts = (yyvsp[(2) - (2)].components); - ;} - break; + { + (yyval.spellguard) = new_spellguard (SPELLGUARD_CATALYSTS); + (yyval.spellguard)->s.s_catalysts = (yyvsp[(2) - (2)].components); + ; + } + break; - case 80: + case 80: #line 555 "magic-interpreter-parser.y" - { (yyval.spellguard) = new_spellguard(SPELLGUARD_COMPONENTS); - (yyval.spellguard)->s.s_components = (yyvsp[(2) - (2)].components); - ;} - break; + { + (yyval.spellguard) = new_spellguard (SPELLGUARD_COMPONENTS); + (yyval.spellguard)->s.s_components = + (yyvsp[(2) - (2)].components); + ; + } + break; - case 81: + case 81: #line 559 "magic-interpreter-parser.y" - { (yyval.spellguard) = new_spellguard(SPELLGUARD_MANA); - (yyval.spellguard)->s.s_mana = (yyvsp[(2) - (2)].expr); - ;} - break; + { + (yyval.spellguard) = new_spellguard (SPELLGUARD_MANA); + (yyval.spellguard)->s.s_mana = (yyvsp[(2) - (2)].expr); + ; + } + break; - case 82: + case 82: #line 563 "magic-interpreter-parser.y" - { (yyval.spellguard) = new_spellguard(SPELLGUARD_CASTTIME); - (yyval.spellguard)->s.s_casttime = (yyvsp[(2) - (2)].expr); - ;} - break; + { + (yyval.spellguard) = new_spellguard (SPELLGUARD_CASTTIME); + (yyval.spellguard)->s.s_casttime = (yyvsp[(2) - (2)].expr); + ; + } + break; - case 83: + case 83: #line 570 "magic-interpreter-parser.y" - { (yyval.components) = (yyvsp[(2) - (3)].components); ;} - break; + { + (yyval.components) = (yyvsp[(2) - (3)].components);; + } + break; - case 84: + case 84: #line 575 "magic-interpreter-parser.y" - { (yyval.components) = NULL; - magic_add_component(&(yyval.components), (yyvsp[(1) - (1)].component).id, (yyvsp[(1) - (1)].component).count); - ;} - break; + { + (yyval.components) = NULL; + magic_add_component (&(yyval.components), + (yyvsp[(1) - (1)].component).id, + (yyvsp[(1) - (1)].component).count); + ; + } + break; - case 85: + case 85: #line 579 "magic-interpreter-parser.y" - { (yyval.components) = (yyvsp[(1) - (3)].components); - magic_add_component(&(yyval.components), (yyvsp[(3) - (3)].component).id, (yyvsp[(3) - (3)].component).count); - ;} - break; + { + (yyval.components) = (yyvsp[(1) - (3)].components); + magic_add_component (&(yyval.components), + (yyvsp[(3) - (3)].component).id, + (yyvsp[(3) - (3)].component).count); + ; + } + break; - case 86: + case 86: #line 586 "magic-interpreter-parser.y" - { (yyval.component).id = (yyvsp[(3) - (3)].i); (yyval.component).count = (yyvsp[(1) - (3)].i); ;} - break; + { + (yyval.component).id = (yyvsp[(3) - (3)].i); + (yyval.component).count = (yyvsp[(1) - (3)].i);; + } + break; - case 87: + case 87: #line 588 "magic-interpreter-parser.y" - { (yyval.component).id = (yyvsp[(1) - (1)].i); (yyval.component).count = 1; ;} - break; + { + (yyval.component).id = (yyvsp[(1) - (1)].i); + (yyval.component).count = 1;; + } + break; - case 88: + case 88: #line 593 "magic-interpreter-parser.y" - { struct item_data *item = itemdb_searchname((yyvsp[(1) - (1)].s)); - if (!item) { - fail ((yylsp[(1) - (1)]).first_line, (yylsp[(1) - (1)]).first_column, "Unknown item `%s'\n", (yyvsp[(1) - (1)].s)); - (yyval.i) = 0; - } else - (yyval.i) = item->nameid; - free ((yyvsp[(1) - (1)].s)); - ;} - break; - - case 89: + { + struct item_data *item = itemdb_searchname ((yyvsp[(1) - (1)].s)); + if (!item) + { + fail ((yylsp[(1) - (1)]).first_line, + (yylsp[(1) - (1)]).first_column, "Unknown item `%s'\n", + (yyvsp[(1) - (1)].s)); + (yyval.i) = 0; + } + else + (yyval.i) = item->nameid; + free ((yyvsp[(1) - (1)].s)); + ; + } + break; + + case 89: #line 602 "magic-interpreter-parser.y" - { (yyval.i) = (yyvsp[(1) - (1)].i); ;} - break; + { + (yyval.i) = (yyvsp[(1) - (1)].i);; + } + break; - case 90: + case 90: #line 607 "magic-interpreter-parser.y" - { (yyval.i) = FOREACH_FILTER_PC; ;} - break; + { + (yyval.i) = FOREACH_FILTER_PC;; + } + break; - case 91: + case 91: #line 609 "magic-interpreter-parser.y" - { (yyval.i) = FOREACH_FILTER_MOB; ;} - break; + { + (yyval.i) = FOREACH_FILTER_MOB;; + } + break; - case 92: + case 92: #line 611 "magic-interpreter-parser.y" - { (yyval.i) = FOREACH_FILTER_ENTITY; ;} - break; + { + (yyval.i) = FOREACH_FILTER_ENTITY;; + } + break; - case 93: + case 93: #line 613 "magic-interpreter-parser.y" - { (yyval.i) = FOREACH_FILTER_SPELL; ;} - break; + { + (yyval.i) = FOREACH_FILTER_SPELL;; + } + break; - case 94: + case 94: #line 615 "magic-interpreter-parser.y" - { (yyval.i) = FOREACH_FILTER_TARGET; ;} - break; + { + (yyval.i) = FOREACH_FILTER_TARGET;; + } + break; - case 95: + case 95: #line 617 "magic-interpreter-parser.y" - { (yyval.i) = FOREACH_FILTER_NPC; ;} - break; + { + (yyval.i) = FOREACH_FILTER_NPC;; + } + break; - case 96: + case 96: #line 622 "magic-interpreter-parser.y" - { (yyval.effect) = (yyvsp[(2) - (3)].effect); ;} - break; + { + (yyval.effect) = (yyvsp[(2) - (3)].effect);; + } + break; - case 97: + case 97: #line 624 "magic-interpreter-parser.y" - { (yyval.effect) = new_effect(EFFECT_SKIP); ;} - break; + { + (yyval.effect) = new_effect (EFFECT_SKIP);; + } + break; - case 98: + case 98: #line 626 "magic-interpreter-parser.y" - { (yyval.effect) = new_effect(EFFECT_ABORT); ;} - break; + { + (yyval.effect) = new_effect (EFFECT_ABORT);; + } + break; - case 99: + case 99: #line 628 "magic-interpreter-parser.y" - { (yyval.effect) = new_effect(EFFECT_END); ;} - break; + { + (yyval.effect) = new_effect (EFFECT_END);; + } + break; - case 100: + case 100: #line 630 "magic-interpreter-parser.y" - { (yyval.effect) = new_effect(EFFECT_BREAK); ;} - break; + { + (yyval.effect) = new_effect (EFFECT_BREAK);; + } + break; - case 101: + case 101: #line 632 "magic-interpreter-parser.y" - { - if (find_constant((yyvsp[(1) - (4)].s))) { - fail((yylsp[(1) - (4)]).first_line, (yylsp[(1) - (4)]).first_column, "Attempt to re-define constant `%s' in assignment.", (yyvsp[(1) - (4)].s)); - free((yyvsp[(1) - (4)].s)); - } else { - (yyval.effect) = new_effect(EFFECT_ASSIGN); - (yyval.effect)->e.e_assign.id = intern_id((yyvsp[(1) - (4)].s)); - (yyval.effect)->e.e_assign.expr = (yyvsp[(3) - (4)].expr); - } - ;} - break; - - case 102: + { + if (find_constant ((yyvsp[(1) - (4)].s))) + { + fail ((yylsp[(1) - (4)]).first_line, + (yylsp[(1) - (4)]).first_column, + "Attempt to re-define constant `%s' in assignment.", + (yyvsp[(1) - (4)].s)); + free ((yyvsp[(1) - (4)].s)); + } + else + { + (yyval.effect) = new_effect (EFFECT_ASSIGN); + (yyval.effect)->e.e_assign.id = + intern_id ((yyvsp[(1) - (4)].s)); + (yyval.effect)->e.e_assign.expr = (yyvsp[(3) - (4)].expr); + } + ; + } + break; + + case 102: #line 643 "magic-interpreter-parser.y" - { (yyval.effect) = new_effect(EFFECT_FOREACH); - (yyval.effect)->e.e_foreach.id = intern_id((yyvsp[(3) - (7)].s)); - (yyval.effect)->e.e_foreach.area = (yyvsp[(5) - (7)].expr); - (yyval.effect)->e.e_foreach.body = (yyvsp[(7) - (7)].effect); - (yyval.effect)->e.e_foreach.filter = (yyvsp[(2) - (7)].i); - ;} - break; - - case 103: + { + (yyval.effect) = new_effect (EFFECT_FOREACH); + (yyval.effect)->e.e_foreach.id = intern_id ((yyvsp[(3) - (7)].s)); + (yyval.effect)->e.e_foreach.area = (yyvsp[(5) - (7)].expr); + (yyval.effect)->e.e_foreach.body = (yyvsp[(7) - (7)].effect); + (yyval.effect)->e.e_foreach.filter = (yyvsp[(2) - (7)].i); + ; + } + break; + + case 103: #line 650 "magic-interpreter-parser.y" - { (yyval.effect) = new_effect(EFFECT_FOR); - (yyval.effect)->e.e_for.id = intern_id((yyvsp[(2) - (8)].s)); - (yyval.effect)->e.e_for.start = (yyvsp[(4) - (8)].expr); - (yyval.effect)->e.e_for.stop = (yyvsp[(6) - (8)].expr); - (yyval.effect)->e.e_for.body = (yyvsp[(8) - (8)].effect); - ;} - break; - - case 104: + { + (yyval.effect) = new_effect (EFFECT_FOR); + (yyval.effect)->e.e_for.id = intern_id ((yyvsp[(2) - (8)].s)); + (yyval.effect)->e.e_for.start = (yyvsp[(4) - (8)].expr); + (yyval.effect)->e.e_for.stop = (yyvsp[(6) - (8)].expr); + (yyval.effect)->e.e_for.body = (yyvsp[(8) - (8)].effect); + ; + } + break; + + case 104: #line 657 "magic-interpreter-parser.y" - { (yyval.effect) = new_effect(EFFECT_IF); - (yyval.effect)->e.e_if.cond = (yyvsp[(2) - (6)].expr); - (yyval.effect)->e.e_if.true_branch = (yyvsp[(4) - (6)].effect); - (yyval.effect)->e.e_if.false_branch = (yyvsp[(6) - (6)].effect); - ;} - break; - - case 105: + { + (yyval.effect) = new_effect (EFFECT_IF); + (yyval.effect)->e.e_if.cond = (yyvsp[(2) - (6)].expr); + (yyval.effect)->e.e_if.true_branch = (yyvsp[(4) - (6)].effect); + (yyval.effect)->e.e_if.false_branch = (yyvsp[(6) - (6)].effect); + ; + } + break; + + case 105: #line 663 "magic-interpreter-parser.y" - { (yyval.effect) = new_effect(EFFECT_IF); - (yyval.effect)->e.e_if.cond = (yyvsp[(2) - (4)].expr); - (yyval.effect)->e.e_if.true_branch = (yyvsp[(4) - (4)].effect); - (yyval.effect)->e.e_if.false_branch = new_effect(EFFECT_SKIP); - ;} - break; - - case 106: + { + (yyval.effect) = new_effect (EFFECT_IF); + (yyval.effect)->e.e_if.cond = (yyvsp[(2) - (4)].expr); + (yyval.effect)->e.e_if.true_branch = (yyvsp[(4) - (4)].effect); + (yyval.effect)->e.e_if.false_branch = new_effect (EFFECT_SKIP); + ; + } + break; + + case 106: #line 669 "magic-interpreter-parser.y" - { (yyval.effect) = new_effect(EFFECT_SLEEP); - (yyval.effect)->e.e_sleep = (yyvsp[(2) - (3)].expr); - ;} - break; + { + (yyval.effect) = new_effect (EFFECT_SLEEP); + (yyval.effect)->e.e_sleep = (yyvsp[(2) - (3)].expr); + ; + } + break; - case 107: + case 107: #line 673 "magic-interpreter-parser.y" - { (yyval.effect) = op_effect((yyvsp[(1) - (5)].s), (yyvsp[(3) - (5)].arg_list).args_nr, (yyvsp[(3) - (5)].arg_list).args, (yylsp[(1) - (5)]).first_line, (yylsp[(1) - (5)]).first_column); - free((yyvsp[(1) - (5)].s)); - ;} - break; + { + (yyval.effect) = + op_effect ((yyvsp[(1) - (5)].s), + (yyvsp[(3) - (5)].arg_list).args_nr, + (yyvsp[(3) - (5)].arg_list).args, + (yylsp[(1) - (5)]).first_line, + (yylsp[(1) - (5)]).first_column); + free ((yyvsp[(1) - (5)].s)); + ; + } + break; - case 108: + case 108: #line 677 "magic-interpreter-parser.y" - { (yyval.effect) = new_effect(EFFECT_SCRIPT); - (yyval.effect)->e.e_script = parse_script((unsigned char *) (yyvsp[(1) - (1)].s), (yylsp[(1) - (1)]).first_line); - free((yyvsp[(1) - (1)].s)); - if ((yyval.effect)->e.e_script == NULL) - fail((yylsp[(1) - (1)]).first_line, (yylsp[(1) - (1)]).first_column, "Failed to compile script\n"); - ;} - break; - - case 109: + { + (yyval.effect) = new_effect (EFFECT_SCRIPT); + (yyval.effect)->e.e_script = + parse_script ((unsigned char *) (yyvsp[(1) - (1)].s), + (yylsp[(1) - (1)]).first_line); + free ((yyvsp[(1) - (1)].s)); + if ((yyval.effect)->e.e_script == NULL) + fail ((yylsp[(1) - (1)]).first_line, + (yylsp[(1) - (1)]).first_column, + "Failed to compile script\n"); + ; + } + break; + + case 109: #line 684 "magic-interpreter-parser.y" - { (yyval.effect) = call_proc((yyvsp[(2) - (6)].s), (yyvsp[(4) - (6)].arg_list).args_nr, (yyvsp[(4) - (6)].arg_list).args, (yylsp[(1) - (6)]).first_line, (yylsp[(1) - (6)]).first_column); - free((yyvsp[(2) - (6)].s)); - ;} - break; + { + (yyval.effect) = + call_proc ((yyvsp[(2) - (6)].s), + (yyvsp[(4) - (6)].arg_list).args_nr, + (yyvsp[(4) - (6)].arg_list).args, + (yylsp[(1) - (6)]).first_line, + (yylsp[(1) - (6)]).first_column); + free ((yyvsp[(2) - (6)].s)); + ; + } + break; - case 110: + case 110: #line 690 "magic-interpreter-parser.y" - { (yyval.effect) = new_effect(EFFECT_SKIP); ;} - break; + { + (yyval.effect) = new_effect (EFFECT_SKIP);; + } + break; - case 111: + case 111: #line 692 "magic-interpreter-parser.y" - { (yyval.effect) = set_effect_continuation((yyvsp[(1) - (3)].effect), (yyvsp[(3) - (3)].effect)); ;} - break; - + { + (yyval.effect) = + set_effect_continuation ((yyvsp[(1) - (3)].effect), + (yyvsp[(3) - (3)].effect));; + } + break; /* Line 1267 of yacc.c. */ #line 2645 "magic-interpreter-parser.c" - default: break; + default: + break; } - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - *++yyvsp = yyval; - *++yylsp = yyloc; + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ + *++yyvsp = yyval; + *++yylsp = yyloc; - yyn = yyr1[yyn]; + /* Now `shift' the result of the reduction. Determine what state + * that goes to, based on the state we popped back to and the rule + * number reduced by. */ - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; + yyn = yyr1[yyn]; - goto yynewstate; + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + goto yynewstate; /*------------------------------------. | yyerrlab -- here on detecting error | `------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) + yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) { - ++yynerrs; + ++yynerrs; #if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); + yyerror (YY_ ("syntax error")); #else - { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } - } + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (!(yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (yymsg); + } + else + { + yyerror (YY_ ("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } #endif } - yyerror_range[0] = yylloc; + yyerror_range[0] = yylloc; - if (yyerrstatus == 3) + if (yyerrstatus == 3) { - /* If just tried and failed to reuse look-ahead token after an - error, discard it. */ - - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval, &yylloc); - yychar = YYEMPTY; - } + /* If just tried and failed to reuse look-ahead token after an + * error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", yytoken, &yylval, &yylloc); + yychar = YYEMPTY; + } } - /* Else will try to reuse look-ahead token after shifting the error - token. */ - goto yyerrlab1; - + /* Else will try to reuse look-ahead token after shifting the error + * token. */ + goto yyerrlab1; /*---------------------------------------------------. | yyerrorlab -- error raised explicitly by YYERROR. | `---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - yyerror_range[0] = yylsp[1-yylen]; - /* Do not reclaim the symbols of the rule which action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - + yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + * YYERROR and the label yyerrorlab therefore never appears in user + * code. */ + if ( /*CONSTCOND*/ 0) + goto yyerrorlab; + + yyerror_range[0] = yylsp[1 - yylen]; + /* Do not reclaim the symbols of the rule which action triggered + * this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; /*-------------------------------------------------------------. | yyerrlab1 -- common code for both syntax error and YYERROR. | `-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ + yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ - for (;;) + for (;;) { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - yyerror_range[0] = *yylsp; - yydestruct ("Error: popping", - yystos[yystate], yyvsp, yylsp); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } - if (yyn == YYFINAL) - YYACCEPT; + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + yyerror_range[0] = *yylsp; + yydestruct ("Error: popping", yystos[yystate], yyvsp, yylsp); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } - *++yyvsp = yylval; + if (yyn == YYFINAL) + YYACCEPT; - yyerror_range[1] = yylloc; - /* Using YYLLOC is tempting, but would change the location of - the look-ahead. YYLOC is available though. */ - YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2); - *++yylsp = yyloc; + *++yyvsp = yylval; - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + yyerror_range[1] = yylloc; + /* Using YYLLOC is tempting, but would change the location of + * the look-ahead. YYLOC is available though. */ + YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2); + *++yylsp = yyloc; - yystate = yyn; - goto yynewstate; + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + yystate = yyn; + goto yynewstate; /*-------------------------------------. | yyacceptlab -- YYACCEPT comes here. | `-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; + yyacceptlab: + yyresult = 0; + goto yyreturn; /*-----------------------------------. | yyabortlab -- YYABORT comes here. | `-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; + yyabortlab: + yyresult = 1; + goto yyreturn; #ifndef yyoverflow /*-------------------------------------------------. | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ + yyexhaustedlab: + yyerror (YY_ ("memory exhausted")); + yyresult = 2; + /* Fall through. */ #endif -yyreturn: - if (yychar != YYEOF && yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval, &yylloc); - /* Do not reclaim the symbols of the rule which action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) + yyreturn: + if (yychar != YYEOF && yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, &yylloc); + /* Do not reclaim the symbols of the rule which action triggered + * this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp, yylsp); - YYPOPSTACK (1); + yydestruct ("Cleanup: popping", yystos[*yyssp], yyvsp, yylsp); + YYPOPSTACK (1); } #ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); + if (yyss != yyssa) + YYSTACK_FREE (yyss); #endif #if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); #endif - /* Make sure YYID is used. */ - return YYID (yyresult); + /* Make sure YYID is used. */ + return YYID (yyresult); } - #line 696 "magic-interpreter-parser.y" - /* We do incremental realloc here to store our results. Since this happens only once * during startup for a relatively manageable set of configs, it should be fine. */ -static int -intern_id(char *id_name) +static int intern_id (char *id_name) { - int i; + int i; - for (i = 0; i < magic_conf.vars_nr; i++) - if (!strcmp(id_name, magic_conf.var_name[i])) { - free(id_name); - return i; - } + for (i = 0; i < magic_conf.vars_nr; i++) + if (!strcmp (id_name, magic_conf.var_name[i])) + { + free (id_name); + return i; + } - /* Must add new */ - i = magic_conf.vars_nr++; - magic_conf.var_name = realloc(magic_conf.var_name, magic_conf.vars_nr * sizeof(char *)); - magic_conf.var_name[i] = id_name; - magic_conf.vars = realloc(magic_conf.vars, magic_conf.vars_nr * sizeof(val_t)); - magic_conf.vars[i].ty = TY_UNDEF; + /* Must add new */ + i = magic_conf.vars_nr++; + magic_conf.var_name = + realloc (magic_conf.var_name, magic_conf.vars_nr * sizeof (char *)); + magic_conf.var_name[i] = id_name; + magic_conf.vars = + realloc (magic_conf.vars, magic_conf.vars_nr * sizeof (val_t)); + magic_conf.vars[i].ty = TY_UNDEF; - return i; + return i; } -static void -add_spell(spell_t *spell, int line_nr) +static void add_spell (spell_t * spell, int line_nr) { - int index = magic_conf.spells_nr; - int i; + int index = magic_conf.spells_nr; + int i; - for (i = 0; i < index; i++) { - if (!strcmp(magic_conf.spells[i]->name, spell->name)) { - fail(line_nr, 0, "Attempt to redefine spell `%s'\n", spell->name); - return; - } - if (!strcmp(magic_conf.spells[i]->invocation, spell->invocation)) { - fail(line_nr, 0, "Attempt to redefine spell invocation `%s' between spells `%s' and `%s'\n", - spell->invocation, magic_conf.spells[i]->name, spell->name); - return; - } + for (i = 0; i < index; i++) + { + if (!strcmp (magic_conf.spells[i]->name, spell->name)) + { + fail (line_nr, 0, "Attempt to redefine spell `%s'\n", + spell->name); + return; + } + if (!strcmp (magic_conf.spells[i]->invocation, spell->invocation)) + { + fail (line_nr, 0, + "Attempt to redefine spell invocation `%s' between spells `%s' and `%s'\n", + spell->invocation, magic_conf.spells[i]->name, spell->name); + return; } - magic_conf.spells_nr++; + } + magic_conf.spells_nr++; - magic_conf.spells = realloc(magic_conf.spells, magic_conf.spells_nr * sizeof (spell_t*)); - magic_conf.spells[index] = spell; + magic_conf.spells = + realloc (magic_conf.spells, + magic_conf.spells_nr * sizeof (spell_t *)); + magic_conf.spells[index] = spell; - } -static void -add_teleport_anchor(teleport_anchor_t *anchor, int line_nr) +static void add_teleport_anchor (teleport_anchor_t * anchor, int line_nr) { - int index = magic_conf.anchors_nr; - int i; + int index = magic_conf.anchors_nr; + int i; - for (i = 0; i < index; i++) { - if (!strcmp(magic_conf.anchors[i]->name, anchor->name)) { - fail(line_nr, 0, "Attempt to redefine teleport anchor `%s'\n", anchor->name); - return; - } - if (!strcmp(magic_conf.anchors[i]->invocation, anchor->invocation)) { - fail(line_nr, 0, "Attempt to redefine anchor invocation `%s' between anchors `%s' and `%s'\n", - anchor->invocation, magic_conf.anchors[i]->name, anchor->name); - return; - } + for (i = 0; i < index; i++) + { + if (!strcmp (magic_conf.anchors[i]->name, anchor->name)) + { + fail (line_nr, 0, "Attempt to redefine teleport anchor `%s'\n", + anchor->name); + return; } - magic_conf.anchors_nr++; + if (!strcmp (magic_conf.anchors[i]->invocation, anchor->invocation)) + { + fail (line_nr, 0, + "Attempt to redefine anchor invocation `%s' between anchors `%s' and `%s'\n", + anchor->invocation, magic_conf.anchors[i]->name, + anchor->name); + return; + } + } + magic_conf.anchors_nr++; - magic_conf.anchors = realloc(magic_conf.anchors, magic_conf.anchors_nr * sizeof (teleport_anchor_t*)); - magic_conf.anchors[index] = anchor; + magic_conf.anchors = + realloc (magic_conf.anchors, + magic_conf.anchors_nr * sizeof (teleport_anchor_t *)); + magic_conf.anchors[index] = anchor; } - -static void -fail(int line, int column, char *fmt, ...) +static void fail (int line, int column, char *fmt, ...) { - va_list ap; - fprintf(stderr, "[magic-init] L%d:%d: ", line, column); - va_start(ap, fmt); - vfprintf(stderr, fmt, ap); - failed_flag = 1; + va_list ap; + fprintf (stderr, "[magic-init] L%d:%d: ", line, column); + va_start (ap, fmt); + vfprintf (stderr, fmt, ap); + failed_flag = 1; } -static expr_t * -dot_expr(expr_t *expr, int id) +static expr_t *dot_expr (expr_t * expr, int id) { - expr_t *retval = magic_new_expr(EXPR_SPELLFIELD); - retval->e.e_field.id = id; - retval->e.e_field.expr = expr; + expr_t *retval = magic_new_expr (EXPR_SPELLFIELD); + retval->e.e_field.id = id; + retval->e.e_field.expr = expr; - return retval; + return retval; } -static expr_t * -fun_expr(char *name, int args_nr, expr_t **args, int line, int column) +static expr_t *fun_expr (char *name, int args_nr, expr_t ** args, int line, + int column) { - int id; - expr_t *expr; - fun_t *fun = magic_get_fun(name, &id); + int id; + expr_t *expr; + fun_t *fun = magic_get_fun (name, &id); - if (!fun) { - fail(line, column, "Unknown function `%s'\n", name); - } else if (strlen(fun->signature) != args_nr) { - fail(line, column, "Incorrect number of arguments to function `%s': Expected %d, found %d\n", name, strlen(fun->signature), args_nr); - fun = NULL; - } + if (!fun) + { + fail (line, column, "Unknown function `%s'\n", name); + } + else if (strlen (fun->signature) != args_nr) + { + fail (line, column, + "Incorrect number of arguments to function `%s': Expected %d, found %d\n", + name, strlen (fun->signature), args_nr); + fun = NULL; + } - if (fun) { - int i; + if (fun) + { + int i; - expr = magic_new_expr(EXPR_FUNAPP); - expr->e.e_funapp.line_nr = line; - expr->e.e_funapp.column = column; - expr->e.e_funapp.id = id; - expr->e.e_funapp.args_nr = args_nr; + expr = magic_new_expr (EXPR_FUNAPP); + expr->e.e_funapp.line_nr = line; + expr->e.e_funapp.column = column; + expr->e.e_funapp.id = id; + expr->e.e_funapp.args_nr = args_nr; - for (i = 0; i < args_nr; i++) - expr->e.e_funapp.args[i] = args[i]; - } else { /* failure */ - expr = magic_new_expr(EXPR_VAL); - expr->e.e_val.ty = TY_FAIL; - } + for (i = 0; i < args_nr; i++) + expr->e.e_funapp.args[i] = args[i]; + } + else + { /* failure */ + expr = magic_new_expr (EXPR_VAL); + expr->e.e_val.ty = TY_FAIL; + } - return expr; + return expr; } -static spell_t * -new_spell(spellguard_t *guard) +static spell_t *new_spell (spellguard_t * guard) { - static int spell_counter = 0; + static int spell_counter = 0; - spell_t *retval = calloc(1, sizeof(spell_t)); - retval->index = ++spell_counter; - retval->spellguard = guard; - return retval; + spell_t *retval = calloc (1, sizeof (spell_t)); + retval->index = ++spell_counter; + retval->spellguard = guard; + return retval; } -static spellguard_t * -new_spellguard(int ty) +static spellguard_t *new_spellguard (int ty) { - spellguard_t *retval = calloc(1, sizeof(spellguard_t)); - retval->ty = ty; - return retval; + spellguard_t *retval = calloc (1, sizeof (spellguard_t)); + retval->ty = ty; + return retval; } -static spellguard_t * -spellguard_implication(spellguard_t *a, spellguard_t *b) +static spellguard_t *spellguard_implication (spellguard_t * a, + spellguard_t * b) { - spellguard_t *retval = a; - - if (a == b) /* This can happen due to reference sharing: - * e.g., - * (R0 -> (R1 | R2)) => (R3) - * yields - * (R0 -> (R1 -> R3 | R2 -> R3)) - * - * So if we now add => R4 to that, we want - * (R0 -> (R1 -> R3 -> R4 | R2 -> R3 -> R4)) - * - * but we only need to add it once, because the R3 reference is shared. - */ - return retval; - - /* If the premise is a disjunction, b is the continuation of _all_ branches */ - if (a->ty == SPELLGUARD_CHOICE) - spellguard_implication(a->s.s_alt, b); - if (a->next) - spellguard_implication(a->next, b); - else - a->next = b; - - + spellguard_t *retval = a; + + if (a == b) /* This can happen due to reference sharing: + * e.g., + * (R0 -> (R1 | R2)) => (R3) + * yields + * (R0 -> (R1 -> R3 | R2 -> R3)) + * + * So if we now add => R4 to that, we want + * (R0 -> (R1 -> R3 -> R4 | R2 -> R3 -> R4)) + * + * but we only need to add it once, because the R3 reference is shared. + */ return retval; + + /* If the premise is a disjunction, b is the continuation of _all_ branches */ + if (a->ty == SPELLGUARD_CHOICE) + spellguard_implication (a->s.s_alt, b); + if (a->next) + spellguard_implication (a->next, b); + else + a->next = b; + + return retval; } -static effect_t * -new_effect(int ty) +static effect_t *new_effect (int ty) { - effect_t *effect = (effect_t *) calloc(1, sizeof(effect_t)); - effect->ty = ty; - return effect; + effect_t *effect = (effect_t *) calloc (1, sizeof (effect_t)); + effect->ty = ty; + return effect; } -static effect_t * -set_effect_continuation(effect_t *src, effect_t *continuation) +static effect_t *set_effect_continuation (effect_t * src, + effect_t * continuation) { - effect_t *retval = src; - /* This function is completely analogous to `spellguard_implication' above; read the control flow implications above first before pondering it. */ + effect_t *retval = src; + /* This function is completely analogous to `spellguard_implication' above; read the control flow implications above first before pondering it. */ - if (src == continuation) - return retval; + if (src == continuation) + return retval; - /* For FOR and FOREACH, we use special stack handlers and thus don't have to set - * the continuation. It's only IF that we need to handle in this fashion. */ - if (src->ty == EFFECT_IF) { - set_effect_continuation(src->e.e_if.true_branch, continuation); - set_effect_continuation(src->e.e_if.false_branch, continuation); - } - if (src->next) - set_effect_continuation(src->next, continuation); - else - src->next = continuation; + /* For FOR and FOREACH, we use special stack handlers and thus don't have to set + * the continuation. It's only IF that we need to handle in this fashion. */ + if (src->ty == EFFECT_IF) + { + set_effect_continuation (src->e.e_if.true_branch, continuation); + set_effect_continuation (src->e.e_if.false_branch, continuation); + } + if (src->next) + set_effect_continuation (src->next, continuation); + else + src->next = continuation; - return retval; + return retval; } -static effect_t * -op_effect(char *name, int args_nr, expr_t **args, int line, int column) +static effect_t *op_effect (char *name, int args_nr, expr_t ** args, int line, + int column) { - int id; - effect_t *effect; - op_t *op = magic_get_op(name, &id); + int id; + effect_t *effect; + op_t *op = magic_get_op (name, &id); - if (!op) - fail(line, column, "Unknown operation `%s'\n", name); - else if (strlen(op->signature) != args_nr) { - fail(line, column, "Incorrect number of arguments to operation `%s': Expected %d, found %d\n", name, strlen(op->signature), args_nr); - op = NULL; - } + if (!op) + fail (line, column, "Unknown operation `%s'\n", name); + else if (strlen (op->signature) != args_nr) + { + fail (line, column, + "Incorrect number of arguments to operation `%s': Expected %d, found %d\n", + name, strlen (op->signature), args_nr); + op = NULL; + } - if (op) { - int i; + if (op) + { + int i; - effect = new_effect(EFFECT_OP); - effect->e.e_op.line_nr = line; - effect->e.e_op.column = column; - effect->e.e_op.id = id; - effect->e.e_op.args_nr = args_nr; + effect = new_effect (EFFECT_OP); + effect->e.e_op.line_nr = line; + effect->e.e_op.column = column; + effect->e.e_op.id = id; + effect->e.e_op.args_nr = args_nr; - for (i = 0; i < args_nr; i++) - effect->e.e_op.args[i] = args[i]; - } else /* failure */ - effect = new_effect(EFFECT_SKIP); + for (i = 0; i < args_nr; i++) + effect->e.e_op.args[i] = args[i]; + } + else /* failure */ + effect = new_effect (EFFECT_SKIP); - return effect; + return effect; } - proc_t *procs = NULL; -int procs_nr = 0; +int procs_nr = 0; - -static void -install_proc(proc_t *proc) +static void install_proc (proc_t * proc) { - if (!procs) { - procs = proc; - procs_nr = 1; - } else { - procs = realloc(procs, sizeof(proc_t) * (1 + procs_nr)); - procs[procs_nr++] = *proc; - } + if (!procs) + { + procs = proc; + procs_nr = 1; + } + else + { + procs = realloc (procs, sizeof (proc_t) * (1 + procs_nr)); + procs[procs_nr++] = *proc; + } } -static effect_t * -call_proc(char *name, int args_nr, expr_t **args, int line_nr, int column) +static effect_t *call_proc (char *name, int args_nr, expr_t ** args, + int line_nr, int column) { - proc_t *p = NULL; - int i; - effect_t *retval; - - for (i = 0; i < procs_nr; i++) - if (!strcmp(procs[i].name, name)) { - p = &procs[i]; - break; - } - - if (!p) { - fail(line_nr, column, "Unknown procedure `%s'\n", name); - return new_effect(EFFECT_SKIP); + proc_t *p = NULL; + int i; + effect_t *retval; + + for (i = 0; i < procs_nr; i++) + if (!strcmp (procs[i].name, name)) + { + p = &procs[i]; + break; } - if (p->args_nr != args_nr) { - fail(line_nr, column, "Procedure %s/%d invoked with %d parameters\n", name, p->args_nr, args_nr); - return new_effect(EFFECT_SKIP); - } + if (!p) + { + fail (line_nr, column, "Unknown procedure `%s'\n", name); + return new_effect (EFFECT_SKIP); + } - retval = new_effect(EFFECT_CALL); - retval->e.e_call.body = p->body; - retval->e.e_call.args_nr = args_nr; - retval->e.e_call.formals = p->args; - retval->e.e_call.actuals = args; - return retval; + if (p->args_nr != args_nr) + { + fail (line_nr, column, "Procedure %s/%d invoked with %d parameters\n", + name, p->args_nr, args_nr); + return new_effect (EFFECT_SKIP); + } + + retval = new_effect (EFFECT_CALL); + retval->e.e_call.body = p->body; + retval->e.e_call.args_nr = args_nr; + retval->e.e_call.formals = p->args; + retval->e.e_call.actuals = args; + return retval; } -struct const_def_rec { - char *name; - val_t val; -} *const_defs = NULL; +struct const_def_rec +{ + char *name; + val_t val; +} *const_defs = NULL; -int const_defs_nr = 0; +int const_defs_nr = 0; -static void -bind_constant(char *name, val_t *val, int line_nr) +static void bind_constant (char *name, val_t * val, int line_nr) { - if (find_constant(name)) { - fail(line_nr, 0, "Redefinition of constant `%s'\n", name); - return; - } - - if (!const_defs) - const_defs = (struct const_def_rec *)malloc(sizeof(struct const_def_rec)); - else - const_defs = (struct const_def_rec *)realloc(const_defs, - (const_defs_nr + 1) * sizeof(struct const_def_rec)); + if (find_constant (name)) + { + fail (line_nr, 0, "Redefinition of constant `%s'\n", name); + return; + } - const_defs[const_defs_nr].name = name; - const_defs[const_defs_nr].val = *val; - ++const_defs_nr; + if (!const_defs) + const_defs = + (struct const_def_rec *) malloc (sizeof (struct const_def_rec)); + else + const_defs = (struct const_def_rec *) realloc (const_defs, + (const_defs_nr + + 1) * + sizeof (struct + const_def_rec)); + + const_defs[const_defs_nr].name = name; + const_defs[const_defs_nr].val = *val; + ++const_defs_nr; } -static val_t * -find_constant(char *name) +static val_t *find_constant (char *name) { - int i; - for (i = 0; i < const_defs_nr; i++) { - if (!strcmp(const_defs[i].name, name)) { - free(name); - return &const_defs[i].val; - } + int i; + for (i = 0; i < const_defs_nr; i++) + { + if (!strcmp (const_defs[i].name, name)) + { + free (name); + return &const_defs[i].val; } + } - return NULL; + return NULL; } - - - #define INTERN_ASSERT(name, id) { int zid = intern_id(name); if (zid != id) fprintf(stderr, "[magic-conf] INTERNAL ERROR: Builtin special var %s interned to %d, not %d as it should be!\n", name, zid, id); error_flag = 1; } extern FILE *magic_frontend_in; -int -magic_init(char *conffile) // must be called after itemdb initialisation +int magic_init (char *conffile) // must be called after itemdb initialisation { - int error_flag = 0; + int error_flag = 0; - magic_conf.vars_nr = 0; - magic_conf.var_name = (char **)malloc(1); - magic_conf.vars = (val_t *)malloc(1); + magic_conf.vars_nr = 0; + magic_conf.var_name = (char **) malloc (1); + magic_conf.vars = (val_t *) malloc (1); - magic_conf.obscure_chance = 95; - magic_conf.min_casttime = 100; + magic_conf.obscure_chance = 95; + magic_conf.min_casttime = 100; - magic_conf.spells_nr = 0; - magic_conf.spells = (spell_t **)malloc(1); + magic_conf.spells_nr = 0; + magic_conf.spells = (spell_t **) malloc (1); - magic_conf.anchors_nr = 0; - magic_conf.anchors = (teleport_anchor_t **)malloc(1); + magic_conf.anchors_nr = 0; + magic_conf.anchors = (teleport_anchor_t **) malloc (1); - INTERN_ASSERT("min_casttime", VAR_MIN_CASTTIME); - INTERN_ASSERT("obscure_chance", VAR_OBSCURE_CHANCE); - INTERN_ASSERT("caster", VAR_CASTER); - INTERN_ASSERT("spellpower", VAR_SPELLPOWER); - INTERN_ASSERT("self_spell", VAR_SPELL); - INTERN_ASSERT("self_invocation", VAR_INVOCATION); - INTERN_ASSERT("target", VAR_TARGET); - INTERN_ASSERT("script_target", VAR_SCRIPTTARGET); - INTERN_ASSERT("location", VAR_LOCATION); + INTERN_ASSERT ("min_casttime", VAR_MIN_CASTTIME); + INTERN_ASSERT ("obscure_chance", VAR_OBSCURE_CHANCE); + INTERN_ASSERT ("caster", VAR_CASTER); + INTERN_ASSERT ("spellpower", VAR_SPELLPOWER); + INTERN_ASSERT ("self_spell", VAR_SPELL); + INTERN_ASSERT ("self_invocation", VAR_INVOCATION); + INTERN_ASSERT ("target", VAR_TARGET); + INTERN_ASSERT ("script_target", VAR_SCRIPTTARGET); + INTERN_ASSERT ("location", VAR_LOCATION); - magic_frontend_in = fopen_(conffile, "r"); - if (!magic_frontend_in) { - fprintf(stderr, "[magic-conf] Magic configuration file `%s' not found -> no magic.\n", conffile); - return 0; - } - magic_frontend_parse(); + magic_frontend_in = fopen_ (conffile, "r"); + if (!magic_frontend_in) + { + fprintf (stderr, + "[magic-conf] Magic configuration file `%s' not found -> no magic.\n", + conffile); + return 0; + } + magic_frontend_parse (); - if (magic_conf.vars[VAR_MIN_CASTTIME].ty == TY_INT) - magic_conf.min_casttime = magic_conf.vars[VAR_MIN_CASTTIME].v.v_int; + if (magic_conf.vars[VAR_MIN_CASTTIME].ty == TY_INT) + magic_conf.min_casttime = magic_conf.vars[VAR_MIN_CASTTIME].v.v_int; - if (magic_conf.vars[VAR_OBSCURE_CHANCE].ty == TY_INT) - magic_conf.obscure_chance = magic_conf.vars[VAR_OBSCURE_CHANCE].v.v_int; + if (magic_conf.vars[VAR_OBSCURE_CHANCE].ty == TY_INT) + magic_conf.obscure_chance = + magic_conf.vars[VAR_OBSCURE_CHANCE].v.v_int; - printf("[magic-conf] Magic initialised; obscure at %d%%. %d spells, %d teleport anchors.\n", - magic_conf.obscure_chance, magic_conf.spells_nr, magic_conf.anchors_nr); + printf + ("[magic-conf] Magic initialised; obscure at %d%%. %d spells, %d teleport anchors.\n", + magic_conf.obscure_chance, magic_conf.spells_nr, + magic_conf.anchors_nr); - if (procs) - free(procs); - return error_flag; + if (procs) + free (procs); + return error_flag; } extern int magic_frontend_lineno; -static void -magic_frontend_error(const char *msg) +static void magic_frontend_error (const char *msg) { - fprintf(stderr, "[magic-conf] Parse error: %s at line %d\n", msg, magic_frontend_lineno); + fprintf (stderr, "[magic-conf] Parse error: %s at line %d\n", msg, + magic_frontend_lineno); failed_flag = 1; } - diff --git a/src/map/magic-interpreter-parser.h b/src/map/magic-interpreter-parser.h index b2f0e66..7ae2196 100644 --- a/src/map/magic-interpreter-parser.h +++ b/src/map/magic-interpreter-parser.h @@ -37,61 +37,62 @@ #ifndef YYTOKENTYPE # define YYTOKENTYPE /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - INT = 258, - STRING = 259, - ID = 260, - DIR = 261, - CONST = 262, - PROCEDURE = 263, - CALL = 264, - SILENT = 265, - LOCAL = 266, - NONMAGIC = 267, - SHL = 268, - SHR = 269, - EQ = 270, - NEQ = 271, - GTE = 272, - LTE = 273, - ANDAND = 274, - OROR = 275, - SCRIPT_DATA = 276, - TO = 277, - TOWARDS = 278, - TELEPORT_ANCHOR = 279, - SPELL = 280, - LET = 281, - IN = 282, - END = 283, - DARROW = 284, - STRING_TY = 285, - REQUIRE = 286, - CATALYSTS = 287, - COMPONENTS = 288, - MANA = 289, - CASTTIME = 290, - SKIP = 291, - ABORT = 292, - BREAK = 293, - EFFECT = 294, - ATEND = 295, - ATTRIGGER = 296, - PC_F = 297, - NPC_F = 298, - MOB_F = 299, - ENTITY_F = 300, - TARGET_F = 301, - IF = 302, - THEN = 303, - ELSE = 304, - FOREACH = 305, - FOR = 306, - DO = 307, - SLEEP = 308, - OR = 309 - }; + * know about them. */ +enum yytokentype +{ + INT = 258, + STRING = 259, + ID = 260, + DIR = 261, + CONST = 262, + PROCEDURE = 263, + CALL = 264, + SILENT = 265, + LOCAL = 266, + NONMAGIC = 267, + SHL = 268, + SHR = 269, + EQ = 270, + NEQ = 271, + GTE = 272, + LTE = 273, + ANDAND = 274, + OROR = 275, + SCRIPT_DATA = 276, + TO = 277, + TOWARDS = 278, + TELEPORT_ANCHOR = 279, + SPELL = 280, + LET = 281, + IN = 282, + END = 283, + DARROW = 284, + STRING_TY = 285, + REQUIRE = 286, + CATALYSTS = 287, + COMPONENTS = 288, + MANA = 289, + CASTTIME = 290, + SKIP = 291, + ABORT = 292, + BREAK = 293, + EFFECT = 294, + ATEND = 295, + ATTRIGGER = 296, + PC_F = 297, + NPC_F = 298, + MOB_F = 299, + ENTITY_F = 300, + TARGET_F = 301, + IF = 302, + THEN = 303, + ELSE = 304, + FOREACH = 305, + FOR = 306, + DO = 307, + SLEEP = 308, + OR = 309 +}; #endif /* Tokens. */ #define INT 258 @@ -147,36 +148,43 @@ #define SLEEP 308 #define OR 309 - - - #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED typedef union YYSTYPE #line 74 "magic-interpreter-parser.y" { - int i; + int i; char *s; - int op; + int op; magic_conf_t *magic_conf; val_t value; expr_t *expr; e_location_t location; e_area_t area; args_rec_t arg_list; - struct { int letdefs_nr; letdef_t *letdefs; } letdefs; + struct + { + int letdefs_nr; + letdef_t *letdefs; + } letdefs; spell_t *spell; - struct { int id, ty; } spellarg_def; + struct + { + int id, ty; + } spellarg_def; letdef_t vardef; spellguard_t *spellguard; component_t *components; - struct {int id, count; } component; + struct + { + int id, count; + } component; effect_t *effect; proc_t *proc; } /* Line 1489 of yacc.c. */ #line 178 "magic-interpreter-parser.h" - YYSTYPE; -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +YYSTYPE; +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 # define YYSTYPE_IS_TRIVIAL 1 #endif @@ -186,12 +194,12 @@ extern YYSTYPE magic_frontend_lval; #if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED typedef struct YYLTYPE { - int first_line; - int first_column; - int last_line; - int last_column; + int first_line; + int first_column; + int last_line; + int last_column; } YYLTYPE; -# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ +# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ # define YYLTYPE_IS_DECLARED 1 # define YYLTYPE_IS_TRIVIAL 1 #endif diff --git a/src/map/magic-interpreter.h b/src/map/magic-interpreter.h index 4324e53..7db7d3e 100644 --- a/src/map/magic-interpreter.h +++ b/src/map/magic-interpreter.h @@ -31,11 +31,9 @@ #include "../common/timer.h" #include "../common/socket.h" -#define SPELLARG_NONE 0 /* No spell parameter */ -#define SPELLARG_PC 1 /* Spell parameter describes pc (defaults to self) */ -#define SPELLARG_STRING 2 /* Spell parameter describes pc (defaults to self) */ - - +#define SPELLARG_NONE 0 /* No spell parameter */ +#define SPELLARG_PC 1 /* Spell parameter describes pc (defaults to self) */ +#define SPELLARG_STRING 2 /* Spell parameter describes pc (defaults to self) */ /* ------ */ /* Values */ @@ -44,7 +42,7 @@ #define TY_UNDEF 0 #define TY_INT 1 #define TY_DIR 2 -#define TY_STRING 3 +#define TY_STRING 3 #define TY_ENTITY 5 #define TY_LOCATION 6 #define TY_AREA 7 @@ -68,9 +66,10 @@ struct area; struct spell; struct invocation; -typedef struct location { - int m; - int x, y; +typedef struct location +{ + int m; + int x, y; } location_t; #define AREA_LOCATION 0 @@ -78,36 +77,47 @@ typedef struct location { #define AREA_RECT 2 #define AREA_BAR 3 -typedef struct area { - union a { +typedef struct area +{ + union a + { location_t a_loc; - struct { location_t loc; int width, depth, dir; } a_bar; - struct { location_t loc; int width, height; } a_rect; - struct area * a_union[2]; + struct + { + location_t loc; + int width, depth, dir; + } a_bar; + struct + { + location_t loc; + int width, height; + } a_rect; + struct area *a_union[2]; } a; - int size; + int size; unsigned char ty; } area_t; -typedef struct val { - union v { - int v_int; +typedef struct val +{ + union v + { + int v_int; char *v_string; - entity_t *v_entity; /* Used ONLY during operation/function invocation; otherwise we use v_int */ + entity_t *v_entity; /* Used ONLY during operation/function invocation; otherwise we use v_int */ area_t *v_area; location_t v_location; - struct invocation *v_invocation; /* Used ONLY during operation/function invocation; otherwise we use v_int */ + struct invocation *v_invocation; /* Used ONLY during operation/function invocation; otherwise we use v_int */ struct spell *v_spell; } v; unsigned char ty; } val_t; - /* ----------- */ /* Expressions */ /* ----------- */ -#define MAX_ARGS 7 /* Max. # of args used in builtin primitive functions */ +#define MAX_ARGS 7 /* Max. # of args used in builtin primitive functions */ #define EXPR_VAL 0 #define EXPR_LOCATION 1 @@ -116,33 +126,54 @@ typedef struct val { #define EXPR_ID 4 #define EXPR_SPELLFIELD 5 -typedef struct e_location { +typedef struct e_location +{ struct expr *m, *x, *y; } e_location_t; -typedef struct e_area { - union a0 { +typedef struct e_area +{ + union a0 + { e_location_t a_loc; - struct { e_location_t loc; struct expr *width, *depth, *dir; } a_bar; - struct { e_location_t loc; struct expr *width, *height; } a_rect; - struct e_area* a_union[2]; + struct + { + e_location_t loc; + struct expr *width, *depth, *dir; + } a_bar; + struct + { + e_location_t loc; + struct expr *width, *height; + } a_rect; + struct e_area *a_union[2]; } a; unsigned char ty; } e_area_t; -typedef struct expr { - union e { +typedef struct expr +{ + union e + { val_t e_val; e_location_t e_location; e_area_t e_area; - struct { int id, line_nr, column; int args_nr; struct expr *args[MAX_ARGS]; } e_funapp; - int e_id; - struct { struct expr *expr; int id; } e_field; + struct + { + int id, line_nr, column; + int args_nr; + struct expr *args[MAX_ARGS]; + } e_funapp; + int e_id; + struct + { + struct expr *expr; + int id; + } e_field; } e; unsigned char ty; } expr_t; - /* ------- */ /* Effects */ /* ------- */ @@ -167,38 +198,64 @@ typedef struct expr { #define FOREACH_FILTER_SPELL 5 #define FOREACH_FILTER_NPC 6 -typedef struct effect { - struct effect* next; - union e0 { - struct { int id; expr_t *expr; } e_assign; - struct { int id; - expr_t *area; - struct effect* body; - unsigned char filter; } e_foreach; - struct { int id; - expr_t *start, *stop; - struct effect *body; } e_for; - struct { expr_t *cond; struct effect *true_branch, *false_branch; } e_if; - expr_t *e_sleep; /* sleep time */ +typedef struct effect +{ + struct effect *next; + union e0 + { + struct + { + int id; + expr_t *expr; + } e_assign; + struct + { + int id; + expr_t *area; + struct effect *body; + unsigned char filter; + } e_foreach; + struct + { + int id; + expr_t *start, *stop; + struct effect *body; + } e_for; + struct + { + expr_t *cond; + struct effect *true_branch, *false_branch; + } e_if; + expr_t *e_sleep; /* sleep time */ unsigned char *e_script; - struct { int id; int args_nr; int line_nr, column; expr_t *args[MAX_ARGS]; } e_op; - struct { int args_nr, *formals; expr_t **actuals; struct effect *body; } e_call; + struct + { + int id; + int args_nr; + int line_nr, column; + expr_t *args[MAX_ARGS]; + } e_op; + struct + { + int args_nr, *formals; + expr_t **actuals; + struct effect *body; + } e_call; } e; unsigned char ty; } effect_t; - /* ---------- */ -/* Components */ +/* Components */ /* ---------- */ -typedef struct component { +typedef struct component +{ struct component *next; - int item_id; - int count; + int item_id; + int count; } component_t; - /* ----------- */ /* Spellguards */ /* ----------- */ @@ -211,47 +268,51 @@ typedef struct component { #define SPELLGUARD_CASTTIME 5 #define SPELLGUARD_EFFECT 6 -typedef struct effect_set { - effect_t *effect, *at_trigger, *at_end; +typedef struct effect_set +{ + effect_t *effect, *at_trigger, *at_end; } effect_set_t; -typedef struct spellguard { +typedef struct spellguard +{ struct spellguard *next; - union s { + union s + { expr_t *s_condition; expr_t *s_mana; expr_t *s_casttime; component_t *s_components; component_t *s_catalysts; - struct spellguard *s_alt; /* either `next' or `s.s_alt' */ + struct spellguard *s_alt; /* either `next' or `s.s_alt' */ effect_set_t s_effect; } s; unsigned char ty; } spellguard_t; - /* ------ */ /* Spells */ /* ------ */ -typedef struct letdef { - int id; +typedef struct letdef +{ + int id; expr_t *expr; } letdef_t; -#define SPELL_FLAG_LOCAL (1 << 0) // spell associated not with caster but with place -#define SPELL_FLAG_SILENT (1 << 1) // spell invocation never uttered -#define SPELL_FLAG_NONMAGIC (1 << 2) // `magic word' only: don't require spellcasting ability +#define SPELL_FLAG_LOCAL (1 << 0) // spell associated not with caster but with place +#define SPELL_FLAG_SILENT (1 << 1) // spell invocation never uttered +#define SPELL_FLAG_NONMAGIC (1 << 2) // `magic word' only: don't require spellcasting ability -typedef struct spell { +typedef struct spell +{ char *name; char *invocation; - int index; // Relative location in the definitions file - int flags; - int arg; - int spellarg_ty; + int index; // Relative location in the definitions file + int flags; + int arg; + int spellarg_ty; - int letdefs_nr; + int letdefs_nr; letdef_t *letdefs; spellguard_t *spellguard; @@ -261,7 +322,8 @@ typedef struct spell { /* Anchors */ /* ------- */ -typedef struct teleport_anchor { +typedef struct teleport_anchor +{ char *name; char *invocation; expr_t *location; @@ -271,22 +333,22 @@ typedef struct teleport_anchor { /* The big config blob */ /* ------------------- */ -typedef struct { - int vars_nr; +typedef struct +{ + int vars_nr; char **var_name; - val_t *vars; /* Initial assignments, if any, or NULL */ + val_t *vars; /* Initial assignments, if any, or NULL */ - int obscure_chance; - int min_casttime; + int obscure_chance; + int min_casttime; - int spells_nr; + int spells_nr; spell_t **spells; - int anchors_nr; /* NEGATIVE iff we have sorted the anchors */ + int anchors_nr; /* NEGATIVE iff we have sorted the anchors */ teleport_anchor_t **anchors; } magic_conf_t; - /* Execution environment */ #define VAR_MIN_CASTTIME 0 @@ -301,7 +363,8 @@ typedef struct { struct magic_config; -typedef struct env { +typedef struct env +{ magic_conf_t *base_env; val_t *vars; } env_t; @@ -312,115 +375,127 @@ typedef struct env { #define CONT_STACK_FOR 1 #define CONT_STACK_PROC 2 -typedef struct cont_activation_record { +typedef struct cont_activation_record +{ effect_t *return_location; - union c { - struct { int id, ty; effect_t *body; int entities_nr; int *entities; int index; } c_foreach; - struct { int id; effect_t *body; int current; int stop; } c_for; - struct { int args_nr, *formals; val_t *old_actuals; } c_proc; + union c + { + struct + { + int id, ty; + effect_t *body; + int entities_nr; + int *entities; + int index; + } c_foreach; + struct + { + int id; + effect_t *body; + int current; + int stop; + } c_for; + struct + { + int args_nr, *formals; + val_t *old_actuals; + } c_proc; } c; unsigned char ty; } cont_activation_record_t; -typedef struct status_change_ref { - int sc_type; - int bl_id; +typedef struct status_change_ref +{ + int sc_type; + int bl_id; } status_change_ref_t; -#define INVOCATION_FLAG_BOUND (1 << 0) /* Bound directly to the caster (i.e., ignore its location) */ -#define INVOCATION_FLAG_ABORTED (1 << 1) /* Used `abort' to terminate */ -#define INVOCATION_FLAG_STOPATTACK (1 << 2) /* On magical attacks: if we run out of steam, stop attacking altogether */ +#define INVOCATION_FLAG_BOUND (1 << 0) /* Bound directly to the caster (i.e., ignore its location) */ +#define INVOCATION_FLAG_ABORTED (1 << 1) /* Used `abort' to terminate */ +#define INVOCATION_FLAG_STOPATTACK (1 << 2) /* On magical attacks: if we run out of steam, stop attacking altogether */ -typedef struct invocation { +typedef struct invocation +{ struct block_list bl; struct invocation *next_invocation; /* used for spells directly associated with a caster: they form a singly-linked list */ - int flags; + int flags; env_t *env; spell_t *spell; - int caster; /* this is the person who originally invoked the spell */ - int subject; /* when this person dies, the spell dies with it */ + int caster; /* this is the person who originally invoked the spell */ + int subject; /* when this person dies, the spell dies with it */ - int timer; /* spell timer, if any */ + int timer; /* spell timer, if any */ - int stack_size; + int stack_size; cont_activation_record_t stack[MAX_STACK_SIZE]; - int script_pos; /* Script position; if nonzero, resume the script we were running. */ + int script_pos; /* Script position; if nonzero, resume the script we were running. */ effect_t *current_effect; - effect_t *trigger_effect; /* If non-NULL, this is used to spawn a cloned effect based on the same environment */ - effect_t *end_effect; /* If non-NULL, this is executed when the spell terminates naturally, e.g. when all status changes have run out or all delays are over. */ + effect_t *trigger_effect; /* If non-NULL, this is used to spawn a cloned effect based on the same environment */ + effect_t *end_effect; /* If non-NULL, this is executed when the spell terminates naturally, e.g. when all status changes have run out or all delays are over. */ /* Status change references: for status change updates, keep track of whom we updated where */ - int status_change_refs_nr; + int status_change_refs_nr; status_change_ref_t *status_change_refs; } invocation_t; - extern magic_conf_t magic_conf; /* Global magic conf */ extern env_t magic_default_env; /* Fake default environment */ - /** * Adds a component selection to a component holder (which may initially be NULL) */ -void -magic_add_component(component_t **component_holder, int id, int count); +void magic_add_component (component_t ** component_holder, int id, int count); - -teleport_anchor_t * -magic_find_anchor(char *name); +teleport_anchor_t *magic_find_anchor (char *name); /** * The parameter `param' must have been dynamically allocated; ownership is transferred to the resultant env_t. */ -env_t * -spell_create_env(magic_conf_t *conf, spell_t *spell, character_t *caster, int spellpower, char *param); +env_t *spell_create_env (magic_conf_t * conf, spell_t * spell, + character_t * caster, int spellpower, char *param); -void -magic_free_env(env_t *env); +void magic_free_env (env_t * env); /** * near_miss is set to nonzero iff the spell only failed due to ephemereal issues (spell delay in effect, out of mana, out of components) */ -effect_set_t * -spell_trigger(spell_t *spell, character_t *caster, env_t *env, int *near_miss); +effect_set_t *spell_trigger (spell_t * spell, character_t * caster, + env_t * env, int *near_miss); -invocation_t * -spell_instantiate(effect_set_t *effect, env_t *env); +invocation_t *spell_instantiate (effect_set_t * effect, env_t * env); /** * Bind a spell to a subject (this is a no-op for `local' spells). */ -void -spell_bind(character_t *subject, invocation_t *invocation); - -int // 1 on failure -spell_unbind(character_t *subject, invocation_t *invocation); +void spell_bind (character_t * subject, invocation_t * invocation); +int // 1 on failure + spell_unbind (character_t * subject, invocation_t * invocation); /** * Clones a spell to run the at_effect field */ -invocation_t * -spell_clone_effect(invocation_t *source); +invocation_t *spell_clone_effect (invocation_t * source); -spell_t * -magic_find_spell(char *invocation); +spell_t *magic_find_spell (char *invocation); /* The following is used only by the parser: */ -typedef struct args_rec { - int args_nr; +typedef struct args_rec +{ + int args_nr; expr_t **args; } args_rec_t; -typedef struct { - char *name; - int args_nr; - int *args; - effect_t *body; +typedef struct +{ + char *name; + int args_nr; + int *args; + effect_t *body; } proc_t; #endif /* !defined (MAGIC_INTERPRETER_H) */ diff --git a/src/map/magic-stmt.c b/src/map/magic-stmt.c index 65e0202..1a1ced7 100644 --- a/src/map/magic-stmt.c +++ b/src/map/magic-stmt.c @@ -4,600 +4,612 @@ #include "magic-interpreter-aux.h" int -clif_spawn_fake_npc_for_player(struct map_session_data *sd, int fake_npc_id); + clif_spawn_fake_npc_for_player (struct map_session_data *sd, + int fake_npc_id); -#define INVISIBLE_NPC 127 /* used for local spell effects */ +#define INVISIBLE_NPC 127 /* used for local spell effects */ //#define DEBUG #ifdef DEBUG -static void -print_val(val_t *v) +static void print_val (val_t * v) { - switch (v->ty) { - case TY_UNDEF: fprintf(stderr, "UNDEF"); break; - case TY_INT: fprintf(stderr, "%d", v->v.v_int); break; - case TY_DIR: fprintf(stderr, "dir%d", v->v.v_int); break; - case TY_STRING: fprintf(stderr, "`%s'", v->v.v_string); break; - default: fprintf(stderr, "ty%d", v->ty); break; - } + switch (v->ty) + { + case TY_UNDEF: + fprintf (stderr, "UNDEF"); + break; + case TY_INT: + fprintf (stderr, "%d", v->v.v_int); + break; + case TY_DIR: + fprintf (stderr, "dir%d", v->v.v_int); + break; + case TY_STRING: + fprintf (stderr, "`%s'", v->v.v_string); + break; + default: + fprintf (stderr, "ty%d", v->ty); + break; + } } -static void -dump_env(env_t *env) +static void dump_env (env_t * env) { - int i; - for (i = 0; i < env->base_env->vars_nr; i++) { - val_t *v = &env->vars[i]; - val_t *bv = &env->base_env->vars[i]; - - fprintf(stderr, "%02x %30s ", i, env->base_env->var_name[i]); - print_val(v); - fprintf(stderr, "\t("); - print_val(bv); - fprintf(stderr, ")\n"); - } + int i; + for (i = 0; i < env->base_env->vars_nr; i++) + { + val_t *v = &env->vars[i]; + val_t *bv = &env->base_env->vars[i]; + + fprintf (stderr, "%02x %30s ", i, env->base_env->var_name[i]); + print_val (v); + fprintf (stderr, "\t("); + print_val (bv); + fprintf (stderr, ")\n"); + } } #endif -static void -clear_activation_record(cont_activation_record_t *ar) +static void clear_activation_record (cont_activation_record_t * ar) { - switch (ar->ty) { + switch (ar->ty) + { case CONT_STACK_FOREACH: - free(ar->c.c_foreach.entities); - break; + free (ar->c.c_foreach.entities); + break; case CONT_STACK_PROC: - free(ar->c.c_proc.old_actuals); - break; - } + free (ar->c.c_proc.old_actuals); + break; + } } static int -invocation_timer_callback(int _, unsigned int __, int id, int data) +invocation_timer_callback (int _, unsigned int __, int id, int data) { - invocation_t *invocation = (invocation_t *) map_id2bl(id); + invocation_t *invocation = (invocation_t *) map_id2bl (id); - if (invocation) { - invocation->timer = 0; - spell_execute(invocation); - } - return 0; + if (invocation) + { + invocation->timer = 0; + spell_execute (invocation); + } + return 0; } -static void -clear_stack(invocation_t *invocation) +static void clear_stack (invocation_t * invocation) { - int i; + int i; - for (i = 0; i < invocation->stack_size; i++) - clear_activation_record(&invocation->stack[i]); + for (i = 0; i < invocation->stack_size; i++) + clear_activation_record (&invocation->stack[i]); - invocation->stack_size = 0; + invocation->stack_size = 0; } -void -spell_free_invocation(invocation_t *invocation) +void spell_free_invocation (invocation_t * invocation) { - if (invocation->status_change_refs) { - free(invocation->status_change_refs); - /* The following cleanup shouldn't be necessary, but I've added it to help tracking a certain bug */ - invocation->status_change_refs = NULL; - invocation->status_change_refs_nr = 0; - } - - if (invocation->flags & INVOCATION_FLAG_BOUND) { - entity_t *e = map_id2bl(invocation->subject); - if (e && e->type == BL_PC) - spell_unbind((character_t *) e, invocation); - } - - clear_stack(invocation); - - if (invocation->timer) - delete_timer(invocation->timer, invocation_timer_callback); - - magic_free_env(invocation->env); - - map_delblock(&invocation->bl); - map_delobject(invocation->bl.id, BL_SPELL); // also frees the object + if (invocation->status_change_refs) + { + free (invocation->status_change_refs); + /* The following cleanup shouldn't be necessary, but I've added it to help tracking a certain bug */ + invocation->status_change_refs = NULL; + invocation->status_change_refs_nr = 0; + } + + if (invocation->flags & INVOCATION_FLAG_BOUND) + { + entity_t *e = map_id2bl (invocation->subject); + if (e && e->type == BL_PC) + spell_unbind ((character_t *) e, invocation); + } + + clear_stack (invocation); + + if (invocation->timer) + delete_timer (invocation->timer, invocation_timer_callback); + + magic_free_env (invocation->env); + + map_delblock (&invocation->bl); + map_delobject (invocation->bl.id, BL_SPELL); // also frees the object // free(invocation); } static void -char_set_weapon_icon(character_t *subject, int count, int icon, int look) +char_set_weapon_icon (character_t * subject, int count, int icon, int look) { - const int old_icon = subject->attack_spell_icon_override; - - subject->attack_spell_icon_override = icon; - subject->attack_spell_look_override = look; - - if (old_icon && old_icon != icon) - clif_status_change(&subject->bl, old_icon, 0); - - clif_fixpcpos(subject); - if (count) { - clif_changelook(&subject->bl, LOOK_WEAPON, look); - if (icon) - clif_status_change(&subject->bl, icon, 1); - } else { - /* Set it to `normal' */ - clif_changelook(&subject->bl, LOOK_WEAPON, subject->status.weapon); - } + const int old_icon = subject->attack_spell_icon_override; + + subject->attack_spell_icon_override = icon; + subject->attack_spell_look_override = look; + + if (old_icon && old_icon != icon) + clif_status_change (&subject->bl, old_icon, 0); + + clif_fixpcpos (subject); + if (count) + { + clif_changelook (&subject->bl, LOOK_WEAPON, look); + if (icon) + clif_status_change (&subject->bl, icon, 1); + } + else + { + /* Set it to `normal' */ + clif_changelook (&subject->bl, LOOK_WEAPON, subject->status.weapon); + } } -static void -char_set_attack_info(character_t *subject, int speed, int range) +static void char_set_attack_info (character_t * subject, int speed, int range) { - subject->attack_spell_delay = speed; - subject->attack_spell_range = range; - - if (speed == 0) { - pc_calcstatus(subject, 1); - clif_updatestatus(subject, SP_ASPD); - clif_updatestatus(subject, SP_ATTACKRANGE); - } else { - subject->aspd = speed; - clif_updatestatus(subject, SP_ASPD); - clif_updatestatus(subject, SP_ATTACKRANGE); - } + subject->attack_spell_delay = speed; + subject->attack_spell_range = range; + + if (speed == 0) + { + pc_calcstatus (subject, 1); + clif_updatestatus (subject, SP_ASPD); + clif_updatestatus (subject, SP_ATTACKRANGE); + } + else + { + subject->aspd = speed; + clif_updatestatus (subject, SP_ASPD); + clif_updatestatus (subject, SP_ATTACKRANGE); + } } -void -magic_stop_completely(character_t *c) +void magic_stop_completely (character_t * c) { - int i; - // Zap all status change references to spells - for (i = 0; i < MAX_STATUSCHANGE; i++) - c->sc_data[i].spell_invocation = 0; - - while (c->active_spells) - spell_free_invocation(c->active_spells); - - if (c->attack_spell_override) { - invocation_t *attack_spell = (invocation_t *)map_id2bl(c->attack_spell_override); - if (attack_spell) - spell_free_invocation(attack_spell); - c->attack_spell_override = 0; - char_set_weapon_icon(c, 0, 0, 0); - char_set_attack_info(c, 0, 0); - } + int i; + // Zap all status change references to spells + for (i = 0; i < MAX_STATUSCHANGE; i++) + c->sc_data[i].spell_invocation = 0; + + while (c->active_spells) + spell_free_invocation (c->active_spells); + + if (c->attack_spell_override) + { + invocation_t *attack_spell = + (invocation_t *) map_id2bl (c->attack_spell_override); + if (attack_spell) + spell_free_invocation (attack_spell); + c->attack_spell_override = 0; + char_set_weapon_icon (c, 0, 0, 0); + char_set_attack_info (c, 0, 0); + } } /* Spell execution has finished normally or we have been notified by a finished skill timer */ -static void -try_to_finish_invocation(invocation_t *invocation) +static void try_to_finish_invocation (invocation_t * invocation) { - if (invocation->status_change_refs_nr == 0 && !invocation->current_effect) { - if (invocation->end_effect) { - clear_stack(invocation); - invocation->current_effect = invocation->end_effect; - invocation->end_effect = NULL; - spell_execute(invocation); - } else - spell_free_invocation(invocation); + if (invocation->status_change_refs_nr == 0 && !invocation->current_effect) + { + if (invocation->end_effect) + { + clear_stack (invocation); + invocation->current_effect = invocation->end_effect; + invocation->end_effect = NULL; + spell_execute (invocation); } + else + spell_free_invocation (invocation); + } } -static int -trigger_spell(int subject, int spell) +static int trigger_spell (int subject, int spell) { - invocation_t *invocation = (invocation_t *)map_id2bl(spell); + invocation_t *invocation = (invocation_t *) map_id2bl (spell); - if (!invocation) - return 0; + if (!invocation) + return 0; - invocation = spell_clone_effect(invocation); + invocation = spell_clone_effect (invocation); - spell_bind((character_t *)map_id2bl(subject), invocation); - magic_clear_var(&invocation->env->vars[VAR_CASTER]); - invocation->env->vars[VAR_CASTER].ty = TY_ENTITY; - invocation->env->vars[VAR_CASTER].v.v_int = subject; + spell_bind ((character_t *) map_id2bl (subject), invocation); + magic_clear_var (&invocation->env->vars[VAR_CASTER]); + invocation->env->vars[VAR_CASTER].ty = TY_ENTITY; + invocation->env->vars[VAR_CASTER].v.v_int = subject; - return invocation->bl.id; + return invocation->bl.id; } -static void -entity_warp(entity_t *target, int destm, int destx, int desty); +static void entity_warp (entity_t * target, int destm, int destx, int desty); -static void -char_update(character_t *character) +static void char_update (character_t * character) { - entity_warp((entity_t *)character, character->bl.m, character->bl.x, character->bl.y); + entity_warp ((entity_t *) character, character->bl.m, character->bl.x, + character->bl.y); } -static int -timer_callback_effect(int _, unsigned int __, int id, int data) +static int timer_callback_effect (int _, unsigned int __, int id, int data) { - entity_t *target = map_id2bl(id); - if (target) - clif_misceffect(target, data); - return 0; + entity_t *target = map_id2bl (id); + if (target) + clif_misceffect (target, data); + return 0; } -static void -entity_effect(entity_t *entity, int effect_nr, int delay) +static void entity_effect (entity_t * entity, int effect_nr, int delay) { - add_timer(gettick() + delay, - &timer_callback_effect, - entity->id, - effect_nr); + add_timer (gettick () + delay, + &timer_callback_effect, entity->id, effect_nr); } -void -magic_unshroud(character_t *other_char) +void magic_unshroud (character_t * other_char) { - other_char->state.shroud_active = 0; - // Now warp the caster out of and back into here to refresh everyone's display - char_update(other_char); - clif_displaymessage(other_char->fd, "Your shroud has been dispelled!"); + other_char->state.shroud_active = 0; + // Now warp the caster out of and back into here to refresh everyone's display + char_update (other_char); + clif_displaymessage (other_char->fd, "Your shroud has been dispelled!"); // entity_effect(&other_char->bl, MAGIC_EFFECT_REVEAL); } - static int -timer_callback_effect_npc_delete(int timer_id, unsigned int odelay, int npc_id, int _) +timer_callback_effect_npc_delete (int timer_id, unsigned int odelay, + int npc_id, int _) { - struct npc_data *effect_npc = (struct npc_data *)map_id2bl(npc_id); - npc_free(effect_npc); + struct npc_data *effect_npc = (struct npc_data *) map_id2bl (npc_id); + npc_free (effect_npc); return 0; } -static struct npc_data * -local_spell_effect(int m, int x, int y, int effect, int tdelay) +static struct npc_data *local_spell_effect (int m, int x, int y, int effect, + int tdelay) { - int delay = 30000; /* 1 minute should be enough for all interesting spell effects, I hope */ - struct npc_data *effect_npc = npc_spawn_text(m, x, y, - INVISIBLE_NPC, "", "?"); - int effect_npc_id = effect_npc->bl.id; + int delay = 30000; /* 1 minute should be enough for all interesting spell effects, I hope */ + struct npc_data *effect_npc = npc_spawn_text (m, x, y, + INVISIBLE_NPC, "", "?"); + int effect_npc_id = effect_npc->bl.id; - entity_effect(&effect_npc->bl, effect, tdelay); - add_timer(gettick() + delay, - timer_callback_effect_npc_delete, - effect_npc_id, 0); + entity_effect (&effect_npc->bl, effect, tdelay); + add_timer (gettick () + delay, + timer_callback_effect_npc_delete, effect_npc_id, 0); return effect_npc; } - -static int -op_sfx(env_t *env, int args_nr, val_t *args) +static int op_sfx (env_t * env, int args_nr, val_t * args) { - int delay = ARGINT(2); - - if (TY(0) == TY_ENTITY) { - entity_effect(ARGENTITY(0), ARGINT(1), delay); - } else if (TY(0) == TY_LOCATION) { - local_spell_effect(ARGLOCATION(0).m, - ARGLOCATION(0).x, - ARGLOCATION(0).y, - ARGINT(1), delay); - } else return 1; + int delay = ARGINT (2); + + if (TY (0) == TY_ENTITY) + { + entity_effect (ARGENTITY (0), ARGINT (1), delay); + } + else if (TY (0) == TY_LOCATION) + { + local_spell_effect (ARGLOCATION (0).m, + ARGLOCATION (0).x, + ARGLOCATION (0).y, ARGINT (1), delay); + } + else + return 1; - return 0; + return 0; } - -static int -op_instaheal(env_t *env, int args_nr, val_t *args) +static int op_instaheal (env_t * env, int args_nr, val_t * args) { - entity_t *caster = (VAR(VAR_CASTER).ty == TY_ENTITY) - ? map_id2bl(VAR(VAR_CASTER).v.v_int) - : NULL; - entity_t *subject = ARGENTITY(0); - if (!caster) - caster = subject; - - if (caster->type == BL_PC && subject->type == BL_PC) { - character_t *caster_pc = (character_t *) caster; - character_t *subject_pc = (character_t *) subject; - MAP_LOG_PC(caster_pc, "SPELLHEAL-INSTA PC%d FOR %d", - subject_pc->status.char_id, ARGINT(1)); - } - - battle_heal(caster, subject, ARGINT(1), ARGINT(2), 0); - return 0; + entity_t *caster = (VAR (VAR_CASTER).ty == TY_ENTITY) + ? map_id2bl (VAR (VAR_CASTER).v.v_int) : NULL; + entity_t *subject = ARGENTITY (0); + if (!caster) + caster = subject; + + if (caster->type == BL_PC && subject->type == BL_PC) + { + character_t *caster_pc = (character_t *) caster; + character_t *subject_pc = (character_t *) subject; + MAP_LOG_PC (caster_pc, "SPELLHEAL-INSTA PC%d FOR %d", + subject_pc->status.char_id, ARGINT (1)); + } + + battle_heal (caster, subject, ARGINT (1), ARGINT (2), 0); + return 0; } - -static int -op_itemheal(env_t *env, int args_nr, val_t *args) +static int op_itemheal (env_t * env, int args_nr, val_t * args) { - entity_t *subject = ARGENTITY(0); - if (subject->type == BL_PC) { - pc_itemheal((struct map_session_data *) subject, - ARGINT(1), - ARGINT(2)); - } else return op_instaheal(env, args_nr, args); + entity_t *subject = ARGENTITY (0); + if (subject->type == BL_PC) + { + pc_itemheal ((struct map_session_data *) subject, + ARGINT (1), ARGINT (2)); + } + else + return op_instaheal (env, args_nr, args); - return 0; + return 0; } - #define SHROUD_HIDE_NAME_TALKING_FLAG (1 << 0) #define SHROUD_DISAPPEAR_ON_PICKUP_FLAG (1 << 1) #define SHROUD_DISAPPEAR_ON_TALK_FLAG (1 << 2) #define ARGCHAR(n) (ARGENTITY(n)->type == BL_PC) ? (character_t *)(ARGENTITY(n)) : NULL -static int -op_shroud(env_t *env, int args_nr, val_t *args) +static int op_shroud (env_t * env, int args_nr, val_t * args) { - character_t *subject = ARGCHAR(0); - int arg = ARGINT(1); + character_t *subject = ARGCHAR (0); + int arg = ARGINT (1); - if (!subject) - return 0; - - subject->state.shroud_active = 1; - subject->state.shroud_hides_name_talking = (arg & SHROUD_HIDE_NAME_TALKING_FLAG) != 0; - subject->state.shroud_disappears_on_pickup = (arg & SHROUD_DISAPPEAR_ON_PICKUP_FLAG) != 0; - subject->state.shroud_disappears_on_talk = (arg & SHROUD_DISAPPEAR_ON_TALK_FLAG) != 0; + if (!subject) return 0; + + subject->state.shroud_active = 1; + subject->state.shroud_hides_name_talking = + (arg & SHROUD_HIDE_NAME_TALKING_FLAG) != 0; + subject->state.shroud_disappears_on_pickup = + (arg & SHROUD_DISAPPEAR_ON_PICKUP_FLAG) != 0; + subject->state.shroud_disappears_on_talk = + (arg & SHROUD_DISAPPEAR_ON_TALK_FLAG) != 0; + return 0; } -static int -op_reveal(env_t *env, int args_nr, val_t *args) +static int op_reveal (env_t * env, int args_nr, val_t * args) { - character_t *subject = ARGCHAR(0); - - if (subject && subject->state.shroud_active) - magic_unshroud(subject); + character_t *subject = ARGCHAR (0); - return 0; + if (subject && subject->state.shroud_active) + magic_unshroud (subject); + + return 0; } -static int -op_message(env_t *env, int args_nr, val_t *args) +static int op_message (env_t * env, int args_nr, val_t * args) { - character_t *subject = ARGCHAR(0); + character_t *subject = ARGCHAR (0); - if (subject) - clif_displaymessage(subject->fd, ARGSTR(1)); + if (subject) + clif_displaymessage (subject->fd, ARGSTR (1)); - return 0; + return 0; } static int -timer_callback_kill_npc(int timer_id, unsigned int odelay, int npc_id, int data) +timer_callback_kill_npc (int timer_id, unsigned int odelay, int npc_id, + int data) { - struct npc_data *npc = (struct npc_data *) map_id2bl(npc_id); - if (npc) - npc_free(npc); + struct npc_data *npc = (struct npc_data *) map_id2bl (npc_id); + if (npc) + npc_free (npc); - return 0; + return 0; } -static int -op_messenger_npc(env_t *env, int args_nr, val_t *args) +static int op_messenger_npc (env_t * env, int args_nr, val_t * args) { - struct npc_data *npc; - location_t *loc = &ARGLOCATION(0); + struct npc_data *npc; + location_t *loc = &ARGLOCATION (0); - npc = npc_spawn_text(loc->m, loc->x, loc->y, - ARGINT(1), ARGSTR(2), ARGSTR(3)); + npc = npc_spawn_text (loc->m, loc->x, loc->y, + ARGINT (1), ARGSTR (2), ARGSTR (3)); - add_timer(gettick() + ARGINT(4), - &timer_callback_kill_npc, - npc->bl.id, - 0); + add_timer (gettick () + ARGINT (4), + &timer_callback_kill_npc, npc->bl.id, 0); - return 0; + return 0; } -static void -entity_warp(entity_t *target, int destm, int destx, int desty) +static void entity_warp (entity_t * target, int destm, int destx, int desty) { - if (target->type == BL_PC - || target->type == BL_MOB) { - - switch (target->type) { - case BL_PC: { - character_t *character = (character_t *) target; - clif_clearchar_area(&character->bl, 3); - map_delblock(&character->bl); - character->bl.x = destx; - character->bl.y = desty; - character->bl.m = destm; + if (target->type == BL_PC || target->type == BL_MOB) + { + + switch (target->type) + { + case BL_PC: + { + character_t *character = (character_t *) target; + clif_clearchar_area (&character->bl, 3); + map_delblock (&character->bl); + character->bl.x = destx; + character->bl.y = desty; + character->bl.m = destm; + + pc_touch_all_relevant_npcs (character); + + // Note that touching NPCs may have triggered warping and thereby updated x and y: + clif_changemap (character, map[character->bl.m].name, + character->bl.x, character->bl.y); - pc_touch_all_relevant_npcs(character); - - // Note that touching NPCs may have triggered warping and thereby updated x and y: - clif_changemap(character, map[character->bl.m].name, character->bl.x, character->bl.y); - - break; - } - case BL_MOB: - target->x = destx; - target->y = desty; - target->m = destm; - clif_fixmobpos((struct mob_data *) target); - break; - } + break; + } + case BL_MOB: + target->x = destx; + target->y = desty; + target->m = destm; + clif_fixmobpos ((struct mob_data *) target); + break; } + } } -static int -op_move(env_t *env, int args_nr, val_t *args) +static int op_move (env_t * env, int args_nr, val_t * args) { - entity_t *subject = ARGENTITY(0); - int dir = ARGDIR(1); + entity_t *subject = ARGENTITY (0); + int dir = ARGDIR (1); - int newx = subject->x + heading_x[dir]; - int newy = subject->y + heading_y[dir]; + int newx = subject->x + heading_x[dir]; + int newy = subject->y + heading_y[dir]; - if (!map_is_solid(subject->m, newx, newy)) - entity_warp(subject, subject->m, newx, newy); + if (!map_is_solid (subject->m, newx, newy)) + entity_warp (subject, subject->m, newx, newy); - return 0; + return 0; } -static int -op_warp(env_t *env, int args_nr, val_t *args) +static int op_warp (env_t * env, int args_nr, val_t * args) { - entity_t *subject = ARGENTITY(0); - location_t *loc = &ARGLOCATION(1); + entity_t *subject = ARGENTITY (0); + location_t *loc = &ARGLOCATION (1); - entity_warp(subject, loc->m, loc->x, loc->y); + entity_warp (subject, loc->m, loc->x, loc->y); - return 0; + return 0; } -static int -op_banish(env_t *env, int args_nr, val_t *args) +static int op_banish (env_t * env, int args_nr, val_t * args) { - entity_t *subject = ARGENTITY(0); + entity_t *subject = ARGENTITY (0); - if (subject->type == BL_MOB) { - struct mob_data *mob = (struct mob_data *) subject; + if (subject->type == BL_MOB) + { + struct mob_data *mob = (struct mob_data *) subject; - if (mob->mode & MOB_MODE_SUMMONED) - mob_catch_delete(mob, 3); - } + if (mob->mode & MOB_MODE_SUMMONED) + mob_catch_delete (mob, 3); + } - return 0; + return 0; } static void -record_status_change(invocation_t *invocation, int bl_id, int sc_id) +record_status_change (invocation_t * invocation, int bl_id, int sc_id) { - int index = invocation->status_change_refs_nr++; - status_change_ref_t *cr; - - if (invocation->status_change_refs) - invocation->status_change_refs = realloc(invocation->status_change_refs, - sizeof(status_change_ref_t) - * invocation->status_change_refs_nr); - else - invocation->status_change_refs = malloc(sizeof(status_change_ref_t)); - - cr = &invocation->status_change_refs[index]; - - cr->sc_type = sc_id; - cr->bl_id = bl_id; + int index = invocation->status_change_refs_nr++; + status_change_ref_t *cr; + + if (invocation->status_change_refs) + invocation->status_change_refs = + realloc (invocation->status_change_refs, + sizeof (status_change_ref_t) * + invocation->status_change_refs_nr); + else + invocation->status_change_refs = + malloc (sizeof (status_change_ref_t)); + + cr = &invocation->status_change_refs[index]; + + cr->sc_type = sc_id; + cr->bl_id = bl_id; } -static int -op_status_change(env_t *env, int args_nr, val_t *args) +static int op_status_change (env_t * env, int args_nr, val_t * args) { - entity_t *subject = ARGENTITY(0); - int invocation_id = VAR(VAR_INVOCATION).ty == TY_INVOCATION - ? VAR(VAR_INVOCATION).v.v_int - : 0; - invocation_t *invocation = (invocation_t *)map_id2bl(invocation_id); + entity_t *subject = ARGENTITY (0); + int invocation_id = VAR (VAR_INVOCATION).ty == TY_INVOCATION + ? VAR (VAR_INVOCATION).v.v_int : 0; + invocation_t *invocation = (invocation_t *) map_id2bl (invocation_id); - skill_status_effect(subject, ARGINT(1), ARGINT(2), ARGINT(3), ARGINT(4), ARGINT(5), ARGINT(6), 0, invocation_id); + skill_status_effect (subject, ARGINT (1), ARGINT (2), ARGINT (3), + ARGINT (4), ARGINT (5), ARGINT (6), 0, + invocation_id); - if (invocation && subject->type == BL_PC) - record_status_change(invocation, subject->id, ARGINT(1)); + if (invocation && subject->type == BL_PC) + record_status_change (invocation, subject->id, ARGINT (1)); - return 0; + return 0; } -static int -op_stop_status_change(env_t *env, int args_nr, val_t *args) +static int op_stop_status_change (env_t * env, int args_nr, val_t * args) { - entity_t *subject = ARGENTITY(0); + entity_t *subject = ARGENTITY (0); - skill_status_change_end(subject, ARGINT(1), -1); + skill_status_change_end (subject, ARGINT (1), -1); - return 0; + return 0; } -static int -op_override_attack(env_t *env, int args_nr, val_t *args) +static int op_override_attack (env_t * env, int args_nr, val_t * args) { - entity_t *psubject = ARGENTITY(0); - int charges = ARGINT(1); - int attack_delay = ARGINT(2); - int attack_range = ARGINT(3); - int icon = ARGINT(4); - int look = ARGINT(5); - int stopattack = ARGINT(6); - character_t *subject; - - if (psubject->type != BL_PC) - return 0; + entity_t *psubject = ARGENTITY (0); + int charges = ARGINT (1); + int attack_delay = ARGINT (2); + int attack_range = ARGINT (3); + int icon = ARGINT (4); + int look = ARGINT (5); + int stopattack = ARGINT (6); + character_t *subject; + + if (psubject->type != BL_PC) + return 0; - subject = (character_t *) psubject; + subject = (character_t *) psubject; - if (subject->attack_spell_override) { - invocation_t *old_invocation = (invocation_t *)map_id2bl(subject->attack_spell_override); - if (old_invocation) - spell_free_invocation(old_invocation); - } + if (subject->attack_spell_override) + { + invocation_t *old_invocation = + (invocation_t *) map_id2bl (subject->attack_spell_override); + if (old_invocation) + spell_free_invocation (old_invocation); + } - subject->attack_spell_override = trigger_spell(subject->bl.id, VAR(VAR_INVOCATION).v.v_int); - subject->attack_spell_charges = charges; + subject->attack_spell_override = + trigger_spell (subject->bl.id, VAR (VAR_INVOCATION).v.v_int); + subject->attack_spell_charges = charges; - if (subject->attack_spell_override) { - invocation_t *attack_spell = (invocation_t *)map_id2bl(subject->attack_spell_override); - if (attack_spell && stopattack) - attack_spell->flags |= INVOCATION_FLAG_STOPATTACK; + if (subject->attack_spell_override) + { + invocation_t *attack_spell = + (invocation_t *) map_id2bl (subject->attack_spell_override); + if (attack_spell && stopattack) + attack_spell->flags |= INVOCATION_FLAG_STOPATTACK; - char_set_weapon_icon(subject, charges, icon, look); - char_set_attack_info(subject, attack_delay, attack_range); - } + char_set_weapon_icon (subject, charges, icon, look); + char_set_attack_info (subject, attack_delay, attack_range); + } - return 0; + return 0; } -static int -op_create_item(env_t *env, int args_nr, val_t *args) +static int op_create_item (env_t * env, int args_nr, val_t * args) { - struct item item; - entity_t *entity = ARGENTITY(0); - character_t *subject; - int stackable; - int count = ARGINT(2); - if (count <= 0) - return 0; + struct item item; + entity_t *entity = ARGENTITY (0); + character_t *subject; + int stackable; + int count = ARGINT (2); + if (count <= 0) + return 0; - if (entity->type == BL_PC) - subject = (character_t *) entity; - else - return 0; + if (entity->type == BL_PC) + subject = (character_t *) entity; + else + return 0; - GET_ARG_ITEM(1, item, stackable); + GET_ARG_ITEM (1, item, stackable); - if (!stackable) - while (count--) - pc_additem(subject, &item, 1); - else - pc_additem(subject, &item, count); + if (!stackable) + while (count--) + pc_additem (subject, &item, 1); + else + pc_additem (subject, &item, count); - return 0; + return 0; } - #define AGGRAVATION_MODE_ATTACKS_CASTER(n) ((n) == 0 || (n) == 2) #define AGGRAVATION_MODE_MAKES_AGGRESSIVE(n) ((n) > 0) -static int -op_aggravate(env_t *env, int args_nr, val_t *args) +static int op_aggravate (env_t * env, int args_nr, val_t * args) { - entity_t *victim = ARGENTITY(2); - int mode = ARGINT(1); - entity_t *target = ARGENTITY(0); - struct mob_data *other; - - if (target->type == BL_MOB) - other = (struct mob_data *) target; - else - return 0; + entity_t *victim = ARGENTITY (2); + int mode = ARGINT (1); + entity_t *target = ARGENTITY (0); + struct mob_data *other; + + if (target->type == BL_MOB) + other = (struct mob_data *) target; + else + return 0; - mob_target(other, victim, battle_get_range(victim)); + mob_target (other, victim, battle_get_range (victim)); - if (AGGRAVATION_MODE_MAKES_AGGRESSIVE(mode)) - other->mode = 0x85 | (other->mode & MOB_SENSIBLE_MASK); /* war */ + if (AGGRAVATION_MODE_MAKES_AGGRESSIVE (mode)) + other->mode = 0x85 | (other->mode & MOB_SENSIBLE_MASK); /* war */ - if (AGGRAVATION_MODE_ATTACKS_CASTER(mode)) { - other->target_id = victim->id; - other->attacked_id = victim->id; - } + if (AGGRAVATION_MODE_ATTACKS_CASTER (mode)) + { + other->target_id = victim->id; + other->attacked_id = victim->id; + } - return 0; + return 0; } #define MONSTER_ATTITUDE_HOSTILE 0 @@ -605,417 +617,432 @@ op_aggravate(env_t *env, int args_nr, val_t *args) #define MONSTER_ATTITUDE_SERVANT 2 #define MONSTER_ATTITUDE_FROZEN 3 -static int -op_spawn(env_t *env, int args_nr, val_t *args) +static int op_spawn (env_t * env, int args_nr, val_t * args) { - area_t *area = ARGAREA(0); - entity_t *owner_e = ARGENTITY(1); - int monster_id = ARGINT(2); - int monster_attitude = ARGINT(3); - int monster_count = ARGINT(4); - int monster_lifetime = ARGINT(5); - int i; - - character_t *owner = (monster_attitude == MONSTER_ATTITUDE_SERVANT && owner_e->type == BL_PC) - ? (character_t *) owner_e - : NULL; - - for (i = 0; i < monster_count; i++) { - location_t loc; - magic_random_location(&loc, area); - - int mob_id; - struct mob_data *mob; - - mob_id = mob_once_spawn(owner, map[loc.m].name, loc.x, loc.y, "--ja--", // Is that needed? - monster_id, 1, ""); - - mob = (struct mob_data *)map_id2bl(mob_id); - - if (mob) { - mob->mode = mob_db[monster_id].mode; - - switch (monster_attitude) { - - case MONSTER_ATTITUDE_SERVANT: - mob->state.special_mob_ai = 1; - mob->mode |= 0x04; - break; - - case MONSTER_ATTITUDE_FRIENDLY: - mob->mode = 0x80 | (mob->mode & 1); - break; - - case MONSTER_ATTITUDE_HOSTILE: - mob->mode = 0x84 | (mob ->mode & 1); - if (owner) { - mob->target_id = owner->bl.id; - mob->attacked_id = owner->bl.id; - } - break; - - case MONSTER_ATTITUDE_FROZEN: - mob->mode = 0; - break; - } - - mob->mode |= MOB_MODE_SUMMONED | MOB_MODE_TURNS_AGAINST_BAD_MASTER; - - mob->deletetimer = add_timer(gettick() + monster_lifetime, - mob_timer_delete, - mob_id, 0); - - if (owner) { - mob->master_id = owner->bl.id; - mob->master_dist = 6; - } - } + area_t *area = ARGAREA (0); + entity_t *owner_e = ARGENTITY (1); + int monster_id = ARGINT (2); + int monster_attitude = ARGINT (3); + int monster_count = ARGINT (4); + int monster_lifetime = ARGINT (5); + int i; + + character_t *owner = (monster_attitude == MONSTER_ATTITUDE_SERVANT + && owner_e->type == + BL_PC) ? (character_t *) owner_e : NULL; + + for (i = 0; i < monster_count; i++) + { + location_t loc; + magic_random_location (&loc, area); + + int mob_id; + struct mob_data *mob; + + mob_id = mob_once_spawn (owner, map[loc.m].name, loc.x, loc.y, "--ja--", // Is that needed? + monster_id, 1, ""); + + mob = (struct mob_data *) map_id2bl (mob_id); + + if (mob) + { + mob->mode = mob_db[monster_id].mode; + + switch (monster_attitude) + { + + case MONSTER_ATTITUDE_SERVANT: + mob->state.special_mob_ai = 1; + mob->mode |= 0x04; + break; + + case MONSTER_ATTITUDE_FRIENDLY: + mob->mode = 0x80 | (mob->mode & 1); + break; + + case MONSTER_ATTITUDE_HOSTILE: + mob->mode = 0x84 | (mob->mode & 1); + if (owner) + { + mob->target_id = owner->bl.id; + mob->attacked_id = owner->bl.id; + } + break; + + case MONSTER_ATTITUDE_FROZEN: + mob->mode = 0; + break; + } + + mob->mode |= + MOB_MODE_SUMMONED | MOB_MODE_TURNS_AGAINST_BAD_MASTER; + + mob->deletetimer = add_timer (gettick () + monster_lifetime, + mob_timer_delete, mob_id, 0); + + if (owner) + { + mob->master_id = owner->bl.id; + mob->master_dist = 6; + } } + } - return 0; + return 0; } - -static char * -get_invocation_name(env_t *env) +static char *get_invocation_name (env_t * env) { - invocation_t *invocation; + invocation_t *invocation; - if (VAR(VAR_INVOCATION).ty != TY_INVOCATION) - return "?"; - invocation = (invocation_t *)map_id2bl(VAR(VAR_INVOCATION).v.v_int); + if (VAR (VAR_INVOCATION).ty != TY_INVOCATION) + return "?"; + invocation = (invocation_t *) map_id2bl (VAR (VAR_INVOCATION).v.v_int); - if (invocation) - return invocation->spell->name; - else - return "??"; + if (invocation) + return invocation->spell->name; + else + return "??"; } - -static int -op_injure(env_t *env, int args_nr, val_t *args) +static int op_injure (env_t * env, int args_nr, val_t * args) { - entity_t *caster = ARGENTITY(0); - entity_t *target = ARGENTITY(1); - int damage_caused = ARGINT(2); - int mp_damage = ARGINT(3); - int target_hp = battle_get_hp(target); - int mdef = battle_get_mdef(target); - - if (target->type == BL_PC - && !map[target->m].flag.pvp) - return 0; /* Cannot damage other players outside of pvp */ - - if (target != caster) { - /* Not protected against own spells */ - damage_caused = (damage_caused * (100 - mdef)) / 100; - mp_damage = (mp_damage * (100 - mdef)) / 100; - } - - damage_caused = (damage_caused > target_hp) ? target_hp : damage_caused; - - if (damage_caused < 0) - damage_caused = 0; - - // display damage first, because dealing damage may deallocate the target. - clif_damage(caster, target, gettick(), - 0, 0, damage_caused, 0, 0, 0); - - if (caster->type == BL_PC) { - character_t *caster_pc = (character_t *) caster; - if (target->type == BL_MOB) { - struct mob_data *mob = (struct mob_data *) target; + entity_t *caster = ARGENTITY (0); + entity_t *target = ARGENTITY (1); + int damage_caused = ARGINT (2); + int mp_damage = ARGINT (3); + int target_hp = battle_get_hp (target); + int mdef = battle_get_mdef (target); + + if (target->type == BL_PC && !map[target->m].flag.pvp) + return 0; /* Cannot damage other players outside of pvp */ + + if (target != caster) + { + /* Not protected against own spells */ + damage_caused = (damage_caused * (100 - mdef)) / 100; + mp_damage = (mp_damage * (100 - mdef)) / 100; + } + + damage_caused = (damage_caused > target_hp) ? target_hp : damage_caused; + + if (damage_caused < 0) + damage_caused = 0; + + // display damage first, because dealing damage may deallocate the target. + clif_damage (caster, target, gettick (), 0, 0, damage_caused, 0, 0, 0); + + if (caster->type == BL_PC) + { + character_t *caster_pc = (character_t *) caster; + if (target->type == BL_MOB) + { + struct mob_data *mob = (struct mob_data *) target; - MAP_LOG_PC(caster_pc, "SPELLDMG MOB%d %d FOR %d BY %s", - mob->bl.id, mob->class, damage_caused, - get_invocation_name(env)); - } + MAP_LOG_PC (caster_pc, "SPELLDMG MOB%d %d FOR %d BY %s", + mob->bl.id, mob->class, damage_caused, + get_invocation_name (env)); } - battle_damage(caster, target, damage_caused, mp_damage); + } + battle_damage (caster, target, damage_caused, mp_damage); - return 0; + return 0; } -static int -op_emote(env_t *env, int args_nr, val_t *args) +static int op_emote (env_t * env, int args_nr, val_t * args) { - entity_t *victim = ARGENTITY(0); - int emotion = ARGINT(1); - clif_emotion(victim, emotion); + entity_t *victim = ARGENTITY (0); + int emotion = ARGINT (1); + clif_emotion (victim, emotion); - return 0; + return 0; } -static int -op_set_script_variable(env_t *env, int args_nr, val_t *args) +static int op_set_script_variable (env_t * env, int args_nr, val_t * args) { - character_t *c = (ETY(0) == BL_PC)? ARGPC(0) : NULL; + character_t *c = (ETY (0) == BL_PC) ? ARGPC (0) : NULL; - if (!c) - return 1; + if (!c) + return 1; - pc_setglobalreg(c, ARGSTR(1), ARGINT(2)); + pc_setglobalreg (c, ARGSTR (1), ARGINT (2)); - return 0; + return 0; } - -static int -op_set_hair_colour(env_t *env, int args_nr, val_t *args) +static int op_set_hair_colour (env_t * env, int args_nr, val_t * args) { - character_t *c = (ETY(0) == BL_PC)? ARGPC(0) : NULL; + character_t *c = (ETY (0) == BL_PC) ? ARGPC (0) : NULL; - if (!c) - return 1; + if (!c) + return 1; - pc_changelook(c, LOOK_HAIR_COLOR, ARGINT(1)); + pc_changelook (c, LOOK_HAIR_COLOR, ARGINT (1)); - return 0; + return 0; } - -static int -op_set_hair_style(env_t *env, int args_nr, val_t *args) +static int op_set_hair_style (env_t * env, int args_nr, val_t * args) { - character_t *c = (ETY(0) == BL_PC)? ARGPC(0) : NULL; + character_t *c = (ETY (0) == BL_PC) ? ARGPC (0) : NULL; - if (!c) - return 1; + if (!c) + return 1; - pc_changelook(c, LOOK_HAIR, ARGINT(1)); + pc_changelook (c, LOOK_HAIR, ARGINT (1)); - return 0; + return 0; } -static int -op_drop_item_for(env_t *env, int args_nr, val_t *args) +static int op_drop_item_for (env_t * env, int args_nr, val_t * args) { - struct item item; - int stackable; - location_t *loc = &ARGLOCATION(0); - int count = ARGINT(2); - int time = ARGINT(3); - character_t *c = ((args_nr > 4) && (ETY(4) == BL_PC))? ARGPC(4) : NULL; - int delay = (args_nr > 5)? ARGINT(5) : 0; - int delaytime[3] = { delay, delay, delay }; - character_t *owners[3] = { c, NULL, NULL }; - - GET_ARG_ITEM(1, item, stackable); - - if (stackable) - map_addflooritem_any(&item, count, loc->m, loc->x, loc->y, - owners, delaytime, - time, 0); - else while (count-- > 0) - map_addflooritem_any(&item, 1, loc->m, loc->x, loc->y, - owners, delaytime, - time, 0); + struct item item; + int stackable; + location_t *loc = &ARGLOCATION (0); + int count = ARGINT (2); + int time = ARGINT (3); + character_t *c = ((args_nr > 4) && (ETY (4) == BL_PC)) ? ARGPC (4) : NULL; + int delay = (args_nr > 5) ? ARGINT (5) : 0; + int delaytime[3] = { delay, delay, delay }; + character_t *owners[3] = { c, NULL, NULL }; + + GET_ARG_ITEM (1, item, stackable); + + if (stackable) + map_addflooritem_any (&item, count, loc->m, loc->x, loc->y, + owners, delaytime, time, 0); + else + while (count-- > 0) + map_addflooritem_any (&item, 1, loc->m, loc->x, loc->y, + owners, delaytime, time, 0); - return 0; + return 0; } -static int -op_gain_exp(env_t *env, int args_nr, val_t *args) +static int op_gain_exp (env_t * env, int args_nr, val_t * args) { - character_t *c = (ETY(0) == BL_PC)? ARGPC(0) : NULL; + character_t *c = (ETY (0) == BL_PC) ? ARGPC (0) : NULL; - if (!c) - return 1; + if (!c) + return 1; - pc_gainexp_reason(c, ARGINT(1), ARGINT(2), ARGINT(3)); - return 0; + pc_gainexp_reason (c, ARGINT (1), ARGINT (2), ARGINT (3)); + return 0; } -static op_t operations[] = -{ - { "sfx", ".ii", op_sfx }, - { "instaheal", "eii", op_instaheal }, - { "itemheal", "eii", op_itemheal }, - { "shroud", "ei", op_shroud }, - { "unshroud", "e", op_reveal }, - { "message", "es", op_message }, - { "messenger_npc", "lissi", op_messenger_npc }, - { "move", "ed", op_move }, - { "warp", "el", op_warp }, - { "banish", "e", op_banish }, - { "status_change", "eiiiiii", op_status_change }, - { "stop_status_change", "ei", op_stop_status_change }, - { "override_attack", "eiiiiii", op_override_attack }, - { "create_item", "e.i", op_create_item }, - { "aggravate", "eie", op_aggravate }, - { "spawn", "aeiiii", op_spawn }, - { "injure", "eeii", op_injure }, - { "emote", "ei", op_emote }, - { "set_script_variable", "esi", op_set_script_variable }, - { "set_hair_colour", "ei", op_set_hair_colour }, - { "set_hair_style", "ei", op_set_hair_style }, - { "drop_item", "l.ii", op_drop_item_for }, - { "drop_item_for", "l.iiei", op_drop_item_for }, - { "gain_experience", "eiii", op_gain_exp }, - { NULL, NULL, NULL } +static op_t operations[] = { + {"sfx", ".ii", op_sfx}, + {"instaheal", "eii", op_instaheal}, + {"itemheal", "eii", op_itemheal}, + {"shroud", "ei", op_shroud}, + {"unshroud", "e", op_reveal}, + {"message", "es", op_message}, + {"messenger_npc", "lissi", op_messenger_npc}, + {"move", "ed", op_move}, + {"warp", "el", op_warp}, + {"banish", "e", op_banish}, + {"status_change", "eiiiiii", op_status_change}, + {"stop_status_change", "ei", op_stop_status_change}, + {"override_attack", "eiiiiii", op_override_attack}, + {"create_item", "e.i", op_create_item}, + {"aggravate", "eie", op_aggravate}, + {"spawn", "aeiiii", op_spawn}, + {"injure", "eeii", op_injure}, + {"emote", "ei", op_emote}, + {"set_script_variable", "esi", op_set_script_variable}, + {"set_hair_colour", "ei", op_set_hair_colour}, + {"set_hair_style", "ei", op_set_hair_style}, + {"drop_item", "l.ii", op_drop_item_for}, + {"drop_item_for", "l.iiei", op_drop_item_for}, + {"gain_experience", "eiii", op_gain_exp}, + {NULL, NULL, NULL} }; static int operations_sorted = 0; static int operation_count; - -int -compare_operations(const void *lhs, const void *rhs) +int compare_operations (const void *lhs, const void *rhs) { - return strcmp(((op_t *)lhs)->name, ((op_t *)rhs)->name); + return strcmp (((op_t *) lhs)->name, ((op_t *) rhs)->name); } - -op_t * -magic_get_op(char *name, int *index) +op_t *magic_get_op (char *name, int *index) { - op_t key; + op_t key; - if (!operations_sorted) { - op_t *opc = operations; + if (!operations_sorted) + { + op_t *opc = operations; - while (opc->name) - ++opc; + while (opc->name) + ++opc; - operation_count = opc - operations; + operation_count = opc - operations; - qsort(operations, operation_count, sizeof(op_t), compare_operations); - operations_sorted = 1; - } + qsort (operations, operation_count, sizeof (op_t), + compare_operations); + operations_sorted = 1; + } - key.name = name; - op_t *op = bsearch(&key, operations, operation_count, sizeof(op_t), compare_operations); + key.name = name; + op_t *op = bsearch (&key, operations, operation_count, sizeof (op_t), + compare_operations); - if (op && index) - *index = op - operations; + if (op && index) + *index = op - operations; - return op; + return op; } - void -spell_effect_report_termination(int invocation_id, int bl_id, int sc_id, int supplanted) +spell_effect_report_termination (int invocation_id, int bl_id, int sc_id, + int supplanted) { - int i; - int index = -1; - invocation_t *invocation = (invocation_t *) map_id2bl(invocation_id); - - if (!invocation || invocation->bl.type != BL_SPELL) - return; - - for (i = 0; i < invocation->status_change_refs_nr; i++) { - status_change_ref_t *cr = &invocation->status_change_refs[i]; - if (cr->sc_type == sc_id && cr->bl_id == bl_id) { - index = i; - break; - } - } - - if (index == -1) { - entity_t *entity = map_id2bl(bl_id); - if (entity->type == BL_PC) - fprintf(stderr, "[magic] INTERNAL ERROR: spell-effect-report-termination: tried to terminate on unexpected bl %d, sc %d\n", bl_id, sc_id); - return; + int i; + int index = -1; + invocation_t *invocation = (invocation_t *) map_id2bl (invocation_id); + + if (!invocation || invocation->bl.type != BL_SPELL) + return; + + for (i = 0; i < invocation->status_change_refs_nr; i++) + { + status_change_ref_t *cr = &invocation->status_change_refs[i]; + if (cr->sc_type == sc_id && cr->bl_id == bl_id) + { + index = i; + break; } + } - if (index == invocation->status_change_refs_nr -1) - invocation->status_change_refs_nr--; - else /* Copy last change ref to the one we are deleting */ - invocation->status_change_refs[index] = invocation->status_change_refs[--invocation->status_change_refs_nr]; - - try_to_finish_invocation(invocation); + if (index == -1) + { + entity_t *entity = map_id2bl (bl_id); + if (entity->type == BL_PC) + fprintf (stderr, + "[magic] INTERNAL ERROR: spell-effect-report-termination: tried to terminate on unexpected bl %d, sc %d\n", + bl_id, sc_id); + return; + } + + if (index == invocation->status_change_refs_nr - 1) + invocation->status_change_refs_nr--; + else /* Copy last change ref to the one we are deleting */ + invocation->status_change_refs[index] = + invocation-> + status_change_refs[--invocation->status_change_refs_nr]; + + try_to_finish_invocation (invocation); } -static effect_t * -return_to_stack(invocation_t *invocation) +static effect_t *return_to_stack (invocation_t * invocation) { - if (!invocation->stack_size) - return NULL; - else { - cont_activation_record_t *ar = invocation->stack + (invocation->stack_size - 1); - switch (ar->ty) { - - case CONT_STACK_PROC: { - effect_t *ret = ar->return_location; - int i; - - for (i = 0; i < ar->c.c_proc.args_nr; i++) { - val_t *var = &invocation->env->vars[ar->c.c_proc.formals[i]]; - magic_clear_var(var); - *var = ar->c.c_proc.old_actuals[i]; - } - - clear_activation_record(ar); - --invocation->stack_size; - - return ret; + if (!invocation->stack_size) + return NULL; + else + { + cont_activation_record_t *ar = + invocation->stack + (invocation->stack_size - 1); + switch (ar->ty) + { + + case CONT_STACK_PROC: + { + effect_t *ret = ar->return_location; + int i; + + for (i = 0; i < ar->c.c_proc.args_nr; i++) + { + val_t *var = + &invocation->env->vars[ar->c.c_proc.formals[i]]; + magic_clear_var (var); + *var = ar->c.c_proc.old_actuals[i]; } - case CONT_STACK_FOREACH: { - int entity_id; - val_t *var = &invocation->env->vars[ar->c.c_foreach.id]; + clear_activation_record (ar); + --invocation->stack_size; - do { - if (ar->c.c_foreach.index >= ar->c.c_foreach.entities_nr) { - effect_t *ret = ar->return_location; - clear_activation_record(ar); - --invocation->stack_size; - return ret; - } + return ret; + } - entity_id = ar->c.c_foreach.entities[ar->c.c_foreach.index++]; - } while (!entity_id || !map_id2bl(entity_id)); + case CONT_STACK_FOREACH: + { + int entity_id; + val_t *var = &invocation->env->vars[ar->c.c_foreach.id]; - magic_clear_var(var); - var->ty = ar->c.c_foreach.ty; - var->v.v_int = entity_id; + do + { + if (ar->c.c_foreach.index >= ar->c.c_foreach.entities_nr) + { + effect_t *ret = ar->return_location; + clear_activation_record (ar); + --invocation->stack_size; + return ret; + } - return ar->c.c_foreach.body; + entity_id = + ar->c.c_foreach.entities[ar->c.c_foreach.index++]; + } + while (!entity_id || !map_id2bl (entity_id)); + + magic_clear_var (var); + var->ty = ar->c.c_foreach.ty; + var->v.v_int = entity_id; + + return ar->c.c_foreach.body; + } + + case CONT_STACK_FOR: + if (ar->c.c_for.current > ar->c.c_for.stop) + { + effect_t *ret = ar->return_location; + clear_activation_record (ar); + --invocation->stack_size; + return ret; } - case CONT_STACK_FOR: - if (ar->c.c_for.current > ar->c.c_for.stop) { - effect_t *ret = ar->return_location; - clear_activation_record(ar); - --invocation->stack_size; - return ret; - } - - magic_clear_var(&invocation->env->vars[ar->c.c_for.id]); - invocation->env->vars[ar->c.c_for.id].ty = TY_INT; - invocation->env->vars[ar->c.c_for.id].v.v_int = ar->c.c_for.current++; + magic_clear_var (&invocation->env->vars[ar->c.c_for.id]); + invocation->env->vars[ar->c.c_for.id].ty = TY_INT; + invocation->env->vars[ar->c.c_for.id].v.v_int = + ar->c.c_for.current++; - return ar->c.c_for.body; + return ar->c.c_for.body; - default: - fprintf(stderr, "[magic] INTERNAL ERROR: While executing spell `%s': stack corruption\n", invocation->spell->name); - return NULL; - } + default: + fprintf (stderr, + "[magic] INTERNAL ERROR: While executing spell `%s': stack corruption\n", + invocation->spell->name); + return NULL; } + } } -static cont_activation_record_t * -add_stack_entry(invocation_t *invocation, int ty, effect_t *return_location) +static cont_activation_record_t *add_stack_entry (invocation_t * invocation, + int ty, + effect_t * return_location) { - cont_activation_record_t *ar = invocation->stack + invocation->stack_size++; - if (invocation->stack_size >= MAX_STACK_SIZE) { - fprintf(stderr, "[magic] Execution stack size exceeded in spell `%s'; truncating effect\n", invocation->spell->name); - invocation->stack_size--; - return NULL; - } - - ar->ty = ty; - ar->return_location = return_location; - return ar; + cont_activation_record_t *ar = + invocation->stack + invocation->stack_size++; + if (invocation->stack_size >= MAX_STACK_SIZE) + { + fprintf (stderr, + "[magic] Execution stack size exceeded in spell `%s'; truncating effect\n", + invocation->spell->name); + invocation->stack_size--; + return NULL; + } + + ar->ty = ty; + ar->return_location = return_location; + return ar; } -static int -find_entities_in_area_c(entity_t *target, va_list va) +static int find_entities_in_area_c (entity_t * target, va_list va) { - int *entities_allocd_p = va_arg(va, int *); - int *entities_nr_p = va_arg(va, int *); - int **entities_p = va_arg(va, int **); - int filter = va_arg(va, int); + int *entities_allocd_p = va_arg (va, int *); + int *entities_nr_p = va_arg (va, int *); + int **entities_p = va_arg (va, int **); + int filter = va_arg (va, int); /* The following macro adds an entity to the result list: */ #define ADD_ENTITY(e) \ @@ -1026,252 +1053,282 @@ find_entities_in_area_c(entity_t *target, va_list va) } \ (*entities_p)[(*entities_nr_p)++] = e; - - - switch (target->type) { + switch (target->type) + { case BL_PC: - if (filter == FOREACH_FILTER_PC - || filter == FOREACH_FILTER_ENTITY - || (filter == FOREACH_FILTER_TARGET - && map[target->m].flag.pvp)) - break; - else if (filter == FOREACH_FILTER_SPELL) { /* Check all spells bound to the caster */ - invocation_t *invoc = ((character_t *) target) -> active_spells; - /* Add all spells locked onto thie PC */ - - while (invoc) { - ADD_ENTITY(invoc->bl.id); - invoc = invoc->next_invocation; - } + if (filter == FOREACH_FILTER_PC + || filter == FOREACH_FILTER_ENTITY + || (filter == FOREACH_FILTER_TARGET + && map[target->m].flag.pvp)) + break; + else if (filter == FOREACH_FILTER_SPELL) + { /* Check all spells bound to the caster */ + invocation_t *invoc = ((character_t *) target)->active_spells; + /* Add all spells locked onto thie PC */ + + while (invoc) + { + ADD_ENTITY (invoc->bl.id); + invoc = invoc->next_invocation; } - return 0; + } + return 0; case BL_MOB: - if (filter == FOREACH_FILTER_MOB - || filter == FOREACH_FILTER_ENTITY - || filter == FOREACH_FILTER_TARGET) - break; - else - return 0; + if (filter == FOREACH_FILTER_MOB + || filter == FOREACH_FILTER_ENTITY + || filter == FOREACH_FILTER_TARGET) + break; + else + return 0; case BL_SPELL: - if (filter == FOREACH_FILTER_SPELL) { - invocation_t *invocation = (invocation_t *) target; + if (filter == FOREACH_FILTER_SPELL) + { + invocation_t *invocation = (invocation_t *) target; - /* Check whether the spell is `bound'-- if so, we'll consider it iff we see the caster (case BL_PC). */ - if (invocation->flags & INVOCATION_FLAG_BOUND) - return 0; - else - break; /* Add the spell */ - } else - return 0; + /* Check whether the spell is `bound'-- if so, we'll consider it iff we see the caster (case BL_PC). */ + if (invocation->flags & INVOCATION_FLAG_BOUND) + return 0; + else + break; /* Add the spell */ + } + else + return 0; case BL_NPC: - if (filter == FOREACH_FILTER_NPC) - break; - else - return 0; + if (filter == FOREACH_FILTER_NPC) + break; + else + return 0; default: - return 0; - } + return 0; + } - ADD_ENTITY(target->id); + ADD_ENTITY (target->id); #undef ADD_ENTITY - return 0; + return 0; } static void -find_entities_in_area(area_t *area, int *entities_allocd_p, int *entities_nr_p, int **entities_p, int filter) +find_entities_in_area (area_t * area, int *entities_allocd_p, + int *entities_nr_p, int **entities_p, int filter) { - switch (area->ty) { + switch (area->ty) + { case AREA_UNION: - find_entities_in_area(area->a.a_union[0], entities_allocd_p, entities_nr_p, entities_p, filter); - find_entities_in_area(area->a.a_union[1], entities_allocd_p, entities_nr_p, entities_p, filter); - break; + find_entities_in_area (area->a.a_union[0], entities_allocd_p, + entities_nr_p, entities_p, filter); + find_entities_in_area (area->a.a_union[1], entities_allocd_p, + entities_nr_p, entities_p, filter); + break; - default: { - int m, x, y, width, height; - magic_area_rect(&m, &x, &y, &width, &height, area); - map_foreachinarea(find_entities_in_area_c, - m, x, y, x+width, y+height, - 0 /* filter elsewhere */, - entities_allocd_p, entities_nr_p, entities_p, filter); - } + default: + { + int m, x, y, width, height; + magic_area_rect (&m, &x, &y, &width, &height, area); + map_foreachinarea (find_entities_in_area_c, + m, x, y, x + width, y + height, + 0 /* filter elsewhere */ , + entities_allocd_p, entities_nr_p, entities_p, + filter); } + } } -static effect_t * -run_foreach(invocation_t *invocation, effect_t *foreach, effect_t *return_location) +static effect_t *run_foreach (invocation_t * invocation, effect_t * foreach, + effect_t * return_location) { - val_t area; - int filter = foreach->e.e_foreach.filter; - int id = foreach->e.e_foreach.id; - effect_t *body = foreach->e.e_foreach.body; - - magic_eval(invocation->env, &area, foreach->e.e_foreach.area); - - if (area.ty != TY_AREA) { - magic_clear_var(&area); - fprintf(stderr, "[magic] Error in spell `%s': FOREACH loop over non-area\n", invocation->spell->name); - return return_location; - } else { - cont_activation_record_t *ar = add_stack_entry(invocation, CONT_STACK_FOREACH, return_location); - int entities_allocd = 64; - int *entities_collect = malloc(entities_allocd * sizeof(int)); - int *entities; - int *shuffle_board; - int entities_nr = 0; - int i; - - if (!ar) - return return_location; - - find_entities_in_area(area.v.v_area, &entities_allocd, &entities_nr, &entities_collect, filter); - - /* Now shuffle */ - shuffle_board = malloc((sizeof(int) * (1 + entities_nr))); // +1: to avoid spurious warnings in memory profilers - entities = malloc((sizeof(int) * (1 + entities_nr))); // +1: to avoid spurious warnings in memory profilers - for (i = 0; i < entities_nr; i++) - shuffle_board[i] = i; - - for (i = entities_nr - 1 ; i >= 0; i--) { - int random_index = rand() % (i + 1); - entities[i] = entities_collect[shuffle_board[random_index]]; - shuffle_board[random_index] = shuffle_board[i]; // thus, we are guaranteed only to use unused indices - } + val_t area; + int filter = foreach->e.e_foreach.filter; + int id = foreach->e.e_foreach.id; + effect_t *body = foreach->e.e_foreach.body; + + magic_eval (invocation->env, &area, foreach->e.e_foreach.area); + + if (area.ty != TY_AREA) + { + magic_clear_var (&area); + fprintf (stderr, + "[magic] Error in spell `%s': FOREACH loop over non-area\n", + invocation->spell->name); + return return_location; + } + else + { + cont_activation_record_t *ar = + add_stack_entry (invocation, CONT_STACK_FOREACH, return_location); + int entities_allocd = 64; + int *entities_collect = malloc (entities_allocd * sizeof (int)); + int *entities; + int *shuffle_board; + int entities_nr = 0; + int i; - free(entities_collect); - free(shuffle_board); - /* Done shuffling */ - - ar->c.c_foreach.id = id; - ar->c.c_foreach.body = body; - ar->c.c_foreach.index = 0; - ar->c.c_foreach.entities_nr = entities_nr; - ar->c.c_foreach.entities = entities; - ar->c.c_foreach.ty = (filter == FOREACH_FILTER_SPELL) ? TY_INVOCATION : TY_ENTITY; - - magic_clear_var(&area); - - return return_to_stack(invocation); - } -} - -static effect_t * -run_for(invocation_t *invocation, effect_t *for_, effect_t *return_location) -{ - cont_activation_record_t *ar; - int id = for_->e.e_for.id; - val_t start; - val_t stop; - - magic_eval(invocation->env, &start, for_->e.e_for.start); - magic_eval(invocation->env, &stop, for_->e.e_for.stop); - - if (start.ty != TY_INT || stop.ty != TY_INT) { - magic_clear_var(&start); - magic_clear_var(&stop); - fprintf(stderr, "[magic] Error in spell `%s': FOR loop start or stop point is not an integer\n", invocation->spell->name); - return return_location; + if (!ar) + return return_location; + + find_entities_in_area (area.v.v_area, &entities_allocd, &entities_nr, + &entities_collect, filter); + + /* Now shuffle */ + shuffle_board = malloc ((sizeof (int) * (1 + entities_nr))); // +1: to avoid spurious warnings in memory profilers + entities = malloc ((sizeof (int) * (1 + entities_nr))); // +1: to avoid spurious warnings in memory profilers + for (i = 0; i < entities_nr; i++) + shuffle_board[i] = i; + + for (i = entities_nr - 1; i >= 0; i--) + { + int random_index = rand () % (i + 1); + entities[i] = entities_collect[shuffle_board[random_index]]; + shuffle_board[random_index] = shuffle_board[i]; // thus, we are guaranteed only to use unused indices } - ar = add_stack_entry(invocation, CONT_STACK_FOR, return_location); + free (entities_collect); + free (shuffle_board); + /* Done shuffling */ - if (!ar) - return return_location; + ar->c.c_foreach.id = id; + ar->c.c_foreach.body = body; + ar->c.c_foreach.index = 0; + ar->c.c_foreach.entities_nr = entities_nr; + ar->c.c_foreach.entities = entities; + ar->c.c_foreach.ty = + (filter == FOREACH_FILTER_SPELL) ? TY_INVOCATION : TY_ENTITY; - ar->c.c_for.id = id; - ar->c.c_for.current = start.v.v_int; - ar->c.c_for.stop = stop.v.v_int; - ar->c.c_for.body = for_->e.e_for.body; + magic_clear_var (&area); - return return_to_stack(invocation); + return return_to_stack (invocation); + } } -static effect_t * -run_call(invocation_t *invocation, effect_t *return_location) +static effect_t *run_for (invocation_t * invocation, effect_t * for_, + effect_t * return_location) { - effect_t *current = invocation->current_effect; - cont_activation_record_t *ar; - int args_nr = current->e.e_call.args_nr; - int *formals = current->e.e_call.formals; - val_t *old_actuals = aCalloc(sizeof(val_t), args_nr); - int i; - - ar = add_stack_entry(invocation, CONT_STACK_PROC, return_location); - ar->c.c_proc.args_nr = args_nr; - ar->c.c_proc.formals = formals; - ar->c.c_proc.old_actuals = old_actuals; - for (i = 0; i < args_nr; i++) { - val_t *env_val = &invocation->env->vars[formals[i]]; - val_t result; - magic_copy_var(&old_actuals[i], env_val); - magic_eval(invocation->env, &result, current->e.e_call.actuals[i]); - *env_val = result; - } + cont_activation_record_t *ar; + int id = for_->e.e_for.id; + val_t start; + val_t stop; + + magic_eval (invocation->env, &start, for_->e.e_for.start); + magic_eval (invocation->env, &stop, for_->e.e_for.stop); + + if (start.ty != TY_INT || stop.ty != TY_INT) + { + magic_clear_var (&start); + magic_clear_var (&stop); + fprintf (stderr, + "[magic] Error in spell `%s': FOR loop start or stop point is not an integer\n", + invocation->spell->name); + return return_location; + } + + ar = add_stack_entry (invocation, CONT_STACK_FOR, return_location); + + if (!ar) + return return_location; + + ar->c.c_for.id = id; + ar->c.c_for.current = start.v.v_int; + ar->c.c_for.stop = stop.v.v_int; + ar->c.c_for.body = for_->e.e_for.body; + + return return_to_stack (invocation); +} - return current->e.e_call.body; +static effect_t *run_call (invocation_t * invocation, + effect_t * return_location) +{ + effect_t *current = invocation->current_effect; + cont_activation_record_t *ar; + int args_nr = current->e.e_call.args_nr; + int *formals = current->e.e_call.formals; + val_t *old_actuals = aCalloc (sizeof (val_t), args_nr); + int i; + + ar = add_stack_entry (invocation, CONT_STACK_PROC, return_location); + ar->c.c_proc.args_nr = args_nr; + ar->c.c_proc.formals = formals; + ar->c.c_proc.old_actuals = old_actuals; + for (i = 0; i < args_nr; i++) + { + val_t *env_val = &invocation->env->vars[formals[i]]; + val_t result; + magic_copy_var (&old_actuals[i], env_val); + magic_eval (invocation->env, &result, current->e.e_call.actuals[i]); + *env_val = result; + } + + return current->e.e_call.body; } #ifdef DEBUG -static void -print_cfg(int i, effect_t *e) +static void print_cfg (int i, effect_t * e) { - int j; - for (j = 0; j < i; j++) - printf(" "); + int j; + for (j = 0; j < i; j++) + printf (" "); - printf("%p: ", e); + printf ("%p: ", e); - if (!e) { - puts(" -- end --"); - return; - } + if (!e) + { + puts (" -- end --"); + return; + } - switch (e->ty) { + switch (e->ty) + { case EFFECT_SKIP: - puts("SKIP"); break; + puts ("SKIP"); + break; case EFFECT_END: - puts("END"); break; + puts ("END"); + break; case EFFECT_ABORT: - puts("ABORT"); break; + puts ("ABORT"); + break; case EFFECT_ASSIGN: - puts("ASSIGN"); break; + puts ("ASSIGN"); + break; case EFFECT_FOREACH: - puts("FOREACH"); - print_cfg(i+1, e->e.e_foreach.body); - break; + puts ("FOREACH"); + print_cfg (i + 1, e->e.e_foreach.body); + break; case EFFECT_FOR: - puts("FOR"); - print_cfg(i+1, e->e.e_for.body); - break; + puts ("FOR"); + print_cfg (i + 1, e->e.e_for.body); + break; case EFFECT_IF: - puts("IF"); - for (j = 0; j < i; j++) - printf(" "); - puts("THEN"); - print_cfg(i+1, e->e.e_if.true_branch); - for (j = 0; j < i; j++) - printf(" "); - puts("ELSE"); - print_cfg(i+1, e->e.e_if.false_branch); - break; + puts ("IF"); + for (j = 0; j < i; j++) + printf (" "); + puts ("THEN"); + print_cfg (i + 1, e->e.e_if.true_branch); + for (j = 0; j < i; j++) + printf (" "); + puts ("ELSE"); + print_cfg (i + 1, e->e.e_if.false_branch); + break; case EFFECT_SLEEP: - puts("SLEEP"); break; + puts ("SLEEP"); + break; case EFFECT_SCRIPT: - puts("SCRIPT"); break; + puts ("SCRIPT"); + break; case EFFECT_BREAK: - puts("BREAK"); break; + puts ("BREAK"); + break; case EFFECT_OP: - puts("OP"); break; - } - print_cfg(i, e->next); + puts ("OP"); + break; + } + print_cfg (i, e->next); } #endif - /** * Execute a spell invocation until we abort, finish, or hit the next `sleep'. * @@ -1281,241 +1338,265 @@ print_cfg(int i, effect_t *e) * >1 if we hit `sleep'; the result is the number of ticks we should sleep for. * -1 if we paused to wait for a user action (via script interaction) */ -static int -spell_run(invocation_t *invocation, int allow_delete) +static int spell_run (invocation_t * invocation, int allow_delete) { - const int invocation_id = invocation->bl.id; + const int invocation_id = invocation->bl.id; #define REFRESH_INVOCATION invocation = (invocation_t *) map_id2bl(invocation_id); if (!invocation) return 0; #ifdef DEBUG - fprintf(stderr, "Resuming execution: invocation of `%s'\n", invocation->spell->name); - print_cfg(1, invocation->current_effect); -#endif - while (invocation->current_effect) { - effect_t *e = invocation->current_effect; - effect_t *next = e->next; - int i; + fprintf (stderr, "Resuming execution: invocation of `%s'\n", + invocation->spell->name); + print_cfg (1, invocation->current_effect); +#endif + while (invocation->current_effect) + { + effect_t *e = invocation->current_effect; + effect_t *next = e->next; + int i; #ifdef DEBUG - fprintf(stderr, "Next step of type %d\n", e->ty); - dump_env(invocation->env); -#endif - - switch (e->ty) { - case EFFECT_SKIP: - break; - - case EFFECT_ABORT: - invocation->flags |= INVOCATION_FLAG_ABORTED; - invocation->end_effect = NULL; - case EFFECT_END: - clear_stack(invocation); - next = NULL; - break; - - case EFFECT_ASSIGN: - magic_eval(invocation->env, &invocation->env->vars[e->e.e_assign.id], e->e.e_assign.expr); - break; - - case EFFECT_FOREACH: - next = run_foreach(invocation, e, next); - break; - - case EFFECT_FOR: - next = run_for(invocation, e, next); - break; - - case EFFECT_IF: - if (magic_eval_int(invocation->env, e->e.e_if.cond)) - next = e->e.e_if.true_branch; - else - next = e->e.e_if.false_branch; - break; - - case EFFECT_SLEEP: { - int sleeptime = magic_eval_int(invocation->env, e->e.e_sleep); - invocation->current_effect = next; - if (sleeptime > 0) - return sleeptime; - break; - } + fprintf (stderr, "Next step of type %d\n", e->ty); + dump_env (invocation->env); +#endif - case EFFECT_SCRIPT: { - character_t *caster = (character_t *) map_id2bl(invocation->caster); - if (caster) { - env_t *env = invocation->env; - character_t *caster = (character_t *)map_id2bl(invocation->caster); - argrec_t arg[] = { {"@target", .v.i = VAR(VAR_TARGET).ty == TY_ENTITY ? 0 : VAR(VAR_TARGET).v.v_int }, - {"@caster", .v.i = invocation->caster }, - {"@caster_name$", .v.s = caster ? caster->status.name : "" }}; - int message_recipient = VAR(VAR_SCRIPTTARGET).ty == TY_ENTITY - ? VAR(VAR_SCRIPTTARGET).v.v_int - : invocation->caster; - character_t *recipient = (character_t *) map_id2bl(message_recipient); - - if (recipient->npc_id && recipient->npc_id != invocation->bl.id) - break; /* Don't send multiple message boxes at once */ - - if (!invocation->script_pos) // first time running this script? - clif_spawn_fake_npc_for_player(recipient, - invocation->bl.id); - // We have to do this or otherwise the client won't think that it's - // dealing with an NPC - - int newpos = run_script_l(e->e.e_script, - invocation->script_pos, - message_recipient, - invocation->bl.id, - 3, arg); - /* Returns the new script position, or -1 once the script is finished */ - if (newpos != -1) { - /* Must set up for continuation */ - recipient->npc_id = invocation->bl.id; - recipient->npc_pos = invocation->script_pos = newpos; - return -1; /* Signal `wait for script' */ - } else - invocation->script_pos = 0; - clif_clearchar_id(invocation->bl.id, 1, caster->fd); - } - REFRESH_INVOCATION; // Script may have killed the caster - break; - } + switch (e->ty) + { + case EFFECT_SKIP: + break; - case EFFECT_BREAK: - next = return_to_stack(invocation); - break; + case EFFECT_ABORT: + invocation->flags |= INVOCATION_FLAG_ABORTED; + invocation->end_effect = NULL; + case EFFECT_END: + clear_stack (invocation); + next = NULL; + break; - case EFFECT_OP: { - op_t *op = &operations[e->e.e_op.id]; - val_t args[MAX_ARGS]; + case EFFECT_ASSIGN: + magic_eval (invocation->env, + &invocation->env->vars[e->e.e_assign.id], + e->e.e_assign.expr); + break; - for (i = 0; i < e->e.e_op.args_nr; i++) - magic_eval(invocation->env, &args[i], e->e.e_op.args[i]); + case EFFECT_FOREACH: + next = run_foreach (invocation, e, next); + break; - if (!magic_signature_check("effect", op->name, op->signature, - e->e.e_op.args_nr, args, - e->e.e_op.line_nr, e->e.e_op.column)) - op->op(invocation->env, e->e.e_op.args_nr, args); + case EFFECT_FOR: + next = run_for (invocation, e, next); + break; - for (i = 0; i < e->e.e_op.args_nr; i++) - magic_clear_var(&args[i]); + case EFFECT_IF: + if (magic_eval_int (invocation->env, e->e.e_if.cond)) + next = e->e.e_if.true_branch; + else + next = e->e.e_if.false_branch; + break; - REFRESH_INVOCATION; // Effect may have killed the caster - break; + case EFFECT_SLEEP: + { + int sleeptime = + magic_eval_int (invocation->env, e->e.e_sleep); + invocation->current_effect = next; + if (sleeptime > 0) + return sleeptime; + break; + } + + case EFFECT_SCRIPT: + { + character_t *caster = + (character_t *) map_id2bl (invocation->caster); + if (caster) + { + env_t *env = invocation->env; + character_t *caster = + (character_t *) map_id2bl (invocation->caster); + argrec_t arg[] = { {"@target",.v.i = + VAR (VAR_TARGET).ty == + TY_ENTITY ? 0 : VAR (VAR_TARGET). + v.v_int} + , + {"@caster",.v.i = invocation->caster} + , + {"@caster_name$",.v.s = caster ? caster->status.name : ""} + }; + int message_recipient = + VAR (VAR_SCRIPTTARGET).ty == + TY_ENTITY ? VAR (VAR_SCRIPTTARGET). + v.v_int : invocation->caster; + character_t *recipient = + (character_t *) map_id2bl (message_recipient); + + if (recipient->npc_id + && recipient->npc_id != invocation->bl.id) + break; /* Don't send multiple message boxes at once */ + + if (!invocation->script_pos) // first time running this script? + clif_spawn_fake_npc_for_player (recipient, + invocation->bl.id); + // We have to do this or otherwise the client won't think that it's + // dealing with an NPC + + int newpos = run_script_l (e->e.e_script, + invocation->script_pos, + message_recipient, + invocation->bl.id, + 3, arg); + /* Returns the new script position, or -1 once the script is finished */ + if (newpos != -1) + { + /* Must set up for continuation */ + recipient->npc_id = invocation->bl.id; + recipient->npc_pos = invocation->script_pos = newpos; + return -1; /* Signal `wait for script' */ + } + else + invocation->script_pos = 0; + clif_clearchar_id (invocation->bl.id, 1, caster->fd); } + REFRESH_INVOCATION; // Script may have killed the caster + break; + } + + case EFFECT_BREAK: + next = return_to_stack (invocation); + break; - case EFFECT_CALL: - next = run_call(invocation, next); - break; + case EFFECT_OP: + { + op_t *op = &operations[e->e.e_op.id]; + val_t args[MAX_ARGS]; - default: - fprintf(stderr, "[magic] INTERNAL ERROR: Unknown effect %d\n", e->ty); - } + for (i = 0; i < e->e.e_op.args_nr; i++) + magic_eval (invocation->env, &args[i], e->e.e_op.args[i]); + if (!magic_signature_check ("effect", op->name, op->signature, + e->e.e_op.args_nr, args, + e->e.e_op.line_nr, + e->e.e_op.column)) + op->op (invocation->env, e->e.e_op.args_nr, args); - if (!next) - next = return_to_stack(invocation); + for (i = 0; i < e->e.e_op.args_nr; i++) + magic_clear_var (&args[i]); - invocation->current_effect = next; + REFRESH_INVOCATION; // Effect may have killed the caster + break; + } + + case EFFECT_CALL: + next = run_call (invocation, next); + break; + + default: + fprintf (stderr, + "[magic] INTERNAL ERROR: Unknown effect %d\n", + e->ty); } - if (allow_delete) - try_to_finish_invocation(invocation); - return 0; + if (!next) + next = return_to_stack (invocation); + + invocation->current_effect = next; + } + + if (allow_delete) + try_to_finish_invocation (invocation); + return 0; #undef REFRESH_INVOCATION } +extern void spell_update_location (invocation_t * invocation); -extern void -spell_update_location(invocation_t *invocation); - -void -spell_execute_d(invocation_t *invocation, int allow_deletion) +void spell_execute_d (invocation_t * invocation, int allow_deletion) { - int delta; + int delta; - spell_update_location(invocation); - delta = spell_run(invocation, allow_deletion); + spell_update_location (invocation); + delta = spell_run (invocation, allow_deletion); - if (delta > 0) { - if (invocation->timer) { - fprintf(stderr, "[magic] FATAL ERROR: Trying to add multiple timers to the same spell! Already had timer: %d\n", invocation->timer); - /* *((int *)0x0) = 0; */ - } - invocation->timer = add_timer(gettick() + delta, - &invocation_timer_callback, - invocation->bl.id, 0); + if (delta > 0) + { + if (invocation->timer) + { + fprintf (stderr, + "[magic] FATAL ERROR: Trying to add multiple timers to the same spell! Already had timer: %d\n", + invocation->timer); + /* *((int *)0x0) = 0; */ } + invocation->timer = add_timer (gettick () + delta, + &invocation_timer_callback, + invocation->bl.id, 0); + } - /* If 0, the script cleaned itself. If -1 (wait-for-script), we must wait for the user. */ + /* If 0, the script cleaned itself. If -1 (wait-for-script), we must wait for the user. */ } -void -spell_execute(invocation_t *invocation) +void spell_execute (invocation_t * invocation) { - spell_execute_d(invocation, 1); + spell_execute_d (invocation, 1); } -void -spell_execute_script(invocation_t *invocation) +void spell_execute_script (invocation_t * invocation) { - if (invocation->script_pos) - spell_execute_d(invocation, 1); - /* Otherwise the script-within-the-spell has been terminated by some other means. - * In practice this happens when the script doesn't wait for user input: the client - * may still notify the server that it's done. Without the above check, we'd be - * running the same spell twice! */ + if (invocation->script_pos) + spell_execute_d (invocation, 1); + /* Otherwise the script-within-the-spell has been terminated by some other means. + * In practice this happens when the script doesn't wait for user input: the client + * may still notify the server that it's done. Without the above check, we'd be + * running the same spell twice! */ } -int -spell_attack(int caster_id, int target_id) +int spell_attack (int caster_id, int target_id) { - character_t *caster = (character_t *)map_id2bl(caster_id); - invocation_t *invocation; - int stop_attack = 0; + character_t *caster = (character_t *) map_id2bl (caster_id); + invocation_t *invocation; + int stop_attack = 0; - if (!caster) - return 0; + if (!caster) + return 0; - invocation = (invocation_t *)map_id2bl(caster->attack_spell_override); + invocation = (invocation_t *) map_id2bl (caster->attack_spell_override); - if (invocation && invocation->flags & INVOCATION_FLAG_STOPATTACK) - stop_attack = 1; + if (invocation && invocation->flags & INVOCATION_FLAG_STOPATTACK) + stop_attack = 1; - if (invocation - && caster->attack_spell_charges > 0) { - magic_clear_var(&invocation->env->vars[VAR_TARGET]); - invocation->env->vars[VAR_TARGET].ty = TY_ENTITY; - invocation->env->vars[VAR_TARGET].v.v_int = target_id; + if (invocation && caster->attack_spell_charges > 0) + { + magic_clear_var (&invocation->env->vars[VAR_TARGET]); + invocation->env->vars[VAR_TARGET].ty = TY_ENTITY; + invocation->env->vars[VAR_TARGET].v.v_int = target_id; - invocation->current_effect = invocation->trigger_effect; - invocation->flags &= ~INVOCATION_FLAG_ABORTED; - spell_execute_d(invocation, 0 /* don't delete the invocation if done */); + invocation->current_effect = invocation->trigger_effect; + invocation->flags &= ~INVOCATION_FLAG_ABORTED; + spell_execute_d (invocation, + 0 /* don't delete the invocation if done */ ); - // If the caster died, we need to refresh here: - invocation = (invocation_t *)map_id2bl(caster->attack_spell_override); + // If the caster died, we need to refresh here: + invocation = + (invocation_t *) map_id2bl (caster->attack_spell_override); - if (invocation - && !(invocation->flags & INVOCATION_FLAG_ABORTED)) // If we didn't abort: - caster->attack_spell_charges--; - } + if (invocation && !(invocation->flags & INVOCATION_FLAG_ABORTED)) // If we didn't abort: + caster->attack_spell_charges--; + } - if (invocation - && caster->attack_spell_override != invocation->bl.id) { - /* Attack spell changed / was refreshed */ - // spell_free_invocation(invocation); // [Fate] This would be a double free. - } else if (!invocation - || caster->attack_spell_charges <= 0) { - caster->attack_spell_override = 0; - char_set_weapon_icon(caster, 0, 0, 0); - char_set_attack_info(caster, 0, 0); - - if (stop_attack) - pc_stopattack(caster); - - if (invocation) - spell_free_invocation(invocation); - } + if (invocation && caster->attack_spell_override != invocation->bl.id) + { + /* Attack spell changed / was refreshed */ + // spell_free_invocation(invocation); // [Fate] This would be a double free. + } + else if (!invocation || caster->attack_spell_charges <= 0) + { + caster->attack_spell_override = 0; + char_set_weapon_icon (caster, 0, 0, 0); + char_set_attack_info (caster, 0, 0); - return 1; + if (stop_attack) + pc_stopattack (caster); + + if (invocation) + spell_free_invocation (invocation); + } + + return 1; } diff --git a/src/map/magic.c b/src/map/magic.c index f70d9a6..8e9c80e 100644 --- a/src/map/magic.c +++ b/src/map/magic.c @@ -7,131 +7,137 @@ #undef DEBUG -static char * -magic_preprocess_message(character_t *character, char *start, char *end) +static char *magic_preprocess_message (character_t * character, char *start, + char *end) { - if (character->state.shroud_active - && character->state.shroud_disappears_on_talk) - magic_unshroud(character); - - if (character->state.shroud_active - && character->state.shroud_hides_name_talking) { - int len = strlen(end); - strcpy(start, "? "); - memmove(start + 2, end, len + 1); - return start + 4; - } else - return end + 2; /* step past blank */ + if (character->state.shroud_active + && character->state.shroud_disappears_on_talk) + magic_unshroud (character); + + if (character->state.shroud_active + && character->state.shroud_hides_name_talking) + { + int len = strlen (end); + strcpy (start, "? "); + memmove (start + 2, end, len + 1); + return start + 4; + } + else + return end + 2; /* step past blank */ } #define ISBLANK(c) ((c) == ' ') /* Returns a dynamically allocated copy of `src'. * `*parameter' may point within that copy or be NULL. */ -static char * -magic_tokenise(char *src, char **parameter) +static char *magic_tokenise (char *src, char **parameter) { - char *retval = strdup(src); - char *seeker = retval; + char *retval = strdup (src); + char *seeker = retval; - while (*seeker && !ISBLANK(*seeker)) - ++seeker; + while (*seeker && !ISBLANK (*seeker)) + ++seeker; - if (!*seeker) - *parameter = NULL; - else { - *seeker = 0; /* Terminate invocation */ - ++seeker; + if (!*seeker) + *parameter = NULL; + else + { + *seeker = 0; /* Terminate invocation */ + ++seeker; - while (ISBLANK (*seeker)) - ++seeker; + while (ISBLANK (*seeker)) + ++seeker; - *parameter = seeker; - } + *parameter = seeker; + } - return retval; + return retval; } -int -magic_message(character_t *caster, - char *spell_, size_t spell_len) +int magic_message (character_t * caster, char *spell_, size_t spell_len) { - if (pc_isdead(caster)) - return 0; - - int power = caster->matk1; - char *invocation_base = spell_ + 8; - char *source_invocation = 1 + invocation_base + strlen(caster->status.name); - spell_t *spell; - char *parameter; - char *spell_invocation; - - if (!source_invocation) - return 0; + if (pc_isdead (caster)) + return 0; + + int power = caster->matk1; + char *invocation_base = spell_ + 8; + char *source_invocation = + 1 + invocation_base + strlen (caster->status.name); + spell_t *spell; + char *parameter; + char *spell_invocation; + + if (!source_invocation) + return 0; + + /* Pre-message filter in case some spell alters output */ + source_invocation = + magic_preprocess_message (caster, invocation_base, source_invocation); + + spell_invocation = magic_tokenise (source_invocation, ¶meter); + parameter = parameter ? strdup (parameter) : strdup (""); + + spell = magic_find_spell (spell_invocation); + free (spell_invocation); + + if (spell) + { + int near_miss; + env_t *env = + spell_create_env (&magic_conf, spell, caster, power, parameter); + effect_set_t *effects; + + if ((spell->flags & SPELL_FLAG_NONMAGIC) || (power >= 1)) + effects = spell_trigger (spell, caster, env, &near_miss); + else + effects = NULL; - /* Pre-message filter in case some spell alters output */ - source_invocation = magic_preprocess_message(caster, invocation_base, source_invocation); +#ifdef DEBUG + fprintf (stderr, "Found spell `%s', triggered = %d\n", spell_, + effects != NULL); +#endif + if (caster->status.option & OPTION_HIDE) + return 0; // No spellcasting while hidden - spell_invocation = magic_tokenise(source_invocation, ¶meter); - parameter = parameter ? strdup(parameter) : strdup(""); + MAP_LOG_PC (caster, "CAST %s %s", + spell->name, effects ? "SUCCESS" : "FAILURE"); - spell = magic_find_spell(spell_invocation); - free(spell_invocation); + if (effects) + { + invocation_t *invocation = spell_instantiate (effects, env); - if (spell) { - int near_miss; - env_t *env = spell_create_env(&magic_conf, spell, caster, power, parameter); - effect_set_t *effects; + /* We have a proper spell effect-- obscure the invocation! */ + while (*source_invocation) + { + if (((rand () * 100.0) / (RAND_MAX * 1.0)) < + magic_conf.obscure_chance) + *source_invocation = '*'; + ++source_invocation; + } - if ((spell->flags & SPELL_FLAG_NONMAGIC) - || (power >= 1)) - effects = spell_trigger(spell, caster, env, &near_miss); - else - effects = NULL; + spell_bind (caster, invocation); + spell_execute (invocation); -#ifdef DEBUG - fprintf(stderr, "Found spell `%s', triggered = %d\n", spell_, effects != NULL); -#endif - if (caster->status.option & OPTION_HIDE) - return 0; // No spellcasting while hidden - - MAP_LOG_PC(caster, "CAST %s %s", - spell->name, - effects? "SUCCESS" : "FAILURE"); - - if (effects) { - invocation_t *invocation = spell_instantiate(effects, env); - - /* We have a proper spell effect-- obscure the invocation! */ - while (*source_invocation) { - if (((rand() * 100.0) / (RAND_MAX * 1.0)) < magic_conf.obscure_chance) - *source_invocation = '*'; - ++source_invocation; - } - - spell_bind(caster, invocation); - spell_execute(invocation); - - return (spell->flags & SPELL_FLAG_SILENT)? -1 : 1; - } else { - magic_free_env(env); - - /* Obscure proper almost-triggered spell */ - if (near_miss) - while (*source_invocation) - *source_invocation++ = '.'; - } - return 1; + return (spell->flags & SPELL_FLAG_SILENT) ? -1 : 1; + } + else + { + magic_free_env (env); + + /* Obscure proper almost-triggered spell */ + if (near_miss) + while (*source_invocation) + *source_invocation++ = '.'; } + return 1; + } - return 0; /* Not a spell */ + return 0; /* Not a spell */ } -int -magic_init(char *conffile); // must be called after itemdb initialisation +int magic_init (char *conffile); // must be called after itemdb initialisation -void -do_init_magic() +void do_init_magic () { - magic_init(MAGIC_CONFIG_FILE); + magic_init (MAGIC_CONFIG_FILE); } diff --git a/src/map/magic.h b/src/map/magic.h index e15ca76..99ae647 100644 --- a/src/map/magic.h +++ b/src/map/magic.h @@ -6,12 +6,10 @@ #define MAGIC_CONFIG_FILE "conf/magic.conf" - typedef struct map_session_data character_t; typedef struct block_list entity_t; -struct invocation; /* Spell invocation */ - +struct invocation; /* Spell invocation */ /** * Try to cast magic. @@ -24,17 +22,14 @@ struct invocation; /* Spell invocation */ * \return 1 or -1 if the input message was magic and was handled by this function, 0 otherwise. -1 is returned when the * message should not be repeated. */ -int -magic_message(character_t *caster, - char *spell, size_t spell_len); +int magic_message (character_t * caster, char *spell, size_t spell_len); /** * Removes the shroud from a character * * \param character The character to remove the shroud from */ -void -magic_unshroud(character_t *character); +void magic_unshroud (character_t * character); /** * Notifies a running spell that a status_change timer triggered by the spell has expired @@ -45,61 +40,51 @@ magic_unshroud(character_t *character); * \param supplanted Whether the status_change finished normally (0) or was supplanted by a new status_change (1) */ void -spell_effect_report_termination(int invocation, int bl_id, int sc_id, int supplanted); - +spell_effect_report_termination (int invocation, int bl_id, int sc_id, + int supplanted); /** * Initialise all spells, read config data */ -void -do_init_magic(); +void do_init_magic (); /** * Identifies the invocation used to trigger a spell * * Returns NULL if not found */ -char * -magic_find_invocation(char *spellame); +char *magic_find_invocation (char *spellame); /** * Identifies the invocation used to denote a teleport location * * Returns NULL if not found */ -char * -magic_find_anchor_invocation(char *teleport_location); - +char *magic_find_anchor_invocation (char *teleport_location); /** * Execute a spell invocation and sets up timers to finish */ -void -spell_execute(struct invocation *invocation); +void spell_execute (struct invocation *invocation); /** * Continue an NPC script embedded in a spell */ -void -spell_execute_script(struct invocation *invocation); +void spell_execute_script (struct invocation *invocation); /** * Stops all magic bound to the specified character * */ -void -magic_stop_completely(character_t *c); +void magic_stop_completely (character_t * c); /** * Attacks with a magical spell charged to the character * * Returns 0 if there is no charged spell or the spell is depleted. */ -int -spell_attack(int caster, int target); +int spell_attack (int caster, int target); - -void -spell_free_invocation(struct invocation *invocation); +void spell_free_invocation (struct invocation *invocation); #endif /* !defined(MAGIC_H_) */ diff --git a/src/map/map.c b/src/map/map.c index f5d6d33..19a7528 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -41,14 +41,14 @@ #endif // 極力 staticでローカルに収める -static struct dbt * id_db=NULL; -static struct dbt * map_db=NULL; -static struct dbt * nick_db=NULL; -static struct dbt * charid_db=NULL; +static struct dbt *id_db = NULL; +static struct dbt *map_db = NULL; +static struct dbt *nick_db = NULL; +static struct dbt *charid_db = NULL; -static int users=0; +static int users = 0; static struct block_list *object[MAX_FLOORITEM]; -static int first_free_object_id=0,last_object_id=0; +static int first_free_object_id = 0, last_object_id = 0; #define block_free_max 1048576 static void *block_free[block_free_max]; @@ -59,41 +59,43 @@ static struct block_list *bl_list[BL_LIST_MAX]; static int bl_list_count = 0; struct map_data map[MAX_MAP_PER_SERVER]; -int map_num = 0; +int map_num = 0; -int map_port=0; +int map_port = 0; -int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; -int save_settings = 0xFFFF; -int agit_flag = 0; -int night_flag = 0; // 0=day, 1=night [Yor] +int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; +int save_settings = 0xFFFF; +int agit_flag = 0; +int night_flag = 0; // 0=day, 1=night [Yor] -struct charid2nick { - char nick[24]; - int req_id; +struct charid2nick +{ + char nick[24]; + int req_id; }; char motd_txt[256] = "conf/motd.txt"; char help_txt[256] = "conf/help.txt"; -char wisp_server_name[24] = "Server"; // can be modified in char-server configuration file - +char wisp_server_name[24] = "Server"; // can be modified in char-server configuration file /*========================================== * 全map鯖総計での接続数設定 * (char鯖から送られてくる) *------------------------------------------ */ -void map_setusers(int n) { - users = n; +void map_setusers (int n) +{ + users = n; } /*========================================== * 全map鯖総計での接続数取得 (/wへの応答用) *------------------------------------------ */ -int map_getusers(void) { - return users; +int map_getusers (void) +{ + return users; } // @@ -105,29 +107,35 @@ int map_getusers(void) { * ロックされているときはバッファにためる *------------------------------------------ */ -int map_freeblock( void *bl ) -{ - if(block_free_lock==0){ - free(bl); - bl = NULL; - } - else{ - if( block_free_count>=block_free_max ) { - if(battle_config.error_log) - printf("map_freeblock: *WARNING* too many free block! %d %d\n", - block_free_count,block_free_lock); - } - else - block_free[block_free_count++]=bl; - } - return block_free_lock; +int map_freeblock (void *bl) +{ + if (block_free_lock == 0) + { + free (bl); + bl = NULL; + } + else + { + if (block_free_count >= block_free_max) + { + if (battle_config.error_log) + printf + ("map_freeblock: *WARNING* too many free block! %d %d\n", + block_free_count, block_free_lock); + } + else + block_free[block_free_count++] = bl; + } + return block_free_lock; } + /*========================================== * blockのfreeを一時的に禁止する *------------------------------------------ */ -int map_freeblock_lock(void) { - return ++block_free_lock; +int map_freeblock_lock (void) +{ + return ++block_free_lock; } /*========================================== @@ -136,26 +144,30 @@ int map_freeblock_lock(void) { * バッファにたまっていたblockを全部削除 *------------------------------------------ */ -int map_freeblock_unlock(void) { - if ((--block_free_lock) == 0) { - int i; -// if(block_free_count>0) { -// if(battle_config.error_log) -// printf("map_freeblock_unlock: free %d object\n",block_free_count); -// } - for(i=0;i<block_free_count;i++){ - free(block_free[i]); - block_free[i] = NULL; - } - block_free_count=0; - }else if(block_free_lock<0){ - if(battle_config.error_log) - printf("map_freeblock_unlock: lock count < 0 !\n"); - } - return block_free_lock; +int map_freeblock_unlock (void) +{ + if ((--block_free_lock) == 0) + { + int i; +// if(block_free_count>0) { +// if(battle_config.error_log) +// printf("map_freeblock_unlock: free %d object\n",block_free_count); +// } + for (i = 0; i < block_free_count; i++) + { + free (block_free[i]); + block_free[i] = NULL; + } + block_free_count = 0; + } + else if (block_free_lock < 0) + { + if (battle_config.error_log) + printf ("map_freeblock_unlock: lock count < 0 !\n"); + } + return block_free_lock; } - // // block化処理 // @@ -173,43 +185,51 @@ static struct block_list bl_head; * 既にlink済みかの確認が無い。危険かも *------------------------------------------ */ -int map_addblock(struct block_list *bl) -{ - int m,x,y; - - nullpo_retr(0, bl); - - if(bl->prev != NULL){ - if(battle_config.error_log) - printf("map_addblock error : bl->prev!=NULL\n"); - return 0; - } - - m=bl->m; - x=bl->x; - y=bl->y; - if(m<0 || m>=map_num || - x<0 || x>=map[m].xs || - y<0 || y>=map[m].ys) - return 1; - - if(bl->type==BL_MOB){ - bl->next = map[m].block_mob[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs]; - bl->prev = &bl_head; - if(bl->next) bl->next->prev = bl; - map[m].block_mob[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs] = bl; - map[m].block_mob_count[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs]++; - } else { - bl->next = map[m].block[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs]; - bl->prev = &bl_head; - if(bl->next) bl->next->prev = bl; - map[m].block[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs] = bl; - map[m].block_count[x/BLOCK_SIZE+(y/BLOCK_SIZE)*map[m].bxs]++; - if(bl->type==BL_PC) - map[m].users++; - } - - return 0; +int map_addblock (struct block_list *bl) +{ + int m, x, y; + + nullpo_retr (0, bl); + + if (bl->prev != NULL) + { + if (battle_config.error_log) + printf ("map_addblock error : bl->prev!=NULL\n"); + return 0; + } + + m = bl->m; + x = bl->x; + y = bl->y; + if (m < 0 || m >= map_num || + x < 0 || x >= map[m].xs || y < 0 || y >= map[m].ys) + return 1; + + if (bl->type == BL_MOB) + { + bl->next = + map[m].block_mob[x / BLOCK_SIZE + (y / BLOCK_SIZE) * map[m].bxs]; + bl->prev = &bl_head; + if (bl->next) + bl->next->prev = bl; + map[m].block_mob[x / BLOCK_SIZE + (y / BLOCK_SIZE) * map[m].bxs] = bl; + map[m].block_mob_count[x / BLOCK_SIZE + + (y / BLOCK_SIZE) * map[m].bxs]++; + } + else + { + bl->next = + map[m].block[x / BLOCK_SIZE + (y / BLOCK_SIZE) * map[m].bxs]; + bl->prev = &bl_head; + if (bl->next) + bl->next->prev = bl; + map[m].block[x / BLOCK_SIZE + (y / BLOCK_SIZE) * map[m].bxs] = bl; + map[m].block_count[x / BLOCK_SIZE + (y / BLOCK_SIZE) * map[m].bxs]++; + if (bl->type == BL_PC) + map[m].users++; + } + + return 0; } /*========================================== @@ -217,162 +237,197 @@ int map_addblock(struct block_list *bl) * prevがNULLの場合listに繋がってない *------------------------------------------ */ -int map_delblock(struct block_list *bl) -{ - int b; - nullpo_retr(0, bl); - - // 既にblocklistから抜けている - if(bl->prev==NULL){ - if(bl->next!=NULL){ - // prevがNULLでnextがNULLでないのは有ってはならない - if(battle_config.error_log) - printf("map_delblock error : bl->next!=NULL\n"); - } - return 0; - } - - b = bl->x/BLOCK_SIZE+(bl->y/BLOCK_SIZE)*map[bl->m].bxs; - - if(bl->type==BL_PC) - map[bl->m].users--; - - if(bl->next) bl->next->prev = bl->prev; - if(bl->prev==&bl_head){ - // リストの頭なので、map[]のblock_listを更新する - if(bl->type==BL_MOB){ - map[bl->m].block_mob[b] = bl->next; - if((map[bl->m].block_mob_count[b]--) < 0) - map[bl->m].block_mob_count[b] = 0; - } else { - map[bl->m].block[b] = bl->next; - if((map[bl->m].block_count[b]--) < 0) - map[bl->m].block_count[b] = 0; - } - } else { - bl->prev->next = bl->next; - } - bl->next = NULL; - bl->prev = NULL; - - return 0; +int map_delblock (struct block_list *bl) +{ + int b; + nullpo_retr (0, bl); + + // 既にblocklistから抜けている + if (bl->prev == NULL) + { + if (bl->next != NULL) + { + // prevがNULLでnextがNULLでないのは有ってはならない + if (battle_config.error_log) + printf ("map_delblock error : bl->next!=NULL\n"); + } + return 0; + } + + b = bl->x / BLOCK_SIZE + (bl->y / BLOCK_SIZE) * map[bl->m].bxs; + + if (bl->type == BL_PC) + map[bl->m].users--; + + if (bl->next) + bl->next->prev = bl->prev; + if (bl->prev == &bl_head) + { + // リストの頭なので、map[]のblock_listを更新する + if (bl->type == BL_MOB) + { + map[bl->m].block_mob[b] = bl->next; + if ((map[bl->m].block_mob_count[b]--) < 0) + map[bl->m].block_mob_count[b] = 0; + } + else + { + map[bl->m].block[b] = bl->next; + if ((map[bl->m].block_count[b]--) < 0) + map[bl->m].block_count[b] = 0; + } + } + else + { + bl->prev->next = bl->next; + } + bl->next = NULL; + bl->prev = NULL; + + return 0; } /*========================================== * 周囲のPC人数を数える (現在未使用) *------------------------------------------ */ -int map_countnearpc(int m, int x, int y) { - int bx,by,c=0; - struct block_list *bl=NULL; - - if(map[m].users==0) - return 0; - for(by=y/BLOCK_SIZE-AREA_SIZE/BLOCK_SIZE-1;by<=y/BLOCK_SIZE+AREA_SIZE/BLOCK_SIZE+1;by++){ - if(by<0 || by>=map[m].bys) - continue; - for(bx=x/BLOCK_SIZE-AREA_SIZE/BLOCK_SIZE-1;bx<=x/BLOCK_SIZE+AREA_SIZE/BLOCK_SIZE+1;bx++){ - if(bx<0 || bx>=map[m].bxs) - continue; - bl = map[m].block[bx+by*map[m].bxs]; - for(;bl;bl=bl->next){ - if(bl->type==BL_PC) - c++; - } - } - } - return c; +int map_countnearpc (int m, int x, int y) +{ + int bx, by, c = 0; + struct block_list *bl = NULL; + + if (map[m].users == 0) + return 0; + for (by = y / BLOCK_SIZE - AREA_SIZE / BLOCK_SIZE - 1; + by <= y / BLOCK_SIZE + AREA_SIZE / BLOCK_SIZE + 1; by++) + { + if (by < 0 || by >= map[m].bys) + continue; + for (bx = x / BLOCK_SIZE - AREA_SIZE / BLOCK_SIZE - 1; + bx <= x / BLOCK_SIZE + AREA_SIZE / BLOCK_SIZE + 1; bx++) + { + if (bx < 0 || bx >= map[m].bxs) + continue; + bl = map[m].block[bx + by * map[m].bxs]; + for (; bl; bl = bl->next) + { + if (bl->type == BL_PC) + c++; + } + } + } + return c; } /*========================================== * セル上のPCとMOBの数を数える (グランドクロス用) *------------------------------------------ */ -int map_count_oncell(int m, int x, int y) { - int bx,by; - struct block_list *bl=NULL; - int i,c; - int count = 0; - - if (x < 0 || y < 0 || (x >= map[m].xs) || (y >= map[m].ys)) - return 1; - bx = x/BLOCK_SIZE; - by = y/BLOCK_SIZE; - - bl = map[m].block[bx+by*map[m].bxs]; - c = map[m].block_count[bx+by*map[m].bxs]; - for(i=0;i<c && bl;i++,bl=bl->next){ - if(bl->x == x && bl->y == y && bl->type == BL_PC) count++; - } - bl = map[m].block_mob[bx+by*map[m].bxs]; - c = map[m].block_mob_count[bx+by*map[m].bxs]; - for(i=0;i<c && bl;i++,bl=bl->next){ - if(bl->x == x && bl->y == y) count++; - } - if(!count) count = 1; - return count; +int map_count_oncell (int m, int x, int y) +{ + int bx, by; + struct block_list *bl = NULL; + int i, c; + int count = 0; + + if (x < 0 || y < 0 || (x >= map[m].xs) || (y >= map[m].ys)) + return 1; + bx = x / BLOCK_SIZE; + by = y / BLOCK_SIZE; + + bl = map[m].block[bx + by * map[m].bxs]; + c = map[m].block_count[bx + by * map[m].bxs]; + for (i = 0; i < c && bl; i++, bl = bl->next) + { + if (bl->x == x && bl->y == y && bl->type == BL_PC) + count++; + } + bl = map[m].block_mob[bx + by * map[m].bxs]; + c = map[m].block_mob_count[bx + by * map[m].bxs]; + for (i = 0; i < c && bl; i++, bl = bl->next) + { + if (bl->x == x && bl->y == y) + count++; + } + if (!count) + count = 1; + return count; } - /*========================================== * map m (x0,y0)-(x1,y1)内の全objに対して * funcを呼ぶ * type!=0 ならその種類のみ *------------------------------------------ */ -void map_foreachinarea(int (*func)(struct block_list*,va_list),int m,int x0,int y0,int x1,int y1,int type,...) { - int bx,by; - struct block_list *bl=NULL; - va_list ap=NULL; - int blockcount=bl_list_count,i,c; - - if(m < 0) - return; - va_start(ap,type); - if (x0 < 0) x0 = 0; - if (y0 < 0) y0 = 0; - if (x1 >= map[m].xs) x1 = map[m].xs-1; - if (y1 >= map[m].ys) y1 = map[m].ys-1; - if (type == 0 || type != BL_MOB) - for (by = y0 / BLOCK_SIZE; by <= y1 / BLOCK_SIZE; by++) { - for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){ - bl = map[m].block[bx+by*map[m].bxs]; - c = map[m].block_count[bx+by*map[m].bxs]; - for(i=0;i<c && bl;i++,bl=bl->next){ - if(bl && type && bl->type!=type) - continue; - if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX) - bl_list[bl_list_count++]=bl; - } - } - } - if(type==0 || type==BL_MOB) - for(by=y0/BLOCK_SIZE;by<=y1/BLOCK_SIZE;by++){ - for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){ - bl = map[m].block_mob[bx+by*map[m].bxs]; - c = map[m].block_mob_count[bx+by*map[m].bxs]; - for(i=0;i<c && bl;i++,bl=bl->next){ - if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX) - bl_list[bl_list_count++]=bl; - } - } - } - - if(bl_list_count>=BL_LIST_MAX) { - if(battle_config.error_log) - printf("map_foreachinarea: *WARNING* block count too many!\n"); - } - - map_freeblock_lock(); // メモリからの解放を禁止する - - for(i=blockcount;i<bl_list_count;i++) - if(bl_list[i]->prev) // 有効かどうかチェック - func(bl_list[i],ap); - - map_freeblock_unlock(); // 解放を許可する - - va_end(ap); - bl_list_count = blockcount; +void map_foreachinarea (int (*func) (struct block_list *, va_list), int m, + int x0, int y0, int x1, int y1, int type, ...) +{ + int bx, by; + struct block_list *bl = NULL; + va_list ap = NULL; + int blockcount = bl_list_count, i, c; + + if (m < 0) + return; + va_start (ap, type); + if (x0 < 0) + x0 = 0; + if (y0 < 0) + y0 = 0; + if (x1 >= map[m].xs) + x1 = map[m].xs - 1; + if (y1 >= map[m].ys) + y1 = map[m].ys - 1; + if (type == 0 || type != BL_MOB) + for (by = y0 / BLOCK_SIZE; by <= y1 / BLOCK_SIZE; by++) + { + for (bx = x0 / BLOCK_SIZE; bx <= x1 / BLOCK_SIZE; bx++) + { + bl = map[m].block[bx + by * map[m].bxs]; + c = map[m].block_count[bx + by * map[m].bxs]; + for (i = 0; i < c && bl; i++, bl = bl->next) + { + if (bl && type && bl->type != type) + continue; + if (bl && bl->x >= x0 && bl->x <= x1 && bl->y >= y0 + && bl->y <= y1 && bl_list_count < BL_LIST_MAX) + bl_list[bl_list_count++] = bl; + } + } + } + if (type == 0 || type == BL_MOB) + for (by = y0 / BLOCK_SIZE; by <= y1 / BLOCK_SIZE; by++) + { + for (bx = x0 / BLOCK_SIZE; bx <= x1 / BLOCK_SIZE; bx++) + { + bl = map[m].block_mob[bx + by * map[m].bxs]; + c = map[m].block_mob_count[bx + by * map[m].bxs]; + for (i = 0; i < c && bl; i++, bl = bl->next) + { + if (bl && bl->x >= x0 && bl->x <= x1 && bl->y >= y0 + && bl->y <= y1 && bl_list_count < BL_LIST_MAX) + bl_list[bl_list_count++] = bl; + } + } + } + + if (bl_list_count >= BL_LIST_MAX) + { + if (battle_config.error_log) + printf ("map_foreachinarea: *WARNING* block count too many!\n"); + } + + map_freeblock_lock (); // メモリからの解放を禁止する + + for (i = blockcount; i < bl_list_count; i++) + if (bl_list[i]->prev) // 有効かどうかチェック + func (bl_list[i], ap); + + map_freeblock_unlock (); // 解放を許可する + + va_end (ap); + bl_list_count = blockcount; } /*========================================== @@ -383,161 +438,210 @@ void map_foreachinarea(int (*func)(struct block_list*,va_list),int m,int x0,int * dx,dyは-1,0,1のみとする(どんな値でもいいっぽい?) *------------------------------------------ */ -void map_foreachinmovearea(int (*func)(struct block_list*,va_list),int m,int x0,int y0,int x1,int y1,int dx,int dy,int type,...) { - int bx,by; - struct block_list *bl=NULL; - va_list ap=NULL; - int blockcount=bl_list_count,i,c; - - va_start(ap,type); - if(dx==0 || dy==0){ - // 矩形領域の場合 - if(dx==0){ - if(dy<0){ - y0=y1+dy+1; - } else { - y1=y0+dy-1; - } - } else if(dy==0){ - if(dx<0){ - x0=x1+dx+1; - } else { - x1=x0+dx-1; - } - } - if(x0<0) x0=0; - if(y0<0) y0=0; - if(x1>=map[m].xs) x1=map[m].xs-1; - if(y1>=map[m].ys) y1=map[m].ys-1; - for(by=y0/BLOCK_SIZE;by<=y1/BLOCK_SIZE;by++){ - for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){ - bl = map[m].block[bx+by*map[m].bxs]; - c = map[m].block_count[bx+by*map[m].bxs]; - for(i=0;i<c && bl;i++,bl=bl->next){ - if(bl && type && bl->type!=type) - continue; - if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX) - bl_list[bl_list_count++]=bl; - } - bl = map[m].block_mob[bx+by*map[m].bxs]; - c = map[m].block_mob_count[bx+by*map[m].bxs]; - for(i=0;i<c && bl;i++,bl=bl->next){ - if(bl && type && bl->type!=type) - continue; - if(bl && bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1 && bl_list_count<BL_LIST_MAX) - bl_list[bl_list_count++]=bl; - } - } - } - }else{ - // L字領域の場合 - - if(x0<0) x0=0; - if(y0<0) y0=0; - if(x1>=map[m].xs) x1=map[m].xs-1; - if(y1>=map[m].ys) y1=map[m].ys-1; - for(by=y0/BLOCK_SIZE;by<=y1/BLOCK_SIZE;by++){ - for(bx=x0/BLOCK_SIZE;bx<=x1/BLOCK_SIZE;bx++){ - bl = map[m].block[bx+by*map[m].bxs]; - c = map[m].block_count[bx+by*map[m].bxs]; - for(i=0;i<c && bl;i++,bl=bl->next){ - if(bl && type && bl->type!=type) - continue; - if((bl) && !(bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1)) - continue; - if((bl) && ((dx>0 && bl->x<x0+dx) || (dx<0 && bl->x>x1+dx) || - (dy>0 && bl->y<y0+dy) || (dy<0 && bl->y>y1+dy)) && - bl_list_count<BL_LIST_MAX) - bl_list[bl_list_count++]=bl; - } - bl = map[m].block_mob[bx+by*map[m].bxs]; - c = map[m].block_mob_count[bx+by*map[m].bxs]; - for(i=0;i<c && bl;i++,bl=bl->next){ - if(bl && type && bl->type!=type) - continue; - if((bl) && !(bl->x>=x0 && bl->x<=x1 && bl->y>=y0 && bl->y<=y1)) - continue; - if((bl) && ((dx>0 && bl->x<x0+dx) || (dx<0 && bl->x>x1+dx) || - (dy>0 && bl->y<y0+dy) || (dy<0 && bl->y>y1+dy)) && - bl_list_count<BL_LIST_MAX) - bl_list[bl_list_count++]=bl; - } - } - } - - } - - if(bl_list_count>=BL_LIST_MAX) { - if(battle_config.error_log) - printf("map_foreachinarea: *WARNING* block count too many!\n"); - } - - map_freeblock_lock(); // メモリからの解放を禁止する - - for(i=blockcount;i<bl_list_count;i++) - if(bl_list[i]->prev) // 有効かどうかチェック - func(bl_list[i],ap); - - map_freeblock_unlock(); // 解放を許可する - - va_end(ap); - bl_list_count = blockcount; -} - -// -- moonsoul (added map_foreachincell which is a rework of map_foreachinarea but -// which only checks the exact single x/y passed to it rather than an -// area radius - may be more useful in some instances) +void map_foreachinmovearea (int (*func) (struct block_list *, va_list), int m, + int x0, int y0, int x1, int y1, int dx, int dy, + int type, ...) +{ + int bx, by; + struct block_list *bl = NULL; + va_list ap = NULL; + int blockcount = bl_list_count, i, c; + + va_start (ap, type); + if (dx == 0 || dy == 0) + { + // 矩形領域の場合 + if (dx == 0) + { + if (dy < 0) + { + y0 = y1 + dy + 1; + } + else + { + y1 = y0 + dy - 1; + } + } + else if (dy == 0) + { + if (dx < 0) + { + x0 = x1 + dx + 1; + } + else + { + x1 = x0 + dx - 1; + } + } + if (x0 < 0) + x0 = 0; + if (y0 < 0) + y0 = 0; + if (x1 >= map[m].xs) + x1 = map[m].xs - 1; + if (y1 >= map[m].ys) + y1 = map[m].ys - 1; + for (by = y0 / BLOCK_SIZE; by <= y1 / BLOCK_SIZE; by++) + { + for (bx = x0 / BLOCK_SIZE; bx <= x1 / BLOCK_SIZE; bx++) + { + bl = map[m].block[bx + by * map[m].bxs]; + c = map[m].block_count[bx + by * map[m].bxs]; + for (i = 0; i < c && bl; i++, bl = bl->next) + { + if (bl && type && bl->type != type) + continue; + if (bl && bl->x >= x0 && bl->x <= x1 && bl->y >= y0 + && bl->y <= y1 && bl_list_count < BL_LIST_MAX) + bl_list[bl_list_count++] = bl; + } + bl = map[m].block_mob[bx + by * map[m].bxs]; + c = map[m].block_mob_count[bx + by * map[m].bxs]; + for (i = 0; i < c && bl; i++, bl = bl->next) + { + if (bl && type && bl->type != type) + continue; + if (bl && bl->x >= x0 && bl->x <= x1 && bl->y >= y0 + && bl->y <= y1 && bl_list_count < BL_LIST_MAX) + bl_list[bl_list_count++] = bl; + } + } + } + } + else + { + // L字領域の場合 + + if (x0 < 0) + x0 = 0; + if (y0 < 0) + y0 = 0; + if (x1 >= map[m].xs) + x1 = map[m].xs - 1; + if (y1 >= map[m].ys) + y1 = map[m].ys - 1; + for (by = y0 / BLOCK_SIZE; by <= y1 / BLOCK_SIZE; by++) + { + for (bx = x0 / BLOCK_SIZE; bx <= x1 / BLOCK_SIZE; bx++) + { + bl = map[m].block[bx + by * map[m].bxs]; + c = map[m].block_count[bx + by * map[m].bxs]; + for (i = 0; i < c && bl; i++, bl = bl->next) + { + if (bl && type && bl->type != type) + continue; + if ((bl) + && !(bl->x >= x0 && bl->x <= x1 && bl->y >= y0 + && bl->y <= y1)) + continue; + if ((bl) + && ((dx > 0 && bl->x < x0 + dx) + || (dx < 0 && bl->x > x1 + dx) || (dy > 0 + && bl->y < + y0 + dy) + || (dy < 0 && bl->y > y1 + dy)) + && bl_list_count < BL_LIST_MAX) + bl_list[bl_list_count++] = bl; + } + bl = map[m].block_mob[bx + by * map[m].bxs]; + c = map[m].block_mob_count[bx + by * map[m].bxs]; + for (i = 0; i < c && bl; i++, bl = bl->next) + { + if (bl && type && bl->type != type) + continue; + if ((bl) + && !(bl->x >= x0 && bl->x <= x1 && bl->y >= y0 + && bl->y <= y1)) + continue; + if ((bl) + && ((dx > 0 && bl->x < x0 + dx) + || (dx < 0 && bl->x > x1 + dx) || (dy > 0 + && bl->y < + y0 + dy) + || (dy < 0 && bl->y > y1 + dy)) + && bl_list_count < BL_LIST_MAX) + bl_list[bl_list_count++] = bl; + } + } + } + + } + + if (bl_list_count >= BL_LIST_MAX) + { + if (battle_config.error_log) + printf ("map_foreachinarea: *WARNING* block count too many!\n"); + } + + map_freeblock_lock (); // メモリからの解放を禁止する + + for (i = blockcount; i < bl_list_count; i++) + if (bl_list[i]->prev) // 有効かどうかチェック + func (bl_list[i], ap); + + map_freeblock_unlock (); // 解放を許可する + + va_end (ap); + bl_list_count = blockcount; +} + +// -- moonsoul (added map_foreachincell which is a rework of map_foreachinarea but +// which only checks the exact single x/y passed to it rather than an +// area radius - may be more useful in some instances) // -void map_foreachincell(int (*func)(struct block_list*,va_list),int m,int x,int y,int type,...) { - int bx,by; - struct block_list *bl=NULL; - va_list ap=NULL; - int blockcount=bl_list_count,i,c; - - va_start(ap,type); - - by=y/BLOCK_SIZE; - bx=x/BLOCK_SIZE; - - if(type==0 || type!=BL_MOB) - { - bl = map[m].block[bx+by*map[m].bxs]; - c = map[m].block_count[bx+by*map[m].bxs]; - for(i=0;i<c && bl;i++,bl=bl->next) - { - if(type && bl && bl->type!=type) - continue; - if(bl && bl->x==x && bl->y==y && bl_list_count<BL_LIST_MAX) - bl_list[bl_list_count++]=bl; - } - } - - if(type==0 || type==BL_MOB) - { - bl = map[m].block_mob[bx+by*map[m].bxs]; - c = map[m].block_mob_count[bx+by*map[m].bxs]; - for(i=0;i<c && bl;i++,bl=bl->next) - { - if(bl && bl->x==x && bl->y==y && bl_list_count<BL_LIST_MAX) - bl_list[bl_list_count++]=bl; - } - } - - if(bl_list_count>=BL_LIST_MAX) { - if(battle_config.error_log) - printf("map_foreachincell: *WARNING* block count too many!\n"); - } - - map_freeblock_lock(); // メモリからの解放を禁止する - - for(i=blockcount;i<bl_list_count;i++) - if(bl_list[i]->prev) // 有効かどうかチェック - func(bl_list[i],ap); - - map_freeblock_unlock(); // 解放を許可する - - va_end(ap); - bl_list_count = blockcount; +void map_foreachincell (int (*func) (struct block_list *, va_list), int m, + int x, int y, int type, ...) +{ + int bx, by; + struct block_list *bl = NULL; + va_list ap = NULL; + int blockcount = bl_list_count, i, c; + + va_start (ap, type); + + by = y / BLOCK_SIZE; + bx = x / BLOCK_SIZE; + + if (type == 0 || type != BL_MOB) + { + bl = map[m].block[bx + by * map[m].bxs]; + c = map[m].block_count[bx + by * map[m].bxs]; + for (i = 0; i < c && bl; i++, bl = bl->next) + { + if (type && bl && bl->type != type) + continue; + if (bl && bl->x == x && bl->y == y && bl_list_count < BL_LIST_MAX) + bl_list[bl_list_count++] = bl; + } + } + + if (type == 0 || type == BL_MOB) + { + bl = map[m].block_mob[bx + by * map[m].bxs]; + c = map[m].block_mob_count[bx + by * map[m].bxs]; + for (i = 0; i < c && bl; i++, bl = bl->next) + { + if (bl && bl->x == x && bl->y == y && bl_list_count < BL_LIST_MAX) + bl_list[bl_list_count++] = bl; + } + } + + if (bl_list_count >= BL_LIST_MAX) + { + if (battle_config.error_log) + printf ("map_foreachincell: *WARNING* block count too many!\n"); + } + + map_freeblock_lock (); // メモリからの解放を禁止する + + for (i = blockcount; i < bl_list_count; i++) + if (bl_list[i]->prev) // 有効かどうかチェック + func (bl_list[i], ap); + + map_freeblock_unlock (); // 解放を許可する + + va_end (ap); + bl_list_count = blockcount; } /*========================================== @@ -547,28 +651,31 @@ void map_foreachincell(int (*func)(struct block_list*,va_list),int m,int x,int y * bl->idもこの中で設定して問題無い? *------------------------------------------ */ -int map_addobject(struct block_list *bl) { - int i; - if( bl == NULL ){ - printf("map_addobject nullpo?\n"); - return 0; - } - if(first_free_object_id<2 || first_free_object_id>=MAX_FLOORITEM) - first_free_object_id=2; - for(i=first_free_object_id;i<MAX_FLOORITEM;i++) - if(object[i]==NULL) - break; - if(i>=MAX_FLOORITEM){ - if(battle_config.error_log) - printf("no free object id\n"); - return 0; - } - first_free_object_id=i; - if(last_object_id<i) - last_object_id=i; - object[i]=bl; - numdb_insert(id_db,i,bl); - return i; +int map_addobject (struct block_list *bl) +{ + int i; + if (bl == NULL) + { + printf ("map_addobject nullpo?\n"); + return 0; + } + if (first_free_object_id < 2 || first_free_object_id >= MAX_FLOORITEM) + first_free_object_id = 2; + for (i = first_free_object_id; i < MAX_FLOORITEM; i++) + if (object[i] == NULL) + break; + if (i >= MAX_FLOORITEM) + { + if (battle_config.error_log) + printf ("no free object id\n"); + return 0; + } + first_free_object_id = i; + if (last_object_id < i) + last_object_id = i; + object[i] = bl; + numdb_insert (id_db, i, bl); + return i; } /*========================================== @@ -576,27 +683,30 @@ int map_addobject(struct block_list *bl) { * map_delobjectのfreeしないバージョン *------------------------------------------ */ -int map_delobjectnofree(int id, int type) { - if(object[id]==NULL) - return 0; +int map_delobjectnofree (int id, int type) +{ + if (object[id] == NULL) + return 0; - if (object[id]->type != type) { - fprintf(stderr, "Incorrect type: expected %d, got %d\n", type, object[id]->type); - *((char *) 0) = 0; // break for backtrace - } + if (object[id]->type != type) + { + fprintf (stderr, "Incorrect type: expected %d, got %d\n", type, + object[id]->type); + *((char *) 0) = 0; // break for backtrace + } - map_delblock(object[id]); - numdb_erase(id_db,id); -// map_freeblock(object[id]); - object[id]=NULL; + map_delblock (object[id]); + numdb_erase (id_db, id); +// map_freeblock(object[id]); + object[id] = NULL; - if(first_free_object_id>id) - first_free_object_id=id; + if (first_free_object_id > id) + first_free_object_id = id; - while(last_object_id>2 && object[last_object_id]==NULL) - last_object_id--; + while (last_object_id > 2 && object[last_object_id] == NULL) + last_object_id--; - return 0; + return 0; } /*========================================== @@ -607,19 +717,20 @@ int map_delobjectnofree(int id, int type) { * addとの対称性が無いのが気になる *------------------------------------------ */ -int map_delobject(int id, int type) { - struct block_list *obj = object[id]; +int map_delobject (int id, int type) +{ + struct block_list *obj = object[id]; - if(obj==NULL) - return 0; + if (obj == NULL) + return 0; - map_delobjectnofree(id, type); - if (obj->type == BL_PC) // [Fate] Not sure where else to put this... I'm not sure where delobject for PCs is called from - pc_cleanup((struct map_session_data *)obj); + map_delobjectnofree (id, type); + if (obj->type == BL_PC) // [Fate] Not sure where else to put this... I'm not sure where delobject for PCs is called from + pc_cleanup ((struct map_session_data *) obj); - map_freeblock(obj); + map_freeblock (obj); - return 0; + return 0; } /*========================================== @@ -627,36 +738,41 @@ int map_delobject(int id, int type) { * *------------------------------------------ */ -void map_foreachobject(int (*func)(struct block_list*,va_list),int type,...) { - int i; - int blockcount=bl_list_count; - va_list ap=NULL; - - va_start(ap,type); - - for(i=2;i<=last_object_id;i++){ - if(object[i]){ - if(type && object[i]->type!=type) - continue; - if(bl_list_count>=BL_LIST_MAX) { - if(battle_config.error_log) - printf("map_foreachobject: too many block !\n"); - } - else - bl_list[bl_list_count++]=object[i]; - } - } +void map_foreachobject (int (*func) (struct block_list *, va_list), int type, + ...) +{ + int i; + int blockcount = bl_list_count; + va_list ap = NULL; + + va_start (ap, type); + + for (i = 2; i <= last_object_id; i++) + { + if (object[i]) + { + if (type && object[i]->type != type) + continue; + if (bl_list_count >= BL_LIST_MAX) + { + if (battle_config.error_log) + printf ("map_foreachobject: too many block !\n"); + } + else + bl_list[bl_list_count++] = object[i]; + } + } - map_freeblock_lock(); + map_freeblock_lock (); - for(i=blockcount;i<bl_list_count;i++) - if( bl_list[i]->prev || bl_list[i]->next ) - func(bl_list[i],ap); + for (i = blockcount; i < bl_list_count; i++) + if (bl_list[i]->prev || bl_list[i]->next) + func (bl_list[i], ap); - map_freeblock_unlock(); + map_freeblock_unlock (); - va_end(ap); - bl_list_count = blockcount; + va_end (ap); + bl_list_count = blockcount; } /*========================================== @@ -669,21 +785,24 @@ void map_foreachobject(int (*func)(struct block_list*,va_list),int type,...) { * map.h内で#defineしてある *------------------------------------------ */ -int map_clearflooritem_timer(int tid,unsigned int tick,int id,int data) { - struct flooritem_data *fitem=NULL; - - fitem = (struct flooritem_data *)object[id]; - if(fitem==NULL || fitem->bl.type!=BL_ITEM || (!data && fitem->cleartimer != tid)){ - if(battle_config.error_log) - printf("map_clearflooritem_timer : error\n"); - return 1; - } - if(data) - delete_timer(fitem->cleartimer,map_clearflooritem_timer); - clif_clearflooritem(fitem,0); - map_delobject(fitem->bl.id, BL_ITEM); +int map_clearflooritem_timer (int tid, unsigned int tick, int id, int data) +{ + struct flooritem_data *fitem = NULL; + + fitem = (struct flooritem_data *) object[id]; + if (fitem == NULL || fitem->bl.type != BL_ITEM + || (!data && fitem->cleartimer != tid)) + { + if (battle_config.error_log) + printf ("map_clearflooritem_timer : error\n"); + return 1; + } + if (data) + delete_timer (fitem->cleartimer, map_clearflooritem_timer); + clif_clearflooritem (fitem, 0); + map_delobject (fitem->bl.id, BL_ITEM); - return 0; + return 0; } /*========================================== @@ -693,42 +812,48 @@ int map_clearflooritem_timer(int tid,unsigned int tick,int id,int data) { * 現状range=1でアイテムドロップ用途のみ *------------------------------------------ */ -int map_searchrandfreecell(int m,int x,int y,int range) { - int free_cell,i,j,c; - - for(free_cell=0,i=-range;i<=range;i++){ - if(i+y<0 || i+y>=map[m].ys) - continue; - for(j=-range;j<=range;j++){ - if(j+x<0 || j+x>=map[m].xs) - continue; - if((c=read_gat(m,j+x,i+y))==1 || c==5) - continue; - free_cell++; - } - } - if(free_cell==0) - return -1; - free_cell=MRAND(free_cell); - for(i=-range;i<=range;i++){ - if(i+y<0 || i+y>=map[m].ys) - continue; - for(j=-range;j<=range;j++){ - if(j+x<0 || j+x>=map[m].xs) - continue; - if((c=read_gat(m,j+x,i+y))==1 || c==5) - continue; - if(free_cell==0){ - x+=j; - y+=i; - i=range+1; - break; - } - free_cell--; - } - } - - return x+(y<<16); +int map_searchrandfreecell (int m, int x, int y, int range) +{ + int free_cell, i, j, c; + + for (free_cell = 0, i = -range; i <= range; i++) + { + if (i + y < 0 || i + y >= map[m].ys) + continue; + for (j = -range; j <= range; j++) + { + if (j + x < 0 || j + x >= map[m].xs) + continue; + if ((c = read_gat (m, j + x, i + y)) == 1 || c == 5) + continue; + free_cell++; + } + } + if (free_cell == 0) + return -1; + free_cell = MRAND (free_cell); + for (i = -range; i <= range; i++) + { + if (i + y < 0 || i + y >= map[m].ys) + continue; + for (j = -range; j <= range; j++) + { + if (j + x < 0 || j + x >= map[m].xs) + continue; + if ((c = read_gat (m, j + x, i + y)) == 1 || c == 5) + continue; + if (free_cell == 0) + { + x += j; + y += i; + i = range + 1; + break; + } + free_cell--; + } + } + + return x + (y << 16); } /*========================================== @@ -737,87 +862,96 @@ int map_searchrandfreecell(int m,int x,int y,int range) { * item_dataはamount以外をcopyする *------------------------------------------ */ -int map_addflooritem_any(struct item *item_data, int amount, int m, int x, int y, - struct map_session_data **owners, - int *owner_protection, - int lifetime, int dispersal) -{ - int xy,r; - unsigned int tick; - struct flooritem_data *fitem=NULL; - - nullpo_retr(0, item_data); - - if((xy=map_searchrandfreecell(m,x,y, dispersal))<0) - return 0; - r=mt_random(); - - fitem = (struct flooritem_data *)aCalloc(1,sizeof(*fitem)); - fitem->bl.type=BL_ITEM; - fitem->bl.prev = fitem->bl.next = NULL; - fitem->bl.m=m; - fitem->bl.x=xy&0xffff; - fitem->bl.y=(xy>>16)&0xffff; - fitem->first_get_id = 0; - fitem->first_get_tick = 0; - fitem->second_get_id = 0; - fitem->second_get_tick = 0; - fitem->third_get_id = 0; - fitem->third_get_tick = 0; - - fitem->bl.id = map_addobject(&fitem->bl); - if(fitem->bl.id==0){ - free(fitem); - return 0; - } - - tick = gettick(); - - if (owners[0]) - fitem->first_get_id = owners[0]->bl.id; - fitem->first_get_tick = tick + owner_protection[0]; - - if (owners[1]) - fitem->second_get_id = owners[1]->bl.id; - fitem->second_get_tick = tick + owner_protection[1]; - - if (owners[2]) - fitem->third_get_id = owners[2]->bl.id; - fitem->third_get_tick = tick + owner_protection[2]; - - memcpy(&fitem->item_data,item_data,sizeof(*item_data)); - fitem->item_data.amount=amount; - fitem->subx=(r&3)*3+3; - fitem->suby=((r>>2)&3)*3+3; - fitem->cleartimer=add_timer(gettick() + lifetime, map_clearflooritem_timer, fitem->bl.id, 0); - - map_addblock(&fitem->bl); - clif_dropflooritem(fitem); - - return fitem->bl.id; -} - - -int map_addflooritem(struct item *item_data,int amount,int m,int x,int y,struct map_session_data *first_sd, - struct map_session_data *second_sd,struct map_session_data *third_sd,int type) -{ - struct map_session_data *owners[3] = { first_sd, second_sd, third_sd }; - int owner_protection[3]; - - if (type) { - owner_protection[0] = battle_config.mvp_item_first_get_time; - owner_protection[1] = owner_protection[0] + battle_config.mvp_item_second_get_time; - owner_protection[2] = owner_protection[1] + battle_config.mvp_item_third_get_time; - } else { - owner_protection[0] = battle_config.item_first_get_time; - owner_protection[1] = owner_protection[0] + battle_config.item_second_get_time; - owner_protection[2] = owner_protection[1] + battle_config.item_third_get_time; - } +int map_addflooritem_any (struct item *item_data, int amount, int m, int x, + int y, struct map_session_data **owners, + int *owner_protection, int lifetime, int dispersal) +{ + int xy, r; + unsigned int tick; + struct flooritem_data *fitem = NULL; + + nullpo_retr (0, item_data); + + if ((xy = map_searchrandfreecell (m, x, y, dispersal)) < 0) + return 0; + r = mt_random (); + + fitem = (struct flooritem_data *) aCalloc (1, sizeof (*fitem)); + fitem->bl.type = BL_ITEM; + fitem->bl.prev = fitem->bl.next = NULL; + fitem->bl.m = m; + fitem->bl.x = xy & 0xffff; + fitem->bl.y = (xy >> 16) & 0xffff; + fitem->first_get_id = 0; + fitem->first_get_tick = 0; + fitem->second_get_id = 0; + fitem->second_get_tick = 0; + fitem->third_get_id = 0; + fitem->third_get_tick = 0; + + fitem->bl.id = map_addobject (&fitem->bl); + if (fitem->bl.id == 0) + { + free (fitem); + return 0; + } + + tick = gettick (); + + if (owners[0]) + fitem->first_get_id = owners[0]->bl.id; + fitem->first_get_tick = tick + owner_protection[0]; + + if (owners[1]) + fitem->second_get_id = owners[1]->bl.id; + fitem->second_get_tick = tick + owner_protection[1]; + + if (owners[2]) + fitem->third_get_id = owners[2]->bl.id; + fitem->third_get_tick = tick + owner_protection[2]; - return map_addflooritem_any(item_data, amount, m, x, y, - owners, owner_protection, - battle_config.flooritem_lifetime, - 1); + memcpy (&fitem->item_data, item_data, sizeof (*item_data)); + fitem->item_data.amount = amount; + fitem->subx = (r & 3) * 3 + 3; + fitem->suby = ((r >> 2) & 3) * 3 + 3; + fitem->cleartimer = + add_timer (gettick () + lifetime, map_clearflooritem_timer, + fitem->bl.id, 0); + + map_addblock (&fitem->bl); + clif_dropflooritem (fitem); + + return fitem->bl.id; +} + +int map_addflooritem (struct item *item_data, int amount, int m, int x, int y, + struct map_session_data *first_sd, + struct map_session_data *second_sd, + struct map_session_data *third_sd, int type) +{ + struct map_session_data *owners[3] = { first_sd, second_sd, third_sd }; + int owner_protection[3]; + + if (type) + { + owner_protection[0] = battle_config.mvp_item_first_get_time; + owner_protection[1] = + owner_protection[0] + battle_config.mvp_item_second_get_time; + owner_protection[2] = + owner_protection[1] + battle_config.mvp_item_third_get_time; + } + else + { + owner_protection[0] = battle_config.item_first_get_time; + owner_protection[1] = + owner_protection[0] + battle_config.item_second_get_time; + owner_protection[2] = + owner_protection[1] + battle_config.item_third_get_time; + } + + return map_addflooritem_any (item_data, amount, m, x, y, + owners, owner_protection, + battle_config.flooritem_lifetime, 1); } /* int xy,r; */ @@ -888,74 +1022,82 @@ int map_addflooritem(struct item *item_data,int amount,int m,int x,int y,struct * charid_dbへ追加(返信待ちがあれば返信) *------------------------------------------ */ -void map_addchariddb(int charid, char *name) { - struct charid2nick *p=NULL; - int req=0; - - p=numdb_search(charid_db,charid); - if(p==NULL){ // データベースにない - p = (struct charid2nick *)aCalloc(1,sizeof(struct charid2nick)); - p->req_id=0; - }else - numdb_erase(charid_db,charid); - - req=p->req_id; - memcpy(p->nick,name,24); - p->req_id=0; - numdb_insert(charid_db,charid,p); - if(req){ // 返信待ちがあれば返信 - struct map_session_data *sd = map_id2sd(req); - if(sd!=NULL) - clif_solved_charname(sd,charid); - } +void map_addchariddb (int charid, char *name) +{ + struct charid2nick *p = NULL; + int req = 0; + + p = numdb_search (charid_db, charid); + if (p == NULL) + { // データベースにない + p = (struct charid2nick *) aCalloc (1, sizeof (struct charid2nick)); + p->req_id = 0; + } + else + numdb_erase (charid_db, charid); + + req = p->req_id; + memcpy (p->nick, name, 24); + p->req_id = 0; + numdb_insert (charid_db, charid, p); + if (req) + { // 返信待ちがあれば返信 + struct map_session_data *sd = map_id2sd (req); + if (sd != NULL) + clif_solved_charname (sd, charid); + } } /*========================================== * charid_dbへ追加(返信要求のみ) *------------------------------------------ */ -int map_reqchariddb(struct map_session_data * sd,int charid) { - struct charid2nick *p=NULL; +int map_reqchariddb (struct map_session_data *sd, int charid) +{ + struct charid2nick *p = NULL; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - p=numdb_search(charid_db,charid); - if(p!=NULL) // データベースにすでにある - return 0; - p = (struct charid2nick *)aCalloc(1,sizeof(struct charid2nick)); - p->req_id=sd->bl.id; - numdb_insert(charid_db,charid,p); - return 0; + p = numdb_search (charid_db, charid); + if (p != NULL) // データベースにすでにある + return 0; + p = (struct charid2nick *) aCalloc (1, sizeof (struct charid2nick)); + p->req_id = sd->bl.id; + numdb_insert (charid_db, charid, p); + return 0; } /*========================================== * id_dbへblを追加 *------------------------------------------ */ -void map_addiddb(struct block_list *bl) { - nullpo_retv(bl); +void map_addiddb (struct block_list *bl) +{ + nullpo_retv (bl); - numdb_insert(id_db,bl->id,bl); + numdb_insert (id_db, bl->id, bl); } /*========================================== * id_dbからblを削除 *------------------------------------------ */ -void map_deliddb(struct block_list *bl) { - nullpo_retv(bl); +void map_deliddb (struct block_list *bl) +{ + nullpo_retv (bl); - numdb_erase(id_db,bl->id); + numdb_erase (id_db, bl->id); } /*========================================== * nick_dbへsdを追加 *------------------------------------------ */ -void map_addnickdb(struct map_session_data *sd) { - nullpo_retv(sd); +void map_addnickdb (struct map_session_data *sd) +{ + nullpo_retv (sd); - strdb_insert(nick_db,sd->status.name,sd); + strdb_insert (nick_db, sd->status.name, sd); } /*========================================== @@ -964,78 +1106,80 @@ void map_addnickdb(struct map_session_data *sd) { * quit処理の主体が違うような気もしてきた *------------------------------------------ */ -int map_quit(struct map_session_data *sd) { - nullpo_retr(0, sd); +int map_quit (struct map_session_data *sd) +{ + nullpo_retr (0, sd); - if(sd->chatID) // チャットから出る - chat_leavechat(sd); - - if(sd->trade_partner) // 取引を中断する - trade_tradecancel(sd); + if (sd->chatID) // チャットから出る + chat_leavechat (sd); - if(sd->party_invite>0) // パーティ勧誘を拒否する - party_reply_invite(sd,sd->party_invite_account,0); + if (sd->trade_partner) // 取引を中断する + trade_tradecancel (sd); - if(sd->guild_invite>0) // ギルド勧誘を拒否する - guild_reply_invite(sd,sd->guild_invite,0); - if(sd->guild_alliance>0) // ギルド同盟勧誘を拒否する - guild_reply_reqalliance(sd,sd->guild_alliance_account,0); + if (sd->party_invite > 0) // パーティ勧誘を拒否する + party_reply_invite (sd, sd->party_invite_account, 0); - party_send_logout(sd); // パーティのログアウトメッセージ送信 + if (sd->guild_invite > 0) // ギルド勧誘を拒否する + guild_reply_invite (sd, sd->guild_invite, 0); + if (sd->guild_alliance > 0) // ギルド同盟勧誘を拒否する + guild_reply_reqalliance (sd, sd->guild_alliance_account, 0); - guild_send_memberinfoshort(sd,0); // ギルドのログアウトメッセージ送信 + party_send_logout (sd); // パーティのログアウトメッセージ送信 - pc_cleareventtimer(sd); // イベントタイマを破棄する + guild_send_memberinfoshort (sd, 0); // ギルドのログアウトメッセージ送信 - skill_castcancel(&sd->bl,0); // 詠唱を中断する - skill_stop_dancing(&sd->bl,1);// ダンス/演奏中断 + pc_cleareventtimer (sd); // イベントタイマを破棄する - if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1) //バーサーク中の終了はHPを100に - sd->status.hp = 100; + skill_castcancel (&sd->bl, 0); // 詠唱を中断する + skill_stop_dancing (&sd->bl, 1); // ダンス/演奏中断 - skill_status_change_clear(&sd->bl,1); // ステータス異常を解除する - skill_clear_unitgroup(&sd->bl); // スキルユニットグループの削除 - skill_cleartimerskill(&sd->bl); - pc_stop_walking(sd,0); - pc_stopattack(sd); - pc_delinvincibletimer(sd); - pc_delspiritball(sd,sd->spiritball,1); - skill_gangsterparadise(sd,0); + if (sd->sc_data && sd->sc_data[SC_BERSERK].timer != -1) //バーサーク中の終了はHPを100に + sd->status.hp = 100; - pc_calcstatus(sd,4); + skill_status_change_clear (&sd->bl, 1); // ステータス異常を解除する + skill_clear_unitgroup (&sd->bl); // スキルユニットグループの削除 + skill_cleartimerskill (&sd->bl); + pc_stop_walking (sd, 0); + pc_stopattack (sd); + pc_delinvincibletimer (sd); + pc_delspiritball (sd, sd->spiritball, 1); + skill_gangsterparadise (sd, 0); - clif_clearchar_area(&sd->bl,2); + pc_calcstatus (sd, 4); - if(pc_isdead(sd)) - pc_setrestartvalue(sd,2); - pc_makesavestatus(sd); - //クローンスキルで覚えたスキルは消す + clif_clearchar_area (&sd->bl, 2); - //The storage closing routines will save the char if needed. [Skotlex] - if (!sd->state.storage_flag) - chrif_save(sd); - else if (sd->state.storage_flag == 1) - storage_storage_quit(sd); - else if (sd->state.storage_flag == 2) - storage_guild_storage_quit(sd,1); + if (pc_isdead (sd)) + pc_setrestartvalue (sd, 2); + pc_makesavestatus (sd); + //クローンスキルで覚えたスキルは消す - if( sd->npc_stackbuf && sd->npc_stackbuf != NULL) - free( sd->npc_stackbuf ); + //The storage closing routines will save the char if needed. [Skotlex] + if (!sd->state.storage_flag) + chrif_save (sd); + else if (sd->state.storage_flag == 1) + storage_storage_quit (sd); + else if (sd->state.storage_flag == 2) + storage_guild_storage_quit (sd, 1); - map_delblock(&sd->bl); + if (sd->npc_stackbuf && sd->npc_stackbuf != NULL) + free (sd->npc_stackbuf); - numdb_erase(id_db,sd->bl.id); - strdb_erase(nick_db,sd->status.name); - numdb_erase(charid_db,sd->status.char_id); + map_delblock (&sd->bl); - return 0; + numdb_erase (id_db, sd->bl.id); + strdb_erase (nick_db, sd->status.name); + numdb_erase (charid_db, sd->status.char_id); + + return 0; } /*========================================== * id番号のPCを探す。居なければNULL *------------------------------------------ */ -struct map_session_data * map_id2sd(int id) { +struct map_session_data *map_id2sd (int id) +{ // remove search from db, because: // 1 - all players, npc, items and mob are in this db (to search, it's not speed, and search in session is more sure) // 2 - DB seems not always correct. Sometimes, when a player disconnects, its id (account value) is not removed and structure @@ -1050,134 +1194,131 @@ struct map_session_data * map_id2sd(int id) { return (struct map_session_data*)bl; return NULL; */ - int i; - struct map_session_data *sd=NULL; + int i; + struct map_session_data *sd = NULL; - for(i = 0; i < fd_max; i++) - if (session[i] && (sd = session[i]->session_data) && sd->bl.id == id) - return sd; + for (i = 0; i < fd_max; i++) + if (session[i] && (sd = session[i]->session_data) && sd->bl.id == id) + return sd; - return NULL; + return NULL; } /*========================================== * char_id番号の名前を探す *------------------------------------------ */ -char * map_charid2nick(int id) { - struct charid2nick *p=numdb_search(charid_db,id); +char *map_charid2nick (int id) +{ + struct charid2nick *p = numdb_search (charid_db, id); - if(p==NULL) - return NULL; - if(p->req_id!=0) - return NULL; - return p->nick; + if (p == NULL) + return NULL; + if (p->req_id != 0) + return NULL; + return p->nick; } /*========================================*/ /* [Fate] Operations to iterate over active map sessions */ -static struct map_session_data * -map_get_session(int i) +static struct map_session_data *map_get_session (int i) { - struct map_session_data *d; + struct map_session_data *d; - if (i >= 0 && i < fd_max - && session[i] && (d = session[i]->session_data) - && d->state.auth) - return d; + if (i >= 0 && i < fd_max + && session[i] && (d = session[i]->session_data) && d->state.auth) + return d; - return NULL; + return NULL; } -static struct map_session_data * -map_get_session_forward(int start) +static struct map_session_data *map_get_session_forward (int start) { - int i; - for (i = start; i < fd_max; i++) { - struct map_session_data *d = map_get_session(i); - if (d) - return d; - } + int i; + for (i = start; i < fd_max; i++) + { + struct map_session_data *d = map_get_session (i); + if (d) + return d; + } - return NULL; + return NULL; } -static struct map_session_data * -map_get_session_backward(int start) +static struct map_session_data *map_get_session_backward (int start) { - int i; - for (i = start; i >= 0; i--) { - struct map_session_data *d = map_get_session(i); - if (d) - return d; - } + int i; + for (i = start; i >= 0; i--) + { + struct map_session_data *d = map_get_session (i); + if (d) + return d; + } - return NULL; + return NULL; } -struct map_session_data * -map_get_first_session() +struct map_session_data *map_get_first_session () { - return map_get_session_forward(0); + return map_get_session_forward (0); } -struct map_session_data * -map_get_next_session(struct map_session_data *d) +struct map_session_data *map_get_next_session (struct map_session_data *d) { - return map_get_session_forward(d->fd + 1); + return map_get_session_forward (d->fd + 1); } -struct map_session_data * -map_get_last_session() +struct map_session_data *map_get_last_session () { - return map_get_session_backward(fd_max); + return map_get_session_backward (fd_max); } -struct map_session_data * -map_get_prev_session(struct map_session_data *d) +struct map_session_data *map_get_prev_session (struct map_session_data *d) { - return map_get_session_backward(d->fd - 1); + return map_get_session_backward (d->fd - 1); } - - - /*========================================== * Search session data from a nick name * (without sensitive case if necessary) * return map_session_data pointer or NULL *------------------------------------------ */ -struct map_session_data * map_nick2sd(char *nick) { - int i, quantity=0, nicklen; - struct map_session_data *sd = NULL; - struct map_session_data *pl_sd = NULL; - - if (nick == NULL) - return NULL; - - nicklen = strlen(nick); - - for (i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - // Without case sensitive check (increase the number of similar character names found) - if (strnicmp(pl_sd->status.name, nick, nicklen) == 0) { - // Strict comparison (if found, we finish the function immediatly with correct value) - if (strcmp(pl_sd->status.name, nick) == 0) - return pl_sd; - quantity++; - sd = pl_sd; - } - } - } - // Here, the exact character name is not found - // We return the found index of a similar account ONLY if there is 1 similar character - if (quantity == 1) - return sd; +struct map_session_data *map_nick2sd (char *nick) +{ + int i, quantity = 0, nicklen; + struct map_session_data *sd = NULL; + struct map_session_data *pl_sd = NULL; - // Exact character name is not found and 0 or more than 1 similar characters have been found ==> we say not found - return NULL; + if (nick == NULL) + return NULL; + + nicklen = strlen (nick); + + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + // Without case sensitive check (increase the number of similar character names found) + if (strnicmp (pl_sd->status.name, nick, nicklen) == 0) + { + // Strict comparison (if found, we finish the function immediatly with correct value) + if (strcmp (pl_sd->status.name, nick) == 0) + return pl_sd; + quantity++; + sd = pl_sd; + } + } + } + // Here, the exact character name is not found + // We return the found index of a similar account ONLY if there is 1 similar character + if (quantity == 1) + return sd; + + // Exact character name is not found and 0 or more than 1 similar characters have been found ==> we say not found + return NULL; } /*========================================== @@ -1185,185 +1326,216 @@ struct map_session_data * map_nick2sd(char *nick) { * 一時objectの場合は配列を引くのみ *------------------------------------------ */ -struct block_list * map_id2bl(int id) +struct block_list *map_id2bl (int id) { - struct block_list *bl=NULL; - if(id<sizeof(object)/sizeof(object[0])) - bl = object[id]; - else - bl = numdb_search(id_db,id); + struct block_list *bl = NULL; + if (id < sizeof (object) / sizeof (object[0])) + bl = object[id]; + else + bl = numdb_search (id_db, id); - return bl; + return bl; } /*========================================== * id_db内の全てにfuncを実行 *------------------------------------------ */ -int map_foreachiddb(int (*func)(void*,void*,va_list),...) { - va_list ap=NULL; +int map_foreachiddb (int (*func) (void *, void *, va_list), ...) +{ + va_list ap = NULL; - va_start(ap,func); - numdb_foreach(id_db,func,ap); - va_end(ap); - return 0; + va_start (ap, func); + numdb_foreach (id_db, func, ap); + va_end (ap); + return 0; } /*========================================== * map.npcへ追加 (warp等の領域持ちのみ) *------------------------------------------ */ -int map_addnpc(int m,struct npc_data *nd) { - int i; - if(m<0 || m>=map_num) - return -1; - for(i=0;i<map[m].npc_num && i<MAX_NPC_PER_MAP;i++) - if(map[m].npc[i]==NULL) - break; - if(i==MAX_NPC_PER_MAP){ - if(battle_config.error_log) - printf("too many NPCs in one map %s\n",map[m].name); - return -1; - } - if(i==map[m].npc_num){ - map[m].npc_num++; - } - - nullpo_retr(0, nd); - - map[m].npc[i]=nd; - nd->n = i; - numdb_insert(id_db,nd->bl.id,nd); - - return i; -} - -void map_removenpc(void) { - int i,m,n=0; - - for(m=0;m<map_num;m++) { - for(i=0;i<map[m].npc_num && i<MAX_NPC_PER_MAP;i++) { - if(map[m].npc[i]!=NULL) { - clif_clearchar_area(&map[m].npc[i]->bl,2); - map_delblock(&map[m].npc[i]->bl); - numdb_erase(id_db,map[m].npc[i]->bl.id); - if(map[m].npc[i]->bl.subtype==SCRIPT) { +int map_addnpc (int m, struct npc_data *nd) +{ + int i; + if (m < 0 || m >= map_num) + return -1; + for (i = 0; i < map[m].npc_num && i < MAX_NPC_PER_MAP; i++) + if (map[m].npc[i] == NULL) + break; + if (i == MAX_NPC_PER_MAP) + { + if (battle_config.error_log) + printf ("too many NPCs in one map %s\n", map[m].name); + return -1; + } + if (i == map[m].npc_num) + { + map[m].npc_num++; + } + + nullpo_retr (0, nd); + + map[m].npc[i] = nd; + nd->n = i; + numdb_insert (id_db, nd->bl.id, nd); + + return i; +} + +void map_removenpc (void) +{ + int i, m, n = 0; + + for (m = 0; m < map_num; m++) + { + for (i = 0; i < map[m].npc_num && i < MAX_NPC_PER_MAP; i++) + { + if (map[m].npc[i] != NULL) + { + clif_clearchar_area (&map[m].npc[i]->bl, 2); + map_delblock (&map[m].npc[i]->bl); + numdb_erase (id_db, map[m].npc[i]->bl.id); + if (map[m].npc[i]->bl.subtype == SCRIPT) + { // free(map[m].npc[i]->u.scr.script); // free(map[m].npc[i]->u.scr.label_list); } - free(map[m].npc[i]); + free (map[m].npc[i]); map[m].npc[i] = NULL; n++; } } } - printf("%d NPCs removed.\n",n); + printf ("%d NPCs removed.\n", n); } /*========================================== * map名からmap番号へ変換 *------------------------------------------ */ -int map_mapname2mapid(char *name) { - struct map_data *md=NULL; +int map_mapname2mapid (char *name) +{ + struct map_data *md = NULL; - md=strdb_search(map_db,name); - if(md==NULL || md->gat==NULL) - return -1; - return md->m; + md = strdb_search (map_db, name); + if (md == NULL || md->gat == NULL) + return -1; + return md->m; } /*========================================== * 他鯖map名からip,port変換 *------------------------------------------ */ -int map_mapname2ipport(char *name,int *ip,int *port) { - struct map_data_other_server *mdos=NULL; +int map_mapname2ipport (char *name, int *ip, int *port) +{ + struct map_data_other_server *mdos = NULL; - mdos=strdb_search(map_db,name); - if(mdos==NULL || mdos->gat) - return -1; - *ip=mdos->ip; - *port=mdos->port; - return 0; + mdos = strdb_search (map_db, name); + if (mdos == NULL || mdos->gat) + return -1; + *ip = mdos->ip; + *port = mdos->port; + return 0; } /*========================================== * *------------------------------------------ */ -int map_check_dir(int s_dir,int t_dir) { - if(s_dir == t_dir) - return 0; - switch(s_dir) { - case 0: - if(t_dir == 7 || t_dir == 1 || t_dir == 0) - return 0; - break; - case 1: - if(t_dir == 0 || t_dir == 2 || t_dir == 1) - return 0; - break; - case 2: - if(t_dir == 1 || t_dir == 3 || t_dir == 2) - return 0; - break; - case 3: - if(t_dir == 2 || t_dir == 4 || t_dir == 3) - return 0; - break; - case 4: - if(t_dir == 3 || t_dir == 5 || t_dir == 4) - return 0; - break; - case 5: - if(t_dir == 4 || t_dir == 6 || t_dir == 5) - return 0; - break; - case 6: - if(t_dir == 5 || t_dir == 7 || t_dir == 6) - return 0; - break; - case 7: - if(t_dir == 6 || t_dir == 0 || t_dir == 7) - return 0; - break; - } - return 1; +int map_check_dir (int s_dir, int t_dir) +{ + if (s_dir == t_dir) + return 0; + switch (s_dir) + { + case 0: + if (t_dir == 7 || t_dir == 1 || t_dir == 0) + return 0; + break; + case 1: + if (t_dir == 0 || t_dir == 2 || t_dir == 1) + return 0; + break; + case 2: + if (t_dir == 1 || t_dir == 3 || t_dir == 2) + return 0; + break; + case 3: + if (t_dir == 2 || t_dir == 4 || t_dir == 3) + return 0; + break; + case 4: + if (t_dir == 3 || t_dir == 5 || t_dir == 4) + return 0; + break; + case 5: + if (t_dir == 4 || t_dir == 6 || t_dir == 5) + return 0; + break; + case 6: + if (t_dir == 5 || t_dir == 7 || t_dir == 6) + return 0; + break; + case 7: + if (t_dir == 6 || t_dir == 0 || t_dir == 7) + return 0; + break; + } + return 1; } /*========================================== * 彼我の方向を計算 *------------------------------------------ */ -int map_calc_dir( struct block_list *src,int x,int y) { - int dir=0; - int dx,dy; - - nullpo_retr(0, src); - - dx=x-src->x; - dy=y-src->y; - if( dx==0 && dy==0 ){ // 彼我の場所一致 - dir=0; // 上 - }else if( dx>=0 && dy>=0 ){ // 方向的に右上 - dir=7; // 右上 - if( dx*3-1<dy ) dir=0; // 上 - if( dx>dy*3 ) dir=6; // 右 - }else if( dx>=0 && dy<=0 ){ // 方向的に右下 - dir=5; // 右下 - if( dx*3-1<-dy ) dir=4; // 下 - if( dx>-dy*3 ) dir=6; // 右 - }else if( dx<=0 && dy<=0 ){ // 方向的に左下 - dir=3; // 左下 - if( dx*3+1>dy ) dir=4; // 下 - if( dx<dy*3 ) dir=2; // 左 - }else{ // 方向的に左上 - dir=1; // 左上 - if( -dx*3-1<dy ) dir=0; // 上 - if( -dx>dy*3 ) dir=2; // 左 - } - return dir; +int map_calc_dir (struct block_list *src, int x, int y) +{ + int dir = 0; + int dx, dy; + + nullpo_retr (0, src); + + dx = x - src->x; + dy = y - src->y; + if (dx == 0 && dy == 0) + { // 彼我の場所一致 + dir = 0; // 上 + } + else if (dx >= 0 && dy >= 0) + { // 方向的に右上 + dir = 7; // 右上 + if (dx * 3 - 1 < dy) + dir = 0; // 上 + if (dx > dy * 3) + dir = 6; // 右 + } + else if (dx >= 0 && dy <= 0) + { // 方向的に右下 + dir = 5; // 右下 + if (dx * 3 - 1 < -dy) + dir = 4; // 下 + if (dx > -dy * 3) + dir = 6; // 右 + } + else if (dx <= 0 && dy <= 0) + { // 方向的に左下 + dir = 3; // 左下 + if (dx * 3 + 1 > dy) + dir = 4; // 下 + if (dx < dy * 3) + dir = 2; // 左 + } + else + { // 方向的に左上 + dir = 1; // 左上 + if (-dx * 3 - 1 < dy) + dir = 0; // 上 + if (-dx > dy * 3) + dir = 2; // 左 + } + return dir; } // gat系 @@ -1371,51 +1543,65 @@ int map_calc_dir( struct block_list *src,int x,int y) { * (m,x,y)の状態を調べる *------------------------------------------ */ -int map_getcell(int m,int x,int y) { - if(x<0 || x>=map[m].xs-1 || y<0 || y>=map[m].ys-1) - return 1; - return map[m].gat[x+y*map[m].xs]; +int map_getcell (int m, int x, int y) +{ + if (x < 0 || x >= map[m].xs - 1 || y < 0 || y >= map[m].ys - 1) + return 1; + return map[m].gat[x + y * map[m].xs]; } /*========================================== * (m,x,y)の状態をtにする *------------------------------------------ */ -int map_setcell(int m,int x,int y,int t) { - if(x<0 || x>=map[m].xs || y<0 || y>=map[m].ys) - return t; - return map[m].gat[x+y*map[m].xs]=t; +int map_setcell (int m, int x, int y, int t) +{ + if (x < 0 || x >= map[m].xs || y < 0 || y >= map[m].ys) + return t; + return map[m].gat[x + y * map[m].xs] = t; } /*========================================== * 他鯖管理のマップをdbに追加 *------------------------------------------ */ -int map_setipport(char *name,unsigned long ip,int port) { - struct map_data *md=NULL; - struct map_data_other_server *mdos=NULL; - - md=strdb_search(map_db,name); - if(md==NULL){ // not exist -> add new data - mdos=(struct map_data_other_server *)aCalloc(1,sizeof(struct map_data_other_server)); - memcpy(mdos->name,name,24); - mdos->gat = NULL; - mdos->ip = ip; - mdos->port = port; - strdb_insert(map_db,mdos->name,mdos); - } else { - if(md->gat){ // local -> check data - if(ip!=clif_getip() || port!=clif_getport()){ - printf("from char server : %s -> %08lx:%d\n",name,ip,port); - return 1; - } - } else { // update - mdos=(struct map_data_other_server *)md; - mdos->ip = ip; - mdos->port = port; - } - } - return 0; +int map_setipport (char *name, unsigned long ip, int port) +{ + struct map_data *md = NULL; + struct map_data_other_server *mdos = NULL; + + md = strdb_search (map_db, name); + if (md == NULL) + { // not exist -> add new data + mdos = + (struct map_data_other_server *) aCalloc (1, + sizeof (struct + map_data_other_server)); + memcpy (mdos->name, name, 24); + mdos->gat = NULL; + mdos->ip = ip; + mdos->port = port; + strdb_insert (map_db, mdos->name, mdos); + } + else + { + if (md->gat) + { // local -> check data + if (ip != clif_getip () || port != clif_getport ()) + { + printf ("from char server : %s -> %08lx:%d\n", name, ip, + port); + return 1; + } + } + else + { // update + mdos = (struct map_data_other_server *) md; + mdos->ip = ip; + mdos->port = port; + } + } + return 0; } // 初期化周り @@ -1423,555 +1609,682 @@ int map_setipport(char *name,unsigned long ip,int port) { * 水場高さ設定 *------------------------------------------ */ -static struct { - char mapname[24]; - int waterheight; -} *waterlist=NULL; +static struct +{ + char mapname[24]; + int waterheight; +} *waterlist = NULL; #define NO_WATER 1000000 -static int map_waterheight(char *mapname) { - if(waterlist){ - int i; - for(i=0;waterlist[i].mapname[0] && i < MAX_MAP_PER_SERVER;i++) - if(strcmp(waterlist[i].mapname,mapname)==0) - return waterlist[i].waterheight; - } - return NO_WATER; -} - -static void map_readwater(char *watertxt) { - char line[1024],w1[1024]; - FILE *fp=NULL; - int n=0; - - fp=fopen_(watertxt,"r"); - if(fp==NULL){ - printf("file not found: %s\n",watertxt); - return; - } - if(waterlist==NULL) - waterlist=aCalloc(MAX_MAP_PER_SERVER,sizeof(*waterlist)); - while(fgets(line,1020,fp) && n < MAX_MAP_PER_SERVER){ - int wh,count; - if(line[0] == '/' && line[1] == '/') - continue; - if((count=sscanf(line,"%s%d",w1,&wh)) < 1){ - continue; - } - strcpy(waterlist[n].mapname,w1); - if(count >= 2) - waterlist[n].waterheight = wh; - else - waterlist[n].waterheight = 3; - n++; - } - fclose_(fp); +static int map_waterheight (char *mapname) +{ + if (waterlist) + { + int i; + for (i = 0; waterlist[i].mapname[0] && i < MAX_MAP_PER_SERVER; i++) + if (strcmp (waterlist[i].mapname, mapname) == 0) + return waterlist[i].waterheight; + } + return NO_WATER; +} + +static void map_readwater (char *watertxt) +{ + char line[1024], w1[1024]; + FILE *fp = NULL; + int n = 0; + + fp = fopen_ (watertxt, "r"); + if (fp == NULL) + { + printf ("file not found: %s\n", watertxt); + return; + } + if (waterlist == NULL) + waterlist = aCalloc (MAX_MAP_PER_SERVER, sizeof (*waterlist)); + while (fgets (line, 1020, fp) && n < MAX_MAP_PER_SERVER) + { + int wh, count; + if (line[0] == '/' && line[1] == '/') + continue; + if ((count = sscanf (line, "%s%d", w1, &wh)) < 1) + { + continue; + } + strcpy (waterlist[n].mapname, w1); + if (count >= 2) + waterlist[n].waterheight = wh; + else + waterlist[n].waterheight = 3; + n++; + } + fclose_ (fp); } /*========================================== * マップ1枚読み込み *------------------------------------------ */ -static int map_readmap(int m,char *fn, char *alias) { +static int map_readmap (int m, char *fn, char *alias) +{ unsigned char *gat = ""; - int s; - int x,y,xs,ys; - struct gat_1cell {char type;} *p; - int wh; - size_t size; - - // read & convert fn - gat=grfio_read(fn); - if(gat==NULL) - return -1; - - printf("\rLoading Maps [%d/%d]: %-50s ",m,map_num,fn); - fflush(stdout); - - map[m].m=m; - xs=map[m].xs=*(short*)(gat); - ys=map[m].ys=*(short*)(gat+2); - printf("\n%i %i\n", xs, ys); - map[m].gat = calloc(s = map[m].xs * map[m].ys, 1); - if(map[m].gat==NULL){ - printf("out of memory : map_readmap gat\n"); - exit(1); - } - - map[m].npc_num=0; - map[m].users=0; - memset(&map[m].flag,0,sizeof(map[m].flag)); - if(battle_config.pk_mode) map[m].flag.pvp = 1; // make all maps pvp for pk_mode [Valaris] - wh=map_waterheight(map[m].name); - for(y=0;y<ys;y++){ - p=(struct gat_1cell*)(gat+y*xs+4); - for(x=0;x<xs;x++){ - /*if(wh!=NO_WATER && p->type==0){ - // 水場判定 - map[m].gat[x+y*xs]=(p->high[0]>wh || p->high[1]>wh || p->high[2]>wh || p->high[3]>wh) ? 3 : 0; - } else {*/ - map[m].gat[x+y*xs]=p->type; - //} - p++; - } - } - free(gat); - - map[m].bxs=(xs+BLOCK_SIZE-1)/BLOCK_SIZE; - map[m].bys=(ys+BLOCK_SIZE-1)/BLOCK_SIZE; - size = map[m].bxs * map[m].bys * sizeof(struct block_list*); - - map[m].block = calloc(size, 1); - if(map[m].block == NULL){ - printf("out of memory : map_readmap block\n"); - exit(1); - } - - map[m].block_mob = calloc(size, 1); - if (map[m].block_mob == NULL) { - printf("out of memory : map_readmap block_mob\n"); - exit(1); - } - - size = map[m].bxs*map[m].bys*sizeof(int); - - map[m].block_count = calloc(size, 1); - if(map[m].block_count==NULL){ - printf("out of memory : map_readmap block\n"); - exit(1); - } - memset(map[m].block_count,0,size); - - map[m].block_mob_count=calloc(size, 1); - if(map[m].block_mob_count==NULL){ - printf("out of memory : map_readmap block_mob\n"); - exit(1); - } - memset(map[m].block_mob_count,0,size); - - strdb_insert(map_db,map[m].name,&map[m]); - -// printf("%s read done\n",fn); - - return 0; + int s; + int x, y, xs, ys; + struct gat_1cell + { + char type; + } *p; + int wh; + size_t size; + + // read & convert fn + gat = grfio_read (fn); + if (gat == NULL) + return -1; + + printf ("\rLoading Maps [%d/%d]: %-50s ", m, map_num, fn); + fflush (stdout); + + map[m].m = m; + xs = map[m].xs = *(short *) (gat); + ys = map[m].ys = *(short *) (gat + 2); + printf ("\n%i %i\n", xs, ys); + map[m].gat = calloc (s = map[m].xs * map[m].ys, 1); + if (map[m].gat == NULL) + { + printf ("out of memory : map_readmap gat\n"); + exit (1); + } + + map[m].npc_num = 0; + map[m].users = 0; + memset (&map[m].flag, 0, sizeof (map[m].flag)); + if (battle_config.pk_mode) + map[m].flag.pvp = 1; // make all maps pvp for pk_mode [Valaris] + wh = map_waterheight (map[m].name); + for (y = 0; y < ys; y++) + { + p = (struct gat_1cell *) (gat + y * xs + 4); + for (x = 0; x < xs; x++) + { + /*if(wh!=NO_WATER && p->type==0){ + * // 水場判定 + * map[m].gat[x+y*xs]=(p->high[0]>wh || p->high[1]>wh || p->high[2]>wh || p->high[3]>wh) ? 3 : 0; + * } else { */ + map[m].gat[x + y * xs] = p->type; + //} + p++; + } + } + free (gat); + + map[m].bxs = (xs + BLOCK_SIZE - 1) / BLOCK_SIZE; + map[m].bys = (ys + BLOCK_SIZE - 1) / BLOCK_SIZE; + size = map[m].bxs * map[m].bys * sizeof (struct block_list *); + + map[m].block = calloc (size, 1); + if (map[m].block == NULL) + { + printf ("out of memory : map_readmap block\n"); + exit (1); + } + + map[m].block_mob = calloc (size, 1); + if (map[m].block_mob == NULL) + { + printf ("out of memory : map_readmap block_mob\n"); + exit (1); + } + + size = map[m].bxs * map[m].bys * sizeof (int); + + map[m].block_count = calloc (size, 1); + if (map[m].block_count == NULL) + { + printf ("out of memory : map_readmap block\n"); + exit (1); + } + memset (map[m].block_count, 0, size); + + map[m].block_mob_count = calloc (size, 1); + if (map[m].block_mob_count == NULL) + { + printf ("out of memory : map_readmap block_mob\n"); + exit (1); + } + memset (map[m].block_mob_count, 0, size); + + strdb_insert (map_db, map[m].name, &map[m]); + +// printf("%s read done\n",fn); + + return 0; } /*========================================== * 全てのmapデータを読み込む *------------------------------------------ */ -int map_readallmap(void) { - int i,maps_removed=0; - char fn[256]=""; - - // 先に全部のャbプの存在を確認 - for(i=0;i<map_num;i++){ - if(strstr(map[i].name,".gat")==NULL) - continue; - sprintf(fn,"data\\%s",map[i].name); - if(grfio_size(fn) == -1) { - map_delmap(map[i].name); +int map_readallmap (void) +{ + int i, maps_removed = 0; + char fn[256] = ""; + + // 先に全部のャbプの存在を確認 + for (i = 0; i < map_num; i++) + { + if (strstr (map[i].name, ".gat") == NULL) + continue; + sprintf (fn, "data\\%s", map[i].name); + if (grfio_size (fn) == -1) + { + map_delmap (map[i].name); + maps_removed++; + } + } + for (i = 0; i < map_num; i++) + { + if (strstr (map[i].name, ".gat") != NULL) + { + char *p = strstr (map[i].name, ">"); // [MouseJstr] + if (p != NULL) + { + char alias[64]; + *p = '\0'; + strcpy (alias, map[i].name); + strcpy (map[i].name, p + 1); + sprintf (fn, "data\\%s", map[i].name); + if (map_readmap (i, fn, alias) == -1) + { + map_delmap (map[i].name); + maps_removed++; + } + } + else + { + sprintf (fn, "data\\%s", map[i].name); + if (map_readmap (i, fn, NULL) == -1) + { + map_delmap (map[i].name); maps_removed++; - } + } + } } - for(i=0;i<map_num;i++){ - if(strstr(map[i].name,".gat")!=NULL) { - char *p = strstr(map[i].name, ">"); // [MouseJstr] - if (p != NULL) { - char alias[64]; - *p = '\0'; - strcpy(alias, map[i].name); - strcpy(map[i].name, p + 1); - sprintf(fn,"data\\%s",map[i].name); - if(map_readmap(i,fn, alias) == -1) { - map_delmap(map[i].name); - maps_removed++; - } - } else { - sprintf(fn,"data\\%s",map[i].name); - if(map_readmap(i,fn, NULL) == -1) { - map_delmap(map[i].name); - maps_removed++; - } - } - } - } - - free(waterlist); - printf("\rMaps Loaded: %d %60s\n",map_num,""); - printf("\rMaps Removed: %d \n",maps_removed); - return 0; + } + + free (waterlist); + printf ("\rMaps Loaded: %d %60s\n", map_num, ""); + printf ("\rMaps Removed: %d \n", maps_removed); + return 0; } /*========================================== * 読み込むmapを追加する *------------------------------------------ */ -int map_addmap(char *mapname) { - if (strcmpi(mapname,"clear")==0) { - map_num=0; - return 0; - } +int map_addmap (char *mapname) +{ + if (strcmpi (mapname, "clear") == 0) + { + map_num = 0; + return 0; + } - if (map_num >= MAX_MAP_PER_SERVER - 1) { - printf("too many map\n"); - return 1; - } - memcpy(map[map_num].name, mapname, 24); - map_num++; - return 0; + if (map_num >= MAX_MAP_PER_SERVER - 1) + { + printf ("too many map\n"); + return 1; + } + memcpy (map[map_num].name, mapname, 24); + map_num++; + return 0; } /*========================================== * 読み込むmapを削除する *------------------------------------------ */ -int map_delmap(char *mapname) { - int i; - - if (strcmpi(mapname, "all") == 0) { - map_num = 0; - return 0; - } - - for(i = 0; i < map_num; i++) { - if (strcmp(map[i].name, mapname) == 0) { - printf("Removing map [ %s ] from maplist\n",map[i].name); - memmove(map+i, map+i+1, sizeof(map[0])*(map_num-i-1)); - map_num--; - } - } - return 0; +int map_delmap (char *mapname) +{ + int i; + + if (strcmpi (mapname, "all") == 0) + { + map_num = 0; + return 0; + } + + for (i = 0; i < map_num; i++) + { + if (strcmp (map[i].name, mapname) == 0) + { + printf ("Removing map [ %s ] from maplist\n", map[i].name); + memmove (map + i, map + i + 1, + sizeof (map[0]) * (map_num - i - 1)); + map_num--; + } + } + return 0; } extern char *gm_logfile_name; - #define LOGFILE_SECONDS_PER_CHUNK_SHIFT 10 FILE *map_logfile = NULL; char *map_logfile_name = NULL; static long map_logfile_index; -static void -map_close_logfile() +static void map_close_logfile () { - if (map_logfile) { - char *filenameop_buf = malloc(strlen(map_logfile_name) + 50); - sprintf(filenameop_buf, "gzip -f %s.%ld", map_logfile_name, map_logfile_index); + if (map_logfile) + { + char *filenameop_buf = malloc (strlen (map_logfile_name) + 50); + sprintf (filenameop_buf, "gzip -f %s.%ld", map_logfile_name, + map_logfile_index); - fclose(map_logfile); + fclose (map_logfile); - if (!system(filenameop_buf)) - perror(filenameop_buf); + if (!system (filenameop_buf)) + perror (filenameop_buf); - free(filenameop_buf); - } + free (filenameop_buf); + } } - -static void -map_start_logfile(long suffix) +static void map_start_logfile (long suffix) { - char *filename_buf = malloc(strlen(map_logfile_name) + 50); - map_logfile_index = suffix >> LOGFILE_SECONDS_PER_CHUNK_SHIFT; + char *filename_buf = malloc (strlen (map_logfile_name) + 50); + map_logfile_index = suffix >> LOGFILE_SECONDS_PER_CHUNK_SHIFT; - sprintf(filename_buf, "%s.%ld", map_logfile_name, map_logfile_index); - map_logfile = fopen(filename_buf, "w+"); - if (!map_logfile) - perror(map_logfile_name); + sprintf (filename_buf, "%s.%ld", map_logfile_name, map_logfile_index); + map_logfile = fopen (filename_buf, "w+"); + if (!map_logfile) + perror (map_logfile_name); - free(filename_buf); + free (filename_buf); } -static void -map_set_logfile(char *filename) +static void map_set_logfile (char *filename) { - struct timeval tv; + struct timeval tv; - map_logfile_name = strdup(filename); - gettimeofday(&tv, NULL); + map_logfile_name = strdup (filename); + gettimeofday (&tv, NULL); - map_start_logfile(tv.tv_sec); - atexit(map_close_logfile); - MAP_LOG("log-start v3"); + map_start_logfile (tv.tv_sec); + atexit (map_close_logfile); + MAP_LOG ("log-start v3"); } - -void -map_write_log(char *format, ...) +void map_write_log (char *format, ...) { - struct timeval tv; - va_list args; - va_start(args, format); + struct timeval tv; + va_list args; + va_start (args, format); - gettimeofday(&tv, NULL); + gettimeofday (&tv, NULL); - if ((tv.tv_sec >> LOGFILE_SECONDS_PER_CHUNK_SHIFT) != map_logfile_index) { - map_close_logfile(); - map_start_logfile(tv.tv_sec); - } + if ((tv.tv_sec >> LOGFILE_SECONDS_PER_CHUNK_SHIFT) != map_logfile_index) + { + map_close_logfile (); + map_start_logfile (tv.tv_sec); + } - fprintf(map_logfile, "%ld.%06ld ", (long)tv.tv_sec, (long) tv.tv_usec); - vfprintf(map_logfile, format, args); - fputc('\n', map_logfile); + fprintf (map_logfile, "%ld.%06ld ", (long) tv.tv_sec, (long) tv.tv_usec); + vfprintf (map_logfile, format, args); + fputc ('\n', map_logfile); } - /*========================================== * 設定ファイルを読み込む *------------------------------------------ */ -int map_config_read(char *cfgName) { - char line[1024], w1[1024], w2[1024]; - FILE *fp; - struct hostent *h = NULL; - - fp = fopen_(cfgName,"r"); - if (fp == NULL) { - printf("Map configuration file not found at: %s\n", cfgName); - exit(1); - } - while(fgets(line, sizeof(line) -1, fp)) { - if (line[0] == '/' && line[1] == '/') - continue; - if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2) { - if (strcmpi(w1, "userid")==0){ - chrif_setuserid(w2); - } else if (strcmpi(w1, "passwd") == 0) { - chrif_setpasswd(w2); - } else if (strcmpi(w1, "char_ip") == 0) { - h = gethostbyname (w2); - if(h != NULL) { - printf("Character server IP address : %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - sprintf(w2,"%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - } - chrif_setip(w2); - } else if (strcmpi(w1, "char_port") == 0) { - chrif_setport(atoi(w2)); - } else if (strcmpi(w1, "map_ip") == 0) { - h = gethostbyname (w2); - if (h != NULL) { - printf("Map server IP address : %s -> %d.%d.%d.%d\n", w2, (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - sprintf(w2, "%d.%d.%d.%d", (unsigned char)h->h_addr[0], (unsigned char)h->h_addr[1], (unsigned char)h->h_addr[2], (unsigned char)h->h_addr[3]); - } - clif_setip(w2); - } else if (strcmpi(w1, "map_port") == 0) { - clif_setport(atoi(w2)); - map_port = (atoi(w2)); - } else if (strcmpi(w1, "water_height") == 0) { - map_readwater(w2); - } else if (strcmpi(w1, "map") == 0) { - map_addmap(w2); - } else if (strcmpi(w1, "delmap") == 0) { - map_delmap(w2); - } else if (strcmpi(w1, "npc") == 0) { - npc_addsrcfile(w2); - } else if (strcmpi(w1, "delnpc") == 0) { - npc_delsrcfile(w2); - } else if (strcmpi(w1, "data_grf") == 0) { - grfio_setdatafile(w2); - } else if (strcmpi(w1, "sdata_grf") == 0) { - grfio_setsdatafile(w2); - } else if (strcmpi(w1, "adata_grf") == 0) { - grfio_setadatafile(w2); - } else if (strcmpi(w1, "autosave_time") == 0) { - autosave_interval = atoi(w2) * 1000; - if (autosave_interval <= 0) - autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; - } else if (strcmpi(w1, "motd_txt") == 0) { - strcpy(motd_txt, w2); - } else if (strcmpi(w1, "help_txt") == 0) { - strcpy(help_txt, w2); - } else if (strcmpi(w1, "mapreg_txt") == 0) { - strcpy(mapreg_txt, w2); - } else if (strcmpi(w1, "gm_log") == 0) { - gm_logfile_name = strdup(w2); - } else if (strcmpi(w1, "log_file") == 0) { - map_set_logfile(w2); - } else if (strcmpi(w1, "import") == 0) { - map_config_read(w2); - } - } - } - fclose_(fp); - - return 0; -} - -int id_db_final(void *k,void *d,va_list ap){ return 0; } -int map_db_final(void *k,void *d,va_list ap){ return 0; } -int nick_db_final(void *k,void *d,va_list ap){ return 0; } -int charid_db_final(void *k,void *d,va_list ap){ return 0; } - -static int cleanup_sub(struct block_list *bl, va_list ap) { - nullpo_retr(0, bl); - - switch(bl->type) { +int map_config_read (char *cfgName) +{ + char line[1024], w1[1024], w2[1024]; + FILE *fp; + struct hostent *h = NULL; + + fp = fopen_ (cfgName, "r"); + if (fp == NULL) + { + printf ("Map configuration file not found at: %s\n", cfgName); + exit (1); + } + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + if (sscanf (line, "%[^:]: %[^\r\n]", w1, w2) == 2) + { + if (strcmpi (w1, "userid") == 0) + { + chrif_setuserid (w2); + } + else if (strcmpi (w1, "passwd") == 0) + { + chrif_setpasswd (w2); + } + else if (strcmpi (w1, "char_ip") == 0) + { + h = gethostbyname (w2); + if (h != NULL) + { + printf + ("Character server IP address : %s -> %d.%d.%d.%d\n", + w2, (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + sprintf (w2, "%d.%d.%d.%d", (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + } + chrif_setip (w2); + } + else if (strcmpi (w1, "char_port") == 0) + { + chrif_setport (atoi (w2)); + } + else if (strcmpi (w1, "map_ip") == 0) + { + h = gethostbyname (w2); + if (h != NULL) + { + printf ("Map server IP address : %s -> %d.%d.%d.%d\n", w2, + (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + sprintf (w2, "%d.%d.%d.%d", (unsigned char) h->h_addr[0], + (unsigned char) h->h_addr[1], + (unsigned char) h->h_addr[2], + (unsigned char) h->h_addr[3]); + } + clif_setip (w2); + } + else if (strcmpi (w1, "map_port") == 0) + { + clif_setport (atoi (w2)); + map_port = (atoi (w2)); + } + else if (strcmpi (w1, "water_height") == 0) + { + map_readwater (w2); + } + else if (strcmpi (w1, "map") == 0) + { + map_addmap (w2); + } + else if (strcmpi (w1, "delmap") == 0) + { + map_delmap (w2); + } + else if (strcmpi (w1, "npc") == 0) + { + npc_addsrcfile (w2); + } + else if (strcmpi (w1, "delnpc") == 0) + { + npc_delsrcfile (w2); + } + else if (strcmpi (w1, "data_grf") == 0) + { + grfio_setdatafile (w2); + } + else if (strcmpi (w1, "sdata_grf") == 0) + { + grfio_setsdatafile (w2); + } + else if (strcmpi (w1, "adata_grf") == 0) + { + grfio_setadatafile (w2); + } + else if (strcmpi (w1, "autosave_time") == 0) + { + autosave_interval = atoi (w2) * 1000; + if (autosave_interval <= 0) + autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; + } + else if (strcmpi (w1, "motd_txt") == 0) + { + strcpy (motd_txt, w2); + } + else if (strcmpi (w1, "help_txt") == 0) + { + strcpy (help_txt, w2); + } + else if (strcmpi (w1, "mapreg_txt") == 0) + { + strcpy (mapreg_txt, w2); + } + else if (strcmpi (w1, "gm_log") == 0) + { + gm_logfile_name = strdup (w2); + } + else if (strcmpi (w1, "log_file") == 0) + { + map_set_logfile (w2); + } + else if (strcmpi (w1, "import") == 0) + { + map_config_read (w2); + } + } + } + fclose_ (fp); + + return 0; +} + +int id_db_final (void *k, void *d, va_list ap) +{ + return 0; +} + +int map_db_final (void *k, void *d, va_list ap) +{ + return 0; +} + +int nick_db_final (void *k, void *d, va_list ap) +{ + return 0; +} + +int charid_db_final (void *k, void *d, va_list ap) +{ + return 0; +} + +static int cleanup_sub (struct block_list *bl, va_list ap) +{ + nullpo_retr (0, bl); + + switch (bl->type) + { case BL_PC: - map_delblock(bl); // There is something better... + map_delblock (bl); // There is something better... break; case BL_NPC: - npc_delete((struct npc_data *)bl); + npc_delete ((struct npc_data *) bl); break; case BL_MOB: - mob_delete((struct mob_data *)bl); + mob_delete ((struct mob_data *) bl); break; case BL_ITEM: - map_clearflooritem(bl->id); + map_clearflooritem (bl->id); break; case BL_SKILL: - skill_delunit((struct skill_unit *) bl); + skill_delunit ((struct skill_unit *) bl); break; case BL_SPELL: - spell_free_invocation((struct invocation *) bl); + spell_free_invocation ((struct invocation *) bl); break; - } + } - return 0; + return 0; } /*========================================== * map鯖終了時処理 *------------------------------------------ */ -void do_final(void) { - int map_id, i; +void do_final (void) +{ + int map_id, i; - for (map_id = 0; map_id < map_num;map_id++) { - if(map[map_id].m) - map_foreachinarea(cleanup_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, 0, 0); + for (map_id = 0; map_id < map_num; map_id++) + { + if (map[map_id].m) + map_foreachinarea (cleanup_sub, map_id, 0, 0, map[map_id].xs, + map[map_id].ys, 0, 0); } - for (i = 0; i < fd_max; i++) - delete_session(i); - - map_removenpc(); - timer_final(); - - numdb_final(id_db, id_db_final); - strdb_final(map_db, map_db_final); - strdb_final(nick_db, nick_db_final); - numdb_final(charid_db, charid_db_final); - - for(i=0;i<=map_num;i++){ - if(map[i].gat) free(map[i].gat); - if(map[i].block) free(map[i].block); - if(map[i].block_mob) free(map[i].block_mob); - if(map[i].block_count) free(map[i].block_count); - if(map[i].block_mob_count) free(map[i].block_mob_count); - } - do_final_script(); - do_final_itemdb(); - do_final_storage(); - do_final_guild(); + for (i = 0; i < fd_max; i++) + delete_session (i); + + map_removenpc (); + timer_final (); + + numdb_final (id_db, id_db_final); + strdb_final (map_db, map_db_final); + strdb_final (nick_db, nick_db_final); + numdb_final (charid_db, charid_db_final); + + for (i = 0; i <= map_num; i++) + { + if (map[i].gat) + free (map[i].gat); + if (map[i].block) + free (map[i].block); + if (map[i].block_mob) + free (map[i].block_mob); + if (map[i].block_count) + free (map[i].block_count); + if (map[i].block_mob_count) + free (map[i].block_mob_count); + } + do_final_script (); + do_final_itemdb (); + do_final_storage (); + do_final_guild (); } -void map_helpscreen() { - exit(1); +void map_helpscreen () +{ + exit (1); } -int compare_item(struct item *a, struct item *b) { - return ( - (a->nameid == b->nameid) && - (a->identify == b->identify) && - (a->refine == b->refine) && - (a->attribute == b->attribute) && - (a->card[0] == b->card[0]) && - (a->card[1] == b->card[1]) && - (a->card[2] == b->card[2]) && - (a->card[3] == b->card[3])); +int compare_item (struct item *a, struct item *b) +{ + return ((a->nameid == b->nameid) && + (a->identify == b->identify) && + (a->refine == b->refine) && + (a->attribute == b->attribute) && + (a->card[0] == b->card[0]) && + (a->card[1] == b->card[1]) && + (a->card[2] == b->card[2]) && (a->card[3] == b->card[3])); } /*====================================================== * Map-Server Init and Command-line Arguments [Valaris] *------------------------------------------------------ */ -int do_init(int argc, char *argv[]) { - int i; - - unsigned char *MAP_CONF_NAME = "conf/map_athena.conf"; - unsigned char *BATTLE_CONF_FILENAME = "conf/battle_athena.conf"; - unsigned char *ATCOMMAND_CONF_FILENAME = "conf/atcommand_athena.conf"; - unsigned char *SCRIPT_CONF_NAME = "conf/script_athena.conf"; - unsigned char *MSG_CONF_NAME = "conf/msg_athena.conf"; - unsigned char *GRF_PATH_FILENAME = "conf/grf-files.txt"; - - for (i = 1; i < argc ; i++) { - - if (strcmp(argv[i], "--help") == 0 || strcmp(argv[i], "--h") == 0 || strcmp(argv[i], "--?") == 0 || strcmp(argv[i], "/?") == 0) - map_helpscreen(); - else if (strcmp(argv[i], "--map_config") == 0) - MAP_CONF_NAME=argv[i+1]; - else if (strcmp(argv[i],"--battle_config") == 0) - BATTLE_CONF_FILENAME = argv[i+1]; - else if (strcmp(argv[i],"--atcommand_config") == 0) - ATCOMMAND_CONF_FILENAME = argv[i+1]; - else if (strcmp(argv[i],"--script_config") == 0) - SCRIPT_CONF_NAME = argv[i+1]; - else if (strcmp(argv[i],"--msg_config") == 0) - MSG_CONF_NAME = argv[i+1]; - else if (strcmp(argv[i],"--grf_path_file") == 0) - GRF_PATH_FILENAME = argv[i+1]; - } - - map_config_read(MAP_CONF_NAME); - battle_config_read(BATTLE_CONF_FILENAME); - atcommand_config_read(ATCOMMAND_CONF_FILENAME); - script_config_read(SCRIPT_CONF_NAME); - msg_config_read(MSG_CONF_NAME); - - atexit(do_final); - - id_db = numdb_init(); - map_db = strdb_init(16); - nick_db = strdb_init(24); - charid_db = numdb_init(); - - grfio_init(GRF_PATH_FILENAME); - - map_readallmap(); - - add_timer_func_list(map_clearflooritem_timer, "map_clearflooritem_timer"); - - do_init_chrif(); - do_init_clif(); - do_init_itemdb(); - do_init_mob(); // npcの初期化時内でmob_spawnして、mob_dbを参照するのでinit_npcより先 - do_init_script(); - do_init_npc(); - do_init_pc(); - do_init_party(); - do_init_guild(); - do_init_storage(); - do_init_skill(); - do_init_magic(); - - npc_event_do_oninit(); // npcのOnInitイベント実行 - - if (battle_config.pk_mode == 1) - printf("The server is running in \033[1;31mPK Mode\033[0m.\n"); - - printf("The map-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", map_port); - - return 0; -} - -int -map_scriptcont(struct map_session_data *sd, int id) -{ - struct block_list *bl = map_id2bl(id); - - if (!bl) - return 0; +int do_init (int argc, char *argv[]) +{ + int i; + + unsigned char *MAP_CONF_NAME = "conf/map_athena.conf"; + unsigned char *BATTLE_CONF_FILENAME = "conf/battle_athena.conf"; + unsigned char *ATCOMMAND_CONF_FILENAME = "conf/atcommand_athena.conf"; + unsigned char *SCRIPT_CONF_NAME = "conf/script_athena.conf"; + unsigned char *MSG_CONF_NAME = "conf/msg_athena.conf"; + unsigned char *GRF_PATH_FILENAME = "conf/grf-files.txt"; + + for (i = 1; i < argc; i++) + { + + if (strcmp (argv[i], "--help") == 0 || strcmp (argv[i], "--h") == 0 + || strcmp (argv[i], "--?") == 0 || strcmp (argv[i], "/?") == 0) + map_helpscreen (); + else if (strcmp (argv[i], "--map_config") == 0) + MAP_CONF_NAME = argv[i + 1]; + else if (strcmp (argv[i], "--battle_config") == 0) + BATTLE_CONF_FILENAME = argv[i + 1]; + else if (strcmp (argv[i], "--atcommand_config") == 0) + ATCOMMAND_CONF_FILENAME = argv[i + 1]; + else if (strcmp (argv[i], "--script_config") == 0) + SCRIPT_CONF_NAME = argv[i + 1]; + else if (strcmp (argv[i], "--msg_config") == 0) + MSG_CONF_NAME = argv[i + 1]; + else if (strcmp (argv[i], "--grf_path_file") == 0) + GRF_PATH_FILENAME = argv[i + 1]; + } + + map_config_read (MAP_CONF_NAME); + battle_config_read (BATTLE_CONF_FILENAME); + atcommand_config_read (ATCOMMAND_CONF_FILENAME); + script_config_read (SCRIPT_CONF_NAME); + msg_config_read (MSG_CONF_NAME); + + atexit (do_final); + + id_db = numdb_init (); + map_db = strdb_init (16); + nick_db = strdb_init (24); + charid_db = numdb_init (); + + grfio_init (GRF_PATH_FILENAME); + + map_readallmap (); + + add_timer_func_list (map_clearflooritem_timer, + "map_clearflooritem_timer"); + + do_init_chrif (); + do_init_clif (); + do_init_itemdb (); + do_init_mob (); // npcの初期化時内でmob_spawnして、mob_dbを参照するのでinit_npcより先 + do_init_script (); + do_init_npc (); + do_init_pc (); + do_init_party (); + do_init_guild (); + do_init_storage (); + do_init_skill (); + do_init_magic (); + + npc_event_do_oninit (); // npcのOnInitイベント実行 + + if (battle_config.pk_mode == 1) + printf ("The server is running in \033[1;31mPK Mode\033[0m.\n"); - switch (bl->type) { - case BL_NPC: return npc_scriptcont(sd, id); + printf + ("The map-server is \033[1;32mready\033[0m (Server is listening on the port %d).\n\n", + map_port); + + return 0; +} + +int map_scriptcont (struct map_session_data *sd, int id) +{ + struct block_list *bl = map_id2bl (id); + + if (!bl) + return 0; + + switch (bl->type) + { + case BL_NPC: + return npc_scriptcont (sd, id); case BL_SPELL: - spell_execute_script((struct invocation *) bl); + spell_execute_script ((struct invocation *) bl); break; - } + } - return 0; + return 0; } diff --git a/src/map/map.h b/src/map/map.h index c0a9772..2ba31b1 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -61,600 +61,652 @@ #define CLIF_OPTION_SC_INVISIBILITY (CLIF_OPTION_SC_BASE) #define CLIF_OPTION_SC_SCRIBE (CLIF_OPTION_SC_BASE + 1) -enum { BL_NUL, BL_PC, BL_NPC, BL_MOB, BL_ITEM, BL_CHAT, BL_SKILL, BL_SPELL }; -enum { WARP, SHOP, SCRIPT, MONS, MESSAGE }; -struct block_list { - struct block_list *next,*prev; - int id; - short m,x,y; - unsigned char type; - unsigned char subtype; +enum +{ BL_NUL, BL_PC, BL_NPC, BL_MOB, BL_ITEM, BL_CHAT, BL_SKILL, BL_SPELL }; +enum +{ WARP, SHOP, SCRIPT, MONS, MESSAGE }; +struct block_list +{ + struct block_list *next, *prev; + int id; + short m, x, y; + unsigned char type; + unsigned char subtype; }; -struct walkpath_data { - unsigned char path_len,path_pos,path_half; - unsigned char path[MAX_WALKPATH]; +struct walkpath_data +{ + unsigned char path_len, path_pos, path_half; + unsigned char path[MAX_WALKPATH]; }; -struct script_reg { - int index; - int data; +struct script_reg +{ + int index; + int data; }; -struct script_regstr { - int index; - char data[256]; +struct script_regstr +{ + int index; + char data[256]; }; -struct status_change { - int timer; - int val1,val2,val3,val4; - int spell_invocation; /* [Fate] If triggered by a spell, record here */ +struct status_change +{ + int timer; + int val1, val2, val3, val4; + int spell_invocation; /* [Fate] If triggered by a spell, record here */ }; struct invocation; struct skill_unit_group; -struct skill_unit { - struct block_list bl; +struct skill_unit +{ + struct block_list bl; - struct skill_unit_group *group; + struct skill_unit_group *group; - int limit; - int val1,val2; - short alive,range; + int limit; + int val1, val2; + short alive, range; }; -struct skill_unit_group { - int src_id; - int party_id; - int guild_id; - int map,range; - int target_flag; - unsigned int tick; - int limit,interval; - - int skill_id,skill_lv; - int val1,val2; - char *valstr; - int unit_id; - int group_id; - int unit_count,alive_count; - struct skill_unit *unit; +struct skill_unit_group +{ + int src_id; + int party_id; + int guild_id; + int map, range; + int target_flag; + unsigned int tick; + int limit, interval; + + int skill_id, skill_lv; + int val1, val2; + char *valstr; + int unit_id; + int group_id; + int unit_count, alive_count; + struct skill_unit *unit; }; -struct skill_unit_group_tickset { - unsigned int tick; - int group_id; +struct skill_unit_group_tickset +{ + unsigned int tick; + int group_id; }; -struct skill_timerskill { - int timer; - int src_id; - int target_id; - int map; - short x,y; - short skill_id,skill_lv; - int type; - int flag; +struct skill_timerskill +{ + int timer; + int src_id; + int target_id; + int map; + short x, y; + short skill_id, skill_lv; + int type; + int flag; }; struct npc_data; struct item_data; struct square; -struct quick_regeneration { // [Fate] - int amount; // Amount of HP/SP left to regenerate - unsigned char speed; // less is faster (number of half-second ticks to wait between updates) - unsigned char tickdelay; // number of ticks to next update +struct quick_regeneration +{ // [Fate] + int amount; // Amount of HP/SP left to regenerate + unsigned char speed; // less is faster (number of half-second ticks to wait between updates) + unsigned char tickdelay; // number of ticks to next update }; -#define VERSION_2_SKILLINFO 0x02 // client supports full skillinfo blocks - -struct map_session_data { - struct block_list bl; - struct { - unsigned auth : 1; - unsigned change_walk_target : 1; - unsigned attack_continue : 1; - unsigned menu_or_input : 1; - unsigned dead_sit : 2; - unsigned skillcastcancel : 1; - unsigned waitingdisconnect : 1; - unsigned lr_flag : 2; - unsigned connect_new : 1; - unsigned arrow_atk : 1; - unsigned attack_type : 3; - unsigned skill_flag : 1; - unsigned gangsterparadise : 1; - unsigned produce_flag : 1; - unsigned make_arrow_flag : 1; - unsigned potionpitcher_flag : 1; - unsigned storage_flag : 2; //0: closed, 1: Normal Storage open, 2: guild storage open [Skotlex] - unsigned shroud_active : 1; - unsigned shroud_hides_name_talking : 1; - unsigned shroud_disappears_on_pickup : 1; - unsigned shroud_disappears_on_talk : 1; - } state; - struct { - unsigned killer : 1; - unsigned killable : 1; - unsigned restart_full_recover : 1; - unsigned no_castcancel : 1; - unsigned no_castcancel2 : 1; - unsigned no_sizefix : 1; - unsigned no_magic_damage : 1; - unsigned no_weapon_damage : 1; - unsigned no_gemstone : 1; - unsigned infinite_endure : 1; - unsigned unbreakable_weapon : 1; - unsigned unbreakable_armor : 1; - unsigned infinite_autospell : 1; - unsigned deaf : 1; - } special_state; - int char_id, login_id1, login_id2, sex; - unsigned char tmw_version; // tmw client version - struct mmo_charstatus status; - struct item_data *inventory_data[MAX_INVENTORY]; - short equip_index[11]; - int weight,max_weight; - int cart_weight,cart_max_weight,cart_num,cart_max_num; - char mapname[24]; - int fd,new_fd; - short to_x,to_y; - short speed,prev_speed; - short opt1,opt2,opt3; - char dir,head_dir; - unsigned int client_tick,server_tick; - struct walkpath_data walkpath; - int walktimer; - int npc_id,areanpc_id,npc_shopid; - int npc_pos; - int npc_menu; - int npc_amount; - int npc_stack,npc_stackmax; - char *npc_script,*npc_scriptroot; - char *npc_stackbuf; - char npc_str[256]; - struct { - unsigned storage : 1; - unsigned divorce : 1; - } npc_flags; - unsigned int chatID; - - int attacktimer; - int attacktarget; - short attacktarget_lv; - unsigned int attackabletime; - - int followtimer; // [MouseJstr] - int followtarget; - - unsigned int cast_tick; // [Fate] Next tick at which spellcasting is allowed - struct invocation *active_spells; // [Fate] Singly-linked list of active spells linked to this PC - int attack_spell_override; // [Fate] When an attack spell is active for this player, they trigger it - // like a weapon. Check pc_attack_timer() for details. - short attack_spell_icon_override; // Weapon equipment slot (slot 4) item override - short attack_spell_look_override; // Weapon `look' (attack animation) override - short attack_spell_charges; // [Fate] Remaining number of charges for the attack spell - short attack_spell_delay; // [Fate] ms delay after spell attack - short attack_spell_range; // [Fate] spell range - short spellpower_bonus_target, spellpower_bonus_current; // [Fate] Spellpower boni. _current is the active one. - //_current slowly approximates _target, and _target is determined by equipment. - - short attackrange,attackrange_; - int skilltimer; - int skilltarget; - short skillx,skilly; - short skillid,skilllv; - short skillitem,skillitemlv; - short skillid_old,skilllv_old; - short skillid_dance,skilllv_dance; - struct skill_unit_group skillunit[MAX_SKILLUNITGROUP]; - struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET]; - struct skill_timerskill skilltimerskill[MAX_SKILLTIMERSKILL]; - int cloneskill_id,cloneskill_lv; - int potion_hp,potion_sp,potion_per_hp,potion_per_sp; - - // [Fate] Used for gradual healing; amount of enqueued regeneration - struct quick_regeneration quick_regeneration_hp, quick_regeneration_sp; - // [Fate] XP that can be extracted from this player by healing - int heal_xp; // i.e., OTHER players (healers) can partake in this player's XP - - int invincible_timer; - unsigned int canact_tick; - unsigned int canmove_tick; - unsigned int canlog_tick; - int hp_sub,sp_sub; - int inchealhptick,inchealsptick,inchealspirithptick,inchealspiritsptick; +#define VERSION_2_SKILLINFO 0x02 // client supports full skillinfo blocks + +struct map_session_data +{ + struct block_list bl; + struct + { + unsigned auth:1; + unsigned change_walk_target:1; + unsigned attack_continue:1; + unsigned menu_or_input:1; + unsigned dead_sit:2; + unsigned skillcastcancel:1; + unsigned waitingdisconnect:1; + unsigned lr_flag:2; + unsigned connect_new:1; + unsigned arrow_atk:1; + unsigned attack_type:3; + unsigned skill_flag:1; + unsigned gangsterparadise:1; + unsigned produce_flag:1; + unsigned make_arrow_flag:1; + unsigned potionpitcher_flag:1; + unsigned storage_flag:2; //0: closed, 1: Normal Storage open, 2: guild storage open [Skotlex] + unsigned shroud_active:1; + unsigned shroud_hides_name_talking:1; + unsigned shroud_disappears_on_pickup:1; + unsigned shroud_disappears_on_talk:1; + } state; + struct + { + unsigned killer:1; + unsigned killable:1; + unsigned restart_full_recover:1; + unsigned no_castcancel:1; + unsigned no_castcancel2:1; + unsigned no_sizefix:1; + unsigned no_magic_damage:1; + unsigned no_weapon_damage:1; + unsigned no_gemstone:1; + unsigned infinite_endure:1; + unsigned unbreakable_weapon:1; + unsigned unbreakable_armor:1; + unsigned infinite_autospell:1; + unsigned deaf:1; + } special_state; + int char_id, login_id1, login_id2, sex; + unsigned char tmw_version; // tmw client version + struct mmo_charstatus status; + struct item_data *inventory_data[MAX_INVENTORY]; + short equip_index[11]; + int weight, max_weight; + int cart_weight, cart_max_weight, cart_num, cart_max_num; + char mapname[24]; + int fd, new_fd; + short to_x, to_y; + short speed, prev_speed; + short opt1, opt2, opt3; + char dir, head_dir; + unsigned int client_tick, server_tick; + struct walkpath_data walkpath; + int walktimer; + int npc_id, areanpc_id, npc_shopid; + int npc_pos; + int npc_menu; + int npc_amount; + int npc_stack, npc_stackmax; + char *npc_script, *npc_scriptroot; + char *npc_stackbuf; + char npc_str[256]; + struct + { + unsigned storage:1; + unsigned divorce:1; + } npc_flags; + unsigned int chatID; + + int attacktimer; + int attacktarget; + short attacktarget_lv; + unsigned int attackabletime; + + int followtimer; // [MouseJstr] + int followtarget; + + unsigned int cast_tick; // [Fate] Next tick at which spellcasting is allowed + struct invocation *active_spells; // [Fate] Singly-linked list of active spells linked to this PC + int attack_spell_override; // [Fate] When an attack spell is active for this player, they trigger it + // like a weapon. Check pc_attack_timer() for details. + short attack_spell_icon_override; // Weapon equipment slot (slot 4) item override + short attack_spell_look_override; // Weapon `look' (attack animation) override + short attack_spell_charges; // [Fate] Remaining number of charges for the attack spell + short attack_spell_delay; // [Fate] ms delay after spell attack + short attack_spell_range; // [Fate] spell range + short spellpower_bonus_target, spellpower_bonus_current; // [Fate] Spellpower boni. _current is the active one. + //_current slowly approximates _target, and _target is determined by equipment. + + short attackrange, attackrange_; + int skilltimer; + int skilltarget; + short skillx, skilly; + short skillid, skilllv; + short skillitem, skillitemlv; + short skillid_old, skilllv_old; + short skillid_dance, skilllv_dance; + struct skill_unit_group skillunit[MAX_SKILLUNITGROUP]; + struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET]; + struct skill_timerskill skilltimerskill[MAX_SKILLTIMERSKILL]; + int cloneskill_id, cloneskill_lv; + int potion_hp, potion_sp, potion_per_hp, potion_per_sp; + + // [Fate] Used for gradual healing; amount of enqueued regeneration + struct quick_regeneration quick_regeneration_hp, quick_regeneration_sp; + // [Fate] XP that can be extracted from this player by healing + int heal_xp; // i.e., OTHER players (healers) can partake in this player's XP + + int invincible_timer; + unsigned int canact_tick; + unsigned int canmove_tick; + unsigned int canlog_tick; + int hp_sub, sp_sub; + int inchealhptick, inchealsptick, inchealspirithptick, + inchealspiritsptick; // -- moonsoul (new tick for berserk self-damage) - int berserkdamagetick; - int fame; - - short view_class; - short weapontype1,weapontype2; - short disguiseflag,disguise; // [Valaris] - int paramb[6],paramc[6],parame[6],paramcard[6]; - int hit,flee,flee2,aspd,amotion,dmotion; - int watk,watk2,atkmods[3]; - int def,def2,mdef,mdef2,critical,matk1,matk2; - int atk_ele,def_ele,star,overrefine; - int castrate,hprate,sprate,dsprate; - int addele[10],addrace[12],addsize[3],subele[10],subrace[12]; - int addeff[10],addeff2[10],reseff[10]; - int watk_,watk_2,atkmods_[3],addele_[10],addrace_[12],addsize_[3]; //二刀流のために追加 - int atk_ele_,star_,overrefine_; //二刀流のために追加 - int base_atk,atk_rate; - int arrow_atk,arrow_ele,arrow_cri,arrow_hit,arrow_range; - int arrow_addele[10],arrow_addrace[12],arrow_addsize[3],arrow_addeff[10],arrow_addeff2[10]; - int nhealhp,nhealsp,nshealhp,nshealsp,nsshealhp,nsshealsp; - int aspd_rate,speed_rate,hprecov_rate,sprecov_rate,critical_def,double_rate; - int near_attack_def_rate,long_attack_def_rate,magic_def_rate,misc_def_rate; - int matk_rate,ignore_def_ele,ignore_def_race,ignore_def_ele_,ignore_def_race_; - int ignore_mdef_ele,ignore_mdef_race; - int magic_addele[10],magic_addrace[12],magic_subrace[12]; - int perfect_hit,get_zeny_num; - int critical_rate,hit_rate,flee_rate,flee2_rate,def_rate,def2_rate,mdef_rate,mdef2_rate; - int def_ratio_atk_ele,def_ratio_atk_ele_,def_ratio_atk_race,def_ratio_atk_race_; - int add_damage_class_count,add_damage_class_count_,add_magic_damage_class_count; - short add_damage_classid[10],add_damage_classid_[10],add_magic_damage_classid[10]; - int add_damage_classrate[10],add_damage_classrate_[10],add_magic_damage_classrate[10]; - short add_def_class_count,add_mdef_class_count; - short add_def_classid[10],add_mdef_classid[10]; - int add_def_classrate[10],add_mdef_classrate[10]; - short monster_drop_item_count; - short monster_drop_itemid[10]; - int monster_drop_race[10],monster_drop_itemrate[10]; - int double_add_rate,speed_add_rate,aspd_add_rate,perfect_hit_add, get_zeny_add_num; - short splash_range,splash_add_range; - short autospell_id,autospell_lv,autospell_rate; - short hp_drain_rate,hp_drain_per,sp_drain_rate,sp_drain_per; - short hp_drain_rate_,hp_drain_per_,sp_drain_rate_,sp_drain_per_; - int short_weapon_damage_return,long_weapon_damage_return; - int weapon_coma_ele[10],weapon_coma_race[12]; - short break_weapon_rate,break_armor_rate; - short add_steal_rate; - - short spiritball, spiritball_old; - int spirit_timer[MAX_SKILL_LEVEL]; - int magic_damage_return; // AppleGirl Was Here - int random_attack_increase_add,random_attack_increase_per; // [Valaris] - int perfect_hiding; // [Valaris] - int unbreakable; - - int die_counter; - short doridori_counter; - - int reg_num; - struct script_reg *reg; - int regstr_num; - struct script_regstr *regstr; - - struct status_change sc_data[MAX_STATUSCHANGE]; - short sc_count; - struct square dev; - - int trade_partner; - int deal_item_index[10]; - int deal_item_amount[10]; - int deal_zeny; - short deal_locked; - - int party_sended,party_invite,party_invite_account; - int party_hp,party_x,party_y; - - int guild_sended,guild_invite,guild_invite_account; - int guild_emblem_id,guild_alliance,guild_alliance_account; - int guildspy; // [Syrus22] - int partyspy; // [Syrus22] - - char message[80]; - - int catch_target_class; - - int pvp_point,pvp_rank,pvp_timer,pvp_lastusers; - - char eventqueue[MAX_EVENTQUEUE][50]; - int eventtimer[MAX_EVENTTIMER]; - - int last_skillid,last_skilllv; // Added by RoVeRT - struct{ - char name[24]; - } ignore[80]; - int ignoreAll; - short sg_count; - - struct { - unsigned in_progress : 1; - } auto_ban_info; - - time_t chat_reset_due; - time_t chat_repeat_reset_due; - int chat_lines_in; - int chat_total_repeats; - char chat_lastmsg[513]; - - time_t trade_reset_due; - int trades_in; - - time_t sit_reset_due; - int sits_in; + int berserkdamagetick; + int fame; + + short view_class; + short weapontype1, weapontype2; + short disguiseflag, disguise; // [Valaris] + int paramb[6], paramc[6], parame[6], paramcard[6]; + int hit, flee, flee2, aspd, amotion, dmotion; + int watk, watk2, atkmods[3]; + int def, def2, mdef, mdef2, critical, matk1, matk2; + int atk_ele, def_ele, star, overrefine; + int castrate, hprate, sprate, dsprate; + int addele[10], addrace[12], addsize[3], subele[10], subrace[12]; + int addeff[10], addeff2[10], reseff[10]; + int watk_, watk_2, atkmods_[3], addele_[10], addrace_[12], addsize_[3]; //二刀流のために追加 + int atk_ele_, star_, overrefine_; //二刀流のために追加 + int base_atk, atk_rate; + int arrow_atk, arrow_ele, arrow_cri, arrow_hit, arrow_range; + int arrow_addele[10], arrow_addrace[12], arrow_addsize[3], + arrow_addeff[10], arrow_addeff2[10]; + int nhealhp, nhealsp, nshealhp, nshealsp, nsshealhp, nsshealsp; + int aspd_rate, speed_rate, hprecov_rate, sprecov_rate, critical_def, + double_rate; + int near_attack_def_rate, long_attack_def_rate, magic_def_rate, + misc_def_rate; + int matk_rate, ignore_def_ele, ignore_def_race, ignore_def_ele_, + ignore_def_race_; + int ignore_mdef_ele, ignore_mdef_race; + int magic_addele[10], magic_addrace[12], magic_subrace[12]; + int perfect_hit, get_zeny_num; + int critical_rate, hit_rate, flee_rate, flee2_rate, def_rate, def2_rate, + mdef_rate, mdef2_rate; + int def_ratio_atk_ele, def_ratio_atk_ele_, def_ratio_atk_race, + def_ratio_atk_race_; + int add_damage_class_count, add_damage_class_count_, + add_magic_damage_class_count; + short add_damage_classid[10], add_damage_classid_[10], + add_magic_damage_classid[10]; + int add_damage_classrate[10], add_damage_classrate_[10], + add_magic_damage_classrate[10]; + short add_def_class_count, add_mdef_class_count; + short add_def_classid[10], add_mdef_classid[10]; + int add_def_classrate[10], add_mdef_classrate[10]; + short monster_drop_item_count; + short monster_drop_itemid[10]; + int monster_drop_race[10], monster_drop_itemrate[10]; + int double_add_rate, speed_add_rate, aspd_add_rate, perfect_hit_add, + get_zeny_add_num; + short splash_range, splash_add_range; + short autospell_id, autospell_lv, autospell_rate; + short hp_drain_rate, hp_drain_per, sp_drain_rate, sp_drain_per; + short hp_drain_rate_, hp_drain_per_, sp_drain_rate_, sp_drain_per_; + int short_weapon_damage_return, long_weapon_damage_return; + int weapon_coma_ele[10], weapon_coma_race[12]; + short break_weapon_rate, break_armor_rate; + short add_steal_rate; + + short spiritball, spiritball_old; + int spirit_timer[MAX_SKILL_LEVEL]; + int magic_damage_return; // AppleGirl Was Here + int random_attack_increase_add, random_attack_increase_per; // [Valaris] + int perfect_hiding; // [Valaris] + int unbreakable; + + int die_counter; + short doridori_counter; + + int reg_num; + struct script_reg *reg; + int regstr_num; + struct script_regstr *regstr; + + struct status_change sc_data[MAX_STATUSCHANGE]; + short sc_count; + struct square dev; + + int trade_partner; + int deal_item_index[10]; + int deal_item_amount[10]; + int deal_zeny; + short deal_locked; + + int party_sended, party_invite, party_invite_account; + int party_hp, party_x, party_y; + + int guild_sended, guild_invite, guild_invite_account; + int guild_emblem_id, guild_alliance, guild_alliance_account; + int guildspy; // [Syrus22] + int partyspy; // [Syrus22] + + char message[80]; + + int catch_target_class; + + int pvp_point, pvp_rank, pvp_timer, pvp_lastusers; + + char eventqueue[MAX_EVENTQUEUE][50]; + int eventtimer[MAX_EVENTTIMER]; + + int last_skillid, last_skilllv; // Added by RoVeRT + struct + { + char name[24]; + } ignore[80]; + int ignoreAll; + short sg_count; + + struct + { + unsigned in_progress:1; + } auto_ban_info; + + time_t chat_reset_due; + time_t chat_repeat_reset_due; + int chat_lines_in; + int chat_total_repeats; + char chat_lastmsg[513]; + + time_t trade_reset_due; + int trades_in; + + time_t sit_reset_due; + int sits_in; }; -struct npc_timerevent_list { - int timer,pos; +struct npc_timerevent_list +{ + int timer, pos; }; -struct npc_label_list { - char name[24]; - int pos; +struct npc_label_list +{ + char name[24]; + int pos; }; -struct npc_item_list { - int nameid,value; +struct npc_item_list +{ + int nameid, value; }; -struct npc_data { - struct block_list bl; - short n; - short class,dir; - short speed; - char name[24]; - char exname[24]; - int chat_id; - short opt1,opt2,opt3,option; - short flag; - union { - struct { - char *script; - short xs,ys; - int guild_id; - int timer,timerid,timeramount,nexttimer; - unsigned int timertick; - struct npc_timerevent_list *timer_event; - int label_list_num; - struct npc_label_list *label_list; - int src_id; - } scr; - struct npc_item_list shop_item[1]; - struct { - short xs,ys; - short x,y; - char name[16]; - } warp; - char *message; // for MESSAGE: only send this message - } u; - // ここにメンバを追加してはならない(shop_itemが可変長の為) - - char eventqueue[MAX_EVENTQUEUE][50]; - int eventtimer[MAX_EVENTTIMER]; - short arenaflag; +struct npc_data +{ + struct block_list bl; + short n; + short class, dir; + short speed; + char name[24]; + char exname[24]; + int chat_id; + short opt1, opt2, opt3, option; + short flag; + union + { + struct + { + char *script; + short xs, ys; + int guild_id; + int timer, timerid, timeramount, nexttimer; + unsigned int timertick; + struct npc_timerevent_list *timer_event; + int label_list_num; + struct npc_label_list *label_list; + int src_id; + } scr; + struct npc_item_list shop_item[1]; + struct + { + short xs, ys; + short x, y; + char name[16]; + } warp; + char *message; // for MESSAGE: only send this message + } u; + // ここにメンバを追加してはならない(shop_itemが可変長の為) + + char eventqueue[MAX_EVENTQUEUE][50]; + int eventtimer[MAX_EVENTTIMER]; + short arenaflag; }; #define MOB_MODE_SUMMONED 0x1000 #define MOB_MODE_TURNS_AGAINST_BAD_MASTER 0x2000 -#define MOB_SENSIBLE_MASK 0xf000 // fate: mob mode flags that I actually understand +#define MOB_SENSIBLE_MASK 0xf000 // fate: mob mode flags that I actually understand -enum mob_stat { +enum mob_stat +{ MOB_LV, MOB_MAX_HP, MOB_STR, MOB_AGI, MOB_VIT, MOB_INT, MOB_DEX, MOB_LUK, - MOB_ATK1, MOB_ATK2, // low and high attacks - MOB_ADELAY, // attack delay + MOB_ATK1, MOB_ATK2, // low and high attacks + MOB_ADELAY, // attack delay MOB_DEF, MOB_MDEF, MOB_SPEED, // These must come last: - MOB_XP_BONUS, /* [Fate] Encoded as base to 1024: 1024 means 100% */ + MOB_XP_BONUS, /* [Fate] Encoded as base to 1024: 1024 means 100% */ MOB_LAST }; #define MOB_XP_BONUS_BASE 1024 #define MOB_XP_BONUS_SHIFT 10 -struct mob_data { - struct block_list bl; - short n; - short base_class,class,dir,mode; - short m,x0,y0,xs,ys; - char name[24]; - int spawndelay1,spawndelay2; - struct { - unsigned state : 8; - unsigned skillstate : 8; - unsigned targettype : 1; - unsigned steal_flag : 1; - unsigned steal_coin_flag : 1; - unsigned skillcastcancel : 1; - unsigned master_check : 1; - unsigned change_walk_target : 1; - unsigned walk_easy : 1; - unsigned special_mob_ai : 3; - } state; - int timer; - short to_x,to_y; - int hp; - int target_id,attacked_id; - short target_lv; - struct walkpath_data walkpath; - unsigned int next_walktime; - unsigned int attackabletime; - unsigned int last_deadtime,last_spawntime,last_thinktime; - unsigned int canmove_tick; - short move_fail_count; - struct { - int id; - int dmg; - } dmglog[DAMAGELOG_SIZE]; - struct item *lootitem; - short lootitem_count; - - struct status_change sc_data[MAX_STATUSCHANGE]; - short sc_count; - short opt1,opt2,opt3,option; - short min_chase; - short sg_count; - int guild_id; - int deletetimer; - - int skilltimer; - int skilltarget; - short skillx,skilly; - short skillid,skilllv,skillidx; - unsigned int skilldelay[MAX_MOBSKILL]; - int def_ele; - int master_id,master_dist; - int exclusion_src,exclusion_party,exclusion_guild; - struct skill_timerskill skilltimerskill[MAX_MOBSKILLTIMERSKILL]; - struct skill_unit_group skillunit[MAX_MOBSKILLUNITGROUP]; - struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET]; - char npc_event[50]; - unsigned short stats[MOB_LAST]; // [Fate] mob-specific stats - short size; +struct mob_data +{ + struct block_list bl; + short n; + short base_class, class, dir, mode; + short m, x0, y0, xs, ys; + char name[24]; + int spawndelay1, spawndelay2; + struct + { + unsigned state:8; + unsigned skillstate:8; + unsigned targettype:1; + unsigned steal_flag:1; + unsigned steal_coin_flag:1; + unsigned skillcastcancel:1; + unsigned master_check:1; + unsigned change_walk_target:1; + unsigned walk_easy:1; + unsigned special_mob_ai:3; + } state; + int timer; + short to_x, to_y; + int hp; + int target_id, attacked_id; + short target_lv; + struct walkpath_data walkpath; + unsigned int next_walktime; + unsigned int attackabletime; + unsigned int last_deadtime, last_spawntime, last_thinktime; + unsigned int canmove_tick; + short move_fail_count; + struct + { + int id; + int dmg; + } dmglog[DAMAGELOG_SIZE]; + struct item *lootitem; + short lootitem_count; + + struct status_change sc_data[MAX_STATUSCHANGE]; + short sc_count; + short opt1, opt2, opt3, option; + short min_chase; + short sg_count; + int guild_id; + int deletetimer; + + int skilltimer; + int skilltarget; + short skillx, skilly; + short skillid, skilllv, skillidx; + unsigned int skilldelay[MAX_MOBSKILL]; + int def_ele; + int master_id, master_dist; + int exclusion_src, exclusion_party, exclusion_guild; + struct skill_timerskill skilltimerskill[MAX_MOBSKILLTIMERSKILL]; + struct skill_unit_group skillunit[MAX_MOBSKILLUNITGROUP]; + struct skill_unit_group_tickset skillunittick[MAX_SKILLUNITGROUPTICKSET]; + char npc_event[50]; + unsigned short stats[MOB_LAST]; // [Fate] mob-specific stats + short size; }; -enum { MS_IDLE,MS_WALK,MS_ATTACK,MS_DEAD,MS_DELAY }; - -enum { NONE_ATTACKABLE,ATTACKABLE }; - -enum { ATK_LUCKY=1,ATK_FLEE,ATK_DEF}; // 囲まれペナルティ計算用 - -struct map_data { - char name[24]; - char alias[24]; // [MouseJstr] - unsigned char *gat; // NULLなら下のmap_data_other_serverとして扱う - struct block_list **block; - struct block_list **block_mob; - int *block_count,*block_mob_count; - int m; - short xs,ys; - short bxs,bys; - int npc_num; - int users; - struct { - unsigned alias : 1; - unsigned nomemo : 1; - unsigned noteleport : 1; - unsigned noreturn : 1; - unsigned monster_noteleport : 1; - unsigned nosave : 1; - unsigned nobranch : 1; - unsigned nopenalty : 1; - unsigned pvp : 1; - unsigned pvp_noparty : 1; - unsigned pvp_noguild : 1; - unsigned pvp_nightmaredrop :1; - unsigned pvp_nocalcrank : 1; - unsigned gvg : 1; - unsigned gvg_noparty : 1; - unsigned nozenypenalty : 1; - unsigned notrade : 1; - unsigned noskill : 1; - unsigned nowarp : 1; - unsigned nowarpto : 1; - unsigned nopvp : 1; // [Valaris] - unsigned noicewall : 1; // [Valaris] - unsigned snow : 1; // [Valaris] - unsigned fog : 1; // [Valaris] - unsigned sakura : 1; // [Valaris] - unsigned leaves : 1; // [Valaris] - unsigned rain : 1; // [Valaris] - unsigned no_player_drops : 1; // [Jaxad0127] - } flag; - struct point save; - struct npc_data *npc[MAX_NPC_PER_MAP]; - struct { - int drop_id; - int drop_type; - int drop_per; - } drop_list[MAX_DROP_PER_MAP]; +enum +{ MS_IDLE, MS_WALK, MS_ATTACK, MS_DEAD, MS_DELAY }; + +enum +{ NONE_ATTACKABLE, ATTACKABLE }; + +enum +{ ATK_LUCKY = 1, ATK_FLEE, ATK_DEF }; // 囲まれペナルティ計算用 + +struct map_data +{ + char name[24]; + char alias[24]; // [MouseJstr] + unsigned char *gat; // NULLなら下のmap_data_other_serverとして扱う + struct block_list **block; + struct block_list **block_mob; + int *block_count, *block_mob_count; + int m; + short xs, ys; + short bxs, bys; + int npc_num; + int users; + struct + { + unsigned alias:1; + unsigned nomemo:1; + unsigned noteleport:1; + unsigned noreturn:1; + unsigned monster_noteleport:1; + unsigned nosave:1; + unsigned nobranch:1; + unsigned nopenalty:1; + unsigned pvp:1; + unsigned pvp_noparty:1; + unsigned pvp_noguild:1; + unsigned pvp_nightmaredrop:1; + unsigned pvp_nocalcrank:1; + unsigned gvg:1; + unsigned gvg_noparty:1; + unsigned nozenypenalty:1; + unsigned notrade:1; + unsigned noskill:1; + unsigned nowarp:1; + unsigned nowarpto:1; + unsigned nopvp:1; // [Valaris] + unsigned noicewall:1; // [Valaris] + unsigned snow:1; // [Valaris] + unsigned fog:1; // [Valaris] + unsigned sakura:1; // [Valaris] + unsigned leaves:1; // [Valaris] + unsigned rain:1; // [Valaris] + unsigned no_player_drops:1; // [Jaxad0127] + } flag; + struct point save; + struct npc_data *npc[MAX_NPC_PER_MAP]; + struct + { + int drop_id; + int drop_type; + int drop_per; + } drop_list[MAX_DROP_PER_MAP]; }; -struct map_data_other_server { - char name[24]; - unsigned char *gat; // NULL固定にして判断 - unsigned long ip; - unsigned int port; +struct map_data_other_server +{ + char name[24]; + unsigned char *gat; // NULL固定にして判断 + unsigned long ip; + unsigned int port; }; #define read_gat(m,x,y) (map[m].gat[(x)+(y)*map[m].xs]) #define read_gatp(m,x,y) (m->gat[(x)+(y)*m->xs]) -struct flooritem_data { - struct block_list bl; - short subx,suby; - int cleartimer; - int first_get_id,second_get_id,third_get_id; - unsigned int first_get_tick,second_get_tick,third_get_tick; - struct item item_data; +struct flooritem_data +{ + struct block_list bl; + short subx, suby; + int cleartimer; + int first_get_id, second_get_id, third_get_id; + unsigned int first_get_tick, second_get_tick, third_get_tick; + struct item item_data; }; -enum { - SP_SPEED,SP_BASEEXP,SP_JOBEXP,SP_KARMA,SP_MANNER,SP_HP,SP_MAXHP,SP_SP, // 0-7 - SP_MAXSP,SP_STATUSPOINT,SP_0a,SP_BASELEVEL,SP_SKILLPOINT,SP_STR,SP_AGI,SP_VIT, // 8-15 - SP_INT,SP_DEX,SP_LUK,SP_CLASS,SP_ZENY,SP_SEX,SP_NEXTBASEEXP,SP_NEXTJOBEXP, // 16-23 - SP_WEIGHT,SP_MAXWEIGHT,SP_1a,SP_1b,SP_1c,SP_1d,SP_1e,SP_1f, // 24-31 - SP_USTR,SP_UAGI,SP_UVIT,SP_UINT,SP_UDEX,SP_ULUK,SP_26,SP_27, // 32-39 - SP_28,SP_ATK1,SP_ATK2,SP_MATK1,SP_MATK2,SP_DEF1,SP_DEF2,SP_MDEF1, // 40-47 - SP_MDEF2,SP_HIT,SP_FLEE1,SP_FLEE2,SP_CRITICAL,SP_ASPD,SP_36,SP_JOBLEVEL, // 48-55 - SP_UPPER,SP_PARTNER,SP_CART,SP_FAME,SP_UNBREAKABLE, //56-58 - SP_DEAF=70, - SP_CARTINFO=99, // 99 - SP_GM=500, - - // original 1000- - SP_ATTACKRANGE=1000, SP_ATKELE,SP_DEFELE, // 1000-1002 - SP_CASTRATE, SP_MAXHPRATE, SP_MAXSPRATE, SP_SPRATE, // 1003-1006 - SP_ADDELE, SP_ADDRACE, SP_ADDSIZE, SP_SUBELE, SP_SUBRACE, // 1007-1011 - SP_ADDEFF, SP_RESEFF, // 1012-1013 - SP_BASE_ATK,SP_ASPD_RATE,SP_HP_RECOV_RATE,SP_SP_RECOV_RATE,SP_SPEED_RATE, // 1014-1018 - SP_CRITICAL_DEF,SP_NEAR_ATK_DEF,SP_LONG_ATK_DEF, // 1019-1021 - SP_DOUBLE_RATE, SP_DOUBLE_ADD_RATE, SP_MATK, SP_MATK_RATE, // 1022-1025 - SP_IGNORE_DEF_ELE,SP_IGNORE_DEF_RACE, // 1026-1027 - SP_ATK_RATE,SP_SPEED_ADDRATE,SP_ASPD_ADDRATE, // 1028-1030 - SP_MAGIC_ATK_DEF,SP_MISC_ATK_DEF, // 1031-1032 - SP_IGNORE_MDEF_ELE,SP_IGNORE_MDEF_RACE, // 1033-1034 - SP_MAGIC_ADDELE,SP_MAGIC_ADDRACE,SP_MAGIC_SUBRACE, // 1035-1037 - SP_PERFECT_HIT_RATE,SP_PERFECT_HIT_ADD_RATE,SP_CRITICAL_RATE,SP_GET_ZENY_NUM,SP_ADD_GET_ZENY_NUM, // 1038-1042 - SP_ADD_DAMAGE_CLASS,SP_ADD_MAGIC_DAMAGE_CLASS,SP_ADD_DEF_CLASS,SP_ADD_MDEF_CLASS, // 1043-1046 - SP_ADD_MONSTER_DROP_ITEM,SP_DEF_RATIO_ATK_ELE,SP_DEF_RATIO_ATK_RACE,SP_ADD_SPEED, // 1047-1050 - SP_HIT_RATE,SP_FLEE_RATE,SP_FLEE2_RATE,SP_DEF_RATE,SP_DEF2_RATE,SP_MDEF_RATE,SP_MDEF2_RATE, // 1051-1057 - SP_SPLASH_RANGE,SP_SPLASH_ADD_RANGE,SP_AUTOSPELL,SP_HP_DRAIN_RATE,SP_SP_DRAIN_RATE, // 1058-1062 - SP_SHORT_WEAPON_DAMAGE_RETURN,SP_LONG_WEAPON_DAMAGE_RETURN,SP_WEAPON_COMA_ELE,SP_WEAPON_COMA_RACE, // 1063-1066 - SP_ADDEFF2,SP_BREAK_WEAPON_RATE,SP_BREAK_ARMOR_RATE,SP_ADD_STEAL_RATE, // 1067-1070 - SP_MAGIC_DAMAGE_RETURN,SP_RANDOM_ATTACK_INCREASE,SP_ALL_STATS,SP_AGI_VIT,SP_AGI_DEX_STR,SP_PERFECT_HIDE, // 1071-1077 - SP_DISGUISE, // 1077 - - SP_RESTART_FULL_RECORVER=2000,SP_NO_CASTCANCEL,SP_NO_SIZEFIX,SP_NO_MAGIC_DAMAGE,SP_NO_WEAPON_DAMAGE,SP_NO_GEMSTONE, // 2000-2005 - SP_NO_CASTCANCEL2,SP_INFINITE_ENDURE,SP_UNBREAKABLE_WEAPON,SP_UNBREAKABLE_ARMOR // 2006-2009 +enum +{ + SP_SPEED, SP_BASEEXP, SP_JOBEXP, SP_KARMA, SP_MANNER, SP_HP, SP_MAXHP, SP_SP, // 0-7 + SP_MAXSP, SP_STATUSPOINT, SP_0a, SP_BASELEVEL, SP_SKILLPOINT, SP_STR, SP_AGI, SP_VIT, // 8-15 + SP_INT, SP_DEX, SP_LUK, SP_CLASS, SP_ZENY, SP_SEX, SP_NEXTBASEEXP, SP_NEXTJOBEXP, // 16-23 + SP_WEIGHT, SP_MAXWEIGHT, SP_1a, SP_1b, SP_1c, SP_1d, SP_1e, SP_1f, // 24-31 + SP_USTR, SP_UAGI, SP_UVIT, SP_UINT, SP_UDEX, SP_ULUK, SP_26, SP_27, // 32-39 + SP_28, SP_ATK1, SP_ATK2, SP_MATK1, SP_MATK2, SP_DEF1, SP_DEF2, SP_MDEF1, // 40-47 + SP_MDEF2, SP_HIT, SP_FLEE1, SP_FLEE2, SP_CRITICAL, SP_ASPD, SP_36, SP_JOBLEVEL, // 48-55 + SP_UPPER, SP_PARTNER, SP_CART, SP_FAME, SP_UNBREAKABLE, //56-58 + SP_DEAF = 70, + SP_CARTINFO = 99, // 99 + SP_GM = 500, + + // original 1000- + SP_ATTACKRANGE = 1000, SP_ATKELE, SP_DEFELE, // 1000-1002 + SP_CASTRATE, SP_MAXHPRATE, SP_MAXSPRATE, SP_SPRATE, // 1003-1006 + SP_ADDELE, SP_ADDRACE, SP_ADDSIZE, SP_SUBELE, SP_SUBRACE, // 1007-1011 + SP_ADDEFF, SP_RESEFF, // 1012-1013 + SP_BASE_ATK, SP_ASPD_RATE, SP_HP_RECOV_RATE, SP_SP_RECOV_RATE, SP_SPEED_RATE, // 1014-1018 + SP_CRITICAL_DEF, SP_NEAR_ATK_DEF, SP_LONG_ATK_DEF, // 1019-1021 + SP_DOUBLE_RATE, SP_DOUBLE_ADD_RATE, SP_MATK, SP_MATK_RATE, // 1022-1025 + SP_IGNORE_DEF_ELE, SP_IGNORE_DEF_RACE, // 1026-1027 + SP_ATK_RATE, SP_SPEED_ADDRATE, SP_ASPD_ADDRATE, // 1028-1030 + SP_MAGIC_ATK_DEF, SP_MISC_ATK_DEF, // 1031-1032 + SP_IGNORE_MDEF_ELE, SP_IGNORE_MDEF_RACE, // 1033-1034 + SP_MAGIC_ADDELE, SP_MAGIC_ADDRACE, SP_MAGIC_SUBRACE, // 1035-1037 + SP_PERFECT_HIT_RATE, SP_PERFECT_HIT_ADD_RATE, SP_CRITICAL_RATE, SP_GET_ZENY_NUM, SP_ADD_GET_ZENY_NUM, // 1038-1042 + SP_ADD_DAMAGE_CLASS, SP_ADD_MAGIC_DAMAGE_CLASS, SP_ADD_DEF_CLASS, SP_ADD_MDEF_CLASS, // 1043-1046 + SP_ADD_MONSTER_DROP_ITEM, SP_DEF_RATIO_ATK_ELE, SP_DEF_RATIO_ATK_RACE, SP_ADD_SPEED, // 1047-1050 + SP_HIT_RATE, SP_FLEE_RATE, SP_FLEE2_RATE, SP_DEF_RATE, SP_DEF2_RATE, SP_MDEF_RATE, SP_MDEF2_RATE, // 1051-1057 + SP_SPLASH_RANGE, SP_SPLASH_ADD_RANGE, SP_AUTOSPELL, SP_HP_DRAIN_RATE, SP_SP_DRAIN_RATE, // 1058-1062 + SP_SHORT_WEAPON_DAMAGE_RETURN, SP_LONG_WEAPON_DAMAGE_RETURN, SP_WEAPON_COMA_ELE, SP_WEAPON_COMA_RACE, // 1063-1066 + SP_ADDEFF2, SP_BREAK_WEAPON_RATE, SP_BREAK_ARMOR_RATE, SP_ADD_STEAL_RATE, // 1067-1070 + SP_MAGIC_DAMAGE_RETURN, SP_RANDOM_ATTACK_INCREASE, SP_ALL_STATS, SP_AGI_VIT, SP_AGI_DEX_STR, SP_PERFECT_HIDE, // 1071-1077 + SP_DISGUISE, // 1077 + + SP_RESTART_FULL_RECORVER = 2000, SP_NO_CASTCANCEL, SP_NO_SIZEFIX, SP_NO_MAGIC_DAMAGE, SP_NO_WEAPON_DAMAGE, SP_NO_GEMSTONE, // 2000-2005 + SP_NO_CASTCANCEL2, SP_INFINITE_ENDURE, SP_UNBREAKABLE_WEAPON, SP_UNBREAKABLE_ARMOR // 2006-2009 }; -enum { - LOOK_BASE, - LOOK_HAIR, - LOOK_WEAPON, - LOOK_HEAD_BOTTOM, - LOOK_HEAD_TOP, - LOOK_HEAD_MID, - LOOK_HAIR_COLOR, - LOOK_CLOTHES_COLOR, - LOOK_SHIELD, - LOOK_SHOES, /* 9 */ - LOOK_GLOVES, - LOOK_CAPE, - LOOK_MISC1, - LOOK_MISC2 +enum +{ + LOOK_BASE, + LOOK_HAIR, + LOOK_WEAPON, + LOOK_HEAD_BOTTOM, + LOOK_HEAD_TOP, + LOOK_HEAD_MID, + LOOK_HAIR_COLOR, + LOOK_CLOTHES_COLOR, + LOOK_SHIELD, + LOOK_SHOES, /* 9 */ + LOOK_GLOVES, + LOOK_CAPE, + LOOK_MISC1, + LOOK_MISC2 }; -enum { - EQUIP_SHIELD = 8, - EQUIP_WEAPON = 9 +enum +{ + EQUIP_SHIELD = 8, + EQUIP_WEAPON = 9 }; #define LOOK_LAST LOOK_MISC2 -struct chat_data { - struct block_list bl; - - unsigned char pass[8]; /* password */ - unsigned char title[61]; /* room title MAX 60 */ - unsigned char limit; /* join limit */ - unsigned char trigger; - unsigned char users; /* current users */ - unsigned char pub; /* room attribute */ - struct map_session_data *usersd[20]; - struct block_list *owner_; - struct block_list **owner; - char npc_event[50]; +struct chat_data +{ + struct block_list bl; + + unsigned char pass[8]; /* password */ + unsigned char title[61]; /* room title MAX 60 */ + unsigned char limit; /* join limit */ + unsigned char trigger; + unsigned char users; /* current users */ + unsigned char pub; /* room attribute */ + struct map_session_data *usersd[20]; + struct block_list *owner_; + struct block_list **owner; + char npc_event[50]; }; extern struct map_data map[]; @@ -662,7 +714,7 @@ extern int map_num; extern int autosave_interval; extern int save_settings; extern int agit_flag; -extern int night_flag; // 0=day, 1=night [Yor] +extern int night_flag; // 0=day, 1=night [Yor] extern char motd_txt[]; extern char help_txt[]; @@ -672,89 +724,95 @@ extern char talkie_mes[]; extern char wisp_server_name[]; // 鯖全体情報 -void map_setusers(int); -int map_getusers(void); +void map_setusers (int); +int map_getusers (void); // block削除関連 -int map_freeblock( void *bl ); -int map_freeblock_lock(void); -int map_freeblock_unlock(void); +int map_freeblock (void *bl); +int map_freeblock_lock (void); +int map_freeblock_unlock (void); // block関連 -int map_addblock(struct block_list *); -int map_delblock(struct block_list *); -void map_foreachinarea(int (*)(struct block_list*,va_list),int,int,int,int,int,int,...); +int map_addblock (struct block_list *); +int map_delblock (struct block_list *); +void map_foreachinarea (int (*)(struct block_list *, va_list), int, int, int, + int, int, int, ...); // -- moonsoul (added map_foreachincell) -void map_foreachincell(int (*)(struct block_list*,va_list),int,int,int,int,...); -void map_foreachinmovearea(int (*)(struct block_list*,va_list),int,int,int,int,int,int,int,int,...); -int map_countnearpc(int,int,int); +void map_foreachincell (int (*)(struct block_list *, va_list), int, int, int, + int, ...); +void map_foreachinmovearea (int (*)(struct block_list *, va_list), int, int, + int, int, int, int, int, int, ...); +int map_countnearpc (int, int, int); //block関連に追加 -int map_count_oncell(int m,int x,int y); +int map_count_oncell (int m, int x, int y); // 一時的object関連 -int map_addobject(struct block_list *); -int map_delobject(int, int type); -int map_delobjectnofree(int id, int type); -void map_foreachobject(int (*)(struct block_list*,va_list),int,...); +int map_addobject (struct block_list *); +int map_delobject (int, int type); +int map_delobjectnofree (int id, int type); +void map_foreachobject (int (*)(struct block_list *, va_list), int, ...); // -int map_quit(struct map_session_data *); +int map_quit (struct map_session_data *); // npc -int map_addnpc(int,struct npc_data *); +int map_addnpc (int, struct npc_data *); extern FILE *map_logfile; -void map_write_log(char *format, ...); +void map_write_log (char *format, ...); #define MAP_LOG(format, args...) {if (map_logfile) map_write_log(format, ##args);} #define MAP_LOG_PC(sd, fmt, args...) MAP_LOG("PC%d %d:%d,%d " fmt, sd->status.char_id, sd->bl.m, sd->bl.x, sd->bl.y, ## args) - // 床アイテム関連 -int map_clearflooritem_timer(int,unsigned int,int,int); +int map_clearflooritem_timer (int, unsigned int, int, int); #define map_clearflooritem(id) map_clearflooritem_timer(0,0,id,1) -int map_addflooritem_any(struct item *,int amount,int m,int x,int y, - struct map_session_data **owners, - int *owner_protection, - int lifetime, int dispersal); -int map_addflooritem(struct item *,int,int,int,int,struct map_session_data *,struct map_session_data *,struct map_session_data *,int); -int map_searchrandfreecell(int,int,int,int); +int map_addflooritem_any (struct item *, int amount, int m, int x, int y, + struct map_session_data **owners, + int *owner_protection, + int lifetime, int dispersal); +int map_addflooritem (struct item *, int, int, int, int, + struct map_session_data *, struct map_session_data *, + struct map_session_data *, int); +int map_searchrandfreecell (int, int, int, int); // キャラid=>キャラ名 変換関連 -void map_addchariddb(int charid,char *name); -void map_delchariddb(int charid); -int map_reqchariddb(struct map_session_data * sd,int charid); -char * map_charid2nick(int); - -struct map_session_data * map_id2sd(int); -struct block_list * map_id2bl(int); -int map_mapname2mapid(char*); -int map_mapname2ipport(char*,int*,int*); -int map_setipport(char *name,unsigned long ip,int port); -int map_eraseipport(char *name,unsigned long ip,int port); -void map_addiddb(struct block_list *); -void map_deliddb(struct block_list *bl); -int map_foreachiddb(int (*)(void*,void*,va_list),...); -void map_addnickdb(struct map_session_data *); -int map_scriptcont(struct map_session_data *sd,int id); /* Continues a script either on a spell or on an NPC */ -struct map_session_data * map_nick2sd(char*); -int compare_item(struct item *a, struct item *b); - -struct map_session_data * map_get_first_session(); -struct map_session_data * map_get_last_session(); -struct map_session_data * map_get_next_session(struct map_session_data *current); -struct map_session_data * map_get_prev_session(struct map_session_data *current); +void map_addchariddb (int charid, char *name); +void map_delchariddb (int charid); +int map_reqchariddb (struct map_session_data *sd, int charid); +char *map_charid2nick (int); + +struct map_session_data *map_id2sd (int); +struct block_list *map_id2bl (int); +int map_mapname2mapid (char *); +int map_mapname2ipport (char *, int *, int *); +int map_setipport (char *name, unsigned long ip, int port); +int map_eraseipport (char *name, unsigned long ip, int port); +void map_addiddb (struct block_list *); +void map_deliddb (struct block_list *bl); +int map_foreachiddb (int (*)(void *, void *, va_list), ...); +void map_addnickdb (struct map_session_data *); +int map_scriptcont (struct map_session_data *sd, int id); /* Continues a script either on a spell or on an NPC */ +struct map_session_data *map_nick2sd (char *); +int compare_item (struct item *a, struct item *b); + +struct map_session_data *map_get_first_session (); +struct map_session_data *map_get_last_session (); +struct map_session_data *map_get_next_session (struct map_session_data + *current); +struct map_session_data *map_get_prev_session (struct map_session_data + *current); // gat関連 -int map_getcell(int,int,int); -int map_setcell(int,int,int,int); +int map_getcell (int, int, int); +int map_setcell (int, int, int, int); // その他 -int map_check_dir(int s_dir,int t_dir); -int map_calc_dir( struct block_list *src,int x,int y); +int map_check_dir (int s_dir, int t_dir); +int map_calc_dir (struct block_list *src, int x, int y); // path.cより -int path_search(struct walkpath_data*,int,int,int,int,int,int); -int path_blownpos(int m,int x0,int y0,int dx,int dy,int count); +int path_search (struct walkpath_data *, int, int, int, int, int, int); +int path_blownpos (int m, int x0, int y0, int dx, int dy, int count); -int map_who(int fd); +int map_who (int fd); -void map_helpscreen(); // [Valaris] -int map_delmap(char *mapname); +void map_helpscreen (); // [Valaris] +int map_delmap (char *mapname); #endif diff --git a/src/map/mob.c b/src/map/mob.c index f3822c4..f36d60e 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -27,13 +27,13 @@ #endif #ifndef max - #define max( a, b ) ( ((a) > (b)) ? (a) : (b) ) +#define max( a, b ) ( ((a) > (b)) ? (a) : (b) ) #endif #define MIN_MOBTHINKTIME 100 -#define MOB_LAZYMOVEPERC 50 // Move probability in the negligent mode MOB (rate of 1000 minute) -#define MOB_LAZYWARPPERC 20 // Warp probability in the negligent mode MOB (rate of 1000 minute) +#define MOB_LAZYMOVEPERC 50 // Move probability in the negligent mode MOB (rate of 1000 minute) +#define MOB_LAZYWARPPERC 20 // Warp probability in the negligent mode MOB (rate of 1000 minute) struct mob_db mob_db[2001]; @@ -41,122 +41,121 @@ struct mob_db mob_db[2001]; * Local prototype declaration (only required thing) *------------------------------------------ */ -static int distance(int,int,int,int); -static int mob_makedummymobdb(int); -static int mob_timer(int,unsigned int,int,int); -int mobskill_use(struct mob_data *md,unsigned int tick,int event); -int mobskill_deltimer(struct mob_data *md ); -int mob_skillid2skillidx(int class,int skillid); -int mobskill_use_id(struct mob_data *md,struct block_list *target,int skill_idx); -static int mob_unlocktarget(struct mob_data *md,int tick); +static int distance (int, int, int, int); +static int mob_makedummymobdb (int); +static int mob_timer (int, unsigned int, int, int); +int mobskill_use (struct mob_data *md, unsigned int tick, int event); +int mobskill_deltimer (struct mob_data *md); +int mob_skillid2skillidx (int class, int skillid); +int mobskill_use_id (struct mob_data *md, struct block_list *target, + int skill_idx); +static int mob_unlocktarget (struct mob_data *md, int tick); /*========================================== * Mob is searched with a name. *------------------------------------------ */ -int mobdb_searchname(const char *str) +int mobdb_searchname (const char *str) { - int i; - - for(i = 0; i < sizeof(mob_db) / sizeof(mob_db[0]); i++) { - if (strcmpi(mob_db[i].name, str) == 0 || strcmp(mob_db[i].jname, str) == 0 || - memcmp(mob_db[i].name, str, 24) == 0 || memcmp(mob_db[i].jname, str, 24) == 0) - return i; - } - - return 0; + int i; + + for (i = 0; i < sizeof (mob_db) / sizeof (mob_db[0]); i++) + { + if (strcmpi (mob_db[i].name, str) == 0 + || strcmp (mob_db[i].jname, str) == 0 + || memcmp (mob_db[i].name, str, 24) == 0 + || memcmp (mob_db[i].jname, str, 24) == 0) + return i; + } + + return 0; } /*========================================== * Id Mob is checked. *------------------------------------------ */ -int mobdb_checkid(const int id) +int mobdb_checkid (const int id) { - if (id <= 0 || id >= (sizeof(mob_db) / sizeof(mob_db[0])) || mob_db[id].name[0] == '\0') - return 0; + if (id <= 0 || id >= (sizeof (mob_db) / sizeof (mob_db[0])) + || mob_db[id].name[0] == '\0') + return 0; - return id; + return id; } -static void -mob_init(struct mob_data *md); +static void mob_init (struct mob_data *md); /*========================================== * The minimum data set for MOB spawning *------------------------------------------ */ -int mob_spawn_dataset(struct mob_data *md,const char *mobname,int class) +int mob_spawn_dataset (struct mob_data *md, const char *mobname, int class) { - nullpo_retr(0, md); + nullpo_retr (0, md); - if(strcmp(mobname,"--en--")==0) - memcpy(md->name,mob_db[class].name,24); - else if(strcmp(mobname,"--ja--")==0) - memcpy(md->name,mob_db[class].jname,24); - else - memcpy(md->name,mobname,24); + if (strcmp (mobname, "--en--") == 0) + memcpy (md->name, mob_db[class].name, 24); + else if (strcmp (mobname, "--ja--") == 0) + memcpy (md->name, mob_db[class].jname, 24); + else + memcpy (md->name, mobname, 24); - md->bl.prev=NULL; - md->bl.next=NULL; - md->n = 0; - md->base_class = md->class = class; - md->bl.id= npc_get_new_npc_id(); + md->bl.prev = NULL; + md->bl.next = NULL; + md->n = 0; + md->base_class = md->class = class; + md->bl.id = npc_get_new_npc_id (); - memset(&md->state,0,sizeof(md->state)); - md->timer = -1; - md->target_id=0; - md->attacked_id=0; + memset (&md->state, 0, sizeof (md->state)); + md->timer = -1; + md->target_id = 0; + md->attacked_id = 0; - mob_init(md); + mob_init (md); - return 0; + return 0; } // Mutation values indicate how `valuable' a change to each stat is, XP wise. // For one 256th of change, we give out that many 1024th fractions of XP change // (i.e., 1024 means a 100% XP increase for a single point of adjustment, 4 means 100% XP bonus for doubling the value) -static int -mutation_value[MOB_XP_BONUS] = -{ - 2, // MOB_LV - 3, // MOB_MAX_HP - 1, // MOB_STR - 2, // MOB_AGI - 1, // MOB_VIT - 0, // MOB_INT - 2, // MOB_DEX - 2, // MOB_LUK - 1, // MOB_ATK1 - 1, // MOB_ATK2 - 2, // MOB_ADELAY - 2, // MOB_DEF - 2, // MOB_MDEF - 2, // MOB_SPEED +static int mutation_value[MOB_XP_BONUS] = { + 2, // MOB_LV + 3, // MOB_MAX_HP + 1, // MOB_STR + 2, // MOB_AGI + 1, // MOB_VIT + 0, // MOB_INT + 2, // MOB_DEX + 2, // MOB_LUK + 1, // MOB_ATK1 + 1, // MOB_ATK2 + 2, // MOB_ADELAY + 2, // MOB_DEF + 2, // MOB_MDEF + 2, // MOB_SPEED }; // The mutation scale indicates how far `up' we can go, with 256 indicating 100% Note that this may stack with multiple // calls to `mutate'. -static int -mutation_scale[MOB_XP_BONUS] = -{ - 16, // MOB_LV - 256, // MOB_MAX_HP - 32, // MOB_STR - 48, // MOB_AGI - 48, // MOB_VIT - 48, // MOB_INT - 48, // MOB_DEX - 64, // MOB_LUK - 48, // MOB_ATK1 - 48, // MOB_ATK2 - 80, // MOB_ADELAY - 48, // MOB_DEF - 48, // MOB_MDEF - 80, // MOB_SPEED +static int mutation_scale[MOB_XP_BONUS] = { + 16, // MOB_LV + 256, // MOB_MAX_HP + 32, // MOB_STR + 48, // MOB_AGI + 48, // MOB_VIT + 48, // MOB_INT + 48, // MOB_DEX + 64, // MOB_LUK + 48, // MOB_ATK1 + 48, // MOB_ATK2 + 80, // MOB_ADELAY + 48, // MOB_DEF + 48, // MOB_MDEF + 80, // MOB_SPEED }; - // The table below indicates the `average' value for each of the statistics, or -1 if there is none. // This average is used to determine XP modifications for mutations. The experience point bonus is // based on mutation_value and mutation_base as follows: @@ -164,744 +163,871 @@ mutation_scale[MOB_XP_BONUS] = // (2) second, determine the absolute stat change // (3) third, compute the percentage stat change relative to mutation_base (p1) // (4) fourth, compute the XP mofication based on the smaller of (p0, p1). -static int -mutation_base[MOB_XP_BONUS] = -{ - 30, // MOB_LV - -1, // MOB_MAX_HP - 20, // MOB_STR - 20, // MOB_AGI - 20, // MOB_VIT - 20, // MOB_INT - 20, // MOB_DEX - 20, // MOB_LUK - -1, // MOB_ATK1 - -1, // MOB_ATK2 - -1, // MOB_ADELAY - -1, // MOB_DEF - 20, // MOB_MDEF - -1, // MOB_SPEED +static int mutation_base[MOB_XP_BONUS] = { + 30, // MOB_LV + -1, // MOB_MAX_HP + 20, // MOB_STR + 20, // MOB_AGI + 20, // MOB_VIT + 20, // MOB_INT + 20, // MOB_DEX + 20, // MOB_LUK + -1, // MOB_ATK1 + -1, // MOB_ATK2 + -1, // MOB_ADELAY + -1, // MOB_DEF + 20, // MOB_MDEF + -1, // MOB_SPEED }; - /*======================================== * Mutates a MOB. For large `direction' values, calling this multiple times will give bigger XP boni. *---------------------------------------- */ -static void -mob_mutate(struct mob_data *md, int stat, int intensity) // intensity: positive: strengthen, negative: weaken. 256 = 100%. +static void mob_mutate (struct mob_data *md, int stat, int intensity) // intensity: positive: strengthen, negative: weaken. 256 = 100%. { - int old_stat; - int new_stat; - int real_intensity; // relative intensity - const int mut_base = mutation_base[stat]; - int sign = 1; - - if (!md || stat < 0 || stat >= MOB_XP_BONUS || intensity == 0) - return; - - while (intensity > mutation_scale[stat]) { - mob_mutate(md, stat, mutation_scale[stat]); // give better XP assignments - intensity -= mutation_scale[stat]; - } - while (intensity < -mutation_scale[stat]) { - mob_mutate(md, stat, mutation_scale[stat]); // give better XP assignments - intensity += mutation_scale[stat]; - } - - if (!intensity) - return; - - // MOB_ADELAY and MOB_SPEED are special because going DOWN is good here. - if (stat == MOB_ADELAY || stat == MOB_SPEED) - sign = -1; - - // Now compute the new stat - old_stat = md->stats[stat]; - new_stat = old_stat + ((old_stat * sign * intensity) / 256); - - if (new_stat < 0) - new_stat = 0; - - if (old_stat == 0) - real_intensity = 0; - else - real_intensity = (((new_stat - old_stat) << 8) / old_stat); - - if (mut_base != -1) { - // Now compute the mutation intensity relative to an absolute value. - // Take the lesser of the two effects. - int real_intensity2 = (((new_stat - old_stat) << 8) / mut_base); - - if (real_intensity < 0) - if (real_intensity2 > real_intensity) - real_intensity = real_intensity2; - - if (real_intensity > 0) - if (real_intensity2 < real_intensity) - real_intensity = real_intensity2; - } - - real_intensity *= sign; - - md->stats[stat] = new_stat; - - // Adjust XP value - md->stats[MOB_XP_BONUS] += mutation_value[stat] * real_intensity; - if (md->stats[MOB_XP_BONUS] <= 0) - md->stats[MOB_XP_BONUS] = 1; - - // Sanitise - if (md->stats[MOB_ATK1] > md->stats[MOB_ATK2]) { - int swap = md->stats[MOB_ATK2]; - md->stats[MOB_ATK2] = md->stats[MOB_ATK1]; - md->stats[MOB_ATK1] = swap; - } + int old_stat; + int new_stat; + int real_intensity; // relative intensity + const int mut_base = mutation_base[stat]; + int sign = 1; + + if (!md || stat < 0 || stat >= MOB_XP_BONUS || intensity == 0) + return; + + while (intensity > mutation_scale[stat]) + { + mob_mutate (md, stat, mutation_scale[stat]); // give better XP assignments + intensity -= mutation_scale[stat]; + } + while (intensity < -mutation_scale[stat]) + { + mob_mutate (md, stat, mutation_scale[stat]); // give better XP assignments + intensity += mutation_scale[stat]; + } + + if (!intensity) + return; + + // MOB_ADELAY and MOB_SPEED are special because going DOWN is good here. + if (stat == MOB_ADELAY || stat == MOB_SPEED) + sign = -1; + + // Now compute the new stat + old_stat = md->stats[stat]; + new_stat = old_stat + ((old_stat * sign * intensity) / 256); + + if (new_stat < 0) + new_stat = 0; + + if (old_stat == 0) + real_intensity = 0; + else + real_intensity = (((new_stat - old_stat) << 8) / old_stat); + + if (mut_base != -1) + { + // Now compute the mutation intensity relative to an absolute value. + // Take the lesser of the two effects. + int real_intensity2 = (((new_stat - old_stat) << 8) / mut_base); + + if (real_intensity < 0) + if (real_intensity2 > real_intensity) + real_intensity = real_intensity2; + + if (real_intensity > 0) + if (real_intensity2 < real_intensity) + real_intensity = real_intensity2; + } + + real_intensity *= sign; + + md->stats[stat] = new_stat; + + // Adjust XP value + md->stats[MOB_XP_BONUS] += mutation_value[stat] * real_intensity; + if (md->stats[MOB_XP_BONUS] <= 0) + md->stats[MOB_XP_BONUS] = 1; + + // Sanitise + if (md->stats[MOB_ATK1] > md->stats[MOB_ATK2]) + { + int swap = md->stats[MOB_ATK2]; + md->stats[MOB_ATK2] = md->stats[MOB_ATK1]; + md->stats[MOB_ATK1] = swap; + } } // This calculates the exp of a given mob -int -mob_gen_exp(struct mob_db *mob) +int mob_gen_exp (struct mob_db *mob) { - if (mob->max_hp <= 1) return 1; - double mod_def = 100 - mob->def; - if (mod_def == 0) mod_def = 1; - double effective_hp = ((50 - mob->luk) * mob->max_hp / 50.0) + (2 * mob->luk * mob->max_hp / mod_def); - double attack_factor = (mob->atk1 + mob->atk2 + mob->str / 3.0 + mob->dex / 2.0 + mob->luk) * (1872.0 / mob->adelay) / 4; - double dodge_factor = pow(mob->lv + mob->agi + mob->luk / 2.0, 4.0 / 3.0); - double persuit_factor = (3 + mob->range) * (mob->mode % 2) * 1000 / mob->speed; - double aggression_factor = (mob->mode & 4) == 4 ? 10.0 / 9.0 : 1.0; - int xp = (int) floor(effective_hp * pow(sqrt(attack_factor) + sqrt(dodge_factor) + sqrt(persuit_factor) + 55, 3) * aggression_factor / 2000000.0 * (double) battle_config.base_exp_rate / 100.); - if (xp < 1) xp = 1; - printf("Exp for mob '%s' generated: %d\n", mob->name, xp); - return xp; + if (mob->max_hp <= 1) + return 1; + double mod_def = 100 - mob->def; + if (mod_def == 0) + mod_def = 1; + double effective_hp = + ((50 - mob->luk) * mob->max_hp / 50.0) + + (2 * mob->luk * mob->max_hp / mod_def); + double attack_factor = + (mob->atk1 + mob->atk2 + mob->str / 3.0 + mob->dex / 2.0 + + mob->luk) * (1872.0 / mob->adelay) / 4; + double dodge_factor = + pow (mob->lv + mob->agi + mob->luk / 2.0, 4.0 / 3.0); + double persuit_factor = + (3 + mob->range) * (mob->mode % 2) * 1000 / mob->speed; + double aggression_factor = (mob->mode & 4) == 4 ? 10.0 / 9.0 : 1.0; + int xp = + (int) floor (effective_hp * + pow (sqrt (attack_factor) + sqrt (dodge_factor) + + sqrt (persuit_factor) + 55, + 3) * aggression_factor / 2000000.0 * + (double) battle_config.base_exp_rate / 100.); + if (xp < 1) + xp = 1; + printf ("Exp for mob '%s' generated: %d\n", mob->name, xp); + return xp; } -static void -mob_init(struct mob_data *md) +static void mob_init (struct mob_data *md) { - int i; - const int class = md->class; - const int mutations_nr = mob_db[class].mutations_nr; - const int mutation_power = mob_db[class].mutation_power; - - md->stats[MOB_LV] = mob_db[class].lv; - md->stats[MOB_MAX_HP] = mob_db[class].max_hp; - md->stats[MOB_STR] = mob_db[class].str; - md->stats[MOB_AGI] = mob_db[class].agi; - md->stats[MOB_VIT] = mob_db[class].vit; - md->stats[MOB_INT] = mob_db[class].int_; - md->stats[MOB_DEX] = mob_db[class].dex; - md->stats[MOB_LUK] = mob_db[class].luk; - md->stats[MOB_ATK1] = mob_db[class].atk1; - md->stats[MOB_ATK2] = mob_db[class].atk2; - md->stats[MOB_ADELAY] = mob_db[class].adelay; - md->stats[MOB_DEF] = mob_db[class].def; - md->stats[MOB_MDEF] = mob_db[class].mdef; - md->stats[MOB_SPEED] = mob_db[class].speed; - md->stats[MOB_XP_BONUS] = MOB_XP_BONUS_BASE; - - for (i = 0; i < mutations_nr; i++) { - int stat_nr = MRAND(MOB_XP_BONUS + 1); - int strength; - - if (stat_nr >= MOB_XP_BONUS) - stat_nr = MOB_MAX_HP; - - strength = ((MRAND((mutation_power >> 1)) + (MRAND((mutation_power >> 1))) + 2) * mutation_scale[stat_nr]) / 100; - - strength = MRAND(2)? strength : -strength; - - if (strength < -240) - strength = -240; /* Don't go too close to zero */ - - mob_mutate(md, stat_nr, strength); - } + int i; + const int class = md->class; + const int mutations_nr = mob_db[class].mutations_nr; + const int mutation_power = mob_db[class].mutation_power; + + md->stats[MOB_LV] = mob_db[class].lv; + md->stats[MOB_MAX_HP] = mob_db[class].max_hp; + md->stats[MOB_STR] = mob_db[class].str; + md->stats[MOB_AGI] = mob_db[class].agi; + md->stats[MOB_VIT] = mob_db[class].vit; + md->stats[MOB_INT] = mob_db[class].int_; + md->stats[MOB_DEX] = mob_db[class].dex; + md->stats[MOB_LUK] = mob_db[class].luk; + md->stats[MOB_ATK1] = mob_db[class].atk1; + md->stats[MOB_ATK2] = mob_db[class].atk2; + md->stats[MOB_ADELAY] = mob_db[class].adelay; + md->stats[MOB_DEF] = mob_db[class].def; + md->stats[MOB_MDEF] = mob_db[class].mdef; + md->stats[MOB_SPEED] = mob_db[class].speed; + md->stats[MOB_XP_BONUS] = MOB_XP_BONUS_BASE; + + for (i = 0; i < mutations_nr; i++) + { + int stat_nr = MRAND (MOB_XP_BONUS + 1); + int strength; + + if (stat_nr >= MOB_XP_BONUS) + stat_nr = MOB_MAX_HP; + + strength = + ((MRAND ((mutation_power >> 1)) + + (MRAND ((mutation_power >> 1))) + + 2) * mutation_scale[stat_nr]) / 100; + + strength = MRAND (2) ? strength : -strength; + + if (strength < -240) + strength = -240; /* Don't go too close to zero */ + + mob_mutate (md, stat_nr, strength); + } } - /*========================================== * The MOB appearance for one time (for scripts) *------------------------------------------ */ -int mob_once_spawn(struct map_session_data *sd,char *mapname, - int x,int y,const char *mobname,int class,int amount,const char *event) +int mob_once_spawn (struct map_session_data *sd, char *mapname, + int x, int y, const char *mobname, int class, int amount, + const char *event) { - struct mob_data *md=NULL; - int m,count,lv=255,r=class; - - if( sd ) - lv=sd->status.base_level; - - if( sd && strcmp(mapname,"this")==0) - m=sd->bl.m; - else - m=map_mapname2mapid(mapname); - - if(m<0 || amount<=0 || (class>=0 && class<=1000) || class>2000) // 値が異常なら召喚を止める - return 0; - - if(class<0){ // ランダムに召喚 - int i=0; - int j=-class-1; - int k; - if(j>=0 && j<MAX_RANDOMMONSTER){ - do{ - class=MPRAND(1001, 1000); - k=MRAND(1000000); - }while((mob_db[class].max_hp <= 0 || mob_db[class].summonper[j] <= k || - (lv<mob_db[class].lv && battle_config.random_monster_checklv==1)) && (i++) < 2000); - if(i>=2000){ - class=mob_db[0].summonper[j]; - } - }else{ - return 0; - } -// if(battle_config.etc_log==1) -// printf("mobclass=%d try=%d\n",class,i); - } - if(sd){ - if(x<=0) x=sd->bl.x; - if(y<=0) y=sd->bl.y; - }else if(x<=0 || y<=0){ - printf("mob_once_spawn: ??\n"); - } - - for(count=0;count<amount;count++){ - md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data)); - memset(md, '\0', sizeof *md); - if(mob_db[class].mode&0x02) - md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item)); - else - md->lootitem=NULL; - - mob_spawn_dataset(md,mobname,class); - md->bl.m=m; - md->bl.x=x; - md->bl.y=y; - if(r<0&&battle_config.dead_branch_active==1) md->mode=0x1+0x4+0x80; //移動してアクティブで反撃する - md->m =m; - md->x0=x; - md->y0=y; - md->xs=0; - md->ys=0; - md->spawndelay1=-1; // Only once is a flag. - md->spawndelay2=-1; // Only once is a flag. - - memcpy(md->npc_event,event,sizeof(md->npc_event)); - - md->bl.type=BL_MOB; - map_addiddb(&md->bl); - mob_spawn(md->bl.id); - - if(class==1288) { // emperium hp based on defense level [Valaris] - struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name); - if(gc) { - mob_db[class].max_hp+=2000*gc->defense; - md->hp=mob_db[class].max_hp; - } - } // end addition [Valaris] - - - } - return (amount>0)?md->bl.id:0; + struct mob_data *md = NULL; + int m, count, lv = 255, r = class; + + if (sd) + lv = sd->status.base_level; + + if (sd && strcmp (mapname, "this") == 0) + m = sd->bl.m; + else + m = map_mapname2mapid (mapname); + + if (m < 0 || amount <= 0 || (class >= 0 && class <= 1000) || class > 2000) // 値が異常なら召喚を止める + return 0; + + if (class < 0) + { // ランダムに召喚 + int i = 0; + int j = -class - 1; + int k; + if (j >= 0 && j < MAX_RANDOMMONSTER) + { + do + { + class = MPRAND (1001, 1000); + k = MRAND (1000000); + } + while ((mob_db[class].max_hp <= 0 + || mob_db[class].summonper[j] <= k + || (lv < mob_db[class].lv + && battle_config.random_monster_checklv == 1)) + && (i++) < 2000); + if (i >= 2000) + { + class = mob_db[0].summonper[j]; + } + } + else + { + return 0; + } +// if(battle_config.etc_log==1) +// printf("mobclass=%d try=%d\n",class,i); + } + if (sd) + { + if (x <= 0) + x = sd->bl.x; + if (y <= 0) + y = sd->bl.y; + } + else if (x <= 0 || y <= 0) + { + printf ("mob_once_spawn: ??\n"); + } + + for (count = 0; count < amount; count++) + { + md = (struct mob_data *) aCalloc (1, sizeof (struct mob_data)); + memset (md, '\0', sizeof *md); + if (mob_db[class].mode & 0x02) + md->lootitem = + (struct item *) aCalloc (LOOTITEM_SIZE, sizeof (struct item)); + else + md->lootitem = NULL; + + mob_spawn_dataset (md, mobname, class); + md->bl.m = m; + md->bl.x = x; + md->bl.y = y; + if (r < 0 && battle_config.dead_branch_active == 1) + md->mode = 0x1 + 0x4 + 0x80; //移動してアクティブで反撃する + md->m = m; + md->x0 = x; + md->y0 = y; + md->xs = 0; + md->ys = 0; + md->spawndelay1 = -1; // Only once is a flag. + md->spawndelay2 = -1; // Only once is a flag. + + memcpy (md->npc_event, event, sizeof (md->npc_event)); + + md->bl.type = BL_MOB; + map_addiddb (&md->bl); + mob_spawn (md->bl.id); + + if (class == 1288) + { // emperium hp based on defense level [Valaris] + struct guild_castle *gc = guild_mapname2gc (map[md->bl.m].name); + if (gc) + { + mob_db[class].max_hp += 2000 * gc->defense; + md->hp = mob_db[class].max_hp; + } + } // end addition [Valaris] + + } + return (amount > 0) ? md->bl.id : 0; } + /*========================================== * The MOB appearance for one time (& area specification for scripts) *------------------------------------------ */ -int mob_once_spawn_area(struct map_session_data *sd,char *mapname, - int x0,int y0,int x1,int y1, - const char *mobname,int class,int amount,const char *event) +int mob_once_spawn_area (struct map_session_data *sd, char *mapname, + int x0, int y0, int x1, int y1, + const char *mobname, int class, int amount, + const char *event) { - int x,y,i,c,max,lx=-1,ly=-1,id=0; - int m; - - if(strcmp(mapname,"this")==0) - m=sd->bl.m; - else - m=map_mapname2mapid(mapname); - - max=(y1-y0+1)*(x1-x0+1)*3; - if(max>1000)max=1000; - - if(m<0 || amount<=0 || (class>=0 && class<=1000) || class>2000) // A summon is stopped if a value is unusual - return 0; - - for(i=0;i<amount;i++){ - int j=0; - do{ - x=MPRAND(x0, (x1-x0+1)); - y=MPRAND(y0, (y1-y0+1)); - }while( ( (c=map_getcell(m,x,y))==1 || c==5)&& (++j)<max ); - if(j>=max){ - if(lx>=0){ // Since reference went wrong, the place which boiled before is used. - x=lx; - y=ly; - }else - return 0; // Since reference of the place which boils first went wrong, it stops. - } - id=mob_once_spawn(sd,mapname,x,y,mobname,class,1,event); - lx=x; - ly=y; - } - return id; + int x, y, i, c, max, lx = -1, ly = -1, id = 0; + int m; + + if (strcmp (mapname, "this") == 0) + m = sd->bl.m; + else + m = map_mapname2mapid (mapname); + + max = (y1 - y0 + 1) * (x1 - x0 + 1) * 3; + if (max > 1000) + max = 1000; + + if (m < 0 || amount <= 0 || (class >= 0 && class <= 1000) || class > 2000) // A summon is stopped if a value is unusual + return 0; + + for (i = 0; i < amount; i++) + { + int j = 0; + do + { + x = MPRAND (x0, (x1 - x0 + 1)); + y = MPRAND (y0, (y1 - y0 + 1)); + } + while (((c = map_getcell (m, x, y)) == 1 || c == 5) && (++j) < max); + if (j >= max) + { + if (lx >= 0) + { // Since reference went wrong, the place which boiled before is used. + x = lx; + y = ly; + } + else + return 0; // Since reference of the place which boils first went wrong, it stops. + } + id = mob_once_spawn (sd, mapname, x, y, mobname, class, 1, event); + lx = x; + ly = y; + } + return id; } /*========================================== * Summoning Guardians [Valaris] *------------------------------------------ */ -int mob_spawn_guardian(struct map_session_data *sd,char *mapname, - int x,int y,const char *mobname,int class,int amount,const char *event,int guardian) +int mob_spawn_guardian (struct map_session_data *sd, char *mapname, + int x, int y, const char *mobname, int class, + int amount, const char *event, int guardian) { - struct mob_data *md=NULL; - int m,count=1,lv=255; - - if( sd ) - lv=sd->status.base_level; - - if( sd && strcmp(mapname,"this")==0) - m=sd->bl.m; - else - m=map_mapname2mapid(mapname); - - if(m<0 || amount<=0 || (class>=0 && class<=1000) || class>2000) // 値が異常なら召喚を止める - return 0; - - if(class<0) - return 0; - - if(sd){ - if(x<=0) x=sd->bl.x; - if(y<=0) y=sd->bl.y; - } - - else if(x<=0 || y<=0) - printf("mob_spawn_guardian: ??\n"); - - - for(count=0;count<amount;count++){ - struct guild_castle *gc; - md=calloc(sizeof(struct mob_data), 1); - if(md==NULL){ - printf("mob_spawn_guardian: out of memory !\n"); - exit(1); - } - memset(md, '\0', sizeof *md); - - - - mob_spawn_dataset(md,mobname,class); - md->bl.m=m; - md->bl.x=x; - md->bl.y=y; - md->m =m; - md->x0=x; - md->y0=y; - md->xs=0; - md->ys=0; - md->spawndelay1=-1; // Only once is a flag. - md->spawndelay2=-1; // Only once is a flag. - - memcpy(md->npc_event,event,sizeof(md->npc_event)); - - md->bl.type=BL_MOB; - map_addiddb(&md->bl); - mob_spawn(md->bl.id); - - gc=guild_mapname2gc(map[md->bl.m].name); - if(gc) { - mob_db[class].max_hp+=2000*gc->defense; - if(guardian==0) { md->hp=gc->Ghp0; gc->GID0=md->bl.id; } - if(guardian==1) { md->hp=gc->Ghp1; gc->GID1=md->bl.id; } - if(guardian==2) { md->hp=gc->Ghp2; gc->GID2=md->bl.id; } - if(guardian==3) { md->hp=gc->Ghp3; gc->GID3=md->bl.id; } - if(guardian==4) { md->hp=gc->Ghp4; gc->GID4=md->bl.id; } - if(guardian==5) { md->hp=gc->Ghp5; gc->GID5=md->bl.id; } - if(guardian==6) { md->hp=gc->Ghp6; gc->GID6=md->bl.id; } - if(guardian==7) { md->hp=gc->Ghp7; gc->GID7=md->bl.id; } - - } - } + struct mob_data *md = NULL; + int m, count = 1, lv = 255; + + if (sd) + lv = sd->status.base_level; + + if (sd && strcmp (mapname, "this") == 0) + m = sd->bl.m; + else + m = map_mapname2mapid (mapname); + + if (m < 0 || amount <= 0 || (class >= 0 && class <= 1000) || class > 2000) // 値が異常なら召喚を止める + return 0; + + if (class < 0) + return 0; + + if (sd) + { + if (x <= 0) + x = sd->bl.x; + if (y <= 0) + y = sd->bl.y; + } + + else if (x <= 0 || y <= 0) + printf ("mob_spawn_guardian: ??\n"); + + for (count = 0; count < amount; count++) + { + struct guild_castle *gc; + md = calloc (sizeof (struct mob_data), 1); + if (md == NULL) + { + printf ("mob_spawn_guardian: out of memory !\n"); + exit (1); + } + memset (md, '\0', sizeof *md); + + mob_spawn_dataset (md, mobname, class); + md->bl.m = m; + md->bl.x = x; + md->bl.y = y; + md->m = m; + md->x0 = x; + md->y0 = y; + md->xs = 0; + md->ys = 0; + md->spawndelay1 = -1; // Only once is a flag. + md->spawndelay2 = -1; // Only once is a flag. + + memcpy (md->npc_event, event, sizeof (md->npc_event)); + + md->bl.type = BL_MOB; + map_addiddb (&md->bl); + mob_spawn (md->bl.id); + + gc = guild_mapname2gc (map[md->bl.m].name); + if (gc) + { + mob_db[class].max_hp += 2000 * gc->defense; + if (guardian == 0) + { + md->hp = gc->Ghp0; + gc->GID0 = md->bl.id; + } + if (guardian == 1) + { + md->hp = gc->Ghp1; + gc->GID1 = md->bl.id; + } + if (guardian == 2) + { + md->hp = gc->Ghp2; + gc->GID2 = md->bl.id; + } + if (guardian == 3) + { + md->hp = gc->Ghp3; + gc->GID3 = md->bl.id; + } + if (guardian == 4) + { + md->hp = gc->Ghp4; + gc->GID4 = md->bl.id; + } + if (guardian == 5) + { + md->hp = gc->Ghp5; + gc->GID5 = md->bl.id; + } + if (guardian == 6) + { + md->hp = gc->Ghp6; + gc->GID6 = md->bl.id; + } + if (guardian == 7) + { + md->hp = gc->Ghp7; + gc->GID7 = md->bl.id; + } - return (amount>0)?md->bl.id:0; -} + } + } + return (amount > 0) ? md->bl.id : 0; +} /*========================================== * Appearance income of mob *------------------------------------------ */ -int mob_get_viewclass(int class) +int mob_get_viewclass (int class) { - return mob_db[class].view_class; + return mob_db[class].view_class; } -int mob_get_sex(int class) + +int mob_get_sex (int class) { - return mob_db[class].sex; + return mob_db[class].sex; } -short mob_get_hair(int class) + +short mob_get_hair (int class) { - return mob_db[class].hair; + return mob_db[class].hair; } -short mob_get_hair_color(int class) + +short mob_get_hair_color (int class) { - return mob_db[class].hair_color; + return mob_db[class].hair_color; } -short mob_get_weapon(int class) + +short mob_get_weapon (int class) { - return mob_db[class].weapon; + return mob_db[class].weapon; } -short mob_get_shield(int class) + +short mob_get_shield (int class) { - return mob_db[class].shield; + return mob_db[class].shield; } -short mob_get_head_top(int class) + +short mob_get_head_top (int class) { - return mob_db[class].head_top; + return mob_db[class].head_top; } -short mob_get_head_mid(int class) + +short mob_get_head_mid (int class) { - return mob_db[class].head_mid; + return mob_db[class].head_mid; } -short mob_get_head_buttom(int class) + +short mob_get_head_buttom (int class) { - return mob_db[class].head_buttom; + return mob_db[class].head_buttom; } -short mob_get_clothes_color(int class) // Add for player monster dye - Valaris + +short mob_get_clothes_color (int class) // Add for player monster dye - Valaris { - return mob_db[class].clothes_color; // End + return mob_db[class].clothes_color; // End } -int mob_get_equip(int class) // mob equip [Valaris] + +int mob_get_equip (int class) // mob equip [Valaris] { - return mob_db[class].equip; + return mob_db[class].equip; } + /*========================================== * Is MOB in the state in which the present movement is possible or not? *------------------------------------------ */ -int mob_can_move(struct mob_data *md) +int mob_can_move (struct mob_data *md) { - nullpo_retr(0, md); - - if(md->canmove_tick > gettick() || (md->opt1 > 0 && md->opt1 != 6) || md->option&2) - return 0; - // アンクル中で動けないとか - if( md->sc_data[SC_ANKLE].timer != -1 || //アンクルスネア - md->sc_data[SC_AUTOCOUNTER].timer != -1 || //オートカウンター - md->sc_data[SC_BLADESTOP].timer != -1 || //白刃取り - md->sc_data[SC_SPIDERWEB].timer != -1 //スパイダーウェッブ - ) - return 0; - - return 1; + nullpo_retr (0, md); + + if (md->canmove_tick > gettick () || (md->opt1 > 0 && md->opt1 != 6) + || md->option & 2) + return 0; + // アンクル中で動けないとか + if (md->sc_data[SC_ANKLE].timer != -1 || //アンクルスネア + md->sc_data[SC_AUTOCOUNTER].timer != -1 || //オートカウンター + md->sc_data[SC_BLADESTOP].timer != -1 || //白刃取り + md->sc_data[SC_SPIDERWEB].timer != -1 //スパイダーウェッブ + ) + return 0; + + return 1; } /*========================================== * Time calculation concerning one step next to mob *------------------------------------------ */ -static int calc_next_walk_step(struct mob_data *md) +static int calc_next_walk_step (struct mob_data *md) { - nullpo_retr(0, md); + nullpo_retr (0, md); - if(md->walkpath.path_pos>=md->walkpath.path_len) - return -1; - if(md->walkpath.path[md->walkpath.path_pos]&1) - return battle_get_speed(&md->bl)*14/10; - return battle_get_speed(&md->bl); + if (md->walkpath.path_pos >= md->walkpath.path_len) + return -1; + if (md->walkpath.path[md->walkpath.path_pos] & 1) + return battle_get_speed (&md->bl) * 14 / 10; + return battle_get_speed (&md->bl); } -static int mob_walktoxy_sub(struct mob_data *md); +static int mob_walktoxy_sub (struct mob_data *md); /*========================================== * Mob Walk processing *------------------------------------------ */ -static int mob_walk(struct mob_data *md,unsigned int tick,int data) +static int mob_walk (struct mob_data *md, unsigned int tick, int data) { - int moveblock; - int i,ctype; - static int dirx[8]={0,-1,-1,-1,0,1,1,1}; - static int diry[8]={1,1,0,-1,-1,-1,0,1}; - int x,y,dx,dy; - - nullpo_retr(0, md); - - md->state.state=MS_IDLE; - if(md->walkpath.path_pos>=md->walkpath.path_len || md->walkpath.path_pos!=data) - return 0; - - md->walkpath.path_half ^= 1; - if(md->walkpath.path_half==0){ - md->walkpath.path_pos++; - if(md->state.change_walk_target){ - mob_walktoxy_sub(md); - return 0; - } - } - else { - if(md->walkpath.path[md->walkpath.path_pos]>=8) - return 1; - - x = md->bl.x; - y = md->bl.y; - ctype = map_getcell(md->bl.m,x,y); - if(ctype == 1 || ctype == 5) { - mob_stop_walking(md,1); - return 0; - } - md->dir=md->walkpath.path[md->walkpath.path_pos]; - dx = dirx[md->dir]; - dy = diry[md->dir]; - - ctype = map_getcell(md->bl.m,x+dx,y+dy); - if(ctype == 1 || ctype == 5) { - mob_walktoxy_sub(md); - return 0; - } - - moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE); - - md->state.state=MS_WALK; - map_foreachinmovearea(clif_moboutsight,md->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,md); - - x += dx; - y += dy; - if(md->min_chase>13) - md->min_chase--; - - if(moveblock) map_delblock(&md->bl); - md->bl.x = x; - md->bl.y = y; - if(moveblock) map_addblock(&md->bl); - - map_foreachinmovearea(clif_mobinsight,md->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,md); - md->state.state=MS_IDLE; - - if(md->option&4) - skill_check_cloaking(&md->bl); - - skill_unit_move(&md->bl,tick,1); // Inspection of a skill unit - } - if((i=calc_next_walk_step(md))>0){ - i = i>>1; - if(i < 1 && md->walkpath.path_half == 0) - i = 1; - md->timer=add_timer(tick+i,mob_timer,md->bl.id,md->walkpath.path_pos); - md->state.state=MS_WALK; + int moveblock; + int i, ctype; + static int dirx[8] = { 0, -1, -1, -1, 0, 1, 1, 1 }; + static int diry[8] = { 1, 1, 0, -1, -1, -1, 0, 1 }; + int x, y, dx, dy; + + nullpo_retr (0, md); + + md->state.state = MS_IDLE; + if (md->walkpath.path_pos >= md->walkpath.path_len + || md->walkpath.path_pos != data) + return 0; + + md->walkpath.path_half ^= 1; + if (md->walkpath.path_half == 0) + { + md->walkpath.path_pos++; + if (md->state.change_walk_target) + { + mob_walktoxy_sub (md); + return 0; + } + } + else + { + if (md->walkpath.path[md->walkpath.path_pos] >= 8) + return 1; + + x = md->bl.x; + y = md->bl.y; + ctype = map_getcell (md->bl.m, x, y); + if (ctype == 1 || ctype == 5) + { + mob_stop_walking (md, 1); + return 0; + } + md->dir = md->walkpath.path[md->walkpath.path_pos]; + dx = dirx[md->dir]; + dy = diry[md->dir]; + + ctype = map_getcell (md->bl.m, x + dx, y + dy); + if (ctype == 1 || ctype == 5) + { + mob_walktoxy_sub (md); + return 0; + } - if(md->walkpath.path_pos>=md->walkpath.path_len) - clif_fixmobpos(md); // When mob stops, retransmission current of a position. - } - return 0; + moveblock = (x / BLOCK_SIZE != (x + dx) / BLOCK_SIZE + || y / BLOCK_SIZE != (y + dy) / BLOCK_SIZE); + + md->state.state = MS_WALK; + map_foreachinmovearea (clif_moboutsight, md->bl.m, x - AREA_SIZE, + y - AREA_SIZE, x + AREA_SIZE, y + AREA_SIZE, + dx, dy, BL_PC, md); + + x += dx; + y += dy; + if (md->min_chase > 13) + md->min_chase--; + + if (moveblock) + map_delblock (&md->bl); + md->bl.x = x; + md->bl.y = y; + if (moveblock) + map_addblock (&md->bl); + + map_foreachinmovearea (clif_mobinsight, md->bl.m, x - AREA_SIZE, + y - AREA_SIZE, x + AREA_SIZE, y + AREA_SIZE, + -dx, -dy, BL_PC, md); + md->state.state = MS_IDLE; + + if (md->option & 4) + skill_check_cloaking (&md->bl); + + skill_unit_move (&md->bl, tick, 1); // Inspection of a skill unit + } + if ((i = calc_next_walk_step (md)) > 0) + { + i = i >> 1; + if (i < 1 && md->walkpath.path_half == 0) + i = 1; + md->timer = + add_timer (tick + i, mob_timer, md->bl.id, md->walkpath.path_pos); + md->state.state = MS_WALK; + + if (md->walkpath.path_pos >= md->walkpath.path_len) + clif_fixmobpos (md); // When mob stops, retransmission current of a position. + } + return 0; } /*========================================== * Check if mob should be attempting to attack *------------------------------------------ */ -static int mob_check_attack(struct mob_data *md) +static int mob_check_attack (struct mob_data *md) { - struct block_list *tbl=NULL; - struct map_session_data *tsd=NULL; - struct mob_data *tmd=NULL; - - int mode,race,range; - - nullpo_retr(0, md); - - md->min_chase=13; - md->state.state=MS_IDLE; - md->state.skillstate=MSS_IDLE; - - if( md->skilltimer!=-1 ) - return 0; - - if(md->opt1>0 || md->option&2) - return 0; - - if(md->sc_data[SC_AUTOCOUNTER].timer != -1) - return 0; - - if(md->sc_data[SC_BLADESTOP].timer != -1) - return 0; - - if((tbl=map_id2bl(md->target_id))==NULL){ - md->target_id=0; - md->state.targettype = NONE_ATTACKABLE; - return 0; - } - - if(tbl->type==BL_PC) - tsd=(struct map_session_data *)tbl; - else if(tbl->type==BL_MOB) - tmd=(struct mob_data *)tbl; - else - return 0; - - if(tsd){ - if( pc_isdead(tsd) || tsd->invincible_timer != -1 || pc_isinvisible(tsd) || md->bl.m != tbl->m || tbl->prev == NULL || distance(md->bl.x,md->bl.y,tbl->x,tbl->y)>=13 ) { - md->target_id=0; - md->state.targettype = NONE_ATTACKABLE; - return 0; - } - } - if(tmd){ - if(md->bl.m != tbl->m || tbl->prev == NULL || distance(md->bl.x,md->bl.y,tbl->x,tbl->y)>=13){ - md->target_id=0; - md->state.targettype = NONE_ATTACKABLE; - return 0; - } - } - - - if(!md->mode) - mode=mob_db[md->class].mode; - else - mode=md->mode; - - race=mob_db[md->class].race; - if(!(mode&0x80)){ - md->target_id=0; - md->state.targettype = NONE_ATTACKABLE; - return 0; - } - if(tsd && !(mode&0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 || - ((pc_ishiding(tsd) || tsd->state.gangsterparadise) && race!=4 && race!=6) ) ) { - md->target_id=0; - md->state.targettype = NONE_ATTACKABLE; - return 0; - } - - range = mob_db[md->class].range; - if(mode&1) - range++; - if(distance(md->bl.x,md->bl.y,tbl->x,tbl->y) > range) - return 0; - - return 1; + struct block_list *tbl = NULL; + struct map_session_data *tsd = NULL; + struct mob_data *tmd = NULL; + + int mode, race, range; + + nullpo_retr (0, md); + + md->min_chase = 13; + md->state.state = MS_IDLE; + md->state.skillstate = MSS_IDLE; + + if (md->skilltimer != -1) + return 0; + + if (md->opt1 > 0 || md->option & 2) + return 0; + + if (md->sc_data[SC_AUTOCOUNTER].timer != -1) + return 0; + + if (md->sc_data[SC_BLADESTOP].timer != -1) + return 0; + + if ((tbl = map_id2bl (md->target_id)) == NULL) + { + md->target_id = 0; + md->state.targettype = NONE_ATTACKABLE; + return 0; + } + + if (tbl->type == BL_PC) + tsd = (struct map_session_data *) tbl; + else if (tbl->type == BL_MOB) + tmd = (struct mob_data *) tbl; + else + return 0; + + if (tsd) + { + if (pc_isdead (tsd) || tsd->invincible_timer != -1 + || pc_isinvisible (tsd) || md->bl.m != tbl->m || tbl->prev == NULL + || distance (md->bl.x, md->bl.y, tbl->x, tbl->y) >= 13) + { + md->target_id = 0; + md->state.targettype = NONE_ATTACKABLE; + return 0; + } + } + if (tmd) + { + if (md->bl.m != tbl->m || tbl->prev == NULL + || distance (md->bl.x, md->bl.y, tbl->x, tbl->y) >= 13) + { + md->target_id = 0; + md->state.targettype = NONE_ATTACKABLE; + return 0; + } + } + + if (!md->mode) + mode = mob_db[md->class].mode; + else + mode = md->mode; + + race = mob_db[md->class].race; + if (!(mode & 0x80)) + { + md->target_id = 0; + md->state.targettype = NONE_ATTACKABLE; + return 0; + } + if (tsd && !(mode & 0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 || + ((pc_ishiding (tsd) + || tsd->state.gangsterparadise) + && race != 4 && race != 6))) + { + md->target_id = 0; + md->state.targettype = NONE_ATTACKABLE; + return 0; + } + + range = mob_db[md->class].range; + if (mode & 1) + range++; + if (distance (md->bl.x, md->bl.y, tbl->x, tbl->y) > range) + return 0; + + return 1; } /*========================================== * Attack processing of mob *------------------------------------------ */ -static int mob_attack(struct mob_data *md,unsigned int tick,int data) +static int mob_attack (struct mob_data *md, unsigned int tick, int data) { - struct block_list *tbl=NULL; + struct block_list *tbl = NULL; - nullpo_retr(0, md); + nullpo_retr (0, md); - if((tbl=map_id2bl(md->target_id))==NULL) - return 0; + if ((tbl = map_id2bl (md->target_id)) == NULL) + return 0; - if (!mob_check_attack(md)) - return 0; + if (!mob_check_attack (md)) + return 0; - if(battle_config.monster_attack_direction_change) - md->dir=map_calc_dir(&md->bl, tbl->x,tbl->y ); // 向き設定 + if (battle_config.monster_attack_direction_change) + md->dir = map_calc_dir (&md->bl, tbl->x, tbl->y); // 向き設定 - //clif_fixmobpos(md); + //clif_fixmobpos(md); - md->state.skillstate=MSS_ATTACK; - if( mobskill_use(md,tick,-2) ) // スキル使用 - return 0; + md->state.skillstate = MSS_ATTACK; + if (mobskill_use (md, tick, -2)) // スキル使用 + return 0; - md->target_lv = battle_weapon_attack(&md->bl,tbl,tick,0); + md->target_lv = battle_weapon_attack (&md->bl, tbl, tick, 0); - if(!(battle_config.monster_cloak_check_type&2) && md->sc_data[SC_CLOAKING].timer != -1) - skill_status_change_end(&md->bl,SC_CLOAKING,-1); + if (!(battle_config.monster_cloak_check_type & 2) + && md->sc_data[SC_CLOAKING].timer != -1) + skill_status_change_end (&md->bl, SC_CLOAKING, -1); - md->attackabletime = tick + battle_get_adelay(&md->bl); + md->attackabletime = tick + battle_get_adelay (&md->bl); - md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0); - md->state.state=MS_ATTACK; + md->timer = add_timer (md->attackabletime, mob_timer, md->bl.id, 0); + md->state.state = MS_ATTACK; - return 0; + return 0; } - /*========================================== * The attack of PC which is attacking id is stopped. * The callback function of clif_foreachclient *------------------------------------------ */ -int mob_stopattacked(struct map_session_data *sd,va_list ap) +int mob_stopattacked (struct map_session_data *sd, va_list ap) { - int id; + int id; - nullpo_retr(0, sd); - nullpo_retr(0, ap); + nullpo_retr (0, sd); + nullpo_retr (0, ap); - id=va_arg(ap,int); - if(sd->attacktarget==id) - pc_stopattack(sd); - return 0; + id = va_arg (ap, int); + if (sd->attacktarget == id) + pc_stopattack (sd); + return 0; } + /*========================================== * The timer in which the mob's states changes *------------------------------------------ */ -int mob_changestate(struct mob_data *md,int state,int type) +int mob_changestate (struct mob_data *md, int state, int type) { - unsigned int tick; - int i; - - nullpo_retr(0, md); - - if(md->timer != -1) - delete_timer(md->timer,mob_timer); - md->timer=-1; - md->state.state=state; - - switch(state){ - case MS_WALK: - if((i=calc_next_walk_step(md))>0){ - i = i>>2; - md->timer=add_timer(gettick()+i,mob_timer,md->bl.id,0); - } - else - md->state.state=MS_IDLE; - break; - case MS_ATTACK: - tick = gettick(); - i=DIFF_TICK(md->attackabletime,tick); - if(i>0 && i<2000) - md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0); - else if(type) { - md->attackabletime = tick + battle_get_amotion(&md->bl); - md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0); - } - else { - md->attackabletime = tick + 1; - md->timer=add_timer(md->attackabletime,mob_timer,md->bl.id,0); - } - break; - case MS_DELAY: - md->timer=add_timer(gettick()+type,mob_timer,md->bl.id,0); - break; - case MS_DEAD: - skill_castcancel(&md->bl,0); -// mobskill_deltimer(md); - md->state.skillstate=MSS_DEAD; - md->last_deadtime=gettick(); - // Since it died, all aggressors' attack to this mob is stopped. - clif_foreachclient(mob_stopattacked,md->bl.id); - skill_unit_out_all(&md->bl,gettick(),1); - skill_status_change_clear(&md->bl,2); // The abnormalities in status are canceled. - skill_clear_unitgroup(&md->bl); // All skill unit groups are deleted. - skill_cleartimerskill(&md->bl); - if(md->deletetimer!=-1) - delete_timer(md->deletetimer,mob_timer_delete); - md->deletetimer=-1; - md->hp=md->target_id=md->attacked_id=0; - md->state.targettype = NONE_ATTACKABLE; - break; - } - - return 0; + unsigned int tick; + int i; + + nullpo_retr (0, md); + + if (md->timer != -1) + delete_timer (md->timer, mob_timer); + md->timer = -1; + md->state.state = state; + + switch (state) + { + case MS_WALK: + if ((i = calc_next_walk_step (md)) > 0) + { + i = i >> 2; + md->timer = + add_timer (gettick () + i, mob_timer, md->bl.id, 0); + } + else + md->state.state = MS_IDLE; + break; + case MS_ATTACK: + tick = gettick (); + i = DIFF_TICK (md->attackabletime, tick); + if (i > 0 && i < 2000) + md->timer = + add_timer (md->attackabletime, mob_timer, md->bl.id, 0); + else if (type) + { + md->attackabletime = tick + battle_get_amotion (&md->bl); + md->timer = + add_timer (md->attackabletime, mob_timer, md->bl.id, 0); + } + else + { + md->attackabletime = tick + 1; + md->timer = + add_timer (md->attackabletime, mob_timer, md->bl.id, 0); + } + break; + case MS_DELAY: + md->timer = + add_timer (gettick () + type, mob_timer, md->bl.id, 0); + break; + case MS_DEAD: + skill_castcancel (&md->bl, 0); +// mobskill_deltimer(md); + md->state.skillstate = MSS_DEAD; + md->last_deadtime = gettick (); + // Since it died, all aggressors' attack to this mob is stopped. + clif_foreachclient (mob_stopattacked, md->bl.id); + skill_unit_out_all (&md->bl, gettick (), 1); + skill_status_change_clear (&md->bl, 2); // The abnormalities in status are canceled. + skill_clear_unitgroup (&md->bl); // All skill unit groups are deleted. + skill_cleartimerskill (&md->bl); + if (md->deletetimer != -1) + delete_timer (md->deletetimer, mob_timer_delete); + md->deletetimer = -1; + md->hp = md->target_id = md->attacked_id = 0; + md->state.targettype = NONE_ATTACKABLE; + break; + } + + return 0; } /*========================================== @@ -909,598 +1035,659 @@ int mob_changestate(struct mob_data *md,int state,int type) * It branches to a walk and an attack. *------------------------------------------ */ -static int mob_timer(int tid,unsigned int tick,int id,int data) +static int mob_timer (int tid, unsigned int tick, int id, int data) { - struct mob_data *md; - struct block_list *bl; - - if( (bl=map_id2bl(id)) == NULL ){ //攻撃してきた敵がもういないのは正常のようだ - return 1; - } - - if(!bl || !bl->type || bl->type!=BL_MOB) - return 1; - - nullpo_retr(1, md=(struct mob_data*)bl); - - if(!md->bl.type || md->bl.type!=BL_MOB) - return 1; - - if(md->timer != tid){ - if(battle_config.error_log==1) - printf("mob_timer %d != %d\n",md->timer,tid); - return 0; - } - md->timer=-1; - if(md->bl.prev == NULL || md->state.state == MS_DEAD) - return 1; - - map_freeblock_lock(); - switch(md->state.state){ - case MS_WALK: - mob_check_attack(md); - mob_walk(md,tick,data); - break; - case MS_ATTACK: - mob_attack(md,tick,data); - break; - case MS_DELAY: - mob_changestate(md,MS_IDLE,0); - break; - default: - if(battle_config.error_log==1) - printf("mob_timer : %d ?\n",md->state.state); - break; - } - map_freeblock_unlock(); - return 0; + struct mob_data *md; + struct block_list *bl; + + if ((bl = map_id2bl (id)) == NULL) + { //攻撃してきた敵がもういないのは正常のようだ + return 1; + } + + if (!bl || !bl->type || bl->type != BL_MOB) + return 1; + + nullpo_retr (1, md = (struct mob_data *) bl); + + if (!md->bl.type || md->bl.type != BL_MOB) + return 1; + + if (md->timer != tid) + { + if (battle_config.error_log == 1) + printf ("mob_timer %d != %d\n", md->timer, tid); + return 0; + } + md->timer = -1; + if (md->bl.prev == NULL || md->state.state == MS_DEAD) + return 1; + + map_freeblock_lock (); + switch (md->state.state) + { + case MS_WALK: + mob_check_attack (md); + mob_walk (md, tick, data); + break; + case MS_ATTACK: + mob_attack (md, tick, data); + break; + case MS_DELAY: + mob_changestate (md, MS_IDLE, 0); + break; + default: + if (battle_config.error_log == 1) + printf ("mob_timer : %d ?\n", md->state.state); + break; + } + map_freeblock_unlock (); + return 0; } /*========================================== * *------------------------------------------ */ -static int mob_walktoxy_sub(struct mob_data *md) +static int mob_walktoxy_sub (struct mob_data *md) { - struct walkpath_data wpd; + struct walkpath_data wpd; - nullpo_retr(0, md); + nullpo_retr (0, md); - if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,md->to_x,md->to_y,md->state.walk_easy)) - return 1; - memcpy(&md->walkpath,&wpd,sizeof(wpd)); + if (path_search + (&wpd, md->bl.m, md->bl.x, md->bl.y, md->to_x, md->to_y, + md->state.walk_easy)) + return 1; + memcpy (&md->walkpath, &wpd, sizeof (wpd)); - md->state.change_walk_target=0; - mob_changestate(md,MS_WALK,0); - clif_movemob(md); + md->state.change_walk_target = 0; + mob_changestate (md, MS_WALK, 0); + clif_movemob (md); - return 0; + return 0; } /*========================================== * mob move start *------------------------------------------ */ -int mob_walktoxy(struct mob_data *md,int x,int y,int easy) +int mob_walktoxy (struct mob_data *md, int x, int y, int easy) { - struct walkpath_data wpd; - - nullpo_retr(0, md); - - if(md->state.state == MS_WALK && path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,x,y,easy) ) - return 1; - - md->state.walk_easy = easy; - md->to_x=x; - md->to_y=y; - if(md->state.state == MS_WALK) { - md->state.change_walk_target=1; - } else { - return mob_walktoxy_sub(md); - } - - return 0; + struct walkpath_data wpd; + + nullpo_retr (0, md); + + if (md->state.state == MS_WALK + && path_search (&wpd, md->bl.m, md->bl.x, md->bl.y, x, y, easy)) + return 1; + + md->state.walk_easy = easy; + md->to_x = x; + md->to_y = y; + if (md->state.state == MS_WALK) + { + md->state.change_walk_target = 1; + } + else + { + return mob_walktoxy_sub (md); + } + + return 0; } /*========================================== * mob spawn with delay (timer function) *------------------------------------------ */ -static int mob_delayspawn(int tid,unsigned int tick,int m,int n) +static int mob_delayspawn (int tid, unsigned int tick, int m, int n) { - mob_spawn(m); - return 0; + mob_spawn (m); + return 0; } /*========================================== * spawn timing calculation *------------------------------------------ */ -int mob_setdelayspawn(int id) +int mob_setdelayspawn (int id) { - unsigned int spawntime,spawntime1,spawntime2,spawntime3; - struct mob_data *md; - struct block_list *bl; + unsigned int spawntime, spawntime1, spawntime2, spawntime3; + struct mob_data *md; + struct block_list *bl; - if((bl=map_id2bl(id)) == NULL) - return -1; + if ((bl = map_id2bl (id)) == NULL) + return -1; - if(!bl || !bl->type || bl->type!=BL_MOB) - return -1; + if (!bl || !bl->type || bl->type != BL_MOB) + return -1; - nullpo_retr(-1, md=(struct mob_data*)bl); + nullpo_retr (-1, md = (struct mob_data *) bl); - if(!md || md->bl.type!=BL_MOB) - return -1; + if (!md || md->bl.type != BL_MOB) + return -1; - // Processing of MOB which is not revitalized - if(md->spawndelay1==-1 && md->spawndelay2==-1 && md->n==0){ - map_deliddb(&md->bl); - if(md->lootitem) { - map_freeblock(md->lootitem); - md->lootitem=NULL; - } - map_freeblock(md); // Instead of [ of free ] - return 0; - } - - spawntime1=md->last_spawntime+md->spawndelay1; - spawntime2=md->last_deadtime+md->spawndelay2; - spawntime3=gettick()+5000; - // spawntime = max(spawntime1,spawntime2,spawntime3); - if(DIFF_TICK(spawntime1,spawntime2)>0){ - spawntime=spawntime1; - } else { - spawntime=spawntime2; - } - if(DIFF_TICK(spawntime3,spawntime)>0){ - spawntime=spawntime3; - } - - add_timer(spawntime,mob_delayspawn,id,0); - return 0; + // Processing of MOB which is not revitalized + if (md->spawndelay1 == -1 && md->spawndelay2 == -1 && md->n == 0) + { + map_deliddb (&md->bl); + if (md->lootitem) + { + map_freeblock (md->lootitem); + md->lootitem = NULL; + } + map_freeblock (md); // Instead of [ of free ] + return 0; + } + + spawntime1 = md->last_spawntime + md->spawndelay1; + spawntime2 = md->last_deadtime + md->spawndelay2; + spawntime3 = gettick () + 5000; + // spawntime = max(spawntime1,spawntime2,spawntime3); + if (DIFF_TICK (spawntime1, spawntime2) > 0) + { + spawntime = spawntime1; + } + else + { + spawntime = spawntime2; + } + if (DIFF_TICK (spawntime3, spawntime) > 0) + { + spawntime = spawntime3; + } + + add_timer (spawntime, mob_delayspawn, id, 0); + return 0; } /*========================================== * Mob spawning. Initialization is also variously here. *------------------------------------------ */ -int mob_spawn(int id) +int mob_spawn (int id) { - int x=0,y=0,i=0,c; - unsigned int tick = gettick(); - struct mob_data *md; - struct block_list *bl; - - nullpo_retr(-1, bl=map_id2bl(id)); - - if(!bl || !bl->type || bl->type!=BL_MOB) - return -1; - - nullpo_retr(-1, md=(struct mob_data*)bl); - - if(!md || !md->bl.type || md->bl.type!=BL_MOB) - return -1; - - md->last_spawntime=tick; - if( md->bl.prev!=NULL ){ -// clif_clearchar_area(&md->bl,3); - skill_unit_out_all(&md->bl,gettick(),1); - map_delblock(&md->bl); - } - else - md->class = md->base_class; - - md->bl.m =md->m; - do { - if(md->x0==0 && md->y0==0){ - x=MPRAND(1, (map[md->bl.m].xs-2)); - y=MPRAND(1, (map[md->bl.m].ys-2)); - } else { - x=MPRAND(md->x0, (md->xs+1)) - md->xs/2; - y=MPRAND(md->y0, (md->ys+1)) - md->ys/2; - } - i++; - } while(((c=map_getcell(md->bl.m,x,y))==1 || c==5) && i<50); - - if(i>=50){ -// if(battle_config.error_log==1) -// printf("MOB spawn error %d @ %s\n",id,map[md->bl.m].name); - add_timer(tick+5000,mob_delayspawn,id,0); - return 1; - } - - md->to_x=md->bl.x=x; - md->to_y=md->bl.y=y; - md->dir=0; - - map_addblock(&md->bl); - - memset(&md->state,0,sizeof(md->state)); - md->attacked_id = 0; - md->target_id = 0; - md->move_fail_count = 0; - mob_init(md); - - if(!md->stats[MOB_SPEED]) - md->stats[MOB_SPEED] = mob_db[md->class].speed; - md->def_ele = mob_db[md->class].element; - md->master_id=0; - md->master_dist=0; - - md->state.state = MS_IDLE; - md->state.skillstate = MSS_IDLE; - md->timer = -1; - md->last_thinktime = tick; - md->next_walktime = tick+MPRAND(5000, 50); - md->attackabletime = tick; - md->canmove_tick = tick; - - md->sg_count=0; - md->deletetimer=-1; - - md->skilltimer=-1; - for(i=0,c=tick-1000*3600*10;i<MAX_MOBSKILL;i++) - md->skilldelay[i] = c; - md->skillid=0; - md->skilllv=0; - - memset(md->dmglog,0,sizeof(md->dmglog)); - if(md->lootitem) - memset(md->lootitem,0,sizeof(md->lootitem)); - md->lootitem_count = 0; - - for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) - md->skilltimerskill[i].timer = -1; - - for(i=0;i<MAX_STATUSCHANGE;i++) { - md->sc_data[i].timer=-1; - md->sc_data[i].val1 = md->sc_data[i].val2 = md->sc_data[i].val3 = md->sc_data[i].val4 =0; - } - md->sc_count=0; - md->opt1=md->opt2=md->opt3=md->option=0; - - memset(md->skillunit,0,sizeof(md->skillunit)); - memset(md->skillunittick,0,sizeof(md->skillunittick)); - - md->hp = battle_get_max_hp(&md->bl); - if(md->hp<=0){ - mob_makedummymobdb(md->class); - md->hp = battle_get_max_hp(&md->bl); - } - - clif_spawnmob(md); - - return 0; + int x = 0, y = 0, i = 0, c; + unsigned int tick = gettick (); + struct mob_data *md; + struct block_list *bl; + + nullpo_retr (-1, bl = map_id2bl (id)); + + if (!bl || !bl->type || bl->type != BL_MOB) + return -1; + + nullpo_retr (-1, md = (struct mob_data *) bl); + + if (!md || !md->bl.type || md->bl.type != BL_MOB) + return -1; + + md->last_spawntime = tick; + if (md->bl.prev != NULL) + { +// clif_clearchar_area(&md->bl,3); + skill_unit_out_all (&md->bl, gettick (), 1); + map_delblock (&md->bl); + } + else + md->class = md->base_class; + + md->bl.m = md->m; + do + { + if (md->x0 == 0 && md->y0 == 0) + { + x = MPRAND (1, (map[md->bl.m].xs - 2)); + y = MPRAND (1, (map[md->bl.m].ys - 2)); + } + else + { + x = MPRAND (md->x0, (md->xs + 1)) - md->xs / 2; + y = MPRAND (md->y0, (md->ys + 1)) - md->ys / 2; + } + i++; + } + while (((c = map_getcell (md->bl.m, x, y)) == 1 || c == 5) && i < 50); + + if (i >= 50) + { +// if(battle_config.error_log==1) +// printf("MOB spawn error %d @ %s\n",id,map[md->bl.m].name); + add_timer (tick + 5000, mob_delayspawn, id, 0); + return 1; + } + + md->to_x = md->bl.x = x; + md->to_y = md->bl.y = y; + md->dir = 0; + + map_addblock (&md->bl); + + memset (&md->state, 0, sizeof (md->state)); + md->attacked_id = 0; + md->target_id = 0; + md->move_fail_count = 0; + mob_init (md); + + if (!md->stats[MOB_SPEED]) + md->stats[MOB_SPEED] = mob_db[md->class].speed; + md->def_ele = mob_db[md->class].element; + md->master_id = 0; + md->master_dist = 0; + + md->state.state = MS_IDLE; + md->state.skillstate = MSS_IDLE; + md->timer = -1; + md->last_thinktime = tick; + md->next_walktime = tick + MPRAND (5000, 50); + md->attackabletime = tick; + md->canmove_tick = tick; + + md->sg_count = 0; + md->deletetimer = -1; + + md->skilltimer = -1; + for (i = 0, c = tick - 1000 * 3600 * 10; i < MAX_MOBSKILL; i++) + md->skilldelay[i] = c; + md->skillid = 0; + md->skilllv = 0; + + memset (md->dmglog, 0, sizeof (md->dmglog)); + if (md->lootitem) + memset (md->lootitem, 0, sizeof (md->lootitem)); + md->lootitem_count = 0; + + for (i = 0; i < MAX_MOBSKILLTIMERSKILL; i++) + md->skilltimerskill[i].timer = -1; + + for (i = 0; i < MAX_STATUSCHANGE; i++) + { + md->sc_data[i].timer = -1; + md->sc_data[i].val1 = md->sc_data[i].val2 = md->sc_data[i].val3 = + md->sc_data[i].val4 = 0; + } + md->sc_count = 0; + md->opt1 = md->opt2 = md->opt3 = md->option = 0; + + memset (md->skillunit, 0, sizeof (md->skillunit)); + memset (md->skillunittick, 0, sizeof (md->skillunittick)); + + md->hp = battle_get_max_hp (&md->bl); + if (md->hp <= 0) + { + mob_makedummymobdb (md->class); + md->hp = battle_get_max_hp (&md->bl); + } + + clif_spawnmob (md); + + return 0; } /*========================================== * Distance calculation between two points *------------------------------------------ */ -static int distance(int x0,int y0,int x1,int y1) +static int distance (int x0, int y0, int x1, int y1) { - int dx,dy; + int dx, dy; - dx=abs(x0-x1); - dy=abs(y0-y1); - return dx>dy ? dx : dy; + dx = abs (x0 - x1); + dy = abs (y0 - y1); + return dx > dy ? dx : dy; } /*========================================== * The stop of MOB's attack *------------------------------------------ */ -int mob_stopattack(struct mob_data *md) +int mob_stopattack (struct mob_data *md) { - md->target_id=0; - md->state.targettype = NONE_ATTACKABLE; - md->attacked_id=0; - return 0; + md->target_id = 0; + md->state.targettype = NONE_ATTACKABLE; + md->attacked_id = 0; + return 0; } + /*========================================== * The stop of MOB's walking *------------------------------------------ */ -int mob_stop_walking(struct mob_data *md,int type) +int mob_stop_walking (struct mob_data *md, int type) { - nullpo_retr(0, md); - - - if(md->state.state == MS_WALK || md->state.state == MS_IDLE) { - int dx=0,dy=0; - - md->walkpath.path_len=0; - if(type&4){ - dx=md->to_x-md->bl.x; - if(dx<0) - dx=-1; - else if(dx>0) - dx=1; - dy=md->to_y-md->bl.y; - if(dy<0) - dy=-1; - else if(dy>0) - dy=1; - } - md->to_x=md->bl.x+dx; - md->to_y=md->bl.y+dy; - if(dx!=0 || dy!=0){ - mob_walktoxy_sub(md); - return 0; - } - mob_changestate(md,MS_IDLE,0); - } - if(type&0x01) - clif_fixmobpos(md); - if(type&0x02) { - int delay=battle_get_dmotion(&md->bl); - unsigned int tick = gettick(); - if(md->canmove_tick < tick) - md->canmove_tick = tick + delay; - } - - return 0; + nullpo_retr (0, md); + + if (md->state.state == MS_WALK || md->state.state == MS_IDLE) + { + int dx = 0, dy = 0; + + md->walkpath.path_len = 0; + if (type & 4) + { + dx = md->to_x - md->bl.x; + if (dx < 0) + dx = -1; + else if (dx > 0) + dx = 1; + dy = md->to_y - md->bl.y; + if (dy < 0) + dy = -1; + else if (dy > 0) + dy = 1; + } + md->to_x = md->bl.x + dx; + md->to_y = md->bl.y + dy; + if (dx != 0 || dy != 0) + { + mob_walktoxy_sub (md); + return 0; + } + mob_changestate (md, MS_IDLE, 0); + } + if (type & 0x01) + clif_fixmobpos (md); + if (type & 0x02) + { + int delay = battle_get_dmotion (&md->bl); + unsigned int tick = gettick (); + if (md->canmove_tick < tick) + md->canmove_tick = tick + delay; + } + + return 0; } /*========================================== * Reachability to a Specification ID existence place *------------------------------------------ */ -int mob_can_reach(struct mob_data *md,struct block_list *bl,int range) +int mob_can_reach (struct mob_data *md, struct block_list *bl, int range) { - int dx,dy; - struct walkpath_data wpd; - int i; - - nullpo_retr(0, md); - nullpo_retr(0, bl); - - dx=abs(bl->x - md->bl.x); - dy=abs(bl->y - md->bl.y); - - //=========== guildcastle guardian no search start=========== - //when players are the guild castle member not attack them ! - if(md->class == 1285 || md->class == 1286 || md->class == 1287){ - struct map_session_data *sd; - struct guild *g=NULL; - struct guild_castle *gc=guild_mapname2gc(map[bl->m].name); - - if(gc && agit_flag==0) // Guardians will not attack during non-woe time [Valaris] - return 0; // end addition [Valaris] - - if(bl && bl->type == BL_PC){ - if((sd=(struct map_session_data *)bl) == NULL){ - printf("mob_can_reach nullpo\n"); - return 0; - } - - if(gc && sd && sd->status.guild_id && sd->status.guild_id>0) { - g=guild_search(sd->status.guild_id); // don't attack guild members [Valaris] - if(g && g->guild_id > 0 && g->guild_id == gc->guild_id) - return 0; - if(g && gc && guild_isallied(g,gc)) - return 0; - - } - } - } - //========== guildcastle guardian no search eof============== - - if(bl && bl->type == BL_PC && battle_config.monsters_ignore_gm==1) { // option to have monsters ignore GMs [Valaris] - struct map_session_data *sd; - if((sd=(struct map_session_data *)bl) != NULL && pc_isGM(sd)) - return 0; - } - - if( md->bl.m != bl->m) // 違うャbプ - return 0; - - if( range>0 && range < ((dx>dy)?dx:dy) ) // 遠すぎる - return 0; - - if( md->bl.x==bl->x && md->bl.y==bl->y ) // 同じャX - return 1; - - // Obstacle judging - wpd.path_len=0; - wpd.path_pos=0; - wpd.path_half=0; - if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,bl->x,bl->y,0)!=-1) - return 1; - - if(bl->type!=BL_PC && bl->type!=BL_MOB) - return 0; - - // It judges whether it can adjoin or not. - dx=(dx>0)?1:((dx<0)?-1:0); - dy=(dy>0)?1:((dy<0)?-1:0); - if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,bl->x-dx,bl->y-dy,0)!=-1) - return 1; - for(i=0;i<9;i++){ - if(path_search(&wpd,md->bl.m,md->bl.x,md->bl.y,bl->x-1+i/3,bl->y-1+i%3,0)!=-1) - return 1; - } - return 0; + int dx, dy; + struct walkpath_data wpd; + int i; + + nullpo_retr (0, md); + nullpo_retr (0, bl); + + dx = abs (bl->x - md->bl.x); + dy = abs (bl->y - md->bl.y); + + //=========== guildcastle guardian no search start=========== + //when players are the guild castle member not attack them ! + if (md->class == 1285 || md->class == 1286 || md->class == 1287) + { + struct map_session_data *sd; + struct guild *g = NULL; + struct guild_castle *gc = guild_mapname2gc (map[bl->m].name); + + if (gc && agit_flag == 0) // Guardians will not attack during non-woe time [Valaris] + return 0; // end addition [Valaris] + + if (bl && bl->type == BL_PC) + { + if ((sd = (struct map_session_data *) bl) == NULL) + { + printf ("mob_can_reach nullpo\n"); + return 0; + } + + if (gc && sd && sd->status.guild_id && sd->status.guild_id > 0) + { + g = guild_search (sd->status.guild_id); // don't attack guild members [Valaris] + if (g && g->guild_id > 0 && g->guild_id == gc->guild_id) + return 0; + if (g && gc && guild_isallied (g, gc)) + return 0; + + } + } + } + //========== guildcastle guardian no search eof============== + + if (bl && bl->type == BL_PC && battle_config.monsters_ignore_gm == 1) + { // option to have monsters ignore GMs [Valaris] + struct map_session_data *sd; + if ((sd = (struct map_session_data *) bl) != NULL && pc_isGM (sd)) + return 0; + } + + if (md->bl.m != bl->m) // 違うャbプ + return 0; + + if (range > 0 && range < ((dx > dy) ? dx : dy)) // 遠すぎる + return 0; + + if (md->bl.x == bl->x && md->bl.y == bl->y) // 同じャX + return 1; + + // Obstacle judging + wpd.path_len = 0; + wpd.path_pos = 0; + wpd.path_half = 0; + if (path_search (&wpd, md->bl.m, md->bl.x, md->bl.y, bl->x, bl->y, 0) != + -1) + return 1; + + if (bl->type != BL_PC && bl->type != BL_MOB) + return 0; + + // It judges whether it can adjoin or not. + dx = (dx > 0) ? 1 : ((dx < 0) ? -1 : 0); + dy = (dy > 0) ? 1 : ((dy < 0) ? -1 : 0); + if (path_search + (&wpd, md->bl.m, md->bl.x, md->bl.y, bl->x - dx, bl->y - dy, 0) != -1) + return 1; + for (i = 0; i < 9; i++) + { + if (path_search + (&wpd, md->bl.m, md->bl.x, md->bl.y, bl->x - 1 + i / 3, + bl->y - 1 + i % 3, 0) != -1) + return 1; + } + return 0; } /*========================================== * Determination for an attack of a monster *------------------------------------------ */ -int mob_target(struct mob_data *md,struct block_list *bl,int dist) +int mob_target (struct mob_data *md, struct block_list *bl, int dist) { - struct map_session_data *sd; - struct status_change *sc_data; - short *option; - int mode,race; - - nullpo_retr(0, md); - nullpo_retr(0, bl); - - sc_data = battle_get_sc_data(bl); - option = battle_get_option(bl); - race=mob_db[md->class].race; - - if(!md->mode){ - mode=mob_db[md->class].mode; - }else{ - mode=md->mode; - } - if(!(mode&0x80)) { - md->target_id = 0; - return 0; - } - // Nothing will be carried out if there is no mind of changing TAGE by TAGE ending. - if( (md->target_id > 0 && md->state.targettype == ATTACKABLE) && ( !(mode&0x04) || MRAND(100)>25) ) - return 0; - - if(mode&0x20 || // Coercion is exerted if it is MVPMOB. - (sc_data && sc_data[SC_TRICKDEAD].timer == -1 && - ( (option && !(*option&0x06) ) || race==4 || race==6) ) ){ - if(bl->type == BL_PC) { - nullpo_retr(0, sd = (struct map_session_data *)bl); - if(sd->invincible_timer != -1 || pc_isinvisible(sd)) - return 0; - if(!(mode&0x20) && race!=4 && race!=6 && sd->state.gangsterparadise) - return 0; - } + struct map_session_data *sd; + struct status_change *sc_data; + short *option; + int mode, race; + + nullpo_retr (0, md); + nullpo_retr (0, bl); + + sc_data = battle_get_sc_data (bl); + option = battle_get_option (bl); + race = mob_db[md->class].race; + + if (!md->mode) + { + mode = mob_db[md->class].mode; + } + else + { + mode = md->mode; + } + if (!(mode & 0x80)) + { + md->target_id = 0; + return 0; + } + // Nothing will be carried out if there is no mind of changing TAGE by TAGE ending. + if ((md->target_id > 0 && md->state.targettype == ATTACKABLE) + && (!(mode & 0x04) || MRAND (100) > 25)) + return 0; + + if (mode & 0x20 || // Coercion is exerted if it is MVPMOB. + (sc_data && sc_data[SC_TRICKDEAD].timer == -1 && + ((option && !(*option & 0x06)) || race == 4 || race == 6))) + { + if (bl->type == BL_PC) + { + nullpo_retr (0, sd = (struct map_session_data *) bl); + if (sd->invincible_timer != -1 || pc_isinvisible (sd)) + return 0; + if (!(mode & 0x20) && race != 4 && race != 6 + && sd->state.gangsterparadise) + return 0; + } - md->target_id=bl->id; // Since there was no disturbance, it locks on to target. - if(bl->type == BL_PC || bl->type == BL_MOB) - md->state.targettype = ATTACKABLE; - else - md->state.targettype = NONE_ATTACKABLE; - md->min_chase=dist+13; - if(md->min_chase>26) - md->min_chase=26; - } - return 0; + md->target_id = bl->id; // Since there was no disturbance, it locks on to target. + if (bl->type == BL_PC || bl->type == BL_MOB) + md->state.targettype = ATTACKABLE; + else + md->state.targettype = NONE_ATTACKABLE; + md->min_chase = dist + 13; + if (md->min_chase > 26) + md->min_chase = 26; + } + return 0; } /*========================================== * The ?? routine of an active monster *------------------------------------------ */ -static int mob_ai_sub_hard_activesearch(struct block_list *bl,va_list ap) +static int mob_ai_sub_hard_activesearch (struct block_list *bl, va_list ap) { - struct map_session_data *tsd=NULL; - struct mob_data *smd,*tmd=NULL; - int mode,race,dist,*pcc; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, smd=va_arg(ap,struct mob_data *)); - nullpo_retr(0, pcc=va_arg(ap,int *)); - - if(bl->type==BL_PC) - tsd=(struct map_session_data *)bl; - else if(bl->type==BL_MOB) - tmd=(struct mob_data *)bl; - else - return 0; - - //敵味方判定 - if(battle_check_target(&smd->bl,bl,BCT_ENEMY)==0) - return 0; - - if(!smd->mode) - mode=mob_db[smd->class].mode; - else - mode=smd->mode; - - // アクティブでターゲット射程内にいるなら、ロックする - if( mode&0x04 ){ - race=mob_db[smd->class].race; - //対象がPCの場合 - if(tsd && - !pc_isdead(tsd) && - tsd->bl.m == smd->bl.m && - tsd->invincible_timer == -1 && - !pc_isinvisible(tsd) && - (dist=distance(smd->bl.x,smd->bl.y,tsd->bl.x,tsd->bl.y))<9 - ) - { - if(mode&0x20 || - (tsd->sc_data[SC_TRICKDEAD].timer == -1 && - ((!pc_ishiding(tsd) && !tsd->state.gangsterparadise) || race==4 || race==6))){ // 妨害がないか判定 - if( mob_can_reach(smd,bl,12) && // 到達可能性判定 - MRAND(1000)<1000/(++(*pcc)) ){ // 範囲内PCで等確率にする - smd->target_id=tsd->bl.id; - smd->state.targettype = ATTACKABLE; - smd->min_chase=13; - } - } - } - //対象がMobの場合 - else if(tmd && - tmd->bl.m == smd->bl.m && - (dist=distance(smd->bl.x,smd->bl.y,tmd->bl.x,tmd->bl.y))<9 - ) - { - if( mob_can_reach(smd,bl,12) && // 到達可能性判定 - MRAND(1000)<1000/(++(*pcc)) ){ // 範囲内で等確率にする - smd->target_id=bl->id; - smd->state.targettype = ATTACKABLE; - smd->min_chase=13; - } - } - } - return 0; + struct map_session_data *tsd = NULL; + struct mob_data *smd, *tmd = NULL; + int mode, race, dist, *pcc; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, smd = va_arg (ap, struct mob_data *)); + nullpo_retr (0, pcc = va_arg (ap, int *)); + + if (bl->type == BL_PC) + tsd = (struct map_session_data *) bl; + else if (bl->type == BL_MOB) + tmd = (struct mob_data *) bl; + else + return 0; + + //敵味方判定 + if (battle_check_target (&smd->bl, bl, BCT_ENEMY) == 0) + return 0; + + if (!smd->mode) + mode = mob_db[smd->class].mode; + else + mode = smd->mode; + + // アクティブでターゲット射程内にいるなら、ロックする + if (mode & 0x04) + { + race = mob_db[smd->class].race; + //対象がPCの場合 + if (tsd && + !pc_isdead (tsd) && + tsd->bl.m == smd->bl.m && + tsd->invincible_timer == -1 && + !pc_isinvisible (tsd) && + (dist = + distance (smd->bl.x, smd->bl.y, tsd->bl.x, tsd->bl.y)) < 9) + { + if (mode & 0x20 || + (tsd->sc_data[SC_TRICKDEAD].timer == -1 && + ((!pc_ishiding (tsd) && !tsd->state.gangsterparadise) + || race == 4 || race == 6))) + { // 妨害がないか判定 + if (mob_can_reach (smd, bl, 12) && // 到達可能性判定 + MRAND (1000) < 1000 / (++(*pcc))) + { // 範囲内PCで等確率にする + smd->target_id = tsd->bl.id; + smd->state.targettype = ATTACKABLE; + smd->min_chase = 13; + } + } + } + //対象がMobの場合 + else if (tmd && + tmd->bl.m == smd->bl.m && + (dist = + distance (smd->bl.x, smd->bl.y, tmd->bl.x, tmd->bl.y)) < 9) + { + if (mob_can_reach (smd, bl, 12) && // 到達可能性判定 + MRAND (1000) < 1000 / (++(*pcc))) + { // 範囲内で等確率にする + smd->target_id = bl->id; + smd->state.targettype = ATTACKABLE; + smd->min_chase = 13; + } + } + } + return 0; } /*========================================== * loot monster item search *------------------------------------------ */ -static int mob_ai_sub_hard_lootsearch(struct block_list *bl,va_list ap) +static int mob_ai_sub_hard_lootsearch (struct block_list *bl, va_list ap) { - struct mob_data* md; - int mode,dist,*itc; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, md=va_arg(ap,struct mob_data *)); - nullpo_retr(0, itc=va_arg(ap,int *)); - - if(!md->mode){ - mode=mob_db[md->class].mode; - }else{ - mode=md->mode; - } - - if( !md->target_id && mode&0x02){ - if(!md->lootitem || (battle_config.monster_loot_type == 1 && md->lootitem_count >= LOOTITEM_SIZE) ) - return 0; - if(bl->m == md->bl.m && (dist=distance(md->bl.x,md->bl.y,bl->x,bl->y))<9){ - if( mob_can_reach(md,bl,12) && // Reachability judging - MRAND(1000)<1000/(++(*itc)) ){ // It is made a probability, such as within the limits PC. - md->target_id=bl->id; - md->state.targettype = NONE_ATTACKABLE; - md->min_chase=13; - } - } - } - return 0; + struct mob_data *md; + int mode, dist, *itc; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, md = va_arg (ap, struct mob_data *)); + nullpo_retr (0, itc = va_arg (ap, int *)); + + if (!md->mode) + { + mode = mob_db[md->class].mode; + } + else + { + mode = md->mode; + } + + if (!md->target_id && mode & 0x02) + { + if (!md->lootitem + || (battle_config.monster_loot_type == 1 + && md->lootitem_count >= LOOTITEM_SIZE)) + return 0; + if (bl->m == md->bl.m + && (dist = distance (md->bl.x, md->bl.y, bl->x, bl->y)) < 9) + { + if (mob_can_reach (md, bl, 12) && // Reachability judging + MRAND (1000) < 1000 / (++(*itc))) + { // It is made a probability, such as within the limits PC. + md->target_id = bl->id; + md->state.targettype = NONE_ATTACKABLE; + md->min_chase = 13; + } + } + } + return 0; } /*========================================== * The ?? routine of a link monster *------------------------------------------ */ -static int mob_ai_sub_hard_linksearch(struct block_list *bl,va_list ap) +static int mob_ai_sub_hard_linksearch (struct block_list *bl, va_list ap) { - struct mob_data *tmd; - struct mob_data* md; - struct block_list *target; + struct mob_data *tmd; + struct mob_data *md; + struct block_list *target; - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, tmd=(struct mob_data *)bl); - nullpo_retr(0, md=va_arg(ap,struct mob_data *)); - nullpo_retr(0, target=va_arg(ap,struct block_list *)); + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, tmd = (struct mob_data *) bl); + nullpo_retr (0, md = va_arg (ap, struct mob_data *)); + nullpo_retr (0, target = va_arg (ap, struct block_list *)); - // same family free in a range at a link monster -- it will be made to lock if MOB is + // same family free in a range at a link monster -- it will be made to lock if MOB is /* if( (md->target_id > 0 && md->state.targettype == ATTACKABLE) && mob_db[md->class].mode&0x08){ if( tmd->class==md->class && (!tmd->target_id || md->state.targettype == NONE_ATTACKABLE) && tmd->bl.m == md->bl.m){ if( mob_can_reach(tmd,target,12) ){ // Reachability judging @@ -1510,118 +1697,149 @@ static int mob_ai_sub_hard_linksearch(struct block_list *bl,va_list ap) } } }*/ - if( md->attacked_id > 0 && mob_db[md->class].mode&0x08){ - if( tmd->class==md->class && tmd->bl.m == md->bl.m && (!tmd->target_id || md->state.targettype == NONE_ATTACKABLE)){ - if( mob_can_reach(tmd,target,12) ){ // Reachability judging - tmd->target_id=md->attacked_id; - tmd->state.targettype = ATTACKABLE; - tmd->min_chase=13; - } - } - } + if (md->attacked_id > 0 && mob_db[md->class].mode & 0x08) + { + if (tmd->class == md->class && tmd->bl.m == md->bl.m + && (!tmd->target_id || md->state.targettype == NONE_ATTACKABLE)) + { + if (mob_can_reach (tmd, target, 12)) + { // Reachability judging + tmd->target_id = md->attacked_id; + tmd->state.targettype = ATTACKABLE; + tmd->min_chase = 13; + } + } + } - return 0; + return 0; } + /*========================================== * Processing of slave monsters *------------------------------------------ */ -static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick) +static int mob_ai_sub_hard_slavemob (struct mob_data *md, unsigned int tick) { - struct mob_data *mmd=NULL; - struct block_list *bl; - int mode,race,old_dist; - - nullpo_retr(0, md); - - if((bl=map_id2bl(md->master_id)) != NULL ) - mmd=(struct mob_data *)bl; - - mode=mob_db[md->class].mode; - - // It is not main monster/leader. - if(!mmd || mmd->bl.type!=BL_MOB || mmd->bl.id!=md->master_id) - return 0; - - // Since it is in the map on which the master is not, teleport is carried out and it pursues. - if( mmd->bl.m != md->bl.m ){ - mob_warp(md,mmd->bl.m,mmd->bl.x,mmd->bl.y,3); - md->state.master_check = 1; - return 0; - } - - // Distance with between slave and master is measured. - old_dist=md->master_dist; - md->master_dist=distance(md->bl.x,md->bl.y,mmd->bl.x,mmd->bl.y); - - // Since the master was in near immediately before, teleport is carried out and it pursues. - if( old_dist<10 && md->master_dist>18){ - mob_warp(md,-1,mmd->bl.x,mmd->bl.y,3); - md->state.master_check = 1; - return 0; - } - - // Although there is the master, since it is somewhat far, it approaches. - if((!md->target_id || md->state.targettype == NONE_ATTACKABLE) && mob_can_move(md) && - (md->walkpath.path_pos>=md->walkpath.path_len || md->walkpath.path_len==0) && md->master_dist<15){ - int i=0,dx,dy,ret; - if(md->master_dist>4) { - do { - if(i<=5){ - dx=mmd->bl.x - md->bl.x; - dy=mmd->bl.y - md->bl.y; - if(dx<0) dx+=(MPRAND(1, ( (dx<-3)?3:-dx ))); - else if(dx>0) dx-=(MPRAND(1, ( (dx>3)?3:dx ))); - if(dy<0) dy+=(MPRAND(1, ( (dy<-3)?3:-dy ))); - else if(dy>0) dy-=(MPRAND(1, ( (dy>3)?3:dy ))); - }else{ - dx=mmd->bl.x - md->bl.x + MRAND(7) - 3; - dy=mmd->bl.y - md->bl.y + MRAND(7) - 3; - } - - ret=mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0); - i++; - } while(ret && i<10); - } - else { - do { - dx = MRAND(9) - 5; - dy = MRAND(9) - 5; - if( dx == 0 && dy == 0) { - dx = (MRAND(1))? 1:-1; - dy = (MRAND(1))? 1:-1; - } - dx += mmd->bl.x; - dy += mmd->bl.y; - - ret=mob_walktoxy(md,mmd->bl.x+dx,mmd->bl.y+dy,0); - i++; - } while(ret && i<10); - } - - md->next_walktime=tick+500; - md->state.master_check = 1; - } - - // There is the master, the master locks a target and he does not lock. - if( (mmd->target_id>0 && mmd->state.targettype == ATTACKABLE) && (!md->target_id || md->state.targettype == NONE_ATTACKABLE) ){ - struct map_session_data *sd=map_id2sd(mmd->target_id); - if(sd!=NULL && !pc_isdead(sd) && sd->invincible_timer == -1 && !pc_isinvisible(sd)){ - - race=mob_db[md->class].race; - if(mode&0x20 || - (sd->sc_data[SC_TRICKDEAD].timer == -1 && - ( (!pc_ishiding(sd) && !sd->state.gangsterparadise) || race==4 || race==6) ) ){ // 妨害がないか判定 + struct mob_data *mmd = NULL; + struct block_list *bl; + int mode, race, old_dist; + + nullpo_retr (0, md); + + if ((bl = map_id2bl (md->master_id)) != NULL) + mmd = (struct mob_data *) bl; + + mode = mob_db[md->class].mode; + + // It is not main monster/leader. + if (!mmd || mmd->bl.type != BL_MOB || mmd->bl.id != md->master_id) + return 0; + + // Since it is in the map on which the master is not, teleport is carried out and it pursues. + if (mmd->bl.m != md->bl.m) + { + mob_warp (md, mmd->bl.m, mmd->bl.x, mmd->bl.y, 3); + md->state.master_check = 1; + return 0; + } + + // Distance with between slave and master is measured. + old_dist = md->master_dist; + md->master_dist = distance (md->bl.x, md->bl.y, mmd->bl.x, mmd->bl.y); + + // Since the master was in near immediately before, teleport is carried out and it pursues. + if (old_dist < 10 && md->master_dist > 18) + { + mob_warp (md, -1, mmd->bl.x, mmd->bl.y, 3); + md->state.master_check = 1; + return 0; + } + + // Although there is the master, since it is somewhat far, it approaches. + if ((!md->target_id || md->state.targettype == NONE_ATTACKABLE) + && mob_can_move (md) + && (md->walkpath.path_pos >= md->walkpath.path_len + || md->walkpath.path_len == 0) && md->master_dist < 15) + { + int i = 0, dx, dy, ret; + if (md->master_dist > 4) + { + do + { + if (i <= 5) + { + dx = mmd->bl.x - md->bl.x; + dy = mmd->bl.y - md->bl.y; + if (dx < 0) + dx += (MPRAND (1, ((dx < -3) ? 3 : -dx))); + else if (dx > 0) + dx -= (MPRAND (1, ((dx > 3) ? 3 : dx))); + if (dy < 0) + dy += (MPRAND (1, ((dy < -3) ? 3 : -dy))); + else if (dy > 0) + dy -= (MPRAND (1, ((dy > 3) ? 3 : dy))); + } + else + { + dx = mmd->bl.x - md->bl.x + MRAND (7) - 3; + dy = mmd->bl.y - md->bl.y + MRAND (7) - 3; + } + + ret = mob_walktoxy (md, md->bl.x + dx, md->bl.y + dy, 0); + i++; + } + while (ret && i < 10); + } + else + { + do + { + dx = MRAND (9) - 5; + dy = MRAND (9) - 5; + if (dx == 0 && dy == 0) + { + dx = (MRAND (1)) ? 1 : -1; + dy = (MRAND (1)) ? 1 : -1; + } + dx += mmd->bl.x; + dy += mmd->bl.y; + + ret = mob_walktoxy (md, mmd->bl.x + dx, mmd->bl.y + dy, 0); + i++; + } + while (ret && i < 10); + } - md->target_id=sd->bl.id; - md->state.targettype = ATTACKABLE; - md->min_chase=5+distance(md->bl.x,md->bl.y,sd->bl.x,sd->bl.y); - md->state.master_check = 1; - } - } - } + md->next_walktime = tick + 500; + md->state.master_check = 1; + } + + // There is the master, the master locks a target and he does not lock. + if ((mmd->target_id > 0 && mmd->state.targettype == ATTACKABLE) + && (!md->target_id || md->state.targettype == NONE_ATTACKABLE)) + { + struct map_session_data *sd = map_id2sd (mmd->target_id); + if (sd != NULL && !pc_isdead (sd) && sd->invincible_timer == -1 + && !pc_isinvisible (sd)) + { + + race = mob_db[md->class].race; + if (mode & 0x20 || + (sd->sc_data[SC_TRICKDEAD].timer == -1 && + ((!pc_ishiding (sd) && !sd->state.gangsterparadise) + || race == 4 || race == 6))) + { // 妨害がないか判定 + + md->target_id = sd->bl.id; + md->state.targettype = ATTACKABLE; + md->min_chase = + 5 + distance (md->bl.x, md->bl.y, sd->bl.x, sd->bl.y); + md->state.master_check = 1; + } + } + } - // There is the master, the master locks a target and he does not lock. + // There is the master, the master locks a target and he does not lock. /* if( (md->target_id>0 && mmd->state.targettype == ATTACKABLE) && (!mmd->target_id || mmd->state.targettype == NONE_ATTACKABLE) ){ struct map_session_data *sd=map_id2sd(md->target_id); if(sd!=NULL && !pc_isdead(sd) && sd->invincible_timer == -1 && !pc_isinvisible(sd)){ @@ -1639,251 +1857,319 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick) } }*/ - return 0; + return 0; } /*========================================== * A lock of target is stopped and mob moves to a standby state. *------------------------------------------ */ -static int mob_unlocktarget(struct mob_data *md,int tick) +static int mob_unlocktarget (struct mob_data *md, int tick) { - nullpo_retr(0, md); + nullpo_retr (0, md); - md->target_id=0; - md->state.targettype = NONE_ATTACKABLE; - md->state.skillstate=MSS_IDLE; - md->next_walktime=tick+MPRAND(3000, 3000); - return 0; + md->target_id = 0; + md->state.targettype = NONE_ATTACKABLE; + md->state.skillstate = MSS_IDLE; + md->next_walktime = tick + MPRAND (3000, 3000); + return 0; } + /*========================================== * Random walk *------------------------------------------ */ -static int mob_randomwalk(struct mob_data *md,int tick) +static int mob_randomwalk (struct mob_data *md, int tick) { - const int retrycount=20; - int speed; - - nullpo_retr(0, md); - - speed=battle_get_speed(&md->bl); - if(DIFF_TICK(md->next_walktime,tick)<0){ - int i,x,y,c,d=12-md->move_fail_count; - if(d<5) d=5; - for(i=0;i<retrycount;i++){ // Search of a movable place - int r=mt_random(); - x=md->bl.x+r%(d*2+1)-d; - y=md->bl.y+r/(d*2+1)%(d*2+1)-d; - if((c=map_getcell(md->bl.m,x,y))!=1 && c!=5 && mob_walktoxy(md,x,y,1)==0){ - md->move_fail_count=0; - break; - } - if(i+1>=retrycount){ - md->move_fail_count++; - if(md->move_fail_count>1000){ - if(battle_config.error_log==1) - printf("MOB cant move. random spawn %d, class = %d\n",md->bl.id,md->class); - md->move_fail_count=0; - mob_spawn(md->bl.id); - } - } - } - for(i=c=0;i<md->walkpath.path_len;i++){ // The next walk start time is calculated. - if(md->walkpath.path[i]&1) - c+=speed*14/10; - else - c+=speed; - } - md->next_walktime = tick+MPRAND(3000, 3000)+c; - md->state.skillstate=MSS_WALK; - return 1; - } - return 0; + const int retrycount = 20; + int speed; + + nullpo_retr (0, md); + + speed = battle_get_speed (&md->bl); + if (DIFF_TICK (md->next_walktime, tick) < 0) + { + int i, x, y, c, d = 12 - md->move_fail_count; + if (d < 5) + d = 5; + for (i = 0; i < retrycount; i++) + { // Search of a movable place + int r = mt_random (); + x = md->bl.x + r % (d * 2 + 1) - d; + y = md->bl.y + r / (d * 2 + 1) % (d * 2 + 1) - d; + if ((c = map_getcell (md->bl.m, x, y)) != 1 && c != 5 + && mob_walktoxy (md, x, y, 1) == 0) + { + md->move_fail_count = 0; + break; + } + if (i + 1 >= retrycount) + { + md->move_fail_count++; + if (md->move_fail_count > 1000) + { + if (battle_config.error_log == 1) + printf + ("MOB cant move. random spawn %d, class = %d\n", + md->bl.id, md->class); + md->move_fail_count = 0; + mob_spawn (md->bl.id); + } + } + } + for (i = c = 0; i < md->walkpath.path_len; i++) + { // The next walk start time is calculated. + if (md->walkpath.path[i] & 1) + c += speed * 14 / 10; + else + c += speed; + } + md->next_walktime = tick + MPRAND (3000, 3000) + c; + md->state.skillstate = MSS_WALK; + return 1; + } + return 0; } /*========================================== * AI of MOB whose is near a Player *------------------------------------------ */ -static int mob_ai_sub_hard(struct block_list *bl,va_list ap) +static int mob_ai_sub_hard (struct block_list *bl, va_list ap) { - struct mob_data *md,*tmd=NULL; - struct map_session_data *tsd=NULL; - struct block_list *tbl=NULL; - struct flooritem_data *fitem; - unsigned int tick; - int i,dx,dy,ret,dist; - int attack_type=0; - int mode,race; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, md=(struct mob_data*)bl); - - tick=va_arg(ap,unsigned int); - - - if(DIFF_TICK(tick,md->last_thinktime)<MIN_MOBTHINKTIME) - return 0; - md->last_thinktime=tick; - - if( md->skilltimer!=-1 || md->bl.prev==NULL ){ // Under a skill aria and death - if(DIFF_TICK(tick,md->next_walktime)>MIN_MOBTHINKTIME) - md->next_walktime=tick; - return 0; - } - - if(!md->mode) - mode=mob_db[md->class].mode; - else - mode=md->mode; - - race=mob_db[md->class].race; - - // Abnormalities - if((md->opt1 > 0 && md->opt1 != 6) || md->state.state==MS_DELAY || md->sc_data[SC_BLADESTOP].timer != -1) - return 0; - - if(!(mode&0x80) && md->target_id > 0) - md->target_id = 0; - - if(md->attacked_id > 0 && mode&0x08){ // Link monster - struct map_session_data *asd=map_id2sd(md->attacked_id); - if(asd){ - if(asd->invincible_timer == -1 && !pc_isinvisible(asd)){ - map_foreachinarea(mob_ai_sub_hard_linksearch,md->bl.m, - md->bl.x-13,md->bl.y-13, - md->bl.x+13,md->bl.y+13, - BL_MOB,md,&asd->bl); - } - } - } - - // It checks to see it was attacked first (if active, it is target change at 25% of probability). - if( mode>0 && md->attacked_id>0 && (!md->target_id || md->state.targettype == NONE_ATTACKABLE - || (mode&0x04 && MRAND(100)<25 ) ) ){ - struct block_list *abl=map_id2bl(md->attacked_id); - struct map_session_data *asd=NULL; - if(abl){ - if(abl->type==BL_PC) - asd=(struct map_session_data *)abl; - if(asd==NULL || md->bl.m != abl->m || abl->prev == NULL || asd->invincible_timer != -1 || pc_isinvisible(asd) || - (dist=distance(md->bl.x,md->bl.y,abl->x,abl->y))>=32 || battle_check_target(bl,abl,BCT_ENEMY)==0) - md->attacked_id=0; - else { - md->target_id=md->attacked_id; // set target - md->state.targettype = ATTACKABLE; - attack_type = 1; - md->attacked_id=0; - md->min_chase=dist+13; - if(md->min_chase>26) - md->min_chase=26; - } - } - } - - md->state.master_check = 0; - // Processing of slave monster - if( md->master_id > 0 && md->state.special_mob_ai==0) - mob_ai_sub_hard_slavemob(md,tick); - - // アクティヴモンスターの策敵 (?? of a bitter taste TIVU monster) - if( (!md->target_id || md->state.targettype == NONE_ATTACKABLE) && mode&0x04 && !md->state.master_check && - battle_config.monster_active_enable==1){ - i=0; - if(md->state.special_mob_ai){ - map_foreachinarea(mob_ai_sub_hard_activesearch,md->bl.m, - md->bl.x-AREA_SIZE*2,md->bl.y-AREA_SIZE*2, - md->bl.x+AREA_SIZE*2,md->bl.y+AREA_SIZE*2, - 0,md,&i); - }else{ - map_foreachinarea(mob_ai_sub_hard_activesearch,md->bl.m, - md->bl.x-AREA_SIZE*2,md->bl.y-AREA_SIZE*2, - md->bl.x+AREA_SIZE*2,md->bl.y+AREA_SIZE*2, - BL_PC,md,&i); - } - } - - // The item search of a route monster - if( !md->target_id && mode&0x02 && !md->state.master_check){ - i=0; - map_foreachinarea(mob_ai_sub_hard_lootsearch,md->bl.m, - md->bl.x-AREA_SIZE*2,md->bl.y-AREA_SIZE*2, - md->bl.x+AREA_SIZE*2,md->bl.y+AREA_SIZE*2, - BL_ITEM,md,&i); - } - - // It will attack, if the candidate for an attack is. - if(md->target_id > 0){ - if((tbl=map_id2bl(md->target_id))){ - if(tbl->type==BL_PC) - tsd=(struct map_session_data *)tbl; - else if(tbl->type==BL_MOB) - tmd=(struct mob_data *)tbl; - if(tsd || tmd) { - if(tbl->m != md->bl.m || tbl->prev == NULL || (dist=distance(md->bl.x,md->bl.y,tbl->x,tbl->y))>=md->min_chase) - mob_unlocktarget(md,tick); // 別マップか、視界外 - else if( tsd && !(mode&0x20) && (tsd->sc_data[SC_TRICKDEAD].timer != -1 || ((pc_ishiding(tsd) || tsd->state.gangsterparadise) && race!=4 && race!=6)) ) - mob_unlocktarget(md,tick); // スキルなどによる策敵妨害 - else if(!battle_check_range(&md->bl,tbl,mob_db[md->class].range)){ - // 攻撃範囲外なので移動 - if(!(mode&1)){ // 移動しないモード - mob_unlocktarget(md,tick); - return 0; - } - if( !mob_can_move(md) ) // 動けない状態にある - return 0; - md->state.skillstate=MSS_CHASE; // 突撃時スキル - mobskill_use(md,tick,-1); -// if(md->timer != -1 && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tsd->bl.x,tsd->bl.y)<2) ) - if(md->timer != -1 && md->state.state!=MS_ATTACK && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tbl->x,tbl->y)<2) ) - return 0; // 既に移動中 - if( !mob_can_reach(md,tbl,(md->min_chase>13)?md->min_chase:13) ) - mob_unlocktarget(md,tick); // 移動できないのでタゲ解除(IWとか?) - else{ - // 追跡 - md->next_walktime=tick+500; - i=0; - do { - if(i==0){ // 最初はAEGISと同じ方法で検索 - dx=tbl->x - md->bl.x; - dy=tbl->y - md->bl.y; - if(dx<0) dx++; - else if(dx>0) dx--; - if(dy<0) dy++; - else if(dy>0) dy--; - }else{ // だめならAthena式(ランダム) - dx=tbl->x - md->bl.x + MRAND(3) - 1; - dy=tbl->y - md->bl.y + MRAND(3) - 1; - } - /* if(path_search(&md->walkpath,md->bl.m,md->bl.x,md->bl.y,md->bl.x+dx,md->bl.y+dy,0)){ - dx=tsd->bl.x - md->bl.x; - dy=tsd->bl.y - md->bl.y; - if(dx<0) dx--; - else if(dx>0) dx++; - if(dy<0) dy--; - else if(dy>0) dy++; - }*/ - ret=mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0); - i++; - } while(ret && i<5); - - if(ret){ // 移動不可能な所からの攻撃なら2歩下る - if(dx<0) dx=2; - else if(dx>0) dx=-2; - if(dy<0) dy=2; - else if(dy>0) dy=-2; - mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0); - } - } - } else { // 攻撃射程範囲内 - md->state.skillstate=MSS_ATTACK; - if(md->state.state==MS_WALK) - mob_stop_walking(md,1); // 歩行中なら停止 - if(md->state.state==MS_ATTACK) - return 0; // 既に攻撃中 - mob_changestate(md,MS_ATTACK,attack_type); + struct mob_data *md, *tmd = NULL; + struct map_session_data *tsd = NULL; + struct block_list *tbl = NULL; + struct flooritem_data *fitem; + unsigned int tick; + int i, dx, dy, ret, dist; + int attack_type = 0; + int mode, race; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, md = (struct mob_data *) bl); + + tick = va_arg (ap, unsigned int); + + if (DIFF_TICK (tick, md->last_thinktime) < MIN_MOBTHINKTIME) + return 0; + md->last_thinktime = tick; + + if (md->skilltimer != -1 || md->bl.prev == NULL) + { // Under a skill aria and death + if (DIFF_TICK (tick, md->next_walktime) > MIN_MOBTHINKTIME) + md->next_walktime = tick; + return 0; + } + + if (!md->mode) + mode = mob_db[md->class].mode; + else + mode = md->mode; + + race = mob_db[md->class].race; + + // Abnormalities + if ((md->opt1 > 0 && md->opt1 != 6) || md->state.state == MS_DELAY + || md->sc_data[SC_BLADESTOP].timer != -1) + return 0; + + if (!(mode & 0x80) && md->target_id > 0) + md->target_id = 0; + + if (md->attacked_id > 0 && mode & 0x08) + { // Link monster + struct map_session_data *asd = map_id2sd (md->attacked_id); + if (asd) + { + if (asd->invincible_timer == -1 && !pc_isinvisible (asd)) + { + map_foreachinarea (mob_ai_sub_hard_linksearch, md->bl.m, + md->bl.x - 13, md->bl.y - 13, + md->bl.x + 13, md->bl.y + 13, + BL_MOB, md, &asd->bl); + } + } + } + + // It checks to see it was attacked first (if active, it is target change at 25% of probability). + if (mode > 0 && md->attacked_id > 0 + && (!md->target_id || md->state.targettype == NONE_ATTACKABLE + || (mode & 0x04 && MRAND (100) < 25))) + { + struct block_list *abl = map_id2bl (md->attacked_id); + struct map_session_data *asd = NULL; + if (abl) + { + if (abl->type == BL_PC) + asd = (struct map_session_data *) abl; + if (asd == NULL || md->bl.m != abl->m || abl->prev == NULL + || asd->invincible_timer != -1 || pc_isinvisible (asd) + || (dist = + distance (md->bl.x, md->bl.y, abl->x, abl->y)) >= 32 + || battle_check_target (bl, abl, BCT_ENEMY) == 0) + md->attacked_id = 0; + else + { + md->target_id = md->attacked_id; // set target + md->state.targettype = ATTACKABLE; + attack_type = 1; + md->attacked_id = 0; + md->min_chase = dist + 13; + if (md->min_chase > 26) + md->min_chase = 26; + } + } + } + + md->state.master_check = 0; + // Processing of slave monster + if (md->master_id > 0 && md->state.special_mob_ai == 0) + mob_ai_sub_hard_slavemob (md, tick); + + // アクティヴモンスターの策敵 (?? of a bitter taste TIVU monster) + if ((!md->target_id || md->state.targettype == NONE_ATTACKABLE) + && mode & 0x04 && !md->state.master_check + && battle_config.monster_active_enable == 1) + { + i = 0; + if (md->state.special_mob_ai) + { + map_foreachinarea (mob_ai_sub_hard_activesearch, md->bl.m, + md->bl.x - AREA_SIZE * 2, + md->bl.y - AREA_SIZE * 2, + md->bl.x + AREA_SIZE * 2, + md->bl.y + AREA_SIZE * 2, 0, md, &i); + } + else + { + map_foreachinarea (mob_ai_sub_hard_activesearch, md->bl.m, + md->bl.x - AREA_SIZE * 2, + md->bl.y - AREA_SIZE * 2, + md->bl.x + AREA_SIZE * 2, + md->bl.y + AREA_SIZE * 2, BL_PC, md, &i); + } + } + + // The item search of a route monster + if (!md->target_id && mode & 0x02 && !md->state.master_check) + { + i = 0; + map_foreachinarea (mob_ai_sub_hard_lootsearch, md->bl.m, + md->bl.x - AREA_SIZE * 2, md->bl.y - AREA_SIZE * 2, + md->bl.x + AREA_SIZE * 2, md->bl.y + AREA_SIZE * 2, + BL_ITEM, md, &i); + } + + // It will attack, if the candidate for an attack is. + if (md->target_id > 0) + { + if ((tbl = map_id2bl (md->target_id))) + { + if (tbl->type == BL_PC) + tsd = (struct map_session_data *) tbl; + else if (tbl->type == BL_MOB) + tmd = (struct mob_data *) tbl; + if (tsd || tmd) + { + if (tbl->m != md->bl.m || tbl->prev == NULL + || (dist = + distance (md->bl.x, md->bl.y, tbl->x, + tbl->y)) >= md->min_chase) + mob_unlocktarget (md, tick); // 別マップか、視界外 + else if (tsd && !(mode & 0x20) + && (tsd->sc_data[SC_TRICKDEAD].timer != -1 + || + ((pc_ishiding (tsd) + || tsd->state.gangsterparadise) && race != 4 + && race != 6))) + mob_unlocktarget (md, tick); // スキルなどによる策敵妨害 + else if (!battle_check_range + (&md->bl, tbl, mob_db[md->class].range)) + { + // 攻撃範囲外なので移動 + if (!(mode & 1)) + { // 移動しないモード + mob_unlocktarget (md, tick); + return 0; + } + if (!mob_can_move (md)) // 動けない状態にある + return 0; + md->state.skillstate = MSS_CHASE; // 突撃時スキル + mobskill_use (md, tick, -1); +// if(md->timer != -1 && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tsd->bl.x,tsd->bl.y)<2) ) + if (md->timer != -1 && md->state.state != MS_ATTACK + && (DIFF_TICK (md->next_walktime, tick) < 0 + || distance (md->to_x, md->to_y, tbl->x, + tbl->y) < 2)) + return 0; // 既に移動中 + if (!mob_can_reach + (md, tbl, (md->min_chase > 13) ? md->min_chase : 13)) + mob_unlocktarget (md, tick); // 移動できないのでタゲ解除(IWとか?) + else + { + // 追跡 + md->next_walktime = tick + 500; + i = 0; + do + { + if (i == 0) + { // 最初はAEGISと同じ方法で検索 + dx = tbl->x - md->bl.x; + dy = tbl->y - md->bl.y; + if (dx < 0) + dx++; + else if (dx > 0) + dx--; + if (dy < 0) + dy++; + else if (dy > 0) + dy--; + } + else + { // だめならAthena式(ランダム) + dx = tbl->x - md->bl.x + MRAND (3) - 1; + dy = tbl->y - md->bl.y + MRAND (3) - 1; + } + /* if(path_search(&md->walkpath,md->bl.m,md->bl.x,md->bl.y,md->bl.x+dx,md->bl.y+dy,0)){ + * dx=tsd->bl.x - md->bl.x; + * dy=tsd->bl.y - md->bl.y; + * if(dx<0) dx--; + * else if(dx>0) dx++; + * if(dy<0) dy--; + * else if(dy>0) dy++; + * } */ + ret = + mob_walktoxy (md, md->bl.x + dx, + md->bl.y + dy, 0); + i++; + } + while (ret && i < 5); + + if (ret) + { // 移動不可能な所からの攻撃なら2歩下る + if (dx < 0) + dx = 2; + else if (dx > 0) + dx = -2; + if (dy < 0) + dy = 2; + else if (dy > 0) + dy = -2; + mob_walktoxy (md, md->bl.x + dx, md->bl.y + dy, + 0); + } + } + } + else + { // 攻撃射程範囲内 + md->state.skillstate = MSS_ATTACK; + if (md->state.state == MS_WALK) + mob_stop_walking (md, 1); // 歩行中なら停止 + if (md->state.state == MS_ATTACK) + return 0; // 既に攻撃中 + mob_changestate (md, MS_ATTACK, attack_type); /* if(mode&0x08){ // リンクモンスター map_foreachinarea(mob_ai_sub_hard_linksearch,md->bl.m, @@ -1891,633 +2177,735 @@ static int mob_ai_sub_hard(struct block_list *bl,va_list ap) md->bl.x+13,md->bl.y+13, BL_MOB,md,&tsd->bl); }*/ - } - return 0; - }else{ // ルートモンスター処理 - if(tbl == NULL || tbl->type != BL_ITEM ||tbl->m != md->bl.m || - (dist=distance(md->bl.x,md->bl.y,tbl->x,tbl->y))>=md->min_chase || !md->lootitem){ - // 遠すぎるかアイテムがなくなった - mob_unlocktarget(md,tick); - if(md->state.state==MS_WALK) - mob_stop_walking(md,1); // 歩行中なら停止 - }else if(dist){ - if(!(mode&1)){ // 移動しないモード - mob_unlocktarget(md,tick); - return 0; - } - if( !mob_can_move(md) ) // 動けない状態にある - return 0; - md->state.skillstate=MSS_LOOT; // ルート時スキル使用 - mobskill_use(md,tick,-1); -// if(md->timer != -1 && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tbl->x,tbl->y)<2) ) - if(md->timer != -1 && md->state.state!=MS_ATTACK && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tbl->x,tbl->y) <= 0)) - return 0; // 既に移動中 - md->next_walktime=tick+500; - dx=tbl->x - md->bl.x; - dy=tbl->y - md->bl.y; + } + return 0; + } + else + { // ルートモンスター処理 + if (tbl == NULL || tbl->type != BL_ITEM || tbl->m != md->bl.m + || (dist = + distance (md->bl.x, md->bl.y, tbl->x, + tbl->y)) >= md->min_chase || !md->lootitem) + { + // 遠すぎるかアイテムがなくなった + mob_unlocktarget (md, tick); + if (md->state.state == MS_WALK) + mob_stop_walking (md, 1); // 歩行中なら停止 + } + else if (dist) + { + if (!(mode & 1)) + { // 移動しないモード + mob_unlocktarget (md, tick); + return 0; + } + if (!mob_can_move (md)) // 動けない状態にある + return 0; + md->state.skillstate = MSS_LOOT; // ルート時スキル使用 + mobskill_use (md, tick, -1); +// if(md->timer != -1 && (DIFF_TICK(md->next_walktime,tick)<0 || distance(md->to_x,md->to_y,tbl->x,tbl->y)<2) ) + if (md->timer != -1 && md->state.state != MS_ATTACK + && (DIFF_TICK (md->next_walktime, tick) < 0 + || distance (md->to_x, md->to_y, tbl->x, + tbl->y) <= 0)) + return 0; // 既に移動中 + md->next_walktime = tick + 500; + dx = tbl->x - md->bl.x; + dy = tbl->y - md->bl.y; /* if(path_search(&md->walkpath,md->bl.m,md->bl.x,md->bl.y,md->bl.x+dx,md->bl.y+dy,0)){ dx=tbl->x - md->bl.x; dy=tbl->y - md->bl.y; }*/ - ret=mob_walktoxy(md,md->bl.x+dx,md->bl.y+dy,0); - if(ret) - mob_unlocktarget(md,tick);// 移動できないのでタゲ解除(IWとか?) - }else{ // アイテムまでたどり着いた - if(md->state.state==MS_ATTACK) - return 0; // 攻撃中 - if(md->state.state==MS_WALK) - mob_stop_walking(md,1); // 歩行中なら停止 - fitem = (struct flooritem_data *)tbl; - if(md->lootitem_count < LOOTITEM_SIZE) - memcpy(&md->lootitem[md->lootitem_count++],&fitem->item_data,sizeof(md->lootitem[0])); - else if(battle_config.monster_loot_type == 1 && md->lootitem_count >= LOOTITEM_SIZE) { - mob_unlocktarget(md,tick); - return 0; - } - else { - for(i=0;i<LOOTITEM_SIZE-1;i++) - memcpy(&md->lootitem[i],&md->lootitem[i+1],sizeof(md->lootitem[0])); - memcpy(&md->lootitem[LOOTITEM_SIZE-1],&fitem->item_data,sizeof(md->lootitem[0])); - } - map_clearflooritem(tbl->id); - mob_unlocktarget(md,tick); - } - return 0; - } - }else{ - mob_unlocktarget(md,tick); - if(md->state.state==MS_WALK) - mob_stop_walking(md,4); // 歩行中なら停止 - return 0; - } - } - - // It is skill use at the time of /standby at the time of a walk. - if( mobskill_use(md,tick,-1) ) - return 0; - - // 歩行処理 - if( mode&1 && mob_can_move(md) && // 移動可能MOB&動ける状態にある - (md->master_id==0 || md->state.special_mob_ai || md->master_dist>10) ){ //取り巻きMOBじゃない - - if( DIFF_TICK(md->next_walktime,tick) > + 7000 && - (md->walkpath.path_len==0 || md->walkpath.path_pos>=md->walkpath.path_len) ){ - md->next_walktime = tick + 3000*MRAND(2000); - } + ret = mob_walktoxy (md, md->bl.x + dx, md->bl.y + dy, 0); + if (ret) + mob_unlocktarget (md, tick); // 移動できないのでタゲ解除(IWとか?) + } + else + { // アイテムまでたどり着いた + if (md->state.state == MS_ATTACK) + return 0; // 攻撃中 + if (md->state.state == MS_WALK) + mob_stop_walking (md, 1); // 歩行中なら停止 + fitem = (struct flooritem_data *) tbl; + if (md->lootitem_count < LOOTITEM_SIZE) + memcpy (&md->lootitem[md->lootitem_count++], + &fitem->item_data, sizeof (md->lootitem[0])); + else if (battle_config.monster_loot_type == 1 + && md->lootitem_count >= LOOTITEM_SIZE) + { + mob_unlocktarget (md, tick); + return 0; + } + else + { + for (i = 0; i < LOOTITEM_SIZE - 1; i++) + memcpy (&md->lootitem[i], &md->lootitem[i + 1], + sizeof (md->lootitem[0])); + memcpy (&md->lootitem[LOOTITEM_SIZE - 1], + &fitem->item_data, sizeof (md->lootitem[0])); + } + map_clearflooritem (tbl->id); + mob_unlocktarget (md, tick); + } + return 0; + } + } + else + { + mob_unlocktarget (md, tick); + if (md->state.state == MS_WALK) + mob_stop_walking (md, 4); // 歩行中なら停止 + return 0; + } + } + + // It is skill use at the time of /standby at the time of a walk. + if (mobskill_use (md, tick, -1)) + return 0; + + // 歩行処理 + if (mode & 1 && mob_can_move (md) && // 移動可能MOB&動ける状態にある + (md->master_id == 0 || md->state.special_mob_ai + || md->master_dist > 10)) + { //取り巻きMOBじゃない + + if (DIFF_TICK (md->next_walktime, tick) > +7000 && + (md->walkpath.path_len == 0 + || md->walkpath.path_pos >= md->walkpath.path_len)) + { + md->next_walktime = tick + 3000 * MRAND (2000); + } - // Random movement - if( mob_randomwalk(md,tick) ) - return 0; - } + // Random movement + if (mob_randomwalk (md, tick)) + return 0; + } - // Since he has finished walking, it stands by. - if( md->walkpath.path_len==0 || md->walkpath.path_pos>=md->walkpath.path_len ) - md->state.skillstate=MSS_IDLE; - return 0; + // Since he has finished walking, it stands by. + if (md->walkpath.path_len == 0 + || md->walkpath.path_pos >= md->walkpath.path_len) + md->state.skillstate = MSS_IDLE; + return 0; } /*========================================== * Serious processing for mob in PC field of view (foreachclient) *------------------------------------------ */ -static int mob_ai_sub_foreachclient(struct map_session_data *sd,va_list ap) +static int mob_ai_sub_foreachclient (struct map_session_data *sd, va_list ap) { - unsigned int tick; - nullpo_retr(0, sd); - nullpo_retr(0, ap); + unsigned int tick; + nullpo_retr (0, sd); + nullpo_retr (0, ap); - tick=va_arg(ap,unsigned int); - map_foreachinarea(mob_ai_sub_hard,sd->bl.m, - sd->bl.x-AREA_SIZE*2,sd->bl.y-AREA_SIZE*2, - sd->bl.x+AREA_SIZE*2,sd->bl.y+AREA_SIZE*2, - BL_MOB,tick); + tick = va_arg (ap, unsigned int); + map_foreachinarea (mob_ai_sub_hard, sd->bl.m, + sd->bl.x - AREA_SIZE * 2, sd->bl.y - AREA_SIZE * 2, + sd->bl.x + AREA_SIZE * 2, sd->bl.y + AREA_SIZE * 2, + BL_MOB, tick); - return 0; + return 0; } /*========================================== * Serious processing for mob in PC field of view (interval timer function) *------------------------------------------ */ -static int mob_ai_hard(int tid,unsigned int tick,int id,int data) +static int mob_ai_hard (int tid, unsigned int tick, int id, int data) { - clif_foreachclient(mob_ai_sub_foreachclient,tick); + clif_foreachclient (mob_ai_sub_foreachclient, tick); - return 0; + return 0; } /*========================================== * Negligent mode MOB AI (PC is not in near) *------------------------------------------ */ -static int mob_ai_sub_lazy(void * key,void * data,va_list app) +static int mob_ai_sub_lazy (void *key, void *data, va_list app) { - struct mob_data *md=data; - unsigned int tick; - va_list ap; - - nullpo_retr(0, md); - nullpo_retr(0, app); - nullpo_retr(0, ap=va_arg(app,va_list)); + struct mob_data *md = data; + unsigned int tick; + va_list ap; - if(md==NULL) - return 0; + nullpo_retr (0, md); + nullpo_retr (0, app); + nullpo_retr (0, ap = va_arg (app, va_list)); - if(!md->bl.type || md->bl.type!=BL_MOB) - return 0; + if (md == NULL) + return 0; - tick=va_arg(ap,unsigned int); + if (!md->bl.type || md->bl.type != BL_MOB) + return 0; - if(DIFF_TICK(tick,md->last_thinktime)<MIN_MOBTHINKTIME*10) - return 0; - md->last_thinktime=tick; + tick = va_arg (ap, unsigned int); - if(md->bl.prev==NULL || md->skilltimer!=-1){ - if(DIFF_TICK(tick,md->next_walktime)>MIN_MOBTHINKTIME*10) - md->next_walktime=tick; - return 0; - } + if (DIFF_TICK (tick, md->last_thinktime) < MIN_MOBTHINKTIME * 10) + return 0; + md->last_thinktime = tick; - if(DIFF_TICK(md->next_walktime,tick)<0 && - (mob_db[md->class].mode&1) && mob_can_move(md) ){ + if (md->bl.prev == NULL || md->skilltimer != -1) + { + if (DIFF_TICK (tick, md->next_walktime) > MIN_MOBTHINKTIME * 10) + md->next_walktime = tick; + return 0; + } - if( map[md->bl.m].users>0 ){ - // Since PC is in the same map, somewhat better negligent processing is carried out. + if (DIFF_TICK (md->next_walktime, tick) < 0 && + (mob_db[md->class].mode & 1) && mob_can_move (md)) + { - // It sometimes moves. - if(MRAND(1000)<MOB_LAZYMOVEPERC) - mob_randomwalk(md,tick); + if (map[md->bl.m].users > 0) + { + // Since PC is in the same map, somewhat better negligent processing is carried out. - // MOB which is not not the summons MOB but BOSS, either sometimes reboils. - else if( MRAND(1000)<MOB_LAZYWARPPERC && md->x0<=0 && md->master_id!=0 && - mob_db[md->class].mexp <= 0 && !(mob_db[md->class].mode & 0x20)) - mob_spawn(md->bl.id); + // It sometimes moves. + if (MRAND (1000) < MOB_LAZYMOVEPERC) + mob_randomwalk (md, tick); - }else{ - // Since PC is not even in the same map, suitable processing is carried out even if it takes. + // MOB which is not not the summons MOB but BOSS, either sometimes reboils. + else if (MRAND (1000) < MOB_LAZYWARPPERC && md->x0 <= 0 + && md->master_id != 0 && mob_db[md->class].mexp <= 0 + && !(mob_db[md->class].mode & 0x20)) + mob_spawn (md->bl.id); - // MOB which is not BOSS which is not Summons MOB, either -- a case -- sometimes -- leaping - if( MRAND(1000)<MOB_LAZYWARPPERC && md->x0<=0 && md->master_id!=0 && - mob_db[md->class].mexp <= 0 && !(mob_db[md->class].mode & 0x20)) - mob_warp(md,-1,-1,-1,-1); - } + } + else + { + // Since PC is not even in the same map, suitable processing is carried out even if it takes. + + // MOB which is not BOSS which is not Summons MOB, either -- a case -- sometimes -- leaping + if (MRAND (1000) < MOB_LAZYWARPPERC && md->x0 <= 0 + && md->master_id != 0 && mob_db[md->class].mexp <= 0 + && !(mob_db[md->class].mode & 0x20)) + mob_warp (md, -1, -1, -1, -1); + } - md->next_walktime = tick+MPRAND(5000, 10000); - } - return 0; + md->next_walktime = tick + MPRAND (5000, 10000); + } + return 0; } /*========================================== * Negligent processing for mob outside PC field of view (interval timer function) *------------------------------------------ */ -static int mob_ai_lazy(int tid,unsigned int tick,int id,int data) +static int mob_ai_lazy (int tid, unsigned int tick, int id, int data) { - map_foreachiddb(mob_ai_sub_lazy,tick); + map_foreachiddb (mob_ai_sub_lazy, tick); - return 0; + return 0; } - /*========================================== * The structure object for item drop with delay * Since it is only two being able to pass [ int ] a timer function * Data is put in and passed to this structure object. *------------------------------------------ */ -struct delay_item_drop { - int m,x,y; - int nameid,amount; - struct map_session_data *first_sd,*second_sd,*third_sd; +struct delay_item_drop +{ + int m, x, y; + int nameid, amount; + struct map_session_data *first_sd, *second_sd, *third_sd; }; -struct delay_item_drop2 { - int m,x,y; - struct item item_data; - struct map_session_data *first_sd,*second_sd,*third_sd; +struct delay_item_drop2 +{ + int m, x, y; + struct item item_data; + struct map_session_data *first_sd, *second_sd, *third_sd; }; /*========================================== * item drop with delay (timer function) *------------------------------------------ */ -static int mob_delay_item_drop(int tid,unsigned int tick,int id,int data) +static int mob_delay_item_drop (int tid, unsigned int tick, int id, int data) { - struct delay_item_drop *ditem; - struct item temp_item; - int flag; - - nullpo_retr(0, ditem=(struct delay_item_drop *)id); - - memset(&temp_item,0,sizeof(temp_item)); - temp_item.nameid = ditem->nameid; - temp_item.amount = ditem->amount; - temp_item.identify = !itemdb_isequip3(temp_item.nameid); - - if(battle_config.item_auto_get==1){ - if(ditem->first_sd && (flag = pc_additem(ditem->first_sd,&temp_item,ditem->amount))){ - clif_additem(ditem->first_sd,0,0,flag); - map_addflooritem(&temp_item,1,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0); - } - free(ditem); - return 0; - } + struct delay_item_drop *ditem; + struct item temp_item; + int flag; + + nullpo_retr (0, ditem = (struct delay_item_drop *) id); + + memset (&temp_item, 0, sizeof (temp_item)); + temp_item.nameid = ditem->nameid; + temp_item.amount = ditem->amount; + temp_item.identify = !itemdb_isequip3 (temp_item.nameid); + + if (battle_config.item_auto_get == 1) + { + if (ditem->first_sd + && (flag = + pc_additem (ditem->first_sd, &temp_item, ditem->amount))) + { + clif_additem (ditem->first_sd, 0, 0, flag); + map_addflooritem (&temp_item, 1, ditem->m, ditem->x, ditem->y, + ditem->first_sd, ditem->second_sd, + ditem->third_sd, 0); + } + free (ditem); + return 0; + } - map_addflooritem(&temp_item,1,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0); + map_addflooritem (&temp_item, 1, ditem->m, ditem->x, ditem->y, + ditem->first_sd, ditem->second_sd, ditem->third_sd, 0); - free(ditem); - return 0; + free (ditem); + return 0; } /*========================================== * item drop (timer function)-lootitem with delay *------------------------------------------ */ -static int mob_delay_item_drop2(int tid,unsigned int tick,int id,int data) +static int mob_delay_item_drop2 (int tid, unsigned int tick, int id, int data) { - struct delay_item_drop2 *ditem; - int flag; - - nullpo_retr(0, ditem=(struct delay_item_drop2 *)id); - - if(battle_config.item_auto_get==1){ - if(ditem->first_sd && (flag = pc_additem(ditem->first_sd,&ditem->item_data,ditem->item_data.amount))){ - clif_additem(ditem->first_sd,0,0,flag); - map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0); - } - free(ditem); - return 0; - } + struct delay_item_drop2 *ditem; + int flag; + + nullpo_retr (0, ditem = (struct delay_item_drop2 *) id); + + if (battle_config.item_auto_get == 1) + { + if (ditem->first_sd + && (flag = + pc_additem (ditem->first_sd, &ditem->item_data, + ditem->item_data.amount))) + { + clif_additem (ditem->first_sd, 0, 0, flag); + map_addflooritem (&ditem->item_data, ditem->item_data.amount, + ditem->m, ditem->x, ditem->y, ditem->first_sd, + ditem->second_sd, ditem->third_sd, 0); + } + free (ditem); + return 0; + } - map_addflooritem(&ditem->item_data,ditem->item_data.amount,ditem->m,ditem->x,ditem->y,ditem->first_sd,ditem->second_sd,ditem->third_sd,0); + map_addflooritem (&ditem->item_data, ditem->item_data.amount, ditem->m, + ditem->x, ditem->y, ditem->first_sd, ditem->second_sd, + ditem->third_sd, 0); - free(ditem); - return 0; + free (ditem); + return 0; } /*========================================== * mob data is erased. *------------------------------------------ */ -int mob_delete(struct mob_data *md) +int mob_delete (struct mob_data *md) { - nullpo_retr(1, md); - - if(md->bl.prev == NULL) - return 1; - mob_changestate(md,MS_DEAD,0); - clif_clearchar_area(&md->bl,1); - map_delblock(&md->bl); - if(mob_get_viewclass(md->class) <= 1000) - clif_clearchar_delay(gettick()+3000,&md->bl,0); - mob_deleteslave(md); - mob_setdelayspawn(md->bl.id); - return 0; + nullpo_retr (1, md); + + if (md->bl.prev == NULL) + return 1; + mob_changestate (md, MS_DEAD, 0); + clif_clearchar_area (&md->bl, 1); + map_delblock (&md->bl); + if (mob_get_viewclass (md->class) <= 1000) + clif_clearchar_delay (gettick () + 3000, &md->bl, 0); + mob_deleteslave (md); + mob_setdelayspawn (md->bl.id); + return 0; } -int mob_catch_delete(struct mob_data *md,int type) +int mob_catch_delete (struct mob_data *md, int type) { - nullpo_retr(1, md); - - if(md->bl.prev == NULL) - return 1; - mob_changestate(md,MS_DEAD,0); - clif_clearchar_area(&md->bl,type); - map_delblock(&md->bl); - mob_setdelayspawn(md->bl.id); - return 0; + nullpo_retr (1, md); + + if (md->bl.prev == NULL) + return 1; + mob_changestate (md, MS_DEAD, 0); + clif_clearchar_area (&md->bl, type); + map_delblock (&md->bl); + mob_setdelayspawn (md->bl.id); + return 0; } -int mob_timer_delete(int tid, unsigned int tick, int id, int data) +int mob_timer_delete (int tid, unsigned int tick, int id, int data) { - struct block_list *bl=map_id2bl(id); - struct mob_data *md; + struct block_list *bl = map_id2bl (id); + struct mob_data *md; - nullpo_retr(0, bl); + nullpo_retr (0, bl); - md = (struct mob_data *)bl; - mob_catch_delete(md,3); - return 0; + md = (struct mob_data *) bl; + mob_catch_delete (md, 3); + return 0; } /*========================================== * *------------------------------------------ */ -int mob_deleteslave_sub(struct block_list *bl,va_list ap) +int mob_deleteslave_sub (struct block_list *bl, va_list ap) { - struct mob_data *md; - int id; + struct mob_data *md; + int id; - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, md = (struct mob_data *)bl); + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, md = (struct mob_data *) bl); - id=va_arg(ap,int); - if(md->master_id > 0 && md->master_id == id ) - mob_damage(NULL,md,md->hp,1); - return 0; + id = va_arg (ap, int); + if (md->master_id > 0 && md->master_id == id) + mob_damage (NULL, md, md->hp, 1); + return 0; } + /*========================================== * *------------------------------------------ */ -int mob_deleteslave(struct mob_data *md) +int mob_deleteslave (struct mob_data *md) { - nullpo_retr(0, md); + nullpo_retr (0, md); - map_foreachinarea(mob_deleteslave_sub, md->bl.m, - 0,0,map[md->bl.m].xs,map[md->bl.m].ys, - BL_MOB,md->bl.id); - return 0; + map_foreachinarea (mob_deleteslave_sub, md->bl.m, + 0, 0, map[md->bl.m].xs, map[md->bl.m].ys, + BL_MOB, md->bl.id); + return 0; } -#define DAMAGE_BONUS_COUNT 6 // max. number of players to account for +#define DAMAGE_BONUS_COUNT 6 // max. number of players to account for const static double damage_bonus_factor[DAMAGE_BONUS_COUNT + 1] = { - 1.0, 1.0, 2.0, 2.5, 2.75, 2.9, 3.0 + 1.0, 1.0, 2.0, 2.5, 2.75, 2.9, 3.0 }; /*========================================== * It is the damage of sd to damage to md. *------------------------------------------ */ -int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type) +int mob_damage (struct block_list *src, struct mob_data *md, int damage, + int type) { - int i,count,minpos,mindmg; - struct map_session_data *sd = NULL,*tmpsd[DAMAGELOG_SIZE]; - struct { - struct party *p; - int id,base_exp,job_exp; - } pt[DAMAGELOG_SIZE]; - int pnum=0; - int mvp_damage,max_hp; - unsigned int tick = gettick(); - struct map_session_data *mvp_sd = NULL, *second_sd = NULL,*third_sd = NULL; - double dmg_rate,tdmg,temp; - struct item item; - int ret; - int drop_rate; - int skill,sp; - - nullpo_retr(0, md); //srcはNULLで呼ばれる場合もあるので、他でチェック - - if (src && src->id == md->master_id - && md->mode & MOB_MODE_TURNS_AGAINST_BAD_MASTER) { - /* If the master hits a monster, have the monster turn against him */ - md->master_id = 0; - md->mode = 0x85; /* Regular war mode */ - md->target_id = src->id; - md->attacked_id = src->id; + int i, count, minpos, mindmg; + struct map_session_data *sd = NULL, *tmpsd[DAMAGELOG_SIZE]; + struct + { + struct party *p; + int id, base_exp, job_exp; + } pt[DAMAGELOG_SIZE]; + int pnum = 0; + int mvp_damage, max_hp; + unsigned int tick = gettick (); + struct map_session_data *mvp_sd = NULL, *second_sd = NULL, *third_sd = + NULL; + double dmg_rate, tdmg, temp; + struct item item; + int ret; + int drop_rate; + int skill, sp; + + nullpo_retr (0, md); //srcはNULLで呼ばれる場合もあるので、他でチェック + + if (src && src->id == md->master_id + && md->mode & MOB_MODE_TURNS_AGAINST_BAD_MASTER) + { + /* If the master hits a monster, have the monster turn against him */ + md->master_id = 0; + md->mode = 0x85; /* Regular war mode */ + md->target_id = src->id; + md->attacked_id = src->id; + } + + max_hp = battle_get_max_hp (&md->bl); + + if (src && src->type == BL_PC) + { + sd = (struct map_session_data *) src; + mvp_sd = sd; + } + +// if(battle_config.battle_log) +// printf("mob_damage %d %d %d\n",md->hp,max_hp,damage); + if (md->bl.prev == NULL) + { + if (battle_config.error_log == 1) + printf ("mob_damage : BlockError!!\n"); + return 0; + } + + if (md->state.state == MS_DEAD || md->hp <= 0) + { + if (md->bl.prev != NULL) + { + mob_changestate (md, MS_DEAD, 0); + mobskill_use (md, tick, -1); // It is skill at the time of death. + clif_clearchar_area (&md->bl, 1); + map_delblock (&md->bl); + mob_setdelayspawn (md->bl.id); + } + return 0; + } + + if (md->sc_data[SC_ENDURE].timer == -1) + mob_stop_walking (md, 3); + if (damage > max_hp >> 2) + skill_stop_dancing (&md->bl, 0); + + if (md->hp > max_hp) + md->hp = max_hp; + + // The amount of overkill rounds to hp. + if (damage > md->hp) + damage = md->hp; + + if (!(type & 2)) + { + if (sd != NULL) + { + for (i = 0, minpos = 0, mindmg = 0x7fffffff; i < DAMAGELOG_SIZE; + i++) + { + if (md->dmglog[i].id == sd->bl.id) + break; + if (md->dmglog[i].id == 0) + { + minpos = i; + mindmg = 0; + } + else if (md->dmglog[i].dmg < mindmg) + { + minpos = i; + mindmg = md->dmglog[i].dmg; + } + } + if (i < DAMAGELOG_SIZE) + md->dmglog[i].dmg += damage; + else + { + md->dmglog[minpos].id = sd->bl.id; + md->dmglog[minpos].dmg = damage; + } + + if (md->attacked_id <= 0 && md->state.special_mob_ai == 0) + md->attacked_id = sd->bl.id; + } + if (src && src->type == BL_MOB + && ((struct mob_data *) src)->state.special_mob_ai) + { + struct mob_data *md2 = (struct mob_data *) src; + struct block_list *master_bl = map_id2bl (md2->master_id); + if (master_bl && master_bl->type == BL_PC) + { + MAP_LOG_PC (((struct map_session_data *) master_bl), + "MOB-TO-MOB-DMG FROM MOB%d %d TO MOB%d %d FOR %d", + md2->bl.id, md2->class, md->bl.id, md->class, + damage); + } + + nullpo_retr (0, md2); + for (i = 0, minpos = 0, mindmg = 0x7fffffff; i < DAMAGELOG_SIZE; + i++) + { + if (md->dmglog[i].id == md2->master_id) + break; + if (md->dmglog[i].id == 0) + { + minpos = i; + mindmg = 0; + } + else if (md->dmglog[i].dmg < mindmg) + { + minpos = i; + mindmg = md->dmglog[i].dmg; + } + } + if (i < DAMAGELOG_SIZE) + md->dmglog[i].dmg += damage; + else + { + md->dmglog[minpos].id = md2->master_id; + md->dmglog[minpos].dmg = damage; + + if (md->attacked_id <= 0 && md->state.special_mob_ai == 0) + md->attacked_id = md2->master_id; + } } - max_hp = battle_get_max_hp(&md->bl); - - if(src && src->type == BL_PC) { - sd = (struct map_session_data *)src; - mvp_sd = sd; - } - -// if(battle_config.battle_log) -// printf("mob_damage %d %d %d\n",md->hp,max_hp,damage); - if(md->bl.prev==NULL){ - if(battle_config.error_log==1) - printf("mob_damage : BlockError!!\n"); - return 0; - } - - if(md->state.state==MS_DEAD || md->hp<=0) { - if(md->bl.prev != NULL) { - mob_changestate(md,MS_DEAD,0); - mobskill_use(md,tick,-1); // It is skill at the time of death. - clif_clearchar_area(&md->bl,1); - map_delblock(&md->bl); - mob_setdelayspawn(md->bl.id); - } - return 0; - } - - if(md->sc_data[SC_ENDURE].timer == -1) - mob_stop_walking(md,3); - if(damage > max_hp>>2) - skill_stop_dancing(&md->bl,0); - - if(md->hp > max_hp) - md->hp = max_hp; - - // The amount of overkill rounds to hp. - if(damage>md->hp) - damage=md->hp; - - if(!(type&2)) { - if(sd!=NULL){ - for(i=0,minpos=0,mindmg=0x7fffffff;i<DAMAGELOG_SIZE;i++){ - if(md->dmglog[i].id==sd->bl.id) - break; - if(md->dmglog[i].id==0){ - minpos=i; - mindmg=0; - } - else if(md->dmglog[i].dmg<mindmg){ - minpos=i; - mindmg=md->dmglog[i].dmg; - } - } - if(i<DAMAGELOG_SIZE) - md->dmglog[i].dmg+=damage; - else { - md->dmglog[minpos].id=sd->bl.id; - md->dmglog[minpos].dmg=damage; - } - - if(md->attacked_id <= 0 && md->state.special_mob_ai==0) - md->attacked_id = sd->bl.id; - } - if(src && src->type == BL_MOB && ((struct mob_data*)src)->state.special_mob_ai){ - struct mob_data *md2 = (struct mob_data *)src; - struct block_list *master_bl = map_id2bl(md2->master_id); - if (master_bl && master_bl->type == BL_PC) { - MAP_LOG_PC(((struct map_session_data *)master_bl), "MOB-TO-MOB-DMG FROM MOB%d %d TO MOB%d %d FOR %d", - md2->bl.id, md2->class, - md->bl.id, md->class, - damage); - } - - nullpo_retr(0, md2); - for(i=0,minpos=0,mindmg=0x7fffffff;i<DAMAGELOG_SIZE;i++){ - if(md->dmglog[i].id==md2->master_id) - break; - if(md->dmglog[i].id==0){ - minpos=i; - mindmg=0; - } - else if(md->dmglog[i].dmg<mindmg){ - minpos=i; - mindmg=md->dmglog[i].dmg; - } - } - if(i<DAMAGELOG_SIZE) - md->dmglog[i].dmg+=damage; - else { - md->dmglog[minpos].id=md2->master_id; - md->dmglog[minpos].dmg=damage; - - if(md->attacked_id <= 0 && md->state.special_mob_ai==0) - md->attacked_id = md2->master_id; - } - } - - } - - md->hp-=damage; - - if(md->class >= 1285 && md->class <=1287) { // guardian hp update [Valaris] - struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name); - if(gc) { - - if(md->bl.id==gc->GID0) { - gc->Ghp0=md->hp; - if(gc->Ghp0<=0) { - guild_castledatasave(gc->castle_id,10,0); - guild_castledatasave(gc->castle_id,18,0); - } - } - if(md->bl.id==gc->GID1) { - gc->Ghp1=md->hp; - if(gc->Ghp1<=0) { - guild_castledatasave(gc->castle_id,11,0); - guild_castledatasave(gc->castle_id,19,0); - } - } - if(md->bl.id==gc->GID2) { - gc->Ghp2=md->hp; - if(gc->Ghp2<=0) { - guild_castledatasave(gc->castle_id,12,0); - guild_castledatasave(gc->castle_id,20,0); - } - } - if(md->bl.id==gc->GID3) { - gc->Ghp3=md->hp; - if(gc->Ghp3<=0) { - guild_castledatasave(gc->castle_id,13,0); - guild_castledatasave(gc->castle_id,21,0); - } - } - if(md->bl.id==gc->GID4) { - gc->Ghp4=md->hp; - if(gc->Ghp4<=0) { - guild_castledatasave(gc->castle_id,14,0); - guild_castledatasave(gc->castle_id,22,0); - } - } - if(md->bl.id==gc->GID5) { - gc->Ghp5=md->hp; - if(gc->Ghp5<=0) { - guild_castledatasave(gc->castle_id,15,0); - guild_castledatasave(gc->castle_id,23,0); - } - } - if(md->bl.id==gc->GID6) { - gc->Ghp6=md->hp; - if(gc->Ghp6<=0) { - guild_castledatasave(gc->castle_id,16,0); - guild_castledatasave(gc->castle_id,24,0); - } - } - if(md->bl.id==gc->GID7) { - gc->Ghp7=md->hp; - if(gc->Ghp7<=0) { - guild_castledatasave(gc->castle_id,17,0); - guild_castledatasave(gc->castle_id,25,0); - - } - } - } - } // end addition [Valaris] - - if(md->option&2 ) - skill_status_change_end(&md->bl, SC_HIDING, -1); - if(md->option&4 ) - skill_status_change_end(&md->bl, SC_CLOAKING, -1); - - if(md->state.special_mob_ai == 2){//スフィアーマイン - int skillidx=0; - - if((skillidx=mob_skillid2skillidx(md->class,NPC_SELFDESTRUCTION2))>=0){ - md->mode |= 0x1; - md->next_walktime=tick; - mobskill_use_id(md,&md->bl,skillidx);//自爆詠唱開始 - md->state.special_mob_ai++; - } - } - - if(md->hp>0){ - return 0; - } - - MAP_LOG("MOB%d DEAD", md->bl.id); - - // ----- ここから死亡処理 ----- - - map_freeblock_lock(); - mob_changestate(md,MS_DEAD,0); - mobskill_use(md,tick,-1); // 死亡時スキル - - memset(tmpsd,0,sizeof(tmpsd)); - memset(pt,0,sizeof(pt)); - - max_hp = battle_get_max_hp(&md->bl); - - if(src && src->type == BL_MOB) - mob_unlocktarget((struct mob_data *)src,tick); - - /* ソウルドレイン */ - if(sd && (skill=pc_checkskill(sd,HW_SOULDRAIN))>0){ - clif_skill_nodamage(src,&md->bl,HW_SOULDRAIN,skill,1); - sp = (battle_get_lv(&md->bl))*(65+15*skill)/100; - if(sd->status.sp + sp > sd->status.max_sp) - sp = sd->status.max_sp - sd->status.sp; - sd->status.sp += sp; - clif_heal(sd->fd,SP_SP,sp); - } - - // map外に消えた人は計算から除くので - // overkill分は無いけどsumはmax_hpとは違う - - tdmg = 0; - for(i=0,count=0,mvp_damage=0;i<DAMAGELOG_SIZE;i++){ - if(md->dmglog[i].id==0) - continue; - tmpsd[i] = map_id2sd(md->dmglog[i].id); - if(tmpsd[i] == NULL) - continue; - count++; - if(tmpsd[i]->bl.m != md->bl.m || pc_isdead(tmpsd[i])) - continue; - - tdmg += (double)md->dmglog[i].dmg; - if(mvp_damage<md->dmglog[i].dmg){ - third_sd = second_sd; - second_sd = mvp_sd; - mvp_sd=tmpsd[i]; - mvp_damage=md->dmglog[i].dmg; - } - } + } + + md->hp -= damage; + + if (md->class >= 1285 && md->class <= 1287) + { // guardian hp update [Valaris] + struct guild_castle *gc = guild_mapname2gc (map[md->bl.m].name); + if (gc) + { + + if (md->bl.id == gc->GID0) + { + gc->Ghp0 = md->hp; + if (gc->Ghp0 <= 0) + { + guild_castledatasave (gc->castle_id, 10, 0); + guild_castledatasave (gc->castle_id, 18, 0); + } + } + if (md->bl.id == gc->GID1) + { + gc->Ghp1 = md->hp; + if (gc->Ghp1 <= 0) + { + guild_castledatasave (gc->castle_id, 11, 0); + guild_castledatasave (gc->castle_id, 19, 0); + } + } + if (md->bl.id == gc->GID2) + { + gc->Ghp2 = md->hp; + if (gc->Ghp2 <= 0) + { + guild_castledatasave (gc->castle_id, 12, 0); + guild_castledatasave (gc->castle_id, 20, 0); + } + } + if (md->bl.id == gc->GID3) + { + gc->Ghp3 = md->hp; + if (gc->Ghp3 <= 0) + { + guild_castledatasave (gc->castle_id, 13, 0); + guild_castledatasave (gc->castle_id, 21, 0); + } + } + if (md->bl.id == gc->GID4) + { + gc->Ghp4 = md->hp; + if (gc->Ghp4 <= 0) + { + guild_castledatasave (gc->castle_id, 14, 0); + guild_castledatasave (gc->castle_id, 22, 0); + } + } + if (md->bl.id == gc->GID5) + { + gc->Ghp5 = md->hp; + if (gc->Ghp5 <= 0) + { + guild_castledatasave (gc->castle_id, 15, 0); + guild_castledatasave (gc->castle_id, 23, 0); + } + } + if (md->bl.id == gc->GID6) + { + gc->Ghp6 = md->hp; + if (gc->Ghp6 <= 0) + { + guild_castledatasave (gc->castle_id, 16, 0); + guild_castledatasave (gc->castle_id, 24, 0); + } + } + if (md->bl.id == gc->GID7) + { + gc->Ghp7 = md->hp; + if (gc->Ghp7 <= 0) + { + guild_castledatasave (gc->castle_id, 17, 0); + guild_castledatasave (gc->castle_id, 25, 0); + + } + } + } + } // end addition [Valaris] + + if (md->option & 2) + skill_status_change_end (&md->bl, SC_HIDING, -1); + if (md->option & 4) + skill_status_change_end (&md->bl, SC_CLOAKING, -1); + + if (md->state.special_mob_ai == 2) + { //スフィアーマイン + int skillidx = 0; + + if ((skillidx = + mob_skillid2skillidx (md->class, NPC_SELFDESTRUCTION2)) >= 0) + { + md->mode |= 0x1; + md->next_walktime = tick; + mobskill_use_id (md, &md->bl, skillidx); //自爆詠唱開始 + md->state.special_mob_ai++; + } + } + + if (md->hp > 0) + { + return 0; + } + + MAP_LOG ("MOB%d DEAD", md->bl.id); + + // ----- ここから死亡処理 ----- + + map_freeblock_lock (); + mob_changestate (md, MS_DEAD, 0); + mobskill_use (md, tick, -1); // 死亡時スキル + + memset (tmpsd, 0, sizeof (tmpsd)); + memset (pt, 0, sizeof (pt)); + + max_hp = battle_get_max_hp (&md->bl); + + if (src && src->type == BL_MOB) + mob_unlocktarget ((struct mob_data *) src, tick); + + /* ソウルドレイン */ + if (sd && (skill = pc_checkskill (sd, HW_SOULDRAIN)) > 0) + { + clif_skill_nodamage (src, &md->bl, HW_SOULDRAIN, skill, 1); + sp = (battle_get_lv (&md->bl)) * (65 + 15 * skill) / 100; + if (sd->status.sp + sp > sd->status.max_sp) + sp = sd->status.max_sp - sd->status.sp; + sd->status.sp += sp; + clif_heal (sd->fd, SP_SP, sp); + } + + // map外に消えた人は計算から除くので + // overkill分は無いけどsumはmax_hpとは違う + + tdmg = 0; + for (i = 0, count = 0, mvp_damage = 0; i < DAMAGELOG_SIZE; i++) + { + if (md->dmglog[i].id == 0) + continue; + tmpsd[i] = map_id2sd (md->dmglog[i].id); + if (tmpsd[i] == NULL) + continue; + count++; + if (tmpsd[i]->bl.m != md->bl.m || pc_isdead (tmpsd[i])) + continue; + + tdmg += (double) md->dmglog[i].dmg; + if (mvp_damage < md->dmglog[i].dmg) + { + third_sd = second_sd; + second_sd = mvp_sd; + mvp_sd = tmpsd[i]; + mvp_damage = md->dmglog[i].dmg; + } + } - // [MouseJstr] - if((map[md->bl.m].flag.pvp == 0) || (battle_config.pvp_exp == 1)) { + // [MouseJstr] + if ((map[md->bl.m].flag.pvp == 0) || (battle_config.pvp_exp == 1)) + { - if((double)max_hp < tdmg) - dmg_rate = ((double)max_hp) / tdmg; - else dmg_rate = 1; + if ((double) max_hp < tdmg) + dmg_rate = ((double) max_hp) / tdmg; + else + dmg_rate = 1; - // 経験値の分配 - for(i=0;i<DAMAGELOG_SIZE;i++){ + // 経験値の分配 + for (i = 0; i < DAMAGELOG_SIZE; i++) + { - int pid,base_exp,job_exp,flag=1; - double per; - struct party *p; - if(tmpsd[i]==NULL || tmpsd[i]->bl.m != md->bl.m) - continue; + int pid, base_exp, job_exp, flag = 1; + double per; + struct party *p; + if (tmpsd[i] == NULL || tmpsd[i]->bl.m != md->bl.m) + continue; /* jAthena's exp formula per = ((double)md->dmglog[i].dmg)*(9.+(double)((count > 6)? 6:count))/10./((double)max_hp) * dmg_rate; temp = ((double)mob_db[md->class].base_exp * (double)battle_config.base_exp_rate / 100. * per); @@ -2530,576 +2918,697 @@ int mob_damage(struct block_list *src,struct mob_data *md,int damage,int type) if(job_exp < 0) job_exp = 0; */ //eAthena's exp formula rather than jAthena's -// per=(double)md->dmglog[i].dmg*256*(9+(double)((count > 6)? 6:count))/10/(double)max_hp; - // [Fate] The above is the old formula. We do a more involved computation below. - per = (double)md->dmglog[i].dmg * 256 / (double) max_hp; // 256 = 100% of the score - per *= damage_bonus_factor[count > DAMAGE_BONUS_COUNT ? DAMAGE_BONUS_COUNT : count]; // Bonus for party attack - if(per>512) per=512; // [Fate] Retained from before. The maximum a single individual can get is double the original value. - if(per<1) per=1; - - base_exp = ((mob_db[md->class].base_exp * md->stats[MOB_XP_BONUS]) >> MOB_XP_BONUS_SHIFT) * per/256; - if(base_exp < 1) base_exp = 1; - if(sd && md && battle_config.pk_mode==1 && (mob_db[md->class].lv - sd->status.base_level >= 20)) { - base_exp*=1.15; // pk_mode additional exp if monster >20 levels [Valaris] - } - if(md->state.special_mob_ai >= 1 && battle_config.alchemist_summon_reward != 1) base_exp = 0; // Added [Valaris] - job_exp=mob_db[md->class].job_exp*per/256; - if(job_exp < 1) job_exp = 1; - if(sd && md && battle_config.pk_mode==1 && (mob_db[md->class].lv - sd->status.base_level >= 20)) { - job_exp*=1.15; // pk_mode additional exp if monster >20 levels [Valaris] - } - if(md->state.special_mob_ai >= 1 && battle_config.alchemist_summon_reward != 1) job_exp = 0; // Added [Valaris] - - if((pid=tmpsd[i]->status.party_id)>0){ // パーティに入っている - int j=0; - for(j=0;j<pnum;j++) // 公平パーティリストにいるかどうか - if(pt[j].id==pid) - break; - if(j==pnum){ // いないときは公平かどうか確認 - if((p=party_search(pid))!=NULL && p->exp!=0){ - pt[pnum].id=pid; - pt[pnum].p=p; - pt[pnum].base_exp=base_exp; - pt[pnum].job_exp=job_exp; - pnum++; - flag=0; - } - }else{ // いるときは公平 - pt[j].base_exp+=base_exp; - pt[j].job_exp+=job_exp; - flag=0; - } - } - if(flag) // 各自所得 - pc_gainexp(tmpsd[i],base_exp,job_exp); - } - // 公平分配 - for(i=0;i<pnum;i++) - party_exp_share(pt[i].p,md->bl.m,pt[i].base_exp,pt[i].job_exp); - - // item drop - if(!(type&1)) { - for(i=0;i<8;i++){ - struct delay_item_drop *ditem; - int drop_rate; - - if(md->state.special_mob_ai >= 1 && battle_config.alchemist_summon_reward != 1) // Added [Valaris] - break; // End - - if(mob_db[md->class].dropitem[i].nameid <= 0) - continue; - drop_rate = mob_db[md->class].dropitem[i].p; - if(drop_rate <= 0 && battle_config.drop_rate0item==1) - drop_rate = 1; - if(battle_config.drops_by_luk>0 && sd && md) drop_rate+=(sd->status.luk*battle_config.drops_by_luk)/100; // drops affected by luk [Valaris] - if(sd && md && battle_config.pk_mode==1 && (mob_db[md->class].lv - sd->status.base_level >= 20)) drop_rate*=1.25; // pk_mode increase drops if 20 level difference [Valaris] - if(drop_rate <= MRAND(10000)) - continue; - - ditem=(struct delay_item_drop *)aCalloc(1,sizeof(struct delay_item_drop)); - ditem->nameid = mob_db[md->class].dropitem[i].nameid; - ditem->amount = 1; - ditem->m = md->bl.m; - ditem->x = md->bl.x; - ditem->y = md->bl.y; - ditem->first_sd = mvp_sd; - ditem->second_sd = second_sd; - ditem->third_sd = third_sd; - add_timer(tick+500+i,mob_delay_item_drop,(int)ditem,0); - } - if(sd && sd->state.attack_type == BF_WEAPON) { - for(i=0;i<sd->monster_drop_item_count;i++) { - struct delay_item_drop *ditem; - int race = battle_get_race(&md->bl); - if(sd->monster_drop_itemid[i] <= 0) - continue; - if(sd->monster_drop_race[i] & (1<<race) || - (mob_db[md->class].mode & 0x20 && sd->monster_drop_race[i] & 1<<10) || - (!(mob_db[md->class].mode & 0x20) && sd->monster_drop_race[i] & 1<<11) ) { - if(sd->monster_drop_itemrate[i] <= MRAND(10000)) - continue; - - ditem=(struct delay_item_drop *)aCalloc(1,sizeof(struct delay_item_drop)); - ditem->nameid = sd->monster_drop_itemid[i]; - ditem->amount = 1; - ditem->m = md->bl.m; - ditem->x = md->bl.x; - ditem->y = md->bl.y; - ditem->first_sd = mvp_sd; - ditem->second_sd = second_sd; - ditem->third_sd = third_sd; - add_timer(tick+520+i,mob_delay_item_drop,(int)ditem,0); - } - } - if(sd->get_zeny_num > 0) - pc_getzeny(sd,mob_db[md->class].lv*10 + MRAND((sd->get_zeny_num+1))); - } - if(md->lootitem) { - for(i=0;i<md->lootitem_count;i++) { - struct delay_item_drop2 *ditem; - - ditem=(struct delay_item_drop2 *)aCalloc(1,sizeof(struct delay_item_drop2)); - memcpy(&ditem->item_data,&md->lootitem[i],sizeof(md->lootitem[0])); - ditem->m = md->bl.m; - ditem->x = md->bl.x; - ditem->y = md->bl.y; - ditem->first_sd = mvp_sd; - ditem->second_sd = second_sd; - ditem->third_sd = third_sd; - add_timer(tick+540+i,mob_delay_item_drop2,(int)ditem,0); - } - } - } - - // mvp処理 - if(mvp_sd && mob_db[md->class].mexp > 0 ){ - int j; - int mexp = battle_get_mexp(&md->bl); - temp = ((double)mexp * (double)battle_config.mvp_exp_rate * (9.+(double)count)/1000.); - mexp = (temp > 2147483647.)? 0x7fffffff:(int)temp; - if(mexp < 1) mexp = 1; - clif_mvp_effect(mvp_sd); // エフェクト - clif_mvp_exp(mvp_sd,mexp); - pc_gainexp(mvp_sd,mexp,0); - for(j=0;j<3;j++){ - i = MRAND(3); - if(mob_db[md->class].mvpitem[i].nameid <= 0) - continue; - drop_rate = mob_db[md->class].mvpitem[i].p; - if(drop_rate <= 0 && battle_config.drop_rate0item==1) - drop_rate = 1; - if(drop_rate < battle_config.item_drop_mvp_min) - drop_rate = battle_config.item_drop_mvp_min; - if(drop_rate > battle_config.item_drop_mvp_max) - drop_rate = battle_config.item_drop_mvp_max; - if(drop_rate <= MRAND(10000)) - continue; - memset(&item,0,sizeof(item)); - item.nameid=mob_db[md->class].mvpitem[i].nameid; - item.identify=!itemdb_isequip3(item.nameid); - clif_mvp_item(mvp_sd,item.nameid); - if(mvp_sd->weight*2 > mvp_sd->max_weight) - map_addflooritem(&item,1,mvp_sd->bl.m,mvp_sd->bl.x,mvp_sd->bl.y,mvp_sd,second_sd,third_sd,1); - else if((ret = pc_additem(mvp_sd,&item,1))) { - clif_additem(sd,0,0,ret); - map_addflooritem(&item,1,mvp_sd->bl.m,mvp_sd->bl.x,mvp_sd->bl.y,mvp_sd,second_sd,third_sd,1); - } - break; - } - } - - } // [MouseJstr] - - // <Agit> NPC Event [OnAgitBreak] - if(md->npc_event[0] && strcmp(((md->npc_event)+strlen(md->npc_event)-13),"::OnAgitBreak") == 0) { - printf("MOB.C: Run NPC_Event[OnAgitBreak].\n"); - if (agit_flag == 1) //Call to Run NPC_Event[OnAgitBreak] - guild_agit_break(md); - } - - // SCRIPT実行 - if(md->npc_event[0]){ - if(sd == NULL) { - if(mvp_sd != NULL) - sd = mvp_sd; - else { - struct map_session_data *tmpsd; - int i; - for(i=0;i<fd_max;i++){ - if(session[i] && (tmpsd=session[i]->session_data) && tmpsd->state.auth) { - if(md->bl.m == tmpsd->bl.m) { - sd = tmpsd; - break; - } - } - } - } - } - if(sd) - npc_event(sd,md->npc_event,0); - } - - clif_clearchar_area(&md->bl,1); - map_delblock(&md->bl); - if(mob_get_viewclass(md->class) <= 1000) - clif_clearchar_delay(tick+3000,&md->bl,0); - mob_deleteslave(md); - mob_setdelayspawn(md->bl.id); - map_freeblock_unlock(); - - return 0; +// per=(double)md->dmglog[i].dmg*256*(9+(double)((count > 6)? 6:count))/10/(double)max_hp; + // [Fate] The above is the old formula. We do a more involved computation below. + per = (double) md->dmglog[i].dmg * 256 / (double) max_hp; // 256 = 100% of the score + per *= damage_bonus_factor[count > DAMAGE_BONUS_COUNT ? DAMAGE_BONUS_COUNT : count]; // Bonus for party attack + if (per > 512) + per = 512; // [Fate] Retained from before. The maximum a single individual can get is double the original value. + if (per < 1) + per = 1; + + base_exp = + ((mob_db[md->class].base_exp * + md->stats[MOB_XP_BONUS]) >> MOB_XP_BONUS_SHIFT) * per / 256; + if (base_exp < 1) + base_exp = 1; + if (sd && md && battle_config.pk_mode == 1 + && (mob_db[md->class].lv - sd->status.base_level >= 20)) + { + base_exp *= 1.15; // pk_mode additional exp if monster >20 levels [Valaris] + } + if (md->state.special_mob_ai >= 1 + && battle_config.alchemist_summon_reward != 1) + base_exp = 0; // Added [Valaris] + job_exp = mob_db[md->class].job_exp * per / 256; + if (job_exp < 1) + job_exp = 1; + if (sd && md && battle_config.pk_mode == 1 + && (mob_db[md->class].lv - sd->status.base_level >= 20)) + { + job_exp *= 1.15; // pk_mode additional exp if monster >20 levels [Valaris] + } + if (md->state.special_mob_ai >= 1 + && battle_config.alchemist_summon_reward != 1) + job_exp = 0; // Added [Valaris] + + if ((pid = tmpsd[i]->status.party_id) > 0) + { // パーティに入っている + int j = 0; + for (j = 0; j < pnum; j++) // 公平パーティリストにいるかどうか + if (pt[j].id == pid) + break; + if (j == pnum) + { // いないときは公平かどうか確認 + if ((p = party_search (pid)) != NULL && p->exp != 0) + { + pt[pnum].id = pid; + pt[pnum].p = p; + pt[pnum].base_exp = base_exp; + pt[pnum].job_exp = job_exp; + pnum++; + flag = 0; + } + } + else + { // いるときは公平 + pt[j].base_exp += base_exp; + pt[j].job_exp += job_exp; + flag = 0; + } + } + if (flag) // 各自所得 + pc_gainexp (tmpsd[i], base_exp, job_exp); + } + // 公平分配 + for (i = 0; i < pnum; i++) + party_exp_share (pt[i].p, md->bl.m, pt[i].base_exp, + pt[i].job_exp); + + // item drop + if (!(type & 1)) + { + for (i = 0; i < 8; i++) + { + struct delay_item_drop *ditem; + int drop_rate; + + if (md->state.special_mob_ai >= 1 && battle_config.alchemist_summon_reward != 1) // Added [Valaris] + break; // End + + if (mob_db[md->class].dropitem[i].nameid <= 0) + continue; + drop_rate = mob_db[md->class].dropitem[i].p; + if (drop_rate <= 0 && battle_config.drop_rate0item == 1) + drop_rate = 1; + if (battle_config.drops_by_luk > 0 && sd && md) + drop_rate += (sd->status.luk * battle_config.drops_by_luk) / 100; // drops affected by luk [Valaris] + if (sd && md && battle_config.pk_mode == 1 + && (mob_db[md->class].lv - sd->status.base_level >= 20)) + drop_rate *= 1.25; // pk_mode increase drops if 20 level difference [Valaris] + if (drop_rate <= MRAND (10000)) + continue; + + ditem = + (struct delay_item_drop *) aCalloc (1, + sizeof (struct + delay_item_drop)); + ditem->nameid = mob_db[md->class].dropitem[i].nameid; + ditem->amount = 1; + ditem->m = md->bl.m; + ditem->x = md->bl.x; + ditem->y = md->bl.y; + ditem->first_sd = mvp_sd; + ditem->second_sd = second_sd; + ditem->third_sd = third_sd; + add_timer (tick + 500 + i, mob_delay_item_drop, (int) ditem, + 0); + } + if (sd && sd->state.attack_type == BF_WEAPON) + { + for (i = 0; i < sd->monster_drop_item_count; i++) + { + struct delay_item_drop *ditem; + int race = battle_get_race (&md->bl); + if (sd->monster_drop_itemid[i] <= 0) + continue; + if (sd->monster_drop_race[i] & (1 << race) || + (mob_db[md->class].mode & 0x20 + && sd->monster_drop_race[i] & 1 << 10) + || (!(mob_db[md->class].mode & 0x20) + && sd->monster_drop_race[i] & 1 << 11)) + { + if (sd->monster_drop_itemrate[i] <= MRAND (10000)) + continue; + + ditem = + (struct delay_item_drop *) aCalloc (1, + sizeof (struct + delay_item_drop)); + ditem->nameid = sd->monster_drop_itemid[i]; + ditem->amount = 1; + ditem->m = md->bl.m; + ditem->x = md->bl.x; + ditem->y = md->bl.y; + ditem->first_sd = mvp_sd; + ditem->second_sd = second_sd; + ditem->third_sd = third_sd; + add_timer (tick + 520 + i, mob_delay_item_drop, + (int) ditem, 0); + } + } + if (sd->get_zeny_num > 0) + pc_getzeny (sd, + mob_db[md->class].lv * 10 + + MRAND ((sd->get_zeny_num + 1))); + } + if (md->lootitem) + { + for (i = 0; i < md->lootitem_count; i++) + { + struct delay_item_drop2 *ditem; + + ditem = + (struct delay_item_drop2 *) aCalloc (1, + sizeof (struct + delay_item_drop2)); + memcpy (&ditem->item_data, &md->lootitem[i], + sizeof (md->lootitem[0])); + ditem->m = md->bl.m; + ditem->x = md->bl.x; + ditem->y = md->bl.y; + ditem->first_sd = mvp_sd; + ditem->second_sd = second_sd; + ditem->third_sd = third_sd; + add_timer (tick + 540 + i, mob_delay_item_drop2, + (int) ditem, 0); + } + } + } + + // mvp処理 + if (mvp_sd && mob_db[md->class].mexp > 0) + { + int j; + int mexp = battle_get_mexp (&md->bl); + temp = + ((double) mexp * (double) battle_config.mvp_exp_rate * + (9. + (double) count) / 1000.); + mexp = (temp > 2147483647.) ? 0x7fffffff : (int) temp; + if (mexp < 1) + mexp = 1; + clif_mvp_effect (mvp_sd); // エフェクト + clif_mvp_exp (mvp_sd, mexp); + pc_gainexp (mvp_sd, mexp, 0); + for (j = 0; j < 3; j++) + { + i = MRAND (3); + if (mob_db[md->class].mvpitem[i].nameid <= 0) + continue; + drop_rate = mob_db[md->class].mvpitem[i].p; + if (drop_rate <= 0 && battle_config.drop_rate0item == 1) + drop_rate = 1; + if (drop_rate < battle_config.item_drop_mvp_min) + drop_rate = battle_config.item_drop_mvp_min; + if (drop_rate > battle_config.item_drop_mvp_max) + drop_rate = battle_config.item_drop_mvp_max; + if (drop_rate <= MRAND (10000)) + continue; + memset (&item, 0, sizeof (item)); + item.nameid = mob_db[md->class].mvpitem[i].nameid; + item.identify = !itemdb_isequip3 (item.nameid); + clif_mvp_item (mvp_sd, item.nameid); + if (mvp_sd->weight * 2 > mvp_sd->max_weight) + map_addflooritem (&item, 1, mvp_sd->bl.m, mvp_sd->bl.x, + mvp_sd->bl.y, mvp_sd, second_sd, + third_sd, 1); + else if ((ret = pc_additem (mvp_sd, &item, 1))) + { + clif_additem (sd, 0, 0, ret); + map_addflooritem (&item, 1, mvp_sd->bl.m, mvp_sd->bl.x, + mvp_sd->bl.y, mvp_sd, second_sd, + third_sd, 1); + } + break; + } + } + + } // [MouseJstr] + + // <Agit> NPC Event [OnAgitBreak] + if (md->npc_event[0] + && strcmp (((md->npc_event) + strlen (md->npc_event) - 13), + "::OnAgitBreak") == 0) + { + printf ("MOB.C: Run NPC_Event[OnAgitBreak].\n"); + if (agit_flag == 1) //Call to Run NPC_Event[OnAgitBreak] + guild_agit_break (md); + } + + // SCRIPT実行 + if (md->npc_event[0]) + { + if (sd == NULL) + { + if (mvp_sd != NULL) + sd = mvp_sd; + else + { + struct map_session_data *tmpsd; + int i; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (tmpsd = session[i]->session_data) + && tmpsd->state.auth) + { + if (md->bl.m == tmpsd->bl.m) + { + sd = tmpsd; + break; + } + } + } + } + } + if (sd) + npc_event (sd, md->npc_event, 0); + } + + clif_clearchar_area (&md->bl, 1); + map_delblock (&md->bl); + if (mob_get_viewclass (md->class) <= 1000) + clif_clearchar_delay (tick + 3000, &md->bl, 0); + mob_deleteslave (md); + mob_setdelayspawn (md->bl.id); + map_freeblock_unlock (); + + return 0; } /*========================================== * *------------------------------------------ */ -int mob_class_change(struct mob_data *md,int *value) +int mob_class_change (struct mob_data *md, int *value) { - unsigned int tick = gettick(); - int i,c,hp_rate,max_hp,class,count = 0; - - nullpo_retr(0, md); - nullpo_retr(0, value); - - if(value[0]<=1000 || value[0]>2000) - return 0; - if(md->bl.prev == NULL) return 0; - - while(count < 5 && value[count] > 1000 && value[count] <= 2000) count++; - if(count < 1) return 0; - - class = value[MRAND(count)]; - if(class<=1000 || class>2000) return 0; - - max_hp = battle_get_max_hp(&md->bl); - hp_rate = md->hp*100/max_hp; - clif_mob_class_change(md,class); - md->class = class; - max_hp = battle_get_max_hp(&md->bl); - if(battle_config.monster_class_change_full_recover==1) { - md->hp = max_hp; - memset(md->dmglog,0,sizeof(md->dmglog)); - } - else - md->hp = max_hp*hp_rate/100; - if(md->hp > max_hp) md->hp = max_hp; - else if(md->hp < 1) md->hp = 1; - - memcpy(md->name,mob_db[class].jname,24); - memset(&md->state,0,sizeof(md->state)); - md->attacked_id = 0; - md->target_id = 0; - md->move_fail_count = 0; - - md->stats[MOB_SPEED] = mob_db[md->class].speed; - md->def_ele = mob_db[md->class].element; - - mob_changestate(md,MS_IDLE,0); - skill_castcancel(&md->bl,0); - md->state.skillstate = MSS_IDLE; - md->last_thinktime = tick; - md->next_walktime = tick+MPRAND(5000, 50); - md->attackabletime = tick; - md->canmove_tick = tick; - md->sg_count=0; - - for(i=0,c=tick-1000*3600*10;i<MAX_MOBSKILL;i++) - md->skilldelay[i] = c; - md->skillid=0; - md->skilllv=0; - - if(md->lootitem == NULL && mob_db[class].mode&0x02) - md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item)); - - skill_clear_unitgroup(&md->bl); - skill_cleartimerskill(&md->bl); - - clif_clearchar_area(&md->bl,0); - clif_spawnmob(md); - - return 0; + unsigned int tick = gettick (); + int i, c, hp_rate, max_hp, class, count = 0; + + nullpo_retr (0, md); + nullpo_retr (0, value); + + if (value[0] <= 1000 || value[0] > 2000) + return 0; + if (md->bl.prev == NULL) + return 0; + + while (count < 5 && value[count] > 1000 && value[count] <= 2000) + count++; + if (count < 1) + return 0; + + class = value[MRAND (count)]; + if (class <= 1000 || class > 2000) + return 0; + + max_hp = battle_get_max_hp (&md->bl); + hp_rate = md->hp * 100 / max_hp; + clif_mob_class_change (md, class); + md->class = class; + max_hp = battle_get_max_hp (&md->bl); + if (battle_config.monster_class_change_full_recover == 1) + { + md->hp = max_hp; + memset (md->dmglog, 0, sizeof (md->dmglog)); + } + else + md->hp = max_hp * hp_rate / 100; + if (md->hp > max_hp) + md->hp = max_hp; + else if (md->hp < 1) + md->hp = 1; + + memcpy (md->name, mob_db[class].jname, 24); + memset (&md->state, 0, sizeof (md->state)); + md->attacked_id = 0; + md->target_id = 0; + md->move_fail_count = 0; + + md->stats[MOB_SPEED] = mob_db[md->class].speed; + md->def_ele = mob_db[md->class].element; + + mob_changestate (md, MS_IDLE, 0); + skill_castcancel (&md->bl, 0); + md->state.skillstate = MSS_IDLE; + md->last_thinktime = tick; + md->next_walktime = tick + MPRAND (5000, 50); + md->attackabletime = tick; + md->canmove_tick = tick; + md->sg_count = 0; + + for (i = 0, c = tick - 1000 * 3600 * 10; i < MAX_MOBSKILL; i++) + md->skilldelay[i] = c; + md->skillid = 0; + md->skilllv = 0; + + if (md->lootitem == NULL && mob_db[class].mode & 0x02) + md->lootitem = + (struct item *) aCalloc (LOOTITEM_SIZE, sizeof (struct item)); + + skill_clear_unitgroup (&md->bl); + skill_cleartimerskill (&md->bl); + + clif_clearchar_area (&md->bl, 0); + clif_spawnmob (md); + + return 0; } /*========================================== * mob回復 *------------------------------------------ */ -int mob_heal(struct mob_data *md,int heal) +int mob_heal (struct mob_data *md, int heal) { - int max_hp = battle_get_max_hp(&md->bl); - - nullpo_retr(0, md); - - md->hp += heal; - if( max_hp < md->hp ) - md->hp = max_hp; - - if(md->class >= 1285 && md->class <=1287) { // guardian hp update [Valaris] - struct guild_castle *gc=guild_mapname2gc(map[md->bl.m].name); - if(gc) { - if(md->bl.id==gc->GID0) gc->Ghp0=md->hp; - if(md->bl.id==gc->GID1) gc->Ghp1=md->hp; - if(md->bl.id==gc->GID2) gc->Ghp2=md->hp; - if(md->bl.id==gc->GID3) gc->Ghp3=md->hp; - if(md->bl.id==gc->GID4) gc->Ghp4=md->hp; - if(md->bl.id==gc->GID5) gc->Ghp5=md->hp; - if(md->bl.id==gc->GID6) gc->Ghp6=md->hp; - if(md->bl.id==gc->GID7) gc->Ghp7=md->hp; - } - } // end addition [Valaris] + int max_hp = battle_get_max_hp (&md->bl); + + nullpo_retr (0, md); + + md->hp += heal; + if (max_hp < md->hp) + md->hp = max_hp; + + if (md->class >= 1285 && md->class <= 1287) + { // guardian hp update [Valaris] + struct guild_castle *gc = guild_mapname2gc (map[md->bl.m].name); + if (gc) + { + if (md->bl.id == gc->GID0) + gc->Ghp0 = md->hp; + if (md->bl.id == gc->GID1) + gc->Ghp1 = md->hp; + if (md->bl.id == gc->GID2) + gc->Ghp2 = md->hp; + if (md->bl.id == gc->GID3) + gc->Ghp3 = md->hp; + if (md->bl.id == gc->GID4) + gc->Ghp4 = md->hp; + if (md->bl.id == gc->GID5) + gc->Ghp5 = md->hp; + if (md->bl.id == gc->GID6) + gc->Ghp6 = md->hp; + if (md->bl.id == gc->GID7) + gc->Ghp7 = md->hp; + } + } // end addition [Valaris] - return 0; + return 0; } - /*========================================== * Added by RoVeRT *------------------------------------------ */ -int mob_warpslave_sub(struct block_list *bl,va_list ap) +int mob_warpslave_sub (struct block_list *bl, va_list ap) { - struct mob_data *md=(struct mob_data *)bl; - int id,x,y; - id=va_arg(ap,int); - x=va_arg(ap,int); - y=va_arg(ap,int); - if( md->master_id==id ) { - mob_warp(md,-1,x,y,2); - } - return 0; + struct mob_data *md = (struct mob_data *) bl; + int id, x, y; + id = va_arg (ap, int); + x = va_arg (ap, int); + y = va_arg (ap, int); + if (md->master_id == id) + { + mob_warp (md, -1, x, y, 2); + } + return 0; } /*========================================== * Added by RoVeRT *------------------------------------------ */ -int mob_warpslave(struct mob_data *md,int x, int y) +int mob_warpslave (struct mob_data *md, int x, int y) { //printf("warp slave\n"); - map_foreachinarea(mob_warpslave_sub, md->bl.m, - x-AREA_SIZE,y-AREA_SIZE, - x+AREA_SIZE,y+AREA_SIZE,BL_MOB, - md->bl.id, md->bl.x, md->bl.y ); - return 0; + map_foreachinarea (mob_warpslave_sub, md->bl.m, + x - AREA_SIZE, y - AREA_SIZE, + x + AREA_SIZE, y + AREA_SIZE, BL_MOB, + md->bl.id, md->bl.x, md->bl.y); + return 0; } /*========================================== * mobワープ *------------------------------------------ */ -int mob_warp(struct mob_data *md,int m,int x,int y,int type) +int mob_warp (struct mob_data *md, int m, int x, int y, int type) { - int i=0,c,xs=0,ys=0,bx=x,by=y; - - nullpo_retr(0, md); - - if( md->bl.prev==NULL ) - return 0; - - if( m<0 ) m=md->bl.m; - - if(type >= 0) { - if(map[md->bl.m].flag.monster_noteleport) - return 0; - clif_clearchar_area(&md->bl,type); - } - skill_unit_out_all(&md->bl,gettick(),1); - map_delblock(&md->bl); - - if(bx>0 && by>0){ // 位置指定の場合周囲9セルを探索 - xs=ys=9; - } - - while( ( x<0 || y<0 || ((c=read_gat(m,x,y))==1 || c==5) ) && (i++)<1000 ){ - if( xs>0 && ys>0 && i<250 ){ // 指定位置付近の探索 - x=MPRAND(bx, xs) - xs/2; - y=MPRAND(by, ys) - ys/2; - }else{ // 完全ランダム探索 - x=MPRAND(1, (map[m].xs-2)); - y=MPRAND(1, (map[m].ys-2)); - } - } - md->dir=0; - if(i<1000){ - md->bl.x=md->to_x=x; - md->bl.y=md->to_y=y; - md->bl.m=m; - }else { - m=md->bl.m; - if(battle_config.error_log==1) - printf("MOB %d warp failed, class = %d\n",md->bl.id,md->class); - } - - md->target_id=0; // タゲを解除する - md->state.targettype=NONE_ATTACKABLE; - md->attacked_id=0; - md->state.skillstate=MSS_IDLE; - mob_changestate(md,MS_IDLE,0); - - if(type>0 && i==1000) { - if(battle_config.battle_log==1) - printf("MOB %d warp to (%d,%d), class = %d\n",md->bl.id,x,y,md->class); - } - - map_addblock(&md->bl); - if(type>0) { - clif_spawnmob(md); - mob_warpslave(md,md->bl.x,md->bl.y); - } - - return 0; + int i = 0, c, xs = 0, ys = 0, bx = x, by = y; + + nullpo_retr (0, md); + + if (md->bl.prev == NULL) + return 0; + + if (m < 0) + m = md->bl.m; + + if (type >= 0) + { + if (map[md->bl.m].flag.monster_noteleport) + return 0; + clif_clearchar_area (&md->bl, type); + } + skill_unit_out_all (&md->bl, gettick (), 1); + map_delblock (&md->bl); + + if (bx > 0 && by > 0) + { // 位置指定の場合周囲9セルを探索 + xs = ys = 9; + } + + while ((x < 0 || y < 0 || ((c = read_gat (m, x, y)) == 1 || c == 5)) + && (i++) < 1000) + { + if (xs > 0 && ys > 0 && i < 250) + { // 指定位置付近の探索 + x = MPRAND (bx, xs) - xs / 2; + y = MPRAND (by, ys) - ys / 2; + } + else + { // 完全ランダム探索 + x = MPRAND (1, (map[m].xs - 2)); + y = MPRAND (1, (map[m].ys - 2)); + } + } + md->dir = 0; + if (i < 1000) + { + md->bl.x = md->to_x = x; + md->bl.y = md->to_y = y; + md->bl.m = m; + } + else + { + m = md->bl.m; + if (battle_config.error_log == 1) + printf ("MOB %d warp failed, class = %d\n", md->bl.id, md->class); + } + + md->target_id = 0; // タゲを解除する + md->state.targettype = NONE_ATTACKABLE; + md->attacked_id = 0; + md->state.skillstate = MSS_IDLE; + mob_changestate (md, MS_IDLE, 0); + + if (type > 0 && i == 1000) + { + if (battle_config.battle_log == 1) + printf ("MOB %d warp to (%d,%d), class = %d\n", md->bl.id, x, y, + md->class); + } + + map_addblock (&md->bl); + if (type > 0) + { + clif_spawnmob (md); + mob_warpslave (md, md->bl.x, md->bl.y); + } + + return 0; } /*========================================== * 画面内の取り巻きの数計算用(foreachinarea) *------------------------------------------ */ -int mob_countslave_sub(struct block_list *bl,va_list ap) +int mob_countslave_sub (struct block_list *bl, va_list ap) { - int id,*c; - struct mob_data *md; - - id=va_arg(ap,int); + int id, *c; + struct mob_data *md; - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, c=va_arg(ap,int *)); - nullpo_retr(0, md = (struct mob_data *)bl); + id = va_arg (ap, int); + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, c = va_arg (ap, int *)); + nullpo_retr (0, md = (struct mob_data *) bl); - if( md->master_id==id ) - (*c)++; - return 0; + if (md->master_id == id) + (*c)++; + return 0; } + /*========================================== * 画面内の取り巻きの数計算 *------------------------------------------ */ -int mob_countslave(struct mob_data *md) +int mob_countslave (struct mob_data *md) { - int c=0; + int c = 0; - nullpo_retr(0, md); + nullpo_retr (0, md); - map_foreachinarea(mob_countslave_sub, md->bl.m, - 0,0,map[md->bl.m].xs-1,map[md->bl.m].ys-1, - BL_MOB,md->bl.id,&c); - return c; + map_foreachinarea (mob_countslave_sub, md->bl.m, + 0, 0, map[md->bl.m].xs - 1, map[md->bl.m].ys - 1, + BL_MOB, md->bl.id, &c); + return c; } + /*========================================== * 手下MOB召喚 *------------------------------------------ */ -int mob_summonslave(struct mob_data *md2,int *value,int amount,int flag) +int mob_summonslave (struct mob_data *md2, int *value, int amount, int flag) { - struct mob_data *md; - int bx,by,m,count = 0,class,k,a = amount; - - nullpo_retr(0, md2); - nullpo_retr(0, value); - - bx=md2->bl.x; - by=md2->bl.y; - m=md2->bl.m; - - if(value[0]<=1000 || value[0]>2000) // 値が異常なら召喚を止める - return 0; - while(count < 5 && value[count] > 1000 && value[count] <= 2000) count++; - if(count < 1) return 0; - - for(k=0;k<count;k++) { - amount = a; - class = value[k]; - if(class<=1000 || class>2000) continue; - for(;amount>0;amount--){ - int x=0,y=0,c=0,i=0; - md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data)); - if(mob_db[class].mode&0x02) - md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item)); - else - md->lootitem=NULL; - - while((x<=0 || y<=0 || (c=map_getcell(m,x,y))==1 || c==5 ) && (i++)<100){ - x=MPRAND(bx, 9)-4; - y=MPRAND(by, 9)-4; - } - if(i>=100){ - x=bx; - y=by; - } - - mob_spawn_dataset(md,"--ja--",class); - md->bl.prev=NULL; - md->bl.next=NULL; - md->bl.m=m; - md->bl.x=x; - md->bl.y=y; - - md->m =m; - md->x0=x; - md->y0=y; - md->xs=0; - md->ys=0; - md->stats[MOB_SPEED]=md2->stats[MOB_SPEED]; - md->spawndelay1=-1; // 一度のみフラグ - md->spawndelay2=-1; // 一度のみフラグ - - memset(md->npc_event,0,sizeof(md->npc_event)); - md->bl.type=BL_MOB; - map_addiddb(&md->bl); - mob_spawn(md->bl.id); - clif_skill_nodamage(&md->bl,&md->bl,(flag)? NPC_SUMMONSLAVE:NPC_SUMMONMONSTER,a,1); - - if(flag) - md->master_id=md2->bl.id; - } - } - return 0; + struct mob_data *md; + int bx, by, m, count = 0, class, k, a = amount; + + nullpo_retr (0, md2); + nullpo_retr (0, value); + + bx = md2->bl.x; + by = md2->bl.y; + m = md2->bl.m; + + if (value[0] <= 1000 || value[0] > 2000) // 値が異常なら召喚を止める + return 0; + while (count < 5 && value[count] > 1000 && value[count] <= 2000) + count++; + if (count < 1) + return 0; + + for (k = 0; k < count; k++) + { + amount = a; + class = value[k]; + if (class <= 1000 || class > 2000) + continue; + for (; amount > 0; amount--) + { + int x = 0, y = 0, c = 0, i = 0; + md = (struct mob_data *) aCalloc (1, sizeof (struct mob_data)); + if (mob_db[class].mode & 0x02) + md->lootitem = + (struct item *) aCalloc (LOOTITEM_SIZE, + sizeof (struct item)); + else + md->lootitem = NULL; + + while ((x <= 0 || y <= 0 || (c = map_getcell (m, x, y)) == 1 + || c == 5) && (i++) < 100) + { + x = MPRAND (bx, 9) - 4; + y = MPRAND (by, 9) - 4; + } + if (i >= 100) + { + x = bx; + y = by; + } + + mob_spawn_dataset (md, "--ja--", class); + md->bl.prev = NULL; + md->bl.next = NULL; + md->bl.m = m; + md->bl.x = x; + md->bl.y = y; + + md->m = m; + md->x0 = x; + md->y0 = y; + md->xs = 0; + md->ys = 0; + md->stats[MOB_SPEED] = md2->stats[MOB_SPEED]; + md->spawndelay1 = -1; // 一度のみフラグ + md->spawndelay2 = -1; // 一度のみフラグ + + memset (md->npc_event, 0, sizeof (md->npc_event)); + md->bl.type = BL_MOB; + map_addiddb (&md->bl); + mob_spawn (md->bl.id); + clif_skill_nodamage (&md->bl, &md->bl, + (flag) ? NPC_SUMMONSLAVE : NPC_SUMMONMONSTER, + a, 1); + + if (flag) + md->master_id = md2->bl.id; + } + } + return 0; } /*========================================== * 自分をロックしているPCの数を数える(foreachclient) *------------------------------------------ */ -static int mob_counttargeted_sub(struct block_list *bl,va_list ap) +static int mob_counttargeted_sub (struct block_list *bl, va_list ap) { - int id,*c,target_lv; - struct block_list *src; - - id=va_arg(ap,int); - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, c=va_arg(ap,int *)); - - src=va_arg(ap,struct block_list *); - target_lv=va_arg(ap,int); - if(id == bl->id || (src && id == src->id)) return 0; - if(bl->type == BL_PC) { - struct map_session_data *sd = (struct map_session_data *)bl; - if(sd && sd->attacktarget == id && sd->attacktimer != -1 && sd->attacktarget_lv >= target_lv) - (*c)++; - } - else if(bl->type == BL_MOB) { - struct mob_data *md = (struct mob_data *)bl; - if(md && md->target_id == id && md->timer != -1 && md->state.state == MS_ATTACK && md->target_lv >= target_lv) - (*c)++; - } - return 0; + int id, *c, target_lv; + struct block_list *src; + + id = va_arg (ap, int); + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, c = va_arg (ap, int *)); + + src = va_arg (ap, struct block_list *); + target_lv = va_arg (ap, int); + if (id == bl->id || (src && id == src->id)) + return 0; + if (bl->type == BL_PC) + { + struct map_session_data *sd = (struct map_session_data *) bl; + if (sd && sd->attacktarget == id && sd->attacktimer != -1 + && sd->attacktarget_lv >= target_lv) + (*c)++; + } + else if (bl->type == BL_MOB) + { + struct mob_data *md = (struct mob_data *) bl; + if (md && md->target_id == id && md->timer != -1 + && md->state.state == MS_ATTACK && md->target_lv >= target_lv) + (*c)++; + } + return 0; } + /*========================================== * 自分をロックしているPCの数を数える *------------------------------------------ */ -int mob_counttargeted(struct mob_data *md,struct block_list *src,int target_lv) +int mob_counttargeted (struct mob_data *md, struct block_list *src, + int target_lv) { - int c=0; + int c = 0; - nullpo_retr(0, md); + nullpo_retr (0, md); - map_foreachinarea(mob_counttargeted_sub, md->bl.m, - md->bl.x-AREA_SIZE,md->bl.y-AREA_SIZE, - md->bl.x+AREA_SIZE,md->bl.y+AREA_SIZE,0,md->bl.id,&c,src,target_lv); - return c; + map_foreachinarea (mob_counttargeted_sub, md->bl.m, + md->bl.x - AREA_SIZE, md->bl.y - AREA_SIZE, + md->bl.x + AREA_SIZE, md->bl.y + AREA_SIZE, 0, + md->bl.id, &c, src, target_lv); + return c; } /*========================================== *MOBskillから該当skillidのskillidxを返す *------------------------------------------ */ -int mob_skillid2skillidx(int class,int skillid) +int mob_skillid2skillidx (int class, int skillid) { - int i; - struct mob_skill *ms=mob_db[class].skill; - - if(ms==NULL) - return -1; - - for(i=0;i<mob_db[class].maxskill;i++){ - if(ms[i].skill_id == skillid) - return i; - } - return -1; + int i; + struct mob_skill *ms = mob_db[class].skill; + + if (ms == NULL) + return -1; + + for (i = 0; i < mob_db[class].maxskill; i++) + { + if (ms[i].skill_id == skillid) + return i; + } + return -1; } @@ -3111,687 +3620,826 @@ int mob_skillid2skillidx(int class,int skillid) * スキル使用(詠唱完了、ID指定) *------------------------------------------ */ -int mobskill_castend_id( int tid, unsigned int tick, int id,int data ) +int mobskill_castend_id (int tid, unsigned int tick, int id, int data) { - struct mob_data* md=NULL; - struct block_list *bl; - struct block_list *mbl; - int range; - - if((mbl = map_id2bl(id)) == NULL ) //詠唱したMobがもういないというのは良くある正常処理 - return 0; - if((md=(struct mob_data *)mbl) == NULL ){ - printf("mobskill_castend_id nullpo mbl->id:%d\n",mbl->id); - return 0; - } - if( md->bl.type!=BL_MOB || md->bl.prev==NULL ) - return 0; - if( md->skilltimer != tid ) // タイマIDの確認 - return 0; - - md->skilltimer=-1; - //沈黙や状態異常など - if(md->sc_data){ - if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1) - return 0; - if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //オートカウンター - return 0; - if(md->sc_data[SC_BLADESTOP].timer != -1) //白刃取り - return 0; - if(md->sc_data[SC_BERSERK].timer != -1) //バーサーク - return 0; - } - if(md->skillid != NPC_EMOTION) - md->last_thinktime=tick + battle_get_adelay(&md->bl); - - if((bl = map_id2bl(md->skilltarget)) == NULL || bl->prev==NULL){ //スキルターゲットが存在しない - //printf("mobskill_castend_id nullpo\n");//ターゲットがいないときはnullpoじゃなくて普通に終了 - return 0; - } - if(md->bl.m != bl->m) - return 0; - - if(md->skillid == PR_LEXAETERNA) { - struct status_change *sc_data = battle_get_sc_data(bl); - if(sc_data && (sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))) - return 0; - } - else if(md->skillid == RG_BACKSTAP) { - int dir = map_calc_dir(&md->bl,bl->x,bl->y),t_dir = battle_get_dir(bl); - int dist = distance(md->bl.x,md->bl.y,bl->x,bl->y); - if(bl->type != BL_SKILL && (dist == 0 || map_check_dir(dir,t_dir))) - return 0; - } - if( ( (skill_get_inf(md->skillid)&1) || (skill_get_inf2(md->skillid)&4) ) && // 彼我敵対関係チェック - battle_check_target(&md->bl,bl, BCT_ENEMY)<=0 ) - return 0; - range = skill_get_range(md->skillid,md->skilllv); - if(range < 0) - range = battle_get_range(&md->bl) - (range + 1); - if(range + battle_config.mob_skill_add_range < distance(md->bl.x,md->bl.y,bl->x,bl->y)) - return 0; - - md->skilldelay[md->skillidx]=tick; - - if(battle_config.mob_skill_log==1) - printf("MOB skill castend skill=%d, class = %d\n",md->skillid,md->class); - mob_stop_walking(md,0); - - switch( skill_get_nk(md->skillid) ) - { - // 攻撃系/吹き飛ばし系 - case 0: case 2: - skill_castend_damage_id(&md->bl,bl,md->skillid,md->skilllv,tick,0); - break; - case 1:// 支援系 - if(!mob_db[md->class].skill[md->skillidx].val[0] && - (md->skillid==AL_HEAL || (md->skillid==ALL_RESURRECTION && bl->type != BL_PC)) && battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)) ) - skill_castend_damage_id(&md->bl,bl,md->skillid,md->skilllv,tick,0); - else - skill_castend_nodamage_id(&md->bl,bl,md->skillid,md->skilllv,tick,0); - break; - } - - - return 0; + struct mob_data *md = NULL; + struct block_list *bl; + struct block_list *mbl; + int range; + + if ((mbl = map_id2bl (id)) == NULL) //詠唱したMobがもういないというのは良くある正常処理 + return 0; + if ((md = (struct mob_data *) mbl) == NULL) + { + printf ("mobskill_castend_id nullpo mbl->id:%d\n", mbl->id); + return 0; + } + if (md->bl.type != BL_MOB || md->bl.prev == NULL) + return 0; + if (md->skilltimer != tid) // タイマIDの確認 + return 0; + + md->skilltimer = -1; + //沈黙や状態異常など + if (md->sc_data) + { + if (md->opt1 > 0 || md->sc_data[SC_DIVINA].timer != -1 + || md->sc_data[SC_ROKISWEIL].timer != -1 + || md->sc_data[SC_STEELBODY].timer != -1) + return 0; + if (md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //オートカウンター + return 0; + if (md->sc_data[SC_BLADESTOP].timer != -1) //白刃取り + return 0; + if (md->sc_data[SC_BERSERK].timer != -1) //バーサーク + return 0; + } + if (md->skillid != NPC_EMOTION) + md->last_thinktime = tick + battle_get_adelay (&md->bl); + + if ((bl = map_id2bl (md->skilltarget)) == NULL || bl->prev == NULL) + { //スキルターゲットが存在しない + //printf("mobskill_castend_id nullpo\n");//ターゲットがいないときはnullpoじゃなくて普通に終了 + return 0; + } + if (md->bl.m != bl->m) + return 0; + + if (md->skillid == PR_LEXAETERNA) + { + struct status_change *sc_data = battle_get_sc_data (bl); + if (sc_data + && (sc_data[SC_FREEZE].timer != -1 + || (sc_data[SC_STONE].timer != -1 + && sc_data[SC_STONE].val2 == 0))) + return 0; + } + else if (md->skillid == RG_BACKSTAP) + { + int dir = map_calc_dir (&md->bl, bl->x, bl->y), t_dir = + battle_get_dir (bl); + int dist = distance (md->bl.x, md->bl.y, bl->x, bl->y); + if (bl->type != BL_SKILL && (dist == 0 || map_check_dir (dir, t_dir))) + return 0; + } + if (((skill_get_inf (md->skillid) & 1) || (skill_get_inf2 (md->skillid) & 4)) && // 彼我敵対関係チェック + battle_check_target (&md->bl, bl, BCT_ENEMY) <= 0) + return 0; + range = skill_get_range (md->skillid, md->skilllv); + if (range < 0) + range = battle_get_range (&md->bl) - (range + 1); + if (range + battle_config.mob_skill_add_range < + distance (md->bl.x, md->bl.y, bl->x, bl->y)) + return 0; + + md->skilldelay[md->skillidx] = tick; + + if (battle_config.mob_skill_log == 1) + printf ("MOB skill castend skill=%d, class = %d\n", md->skillid, + md->class); + mob_stop_walking (md, 0); + + switch (skill_get_nk (md->skillid)) + { + // 攻撃系/吹き飛ばし系 + case 0: + case 2: + skill_castend_damage_id (&md->bl, bl, md->skillid, md->skilllv, + tick, 0); + break; + case 1: // 支援系 + if (!mob_db[md->class].skill[md->skillidx].val[0] && + (md->skillid == AL_HEAL + || (md->skillid == ALL_RESURRECTION && bl->type != BL_PC)) + && battle_check_undead (battle_get_race (bl), + battle_get_elem_type (bl))) + skill_castend_damage_id (&md->bl, bl, md->skillid, + md->skilllv, tick, 0); + else + skill_castend_nodamage_id (&md->bl, bl, md->skillid, + md->skilllv, tick, 0); + break; + } + + return 0; } /*========================================== * スキル使用(詠唱完了、場所指定) *------------------------------------------ */ -int mobskill_castend_pos( int tid, unsigned int tick, int id,int data ) +int mobskill_castend_pos (int tid, unsigned int tick, int id, int data) { - struct mob_data* md=NULL; - struct block_list *bl; - int range,maxcount; - - //mobskill_castend_id同様詠唱したMobが詠唱完了時にもういないというのはありそうなのでnullpoから除外 - if((bl=map_id2bl(id))==NULL) - return 0; - - nullpo_retr(0, md=(struct mob_data *)bl); - - if( md->bl.type!=BL_MOB || md->bl.prev==NULL ) - return 0; - - if( md->skilltimer != tid ) // タイマIDの確認 - return 0; - - md->skilltimer=-1; - if(md->sc_data){ - if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1) - return 0; - if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //オートカウンター - return 0; - if(md->sc_data[SC_BLADESTOP].timer != -1) //白刃取り - return 0; - if(md->sc_data[SC_BERSERK].timer != -1) //バーサーク - return 0; - } - - if(battle_config.monster_skill_reiteration == 0) { - range = -1; - switch(md->skillid) { - case MG_SAFETYWALL: - case WZ_FIREPILLAR: - case HT_SKIDTRAP: - case HT_LANDMINE: - case HT_ANKLESNARE: - case HT_SHOCKWAVE: - case HT_SANDMAN: - case HT_FLASHER: - case HT_FREEZINGTRAP: - case HT_BLASTMINE: - case HT_CLAYMORETRAP: - case PF_SPIDERWEB: /* スパイダーウェッブ */ - range = 0; - break; - case AL_PNEUMA: - case AL_WARP: - range = 1; - break; - } - if(range >= 0) { - if(skill_check_unit_range(md->bl.m,md->skillx,md->skilly,range,md->skillid) > 0) - return 0; - } - } - if(battle_config.monster_skill_nofootset==1) { - range = -1; - switch(md->skillid) { - case WZ_FIREPILLAR: - case HT_SKIDTRAP: - case HT_LANDMINE: - case HT_ANKLESNARE: - case HT_SHOCKWAVE: - case HT_SANDMAN: - case HT_FLASHER: - case HT_FREEZINGTRAP: - case HT_BLASTMINE: - case HT_CLAYMORETRAP: - case AM_DEMONSTRATION: - case PF_SPIDERWEB: /* スパイダーウェッブ */ - range = 1; - break; - case AL_WARP: - range = 0; - break; - } - if(range >= 0) { - if(skill_check_unit_range2(md->bl.m,md->skillx,md->skilly,range) > 0) - return 0; - } - } - - if(battle_config.monster_land_skill_limit==1) { - maxcount = skill_get_maxcount(md->skillid); - if(maxcount > 0) { - int i,c; - for(i=c=0;i<MAX_MOBSKILLUNITGROUP;i++) { - if(md->skillunit[i].alive_count > 0 && md->skillunit[i].skill_id == md->skillid) - c++; - } - if(c >= maxcount) - return 0; - } - } + struct mob_data *md = NULL; + struct block_list *bl; + int range, maxcount; + + //mobskill_castend_id同様詠唱したMobが詠唱完了時にもういないというのはありそうなのでnullpoから除外 + if ((bl = map_id2bl (id)) == NULL) + return 0; + + nullpo_retr (0, md = (struct mob_data *) bl); + + if (md->bl.type != BL_MOB || md->bl.prev == NULL) + return 0; + + if (md->skilltimer != tid) // タイマIDの確認 + return 0; + + md->skilltimer = -1; + if (md->sc_data) + { + if (md->opt1 > 0 || md->sc_data[SC_DIVINA].timer != -1 + || md->sc_data[SC_ROKISWEIL].timer != -1 + || md->sc_data[SC_STEELBODY].timer != -1) + return 0; + if (md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //オートカウンター + return 0; + if (md->sc_data[SC_BLADESTOP].timer != -1) //白刃取り + return 0; + if (md->sc_data[SC_BERSERK].timer != -1) //バーサーク + return 0; + } + + if (battle_config.monster_skill_reiteration == 0) + { + range = -1; + switch (md->skillid) + { + case MG_SAFETYWALL: + case WZ_FIREPILLAR: + case HT_SKIDTRAP: + case HT_LANDMINE: + case HT_ANKLESNARE: + case HT_SHOCKWAVE: + case HT_SANDMAN: + case HT_FLASHER: + case HT_FREEZINGTRAP: + case HT_BLASTMINE: + case HT_CLAYMORETRAP: + case PF_SPIDERWEB: /* スパイダーウェッブ */ + range = 0; + break; + case AL_PNEUMA: + case AL_WARP: + range = 1; + break; + } + if (range >= 0) + { + if (skill_check_unit_range + (md->bl.m, md->skillx, md->skilly, range, md->skillid) > 0) + return 0; + } + } + if (battle_config.monster_skill_nofootset == 1) + { + range = -1; + switch (md->skillid) + { + case WZ_FIREPILLAR: + case HT_SKIDTRAP: + case HT_LANDMINE: + case HT_ANKLESNARE: + case HT_SHOCKWAVE: + case HT_SANDMAN: + case HT_FLASHER: + case HT_FREEZINGTRAP: + case HT_BLASTMINE: + case HT_CLAYMORETRAP: + case AM_DEMONSTRATION: + case PF_SPIDERWEB: /* スパイダーウェッブ */ + range = 1; + break; + case AL_WARP: + range = 0; + break; + } + if (range >= 0) + { + if (skill_check_unit_range2 + (md->bl.m, md->skillx, md->skilly, range) > 0) + return 0; + } + } + + if (battle_config.monster_land_skill_limit == 1) + { + maxcount = skill_get_maxcount (md->skillid); + if (maxcount > 0) + { + int i, c; + for (i = c = 0; i < MAX_MOBSKILLUNITGROUP; i++) + { + if (md->skillunit[i].alive_count > 0 + && md->skillunit[i].skill_id == md->skillid) + c++; + } + if (c >= maxcount) + return 0; + } + } - range = skill_get_range(md->skillid,md->skilllv); - if(range < 0) - range = battle_get_range(&md->bl) - (range + 1); - if(range + battle_config.mob_skill_add_range < distance(md->bl.x,md->bl.y,md->skillx,md->skilly)) - return 0; - md->skilldelay[md->skillidx]=tick; + range = skill_get_range (md->skillid, md->skilllv); + if (range < 0) + range = battle_get_range (&md->bl) - (range + 1); + if (range + battle_config.mob_skill_add_range < + distance (md->bl.x, md->bl.y, md->skillx, md->skilly)) + return 0; + md->skilldelay[md->skillidx] = tick; - if(battle_config.mob_skill_log==1) - printf("MOB skill castend skill=%d, class = %d\n",md->skillid,md->class); - mob_stop_walking(md,0); + if (battle_config.mob_skill_log == 1) + printf ("MOB skill castend skill=%d, class = %d\n", md->skillid, + md->class); + mob_stop_walking (md, 0); - skill_castend_pos2(&md->bl,md->skillx,md->skilly,md->skillid,md->skilllv,tick,0); + skill_castend_pos2 (&md->bl, md->skillx, md->skilly, md->skillid, + md->skilllv, tick, 0); - return 0; + return 0; } - /*========================================== * Skill use (an aria start, ID specification) *------------------------------------------ */ -int mobskill_use_id(struct mob_data *md,struct block_list *target,int skill_idx) +int mobskill_use_id (struct mob_data *md, struct block_list *target, + int skill_idx) { - int casttime,range; - struct mob_skill *ms; - int skill_id, skill_lv, forcecast = 0; - - nullpo_retr(0, md); - nullpo_retr(0, ms=&mob_db[md->class].skill[skill_idx]); - - if( target==NULL && (target=map_id2bl(md->target_id))==NULL ) - return 0; - - if( target->prev==NULL || md->bl.prev==NULL ) - return 0; - - skill_id=ms->skill_id; - skill_lv=ms->skill_lv; - - // 沈黙や異常 - if(md->sc_data){ - if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1) - return 0; - if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //オートカウンター - return 0; - if(md->sc_data[SC_BLADESTOP].timer != -1) //白刃取り - return 0; - if(md->sc_data[SC_BERSERK].timer != -1) //バーサーク - return 0; - } - - if(md->option&4 && skill_id==TF_HIDING) - return 0; - if(md->option&2 && skill_id!=TF_HIDING && skill_id!=AS_GRIMTOOTH && skill_id!=RG_BACKSTAP && skill_id!=RG_RAID) - return 0; - - if(map[md->bl.m].flag.gvg && (skill_id == SM_ENDURE || skill_id == AL_TELEPORT || skill_id == AL_WARP || - skill_id == WZ_ICEWALL || skill_id == TF_BACKSLIDING)) - return 0; - - if(skill_get_inf2(skill_id)&0x200 && md->bl.id == target->id) - return 0; - - // 射程と障害物チェック - range = skill_get_range(skill_id,skill_lv); - if(range < 0) - range = battle_get_range(&md->bl) - (range + 1); - - if(!battle_check_range(&md->bl,target,range)) - return 0; - -// delay=skill_delayfix(&md->bl, skill_get_delay( skill_id,skill_lv) ); - - casttime=skill_castfix(&md->bl,ms->casttime); - md->state.skillcastcancel=ms->cancel; - md->skilldelay[skill_idx]=gettick(); - - switch(skill_id){ /* 何か特殊な処理が必要 */ - case ALL_RESURRECTION: /* リザレクション */ - if(target->type != BL_PC && battle_check_undead(battle_get_race(target),battle_get_elem_type(target))){ /* 敵がアンデッドなら */ - forcecast=1; /* ターンアンデットと同じ詠唱時間 */ - casttime=skill_castfix(&md->bl, skill_get_cast(PR_TURNUNDEAD,skill_lv) ); - } - break; - case MO_EXTREMITYFIST: /*阿修羅覇鳳拳*/ - case SA_MAGICROD: - case SA_SPELLBREAKER: - forcecast=1; - break; - } - - if(battle_config.mob_skill_log==1) - printf("MOB skill use target_id=%d skill=%d lv=%d cast=%d, class = %d\n",target->id,skill_id,skill_lv,casttime,md->class); - - if(casttime>0 || forcecast){ // 詠唱が必要 -// struct mob_data *md2; - clif_skillcasting( &md->bl, - md->bl.id, target->id, 0,0, skill_id,casttime); - - // 詠唱反応モンスター + int casttime, range; + struct mob_skill *ms; + int skill_id, skill_lv, forcecast = 0; + + nullpo_retr (0, md); + nullpo_retr (0, ms = &mob_db[md->class].skill[skill_idx]); + + if (target == NULL && (target = map_id2bl (md->target_id)) == NULL) + return 0; + + if (target->prev == NULL || md->bl.prev == NULL) + return 0; + + skill_id = ms->skill_id; + skill_lv = ms->skill_lv; + + // 沈黙や異常 + if (md->sc_data) + { + if (md->opt1 > 0 || md->sc_data[SC_DIVINA].timer != -1 + || md->sc_data[SC_ROKISWEIL].timer != -1 + || md->sc_data[SC_STEELBODY].timer != -1) + return 0; + if (md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //オートカウンター + return 0; + if (md->sc_data[SC_BLADESTOP].timer != -1) //白刃取り + return 0; + if (md->sc_data[SC_BERSERK].timer != -1) //バーサーク + return 0; + } + + if (md->option & 4 && skill_id == TF_HIDING) + return 0; + if (md->option & 2 && skill_id != TF_HIDING && skill_id != AS_GRIMTOOTH + && skill_id != RG_BACKSTAP && skill_id != RG_RAID) + return 0; + + if (map[md->bl.m].flag.gvg + && (skill_id == SM_ENDURE || skill_id == AL_TELEPORT + || skill_id == AL_WARP || skill_id == WZ_ICEWALL + || skill_id == TF_BACKSLIDING)) + return 0; + + if (skill_get_inf2 (skill_id) & 0x200 && md->bl.id == target->id) + return 0; + + // 射程と障害物チェック + range = skill_get_range (skill_id, skill_lv); + if (range < 0) + range = battle_get_range (&md->bl) - (range + 1); + + if (!battle_check_range (&md->bl, target, range)) + return 0; + +// delay=skill_delayfix(&md->bl, skill_get_delay( skill_id,skill_lv) ); + + casttime = skill_castfix (&md->bl, ms->casttime); + md->state.skillcastcancel = ms->cancel; + md->skilldelay[skill_idx] = gettick (); + + switch (skill_id) + { /* 何か特殊な処理が必要 */ + case ALL_RESURRECTION: /* リザレクション */ + if (target->type != BL_PC + && battle_check_undead (battle_get_race (target), + battle_get_elem_type (target))) + { /* 敵がアンデッドなら */ + forcecast = 1; /* ターンアンデットと同じ詠唱時間 */ + casttime = + skill_castfix (&md->bl, + skill_get_cast (PR_TURNUNDEAD, skill_lv)); + } + break; + case MO_EXTREMITYFIST: /*阿修羅覇鳳拳 */ + case SA_MAGICROD: + case SA_SPELLBREAKER: + forcecast = 1; + break; + } + + if (battle_config.mob_skill_log == 1) + printf + ("MOB skill use target_id=%d skill=%d lv=%d cast=%d, class = %d\n", + target->id, skill_id, skill_lv, casttime, md->class); + + if (casttime > 0 || forcecast) + { // 詠唱が必要 +// struct mob_data *md2; + clif_skillcasting (&md->bl, + md->bl.id, target->id, 0, 0, skill_id, casttime); + + // 詠唱反応モンスター /* if( target->type==BL_MOB && mob_db[(md2=(struct mob_data *)target)->class].mode&0x10 && md2->state.state!=MS_ATTACK){ md2->target_id=md->bl.id; md->state.targettype = ATTACKABLE; md2->min_chase=13; }*/ - } - - if( casttime<=0 ) // 詠唱の無いものはキャンセルされない - md->state.skillcastcancel=0; - - md->skilltarget = target->id; - md->skillx = 0; - md->skilly = 0; - md->skillid = skill_id; - md->skilllv = skill_lv; - md->skillidx = skill_idx; - - if(!(battle_config.monster_cloak_check_type&2) && md->sc_data[SC_CLOAKING].timer != -1 && md->skillid != AS_CLOAKING) - skill_status_change_end(&md->bl,SC_CLOAKING,-1); - - if( casttime>0 ){ - md->skilltimer = - add_timer( gettick()+casttime, mobskill_castend_id, md->bl.id, 0 ); - }else{ - md->skilltimer = -1; - mobskill_castend_id(md->skilltimer,gettick(),md->bl.id, 0); - } - - return 1; + } + + if (casttime <= 0) // 詠唱の無いものはキャンセルされない + md->state.skillcastcancel = 0; + + md->skilltarget = target->id; + md->skillx = 0; + md->skilly = 0; + md->skillid = skill_id; + md->skilllv = skill_lv; + md->skillidx = skill_idx; + + if (!(battle_config.monster_cloak_check_type & 2) + && md->sc_data[SC_CLOAKING].timer != -1 && md->skillid != AS_CLOAKING) + skill_status_change_end (&md->bl, SC_CLOAKING, -1); + + if (casttime > 0) + { + md->skilltimer = + add_timer (gettick () + casttime, mobskill_castend_id, md->bl.id, + 0); + } + else + { + md->skilltimer = -1; + mobskill_castend_id (md->skilltimer, gettick (), md->bl.id, 0); + } + + return 1; } + /*========================================== * スキル使用(場所指定) *------------------------------------------ */ -int mobskill_use_pos( struct mob_data *md, - int skill_x, int skill_y, int skill_idx) +int mobskill_use_pos (struct mob_data *md, + int skill_x, int skill_y, int skill_idx) { - int casttime=0,range; - struct mob_skill *ms; - struct block_list bl; - int skill_id, skill_lv; - - nullpo_retr(0, md); - nullpo_retr(0, ms=&mob_db[md->class].skill[skill_idx]); - - if( md->bl.prev==NULL ) - return 0; - - skill_id=ms->skill_id; - skill_lv=ms->skill_lv; - - //沈黙や状態異常など - if(md->sc_data){ - if(md->opt1>0 || md->sc_data[SC_DIVINA].timer != -1 || md->sc_data[SC_ROKISWEIL].timer != -1 || md->sc_data[SC_STEELBODY].timer != -1) - return 0; - if(md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //オートカウンター - return 0; - if(md->sc_data[SC_BLADESTOP].timer != -1) //白刃取り - return 0; - if(md->sc_data[SC_BERSERK].timer != -1) //バーサーク - return 0; - } - - if(md->option&2) - return 0; - - if(map[md->bl.m].flag.gvg && (skill_id == SM_ENDURE || skill_id == AL_TELEPORT || skill_id == AL_WARP || - skill_id == WZ_ICEWALL || skill_id == TF_BACKSLIDING)) - return 0; - - // 射程と障害物チェック - bl.type = BL_NUL; - bl.m = md->bl.m; - bl.x = skill_x; - bl.y = skill_y; - range = skill_get_range(skill_id,skill_lv); - if(range < 0) - range = battle_get_range(&md->bl) - (range + 1); - if(!battle_check_range(&md->bl,&bl,range)) - return 0; - -// delay=skill_delayfix(&sd->bl, skill_get_delay( skill_id,skill_lv) ); - casttime=skill_castfix(&md->bl,ms->casttime); - md->skilldelay[skill_idx]=gettick(); - md->state.skillcastcancel=ms->cancel; - - if(battle_config.mob_skill_log==1) - printf("MOB skill use target_pos=(%d,%d) skill=%d lv=%d cast=%d, class = %d\n", - skill_x,skill_y,skill_id,skill_lv,casttime,md->class); - - if( casttime>0 ) // A cast time is required. - clif_skillcasting( &md->bl, - md->bl.id, 0, skill_x,skill_y, skill_id,casttime); - - if( casttime<=0 ) // A skill without a cast time wont be cancelled. - md->state.skillcastcancel=0; - - - md->skillx = skill_x; - md->skilly = skill_y; - md->skilltarget = 0; - md->skillid = skill_id; - md->skilllv = skill_lv; - md->skillidx = skill_idx; - if(!(battle_config.monster_cloak_check_type&2) && md->sc_data[SC_CLOAKING].timer != -1) - skill_status_change_end(&md->bl,SC_CLOAKING,-1); - if( casttime>0 ){ - md->skilltimer = - add_timer( gettick()+casttime, mobskill_castend_pos, md->bl.id, 0 ); - }else{ - md->skilltimer = -1; - mobskill_castend_pos(md->skilltimer,gettick(),md->bl.id, 0); - } - - return 1; + int casttime = 0, range; + struct mob_skill *ms; + struct block_list bl; + int skill_id, skill_lv; + + nullpo_retr (0, md); + nullpo_retr (0, ms = &mob_db[md->class].skill[skill_idx]); + + if (md->bl.prev == NULL) + return 0; + + skill_id = ms->skill_id; + skill_lv = ms->skill_lv; + + //沈黙や状態異常など + if (md->sc_data) + { + if (md->opt1 > 0 || md->sc_data[SC_DIVINA].timer != -1 + || md->sc_data[SC_ROKISWEIL].timer != -1 + || md->sc_data[SC_STEELBODY].timer != -1) + return 0; + if (md->sc_data[SC_AUTOCOUNTER].timer != -1 && md->skillid != KN_AUTOCOUNTER) //オートカウンター + return 0; + if (md->sc_data[SC_BLADESTOP].timer != -1) //白刃取り + return 0; + if (md->sc_data[SC_BERSERK].timer != -1) //バーサーク + return 0; + } + + if (md->option & 2) + return 0; + + if (map[md->bl.m].flag.gvg + && (skill_id == SM_ENDURE || skill_id == AL_TELEPORT + || skill_id == AL_WARP || skill_id == WZ_ICEWALL + || skill_id == TF_BACKSLIDING)) + return 0; + + // 射程と障害物チェック + bl.type = BL_NUL; + bl.m = md->bl.m; + bl.x = skill_x; + bl.y = skill_y; + range = skill_get_range (skill_id, skill_lv); + if (range < 0) + range = battle_get_range (&md->bl) - (range + 1); + if (!battle_check_range (&md->bl, &bl, range)) + return 0; + +// delay=skill_delayfix(&sd->bl, skill_get_delay( skill_id,skill_lv) ); + casttime = skill_castfix (&md->bl, ms->casttime); + md->skilldelay[skill_idx] = gettick (); + md->state.skillcastcancel = ms->cancel; + + if (battle_config.mob_skill_log == 1) + printf + ("MOB skill use target_pos=(%d,%d) skill=%d lv=%d cast=%d, class = %d\n", + skill_x, skill_y, skill_id, skill_lv, casttime, md->class); + + if (casttime > 0) // A cast time is required. + clif_skillcasting (&md->bl, + md->bl.id, 0, skill_x, skill_y, skill_id, + casttime); + + if (casttime <= 0) // A skill without a cast time wont be cancelled. + md->state.skillcastcancel = 0; + + md->skillx = skill_x; + md->skilly = skill_y; + md->skilltarget = 0; + md->skillid = skill_id; + md->skilllv = skill_lv; + md->skillidx = skill_idx; + if (!(battle_config.monster_cloak_check_type & 2) + && md->sc_data[SC_CLOAKING].timer != -1) + skill_status_change_end (&md->bl, SC_CLOAKING, -1); + if (casttime > 0) + { + md->skilltimer = + add_timer (gettick () + casttime, mobskill_castend_pos, md->bl.id, + 0); + } + else + { + md->skilltimer = -1; + mobskill_castend_pos (md->skilltimer, gettick (), md->bl.id, 0); + } + + return 1; } - /*========================================== * Friendly Mob whose HP is decreasing by a nearby MOB is looked for. *------------------------------------------ */ -int mob_getfriendhpltmaxrate_sub(struct block_list *bl,va_list ap) +int mob_getfriendhpltmaxrate_sub (struct block_list *bl, va_list ap) { - int rate; - struct mob_data **fr, *md, *mmd; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, mmd=va_arg(ap,struct mob_data *)); - - md=(struct mob_data *)bl; - - if( mmd->bl.id == bl->id ) - return 0; - rate=va_arg(ap,int); - fr=va_arg(ap,struct mob_data **); - if( md->hp < mob_db[md->class].max_hp*rate/100 ) - (*fr)=md; - return 0; + int rate; + struct mob_data **fr, *md, *mmd; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, mmd = va_arg (ap, struct mob_data *)); + + md = (struct mob_data *) bl; + + if (mmd->bl.id == bl->id) + return 0; + rate = va_arg (ap, int); + fr = va_arg (ap, struct mob_data **); + if (md->hp < mob_db[md->class].max_hp * rate / 100) + (*fr) = md; + return 0; } -struct mob_data *mob_getfriendhpltmaxrate(struct mob_data *md,int rate) + +struct mob_data *mob_getfriendhpltmaxrate (struct mob_data *md, int rate) { - struct mob_data *fr=NULL; - const int r=8; + struct mob_data *fr = NULL; + const int r = 8; - nullpo_retr(NULL, md); + nullpo_retr (NULL, md); - map_foreachinarea(mob_getfriendhpltmaxrate_sub, md->bl.m, - md->bl.x-r ,md->bl.y-r, md->bl.x+r, md->bl.y+r, - BL_MOB,md,rate,&fr); - return fr; + map_foreachinarea (mob_getfriendhpltmaxrate_sub, md->bl.m, + md->bl.x - r, md->bl.y - r, md->bl.x + r, md->bl.y + r, + BL_MOB, md, rate, &fr); + return fr; } + /*========================================== * What a status state suits by nearby MOB is looked for. *------------------------------------------ */ -int mob_getfriendstatus_sub(struct block_list *bl,va_list ap) +int mob_getfriendstatus_sub (struct block_list *bl, va_list ap) { - int cond1,cond2; - struct mob_data **fr, *md, *mmd; - int flag=0; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, md=(struct mob_data *)bl); - nullpo_retr(0, mmd=va_arg(ap,struct mob_data *)); - - if( mmd->bl.id == bl->id ) - return 0; - cond1=va_arg(ap,int); - cond2=va_arg(ap,int); - fr=va_arg(ap,struct mob_data **); - if( cond2==-1 ){ - int j; - for(j=SC_STONE;j<=SC_BLIND && !flag;j++){ - flag=(md->sc_data[j].timer!=-1 ); - } - }else - flag=( md->sc_data[cond2].timer!=-1 ); - if( flag^( cond1==MSC_FRIENDSTATUSOFF ) ) - (*fr)=md; + int cond1, cond2; + struct mob_data **fr, *md, *mmd; + int flag = 0; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, md = (struct mob_data *) bl); + nullpo_retr (0, mmd = va_arg (ap, struct mob_data *)); + + if (mmd->bl.id == bl->id) + return 0; + cond1 = va_arg (ap, int); + cond2 = va_arg (ap, int); + fr = va_arg (ap, struct mob_data **); + if (cond2 == -1) + { + int j; + for (j = SC_STONE; j <= SC_BLIND && !flag; j++) + { + flag = (md->sc_data[j].timer != -1); + } + } + else + flag = (md->sc_data[cond2].timer != -1); + if (flag ^ (cond1 == MSC_FRIENDSTATUSOFF)) + (*fr) = md; - return 0; + return 0; } -struct mob_data *mob_getfriendstatus(struct mob_data *md,int cond1,int cond2) + +struct mob_data *mob_getfriendstatus (struct mob_data *md, int cond1, + int cond2) { - struct mob_data *fr=NULL; - const int r=8; + struct mob_data *fr = NULL; + const int r = 8; - nullpo_retr(0, md); + nullpo_retr (0, md); - map_foreachinarea(mob_getfriendstatus_sub, md->bl.m, - md->bl.x-r ,md->bl.y-r, md->bl.x+r, md->bl.y+r, - BL_MOB,md,cond1,cond2,&fr); - return fr; + map_foreachinarea (mob_getfriendstatus_sub, md->bl.m, + md->bl.x - r, md->bl.y - r, md->bl.x + r, md->bl.y + r, + BL_MOB, md, cond1, cond2, &fr); + return fr; } /*========================================== * Skill use judging *------------------------------------------ */ -int mobskill_use(struct mob_data *md,unsigned int tick,int event) +int mobskill_use (struct mob_data *md, unsigned int tick, int event) { - struct mob_skill *ms; -// struct block_list *target=NULL; - int i,max_hp; - - nullpo_retr(0, md); - nullpo_retr(0, ms = mob_db[md->class].skill); - - max_hp = battle_get_max_hp(&md->bl); - - if(battle_config.mob_skill_use == 0 || md->skilltimer != -1) - return 0; - - if(md->state.special_mob_ai) - return 0; - - if(md->sc_data[SC_SELFDESTRUCTION].timer!=-1) //自爆中はスキルを使わない - return 0; - - for(i=0;i<mob_db[md->class].maxskill;i++){ - int c2=ms[i].cond2,flag=0; - struct mob_data *fmd=NULL; - - // ディレイ中 - if( DIFF_TICK(tick,md->skilldelay[i])<ms[i].delay ) - continue; - - // 状態判定 - if( ms[i].state>=0 && ms[i].state!=md->state.skillstate ) - continue; - - // 条件判定 - flag=(event==ms[i].cond1); - if(!flag){ - switch( ms[i].cond1 ){ - case MSC_ALWAYS: - flag=1; break; - case MSC_MYHPLTMAXRATE: // HP< maxhp% - flag=( md->hp < max_hp*c2/100 ); break; - case MSC_MYSTATUSON: // status[num] on - case MSC_MYSTATUSOFF: // status[num] off - if( ms[i].cond2==-1 ){ - int j; - for(j=SC_STONE;j<=SC_BLIND && !flag;j++){ - flag=(md->sc_data[j].timer!=-1 ); - } - }else - flag=( md->sc_data[ms[i].cond2].timer!=-1 ); - flag^=( ms[i].cond1==MSC_MYSTATUSOFF ); break; - case MSC_FRIENDHPLTMAXRATE: // friend HP < maxhp% - flag=(( fmd=mob_getfriendhpltmaxrate(md,ms[i].cond2) )!=NULL ); break; - case MSC_FRIENDSTATUSON: // friend status[num] on - case MSC_FRIENDSTATUSOFF: // friend status[num] off - flag=(( fmd=mob_getfriendstatus(md,ms[i].cond1,ms[i].cond2) )!=NULL ); break; - case MSC_SLAVELT: // slave < num - flag=( mob_countslave(md) < c2 ); break; - case MSC_ATTACKPCGT: // attack pc > num - flag=( mob_counttargeted(md,NULL,0) > c2 ); break; - case MSC_SLAVELE: // slave <= num - flag=( mob_countslave(md) <= c2 ); break; - case MSC_ATTACKPCGE: // attack pc >= num - flag=( mob_counttargeted(md,NULL,0) >= c2 ); break; - case MSC_SKILLUSED: // specificated skill used - flag=( (event&0xffff)==MSC_SKILLUSED && ((event>>16)==c2 || c2==0)); break; - } - } + struct mob_skill *ms; +// struct block_list *target=NULL; + int i, max_hp; + + nullpo_retr (0, md); + nullpo_retr (0, ms = mob_db[md->class].skill); + + max_hp = battle_get_max_hp (&md->bl); + + if (battle_config.mob_skill_use == 0 || md->skilltimer != -1) + return 0; + + if (md->state.special_mob_ai) + return 0; + + if (md->sc_data[SC_SELFDESTRUCTION].timer != -1) //自爆中はスキルを使わない + return 0; + + for (i = 0; i < mob_db[md->class].maxskill; i++) + { + int c2 = ms[i].cond2, flag = 0; + struct mob_data *fmd = NULL; + + // ディレイ中 + if (DIFF_TICK (tick, md->skilldelay[i]) < ms[i].delay) + continue; + + // 状態判定 + if (ms[i].state >= 0 && ms[i].state != md->state.skillstate) + continue; + + // 条件判定 + flag = (event == ms[i].cond1); + if (!flag) + { + switch (ms[i].cond1) + { + case MSC_ALWAYS: + flag = 1; + break; + case MSC_MYHPLTMAXRATE: // HP< maxhp% + flag = (md->hp < max_hp * c2 / 100); + break; + case MSC_MYSTATUSON: // status[num] on + case MSC_MYSTATUSOFF: // status[num] off + if (ms[i].cond2 == -1) + { + int j; + for (j = SC_STONE; j <= SC_BLIND && !flag; j++) + { + flag = (md->sc_data[j].timer != -1); + } + } + else + flag = (md->sc_data[ms[i].cond2].timer != -1); + flag ^= (ms[i].cond1 == MSC_MYSTATUSOFF); + break; + case MSC_FRIENDHPLTMAXRATE: // friend HP < maxhp% + flag = + ((fmd = + mob_getfriendhpltmaxrate (md, + ms[i].cond2)) != NULL); + break; + case MSC_FRIENDSTATUSON: // friend status[num] on + case MSC_FRIENDSTATUSOFF: // friend status[num] off + flag = + ((fmd = + mob_getfriendstatus (md, ms[i].cond1, + ms[i].cond2)) != NULL); + break; + case MSC_SLAVELT: // slave < num + flag = (mob_countslave (md) < c2); + break; + case MSC_ATTACKPCGT: // attack pc > num + flag = (mob_counttargeted (md, NULL, 0) > c2); + break; + case MSC_SLAVELE: // slave <= num + flag = (mob_countslave (md) <= c2); + break; + case MSC_ATTACKPCGE: // attack pc >= num + flag = (mob_counttargeted (md, NULL, 0) >= c2); + break; + case MSC_SKILLUSED: // specificated skill used + flag = ((event & 0xffff) == MSC_SKILLUSED + && ((event >> 16) == c2 || c2 == 0)); + break; + } + } - // 確率判定 - if( flag && MRAND(10000) < ms[i].permillage ){ - - if( skill_get_inf(ms[i].skill_id)&2 ){ - // 場所指定 - struct block_list *bl = NULL; - int x=0,y=0; - if( ms[i].target<=MST_AROUND ){ - bl= ((ms[i].target==MST_TARGET || ms[i].target==MST_AROUND5)? map_id2bl(md->target_id): - (ms[i].target==MST_FRIEND)? &fmd->bl : &md->bl); - if(bl!=NULL){ - x=bl->x; y=bl->y; - } - } - if( x<=0 || y<=0 ) - continue; - // 自分の周囲 - if( ms[i].target>=MST_AROUND1 ){ - int bx=x, by=y, i=0, c, m=bl->m, r=ms[i].target-MST_AROUND1; - do{ - bx=x + MRAND((r*2+3)) - r; - by=y + MRAND((r*2+3)) - r; - }while( ( bx<=0 || by<=0 || bx>=map[m].xs || by>=map[m].ys || - ((c=read_gat(m,bx,by))==1 || c==5) ) && (i++)<1000); - if(i<1000){ - x=bx; y=by; - } - } - // 相手の周囲 - if( ms[i].target>=MST_AROUND5 ){ - int bx=x, by=y, i=0, c, m=bl->m, r=(ms[i].target-MST_AROUND5)+1; - do{ - bx=x + MRAND((r*2+1)) - r; - by=y + MRAND((r*2+1)) - r; - }while( ( bx<=0 || by<=0 || bx>=map[m].xs || by>=map[m].ys || - ((c=read_gat(m,bx,by))==1 || c==5) ) && (i++)<1000); - if(i<1000){ - x=bx; y=by; - } - } - if(!mobskill_use_pos(md,x,y,i)) - return 0; - - }else{ - // ID指定 - if( ms[i].target<=MST_FRIEND ){ - struct block_list *bl = NULL; - bl= ((ms[i].target==MST_TARGET)? map_id2bl(md->target_id): - (ms[i].target==MST_FRIEND)? &fmd->bl : &md->bl); - if(bl && !mobskill_use_id(md,bl,i)) - return 0; - } - } - if(ms[i].emotion >= 0) - clif_emotion(&md->bl,ms[i].emotion); - return 1; - } - } + // 確率判定 + if (flag && MRAND (10000) < ms[i].permillage) + { + + if (skill_get_inf (ms[i].skill_id) & 2) + { + // 場所指定 + struct block_list *bl = NULL; + int x = 0, y = 0; + if (ms[i].target <= MST_AROUND) + { + bl = ((ms[i].target == MST_TARGET + || ms[i].target == + MST_AROUND5) ? map_id2bl (md-> + target_id) + : (ms[i].target == + MST_FRIEND) ? &fmd->bl : &md->bl); + if (bl != NULL) + { + x = bl->x; + y = bl->y; + } + } + if (x <= 0 || y <= 0) + continue; + // 自分の周囲 + if (ms[i].target >= MST_AROUND1) + { + int bx = x, by = y, i = 0, c, m = bl->m, r = + ms[i].target - MST_AROUND1; + do + { + bx = x + MRAND ((r * 2 + 3)) - r; + by = y + MRAND ((r * 2 + 3)) - r; + } + while ((bx <= 0 || by <= 0 || bx >= map[m].xs + || by >= map[m].ys + || ((c = read_gat (m, bx, by)) == 1 || c == 5)) + && (i++) < 1000); + if (i < 1000) + { + x = bx; + y = by; + } + } + // 相手の周囲 + if (ms[i].target >= MST_AROUND5) + { + int bx = x, by = y, i = 0, c, m = bl->m, r = + (ms[i].target - MST_AROUND5) + 1; + do + { + bx = x + MRAND ((r * 2 + 1)) - r; + by = y + MRAND ((r * 2 + 1)) - r; + } + while ((bx <= 0 || by <= 0 || bx >= map[m].xs + || by >= map[m].ys + || ((c = read_gat (m, bx, by)) == 1 || c == 5)) + && (i++) < 1000); + if (i < 1000) + { + x = bx; + y = by; + } + } + if (!mobskill_use_pos (md, x, y, i)) + return 0; + + } + else + { + // ID指定 + if (ms[i].target <= MST_FRIEND) + { + struct block_list *bl = NULL; + bl = ((ms[i].target == + MST_TARGET) ? map_id2bl (md-> + target_id) : (ms[i].target + == + MST_FRIEND) + ? &fmd->bl : &md->bl); + if (bl && !mobskill_use_id (md, bl, i)) + return 0; + } + } + if (ms[i].emotion >= 0) + clif_emotion (&md->bl, ms[i].emotion); + return 1; + } + } - return 0; + return 0; } + /*========================================== * Skill use event processing *------------------------------------------ */ -int mobskill_event(struct mob_data *md,int flag) +int mobskill_event (struct mob_data *md, int flag) { - nullpo_retr(0, md); - - if(flag==-1 && mobskill_use(md,gettick(),MSC_CASTTARGETED)) - return 1; - if( (flag&BF_SHORT) && mobskill_use(md,gettick(),MSC_CLOSEDATTACKED)) - return 1; - if( (flag&BF_LONG) && mobskill_use(md,gettick(),MSC_LONGRANGEATTACKED)) - return 1; - return 0; + nullpo_retr (0, md); + + if (flag == -1 && mobskill_use (md, gettick (), MSC_CASTTARGETED)) + return 1; + if ((flag & BF_SHORT) + && mobskill_use (md, gettick (), MSC_CLOSEDATTACKED)) + return 1; + if ((flag & BF_LONG) + && mobskill_use (md, gettick (), MSC_LONGRANGEATTACKED)) + return 1; + return 0; } + /*========================================== * Mobがエンペリウムなどの場合の判定 *------------------------------------------ */ -int mob_gvmobcheck(struct map_session_data *sd, struct block_list *bl) +int mob_gvmobcheck (struct map_session_data *sd, struct block_list *bl) { - struct mob_data *md=NULL; - - nullpo_retr(0,sd); - nullpo_retr(0,bl); - - if(bl->type==BL_MOB && (md=(struct mob_data *)bl) && - (md->class == 1288 || md->class == 1287 || md->class == 1286 || md->class == 1285)) - { - struct guild_castle *gc=guild_mapname2gc(map[sd->bl.m].name); - struct guild *g=guild_search(sd->status.guild_id); - - if(g == NULL && md->class == 1288) - return 0;//ギルド未加入ならダメージ無し - else if(gc != NULL && !map[sd->bl.m].flag.gvg) - return 0;//砦内でGvじゃないときはダメージなし - else if(g && gc != NULL && g->guild_id == gc->guild_id) - return 0;//自占領ギルドのエンペならダメージ無し - else if(g && guild_checkskill(g,GD_APPROVAL) <= 0 && md->class == 1288) - return 0;//正規ギルド承認がないとダメージ無し - - } - - return 1; + struct mob_data *md = NULL; + + nullpo_retr (0, sd); + nullpo_retr (0, bl); + + if (bl->type == BL_MOB && (md = (struct mob_data *) bl) && + (md->class == 1288 || md->class == 1287 || md->class == 1286 + || md->class == 1285)) + { + struct guild_castle *gc = guild_mapname2gc (map[sd->bl.m].name); + struct guild *g = guild_search (sd->status.guild_id); + + if (g == NULL && md->class == 1288) + return 0; //ギルド未加入ならダメージ無し + else if (gc != NULL && !map[sd->bl.m].flag.gvg) + return 0; //砦内でGvじゃないときはダメージなし + else if (g && gc != NULL && g->guild_id == gc->guild_id) + return 0; //自占領ギルドのエンペならダメージ無し + else if (g && guild_checkskill (g, GD_APPROVAL) <= 0 + && md->class == 1288) + return 0; //正規ギルド承認がないとダメージ無し + + } + + return 1; } + /*========================================== * スキル用タイマー削除 *------------------------------------------ */ -int mobskill_deltimer(struct mob_data *md ) +int mobskill_deltimer (struct mob_data *md) { - nullpo_retr(0, md); - - if( md->skilltimer!=-1 ){ - if( skill_get_inf( md->skillid )&2 ) - delete_timer( md->skilltimer, mobskill_castend_pos ); - else - delete_timer( md->skilltimer, mobskill_castend_id ); - md->skilltimer=-1; - } - return 0; + nullpo_retr (0, md); + + if (md->skilltimer != -1) + { + if (skill_get_inf (md->skillid) & 2) + delete_timer (md->skilltimer, mobskill_castend_pos); + else + delete_timer (md->skilltimer, mobskill_castend_id); + md->skilltimer = -1; + } + return 0; } + // // 初期化 // @@ -3799,510 +4447,615 @@ int mobskill_deltimer(struct mob_data *md ) * Since un-setting [ mob ] up was used, it is an initial provisional value setup. *------------------------------------------ */ -static int mob_makedummymobdb(int class) +static int mob_makedummymobdb (int class) { - int i; - - sprintf(mob_db[class].name,"mob%d",class); - sprintf(mob_db[class].jname,"mob%d",class); - mob_db[class].lv=1; - mob_db[class].max_hp=1000; - mob_db[class].max_sp=1; - mob_db[class].base_exp=2; - mob_db[class].job_exp=1; - mob_db[class].range=1; - mob_db[class].atk1=7; - mob_db[class].atk2=10; - mob_db[class].def=0; - mob_db[class].mdef=0; - mob_db[class].str=1; - mob_db[class].agi=1; - mob_db[class].vit=1; - mob_db[class].int_=1; - mob_db[class].dex=6; - mob_db[class].luk=2; - mob_db[class].range2=10; - mob_db[class].range3=10; - mob_db[class].size=0; - mob_db[class].race=0; - mob_db[class].element=0; - mob_db[class].mode=0; - mob_db[class].speed=300; - mob_db[class].adelay=1000; - mob_db[class].amotion=500; - mob_db[class].dmotion=500; - mob_db[class].dropitem[0].nameid=909; // Jellopy - mob_db[class].dropitem[0].p=1000; - for(i=1;i<8;i++){ - mob_db[class].dropitem[i].nameid=0; - mob_db[class].dropitem[i].p=0; - } - // Item1,Item2 - mob_db[class].mexp=0; - mob_db[class].mexpper=0; - for(i=0;i<3;i++){ - mob_db[class].mvpitem[i].nameid=0; - mob_db[class].mvpitem[i].p=0; - } - for(i=0;i<MAX_RANDOMMONSTER;i++) - mob_db[class].summonper[i]=0; - return 0; + int i; + + sprintf (mob_db[class].name, "mob%d", class); + sprintf (mob_db[class].jname, "mob%d", class); + mob_db[class].lv = 1; + mob_db[class].max_hp = 1000; + mob_db[class].max_sp = 1; + mob_db[class].base_exp = 2; + mob_db[class].job_exp = 1; + mob_db[class].range = 1; + mob_db[class].atk1 = 7; + mob_db[class].atk2 = 10; + mob_db[class].def = 0; + mob_db[class].mdef = 0; + mob_db[class].str = 1; + mob_db[class].agi = 1; + mob_db[class].vit = 1; + mob_db[class].int_ = 1; + mob_db[class].dex = 6; + mob_db[class].luk = 2; + mob_db[class].range2 = 10; + mob_db[class].range3 = 10; + mob_db[class].size = 0; + mob_db[class].race = 0; + mob_db[class].element = 0; + mob_db[class].mode = 0; + mob_db[class].speed = 300; + mob_db[class].adelay = 1000; + mob_db[class].amotion = 500; + mob_db[class].dmotion = 500; + mob_db[class].dropitem[0].nameid = 909; // Jellopy + mob_db[class].dropitem[0].p = 1000; + for (i = 1; i < 8; i++) + { + mob_db[class].dropitem[i].nameid = 0; + mob_db[class].dropitem[i].p = 0; + } + // Item1,Item2 + mob_db[class].mexp = 0; + mob_db[class].mexpper = 0; + for (i = 0; i < 3; i++) + { + mob_db[class].mvpitem[i].nameid = 0; + mob_db[class].mvpitem[i].p = 0; + } + for (i = 0; i < MAX_RANDOMMONSTER; i++) + mob_db[class].summonper[i] = 0; + return 0; } /*========================================== * db/mob_db.txt reading *------------------------------------------ */ -static int mob_readdb(void) +static int mob_readdb (void) { - FILE *fp; - char line[1024]; - char *filename[]={ "db/mob_db.txt","db/mob_db2.txt" }; - int i; - - memset(mob_db,0,sizeof(mob_db)); - - for(i=0;i<2;i++){ - - fp=fopen_(filename[i],"r"); - if(fp==NULL){ - if(i>0) - continue; - return -1; - } - while(fgets(line,1020,fp)){ - int class,i; - char *str[57],*p,*np; - - if(line[0] == '/' && line[1] == '/') - continue; - - for(i=0,p=line;i<57;i++){ - while (*p == '\t' || *p == ' ') p++; - if((np=strchr(p,','))!=NULL){ - str[i]=p; - *np=0; - p=np+1; - } else - str[i]=p; - } - - class=atoi(str[0]); - if(class<=1000 || class>2000) - continue; - - mob_db[class].view_class=class; - memcpy(mob_db[class].name,str[1],24); - memcpy(mob_db[class].jname,str[2],24); - mob_db[class].lv=atoi(str[3]); - mob_db[class].max_hp=atoi(str[4]); - mob_db[class].max_sp=atoi(str[5]); - - mob_db[class].base_exp=atoi(str[6]); - if(mob_db[class].base_exp < 0) - mob_db[class].base_exp = 0; - else if(mob_db[class].base_exp > 0 && (mob_db[class].base_exp*battle_config.base_exp_rate/100 > 1000000000 || - mob_db[class].base_exp*battle_config.base_exp_rate/100 < 0)) - mob_db[class].base_exp=1000000000; - else - mob_db[class].base_exp*= battle_config.base_exp_rate/100; - - mob_db[class].job_exp=atoi(str[7]); - if(mob_db[class].job_exp < 0) - mob_db[class].job_exp = 0; - else if(mob_db[class].job_exp > 0 && (mob_db[class].job_exp*battle_config.job_exp_rate/100 > 1000000000 || - mob_db[class].job_exp*battle_config.job_exp_rate/100 < 0)) - mob_db[class].job_exp=1000000000; - else - mob_db[class].job_exp*=battle_config.job_exp_rate/100; - - mob_db[class].range=atoi(str[8]); - mob_db[class].atk1=atoi(str[9]); - mob_db[class].atk2=atoi(str[10]); - mob_db[class].def=atoi(str[11]); - mob_db[class].mdef=atoi(str[12]); - mob_db[class].str=atoi(str[13]); - mob_db[class].agi=atoi(str[14]); - mob_db[class].vit=atoi(str[15]); - mob_db[class].int_=atoi(str[16]); - mob_db[class].dex=atoi(str[17]); - mob_db[class].luk=atoi(str[18]); - mob_db[class].range2=atoi(str[19]); - mob_db[class].range3=atoi(str[20]); - mob_db[class].size=atoi(str[21]); - mob_db[class].race=atoi(str[22]); - mob_db[class].element=atoi(str[23]); - mob_db[class].mode=atoi(str[24]); - mob_db[class].speed=atoi(str[25]); - mob_db[class].adelay=atoi(str[26]); - mob_db[class].amotion=atoi(str[27]); - mob_db[class].dmotion=atoi(str[28]); - - for(i=0;i<8;i++){ - int rate = 0,type,ratemin,ratemax; - mob_db[class].dropitem[i].nameid=atoi(str[29+i*2]); - type = itemdb_type(mob_db[class].dropitem[i].nameid); - if (type == 0) { // Added [Valaris] - rate = battle_config.item_rate_heal; - ratemin = battle_config.item_drop_heal_min; - ratemax = battle_config.item_drop_heal_max; - } - else if (type == 2) { - rate = battle_config.item_rate_use; - ratemin = battle_config.item_drop_use_min; - ratemax = battle_config.item_drop_use_max; // End - } - else if (type == 4 || type == 5 || type == 8) { - rate = battle_config.item_rate_equip; - ratemin = battle_config.item_drop_equip_min; - ratemax = battle_config.item_drop_equip_max; - } - else if (type == 6) { - rate = battle_config.item_rate_card; - ratemin = battle_config.item_drop_card_min; - ratemax = battle_config.item_drop_card_max; - } - else { - rate = battle_config.item_rate_common; - ratemin = battle_config.item_drop_common_min; - ratemax = battle_config.item_drop_common_max; - } - rate = (rate / 100) * atoi(str[30+i*2]); - rate = (rate < ratemin)? ratemin: (rate > ratemax)? ratemax: rate; - mob_db[class].dropitem[i].p = rate; - } - // Item1,Item2 - mob_db[class].mexp=atoi(str[45])*battle_config.mvp_exp_rate/100; - mob_db[class].mexpper=atoi(str[46]); - for(i=0;i<3;i++){ - mob_db[class].mvpitem[i].nameid=atoi(str[47+i*2]); - mob_db[class].mvpitem[i].p=atoi(str[48+i*2])*battle_config.mvp_item_rate/100; - } - mob_db[class].mutations_nr = atoi(str[55]); - mob_db[class].mutation_power = atoi(str[56]); - - for(i=0;i<MAX_RANDOMMONSTER;i++) - mob_db[class].summonper[i]=0; - mob_db[class].maxskill=0; - - mob_db[class].sex=0; - mob_db[class].hair=0; - mob_db[class].hair_color=0; - mob_db[class].weapon=0; - mob_db[class].shield=0; - mob_db[class].head_top=0; - mob_db[class].head_mid=0; - mob_db[class].head_buttom=0; - mob_db[class].clothes_color=0; //Add for player monster dye - Valaris - - if (mob_db[class].base_exp == 0) mob_db[class].base_exp = mob_gen_exp(&mob_db[class]); - } - fclose_(fp); - printf("read %s done\n",filename[i]); - } - return 0; + FILE *fp; + char line[1024]; + char *filename[] = { "db/mob_db.txt", "db/mob_db2.txt" }; + int i; + + memset (mob_db, 0, sizeof (mob_db)); + + for (i = 0; i < 2; i++) + { + + fp = fopen_ (filename[i], "r"); + if (fp == NULL) + { + if (i > 0) + continue; + return -1; + } + while (fgets (line, 1020, fp)) + { + int class, i; + char *str[57], *p, *np; + + if (line[0] == '/' && line[1] == '/') + continue; + + for (i = 0, p = line; i < 57; i++) + { + while (*p == '\t' || *p == ' ') + p++; + if ((np = strchr (p, ',')) != NULL) + { + str[i] = p; + *np = 0; + p = np + 1; + } + else + str[i] = p; + } + + class = atoi (str[0]); + if (class <= 1000 || class > 2000) + continue; + + mob_db[class].view_class = class; + memcpy (mob_db[class].name, str[1], 24); + memcpy (mob_db[class].jname, str[2], 24); + mob_db[class].lv = atoi (str[3]); + mob_db[class].max_hp = atoi (str[4]); + mob_db[class].max_sp = atoi (str[5]); + + mob_db[class].base_exp = atoi (str[6]); + if (mob_db[class].base_exp < 0) + mob_db[class].base_exp = 0; + else if (mob_db[class].base_exp > 0 + && (mob_db[class].base_exp * + battle_config.base_exp_rate / 100 > 1000000000 + || mob_db[class].base_exp * + battle_config.base_exp_rate / 100 < 0)) + mob_db[class].base_exp = 1000000000; + else + mob_db[class].base_exp *= battle_config.base_exp_rate / 100; + + mob_db[class].job_exp = atoi (str[7]); + if (mob_db[class].job_exp < 0) + mob_db[class].job_exp = 0; + else if (mob_db[class].job_exp > 0 + && (mob_db[class].job_exp * battle_config.job_exp_rate / + 100 > 1000000000 + || mob_db[class].job_exp * + battle_config.job_exp_rate / 100 < 0)) + mob_db[class].job_exp = 1000000000; + else + mob_db[class].job_exp *= battle_config.job_exp_rate / 100; + + mob_db[class].range = atoi (str[8]); + mob_db[class].atk1 = atoi (str[9]); + mob_db[class].atk2 = atoi (str[10]); + mob_db[class].def = atoi (str[11]); + mob_db[class].mdef = atoi (str[12]); + mob_db[class].str = atoi (str[13]); + mob_db[class].agi = atoi (str[14]); + mob_db[class].vit = atoi (str[15]); + mob_db[class].int_ = atoi (str[16]); + mob_db[class].dex = atoi (str[17]); + mob_db[class].luk = atoi (str[18]); + mob_db[class].range2 = atoi (str[19]); + mob_db[class].range3 = atoi (str[20]); + mob_db[class].size = atoi (str[21]); + mob_db[class].race = atoi (str[22]); + mob_db[class].element = atoi (str[23]); + mob_db[class].mode = atoi (str[24]); + mob_db[class].speed = atoi (str[25]); + mob_db[class].adelay = atoi (str[26]); + mob_db[class].amotion = atoi (str[27]); + mob_db[class].dmotion = atoi (str[28]); + + for (i = 0; i < 8; i++) + { + int rate = 0, type, ratemin, ratemax; + mob_db[class].dropitem[i].nameid = atoi (str[29 + i * 2]); + type = itemdb_type (mob_db[class].dropitem[i].nameid); + if (type == 0) + { // Added [Valaris] + rate = battle_config.item_rate_heal; + ratemin = battle_config.item_drop_heal_min; + ratemax = battle_config.item_drop_heal_max; + } + else if (type == 2) + { + rate = battle_config.item_rate_use; + ratemin = battle_config.item_drop_use_min; + ratemax = battle_config.item_drop_use_max; // End + } + else if (type == 4 || type == 5 || type == 8) + { + rate = battle_config.item_rate_equip; + ratemin = battle_config.item_drop_equip_min; + ratemax = battle_config.item_drop_equip_max; + } + else if (type == 6) + { + rate = battle_config.item_rate_card; + ratemin = battle_config.item_drop_card_min; + ratemax = battle_config.item_drop_card_max; + } + else + { + rate = battle_config.item_rate_common; + ratemin = battle_config.item_drop_common_min; + ratemax = battle_config.item_drop_common_max; + } + rate = (rate / 100) * atoi (str[30 + i * 2]); + rate = + (rate < ratemin) ? ratemin : (rate > + ratemax) ? ratemax : rate; + mob_db[class].dropitem[i].p = rate; + } + // Item1,Item2 + mob_db[class].mexp = + atoi (str[45]) * battle_config.mvp_exp_rate / 100; + mob_db[class].mexpper = atoi (str[46]); + for (i = 0; i < 3; i++) + { + mob_db[class].mvpitem[i].nameid = atoi (str[47 + i * 2]); + mob_db[class].mvpitem[i].p = + atoi (str[48 + i * 2]) * battle_config.mvp_item_rate / + 100; + } + mob_db[class].mutations_nr = atoi (str[55]); + mob_db[class].mutation_power = atoi (str[56]); + + for (i = 0; i < MAX_RANDOMMONSTER; i++) + mob_db[class].summonper[i] = 0; + mob_db[class].maxskill = 0; + + mob_db[class].sex = 0; + mob_db[class].hair = 0; + mob_db[class].hair_color = 0; + mob_db[class].weapon = 0; + mob_db[class].shield = 0; + mob_db[class].head_top = 0; + mob_db[class].head_mid = 0; + mob_db[class].head_buttom = 0; + mob_db[class].clothes_color = 0; //Add for player monster dye - Valaris + + if (mob_db[class].base_exp == 0) + mob_db[class].base_exp = mob_gen_exp (&mob_db[class]); + } + fclose_ (fp); + printf ("read %s done\n", filename[i]); + } + return 0; } /*========================================== * MOB display graphic change data reading *------------------------------------------ */ -static int mob_readdb_mobavail(void) +static int mob_readdb_mobavail (void) { - FILE *fp; - char line[1024]; - int ln=0; - int class,j,k; - char *str[20],*p,*np; - - if( (fp=fopen_("db/mob_avail.txt","r"))==NULL ){ - printf("can't read db/mob_avail.txt\n"); - return -1; - } - - while(fgets(line,1020,fp)){ - if(line[0]=='/' && line[1]=='/') - continue; - memset(str,0,sizeof(str)); - - for(j=0,p=line;j<12;j++){ - if((np=strchr(p,','))!=NULL){ - str[j]=p; - *np=0; - p=np+1; - } else - str[j]=p; - } + FILE *fp; + char line[1024]; + int ln = 0; + int class, j, k; + char *str[20], *p, *np; + + if ((fp = fopen_ ("db/mob_avail.txt", "r")) == NULL) + { + printf ("can't read db/mob_avail.txt\n"); + return -1; + } + + while (fgets (line, 1020, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + memset (str, 0, sizeof (str)); + + for (j = 0, p = line; j < 12; j++) + { + if ((np = strchr (p, ',')) != NULL) + { + str[j] = p; + *np = 0; + p = np + 1; + } + else + str[j] = p; + } - if(str[0]==NULL) - continue; - - class=atoi(str[0]); - - if(class<=1000 || class>2000) // 値が異常なら処理しない。 - continue; - k=atoi(str[1]); - if(k >= 0) - mob_db[class].view_class=k; - - if((mob_db[class].view_class < 24) || (mob_db[class].view_class > 4000)) { - mob_db[class].sex=atoi(str[2]); - mob_db[class].hair=atoi(str[3]); - mob_db[class].hair_color=atoi(str[4]); - mob_db[class].weapon=atoi(str[5]); - mob_db[class].shield=atoi(str[6]); - mob_db[class].head_top=atoi(str[7]); - mob_db[class].head_mid=atoi(str[8]); - mob_db[class].head_buttom=atoi(str[9]); - mob_db[class].option=atoi(str[10])&~0x46; - mob_db[class].clothes_color=atoi(str[11]); // Monster player dye option - Valaris - } + if (str[0] == NULL) + continue; + + class = atoi (str[0]); + + if (class <= 1000 || class > 2000) // 値が異常なら処理しない。 + continue; + k = atoi (str[1]); + if (k >= 0) + mob_db[class].view_class = k; + + if ((mob_db[class].view_class < 24) + || (mob_db[class].view_class > 4000)) + { + mob_db[class].sex = atoi (str[2]); + mob_db[class].hair = atoi (str[3]); + mob_db[class].hair_color = atoi (str[4]); + mob_db[class].weapon = atoi (str[5]); + mob_db[class].shield = atoi (str[6]); + mob_db[class].head_top = atoi (str[7]); + mob_db[class].head_mid = atoi (str[8]); + mob_db[class].head_buttom = atoi (str[9]); + mob_db[class].option = atoi (str[10]) & ~0x46; + mob_db[class].clothes_color = atoi (str[11]); // Monster player dye option - Valaris + } - else if(atoi(str[2]) > 0) mob_db[class].equip=atoi(str[2]); // mob equipment [Valaris] + else if (atoi (str[2]) > 0) + mob_db[class].equip = atoi (str[2]); // mob equipment [Valaris] - ln++; - } - fclose_(fp); - printf("read db/mob_avail.txt done (count=%d)\n",ln); - return 0; + ln++; + } + fclose_ (fp); + printf ("read db/mob_avail.txt done (count=%d)\n", ln); + return 0; } /*========================================== * Reading of random monster data *------------------------------------------ */ -static int mob_read_randommonster(void) +static int mob_read_randommonster (void) { - FILE *fp; - char line[1024]; - char *str[10],*p; - int i,j; - - const char* mobfile[] = { - "db/mob_branch.txt", - "db/mob_poring.txt", - "db/mob_boss.txt" }; - - for(i=0;i<MAX_RANDOMMONSTER;i++){ - mob_db[0].summonper[i] = 1002; // 設定し忘れた場合はポリンが出るようにしておく - fp=fopen_(mobfile[i],"r"); - if(fp==NULL){ - printf("can't read %s\n",mobfile[i]); - return -1; - } - while(fgets(line,1020,fp)){ - int class,per; - if(line[0] == '/' && line[1] == '/') - continue; - memset(str,0,sizeof(str)); - for(j=0,p=line;j<3 && p;j++){ - str[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } - - if(str[0]==NULL || str[2]==NULL) - continue; - - class = atoi(str[0]); - per=atoi(str[2]); - if((class>1000 && class<=2000) || class==0) - mob_db[class].summonper[i]=per; - } - fclose_(fp); - printf("read %s done\n",mobfile[i]); - } - return 0; + FILE *fp; + char line[1024]; + char *str[10], *p; + int i, j; + + const char *mobfile[] = { + "db/mob_branch.txt", + "db/mob_poring.txt", + "db/mob_boss.txt" + }; + + for (i = 0; i < MAX_RANDOMMONSTER; i++) + { + mob_db[0].summonper[i] = 1002; // 設定し忘れた場合はポリンが出るようにしておく + fp = fopen_ (mobfile[i], "r"); + if (fp == NULL) + { + printf ("can't read %s\n", mobfile[i]); + return -1; + } + while (fgets (line, 1020, fp)) + { + int class, per; + if (line[0] == '/' && line[1] == '/') + continue; + memset (str, 0, sizeof (str)); + for (j = 0, p = line; j < 3 && p; j++) + { + str[j] = p; + p = strchr (p, ','); + if (p) + *p++ = 0; + } + + if (str[0] == NULL || str[2] == NULL) + continue; + + class = atoi (str[0]); + per = atoi (str[2]); + if ((class > 1000 && class <= 2000) || class == 0) + mob_db[class].summonper[i] = per; + } + fclose_ (fp); + printf ("read %s done\n", mobfile[i]); + } + return 0; } + /*========================================== * db/mob_skill_db.txt reading *------------------------------------------ */ -static int mob_readskilldb(void) +static int mob_readskilldb (void) { - FILE *fp; - char line[1024]; - int i; - - const struct { - char str[32]; - int id; - } cond1[] = { - { "always", MSC_ALWAYS }, - { "myhpltmaxrate", MSC_MYHPLTMAXRATE }, - { "friendhpltmaxrate",MSC_FRIENDHPLTMAXRATE }, - { "mystatuson", MSC_MYSTATUSON }, - { "mystatusoff", MSC_MYSTATUSOFF }, - { "friendstatuson", MSC_FRIENDSTATUSON }, - { "friendstatusoff", MSC_FRIENDSTATUSOFF }, - { "attackpcgt", MSC_ATTACKPCGT }, - { "attackpcge", MSC_ATTACKPCGE }, - { "slavelt", MSC_SLAVELT }, - { "slavele", MSC_SLAVELE }, - { "closedattacked", MSC_CLOSEDATTACKED }, - { "longrangeattacked",MSC_LONGRANGEATTACKED }, - { "skillused", MSC_SKILLUSED }, - { "casttargeted", MSC_CASTTARGETED }, - }, cond2[] ={ - { "anybad", -1 }, - { "stone", SC_STONE }, - { "freeze", SC_FREEZE }, - { "stan", SC_STAN }, - { "sleep", SC_SLEEP }, - { "poison", SC_POISON }, - { "curse", SC_CURSE }, - { "silence", SC_SILENCE }, - { "confusion", SC_CONFUSION }, - { "blind", SC_BLIND }, - { "hiding", SC_HIDING }, - { "sight", SC_SIGHT }, - }, state[] = { - { "any", -1 }, - { "idle", MSS_IDLE }, - { "walk", MSS_WALK }, - { "attack", MSS_ATTACK }, - { "dead", MSS_DEAD }, - { "loot", MSS_LOOT }, - { "chase", MSS_CHASE }, - }, target[] = { - { "target", MST_TARGET }, - { "self", MST_SELF }, - { "friend", MST_FRIEND }, - { "around5", MST_AROUND5 }, - { "around6", MST_AROUND6 }, - { "around7", MST_AROUND7 }, - { "around8", MST_AROUND8 }, - { "around1", MST_AROUND1 }, - { "around2", MST_AROUND2 }, - { "around3", MST_AROUND3 }, - { "around4", MST_AROUND4 }, - { "around", MST_AROUND }, - }; - - int x; - char *filename[]={ "db/mob_skill_db.txt","db/mob_skill_db2.txt" }; - - for(x=0;x<2;x++){ - - fp=fopen_(filename[x],"r"); - if(fp==NULL){ - if(x==0) - printf("can't read %s\n",filename[x]); - continue; - } - while(fgets(line,1020,fp)){ - char *sp[20],*p; - int mob_id; - struct mob_skill *ms; - int j=0; - - if(line[0] == '/' && line[1] == '/') - continue; - - memset(sp,0,sizeof(sp)); - for(i=0,p=line;i<18 && p;i++){ - sp[i]=p; - if((p=strchr(p,','))!=NULL) - *p++=0; - } - if( (mob_id=atoi(sp[0]))<=0 ) - continue; - - if( strcmp(sp[1],"clear")==0 ){ - memset(mob_db[mob_id].skill,0,sizeof(mob_db[mob_id].skill)); - mob_db[mob_id].maxskill=0; - continue; - } - - for(i=0;i<MAX_MOBSKILL;i++) - if( (ms=&mob_db[mob_id].skill[i])->skill_id == 0) - break; - if(i==MAX_MOBSKILL){ - printf("mob_skill: readdb: too many skill ! [%s] in %d[%s]\n", - sp[1],mob_id,mob_db[mob_id].jname); - continue; - } - - ms->state=atoi(sp[2]); - for(j=0;j<sizeof(state)/sizeof(state[0]);j++){ - if( strcmp(sp[2],state[j].str)==0) - ms->state=state[j].id; - } - ms->skill_id=atoi(sp[3]); - ms->skill_lv=atoi(sp[4]); - - ms->permillage=atoi(sp[5]); - ms->casttime=atoi(sp[6]); - ms->delay=atoi(sp[7]); - ms->cancel=atoi(sp[8]); - if( strcmp(sp[8],"yes")==0 ) ms->cancel=1; - ms->target=atoi(sp[9]); - for(j=0;j<sizeof(target)/sizeof(target[0]);j++){ - if( strcmp(sp[9],target[j].str)==0) - ms->target=target[j].id; - } - ms->cond1=-1; - for(j=0;j<sizeof(cond1)/sizeof(cond1[0]);j++){ - if( strcmp(sp[10],cond1[j].str)==0) - ms->cond1=cond1[j].id; - } - ms->cond2=atoi(sp[11]); - for(j=0;j<sizeof(cond2)/sizeof(cond2[0]);j++){ - if( strcmp(sp[11],cond2[j].str)==0) - ms->cond2=cond2[j].id; - } - ms->val[0]=atoi(sp[12]); - ms->val[1]=atoi(sp[13]); - ms->val[2]=atoi(sp[14]); - ms->val[3]=atoi(sp[15]); - ms->val[4]=atoi(sp[16]); - if(sp[17] != NULL && strlen(sp[17])>2) - ms->emotion=atoi(sp[17]); - else - ms->emotion=-1; - mob_db[mob_id].maxskill=i+1; - } - fclose_(fp); - printf("read %s done\n",filename[x]); - } - return 0; + FILE *fp; + char line[1024]; + int i; + + const struct + { + char str[32]; + int id; + } cond1[] = + { + { + "always", MSC_ALWAYS}, + { + "myhpltmaxrate", MSC_MYHPLTMAXRATE}, + { + "friendhpltmaxrate", MSC_FRIENDHPLTMAXRATE}, + { + "mystatuson", MSC_MYSTATUSON}, + { + "mystatusoff", MSC_MYSTATUSOFF}, + { + "friendstatuson", MSC_FRIENDSTATUSON}, + { + "friendstatusoff", MSC_FRIENDSTATUSOFF}, + { + "attackpcgt", MSC_ATTACKPCGT}, + { + "attackpcge", MSC_ATTACKPCGE}, + { + "slavelt", MSC_SLAVELT}, + { + "slavele", MSC_SLAVELE}, + { + "closedattacked", MSC_CLOSEDATTACKED}, + { + "longrangeattacked", MSC_LONGRANGEATTACKED}, + { + "skillused", MSC_SKILLUSED}, + { + "casttargeted", MSC_CASTTARGETED},}, cond2[] = + { + { + "anybad", -1}, + { + "stone", SC_STONE}, + { + "freeze", SC_FREEZE}, + { + "stan", SC_STAN}, + { + "sleep", SC_SLEEP}, + { + "poison", SC_POISON}, + { + "curse", SC_CURSE}, + { + "silence", SC_SILENCE}, + { + "confusion", SC_CONFUSION}, + { + "blind", SC_BLIND}, + { + "hiding", SC_HIDING}, + { + "sight", SC_SIGHT},}, state[] = + { + { + "any", -1}, + { + "idle", MSS_IDLE}, + { + "walk", MSS_WALK}, + { + "attack", MSS_ATTACK}, + { + "dead", MSS_DEAD}, + { + "loot", MSS_LOOT}, + { + "chase", MSS_CHASE},}, target[] = + { + { + "target", MST_TARGET}, + { + "self", MST_SELF}, + { + "friend", MST_FRIEND}, + { + "around5", MST_AROUND5}, + { + "around6", MST_AROUND6}, + { + "around7", MST_AROUND7}, + { + "around8", MST_AROUND8}, + { + "around1", MST_AROUND1}, + { + "around2", MST_AROUND2}, + { + "around3", MST_AROUND3}, + { + "around4", MST_AROUND4}, + { + "around", MST_AROUND},}; + + int x; + char *filename[] = { "db/mob_skill_db.txt", "db/mob_skill_db2.txt" }; + + for (x = 0; x < 2; x++) + { + + fp = fopen_ (filename[x], "r"); + if (fp == NULL) + { + if (x == 0) + printf ("can't read %s\n", filename[x]); + continue; + } + while (fgets (line, 1020, fp)) + { + char *sp[20], *p; + int mob_id; + struct mob_skill *ms; + int j = 0; + + if (line[0] == '/' && line[1] == '/') + continue; + + memset (sp, 0, sizeof (sp)); + for (i = 0, p = line; i < 18 && p; i++) + { + sp[i] = p; + if ((p = strchr (p, ',')) != NULL) + *p++ = 0; + } + if ((mob_id = atoi (sp[0])) <= 0) + continue; + + if (strcmp (sp[1], "clear") == 0) + { + memset (mob_db[mob_id].skill, 0, + sizeof (mob_db[mob_id].skill)); + mob_db[mob_id].maxskill = 0; + continue; + } + + for (i = 0; i < MAX_MOBSKILL; i++) + if ((ms = &mob_db[mob_id].skill[i])->skill_id == 0) + break; + if (i == MAX_MOBSKILL) + { + printf + ("mob_skill: readdb: too many skill ! [%s] in %d[%s]\n", + sp[1], mob_id, mob_db[mob_id].jname); + continue; + } + + ms->state = atoi (sp[2]); + for (j = 0; j < sizeof (state) / sizeof (state[0]); j++) + { + if (strcmp (sp[2], state[j].str) == 0) + ms->state = state[j].id; + } + ms->skill_id = atoi (sp[3]); + ms->skill_lv = atoi (sp[4]); + + ms->permillage = atoi (sp[5]); + ms->casttime = atoi (sp[6]); + ms->delay = atoi (sp[7]); + ms->cancel = atoi (sp[8]); + if (strcmp (sp[8], "yes") == 0) + ms->cancel = 1; + ms->target = atoi (sp[9]); + for (j = 0; j < sizeof (target) / sizeof (target[0]); j++) + { + if (strcmp (sp[9], target[j].str) == 0) + ms->target = target[j].id; + } + ms->cond1 = -1; + for (j = 0; j < sizeof (cond1) / sizeof (cond1[0]); j++) + { + if (strcmp (sp[10], cond1[j].str) == 0) + ms->cond1 = cond1[j].id; + } + ms->cond2 = atoi (sp[11]); + for (j = 0; j < sizeof (cond2) / sizeof (cond2[0]); j++) + { + if (strcmp (sp[11], cond2[j].str) == 0) + ms->cond2 = cond2[j].id; + } + ms->val[0] = atoi (sp[12]); + ms->val[1] = atoi (sp[13]); + ms->val[2] = atoi (sp[14]); + ms->val[3] = atoi (sp[15]); + ms->val[4] = atoi (sp[16]); + if (sp[17] != NULL && strlen (sp[17]) > 2) + ms->emotion = atoi (sp[17]); + else + ms->emotion = -1; + mob_db[mob_id].maxskill = i + 1; + } + fclose_ (fp); + printf ("read %s done\n", filename[x]); + } + return 0; } -void mob_reload(void) +void mob_reload (void) { - /* - - <empty monster database> - mob_read(); - - */ - - do_init_mob(); + /* + * + * <empty monster database> + * mob_read(); + * + */ + + do_init_mob (); } /*========================================== * Circumference initialization of mob *------------------------------------------ */ -int do_init_mob(void) +int do_init_mob (void) { - mob_readdb(); - - mob_readdb_mobavail(); - mob_read_randommonster(); - mob_readskilldb(); - - add_timer_func_list(mob_timer,"mob_timer"); - add_timer_func_list(mob_delayspawn,"mob_delayspawn"); - add_timer_func_list(mob_delay_item_drop,"mob_delay_item_drop"); - add_timer_func_list(mob_delay_item_drop2,"mob_delay_item_drop2"); - add_timer_func_list(mob_ai_hard,"mob_ai_hard"); - add_timer_func_list(mob_ai_lazy,"mob_ai_lazy"); - add_timer_func_list(mobskill_castend_id,"mobskill_castend_id"); - add_timer_func_list(mobskill_castend_pos,"mobskill_castend_pos"); - add_timer_func_list(mob_timer_delete,"mob_timer_delete"); - add_timer_interval(gettick()+MIN_MOBTHINKTIME,mob_ai_hard,0,0,MIN_MOBTHINKTIME); - add_timer_interval(gettick()+MIN_MOBTHINKTIME*10,mob_ai_lazy,0,0,MIN_MOBTHINKTIME*10); - - return 0; + mob_readdb (); + + mob_readdb_mobavail (); + mob_read_randommonster (); + mob_readskilldb (); + + add_timer_func_list (mob_timer, "mob_timer"); + add_timer_func_list (mob_delayspawn, "mob_delayspawn"); + add_timer_func_list (mob_delay_item_drop, "mob_delay_item_drop"); + add_timer_func_list (mob_delay_item_drop2, "mob_delay_item_drop2"); + add_timer_func_list (mob_ai_hard, "mob_ai_hard"); + add_timer_func_list (mob_ai_lazy, "mob_ai_lazy"); + add_timer_func_list (mobskill_castend_id, "mobskill_castend_id"); + add_timer_func_list (mobskill_castend_pos, "mobskill_castend_pos"); + add_timer_func_list (mob_timer_delete, "mob_timer_delete"); + add_timer_interval (gettick () + MIN_MOBTHINKTIME, mob_ai_hard, 0, 0, + MIN_MOBTHINKTIME); + add_timer_interval (gettick () + MIN_MOBTHINKTIME * 10, mob_ai_lazy, 0, 0, + MIN_MOBTHINKTIME * 10); + + return 0; } diff --git a/src/map/mob.h b/src/map/mob.h index 2675e44..14c359c 100644 --- a/src/map/mob.h +++ b/src/map/mob.h @@ -4,135 +4,146 @@ #define MAX_RANDOMMONSTER 3 -struct mob_skill { - short state; - short skill_id,skill_lv; - short permillage; - int casttime,delay; - short cancel; - short cond1,cond2; - short target; - int val[5]; - short emotion; +struct mob_skill +{ + short state; + short skill_id, skill_lv; + short permillage; + int casttime, delay; + short cancel; + short cond1, cond2; + short target; + int val[5]; + short emotion; }; -struct mob_db { - char name[24],jname[24]; - int lv; - int max_hp,max_sp; - int base_exp,job_exp; - int atk1,atk2; - int def,mdef; - int str,agi,vit,int_,dex,luk; - int range,range2,range3; - int size,race,element,mode; - int speed,adelay,amotion,dmotion; - int mexp,mexpper; - int mutations_nr, mutation_power; - struct { int nameid,p; } dropitem[8]; - struct { int nameid,p; } mvpitem[3]; - int view_class,sex; - short hair,hair_color,weapon,shield,head_top,head_mid,head_buttom,option,clothes_color; // [Valaris] - int equip; // [Valaris] - int summonper[MAX_RANDOMMONSTER]; - int maxskill; - struct mob_skill skill[MAX_MOBSKILL]; +struct mob_db +{ + char name[24], jname[24]; + int lv; + int max_hp, max_sp; + int base_exp, job_exp; + int atk1, atk2; + int def, mdef; + int str, agi, vit, int_, dex, luk; + int range, range2, range3; + int size, race, element, mode; + int speed, adelay, amotion, dmotion; + int mexp, mexpper; + int mutations_nr, mutation_power; + struct + { + int nameid, p; + } dropitem[8]; + struct + { + int nameid, p; + } mvpitem[3]; + int view_class, sex; + short hair, hair_color, weapon, shield, head_top, head_mid, head_buttom, option, clothes_color; // [Valaris] + int equip; // [Valaris] + int summonper[MAX_RANDOMMONSTER]; + int maxskill; + struct mob_skill skill[MAX_MOBSKILL]; }; extern struct mob_db mob_db[]; -enum { - MST_TARGET = 0, - MST_SELF = 1, - MST_FRIEND = 2, - MST_AROUND5 = 3, - MST_AROUND6 = 4, - MST_AROUND7 = 5, - MST_AROUND8 = 6, - MST_AROUND1 = 7, - MST_AROUND2 = 8, - MST_AROUND3 = 9, - MST_AROUND4 = 10, - MST_AROUND = MST_AROUND4, - - MSC_ALWAYS = 0x0000, - MSC_MYHPLTMAXRATE = 0x0001, - MSC_FRIENDHPLTMAXRATE= 0x0010, - MSC_MYSTATUSON = 0x0020, - MSC_MYSTATUSOFF = 0x0021, - MSC_FRIENDSTATUSON = 0x0030, - MSC_FRIENDSTATUSOFF = 0x0031, - - MSC_ATTACKPCGT = 0x0100, - MSC_ATTACKPCGE = 0x0101, - MSC_SLAVELT = 0x0110, - MSC_SLAVELE = 0x0111, - MSC_CLOSEDATTACKED = 0x1000, - MSC_LONGRANGEATTACKED= 0x1001, - MSC_SKILLUSED = 0x1010, - MSC_CASTTARGETED = 0x1011, +enum +{ + MST_TARGET = 0, + MST_SELF = 1, + MST_FRIEND = 2, + MST_AROUND5 = 3, + MST_AROUND6 = 4, + MST_AROUND7 = 5, + MST_AROUND8 = 6, + MST_AROUND1 = 7, + MST_AROUND2 = 8, + MST_AROUND3 = 9, + MST_AROUND4 = 10, + MST_AROUND = MST_AROUND4, + + MSC_ALWAYS = 0x0000, + MSC_MYHPLTMAXRATE = 0x0001, + MSC_FRIENDHPLTMAXRATE = 0x0010, + MSC_MYSTATUSON = 0x0020, + MSC_MYSTATUSOFF = 0x0021, + MSC_FRIENDSTATUSON = 0x0030, + MSC_FRIENDSTATUSOFF = 0x0031, + + MSC_ATTACKPCGT = 0x0100, + MSC_ATTACKPCGE = 0x0101, + MSC_SLAVELT = 0x0110, + MSC_SLAVELE = 0x0111, + MSC_CLOSEDATTACKED = 0x1000, + MSC_LONGRANGEATTACKED = 0x1001, + MSC_SKILLUSED = 0x1010, + MSC_CASTTARGETED = 0x1011, }; -enum { - MSS_IDLE, // 待機 - MSS_WALK, // 移動 - MSS_ATTACK, // 攻撃 - MSS_DEAD, // 死亡 - MSS_LOOT, // ルート - MSS_CHASE, // 突撃 +enum +{ + MSS_IDLE, // 待機 + MSS_WALK, // 移動 + MSS_ATTACK, // 攻撃 + MSS_DEAD, // 死亡 + MSS_LOOT, // ルート + MSS_CHASE, // 突撃 }; -int mobdb_searchname(const char *str); -int mobdb_checkid(const int id); -int mob_once_spawn(struct map_session_data *sd,char *mapname, - int x,int y,const char *mobname,int class,int amount,const char *event); -int mob_once_spawn_area(struct map_session_data *sd,char *mapname, - int x0,int y0,int x1,int y1, - const char *mobname,int class,int amount,const char *event); - -int mob_spawn_guardian(struct map_session_data *sd,char *mapname, // Spawning Guardians [Valaris] - int x,int y,const char *mobname,int class,int amount,const char *event,int guardian); // Spawning Guardians [Valaris] - - -int mob_walktoxy(struct mob_data *md,int x,int y,int easy); - -int mob_target(struct mob_data *md,struct block_list *bl,int dist); -int mob_stop_walking(struct mob_data *md,int type); -int mob_stopattack(struct mob_data *); -int mob_spawn(int); -int mob_damage(struct block_list *,struct mob_data*,int,int); -int mob_changestate(struct mob_data *md,int state,int type); -int mob_heal(struct mob_data*,int); -int mob_get_viewclass(int); -int mob_get_sex(int); -short mob_get_hair(int); -short mob_get_hair_color(int); -short mob_get_weapon(int); -short mob_get_shield(int); -short mob_get_head_top(int); -short mob_get_head_mid(int); -short mob_get_head_buttom(int); -short mob_get_clothes_color(int); //player mob dye [Valaris] -int mob_get_equip(int); // mob equip [Valaris] -int do_init_mob(void); - -int mob_delete(struct mob_data *md); -int mob_catch_delete(struct mob_data *md,int type); -int mob_timer_delete(int tid, unsigned int tick, int id, int data); - -int mob_deleteslave(struct mob_data *md); - -int mob_counttargeted(struct mob_data *md,struct block_list *src,int target_lv); - -int mob_class_change(struct mob_data *md,int *value); -int mob_warp(struct mob_data *md,int m,int x,int y,int type); - -int mobskill_use(struct mob_data *md,unsigned int tick,int event); -int mobskill_event(struct mob_data *md,int flag); -int mobskill_castend_id( int tid, unsigned int tick, int id,int data ); -int mobskill_castend_pos( int tid, unsigned int tick, int id,int data ); -int mob_summonslave(struct mob_data *md2,int *value,int amount,int flag); - -int mob_gvmobcheck(struct map_session_data *sd, struct block_list *bl); -void mob_reload(void); +int mobdb_searchname (const char *str); +int mobdb_checkid (const int id); +int mob_once_spawn (struct map_session_data *sd, char *mapname, + int x, int y, const char *mobname, int class, int amount, + const char *event); +int mob_once_spawn_area (struct map_session_data *sd, char *mapname, int x0, + int y0, int x1, int y1, const char *mobname, + int class, int amount, const char *event); + +int mob_spawn_guardian (struct map_session_data *sd, char *mapname, // Spawning Guardians [Valaris] + int x, int y, const char *mobname, int class, int amount, const char *event, int guardian); // Spawning Guardians [Valaris] + +int mob_walktoxy (struct mob_data *md, int x, int y, int easy); + +int mob_target (struct mob_data *md, struct block_list *bl, int dist); +int mob_stop_walking (struct mob_data *md, int type); +int mob_stopattack (struct mob_data *); +int mob_spawn (int); +int mob_damage (struct block_list *, struct mob_data *, int, int); +int mob_changestate (struct mob_data *md, int state, int type); +int mob_heal (struct mob_data *, int); +int mob_get_viewclass (int); +int mob_get_sex (int); +short mob_get_hair (int); +short mob_get_hair_color (int); +short mob_get_weapon (int); +short mob_get_shield (int); +short mob_get_head_top (int); +short mob_get_head_mid (int); +short mob_get_head_buttom (int); +short mob_get_clothes_color (int); //player mob dye [Valaris] +int mob_get_equip (int); // mob equip [Valaris] +int do_init_mob (void); + +int mob_delete (struct mob_data *md); +int mob_catch_delete (struct mob_data *md, int type); +int mob_timer_delete (int tid, unsigned int tick, int id, int data); + +int mob_deleteslave (struct mob_data *md); + +int mob_counttargeted (struct mob_data *md, struct block_list *src, + int target_lv); + +int mob_class_change (struct mob_data *md, int *value); +int mob_warp (struct mob_data *md, int m, int x, int y, int type); + +int mobskill_use (struct mob_data *md, unsigned int tick, int event); +int mobskill_event (struct mob_data *md, int flag); +int mobskill_castend_id (int tid, unsigned int tick, int id, int data); +int mobskill_castend_pos (int tid, unsigned int tick, int id, int data); +int mob_summonslave (struct mob_data *md2, int *value, int amount, int flag); + +int mob_gvmobcheck (struct map_session_data *sd, struct block_list *bl); +void mob_reload (void); #endif diff --git a/src/map/npc.c b/src/map/npc.c index 0c6c922..49fe578 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -27,29 +27,31 @@ #include "memwatch.h" #endif +struct npc_src_list +{ + struct npc_src_list *next; + struct npc_src_list *prev; + char name[4]; +}; +static struct npc_src_list *npc_src_first, *npc_src_last; +static int npc_id = START_NPC_NUM; +static int npc_warp, npc_shop, npc_script, npc_mob; -struct npc_src_list { - struct npc_src_list * next; - struct npc_src_list * prev; - char name[4]; -} ; - -static struct npc_src_list *npc_src_first,*npc_src_last; -static int npc_id=START_NPC_NUM; -static int npc_warp,npc_shop,npc_script,npc_mob; - -int npc_get_new_npc_id(void){ return npc_id++; } +int npc_get_new_npc_id (void) +{ + return npc_id++; +} static struct dbt *ev_db; static struct dbt *npcname_db; -struct event_data { - struct npc_data *nd; - int pos; +struct event_data +{ + struct npc_data *nd; + int pos; }; -static struct tm ev_tm_b; // ソスソスソスvソスCソスxソスソスソスgソスp - +static struct tm ev_tm_b; // ソスソスソスvソスCソスxソスソスソスgソスp /*========================================== * NPCソスフ厄ソスソスソスソスソス/ソスLソスソスソスソス @@ -57,94 +59,107 @@ static struct tm ev_tm_b; // ソスソスソスvソスCソスxソスソスソスgソスp * npc_enable_sub ソスLソスソスソスソスソスソスOnTouchソスCソスxソスソスソスgソスソスソスソスs *------------------------------------------ */ -int npc_enable_sub( struct block_list *bl, va_list ap ) +int npc_enable_sub (struct block_list *bl, va_list ap) { - struct map_session_data *sd; - struct npc_data *nd; - char *name=(char *)aCalloc(50,sizeof(char)); - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, nd=va_arg(ap,struct npc_data *)); - if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){ - - if (nd->flag&1) // ソスソスソスソスソスソスソスソスソスソスソストゑソスソスソス - return 1; - - memcpy(name,nd->name,50); - if(sd->areanpc_id==nd->bl.id) - return 1; - sd->areanpc_id=nd->bl.id; - npc_event(sd,strcat(name,"::OnTouch"),0); - } - free(name); - return 0; + struct map_session_data *sd; + struct npc_data *nd; + char *name = (char *) aCalloc (50, sizeof (char)); + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, nd = va_arg (ap, struct npc_data *)); + if (bl->type == BL_PC && (sd = (struct map_session_data *) bl)) + { + + if (nd->flag & 1) // ソスソスソスソスソスソスソスソスソスソスソストゑソスソスソス + return 1; + + memcpy (name, nd->name, 50); + if (sd->areanpc_id == nd->bl.id) + return 1; + sd->areanpc_id = nd->bl.id; + npc_event (sd, strcat (name, "::OnTouch"), 0); + } + free (name); + return 0; } -int npc_enable(const char *name,int flag) + +int npc_enable (const char *name, int flag) { - struct npc_data *nd=strdb_search(npcname_db,name); - if (nd==NULL) - return 0; - - if (flag&1) { // ソスLソスソスソスソス - nd->flag&=~1; - clif_spawnnpc(nd); - }else if (flag&2){ - nd->flag&=~1; - nd->option = 0x0000; - clif_changeoption(&nd->bl); - }else if (flag&4){ - nd->flag|=1; - nd->option = 0x0002; - clif_changeoption(&nd->bl); - }else{ // ソスソスソスソスソスソス - nd->flag|=1; - clif_clearchar(&nd->bl,0); - } - if(flag&3 && (nd->u.scr.xs > 0 || nd->u.scr.ys >0)) - map_foreachinarea( npc_enable_sub,nd->bl.m,nd->bl.x-nd->u.scr.xs,nd->bl.y-nd->u.scr.ys,nd->bl.x+nd->u.scr.xs,nd->bl.y+nd->u.scr.ys,BL_PC,nd); + struct npc_data *nd = strdb_search (npcname_db, name); + if (nd == NULL) + return 0; + + if (flag & 1) + { // ソスLソスソスソスソス + nd->flag &= ~1; + clif_spawnnpc (nd); + } + else if (flag & 2) + { + nd->flag &= ~1; + nd->option = 0x0000; + clif_changeoption (&nd->bl); + } + else if (flag & 4) + { + nd->flag |= 1; + nd->option = 0x0002; + clif_changeoption (&nd->bl); + } + else + { // ソスソスソスソスソスソス + nd->flag |= 1; + clif_clearchar (&nd->bl, 0); + } + if (flag & 3 && (nd->u.scr.xs > 0 || nd->u.scr.ys > 0)) + map_foreachinarea (npc_enable_sub, nd->bl.m, nd->bl.x - nd->u.scr.xs, + nd->bl.y - nd->u.scr.ys, nd->bl.x + nd->u.scr.xs, + nd->bl.y + nd->u.scr.ys, BL_PC, nd); - return 0; + return 0; } /*========================================== * NPCソス名前ソスナ探ソスソス *------------------------------------------ */ -struct npc_data* npc_name2id(const char *name) +struct npc_data *npc_name2id (const char *name) { - return strdb_search(npcname_db,name); + return strdb_search (npcname_db, name); } + /*========================================== * ソスCソスxソスソスソスgソスLソスソスソス[ソスフイソスxソスソスソスgソスソスソスソス *------------------------------------------ */ -int npc_event_dequeue(struct map_session_data *sd) +int npc_event_dequeue (struct map_session_data *sd) { - nullpo_retr(0, sd); - - sd->npc_id=0; - if (sd->eventqueue[0][0]) { // ソスLソスソスソス[ソスフイソスxソスソスソスgソスソスソスソス - char *name=(char *)aCalloc(50,sizeof(char)); - int i; - - memcpy(name,sd->eventqueue[0],50); - for(i=MAX_EVENTQUEUE-2;i>=0;i--) - memcpy(sd->eventqueue[i],sd->eventqueue[i+1],50); - add_timer(gettick()+100,npc_event_timer,sd->bl.id,(int)name); - } - return 0; + nullpo_retr (0, sd); + + sd->npc_id = 0; + if (sd->eventqueue[0][0]) + { // ソスLソスソスソス[ソスフイソスxソスソスソスgソスソスソスソス + char *name = (char *) aCalloc (50, sizeof (char)); + int i; + + memcpy (name, sd->eventqueue[0], 50); + for (i = MAX_EVENTQUEUE - 2; i >= 0; i--) + memcpy (sd->eventqueue[i], sd->eventqueue[i + 1], 50); + add_timer (gettick () + 100, npc_event_timer, sd->bl.id, (int) name); + } + return 0; } -int npc_delete(struct npc_data *nd) +int npc_delete (struct npc_data *nd) { - nullpo_retr(1, nd); + nullpo_retr (1, nd); - if(nd->bl.prev == NULL) + if (nd->bl.prev == NULL) return 1; - clif_clearchar_area(&nd->bl,1); - map_delblock(&nd->bl); + clif_clearchar_area (&nd->bl, 1); + map_delblock (&nd->bl); return 0; } @@ -152,32 +167,34 @@ int npc_delete(struct npc_data *nd) * ソスCソスxソスソスソスgソスフ遅ソスソスソスソスs *------------------------------------------ */ -int npc_event_timer(int tid,unsigned int tick,int id,int data) +int npc_event_timer (int tid, unsigned int tick, int id, int data) { - struct map_session_data *sd=map_id2sd(id); - if (sd==NULL) - return 0; - - npc_event(sd,(const char *)data,0); - free((void*)data); - return 0; + struct map_session_data *sd = map_id2sd (id); + if (sd == NULL) + return 0; + + npc_event (sd, (const char *) data, 0); + free ((void *) data); + return 0; } -int npc_timer_event(const char *eventname) // Added by RoVeRT +int npc_timer_event (const char *eventname) // Added by RoVeRT { - struct event_data *ev=strdb_search(ev_db,eventname); - struct npc_data *nd; -// int xs,ys; - - if((ev==NULL || (nd=ev->nd)==NULL)){ - printf("npc_event: event not found [%s]\n",eventname); - return 0; - } + struct event_data *ev = strdb_search (ev_db, eventname); + struct npc_data *nd; +// int xs,ys; + + if ((ev == NULL || (nd = ev->nd) == NULL)) + { + printf ("npc_event: event not found [%s]\n", eventname); + return 0; + } - run_script(nd->u.scr.script,ev->pos,nd->bl.id,nd->bl.id); + run_script (nd->u.scr.script, ev->pos, nd->bl.id, nd->bl.id); - return 0; + return 0; } + /* int npc_timer_sub_sub(void *key,void *data,va_list ap) // Added by RoVeRT { @@ -227,839 +244,951 @@ int npc_timer(int tid,unsigned int tick,int id,int data) // Added by RoVeRT * npc_parse_script->strdb_foreachソスソスソスソスソストばゑソスソスソス *------------------------------------------ */ -int npc_event_export(void *key,void *data,va_list ap) +int npc_event_export (void *key, void *data, va_list ap) { - char *lname=(char *)key; - int pos=(int)data; - struct npc_data *nd=va_arg(ap,struct npc_data *); - - if ((lname[0]=='O' || lname[0]=='o')&&(lname[1]=='N' || lname[1]=='n')) { - struct event_data *ev; - char *buf; - char *p=strchr(lname,':'); - // ソスGソスNソスXソス|ソス[ソスgソスソスソスソスソスソス - ev=calloc(sizeof(struct event_data), 1); - buf=calloc(50, 1); - if (ev==NULL || buf==NULL) { - printf("npc_event_export: out of memory !\n"); - exit(1); - }else if (p==NULL || (p-lname)>24) { - printf("npc_event_export: label name error !\n"); - exit(1); - }else{ - ev->nd=nd; - ev->pos=pos; - *p='\0'; - sprintf(buf,"%s::%s",nd->exname,lname); - *p=':'; - strdb_insert(ev_db,buf,ev); -// if (battle_config.etc_log) -// printf("npc_event_export: export [%s]\n",buf); - } - } - return 0; + char *lname = (char *) key; + int pos = (int) data; + struct npc_data *nd = va_arg (ap, struct npc_data *); + + if ((lname[0] == 'O' || lname[0] == 'o') + && (lname[1] == 'N' || lname[1] == 'n')) + { + struct event_data *ev; + char *buf; + char *p = strchr (lname, ':'); + // ソスGソスNソスXソス|ソス[ソスgソスソスソスソスソスソス + ev = calloc (sizeof (struct event_data), 1); + buf = calloc (50, 1); + if (ev == NULL || buf == NULL) + { + printf ("npc_event_export: out of memory !\n"); + exit (1); + } + else if (p == NULL || (p - lname) > 24) + { + printf ("npc_event_export: label name error !\n"); + exit (1); + } + else + { + ev->nd = nd; + ev->pos = pos; + *p = '\0'; + sprintf (buf, "%s::%s", nd->exname, lname); + *p = ':'; + strdb_insert (ev_db, buf, ev); +// if (battle_config.etc_log) +// printf("npc_event_export: export [%s]\n",buf); + } + } + return 0; } /*========================================== * ソスSソストゑソスNPCソスソスOn*ソスCソスxソスソスソスgソスソスs *------------------------------------------ */ -int npc_event_doall_sub(void *key,void *data,va_list ap) +int npc_event_doall_sub (void *key, void *data, va_list ap) { - char *p=(char *)key; - int rid, argc; - argrec_t *argv; - struct event_data *ev; - int *c; - const char *name; - - nullpo_retr(0, ev=(struct event_data *)data); - nullpo_retr(0, ap); - nullpo_retr(0, c=va_arg(ap,int *)); - - name=va_arg(ap,const char *); - rid = va_arg(ap, int); - argc = va_arg(ap, int); - argv = va_arg(ap, argrec_t *); - + char *p = (char *) key; + int rid, argc; + argrec_t *argv; + struct event_data *ev; + int *c; + const char *name; + + nullpo_retr (0, ev = (struct event_data *) data); + nullpo_retr (0, ap); + nullpo_retr (0, c = va_arg (ap, int *)); + + name = va_arg (ap, const char *); + rid = va_arg (ap, int); + argc = va_arg (ap, int); + argv = va_arg (ap, argrec_t *); + + if ((p = strchr (p, ':')) && p && strcasecmp (name, p) == 0) + { + run_script_l (ev->nd->u.scr.script, ev->pos, rid, ev->nd->bl.id, argc, + argv); + (*c)++; + } - if( (p=strchr(p,':')) && p && strcasecmp(name,p)==0 ){ - run_script_l(ev->nd->u.scr.script,ev->pos,rid,ev->nd->bl.id, argc, argv); - (*c)++; - } - - return 0; -} -int npc_event_doall_l(const char *name, int rid, int argc, argrec_t *args) -{ - int c=0; - char buf[64]="::"; - - strncpy(buf+2,name,62); - strdb_foreach(ev_db,npc_event_doall_sub,&c,buf, rid, argc, args); - return c; + return 0; } -int npc_event_do_sub(void *key,void *data, va_list ap) +int npc_event_doall_l (const char *name, int rid, int argc, argrec_t * args) { - char *p=(char *)key; - struct event_data *ev; - int *c; - const char *name; - int rid, argc; - argrec_t *argv; - - nullpo_retr(0, ev=(struct event_data *)data); - nullpo_retr(0, ap); - nullpo_retr(0, c=va_arg(ap,int *)); - - name=va_arg(ap,const char *); - rid = va_arg(ap, int); - argc = va_arg(ap, int); - argv = va_arg(ap, argrec_t *); + int c = 0; + char buf[64] = "::"; + strncpy (buf + 2, name, 62); + strdb_foreach (ev_db, npc_event_doall_sub, &c, buf, rid, argc, args); + return c; +} - if (p && strcasecmp(name,p)==0 ) { - run_script_l(ev->nd->u.scr.script,ev->pos, rid, ev->nd->bl.id, argc, argv); - (*c)++; - } +int npc_event_do_sub (void *key, void *data, va_list ap) +{ + char *p = (char *) key; + struct event_data *ev; + int *c; + const char *name; + int rid, argc; + argrec_t *argv; + + nullpo_retr (0, ev = (struct event_data *) data); + nullpo_retr (0, ap); + nullpo_retr (0, c = va_arg (ap, int *)); + + name = va_arg (ap, const char *); + rid = va_arg (ap, int); + argc = va_arg (ap, int); + argv = va_arg (ap, argrec_t *); + + if (p && strcasecmp (name, p) == 0) + { + run_script_l (ev->nd->u.scr.script, ev->pos, rid, ev->nd->bl.id, argc, + argv); + (*c)++; + } - return 0; + return 0; } -int npc_event_do_l(const char *name, int rid, int argc, argrec_t *args) + +int npc_event_do_l (const char *name, int rid, int argc, argrec_t * args) { - int c=0; - - if (*name==':' && name[1]==':') { - return npc_event_doall_l(name+2, rid, argc, args); - } + int c = 0; - strdb_foreach(ev_db,npc_event_do_sub,&c,name, rid, argc, args); - return c; + if (*name == ':' && name[1] == ':') + { + return npc_event_doall_l (name + 2, rid, argc, args); + } + + strdb_foreach (ev_db, npc_event_do_sub, &c, name, rid, argc, args); + return c; } /*========================================== * ソスソスソスvソスCソスxソスソスソスgソスソスs *------------------------------------------ */ -int npc_event_do_clock(int tid,unsigned int tick,int id,int data) +int npc_event_do_clock (int tid, unsigned int tick, int id, int data) { - time_t timer; - struct tm *t; - char buf[64]; - int c=0; - - time(&timer); - t=gmtime(&timer); - - if (t->tm_min != ev_tm_b.tm_min ) { - sprintf(buf,"OnMinute%02d",t->tm_min); - c+=npc_event_doall(buf); - sprintf(buf,"OnClock%02d%02d",t->tm_hour,t->tm_min); - c+=npc_event_doall(buf); - } - if (t->tm_hour!= ev_tm_b.tm_hour) { - sprintf(buf,"OnHour%02d",t->tm_hour); - c+=npc_event_doall(buf); - } - if (t->tm_mday!= ev_tm_b.tm_mday) { - sprintf(buf,"OnDay%02d%02d",t->tm_mon+1,t->tm_mday); - c+=npc_event_doall(buf); - } - memcpy(&ev_tm_b,t,sizeof(ev_tm_b)); - return c; + time_t timer; + struct tm *t; + char buf[64]; + int c = 0; + + time (&timer); + t = gmtime (&timer); + + if (t->tm_min != ev_tm_b.tm_min) + { + sprintf (buf, "OnMinute%02d", t->tm_min); + c += npc_event_doall (buf); + sprintf (buf, "OnClock%02d%02d", t->tm_hour, t->tm_min); + c += npc_event_doall (buf); + } + if (t->tm_hour != ev_tm_b.tm_hour) + { + sprintf (buf, "OnHour%02d", t->tm_hour); + c += npc_event_doall (buf); + } + if (t->tm_mday != ev_tm_b.tm_mday) + { + sprintf (buf, "OnDay%02d%02d", t->tm_mon + 1, t->tm_mday); + c += npc_event_doall (buf); + } + memcpy (&ev_tm_b, t, sizeof (ev_tm_b)); + return c; } + /*========================================== * OnInitソスCソスxソスソスソスgソスソスs(&ソスソスソスvソスCソスxソスソスソスgソスJソスn) *------------------------------------------ */ -int npc_event_do_oninit(void) +int npc_event_do_oninit (void) { - int c = npc_event_doall("OnInit"); - printf("npc: OnInit Event done. (%d npc)\n",c); + int c = npc_event_doall ("OnInit"); + printf ("npc: OnInit Event done. (%d npc)\n", c); - add_timer_interval(gettick()+100, - npc_event_do_clock,0,0,1000); + add_timer_interval (gettick () + 100, npc_event_do_clock, 0, 0, 1000); - return 0; + return 0; } + /*========================================== * OnTimer NPC event - by RoVeRT *------------------------------------------ */ -int npc_addeventtimer(struct npc_data *nd,int tick,const char *name) +int npc_addeventtimer (struct npc_data *nd, int tick, const char *name) { - int i; - for(i=0;i<MAX_EVENTTIMER;i++) - if( nd->eventtimer[i]==-1 ) - break; - if(i<MAX_EVENTTIMER){ - char *evname=malloc(24); - if(evname==NULL){ - printf("npc_addeventtimer: out of memory !\n");exit(1); - } - memcpy(evname,name,24); - nd->eventtimer[i]=add_timer(gettick()+tick, - npc_event_timer,nd->bl.id,(int)evname); - }else - printf("npc_addtimer: event timer is full !\n"); + int i; + for (i = 0; i < MAX_EVENTTIMER; i++) + if (nd->eventtimer[i] == -1) + break; + if (i < MAX_EVENTTIMER) + { + char *evname = malloc (24); + if (evname == NULL) + { + printf ("npc_addeventtimer: out of memory !\n"); + exit (1); + } + memcpy (evname, name, 24); + nd->eventtimer[i] = add_timer (gettick () + tick, + npc_event_timer, nd->bl.id, + (int) evname); + } + else + printf ("npc_addtimer: event timer is full !\n"); - return 0; + return 0; } -int npc_deleventtimer(struct npc_data *nd,const char *name) +int npc_deleventtimer (struct npc_data *nd, const char *name) { - int i; - for(i=0;i<MAX_EVENTTIMER;i++) - if( nd->eventtimer[i]!=-1 && strcmp( - (char *)(get_timer(nd->eventtimer[i])->data), name)==0 ){ - delete_timer(nd->eventtimer[i],npc_event_timer); - nd->eventtimer[i]=-1; - break; - } + int i; + for (i = 0; i < MAX_EVENTTIMER; i++) + if (nd->eventtimer[i] != -1 && strcmp ((char + *) (get_timer (nd->eventtimer + [i])->data), + name) == 0) + { + delete_timer (nd->eventtimer[i], npc_event_timer); + nd->eventtimer[i] = -1; + break; + } - return 0; + return 0; } -int npc_cleareventtimer(struct npc_data *nd) +int npc_cleareventtimer (struct npc_data *nd) { - int i; - for(i=0;i<MAX_EVENTTIMER;i++) - if( nd->eventtimer[i]!=-1 ){ - delete_timer(nd->eventtimer[i],npc_event_timer); - nd->eventtimer[i]=-1; - } + int i; + for (i = 0; i < MAX_EVENTTIMER; i++) + if (nd->eventtimer[i] != -1) + { + delete_timer (nd->eventtimer[i], npc_event_timer); + nd->eventtimer[i] = -1; + } - return 0; + return 0; } -int npc_do_ontimer_sub(void *key,void *data,va_list ap) +int npc_do_ontimer_sub (void *key, void *data, va_list ap) { - char *p=(char *)key; - struct event_data *ev=(struct event_data *)data; - int *c=va_arg(ap,int *); -// struct map_session_data *sd=va_arg(ap,struct map_session_data *); - int option=va_arg(ap,int); - int tick=0; - char temp[10]; - char event[50]; - - if(ev->nd->bl.id==(int)*c && (p=strchr(p,':')) && p && strncasecmp("::OnTimer",p,8)==0 ){ - sscanf(&p[9],"%s",temp); - tick=atoi(temp); - - strcpy( event, ev->nd->name); - strcat( event, p); - - if (option!=0) { - npc_addeventtimer(ev->nd,tick,event); - } else { - npc_deleventtimer(ev->nd,event); - } - } - return 0; + char *p = (char *) key; + struct event_data *ev = (struct event_data *) data; + int *c = va_arg (ap, int *); +// struct map_session_data *sd=va_arg(ap,struct map_session_data *); + int option = va_arg (ap, int); + int tick = 0; + char temp[10]; + char event[50]; + + if (ev->nd->bl.id == (int) *c && (p = strchr (p, ':')) && p + && strncasecmp ("::OnTimer", p, 8) == 0) + { + sscanf (&p[9], "%s", temp); + tick = atoi (temp); + + strcpy (event, ev->nd->name); + strcat (event, p); + + if (option != 0) + { + npc_addeventtimer (ev->nd, tick, event); + } + else + { + npc_deleventtimer (ev->nd, event); + } + } + return 0; } -int npc_do_ontimer(int npc_id, struct map_session_data *sd, int option) + +int npc_do_ontimer (int npc_id, struct map_session_data *sd, int option) { - strdb_foreach(ev_db,npc_do_ontimer_sub,&npc_id,sd,option); - return 0; + strdb_foreach (ev_db, npc_do_ontimer_sub, &npc_id, sd, option); + return 0; } + /*========================================== * ソス^ソスCソス}ソス[ソスCソスxソスソスソスgソスpソスソスソスxソスソスソスフ趣ソスソス闕橸ソスソス * npc_parse_script->strdb_foreachソスソスソスソスソストばゑソスソスソス *------------------------------------------ */ -int npc_timerevent_import(void *key,void *data,va_list ap) +int npc_timerevent_import (void *key, void *data, va_list ap) { - char *lname=(char *)key; - int pos=(int)data; - struct npc_data *nd=va_arg(ap,struct npc_data *); - int t=0,i=0; - - if(sscanf(lname,"OnTimer%d%n",&t,&i)==1 && lname[i]==':') { - // ソス^ソスCソス}ソス[ソスCソスxソスソスソスg - struct npc_timerevent_list *te=nd->u.scr.timer_event; - int j,i=nd->u.scr.timeramount; - if(te==NULL) te=malloc(sizeof(struct npc_timerevent_list)); - else te=realloc( te, sizeof(struct npc_timerevent_list) * (i+1) ); - if(te==NULL){ - printf("npc_timerevent_import: out of memory !\n"); - exit(1); - } - for(j=0;j<i;j++){ - if(te[j].timer>t){ - memmove(te+j+1,te+j,sizeof(struct npc_timerevent_list)*(i-j)); - break; - } - } - te[j].timer=t; - te[j].pos=pos; - nd->u.scr.timer_event=te; - nd->u.scr.timeramount=i+1; - } - return 0; + char *lname = (char *) key; + int pos = (int) data; + struct npc_data *nd = va_arg (ap, struct npc_data *); + int t = 0, i = 0; + + if (sscanf (lname, "OnTimer%d%n", &t, &i) == 1 && lname[i] == ':') + { + // ソス^ソスCソス}ソス[ソスCソスxソスソスソスg + struct npc_timerevent_list *te = nd->u.scr.timer_event; + int j, i = nd->u.scr.timeramount; + if (te == NULL) + te = malloc (sizeof (struct npc_timerevent_list)); + else + te = realloc (te, sizeof (struct npc_timerevent_list) * (i + 1)); + if (te == NULL) + { + printf ("npc_timerevent_import: out of memory !\n"); + exit (1); + } + for (j = 0; j < i; j++) + { + if (te[j].timer > t) + { + memmove (te + j + 1, te + j, + sizeof (struct npc_timerevent_list) * (i - j)); + break; + } + } + te[j].timer = t; + te[j].pos = pos; + nd->u.scr.timer_event = te; + nd->u.scr.timeramount = i + 1; + } + return 0; } + /*========================================== * ソス^ソスCソス}ソス[ソスCソスxソスソスソスgソスソスs *------------------------------------------ */ -int npc_timerevent(int tid,unsigned int tick,int id,int data) +int npc_timerevent (int tid, unsigned int tick, int id, int data) { - int next,t; - struct npc_data* nd=(struct npc_data *)map_id2bl(id); - struct npc_timerevent_list *te; - if( nd==NULL || nd->u.scr.nexttimer<0 ){ - printf("npc_timerevent: ??\n"); - return 0; - } - nd->u.scr.timertick=tick; - te=nd->u.scr.timer_event+ nd->u.scr.nexttimer; - nd->u.scr.timerid = -1; - - t = nd->u.scr.timer+=data; - nd->u.scr.nexttimer++; - if( nd->u.scr.timeramount>nd->u.scr.nexttimer ){ - next= nd->u.scr.timer_event[ nd->u.scr.nexttimer ].timer - t; - nd->u.scr.timerid = add_timer(tick+next,npc_timerevent,id,next); - } + int next, t; + struct npc_data *nd = (struct npc_data *) map_id2bl (id); + struct npc_timerevent_list *te; + if (nd == NULL || nd->u.scr.nexttimer < 0) + { + printf ("npc_timerevent: ??\n"); + return 0; + } + nd->u.scr.timertick = tick; + te = nd->u.scr.timer_event + nd->u.scr.nexttimer; + nd->u.scr.timerid = -1; + + t = nd->u.scr.timer += data; + nd->u.scr.nexttimer++; + if (nd->u.scr.timeramount > nd->u.scr.nexttimer) + { + next = nd->u.scr.timer_event[nd->u.scr.nexttimer].timer - t; + nd->u.scr.timerid = add_timer (tick + next, npc_timerevent, id, next); + } - run_script(nd->u.scr.script,te->pos,0,nd->bl.id); - return 0; + run_script (nd->u.scr.script, te->pos, 0, nd->bl.id); + return 0; } + /*========================================== * ソス^ソスCソス}ソス[ソスCソスxソスソスソスgソスJソスn *------------------------------------------ */ -int npc_timerevent_start(struct npc_data *nd) +int npc_timerevent_start (struct npc_data *nd) { - int j,n, next; + int j, n, next; - nullpo_retr(0, nd); + nullpo_retr (0, nd); - n=nd->u.scr.timeramount; - if( nd->u.scr.nexttimer>=0 || n==0 ) - return 0; - - for(j=0;j<n;j++){ - if( nd->u.scr.timer_event[j].timer > nd->u.scr.timer ) - break; - } - nd->u.scr.nexttimer=j; - nd->u.scr.timertick=gettick(); + n = nd->u.scr.timeramount; + if (nd->u.scr.nexttimer >= 0 || n == 0) + return 0; - if(j>=n) - return 0; - - next = nd->u.scr.timer_event[j].timer - nd->u.scr.timer; - nd->u.scr.timerid = add_timer(gettick()+next,npc_timerevent,nd->bl.id,next); - return 0; + for (j = 0; j < n; j++) + { + if (nd->u.scr.timer_event[j].timer > nd->u.scr.timer) + break; + } + nd->u.scr.nexttimer = j; + nd->u.scr.timertick = gettick (); + + if (j >= n) + return 0; + + next = nd->u.scr.timer_event[j].timer - nd->u.scr.timer; + nd->u.scr.timerid = + add_timer (gettick () + next, npc_timerevent, nd->bl.id, next); + return 0; } + /*========================================== * ソス^ソスCソス}ソス[ソスCソスxソスソスソスgソスIソスソス *------------------------------------------ */ -int npc_timerevent_stop(struct npc_data *nd) +int npc_timerevent_stop (struct npc_data *nd) { - nullpo_retr(0, nd); - - if( nd->u.scr.nexttimer>=0 ){ - nd->u.scr.nexttimer = -1; - nd->u.scr.timer += (int)(gettick() - nd->u.scr.timertick); - if(nd->u.scr.timerid!=-1) - delete_timer(nd->u.scr.timerid,npc_timerevent); - nd->u.scr.timerid = -1; - } - return 0; + nullpo_retr (0, nd); + + if (nd->u.scr.nexttimer >= 0) + { + nd->u.scr.nexttimer = -1; + nd->u.scr.timer += (int) (gettick () - nd->u.scr.timertick); + if (nd->u.scr.timerid != -1) + delete_timer (nd->u.scr.timerid, npc_timerevent); + nd->u.scr.timerid = -1; + } + return 0; } + /*========================================== * ソス^ソスCソス}ソス[ソスlソスフ擾ソスソスソス *------------------------------------------ */ -int npc_gettimerevent_tick(struct npc_data *nd) +int npc_gettimerevent_tick (struct npc_data *nd) { - int tick; + int tick; - nullpo_retr(0, nd); + nullpo_retr (0, nd); - tick=nd->u.scr.timer; + tick = nd->u.scr.timer; - if( nd->u.scr.nexttimer>=0 ) - tick += (int)(gettick() - nd->u.scr.timertick); - return tick; + if (nd->u.scr.nexttimer >= 0) + tick += (int) (gettick () - nd->u.scr.timertick); + return tick; } + /*========================================== * ソス^ソスCソス}ソス[ソスlソスフ設抵ソス *------------------------------------------ */ -int npc_settimerevent_tick(struct npc_data *nd,int newtimer) +int npc_settimerevent_tick (struct npc_data *nd, int newtimer) { - int flag; + int flag; - nullpo_retr(0, nd); + nullpo_retr (0, nd); - flag= nd->u.scr.nexttimer; + flag = nd->u.scr.nexttimer; - npc_timerevent_stop(nd); - nd->u.scr.timer=newtimer; - if(flag>=0) - npc_timerevent_start(nd); - return 0; + npc_timerevent_stop (nd); + nd->u.scr.timer = newtimer; + if (flag >= 0) + npc_timerevent_start (nd); + return 0; } /*========================================== * ソスCソスxソスソスソスgソス^ソスソスNPCソスソスソスソス *------------------------------------------ */ -int npc_event(struct map_session_data *sd,const char *eventname,int mob_kill) +int npc_event (struct map_session_data *sd, const char *eventname, + int mob_kill) { - struct event_data *ev=strdb_search(ev_db,eventname); - struct npc_data *nd; - int xs,ys; - char mobevent[100]; + struct event_data *ev = strdb_search (ev_db, eventname); + struct npc_data *nd; + int xs, ys; + char mobevent[100]; + + if (sd == NULL) + { + printf ("npc_event nullpo?\n"); + } - if( sd == NULL ){ - printf("npc_event nullpo?\n"); - } + if (ev == NULL && eventname + && strcmp (((eventname) + strlen (eventname) - 9), "::OnTouch") == 0) + return 1; - if(ev==NULL && eventname && strcmp(((eventname)+strlen(eventname)-9),"::OnTouch") == 0) - return 1; - - if(ev==NULL || (nd=ev->nd)==NULL){ - if(mob_kill && (ev==NULL || (nd=ev->nd)==NULL)){ - strcpy( mobevent, eventname); - strcat( mobevent, "::OnMyMobDead"); - ev=strdb_search(ev_db,mobevent); - if (ev==NULL || (nd=ev->nd)==NULL) { - if (strncasecmp(eventname,"GM_MONSTER",10)!=0) - printf("npc_event: event not found [%s]\n",mobevent); - return 0; - } - } - else { - if(battle_config.error_log) - printf("npc_event: event not found [%s]\n",eventname); - return 0; - } - } + if (ev == NULL || (nd = ev->nd) == NULL) + { + if (mob_kill && (ev == NULL || (nd = ev->nd) == NULL)) + { + strcpy (mobevent, eventname); + strcat (mobevent, "::OnMyMobDead"); + ev = strdb_search (ev_db, mobevent); + if (ev == NULL || (nd = ev->nd) == NULL) + { + if (strncasecmp (eventname, "GM_MONSTER", 10) != 0) + printf ("npc_event: event not found [%s]\n", mobevent); + return 0; + } + } + else + { + if (battle_config.error_log) + printf ("npc_event: event not found [%s]\n", eventname); + return 0; + } + } - xs=nd->u.scr.xs; - ys=nd->u.scr.ys; - if (xs>=0 && ys>=0 ) { - if (nd->bl.m != sd->bl.m ) - return 1; - if ( xs>0 && (sd->bl.x<nd->bl.x-xs/2 || nd->bl.x+xs/2<sd->bl.x) ) - return 1; - if ( ys>0 && (sd->bl.y<nd->bl.y-ys/2 || nd->bl.y+ys/2<sd->bl.y) ) - return 1; - } + xs = nd->u.scr.xs; + ys = nd->u.scr.ys; + if (xs >= 0 && ys >= 0) + { + if (nd->bl.m != sd->bl.m) + return 1; + if (xs > 0 + && (sd->bl.x < nd->bl.x - xs / 2 || nd->bl.x + xs / 2 < sd->bl.x)) + return 1; + if (ys > 0 + && (sd->bl.y < nd->bl.y - ys / 2 || nd->bl.y + ys / 2 < sd->bl.y)) + return 1; + } - if ( sd->npc_id!=0) { -// if (battle_config.error_log) -// printf("npc_event: npc_id != 0\n"); - int i; - for(i=0;i<MAX_EVENTQUEUE;i++) - if (!sd->eventqueue[i][0]) - break; - if (i==MAX_EVENTQUEUE) { - if (battle_config.error_log) - printf("npc_event: event queue is full !\n"); - }else{ -// if (battle_config.etc_log) -// printf("npc_event: enqueue\n"); - memcpy(sd->eventqueue[i],eventname,50); - } - return 1; - } - if (nd->flag&1) { // ソスソスソスソスソスソスソスソスソスソスソストゑソスソスソス - npc_event_dequeue(sd); - return 0; - } + if (sd->npc_id != 0) + { +// if (battle_config.error_log) +// printf("npc_event: npc_id != 0\n"); + int i; + for (i = 0; i < MAX_EVENTQUEUE; i++) + if (!sd->eventqueue[i][0]) + break; + if (i == MAX_EVENTQUEUE) + { + if (battle_config.error_log) + printf ("npc_event: event queue is full !\n"); + } + else + { +// if (battle_config.etc_log) +// printf("npc_event: enqueue\n"); + memcpy (sd->eventqueue[i], eventname, 50); + } + return 1; + } + if (nd->flag & 1) + { // ソスソスソスソスソスソスソスソスソスソスソストゑソスソスソス + npc_event_dequeue (sd); + return 0; + } - sd->npc_id=nd->bl.id; - sd->npc_pos=run_script(nd->u.scr.script,ev->pos,sd->bl.id,nd->bl.id); - return 0; + sd->npc_id = nd->bl.id; + sd->npc_pos = + run_script (nd->u.scr.script, ev->pos, sd->bl.id, nd->bl.id); + return 0; } - -int npc_command_sub(void *key,void *data,va_list ap) +int npc_command_sub (void *key, void *data, va_list ap) { - char *p=(char *)key; - struct event_data *ev=(struct event_data *)data; - char *npcname=va_arg(ap,char *); - char *command=va_arg(ap,char *); - char temp[100]; - - if(strcmp(ev->nd->name,npcname)==0 && (p=strchr(p,':')) && p && strncasecmp("::OnCommand",p,10)==0 ){ - sscanf(&p[11],"%s",temp); + char *p = (char *) key; + struct event_data *ev = (struct event_data *) data; + char *npcname = va_arg (ap, char *); + char *command = va_arg (ap, char *); + char temp[100]; + + if (strcmp (ev->nd->name, npcname) == 0 && (p = strchr (p, ':')) && p + && strncasecmp ("::OnCommand", p, 10) == 0) + { + sscanf (&p[11], "%s", temp); + + if (strcmp (command, temp) == 0) + run_script (ev->nd->u.scr.script, ev->pos, 0, ev->nd->bl.id); + } - if (strcmp(command,temp)==0) - run_script(ev->nd->u.scr.script,ev->pos,0,ev->nd->bl.id); - } - - return 0; + return 0; } -int npc_command(struct map_session_data *sd,char *npcname,char *command) +int npc_command (struct map_session_data *sd, char *npcname, char *command) { - strdb_foreach(ev_db,npc_command_sub,npcname,command); + strdb_foreach (ev_db, npc_command_sub, npcname, command); - return 0; + return 0; } + /*========================================== * ソスレ触ソス^ソスソスNPCソスソスソスソス *------------------------------------------ */ -int npc_touch_areanpc(struct map_session_data *sd,int m,int x,int y) +int npc_touch_areanpc (struct map_session_data *sd, int m, int x, int y) { - int i,f=1; - int xs,ys; + int i, f = 1; + int xs, ys; - nullpo_retr(1, sd); + nullpo_retr (1, sd); - if(sd->npc_id) - return 1; + if (sd->npc_id) + return 1; - for(i=0;i<map[m].npc_num;i++) { - if (map[m].npc[i]->flag&1) { // ソスソスソスソスソスソスソスソスソスソスソストゑソスソスソス - f=0; - continue; - } - - switch(map[m].npc[i]->bl.subtype) { - case WARP: - xs=map[m].npc[i]->u.warp.xs; - ys=map[m].npc[i]->u.warp.ys; - break; - case MESSAGE: - case SCRIPT: - xs=map[m].npc[i]->u.scr.xs; - ys=map[m].npc[i]->u.scr.ys; - break; - default: - continue; - } - if (x >= map[m].npc[i]->bl.x-xs/2 && x < map[m].npc[i]->bl.x-xs/2+xs && - y >= map[m].npc[i]->bl.y-ys/2 && y < map[m].npc[i]->bl.y-ys/2+ys) - break; - } - if (i==map[m].npc_num) { - if (f) { - if (battle_config.error_log) - printf("npc_touch_areanpc : some bug \n"); - } - return 1; - } - switch(map[m].npc[i]->bl.subtype) { - case WARP: - skill_stop_dancing(&sd->bl,0); - pc_setpos(sd,map[m].npc[i]->u.warp.name,map[m].npc[i]->u.warp.x,map[m].npc[i]->u.warp.y,0); - break; - case MESSAGE: - case SCRIPT: - { - char *name=(char *)aCalloc(50,sizeof(char)); - - memcpy(name,map[m].npc[i]->name,50); - if(sd->areanpc_id==map[m].npc[i]->bl.id) - return 1; - sd->areanpc_id=map[m].npc[i]->bl.id; - if(npc_event(sd,strcat(name,"::OnTouch"),0)>0) - npc_click(sd,map[m].npc[i]->bl.id); - free(name); - break; - } - } - return 0; + for (i = 0; i < map[m].npc_num; i++) + { + if (map[m].npc[i]->flag & 1) + { // ソスソスソスソスソスソスソスソスソスソスソストゑソスソスソス + f = 0; + continue; + } + + switch (map[m].npc[i]->bl.subtype) + { + case WARP: + xs = map[m].npc[i]->u.warp.xs; + ys = map[m].npc[i]->u.warp.ys; + break; + case MESSAGE: + case SCRIPT: + xs = map[m].npc[i]->u.scr.xs; + ys = map[m].npc[i]->u.scr.ys; + break; + default: + continue; + } + if (x >= map[m].npc[i]->bl.x - xs / 2 + && x < map[m].npc[i]->bl.x - xs / 2 + xs + && y >= map[m].npc[i]->bl.y - ys / 2 + && y < map[m].npc[i]->bl.y - ys / 2 + ys) + break; + } + if (i == map[m].npc_num) + { + if (f) + { + if (battle_config.error_log) + printf ("npc_touch_areanpc : some bug \n"); + } + return 1; + } + switch (map[m].npc[i]->bl.subtype) + { + case WARP: + skill_stop_dancing (&sd->bl, 0); + pc_setpos (sd, map[m].npc[i]->u.warp.name, + map[m].npc[i]->u.warp.x, map[m].npc[i]->u.warp.y, 0); + break; + case MESSAGE: + case SCRIPT: + { + char *name = (char *) aCalloc (50, sizeof (char)); + + memcpy (name, map[m].npc[i]->name, 50); + if (sd->areanpc_id == map[m].npc[i]->bl.id) + return 1; + sd->areanpc_id = map[m].npc[i]->bl.id; + if (npc_event (sd, strcat (name, "::OnTouch"), 0) > 0) + npc_click (sd, map[m].npc[i]->bl.id); + free (name); + break; + } + } + return 0; } /*========================================== * ソス゚ゑソスソスソスソスヌゑソスソスソスソスフ費ソスソスソス *------------------------------------------ */ -int npc_checknear(struct map_session_data *sd,int id) +int npc_checknear (struct map_session_data *sd, int id) { - struct npc_data *nd; + struct npc_data *nd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - nd=(struct npc_data *)map_id2bl(id); - if (nd==NULL || nd->bl.type!=BL_NPC) { - if (battle_config.error_log) - printf("no such npc : %d\n",id); - return 1; - } - - if (nd->class<0) // ソスCソスxソスソスソスgソスnソスヘ擾ソスソスソスOK - return 0; + nd = (struct npc_data *) map_id2bl (id); + if (nd == NULL || nd->bl.type != BL_NPC) + { + if (battle_config.error_log) + printf ("no such npc : %d\n", id); + return 1; + } - // ソスGソスソスソスAソスソスソスソス - if (nd->bl.m!=sd->bl.m || - nd->bl.x<sd->bl.x-AREA_SIZE-1 || nd->bl.x>sd->bl.x+AREA_SIZE+1 || - nd->bl.y<sd->bl.y-AREA_SIZE-1 || nd->bl.y>sd->bl.y+AREA_SIZE+1) - return 1; + if (nd->class < 0) // ソスCソスxソスソスソスgソスnソスヘ擾ソスソスソスOK + return 0; - return 0; + // ソスGソスソスソスAソスソスソスソス + if (nd->bl.m != sd->bl.m || + nd->bl.x < sd->bl.x - AREA_SIZE - 1 + || nd->bl.x > sd->bl.x + AREA_SIZE + 1 + || nd->bl.y < sd->bl.y - AREA_SIZE - 1 + || nd->bl.y > sd->bl.y + AREA_SIZE + 1) + return 1; + + return 0; } /*========================================== * ソスNソスソスソスbソスNソスソスソスソスNPCソスソスソスソス *------------------------------------------ */ -int npc_click(struct map_session_data *sd,int id) +int npc_click (struct map_session_data *sd, int id) { - struct npc_data *nd; + struct npc_data *nd; - nullpo_retr(1, sd); + nullpo_retr (1, sd); - if (sd->npc_id != 0) { - if (battle_config.error_log) - printf("npc_click: npc_id != 0\n"); - return 1; - } + if (sd->npc_id != 0) + { + if (battle_config.error_log) + printf ("npc_click: npc_id != 0\n"); + return 1; + } - if (npc_checknear(sd,id)) - return 1; + if (npc_checknear (sd, id)) + return 1; - nd=(struct npc_data *)map_id2bl(id); + nd = (struct npc_data *) map_id2bl (id); - if (nd->flag&1) // ソスソスソスソスソスソスソスソスソスソスソストゑソスソスソス - return 1; + if (nd->flag & 1) // ソスソスソスソスソスソスソスソスソスソスソストゑソスソスソス + return 1; - sd->npc_id=id; - switch(nd->bl.subtype) { - case SHOP: - clif_npcbuysell(sd,id); - npc_event_dequeue(sd); - break; - case SCRIPT: - sd->npc_pos=run_script(nd->u.scr.script,0,sd->bl.id,id); - break; + sd->npc_id = id; + switch (nd->bl.subtype) + { + case SHOP: + clif_npcbuysell (sd, id); + npc_event_dequeue (sd); + break; + case SCRIPT: + sd->npc_pos = run_script (nd->u.scr.script, 0, sd->bl.id, id); + break; case MESSAGE: - if (nd->u.message) - { - clif_scriptmes(sd, id, nd->u.message); - clif_scriptclose(sd, id); - } - break; - } + if (nd->u.message) + { + clif_scriptmes (sd, id, nd->u.message); + clif_scriptclose (sd, id); + } + break; + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int npc_scriptcont(struct map_session_data *sd,int id) +int npc_scriptcont (struct map_session_data *sd, int id) { - struct npc_data *nd; + struct npc_data *nd; - nullpo_retr(1, sd); + nullpo_retr (1, sd); - if (id!=sd->npc_id) - return 1; - if (npc_checknear(sd,id)) - return 1; + if (id != sd->npc_id) + return 1; + if (npc_checknear (sd, id)) + return 1; - nd=(struct npc_data *)map_id2bl(id); + nd = (struct npc_data *) map_id2bl (id); - if (!nd /* NPC was disposed? */ || nd->bl.subtype == MESSAGE) { - clif_scriptclose(sd, id); - npc_event_dequeue(sd); - return 0; - } + if (!nd /* NPC was disposed? */ || nd->bl.subtype == MESSAGE) + { + clif_scriptclose (sd, id); + npc_event_dequeue (sd); + return 0; + } - sd->npc_pos=run_script(nd->u.scr.script,sd->npc_pos,sd->bl.id,id); + sd->npc_pos = run_script (nd->u.scr.script, sd->npc_pos, sd->bl.id, id); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int npc_buysellsel(struct map_session_data *sd,int id,int type) +int npc_buysellsel (struct map_session_data *sd, int id, int type) { - struct npc_data *nd; + struct npc_data *nd; - nullpo_retr(1, sd); + nullpo_retr (1, sd); - if (npc_checknear(sd,id)) - return 1; + if (npc_checknear (sd, id)) + return 1; - nd=(struct npc_data *)map_id2bl(id); - if (nd->bl.subtype!=SHOP) { - if (battle_config.error_log) - printf("no such shop npc : %d\n",id); - sd->npc_id=0; - return 1; - } - if (nd->flag&1) // ソスソスソスソスソスソスソスソスソスソスソストゑソスソスソス - return 1; - - sd->npc_shopid=id; - if (type==0) { - clif_buylist(sd,nd); - } else { - clif_selllist(sd); - } - return 0; + nd = (struct npc_data *) map_id2bl (id); + if (nd->bl.subtype != SHOP) + { + if (battle_config.error_log) + printf ("no such shop npc : %d\n", id); + sd->npc_id = 0; + return 1; + } + if (nd->flag & 1) // ソスソスソスソスソスソスソスソスソスソスソストゑソスソスソス + return 1; + + sd->npc_shopid = id; + if (type == 0) + { + clif_buylist (sd, nd); + } + else + { + clif_selllist (sd); + } + return 0; } /*========================================== * *------------------------------------------ */ -int npc_buylist(struct map_session_data *sd,int n,unsigned short *item_list) +int npc_buylist (struct map_session_data *sd, int n, + unsigned short *item_list) { - struct npc_data *nd; - double z; - int i,j,w,skill,itemamount=0,new=0; + struct npc_data *nd; + double z; + int i, j, w, skill, itemamount = 0, new = 0; - nullpo_retr(3, sd); - nullpo_retr(3, item_list); + nullpo_retr (3, sd); + nullpo_retr (3, item_list); - if (npc_checknear(sd,sd->npc_shopid)) - return 3; + if (npc_checknear (sd, sd->npc_shopid)) + return 3; - nd=(struct npc_data*)map_id2bl(sd->npc_shopid); - if (nd->bl.subtype!=SHOP) - return 3; + nd = (struct npc_data *) map_id2bl (sd->npc_shopid); + if (nd->bl.subtype != SHOP) + return 3; - for(i=0,w=0,z=0;i<n;i++) { - for(j=0;nd->u.shop_item[j].nameid;j++) { - if (nd->u.shop_item[j].nameid==item_list[i*2+1]) - break; - } - if (nd->u.shop_item[j].nameid==0) - return 3; - - if (itemdb_value_notdc(nd->u.shop_item[j].nameid)) - z+=(double)nd->u.shop_item[j].value * item_list[i*2]; - else - z+=(double)pc_modifybuyvalue(sd,nd->u.shop_item[j].value) * item_list[i*2]; - itemamount+=item_list[i*2]; - - switch(pc_checkadditem(sd,item_list[i*2+1],item_list[i*2])) { - case ADDITEM_EXIST: - break; - case ADDITEM_NEW: - if (itemdb_isequip(item_list[i*2+1])) - new += item_list[i*2]; - else - new++; - break; - case ADDITEM_OVERAMOUNT: - return 2; - } + for (i = 0, w = 0, z = 0; i < n; i++) + { + for (j = 0; nd->u.shop_item[j].nameid; j++) + { + if (nd->u.shop_item[j].nameid == item_list[i * 2 + 1]) + break; + } + if (nd->u.shop_item[j].nameid == 0) + return 3; + + if (itemdb_value_notdc (nd->u.shop_item[j].nameid)) + z += (double) nd->u.shop_item[j].value * item_list[i * 2]; + else + z += (double) pc_modifybuyvalue (sd, + nd->u.shop_item[j].value) * + item_list[i * 2]; + itemamount += item_list[i * 2]; + + switch (pc_checkadditem (sd, item_list[i * 2 + 1], item_list[i * 2])) + { + case ADDITEM_EXIST: + break; + case ADDITEM_NEW: + if (itemdb_isequip (item_list[i * 2 + 1])) + new += item_list[i * 2]; + else + new++; + break; + case ADDITEM_OVERAMOUNT: + return 2; + } - w+=itemdb_weight(item_list[i*2+1]) * item_list[i*2]; - } + w += itemdb_weight (item_list[i * 2 + 1]) * item_list[i * 2]; + } - if (z > (double)sd->status.zeny) - return 1; // zenyソスsソスソス - if (w+sd->weight > sd->max_weight) - return 2; // ソスdソスハ抵ソスソスソス - if (pc_inventoryblank(sd)<new) - return 3; // ソスソスソズ撰ソスソスソスソスソス - if (sd->trade_partner != 0) - return 4; // cant buy while trading - - pc_payzeny(sd,(int)z); - - for(i=0;i<n;i++) { - struct item_data *item_data; - if ((item_data = itemdb_exists(item_list[i*2+1])) != NULL) - { - int amount = item_list[i*2]; - struct item item_tmp; - memset(&item_tmp,0,sizeof(item_tmp)); - - item_tmp.nameid = item_data->nameid; - item_tmp.identify = 1; // npcソスフ費ソスソスAソスCソスeソスソスソスヘ鑑抵ソスソスマゑソス - - if (amount > 1 && (item_data->type == 4 || item_data->type == 5 || item_data->type == 7 || item_data->type == 8)) - { - for (j=0; j<amount; j++) { - pc_additem(sd,&item_tmp,1); - } - } - else { - pc_additem(sd,&item_tmp,amount); - } - } - } + if (z > (double) sd->status.zeny) + return 1; // zenyソスsソスソス + if (w + sd->weight > sd->max_weight) + return 2; // ソスdソスハ抵ソスソスソス + if (pc_inventoryblank (sd) < new) + return 3; // ソスソスソズ撰ソスソスソスソスソス + if (sd->trade_partner != 0) + return 4; // cant buy while trading + + pc_payzeny (sd, (int) z); + + for (i = 0; i < n; i++) + { + struct item_data *item_data; + if ((item_data = itemdb_exists (item_list[i * 2 + 1])) != NULL) + { + int amount = item_list[i * 2]; + struct item item_tmp; + memset (&item_tmp, 0, sizeof (item_tmp)); + + item_tmp.nameid = item_data->nameid; + item_tmp.identify = 1; // npcソスフ費ソスソスAソスCソスeソスソスソスヘ鑑抵ソスソスマゑソス + + if (amount > 1 + && (item_data->type == 4 || item_data->type == 5 + || item_data->type == 7 || item_data->type == 8)) + { + for (j = 0; j < amount; j++) + { + pc_additem (sd, &item_tmp, 1); + } + } + else + { + pc_additem (sd, &item_tmp, amount); + } + } + } - //ソスソスソスlソスoソスソスソスl + //ソスソスソスlソスoソスソスソスl /* if ((sd->status.class == 5) || (sd->status.class == 10) || (sd->status.class == 18)) { z = z * pc_checkskill(sd,MC_DISCOUNT) / ((1 + 300 / itemamount) * 4000) * battle_config.shop_exp; pc_gainexp(sd,0,z); }*/ - if (battle_config.shop_exp > 0 && z > 0 && (skill = pc_checkskill(sd,MC_DISCOUNT)) > 0) { - if (skill > 0) { - z = (log(z * (double)skill) * (double)battle_config.shop_exp/100.); - if (z < 1) - z = 1; - pc_gainexp(sd,0,(int)z); - } - } + if (battle_config.shop_exp > 0 && z > 0 + && (skill = pc_checkskill (sd, MC_DISCOUNT)) > 0) + { + if (skill > 0) + { + z = (log (z * (double) skill) * (double) battle_config.shop_exp / + 100.); + if (z < 1) + z = 1; + pc_gainexp (sd, 0, (int) z); + } + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int npc_selllist(struct map_session_data *sd,int n,unsigned short *item_list) +int npc_selllist (struct map_session_data *sd, int n, + unsigned short *item_list) { - double z; - int i,skill,itemamount=0; - - nullpo_retr(1, sd); - nullpo_retr(1, item_list); - - if (npc_checknear(sd,sd->npc_shopid)) - return 1; - for(i=0,z=0;i<n;i++) { - int nameid; - if (item_list[i*2]-2 <0 || item_list[i*2]-2 >=MAX_INVENTORY) - return 1; - nameid=sd->status.inventory[item_list[i*2]-2].nameid; - if (nameid == 0 || - sd->status.inventory[item_list[i*2]-2].amount < item_list[i*2+1]) - return 1; - if (sd->trade_partner != 0) - return 2; // cant sell while trading - if (itemdb_value_notoc(nameid)) - z+=(double)itemdb_value_sell(nameid) * item_list[i*2+1]; - else - z+=(double)pc_modifysellvalue(sd,itemdb_value_sell(nameid)) * item_list[i*2+1]; - itemamount+=item_list[i*2+1]; - } + double z; + int i, skill, itemamount = 0; - if (z > MAX_ZENY) z = MAX_ZENY; - pc_getzeny(sd,(int)z); - for(i=0;i<n;i++) { - int item_id=item_list[i*2]-2; - pc_delitem(sd,item_id,item_list[i*2+1],0); - } + nullpo_retr (1, sd); + nullpo_retr (1, item_list); + + if (npc_checknear (sd, sd->npc_shopid)) + return 1; + for (i = 0, z = 0; i < n; i++) + { + int nameid; + if (item_list[i * 2] - 2 < 0 || item_list[i * 2] - 2 >= MAX_INVENTORY) + return 1; + nameid = sd->status.inventory[item_list[i * 2] - 2].nameid; + if (nameid == 0 || + sd->status.inventory[item_list[i * 2] - 2].amount < + item_list[i * 2 + 1]) + return 1; + if (sd->trade_partner != 0) + return 2; // cant sell while trading + if (itemdb_value_notoc (nameid)) + z += (double) itemdb_value_sell (nameid) * item_list[i * 2 + 1]; + else + z += (double) pc_modifysellvalue (sd, + itemdb_value_sell (nameid)) * + item_list[i * 2 + 1]; + itemamount += item_list[i * 2 + 1]; + } + + if (z > MAX_ZENY) + z = MAX_ZENY; + pc_getzeny (sd, (int) z); + for (i = 0; i < n; i++) + { + int item_id = item_list[i * 2] - 2; + pc_delitem (sd, item_id, item_list[i * 2 + 1], 0); + } - //ソスソスソスlソスoソスソスソスl + //ソスソスソスlソスoソスソスソスl /* if ((sd->status.class == 5) || (sd->status.class == 10) || (sd->status.class == 18)) { z = z * pc_checkskill(sd,MC_OVERCHARGE) / ((1 + 500 / itemamount) * 4000) * battle_config.shop_exp ; pc_gainexp(sd,0,z); }*/ - if (battle_config.shop_exp > 0 && z > 0 && (skill = pc_checkskill(sd,MC_OVERCHARGE)) > 0) { - if (skill > 0) { - z = (log(z * (double)skill) * (double)battle_config.shop_exp/100.); - if (z < 1) - z = 1; - pc_gainexp(sd,0,(int)z); - } - } + if (battle_config.shop_exp > 0 && z > 0 + && (skill = pc_checkskill (sd, MC_OVERCHARGE)) > 0) + { + if (skill > 0) + { + z = (log (z * (double) skill) * (double) battle_config.shop_exp / + 100.); + if (z < 1) + z = 1; + pc_gainexp (sd, 0, (int) z); + } + } - return 0; + return 0; } @@ -1071,1019 +1200,1208 @@ int npc_selllist(struct map_session_data *sd,int n,unsigned short *item_list) * ソスヌみ搾ソスソスソスnpcソスtソス@ソスCソスソスソスフクソスソスソスA *------------------------------------------ */ -void npc_clearsrcfile() +void npc_clearsrcfile () { - struct npc_src_list *p=npc_src_first; + struct npc_src_list *p = npc_src_first; - while( p ) { - struct npc_src_list *p2=p; - p=p->next; - free(p2); - } - npc_src_first=NULL; - npc_src_last=NULL; + while (p) + { + struct npc_src_list *p2 = p; + p = p->next; + free (p2); + } + npc_src_first = NULL; + npc_src_last = NULL; } + /*========================================== * ソスヌみ搾ソスソスソスnpcソスtソス@ソスCソスソスソスフ追会ソス *------------------------------------------ */ -void npc_addsrcfile(char *name) +void npc_addsrcfile (char *name) { - struct npc_src_list *new; - size_t len; + struct npc_src_list *new; + size_t len; - if ( strcmpi(name,"clear")==0 ) { - npc_clearsrcfile(); - return; - } + if (strcmpi (name, "clear") == 0) + { + npc_clearsrcfile (); + return; + } - len = sizeof(*new) + strlen(name); - new=(struct npc_src_list *)aCalloc(1,len); - new->next = NULL; - strncpy(new->name,name,strlen(name)+1); - if (npc_src_first==NULL) - npc_src_first = new; - if (npc_src_last) - npc_src_last->next = new; + len = sizeof (*new) + strlen (name); + new = (struct npc_src_list *) aCalloc (1, len); + new->next = NULL; + strncpy (new->name, name, strlen (name) + 1); + if (npc_src_first == NULL) + npc_src_first = new; + if (npc_src_last) + npc_src_last->next = new; - npc_src_last=new; + npc_src_last = new; } + /*========================================== * ソスヌみ搾ソスソスソスnpcソスtソス@ソスCソスソスソスフ削除 *------------------------------------------ */ -void npc_delsrcfile(char *name) +void npc_delsrcfile (char *name) { - struct npc_src_list *p=npc_src_first,*pp=NULL,**lp=&npc_src_first; + struct npc_src_list *p = npc_src_first, *pp = NULL, **lp = &npc_src_first; - if ( strcmpi(name,"all")==0 ) { - npc_clearsrcfile(); - return; - } + if (strcmpi (name, "all") == 0) + { + npc_clearsrcfile (); + return; + } - for( ; p; lp=&p->next,pp=p,p=p->next ) { - if ( strcmp(p->name,name)==0 ) { - *lp=p->next; - if ( npc_src_last==p ) - npc_src_last=pp; - free(p); - break; - } - } + for (; p; lp = &p->next, pp = p, p = p->next) + { + if (strcmp (p->name, name) == 0) + { + *lp = p->next; + if (npc_src_last == p) + npc_src_last = pp; + free (p); + break; + } + } } /*========================================== * warpソスsソスソスソスソス *------------------------------------------ */ -int npc_parse_warp(char *w1,char *w2,char *w3,char *w4) +int npc_parse_warp (char *w1, char *w2, char *w3, char *w4) { - int x,y,xs,ys,to_x,to_y,m; - int i,j; - char mapname[24],to_mapname[24]; - struct npc_data *nd; - - // ソスソスソスソスソスフ個撰ソスソス`ソスFソスbソスN - if (sscanf(w1,"%[^,],%d,%d",mapname,&x,&y) != 3 || - sscanf(w4,"%d,%d,%[^,],%d,%d",&xs,&ys,to_mapname,&to_x,&to_y) != 5) { - printf("bad warp line : %s\n",w3); - return 1; - } + int x, y, xs, ys, to_x, to_y, m; + int i, j; + char mapname[24], to_mapname[24]; + struct npc_data *nd; + + // ソスソスソスソスソスフ個撰ソスソス`ソスFソスbソスN + if (sscanf (w1, "%[^,],%d,%d", mapname, &x, &y) != 3 || + sscanf (w4, "%d,%d,%[^,],%d,%d", &xs, &ys, to_mapname, &to_x, + &to_y) != 5) + { + printf ("bad warp line : %s\n", w3); + return 1; + } - m=map_mapname2mapid(mapname); - - nd=(struct npc_data *)aCalloc(1,sizeof(struct npc_data)); - nd->bl.id=npc_get_new_npc_id(); - nd->n=map_addnpc(m,nd); - - nd->bl.prev = nd->bl.next = NULL; - nd->bl.m=m; - nd->bl.x=x; - nd->bl.y=y; - nd->dir=0; - nd->flag=0; - memcpy(nd->name,w3,24); - memcpy(nd->exname,w3,24); - - nd->chat_id=0; - if (!battle_config.warp_point_debug) - nd->class=WARP_CLASS; - else - nd->class=WARP_DEBUG_CLASS; - nd->speed=200; - nd->option = 0; - nd->opt1 = 0; - nd->opt2 = 0; - nd->opt3 = 0; - memcpy(nd->u.warp.name,to_mapname,16); - xs+=2; ys+=2; - nd->u.warp.x=to_x; - nd->u.warp.y=to_y; - nd->u.warp.xs=xs; - nd->u.warp.ys=ys; - - for(i=0;i<ys;i++) { - for(j=0;j<xs;j++) { - int t; - t=map_getcell(m,x-xs/2+j,y-ys/2+i); - if (t==1 || t==5) - continue; - map_setcell(m,x-xs/2+j,y-ys/2+i,t|0x80); - } - } + m = map_mapname2mapid (mapname); + + nd = (struct npc_data *) aCalloc (1, sizeof (struct npc_data)); + nd->bl.id = npc_get_new_npc_id (); + nd->n = map_addnpc (m, nd); + + nd->bl.prev = nd->bl.next = NULL; + nd->bl.m = m; + nd->bl.x = x; + nd->bl.y = y; + nd->dir = 0; + nd->flag = 0; + memcpy (nd->name, w3, 24); + memcpy (nd->exname, w3, 24); + + nd->chat_id = 0; + if (!battle_config.warp_point_debug) + nd->class = WARP_CLASS; + else + nd->class = WARP_DEBUG_CLASS; + nd->speed = 200; + nd->option = 0; + nd->opt1 = 0; + nd->opt2 = 0; + nd->opt3 = 0; + memcpy (nd->u.warp.name, to_mapname, 16); + xs += 2; + ys += 2; + nd->u.warp.x = to_x; + nd->u.warp.y = to_y; + nd->u.warp.xs = xs; + nd->u.warp.ys = ys; + + for (i = 0; i < ys; i++) + { + for (j = 0; j < xs; j++) + { + int t; + t = map_getcell (m, x - xs / 2 + j, y - ys / 2 + i); + if (t == 1 || t == 5) + continue; + map_setcell (m, x - xs / 2 + j, y - ys / 2 + i, t | 0x80); + } + } -// printf("warp npc %s %d read done\n",mapname,nd->bl.id); - npc_warp++; - nd->bl.type=BL_NPC; - nd->bl.subtype=WARP; - map_addblock(&nd->bl); - clif_spawnnpc(nd); - strdb_insert(npcname_db,nd->name,nd); +// printf("warp npc %s %d read done\n",mapname,nd->bl.id); + npc_warp++; + nd->bl.type = BL_NPC; + nd->bl.subtype = WARP; + map_addblock (&nd->bl); + clif_spawnnpc (nd); + strdb_insert (npcname_db, nd->name, nd); - return 0; + return 0; } /*========================================== * shopソスsソスソスソスソス *------------------------------------------ */ -static int npc_parse_shop(char *w1,char *w2,char *w3,char *w4) +static int npc_parse_shop (char *w1, char *w2, char *w3, char *w4) { - char *p; - int x, y, dir, m; - int max = 100, pos = 0; - char mapname[24]; - struct npc_data *nd; - - // ソスソスソスソスソスフ個撰ソスソス`ソスFソスbソスN - if (sscanf(w1, "%[^,],%d,%d,%d", mapname, &x, &y, &dir) != 4 || - strchr(w4, ',') == NULL) { - printf("bad shop line : %s\n", w3); - return 1; - } - m = map_mapname2mapid(mapname); - - nd = (struct npc_data *)aCalloc(1,sizeof(struct npc_data) + - sizeof(nd->u.shop_item[0]) * (max + 1)); - p = strchr(w4, ','); - - while (p && pos < max) { - int nameid,value; - char name[24]; - struct item_data *id = NULL; - p++; - if (sscanf(p, "%d:%d", &nameid, &value) == 2) { - } else if (sscanf(p, "%s :%d", name, &value) == 2) { - id = itemdb_searchname(name); - if (id == NULL) nameid = -1; - else nameid = id->nameid; - } else break; - - if (nameid > 0) { - nd->u.shop_item[pos].nameid = nameid; - if (value < 0) { - if (id == NULL) id = itemdb_search(nameid); - value = id->value_buy * abs(value); - - } - nd->u.shop_item[pos].value = value; - pos++; - } - p=strchr(p,','); - } - if (pos == 0) { - free(nd); - return 1; - } - nd->u.shop_item[pos++].nameid = 0; - - nd->bl.prev = nd->bl.next = NULL; - nd->bl.m = m; - nd->bl.x = x; - nd->bl.y = y; - nd->bl.id = npc_get_new_npc_id(); - nd->dir = dir; - nd->flag = 0; - memcpy(nd->name, w3, 24); - nd->class = atoi(w4); - nd->speed = 200; - nd->chat_id = 0; - nd->option = 0; - nd->opt1 = 0; - nd->opt2 = 0; - nd->opt3 = 0; - - nd = (struct npc_data *)aRealloc(nd, - sizeof(struct npc_data) + sizeof(nd->u.shop_item[0]) * pos); - - //printf("shop npc %s %d read done\n",mapname,nd->bl.id); - npc_shop++; - nd->bl.type=BL_NPC; - nd->bl.subtype=SHOP; - nd->n=map_addnpc(m,nd); - map_addblock(&nd->bl); - clif_spawnnpc(nd); - strdb_insert(npcname_db,nd->name,nd); + char *p; + int x, y, dir, m; + int max = 100, pos = 0; + char mapname[24]; + struct npc_data *nd; + + // ソスソスソスソスソスフ個撰ソスソス`ソスFソスbソスN + if (sscanf (w1, "%[^,],%d,%d,%d", mapname, &x, &y, &dir) != 4 || + strchr (w4, ',') == NULL) + { + printf ("bad shop line : %s\n", w3); + return 1; + } + m = map_mapname2mapid (mapname); + + nd = (struct npc_data *) aCalloc (1, sizeof (struct npc_data) + + sizeof (nd->u.shop_item[0]) * (max + + 1)); + p = strchr (w4, ','); + + while (p && pos < max) + { + int nameid, value; + char name[24]; + struct item_data *id = NULL; + p++; + if (sscanf (p, "%d:%d", &nameid, &value) == 2) + { + } + else if (sscanf (p, "%s :%d", name, &value) == 2) + { + id = itemdb_searchname (name); + if (id == NULL) + nameid = -1; + else + nameid = id->nameid; + } + else + break; + + if (nameid > 0) + { + nd->u.shop_item[pos].nameid = nameid; + if (value < 0) + { + if (id == NULL) + id = itemdb_search (nameid); + value = id->value_buy * abs (value); - return 0; + } + nd->u.shop_item[pos].value = value; + pos++; + } + p = strchr (p, ','); + } + if (pos == 0) + { + free (nd); + return 1; + } + nd->u.shop_item[pos++].nameid = 0; + + nd->bl.prev = nd->bl.next = NULL; + nd->bl.m = m; + nd->bl.x = x; + nd->bl.y = y; + nd->bl.id = npc_get_new_npc_id (); + nd->dir = dir; + nd->flag = 0; + memcpy (nd->name, w3, 24); + nd->class = atoi (w4); + nd->speed = 200; + nd->chat_id = 0; + nd->option = 0; + nd->opt1 = 0; + nd->opt2 = 0; + nd->opt3 = 0; + + nd = (struct npc_data *) aRealloc (nd, + sizeof (struct npc_data) + + sizeof (nd->u.shop_item[0]) * pos); + + //printf("shop npc %s %d read done\n",mapname,nd->bl.id); + npc_shop++; + nd->bl.type = BL_NPC; + nd->bl.subtype = SHOP; + nd->n = map_addnpc (m, nd); + map_addblock (&nd->bl); + clif_spawnnpc (nd); + strdb_insert (npcname_db, nd->name, nd); + + return 0; } + /*========================================== * NPCソスフソスソスxソスソスソスfソス[ソス^ソスRソスソスソスoソス[ソスg *------------------------------------------ */ -int npc_convertlabel_db(void *key,void *data,va_list ap) +int npc_convertlabel_db (void *key, void *data, va_list ap) { - char *lname=(char *)key; - int pos=(int)data; - struct npc_data *nd; - struct npc_label_list *lst; - int num; - char *p=strchr(lname,':'); - - nullpo_retr(0, ap); - nullpo_retr(0, nd=va_arg(ap,struct npc_data *)); - - lst=nd->u.scr.label_list; - num=nd->u.scr.label_list_num; - if(!lst){ - lst=(struct npc_label_list *)aCalloc(1,sizeof(struct npc_label_list)); - num=0; - }else - lst=(struct npc_label_list *)aRealloc(lst,sizeof(struct npc_label_list)*(num+1)); - - *p='\0'; - strncpy(lst[num].name,lname,24); - *p=':'; - lst[num].pos=pos; - nd->u.scr.label_list=lst; - nd->u.scr.label_list_num=num+1; - return 0; + char *lname = (char *) key; + int pos = (int) data; + struct npc_data *nd; + struct npc_label_list *lst; + int num; + char *p = strchr (lname, ':'); + + nullpo_retr (0, ap); + nullpo_retr (0, nd = va_arg (ap, struct npc_data *)); + + lst = nd->u.scr.label_list; + num = nd->u.scr.label_list_num; + if (!lst) + { + lst = + (struct npc_label_list *) aCalloc (1, + sizeof (struct + npc_label_list)); + num = 0; + } + else + lst = + (struct npc_label_list *) aRealloc (lst, + sizeof (struct npc_label_list) + * (num + 1)); + + *p = '\0'; + strncpy (lst[num].name, lname, 24); + *p = ':'; + lst[num].pos = pos; + nd->u.scr.label_list = lst; + nd->u.scr.label_list_num = num + 1; + return 0; } + /*========================================== * scriptソスsソスソスソスソス *------------------------------------------ */ -static int npc_parse_script(char *w1,char *w2,char *w3,char *w4,char *first_line,FILE *fp,int *lines) +static int npc_parse_script (char *w1, char *w2, char *w3, char *w4, + char *first_line, FILE * fp, int *lines) { - int x,y,dir=0,m,xs=0,ys=0,class=0; // [Valaris] thanks to fov - char mapname[24]; - unsigned char *srcbuf=NULL,*script; - int srcsize=65536; - int startline=0; - unsigned char line[1024]; - int i; - struct npc_data *nd; - int evflag=0; - struct dbt *label_db; - char *p; - struct npc_label_list *label_dup=NULL; - int label_dupnum=0; - int src_id=0; - - if(strcmp(w1,"-")==0){ - x=0;y=0;m=-1; - }else{ - // ソスソスソスソスソスフ個撰ソスソス`ソスFソスbソスN - if (sscanf(w1,"%[^,],%d,%d,%d",mapname,&x,&y,&dir) != 4 || - ( strcmp(w2,"script")==0 && strchr(w4,',')==NULL) ) { - printf("bad script line : %s\n",w3); - return 1; - } - m = map_mapname2mapid(mapname); - } + int x, y, dir = 0, m, xs = 0, ys = 0, class = 0; // [Valaris] thanks to fov + char mapname[24]; + unsigned char *srcbuf = NULL, *script; + int srcsize = 65536; + int startline = 0; + unsigned char line[1024]; + int i; + struct npc_data *nd; + int evflag = 0; + struct dbt *label_db; + char *p; + struct npc_label_list *label_dup = NULL; + int label_dupnum = 0; + int src_id = 0; + + if (strcmp (w1, "-") == 0) + { + x = 0; + y = 0; + m = -1; + } + else + { + // ソスソスソスソスソスフ個撰ソスソス`ソスFソスbソスN + if (sscanf (w1, "%[^,],%d,%d,%d", mapname, &x, &y, &dir) != 4 || + (strcmp (w2, "script") == 0 && strchr (w4, ',') == NULL)) + { + printf ("bad script line : %s\n", w3); + return 1; + } + m = map_mapname2mapid (mapname); + } - if(strcmp(w2,"script")==0){ - // ソスXソスNソスソスソスvソスgソスフ会ソスソスソス - srcbuf=(char *)aCalloc(srcsize,sizeof(char)); - if (strchr(first_line,'{')) { - strcpy(srcbuf,strchr(first_line,'{')); - startline=*lines; - } else - srcbuf[0]=0; - while(1) { - for(i=strlen(srcbuf)-1;i>=0 && isspace(srcbuf[i]);i--); - if (i>=0 && srcbuf[i]=='}') - break; - fgets(line,1020,fp); - (*lines)++; - if (feof(fp)) - break; - if (strlen(srcbuf)+strlen(line)+1>=srcsize) { - srcsize += 65536; - srcbuf = (char *)aRealloc(srcbuf, srcsize); - memset(srcbuf + srcsize - 65536, '\0', 65536); - } - if (srcbuf[0]!='{') { - if (strchr(line,'{')) { - strcpy(srcbuf,strchr(line,'{')); - startline=*lines; - } - } else - strcat(srcbuf,line); - } - script=parse_script(srcbuf,startline); - if (script==NULL) { - // script parse error? - free(srcbuf); - return 1; - } + if (strcmp (w2, "script") == 0) + { + // ソスXソスNソスソスソスvソスgソスフ会ソスソスソス + srcbuf = (char *) aCalloc (srcsize, sizeof (char)); + if (strchr (first_line, '{')) + { + strcpy (srcbuf, strchr (first_line, '{')); + startline = *lines; + } + else + srcbuf[0] = 0; + while (1) + { + for (i = strlen (srcbuf) - 1; i >= 0 && isspace (srcbuf[i]); i--); + if (i >= 0 && srcbuf[i] == '}') + break; + fgets (line, 1020, fp); + (*lines)++; + if (feof (fp)) + break; + if (strlen (srcbuf) + strlen (line) + 1 >= srcsize) + { + srcsize += 65536; + srcbuf = (char *) aRealloc (srcbuf, srcsize); + memset (srcbuf + srcsize - 65536, '\0', 65536); + } + if (srcbuf[0] != '{') + { + if (strchr (line, '{')) + { + strcpy (srcbuf, strchr (line, '{')); + startline = *lines; + } + } + else + strcat (srcbuf, line); + } + script = parse_script (srcbuf, startline); + if (script == NULL) + { + // script parse error? + free (srcbuf); + return 1; + } - }else{ - // duplicateソスソスソスソス - - char srcname[128]; - struct npc_data *nd2; - if( sscanf(w2,"duplicate(%[^)])",srcname)!=1 ){ - printf("bad duplicate name! : %s",w2); - return 0; - } - if( (nd2=npc_name2id(srcname))==NULL ){ - printf("bad duplicate name! (not exist) : %s\n",srcname); - return 0; - } - script=nd2->u.scr.script; - label_dup=nd2->u.scr.label_list; - label_dupnum=nd2->u.scr.label_list_num; - src_id=nd2->bl.id; - - }// end of ソスXソスNソスソスソスvソスgソスソスソスソス - - nd=(struct npc_data *)aCalloc(1,sizeof(struct npc_data)); - - if(m==-1){ - // ソスXソスNソスソスソスvソスgソスRソスsソス[ソスpソスフダソス~ソス[NPC - - }else if( sscanf(w4,"%d,%d,%d",&class,&xs,&ys)==3) { - // ソスレ触ソス^NPC - int i,j; - - if (xs>=0)xs=xs*2+1; - if (ys>=0)ys=ys*2+1; - - if (class>=0) { - - for(i=0;i<ys;i++) { - for(j=0;j<xs;j++) { - int t; - t=map_getcell(m,x-xs/2+j,y-ys/2+i); - if (t==1 || t==5) - continue; - map_setcell(m,x-xs/2+j,y-ys/2+i,t|0x80); - } - } - } - - nd->u.scr.xs=xs; - nd->u.scr.ys=ys; - } else { // ソスNソスソスソスbソスNソス^NPC - class=atoi(w4); - nd->u.scr.xs=0; - nd->u.scr.ys=0; - } - - if (class<0 && m>=0) { // ソスCソスxソスソスソスgソス^NPC - evflag=1; - } + } + else + { + // duplicateソスソスソスソス + + char srcname[128]; + struct npc_data *nd2; + if (sscanf (w2, "duplicate(%[^)])", srcname) != 1) + { + printf ("bad duplicate name! : %s", w2); + return 0; + } + if ((nd2 = npc_name2id (srcname)) == NULL) + { + printf ("bad duplicate name! (not exist) : %s\n", srcname); + return 0; + } + script = nd2->u.scr.script; + label_dup = nd2->u.scr.label_list; + label_dupnum = nd2->u.scr.label_list_num; + src_id = nd2->bl.id; - while((p=strchr(w3,':'))) { - if (p[1]==':') break; - } - if (p) { - *p=0; - memcpy(nd->name,w3,24); - memcpy(nd->exname,p+2,24); - }else{ - memcpy(nd->name,w3,24); - memcpy(nd->exname,w3,24); - } + } // end of ソスXソスNソスソスソスvソスgソスソスソスソス - nd->bl.prev = nd->bl.next = NULL; - nd->bl.m = m; - nd->bl.x = x; - nd->bl.y = y; - nd->bl.id=npc_get_new_npc_id(); - nd->dir = dir; - nd->flag=0; - nd->class=class; - nd->speed=200; - nd->u.scr.script=script; - nd->u.scr.src_id=src_id; - nd->chat_id=0; - nd->option = 0; - nd->opt1 = 0; - nd->opt2 = 0; - nd->opt3 = 0; - - //printf("script npc %s %d %d read done\n",mapname,nd->bl.id,nd->class); - npc_script++; - nd->bl.type=BL_NPC; - nd->bl.subtype=SCRIPT; - if(m>=0){ - nd->n=map_addnpc(m,nd); - map_addblock(&nd->bl); - - if (evflag) { // ソスCソスxソスソスソスgソス^ - struct event_data *ev=(struct event_data *)aCalloc(1,sizeof(struct event_data)); - ev->nd=nd; - ev->pos=0; - strdb_insert(ev_db,nd->exname,ev); - }else - clif_spawnnpc(nd); - } - strdb_insert(npcname_db,nd->exname,nd); + nd = (struct npc_data *) aCalloc (1, sizeof (struct npc_data)); + if (m == -1) + { + // ソスXソスNソスソスソスvソスgソスRソスsソス[ソスpソスフダソス~ソス[NPC - //----------------------------------------- - // ソスソスソスxソスソスソスfソス[ソス^ソスフ擾ソスソスソス - if(srcbuf){ - // scriptソス{ソスフゑソスソスソスソスソスソス鼾ソスフ擾ソスソスソス - - // ソスソスソスxソスソスソスfソス[ソス^ソスフコソスソスソスoソス[ソスg - label_db=script_get_label_db(); - strdb_foreach(label_db,npc_convertlabel_db,nd); - - // ソスソスソスgソスソスソスネゑソスソスフでバソスbソスtソス@ソスソスソスソス - free(srcbuf); + } + else if (sscanf (w4, "%d,%d,%d", &class, &xs, &ys) == 3) + { + // ソスレ触ソス^NPC + int i, j; + + if (xs >= 0) + xs = xs * 2 + 1; + if (ys >= 0) + ys = ys * 2 + 1; + + if (class >= 0) + { + + for (i = 0; i < ys; i++) + { + for (j = 0; j < xs; j++) + { + int t; + t = map_getcell (m, x - xs / 2 + j, y - ys / 2 + i); + if (t == 1 || t == 5) + continue; + map_setcell (m, x - xs / 2 + j, y - ys / 2 + i, t | 0x80); + } + } + } - }else{ - // duplicate + nd->u.scr.xs = xs; + nd->u.scr.ys = ys; + } + else + { // ソスNソスソスソスbソスNソス^NPC + class = atoi (w4); + nd->u.scr.xs = 0; + nd->u.scr.ys = 0; + } -// nd->u.scr.label_list=malloc(sizeof(struct npc_label_list)*label_dupnum); -// memcpy(nd->u.scr.label_list,label_dup,sizeof(struct npc_label_list)*label_dupnum); + if (class < 0 && m >= 0) + { // ソスCソスxソスソスソスgソス^NPC + evflag = 1; + } - nd->u.scr.label_list=label_dup; // ソスソスソスxソスソスソスfソス[ソス^ソスソスソスL - nd->u.scr.label_list_num=label_dupnum; - } + while ((p = strchr (w3, ':'))) + { + if (p[1] == ':') + break; + } + if (p) + { + *p = 0; + memcpy (nd->name, w3, 24); + memcpy (nd->exname, p + 2, 24); + } + else + { + memcpy (nd->name, w3, 24); + memcpy (nd->exname, w3, 24); + } - //----------------------------------------- - // ソスCソスxソスソスソスgソスpソスソスソスxソスソスソスfソス[ソス^ソスフエソスNソスXソス|ソス[ソスg - for(i=0;i<nd->u.scr.label_list_num;i++){ - char *lname=nd->u.scr.label_list[i].name; - int pos=nd->u.scr.label_list[i].pos; - - if ((lname[0]=='O' || lname[0]=='o')&&(lname[1]=='N' || lname[1]=='n')) { - struct event_data *ev; - char *buf; - // ソスGソスNソスXソス|ソス[ソスgソスソスソスソスソスソス - ev=(struct event_data *)aCalloc(1,sizeof(struct event_data)); - buf=(char *)aCalloc(50,sizeof(char)); - if (strlen(lname)>24) { - printf("npc_parse_script: label name error !\n"); - exit(1); - }else{ - ev->nd=nd; - ev->pos=pos; - sprintf(buf,"%s::%s",nd->exname,lname); - strdb_insert(ev_db,buf,ev); - } - } - } - - //----------------------------------------- - // ソスソスソスxソスソスソスfソス[ソス^ソスソスソスソスソス^ソスCソス}ソス[ソスCソスxソスソスソスgソスソスソス闕橸ソスソス - for(i=0;i<nd->u.scr.label_list_num;i++){ - int t=0,k=0; - char *lname=nd->u.scr.label_list[i].name; - int pos=nd->u.scr.label_list[i].pos; - if(sscanf(lname,"OnTimer%d%n",&t,&k)==1 && lname[k]=='\0') { - // ソス^ソスCソス}ソス[ソスCソスxソスソスソスg - struct npc_timerevent_list *te=nd->u.scr.timer_event; - int j,k=nd->u.scr.timeramount; - if(te==NULL) - te=(struct npc_timerevent_list *)aCalloc(1,sizeof(struct npc_timerevent_list)); - else - te=(struct npc_timerevent_list *)aRealloc( te, sizeof(struct npc_timerevent_list) * (k+1) ); - for(j=0;j<k;j++){ - if(te[j].timer>t){ - memmove(te+j+1,te+j,sizeof(struct npc_timerevent_list)*(k-j)); - break; - } - } - te[j].timer=t; - te[j].pos=pos; - nd->u.scr.timer_event=te; - nd->u.scr.timeramount=k+1; - } - } - nd->u.scr.nexttimer=-1; - nd->u.scr.timerid=-1; + nd->bl.prev = nd->bl.next = NULL; + nd->bl.m = m; + nd->bl.x = x; + nd->bl.y = y; + nd->bl.id = npc_get_new_npc_id (); + nd->dir = dir; + nd->flag = 0; + nd->class = class; + nd->speed = 200; + nd->u.scr.script = script; + nd->u.scr.src_id = src_id; + nd->chat_id = 0; + nd->option = 0; + nd->opt1 = 0; + nd->opt2 = 0; + nd->opt3 = 0; + + //printf("script npc %s %d %d read done\n",mapname,nd->bl.id,nd->class); + npc_script++; + nd->bl.type = BL_NPC; + nd->bl.subtype = SCRIPT; + if (m >= 0) + { + nd->n = map_addnpc (m, nd); + map_addblock (&nd->bl); + + if (evflag) + { // ソスCソスxソスソスソスgソス^ + struct event_data *ev = + (struct event_data *) aCalloc (1, sizeof (struct event_data)); + ev->nd = nd; + ev->pos = 0; + strdb_insert (ev_db, nd->exname, ev); + } + else + clif_spawnnpc (nd); + } + strdb_insert (npcname_db, nd->exname, nd); - return 0; + //----------------------------------------- + // ソスソスソスxソスソスソスfソス[ソス^ソスフ擾ソスソスソス + if (srcbuf) + { + // scriptソス{ソスフゑソスソスソスソスソスソス鼾ソスフ擾ソスソスソス + + // ソスソスソスxソスソスソスfソス[ソス^ソスフコソスソスソスoソス[ソスg + label_db = script_get_label_db (); + strdb_foreach (label_db, npc_convertlabel_db, nd); + + // ソスソスソスgソスソスソスネゑソスソスフでバソスbソスtソス@ソスソスソスソス + free (srcbuf); + + } + else + { + // duplicate + +// nd->u.scr.label_list=malloc(sizeof(struct npc_label_list)*label_dupnum); +// memcpy(nd->u.scr.label_list,label_dup,sizeof(struct npc_label_list)*label_dupnum); + + nd->u.scr.label_list = label_dup; // ソスソスソスxソスソスソスfソス[ソス^ソスソスソスL + nd->u.scr.label_list_num = label_dupnum; + } + + //----------------------------------------- + // ソスCソスxソスソスソスgソスpソスソスソスxソスソスソスfソス[ソス^ソスフエソスNソスXソス|ソス[ソスg + for (i = 0; i < nd->u.scr.label_list_num; i++) + { + char *lname = nd->u.scr.label_list[i].name; + int pos = nd->u.scr.label_list[i].pos; + + if ((lname[0] == 'O' || lname[0] == 'o') + && (lname[1] == 'N' || lname[1] == 'n')) + { + struct event_data *ev; + char *buf; + // ソスGソスNソスXソス|ソス[ソスgソスソスソスソスソスソス + ev = (struct event_data *) aCalloc (1, + sizeof (struct event_data)); + buf = (char *) aCalloc (50, sizeof (char)); + if (strlen (lname) > 24) + { + printf ("npc_parse_script: label name error !\n"); + exit (1); + } + else + { + ev->nd = nd; + ev->pos = pos; + sprintf (buf, "%s::%s", nd->exname, lname); + strdb_insert (ev_db, buf, ev); + } + } + } + + //----------------------------------------- + // ソスソスソスxソスソスソスfソス[ソス^ソスソスソスソスソス^ソスCソス}ソス[ソスCソスxソスソスソスgソスソスソス闕橸ソスソス + for (i = 0; i < nd->u.scr.label_list_num; i++) + { + int t = 0, k = 0; + char *lname = nd->u.scr.label_list[i].name; + int pos = nd->u.scr.label_list[i].pos; + if (sscanf (lname, "OnTimer%d%n", &t, &k) == 1 && lname[k] == '\0') + { + // ソス^ソスCソス}ソス[ソスCソスxソスソスソスg + struct npc_timerevent_list *te = nd->u.scr.timer_event; + int j, k = nd->u.scr.timeramount; + if (te == NULL) + te = (struct npc_timerevent_list *) aCalloc (1, + sizeof (struct + npc_timerevent_list)); + else + te = (struct npc_timerevent_list *) aRealloc (te, + sizeof (struct + npc_timerevent_list) + * (k + 1)); + for (j = 0; j < k; j++) + { + if (te[j].timer > t) + { + memmove (te + j + 1, te + j, + sizeof (struct npc_timerevent_list) * (k - j)); + break; + } + } + te[j].timer = t; + te[j].pos = pos; + nd->u.scr.timer_event = te; + nd->u.scr.timeramount = k + 1; + } + } + nd->u.scr.nexttimer = -1; + nd->u.scr.timerid = -1; + + return 0; } /*========================================== * functionソスsソスソスソスソス *------------------------------------------ */ -static int npc_parse_function(char *w1,char *w2,char *w3,char *w4,char *first_line,FILE *fp,int *lines) +static int npc_parse_function (char *w1, char *w2, char *w3, char *w4, + char *first_line, FILE * fp, int *lines) { - char *srcbuf=NULL,*script; - int srcsize=65536; - int startline=0; - char line[1024]; - int i; -// struct dbt *label_db; - char *p; - - // ソスXソスNソスソスソスvソスgソスフ会ソスソスソス - srcbuf=(char *)aCalloc(srcsize,sizeof(char)); - if (strchr(first_line,'{')) { - strcpy(srcbuf,strchr(first_line,'{')); - startline=*lines; - } else - srcbuf[0]=0; - while(1) { - for(i=strlen(srcbuf)-1;i>=0 && isspace(srcbuf[i]);i--); - if (i>=0 && srcbuf[i]=='}') - break; - fgets(line,1020,fp); - (*lines)++; - if (feof(fp)) - break; - if (strlen(srcbuf)+strlen(line)+1>=srcsize) { - srcsize += 65536; - srcbuf = (char *)aRealloc(srcbuf, srcsize); - memset(srcbuf + srcsize - 65536, '\0', 65536); - } - if (srcbuf[0]!='{') { - if (strchr(line,'{')) { - strcpy(srcbuf,strchr(line,'{')); - startline=*lines; - } - } else - strcat(srcbuf,line); - } - script=parse_script(srcbuf,startline); - if (script==NULL) { - // script parse error? - free(srcbuf); - return 1; - } + char *srcbuf = NULL, *script; + int srcsize = 65536; + int startline = 0; + char line[1024]; + int i; +// struct dbt *label_db; + char *p; + + // ソスXソスNソスソスソスvソスgソスフ会ソスソスソス + srcbuf = (char *) aCalloc (srcsize, sizeof (char)); + if (strchr (first_line, '{')) + { + strcpy (srcbuf, strchr (first_line, '{')); + startline = *lines; + } + else + srcbuf[0] = 0; + while (1) + { + for (i = strlen (srcbuf) - 1; i >= 0 && isspace (srcbuf[i]); i--); + if (i >= 0 && srcbuf[i] == '}') + break; + fgets (line, 1020, fp); + (*lines)++; + if (feof (fp)) + break; + if (strlen (srcbuf) + strlen (line) + 1 >= srcsize) + { + srcsize += 65536; + srcbuf = (char *) aRealloc (srcbuf, srcsize); + memset (srcbuf + srcsize - 65536, '\0', 65536); + } + if (srcbuf[0] != '{') + { + if (strchr (line, '{')) + { + strcpy (srcbuf, strchr (line, '{')); + startline = *lines; + } + } + else + strcat (srcbuf, line); + } + script = parse_script (srcbuf, startline); + if (script == NULL) + { + // script parse error? + free (srcbuf); + return 1; + } - p=(char *)aCalloc(50,sizeof(char)); + p = (char *) aCalloc (50, sizeof (char)); - strncpy(p,w3,50); - strdb_insert(script_get_userfunc_db(),p,script); + strncpy (p, w3, 50); + strdb_insert (script_get_userfunc_db (), p, script); -// label_db=script_get_label_db(); +// label_db=script_get_label_db(); - // ソスソスソスgソスソスソスネゑソスソスフでバソスbソスtソス@ソスソスソスソス - free(srcbuf); - -// printf("function %s => %p\n",p,script); - - return 0; -} + // ソスソスソスgソスソスソスネゑソスソスフでバソスbソスtソス@ソスソスソスソス + free (srcbuf); + +// printf("function %s => %p\n",p,script); + return 0; +} /*========================================== * mobソスsソスソスソスソス *------------------------------------------ */ -int npc_parse_mob(char *w1,char *w2,char *w3,char *w4) +int npc_parse_mob (char *w1, char *w2, char *w3, char *w4) { - int m,x,y,xs,ys,class,num,delay1,delay2; - int i; - char mapname[24]; - char eventname[24]=""; - struct mob_data *md; - - xs=ys=0; - delay1=delay2=0; - // ソスソスソスソスソスフ個撰ソスソス`ソスFソスbソスN - if (sscanf(w1,"%[^,],%d,%d,%d,%d",mapname,&x,&y,&xs,&ys) < 3 || - sscanf(w4,"%d,%d,%d,%d,%s",&class,&num,&delay1,&delay2,eventname) < 2 ) { - printf("bad monster line : %s\n",w3); - return 1; - } + int m, x, y, xs, ys, class, num, delay1, delay2; + int i; + char mapname[24]; + char eventname[24] = ""; + struct mob_data *md; + + xs = ys = 0; + delay1 = delay2 = 0; + // ソスソスソスソスソスフ個撰ソスソス`ソスFソスbソスN + if (sscanf (w1, "%[^,],%d,%d,%d,%d", mapname, &x, &y, &xs, &ys) < 3 || + sscanf (w4, "%d,%d,%d,%d,%s", &class, &num, &delay1, &delay2, + eventname) < 2) + { + printf ("bad monster line : %s\n", w3); + return 1; + } - m=map_mapname2mapid(mapname); + m = map_mapname2mapid (mapname); - if ( num>1 && battle_config.mob_count_rate!=100) { - if ( (num=num*battle_config.mob_count_rate/100)<1 ) - num=1; - } + if (num > 1 && battle_config.mob_count_rate != 100) + { + if ((num = num * battle_config.mob_count_rate / 100) < 1) + num = 1; + } - for(i=0;i<num;i++) { - md=(struct mob_data *)aCalloc(1,sizeof(struct mob_data)); - - md->bl.prev=NULL; - md->bl.next=NULL; - md->bl.m=m; - md->bl.x=x; - md->bl.y=y; - if(strcmp(w3,"--en--")==0) - memcpy(md->name,mob_db[class].name,24); - else if(strcmp(w3,"--ja--")==0) - memcpy(md->name,mob_db[class].jname,24); - else - memcpy(md->name,w3,24); - - md->n = i; - md->base_class = md->class = class; - md->bl.id=npc_get_new_npc_id(); - md->m =m; - md->x0=x; - md->y0=y; - md->xs=xs; - md->ys=ys; - md->spawndelay1=delay1; - md->spawndelay2=delay2; - - memset(&md->state,0,sizeof(md->state)); - md->timer = -1; - md->target_id=0; - md->attacked_id=0; - - if (mob_db[class].mode&0x02) - md->lootitem=(struct item *)aCalloc(LOOTITEM_SIZE,sizeof(struct item)); - else - md->lootitem=NULL; - - if (strlen(eventname)>=4) { - memcpy(md->npc_event,eventname,24); - }else - memset(md->npc_event,0,24); - - md->bl.type=BL_MOB; - map_addiddb(&md->bl); - mob_spawn(md->bl.id); - - npc_mob++; - } - //printf("warp npc %s %d read done\n",mapname,nd->bl.id); + for (i = 0; i < num; i++) + { + md = (struct mob_data *) aCalloc (1, sizeof (struct mob_data)); + + md->bl.prev = NULL; + md->bl.next = NULL; + md->bl.m = m; + md->bl.x = x; + md->bl.y = y; + if (strcmp (w3, "--en--") == 0) + memcpy (md->name, mob_db[class].name, 24); + else if (strcmp (w3, "--ja--") == 0) + memcpy (md->name, mob_db[class].jname, 24); + else + memcpy (md->name, w3, 24); + + md->n = i; + md->base_class = md->class = class; + md->bl.id = npc_get_new_npc_id (); + md->m = m; + md->x0 = x; + md->y0 = y; + md->xs = xs; + md->ys = ys; + md->spawndelay1 = delay1; + md->spawndelay2 = delay2; + + memset (&md->state, 0, sizeof (md->state)); + md->timer = -1; + md->target_id = 0; + md->attacked_id = 0; + + if (mob_db[class].mode & 0x02) + md->lootitem = + (struct item *) aCalloc (LOOTITEM_SIZE, sizeof (struct item)); + else + md->lootitem = NULL; + + if (strlen (eventname) >= 4) + { + memcpy (md->npc_event, eventname, 24); + } + else + memset (md->npc_event, 0, 24); - return 0; + md->bl.type = BL_MOB; + map_addiddb (&md->bl); + mob_spawn (md->bl.id); + + npc_mob++; + } + //printf("warp npc %s %d read done\n",mapname,nd->bl.id); + + return 0; } /*========================================== * ソス}ソスbソスvソスtソスソスソスOソスsソスフ会ソスソスソス *------------------------------------------ */ -static int npc_parse_mapflag(char *w1,char *w2,char *w3,char *w4) +static int npc_parse_mapflag (char *w1, char *w2, char *w3, char *w4) { - int m; - char mapname[24],savemap[16]; - int savex,savey; - char drop_arg1[16],drop_arg2[16]; - int drop_id=0,drop_type=0,drop_per=0; - - // ソスソスソスソスソスフ個撰ソスソス`ソスFソスbソスN -// if ( sscanf(w1,"%[^,],%d,%d,%d",mapname,&x,&y,&dir) != 4 ) - if ( sscanf(w1,"%[^,]",mapname) != 1 ) - return 1; + int m; + char mapname[24], savemap[16]; + int savex, savey; + char drop_arg1[16], drop_arg2[16]; + int drop_id = 0, drop_type = 0, drop_per = 0; + + // ソスソスソスソスソスフ個撰ソスソス`ソスFソスbソスN +// if ( sscanf(w1,"%[^,],%d,%d,%d",mapname,&x,&y,&dir) != 4 ) + if (sscanf (w1, "%[^,]", mapname) != 1) + return 1; - m=map_mapname2mapid(mapname); - if (m<0) - return 1; + m = map_mapname2mapid (mapname); + if (m < 0) + return 1; //ソス}ソスbソスvソスtソスソスソスO - if ( strcmpi(w3,"nosave")==0) { - if (strcmp(w4,"SavePoint")==0) { - memcpy(map[m].save.map,"SavePoint",16); - map[m].save.x=-1; - map[m].save.y=-1; - }else if (sscanf(w4,"%[^,],%d,%d",savemap,&savex,&savey)==3) { - memcpy(map[m].save.map,savemap,16); - map[m].save.x=savex; - map[m].save.y=savey; - } - map[m].flag.nosave=1; - } - else if (strcmpi(w3,"nomemo")==0) { - map[m].flag.nomemo=1; - } - else if (strcmpi(w3,"noteleport")==0) { - map[m].flag.noteleport=1; - } - else if (strcmpi(w3,"nowarp")==0) { - map[m].flag.nowarp=1; - } - else if (strcmpi(w3,"nowarpto")==0) { - map[m].flag.nowarpto=1; - } - else if (strcmpi(w3,"noreturn")==0) { - map[m].flag.noreturn=1; - } - else if (strcmpi(w3,"monster_noteleport")==0) { - map[m].flag.monster_noteleport=1; - } - else if (strcmpi(w3,"nobranch")==0) { - map[m].flag.nobranch=1; - } - else if (strcmpi(w3,"nopenalty")==0) { - map[m].flag.nopenalty=1; - } - else if (strcmpi(w3,"pvp")==0) { - map[m].flag.pvp=1; - } - else if (strcmpi(w3,"pvp_noparty")==0) { - map[m].flag.pvp_noparty=1; - } - else if (strcmpi(w3,"pvp_noguild")==0) { - map[m].flag.pvp_noguild=1; - } - else if (strcmpi(w3,"pvp_nightmaredrop")==0) { - if (sscanf(w4,"%[^,],%[^,],%d",drop_arg1,drop_arg2,&drop_per)==3) { int i; - if(strcmp(drop_arg1,"random")==0) - drop_id = -1; - else if(itemdb_exists( (drop_id=atoi(drop_arg1)) )==NULL) - drop_id = 0; - if(strcmp(drop_arg2,"inventory")==0) - drop_type = 1; - else if(strcmp(drop_arg2,"equip")==0) - drop_type = 2; - else if(strcmp(drop_arg2,"all")==0) - drop_type = 3; - - if(drop_id != 0){ - for (i=0;i<MAX_DROP_PER_MAP;i++){ - if(map[m].drop_list[i].drop_id==0){ - map[m].drop_list[i].drop_id = drop_id; - map[m].drop_list[i].drop_type = drop_type; - map[m].drop_list[i].drop_per = drop_per; - break; - } - } - map[m].flag.pvp_nightmaredrop=1; - } - } - } - else if (strcmpi(w3,"pvp_nocalcrank")==0) { - map[m].flag.pvp_nocalcrank=1; - } - else if (strcmpi(w3,"gvg")==0) { - map[m].flag.gvg=1; - } - else if (strcmpi(w3,"gvg_noparty")==0) { - map[m].flag.gvg_noparty=1; - } - else if (strcmpi(w3,"nozenypenalty")==0) { - map[m].flag.nozenypenalty=1; - } - else if (strcmpi(w3,"notrade")==0) { - map[m].flag.notrade=1; - } - else if (strcmpi(w3,"noskill")==0) { - map[m].flag.noskill=1; - } - else if (battle_config.pk_mode && strcmpi(w3,"nopvp")==0) { // nopvp for pk mode [Valaris] - map[m].flag.nopvp=1; - map[m].flag.pvp=0; - } - else if (strcmpi(w3,"noicewall")==0) { // noicewall [Valaris] - map[m].flag.noicewall=1; - } - else if (strcmpi(w3,"snow")==0) { // snow [Valaris] - map[m].flag.snow=1; - } - else if (strcmpi(w3,"fog")==0) { // fog [Valaris] - map[m].flag.fog=1; - } - else if (strcmpi(w3,"sakura")==0) { // sakura [Valaris] - map[m].flag.sakura=1; - } - else if (strcmpi(w3,"leaves")==0) { // leaves [Valaris] - map[m].flag.leaves=1; - } - else if (strcmpi(w3,"rain")==0) { // rain [Valaris] - map[m].flag.rain=1; - } - else if (strcmpi(w3,"no_player_drops")==0) { // rain [Valaris] - map[m].flag.no_player_drops=1; - } - - return 0; + if (strcmpi (w3, "nosave") == 0) + { + if (strcmp (w4, "SavePoint") == 0) + { + memcpy (map[m].save.map, "SavePoint", 16); + map[m].save.x = -1; + map[m].save.y = -1; + } + else if (sscanf (w4, "%[^,],%d,%d", savemap, &savex, &savey) == 3) + { + memcpy (map[m].save.map, savemap, 16); + map[m].save.x = savex; + map[m].save.y = savey; + } + map[m].flag.nosave = 1; + } + else if (strcmpi (w3, "nomemo") == 0) + { + map[m].flag.nomemo = 1; + } + else if (strcmpi (w3, "noteleport") == 0) + { + map[m].flag.noteleport = 1; + } + else if (strcmpi (w3, "nowarp") == 0) + { + map[m].flag.nowarp = 1; + } + else if (strcmpi (w3, "nowarpto") == 0) + { + map[m].flag.nowarpto = 1; + } + else if (strcmpi (w3, "noreturn") == 0) + { + map[m].flag.noreturn = 1; + } + else if (strcmpi (w3, "monster_noteleport") == 0) + { + map[m].flag.monster_noteleport = 1; + } + else if (strcmpi (w3, "nobranch") == 0) + { + map[m].flag.nobranch = 1; + } + else if (strcmpi (w3, "nopenalty") == 0) + { + map[m].flag.nopenalty = 1; + } + else if (strcmpi (w3, "pvp") == 0) + { + map[m].flag.pvp = 1; + } + else if (strcmpi (w3, "pvp_noparty") == 0) + { + map[m].flag.pvp_noparty = 1; + } + else if (strcmpi (w3, "pvp_noguild") == 0) + { + map[m].flag.pvp_noguild = 1; + } + else if (strcmpi (w3, "pvp_nightmaredrop") == 0) + { + if (sscanf (w4, "%[^,],%[^,],%d", drop_arg1, drop_arg2, &drop_per) == + 3) + { + int i; + if (strcmp (drop_arg1, "random") == 0) + drop_id = -1; + else if (itemdb_exists ((drop_id = atoi (drop_arg1))) == NULL) + drop_id = 0; + if (strcmp (drop_arg2, "inventory") == 0) + drop_type = 1; + else if (strcmp (drop_arg2, "equip") == 0) + drop_type = 2; + else if (strcmp (drop_arg2, "all") == 0) + drop_type = 3; + + if (drop_id != 0) + { + for (i = 0; i < MAX_DROP_PER_MAP; i++) + { + if (map[m].drop_list[i].drop_id == 0) + { + map[m].drop_list[i].drop_id = drop_id; + map[m].drop_list[i].drop_type = drop_type; + map[m].drop_list[i].drop_per = drop_per; + break; + } + } + map[m].flag.pvp_nightmaredrop = 1; + } + } + } + else if (strcmpi (w3, "pvp_nocalcrank") == 0) + { + map[m].flag.pvp_nocalcrank = 1; + } + else if (strcmpi (w3, "gvg") == 0) + { + map[m].flag.gvg = 1; + } + else if (strcmpi (w3, "gvg_noparty") == 0) + { + map[m].flag.gvg_noparty = 1; + } + else if (strcmpi (w3, "nozenypenalty") == 0) + { + map[m].flag.nozenypenalty = 1; + } + else if (strcmpi (w3, "notrade") == 0) + { + map[m].flag.notrade = 1; + } + else if (strcmpi (w3, "noskill") == 0) + { + map[m].flag.noskill = 1; + } + else if (battle_config.pk_mode && strcmpi (w3, "nopvp") == 0) + { // nopvp for pk mode [Valaris] + map[m].flag.nopvp = 1; + map[m].flag.pvp = 0; + } + else if (strcmpi (w3, "noicewall") == 0) + { // noicewall [Valaris] + map[m].flag.noicewall = 1; + } + else if (strcmpi (w3, "snow") == 0) + { // snow [Valaris] + map[m].flag.snow = 1; + } + else if (strcmpi (w3, "fog") == 0) + { // fog [Valaris] + map[m].flag.fog = 1; + } + else if (strcmpi (w3, "sakura") == 0) + { // sakura [Valaris] + map[m].flag.sakura = 1; + } + else if (strcmpi (w3, "leaves") == 0) + { // leaves [Valaris] + map[m].flag.leaves = 1; + } + else if (strcmpi (w3, "rain") == 0) + { // rain [Valaris] + map[m].flag.rain = 1; + } + else if (strcmpi (w3, "no_player_drops") == 0) + { // rain [Valaris] + map[m].flag.no_player_drops = 1; + } + + return 0; } -static int ev_db_final(void *key,void *data,va_list ap) +static int ev_db_final (void *key, void *data, va_list ap) { - free(data); - if(strstr(key,"::")!=NULL) - free(key); - return 0; + free (data); + if (strstr (key, "::") != NULL) + free (key); + return 0; } -static int npcname_db_final(void *key,void *data,va_list ap) + +static int npcname_db_final (void *key, void *data, va_list ap) { - return 0; + return 0; } -struct npc_data * -npc_spawn_text(int m, int x, int y, - int class, - char *name, - char *message) +struct npc_data *npc_spawn_text (int m, int x, int y, + int class, char *name, char *message) { - struct npc_data *retval = (struct npc_data *)aCalloc(1, sizeof(struct npc_data)); - retval->bl.id = npc_get_new_npc_id(); + struct npc_data *retval = + (struct npc_data *) aCalloc (1, sizeof (struct npc_data)); + retval->bl.id = npc_get_new_npc_id (); retval->bl.x = x; retval->bl.y = y; retval->bl.m = m; retval->bl.type = BL_NPC; retval->bl.subtype = MESSAGE; - strncpy(retval->name, name, 23); - strncpy(retval->exname, name, 23); + strncpy (retval->name, name, 23); + strncpy (retval->exname, name, 23); retval->name[15] = 0; retval->exname[15] = 0; - retval->u.message = message? strdup(message) : NULL; + retval->u.message = message ? strdup (message) : NULL; retval->class = class; retval->speed = 200; - clif_spawnnpc(retval); - map_addblock(&retval->bl); - map_addiddb(&retval->bl); + clif_spawnnpc (retval); + map_addblock (&retval->bl); + map_addiddb (&retval->bl); if (retval->name && retval->name[0]) - strdb_insert(npcname_db, retval->name, retval); + strdb_insert (npcname_db, retval->name, retval); return retval; } -static void -npc_free_internal(struct npc_data *nd) +static void npc_free_internal (struct npc_data *nd) { struct chat_data *cd; - if(nd->chat_id && (cd=(struct chat_data*)map_id2bl(nd->chat_id))) { - free(cd); + if (nd->chat_id && (cd = (struct chat_data *) map_id2bl (nd->chat_id))) + { + free (cd); cd = NULL; } - if(nd->bl.subtype == SCRIPT) { - if(nd->u.scr.timer_event) - free(nd->u.scr.timer_event); - if(nd->u.scr.src_id==0){ - if(nd->u.scr.script){ - free(nd->u.scr.script); - nd->u.scr.script=NULL; + if (nd->bl.subtype == SCRIPT) + { + if (nd->u.scr.timer_event) + free (nd->u.scr.timer_event); + if (nd->u.scr.src_id == 0) + { + if (nd->u.scr.script) + { + free (nd->u.scr.script); + nd->u.scr.script = NULL; } - if(nd->u.scr.label_list){ - free(nd->u.scr.label_list); + if (nd->u.scr.label_list) + { + free (nd->u.scr.label_list); nd->u.scr.label_list = NULL; } } - } else if (nd->bl.subtype == MESSAGE - && nd->u.message) { - free(nd->u.message); } - free(nd); + else if (nd->bl.subtype == MESSAGE && nd->u.message) + { + free (nd->u.message); + } + free (nd); } -void -npc_propagate_update(struct npc_data *nd) +void npc_propagate_update (struct npc_data *nd) { - map_foreachinarea(npc_enable_sub, - nd->bl.m, - nd->bl.x - nd->u.scr.xs, nd->bl.y - nd->u.scr.ys, - nd->bl.x + nd->u.scr.xs, nd->bl.y + nd->u.scr.ys, - BL_PC, nd); + map_foreachinarea (npc_enable_sub, + nd->bl.m, + nd->bl.x - nd->u.scr.xs, nd->bl.y - nd->u.scr.ys, + nd->bl.x + nd->u.scr.xs, nd->bl.y + nd->u.scr.ys, + BL_PC, nd); } -void -npc_free(struct npc_data *nd) +void npc_free (struct npc_data *nd) { - clif_clearchar(&nd->bl, 0); - npc_propagate_update(nd); - map_deliddb(&nd->bl); - map_delblock(&nd->bl); - npc_free_internal(nd); + clif_clearchar (&nd->bl, 0); + npc_propagate_update (nd); + map_deliddb (&nd->bl); + map_delblock (&nd->bl); + npc_free_internal (nd); } /*========================================== * ソスIソスソス *------------------------------------------ */ -int do_final_npc(void) +int do_final_npc (void) { - int i; - struct block_list *bl; - struct npc_data *nd; - struct mob_data *md; - - if(ev_db) - strdb_final(ev_db,ev_db_final); - if(npcname_db) - strdb_final(npcname_db,npcname_db_final); - - for(i=START_NPC_NUM;i<npc_id;i++){ - if((bl=map_id2bl(i))){ - if(bl->type == BL_NPC && (nd = (struct npc_data *)bl)) - npc_free_internal(nd); - else if(bl->type == BL_MOB && (md = (struct mob_data *)bl)){ - if(md->lootitem){ - free(md->lootitem); - md->lootitem = NULL; - } - free(md); - md = NULL; - } - } - } - - return 0; -} + int i; + struct block_list *bl; + struct npc_data *nd; + struct mob_data *md; + + if (ev_db) + strdb_final (ev_db, ev_db_final); + if (npcname_db) + strdb_final (npcname_db, npcname_db_final); + + for (i = START_NPC_NUM; i < npc_id; i++) + { + if ((bl = map_id2bl (i))) + { + if (bl->type == BL_NPC && (nd = (struct npc_data *) bl)) + npc_free_internal (nd); + else if (bl->type == BL_MOB && (md = (struct mob_data *) bl)) + { + if (md->lootitem) + { + free (md->lootitem); + md->lootitem = NULL; + } + free (md); + md = NULL; + } + } + } + return 0; +} -void ev_release(struct dbn *db, int which) +void ev_release (struct dbn *db, int which) { if (which & 0x1) - free(db->key); + free (db->key); if (which & 0x2) - free(db->data); + free (db->data); } /*========================================== * npcソスソスソスソスソスソス *------------------------------------------ */ -int do_init_npc(void) +int do_init_npc (void) { - struct npc_src_list *nsl; - FILE *fp; - char line[1024]; - int m,lines; - - ev_db=strdb_init(24); - npcname_db=strdb_init(24); - - ev_db->release = ev_release; - - memset(&ev_tm_b,-1,sizeof(ev_tm_b)); - - for(nsl=npc_src_first;nsl;nsl=nsl->next) { - if(nsl->prev){ - free(nsl->prev); - nsl->prev = NULL; - } - fp=fopen_(nsl->name,"r"); - if (fp==NULL) { - printf("file not found : %s\n",nsl->name); - exit(1); - } - lines=0; - while(fgets(line,1020,fp)) { - char w1[1024],w2[1024],w3[1024],w4[1024],mapname[1024]; - int i,j,w4pos,count; - lines++; - - if (line[0] == '/' && line[1] == '/') - continue; - // ソスsソスvソスネスソスyソス[ソスXソスソスソス^ソスuソスフ連ソスソスソスヘ詰ソス゚ゑソス - for(i=j=0;line[i];i++) { - if (line[i]==' ') { - if (!((line[i+1] && (isspace(line[i+1]) || line[i+1]==',')) || - (j && line[j-1]==','))) - line[j++]=' '; - } else if (line[i]=='\t') { - if (!(j && line[j-1]=='\t')) - line[j++]='\t'; - } else - line[j++]=line[i]; - } - // ソスナ擾ソスソスヘタソスuソスソスソスリゑソスソスナチソスFソスbソスNソスソスソストみて、ソス_ソスソスソスネゑソスソスXソスyソス[ソスXソスソスソスリゑソスソスナ確ソスF - if ((count=sscanf(line,"%[^\t]\t%[^\t]\t%[^\t\r\n]\t%n%[^\t\r\n]",w1,w2,w3,&w4pos,w4)) < 3 && - (count=sscanf(line,"%s%s%s%n%s",w1,w2,w3,&w4pos,w4)) < 3) { - continue; - } - // ソス}ソスbソスvソスフ托ソスソスン確ソスF - if( strcmp(w1,"-")!=0 && strcmpi(w1,"function")!=0 ){ - sscanf(w1,"%[^,]",mapname); - m = map_mapname2mapid(mapname); - if (strlen(mapname)>16 || m<0) { - // "mapname" is not assigned to this server - continue; - } - } - if (strcmpi(w2,"warp")==0 && count > 3) { - npc_parse_warp(w1,w2,w3,w4); - } else if (strcmpi(w2,"shop")==0 && count > 3) { - npc_parse_shop(w1,w2,w3,w4); - } else if (strcmpi(w2,"script")==0 && count > 3) { - if( strcmpi(w1,"function")==0 ){ - npc_parse_function(w1,w2,w3,w4,line+w4pos,fp,&lines); - }else{ - npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines); - } - } else if ( (i=0,sscanf(w2,"duplicate%n",&i), (i>0 && w2[i]=='(')) && count > 3) { - npc_parse_script(w1,w2,w3,w4,line+w4pos,fp,&lines); - } else if (strcmpi(w2,"monster")==0 && count > 3) { - npc_parse_mob(w1,w2,w3,w4); - } else if (strcmpi(w2,"mapflag")==0 && count >= 3) { - npc_parse_mapflag(w1,w2,w3,w4); - } - } - fclose_(fp); - printf("\rLoading NPCs [%d]: %-54s",npc_id-START_NPC_NUM,nsl->name); - fflush(stdout); - } - printf("\rNPCs Loaded: %d [Warps:%d Shops:%d Scripts:%d Mobs:%d]\n", - npc_id-START_NPC_NUM,npc_warp,npc_shop,npc_script,npc_mob); + struct npc_src_list *nsl; + FILE *fp; + char line[1024]; + int m, lines; - add_timer_func_list(npc_event_timer,"npc_event_timer"); - add_timer_func_list(npc_event_do_clock,"npc_event_do_clock"); - add_timer_func_list(npc_timerevent,"npc_timerevent"); + ev_db = strdb_init (24); + npcname_db = strdb_init (24); - //exit(1); + ev_db->release = ev_release; - return 0; + memset (&ev_tm_b, -1, sizeof (ev_tm_b)); + + for (nsl = npc_src_first; nsl; nsl = nsl->next) + { + if (nsl->prev) + { + free (nsl->prev); + nsl->prev = NULL; + } + fp = fopen_ (nsl->name, "r"); + if (fp == NULL) + { + printf ("file not found : %s\n", nsl->name); + exit (1); + } + lines = 0; + while (fgets (line, 1020, fp)) + { + char w1[1024], w2[1024], w3[1024], w4[1024], mapname[1024]; + int i, j, w4pos, count; + lines++; + + if (line[0] == '/' && line[1] == '/') + continue; + // ソスsソスvソスネスソスyソス[ソスXソスソスソス^ソスuソスフ連ソスソスソスヘ詰ソス゚ゑソス + for (i = j = 0; line[i]; i++) + { + if (line[i] == ' ') + { + if (! + ((line[i + 1] + && (isspace (line[i + 1]) || line[i + 1] == ',')) + || (j && line[j - 1] == ','))) + line[j++] = ' '; + } + else if (line[i] == '\t') + { + if (!(j && line[j - 1] == '\t')) + line[j++] = '\t'; + } + else + line[j++] = line[i]; + } + // ソスナ擾ソスソスヘタソスuソスソスソスリゑソスソスナチソスFソスbソスNソスソスソストみて、ソス_ソスソスソスネゑソスソスXソスyソス[ソスXソスソスソスリゑソスソスナ確ソスF + if ((count = + sscanf (line, "%[^\t]\t%[^\t]\t%[^\t\r\n]\t%n%[^\t\r\n]", w1, + w2, w3, &w4pos, w4)) < 3 + && (count = + sscanf (line, "%s%s%s%n%s", w1, w2, w3, &w4pos, w4)) < 3) + { + continue; + } + // ソス}ソスbソスvソスフ托ソスソスン確ソスF + if (strcmp (w1, "-") != 0 && strcmpi (w1, "function") != 0) + { + sscanf (w1, "%[^,]", mapname); + m = map_mapname2mapid (mapname); + if (strlen (mapname) > 16 || m < 0) + { + // "mapname" is not assigned to this server + continue; + } + } + if (strcmpi (w2, "warp") == 0 && count > 3) + { + npc_parse_warp (w1, w2, w3, w4); + } + else if (strcmpi (w2, "shop") == 0 && count > 3) + { + npc_parse_shop (w1, w2, w3, w4); + } + else if (strcmpi (w2, "script") == 0 && count > 3) + { + if (strcmpi (w1, "function") == 0) + { + npc_parse_function (w1, w2, w3, w4, line + w4pos, fp, + &lines); + } + else + { + npc_parse_script (w1, w2, w3, w4, line + w4pos, fp, + &lines); + } + } + else if ((i = + 0, sscanf (w2, "duplicate%n", &i), (i > 0 + && w2[i] == '(')) + && count > 3) + { + npc_parse_script (w1, w2, w3, w4, line + w4pos, fp, &lines); + } + else if (strcmpi (w2, "monster") == 0 && count > 3) + { + npc_parse_mob (w1, w2, w3, w4); + } + else if (strcmpi (w2, "mapflag") == 0 && count >= 3) + { + npc_parse_mapflag (w1, w2, w3, w4); + } + } + fclose_ (fp); + printf ("\rLoading NPCs [%d]: %-54s", npc_id - START_NPC_NUM, + nsl->name); + fflush (stdout); + } + printf ("\rNPCs Loaded: %d [Warps:%d Shops:%d Scripts:%d Mobs:%d]\n", + npc_id - START_NPC_NUM, npc_warp, npc_shop, npc_script, npc_mob); + + add_timer_func_list (npc_event_timer, "npc_event_timer"); + add_timer_func_list (npc_event_do_clock, "npc_event_do_clock"); + add_timer_func_list (npc_timerevent, "npc_timerevent"); + + //exit(1); + + return 0; } diff --git a/src/map/npc.h b/src/map/npc.h index 03ad138..4c08c02 100644 --- a/src/map/npc.h +++ b/src/map/npc.h @@ -8,59 +8,57 @@ #define WARP_DEBUG_CLASS 722 #define INVISIBLE_CLASS 32767 -int npc_event_dequeue(struct map_session_data *sd); -int npc_event_timer(int tid,unsigned int tick,int id,int data); -int npc_event(struct map_session_data *sd,const char *npcname,int); -int npc_timer_event(const char *eventname); // Added by RoVeRT -int npc_command(struct map_session_data *sd,char *npcname,char *command); -int npc_touch_areanpc(struct map_session_data *,int,int,int); -int npc_click(struct map_session_data *,int); -int npc_scriptcont(struct map_session_data *,int); -int npc_checknear(struct map_session_data *,int); -int npc_buysellsel(struct map_session_data *,int,int); -int npc_buylist(struct map_session_data *,int,unsigned short *); -int npc_selllist(struct map_session_data *,int,unsigned short *); -int npc_parse_mob(char *w1,char *w2,char *w3,char *w4); -int npc_parse_warp(char *w1,char *w2,char *w3,char *w4); +int npc_event_dequeue (struct map_session_data *sd); +int npc_event_timer (int tid, unsigned int tick, int id, int data); +int npc_event (struct map_session_data *sd, const char *npcname, int); +int npc_timer_event (const char *eventname); // Added by RoVeRT +int npc_command (struct map_session_data *sd, char *npcname, char *command); +int npc_touch_areanpc (struct map_session_data *, int, int, int); +int npc_click (struct map_session_data *, int); +int npc_scriptcont (struct map_session_data *, int); +int npc_checknear (struct map_session_data *, int); +int npc_buysellsel (struct map_session_data *, int, int); +int npc_buylist (struct map_session_data *, int, unsigned short *); +int npc_selllist (struct map_session_data *, int, unsigned short *); +int npc_parse_mob (char *w1, char *w2, char *w3, char *w4); +int npc_parse_warp (char *w1, char *w2, char *w3, char *w4); -int npc_enable(const char *name,int flag); -struct npc_data* npc_name2id(const char *name); +int npc_enable (const char *name, int flag); +struct npc_data *npc_name2id (const char *name); -int npc_get_new_npc_id(void); +int npc_get_new_npc_id (void); /** * Spawns and installs a talk-only NPC * * \param message The message to speak. If message is NULL, the NPC will not do anything at all. */ -struct npc_data *npc_spawn_text(int m, int x, int y, - int class, - char *name, - char *message); // message is strdup'd within +struct npc_data *npc_spawn_text (int m, int x, int y, int class, char *name, char *message); // message is strdup'd within /** * Uninstalls and frees an NPC */ -void npc_free(struct npc_data *npc); +void npc_free (struct npc_data *npc); -void npc_addsrcfile(char *); -void npc_delsrcfile(char *); -int do_final_npc(void); -int do_init_npc(void); -int npc_event_do_oninit(void); -int npc_do_ontimer(int,struct map_session_data *,int); +void npc_addsrcfile (char *); +void npc_delsrcfile (char *); +int do_final_npc (void); +int do_init_npc (void); +int npc_event_do_oninit (void); +int npc_do_ontimer (int, struct map_session_data *, int); struct argrec; -int npc_event_doall_l(const char *name, int rid, int argc, struct argrec *argv); -int npc_event_do_l(const char *name, int rid, int argc, struct argrec *argv); +int npc_event_doall_l (const char *name, int rid, int argc, + struct argrec *argv); +int npc_event_do_l (const char *name, int rid, int argc, + struct argrec *argv); #define npc_event_doall(name) npc_event_doall_l(name, 0, 0, NULL) #define npc_event_do(name) npc_event_do_l(name, 0, 0, NULL) -int npc_timerevent_start(struct npc_data *nd); -int npc_timerevent_stop(struct npc_data *nd); -int npc_gettimerevent_tick(struct npc_data *nd); -int npc_settimerevent_tick(struct npc_data *nd,int newtimer); -int npc_delete(struct npc_data *nd); +int npc_timerevent_start (struct npc_data *nd); +int npc_timerevent_stop (struct npc_data *nd); +int npc_gettimerevent_tick (struct npc_data *nd); +int npc_settimerevent_tick (struct npc_data *nd, int newtimer); +int npc_delete (struct npc_data *nd); #endif - diff --git a/src/map/party.c b/src/map/party.c index 62b30d8..8ddfca2 100644 --- a/src/map/party.c +++ b/src/map/party.c @@ -20,643 +20,732 @@ #include "memwatch.h" #endif -#define PARTY_SEND_XYHP_INVERVAL 1000 // 座標やHP送信の間隔 +#define PARTY_SEND_XYHP_INVERVAL 1000 // 座標やHP送信の間隔 -static struct dbt* party_db; +static struct dbt *party_db; -int party_send_xyhp_timer(int tid,unsigned int tick,int id,int data); +int party_send_xyhp_timer (int tid, unsigned int tick, int id, int data); /*========================================== * 終了 *------------------------------------------ */ -static int party_db_final(void *key,void *data,va_list ap) +static int party_db_final (void *key, void *data, va_list ap) { - free(data); - return 0; + free (data); + return 0; } -void do_final_party(void) + +void do_final_party (void) { - if(party_db) - numdb_final(party_db,party_db_final); + if (party_db) + numdb_final (party_db, party_db_final); } + // 初期化 -void do_init_party(void) +void do_init_party (void) { - party_db=numdb_init(); - add_timer_func_list(party_send_xyhp_timer,"party_send_xyhp_timer"); - add_timer_interval(gettick()+PARTY_SEND_XYHP_INVERVAL,party_send_xyhp_timer,0,0,PARTY_SEND_XYHP_INVERVAL); + party_db = numdb_init (); + add_timer_func_list (party_send_xyhp_timer, "party_send_xyhp_timer"); + add_timer_interval (gettick () + PARTY_SEND_XYHP_INVERVAL, + party_send_xyhp_timer, 0, 0, + PARTY_SEND_XYHP_INVERVAL); } // 検索 -struct party *party_search(int party_id) +struct party *party_search (int party_id) { - return numdb_search(party_db,party_id); + return numdb_search (party_db, party_id); } -int party_searchname_sub(void *key,void *data,va_list ap) + +int party_searchname_sub (void *key, void *data, va_list ap) { - struct party *p=(struct party *)data,**dst; - char *str; - str=va_arg(ap,char *); - dst=va_arg(ap,struct party **); - if(strcmpi(p->name,str)==0) - *dst=p; - return 0; + struct party *p = (struct party *) data, **dst; + char *str; + str = va_arg (ap, char *); + dst = va_arg (ap, struct party **); + if (strcmpi (p->name, str) == 0) + *dst = p; + return 0; } + // パーティ名検索 -struct party* party_searchname(char *str) +struct party *party_searchname (char *str) { - struct party *p=NULL; - numdb_foreach(party_db,party_searchname_sub,str,&p); - return p; + struct party *p = NULL; + numdb_foreach (party_db, party_searchname_sub, str, &p); + return p; } + // 作成要求 -int party_create(struct map_session_data *sd,char *name) +int party_create (struct map_session_data *sd, char *name) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->status.party_id==0) - intif_create_party(sd,name); - else - clif_party_created(sd,2); - return 0; + if (sd->status.party_id == 0) + intif_create_party (sd, name); + else + clif_party_created (sd, 2); + return 0; } // 作成可否 -int party_created(int account_id,int fail,int party_id,char *name) -{ - struct map_session_data *sd; - sd=map_id2sd(account_id); - - nullpo_retr(0, sd); - - if(fail==0){ - struct party *p; - sd->status.party_id=party_id; - if((p=numdb_search(party_db,party_id))!=NULL){ - printf("party: id already exists!\n"); - exit(1); - } - p=(struct party *)aCalloc(1,sizeof(struct party)); - p->party_id=party_id; - memcpy(p->name,name,24); - numdb_insert(party_db,party_id,p); - clif_party_created(sd,0); - }else{ - clif_party_created(sd,1); - } - return 0; +int party_created (int account_id, int fail, int party_id, char *name) +{ + struct map_session_data *sd; + sd = map_id2sd (account_id); + + nullpo_retr (0, sd); + + if (fail == 0) + { + struct party *p; + sd->status.party_id = party_id; + if ((p = numdb_search (party_db, party_id)) != NULL) + { + printf ("party: id already exists!\n"); + exit (1); + } + p = (struct party *) aCalloc (1, sizeof (struct party)); + p->party_id = party_id; + memcpy (p->name, name, 24); + numdb_insert (party_db, party_id, p); + clif_party_created (sd, 0); + } + else + { + clif_party_created (sd, 1); + } + return 0; } // 情報要求 -int party_request_info(int party_id) +int party_request_info (int party_id) { - return intif_request_partyinfo(party_id); + return intif_request_partyinfo (party_id); } // 所属キャラの確認 -int party_check_member(struct party *p) -{ - int i; - struct map_session_data *sd; - - nullpo_retr(0, p); - - for(i=0;i<fd_max;i++){ - if(session[i] && (sd=session[i]->session_data) && sd->state.auth){ - if(sd->status.party_id==p->party_id){ - int j,f=1; - for(j=0;j<MAX_PARTY;j++){ // パーティにデータがあるか確認 - if( p->member[j].account_id==sd->status.account_id){ - if( strcmp(p->member[j].name,sd->status.name)==0 ) - f=0; // データがある - else - p->member[j].sd=NULL; // 同垢別キャラだった - } - } - if(f){ - sd->status.party_id=0; - if(battle_config.error_log) - printf("party: check_member %d[%s] is not member\n",sd->status.account_id,sd->status.name); - } - } - } - } - return 0; +int party_check_member (struct party *p) +{ + int i; + struct map_session_data *sd; + + nullpo_retr (0, p); + + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data) && sd->state.auth) + { + if (sd->status.party_id == p->party_id) + { + int j, f = 1; + for (j = 0; j < MAX_PARTY; j++) + { // パーティにデータがあるか確認 + if (p->member[j].account_id == sd->status.account_id) + { + if (strcmp (p->member[j].name, sd->status.name) == 0) + f = 0; // データがある + else + p->member[j].sd = NULL; // 同垢別キャラだった + } + } + if (f) + { + sd->status.party_id = 0; + if (battle_config.error_log) + printf ("party: check_member %d[%s] is not member\n", + sd->status.account_id, sd->status.name); + } + } + } + } + return 0; } // 情報所得失敗(そのIDのキャラを全部未所属にする) -int party_recv_noinfo(int party_id) -{ - int i; - struct map_session_data *sd; - for(i=0;i<fd_max;i++){ - if(session[i] && (sd=session[i]->session_data) && sd->state.auth){ - if(sd->status.party_id==party_id) - sd->status.party_id=0; - } - } - return 0; +int party_recv_noinfo (int party_id) +{ + int i; + struct map_session_data *sd; + for (i = 0; i < fd_max; i++) + { + if (session[i] && (sd = session[i]->session_data) && sd->state.auth) + { + if (sd->status.party_id == party_id) + sd->status.party_id = 0; + } + } + return 0; } + // 情報所得 -int party_recv_info(struct party *sp) -{ - struct party *p; - int i; - - nullpo_retr(0, sp); - - if((p=numdb_search(party_db,sp->party_id))==NULL){ - p=(struct party *)aCalloc(1,sizeof(struct party)); - numdb_insert(party_db,sp->party_id,p); - - // 最初のロードなのでユーザーのチェックを行う - party_check_member(sp); - } - memcpy(p,sp,sizeof(struct party)); - - for(i=0;i<MAX_PARTY;i++){ // sdの設定 - struct map_session_data *sd = map_id2sd(p->member[i].account_id); - p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id)?sd:NULL; - } - - clif_party_info(p,-1); - - for(i=0;i<MAX_PARTY;i++){ // 設定情報の送信 -// struct map_session_data *sd = map_id2sd(p->member[i].account_id); - struct map_session_data *sd = p->member[i].sd; - if(sd!=NULL && sd->party_sended==0){ - clif_party_option(p,sd,0x100); - sd->party_sended=1; - } - } - - return 0; +int party_recv_info (struct party *sp) +{ + struct party *p; + int i; + + nullpo_retr (0, sp); + + if ((p = numdb_search (party_db, sp->party_id)) == NULL) + { + p = (struct party *) aCalloc (1, sizeof (struct party)); + numdb_insert (party_db, sp->party_id, p); + + // 最初のロードなのでユーザーのチェックを行う + party_check_member (sp); + } + memcpy (p, sp, sizeof (struct party)); + + for (i = 0; i < MAX_PARTY; i++) + { // sdの設定 + struct map_session_data *sd = map_id2sd (p->member[i].account_id); + p->member[i].sd = (sd != NULL + && sd->status.party_id == p->party_id) ? sd : NULL; + } + + clif_party_info (p, -1); + + for (i = 0; i < MAX_PARTY; i++) + { // 設定情報の送信 +// struct map_session_data *sd = map_id2sd(p->member[i].account_id); + struct map_session_data *sd = p->member[i].sd; + if (sd != NULL && sd->party_sended == 0) + { + clif_party_option (p, sd, 0x100); + sd->party_sended = 1; + } + } + + return 0; } // パーティへの勧誘 -int party_invite(struct map_session_data *sd,int account_id) -{ - struct map_session_data *tsd= map_id2sd(account_id); - struct party *p=party_search(sd->status.party_id); - int i; - - nullpo_retr(0, sd); - - if(tsd==NULL || p==NULL) - return 0; - - printf("\tA\n"); - - if(!battle_config.invite_request_check) { - if (tsd->guild_invite>0 || tsd->trade_partner || tsd->npc_id || tsd->npc_shopid || pc_checkskill(tsd,NV_PARTY) < 1) { - clif_party_inviteack(sd,tsd->status.name,0); - return 0; - } - } - printf("\tB\n"); - if( tsd->status.party_id>0 || tsd->party_invite>0 ){ // 相手の所属確認 - clif_party_inviteack(sd,tsd->status.name,0); - return 0; - } - printf("\tC\n"); - for(i=0;i<MAX_PARTY;i++){ // 同アカウント確認 - if(p->member[i].account_id==account_id){ - clif_party_inviteack(sd,tsd->status.name,0); - return 0; - } - } - printf("\tD\n"); - tsd->party_invite=sd->status.party_id; - tsd->party_invite_account=sd->status.account_id; - - clif_party_invite(sd,tsd); - return 0; +int party_invite (struct map_session_data *sd, int account_id) +{ + struct map_session_data *tsd = map_id2sd (account_id); + struct party *p = party_search (sd->status.party_id); + int i; + + nullpo_retr (0, sd); + + if (tsd == NULL || p == NULL) + return 0; + + printf ("\tA\n"); + + if (!battle_config.invite_request_check) + { + if (tsd->guild_invite > 0 || tsd->trade_partner || tsd->npc_id + || tsd->npc_shopid || pc_checkskill (tsd, NV_PARTY) < 1) + { + clif_party_inviteack (sd, tsd->status.name, 0); + return 0; + } + } + printf ("\tB\n"); + if (tsd->status.party_id > 0 || tsd->party_invite > 0) + { // 相手の所属確認 + clif_party_inviteack (sd, tsd->status.name, 0); + return 0; + } + printf ("\tC\n"); + for (i = 0; i < MAX_PARTY; i++) + { // 同アカウント確認 + if (p->member[i].account_id == account_id) + { + clif_party_inviteack (sd, tsd->status.name, 0); + return 0; + } + } + printf ("\tD\n"); + tsd->party_invite = sd->status.party_id; + tsd->party_invite_account = sd->status.account_id; + + clif_party_invite (sd, tsd); + return 0; } + // パーティ勧誘への返答 -int party_reply_invite(struct map_session_data *sd,int account_id,int flag) -{ - struct map_session_data *tsd= map_id2sd(account_id); - - nullpo_retr(0, sd); - - if(flag==1){ // 承諾 - //inter鯖へ追加要求 - intif_party_addmember( sd->party_invite, sd->status.account_id ); - return 0; - } - else { // 拒否 - sd->party_invite=0; - sd->party_invite_account=0; - if(tsd==NULL) - return 0; - clif_party_inviteack(tsd,sd->status.name,1); - } - return 0; -} -// パーティが追加された -int party_member_added(int party_id,int account_id,int flag) +int party_reply_invite (struct map_session_data *sd, int account_id, int flag) { - struct map_session_data *sd= map_id2sd(account_id),*sd2; - struct party *p=party_search(party_id); + struct map_session_data *tsd = map_id2sd (account_id); - if(sd == NULL){ - if (flag == 0) { - if(battle_config.error_log) - printf("party: member added error %d is not online\n",account_id); - intif_party_leave(party_id,account_id); // キャラ側に登録できなかったため脱退要求を出す - } - return 0; - } - sd2=map_id2sd(sd->party_invite_account); - sd->party_invite=0; - sd->party_invite_account=0; + nullpo_retr (0, sd); - if (p==NULL) { - printf("party_member_added: party %d not found.\n",party_id); - intif_party_leave(party_id,account_id); - return 0; - } + if (flag == 1) + { // 承諾 + //inter鯖へ追加要求 + intif_party_addmember (sd->party_invite, sd->status.account_id); + return 0; + } + else + { // 拒否 + sd->party_invite = 0; + sd->party_invite_account = 0; + if (tsd == NULL) + return 0; + clif_party_inviteack (tsd, sd->status.name, 1); + } + return 0; +} - if(flag==1){ // 失敗 - if( sd2!=NULL ) - clif_party_inviteack(sd2,sd->status.name,0); - return 0; - } +// パーティが追加された +int party_member_added (int party_id, int account_id, int flag) +{ + struct map_session_data *sd = map_id2sd (account_id), *sd2; + struct party *p = party_search (party_id); + + if (sd == NULL) + { + if (flag == 0) + { + if (battle_config.error_log) + printf ("party: member added error %d is not online\n", + account_id); + intif_party_leave (party_id, account_id); // キャラ側に登録できなかったため脱退要求を出す + } + return 0; + } + sd2 = map_id2sd (sd->party_invite_account); + sd->party_invite = 0; + sd->party_invite_account = 0; + + if (p == NULL) + { + printf ("party_member_added: party %d not found.\n", party_id); + intif_party_leave (party_id, account_id); + return 0; + } + + if (flag == 1) + { // 失敗 + if (sd2 != NULL) + clif_party_inviteack (sd2, sd->status.name, 0); + return 0; + } + + // 成功 + sd->party_sended = 0; + sd->status.party_id = party_id; + + if (sd2 != NULL) + clif_party_inviteack (sd2, sd->status.name, 2); + + // いちおう競合確認 + party_check_conflict (sd); + + party_send_xy_clear (p); + + return 0; +} - // 成功 - sd->party_sended=0; - sd->status.party_id=party_id; +// パーティ除名要求 +int party_removemember (struct map_session_data *sd, int account_id, + char *name) +{ + struct party *p; + int i; - if( sd2!=NULL) - clif_party_inviteack(sd2,sd->status.name,2); + nullpo_retr (0, sd); - // いちおう競合確認 - party_check_conflict(sd); + if ((p = party_search (sd->status.party_id)) == NULL) + return 0; - party_send_xy_clear(p); + for (i = 0; i < MAX_PARTY; i++) + { // リーダーかどうかチェック + if (p->member[i].account_id == sd->status.account_id) + if (p->member[i].leader == 0) + return 0; + } - return 0; + for (i = 0; i < MAX_PARTY; i++) + { // 所属しているか調べる + if (p->member[i].account_id == account_id) + { + intif_party_leave (p->party_id, account_id); + return 0; + } + } + return 0; } -// パーティ除名要求 -int party_removemember(struct map_session_data *sd,int account_id,char *name) + +// パーティ脱退要求 +int party_leave (struct map_session_data *sd) { - struct party *p; - int i; + struct party *p; + int i; - nullpo_retr(0, sd); - - if( (p = party_search(sd->status.party_id)) == NULL ) - return 0; + nullpo_retr (0, sd); - for(i=0;i<MAX_PARTY;i++){ // リーダーかどうかチェック - if(p->member[i].account_id==sd->status.account_id) - if(p->member[i].leader==0) - return 0; - } + if ((p = party_search (sd->status.party_id)) == NULL) + return 0; - for(i=0;i<MAX_PARTY;i++){ // 所属しているか調べる - if(p->member[i].account_id==account_id){ - intif_party_leave(p->party_id,account_id); - return 0; - } - } - return 0; + for (i = 0; i < MAX_PARTY; i++) + { // 所属しているか + if (p->member[i].account_id == sd->status.account_id) + { + intif_party_leave (p->party_id, sd->status.account_id); + return 0; + } + } + return 0; } -// パーティ脱退要求 -int party_leave(struct map_session_data *sd) -{ - struct party *p; - int i; - - nullpo_retr(0, sd); - - if( (p = party_search(sd->status.party_id)) == NULL ) - return 0; - - for(i=0;i<MAX_PARTY;i++){ // 所属しているか - if(p->member[i].account_id==sd->status.account_id){ - intif_party_leave(p->party_id,sd->status.account_id); - return 0; - } - } - return 0; -} // パーティメンバが脱退した -int party_member_leaved(int party_id,int account_id,char *name) -{ - struct map_session_data *sd=map_id2sd(account_id); - struct party *p=party_search(party_id); - if(p!=NULL){ - int i; - for(i=0;i<MAX_PARTY;i++) - if(p->member[i].account_id==account_id){ - clif_party_leaved(p,sd,account_id,name,0x00); - p->member[i].account_id=0; - p->member[i].sd=NULL; - } - } - if(sd!=NULL && sd->status.party_id==party_id){ - sd->status.party_id=0; - sd->party_sended=0; - } - return 0; +int party_member_leaved (int party_id, int account_id, char *name) +{ + struct map_session_data *sd = map_id2sd (account_id); + struct party *p = party_search (party_id); + if (p != NULL) + { + int i; + for (i = 0; i < MAX_PARTY; i++) + if (p->member[i].account_id == account_id) + { + clif_party_leaved (p, sd, account_id, name, 0x00); + p->member[i].account_id = 0; + p->member[i].sd = NULL; + } + } + if (sd != NULL && sd->status.party_id == party_id) + { + sd->status.party_id = 0; + sd->party_sended = 0; + } + return 0; } + // パーティ解散通知 -int party_broken(int party_id) -{ - struct party *p; - int i; - if( (p=party_search(party_id))==NULL ) - return 0; - - for(i=0;i<MAX_PARTY;i++){ - if(p->member[i].sd!=NULL){ - clif_party_leaved(p,p->member[i].sd, - p->member[i].account_id,p->member[i].name,0x10); - p->member[i].sd->status.party_id=0; - p->member[i].sd->party_sended=0; - } - } - numdb_erase(party_db,party_id); - return 0; +int party_broken (int party_id) +{ + struct party *p; + int i; + if ((p = party_search (party_id)) == NULL) + return 0; + + for (i = 0; i < MAX_PARTY; i++) + { + if (p->member[i].sd != NULL) + { + clif_party_leaved (p, p->member[i].sd, + p->member[i].account_id, p->member[i].name, + 0x10); + p->member[i].sd->status.party_id = 0; + p->member[i].sd->party_sended = 0; + } + } + numdb_erase (party_db, party_id); + return 0; } + // パーティの設定変更要求 -int party_changeoption(struct map_session_data *sd,int exp,int item) +int party_changeoption (struct map_session_data *sd, int exp, int item) { - struct party *p; + struct party *p; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if( sd->status.party_id==0 || (p=party_search(sd->status.party_id))==NULL ) - return 0; - intif_party_changeoption(sd->status.party_id,sd->status.account_id,exp,item); - return 0; + if (sd->status.party_id == 0 + || (p = party_search (sd->status.party_id)) == NULL) + return 0; + intif_party_changeoption (sd->status.party_id, sd->status.account_id, exp, + item); + return 0; } + // パーティの設定変更通知 -int party_optionchanged(int party_id,int account_id,int exp,int item,int flag) +int party_optionchanged (int party_id, int account_id, int exp, int item, + int flag) { - struct party *p; - struct map_session_data *sd=map_id2sd(account_id); - if( (p=party_search(party_id))==NULL) - return 0; + struct party *p; + struct map_session_data *sd = map_id2sd (account_id); + if ((p = party_search (party_id)) == NULL) + return 0; - if(!(flag&0x01)) p->exp=exp; - if(!(flag&0x10)) p->item=item; - clif_party_option(p,sd,flag); - return 0; + if (!(flag & 0x01)) + p->exp = exp; + if (!(flag & 0x10)) + p->item = item; + clif_party_option (p, sd, flag); + return 0; } // パーティメンバの移動通知 -int party_recv_movemap(int party_id,int account_id,char *map,int online,int lv) -{ - struct party *p; - int i; - if( (p=party_search(party_id))==NULL) - return 0; - for(i=0;i<MAX_PARTY;i++){ - struct party_member *m=&p->member[i]; - if( m == NULL ){ - printf("party_recv_movemap nullpo?\n"); - return 0; - } - if(m->account_id==account_id){ - memcpy(m->map,map,16); - m->online=online; - m->lv=lv; - break; - } - } - if(i==MAX_PARTY){ - if(battle_config.error_log) - printf("party: not found member %d on %d[%s]",account_id,party_id,p->name); - return 0; - } - - for(i=0;i<MAX_PARTY;i++){ // sd再設定 - struct map_session_data *sd= map_id2sd(p->member[i].account_id); - p->member[i].sd=(sd!=NULL && sd->status.party_id==p->party_id)?sd:NULL; - } - - party_send_xy_clear(p); // 座標再通知要請 - - clif_party_info(p,-1); - return 0; +int party_recv_movemap (int party_id, int account_id, char *map, int online, + int lv) +{ + struct party *p; + int i; + if ((p = party_search (party_id)) == NULL) + return 0; + for (i = 0; i < MAX_PARTY; i++) + { + struct party_member *m = &p->member[i]; + if (m == NULL) + { + printf ("party_recv_movemap nullpo?\n"); + return 0; + } + if (m->account_id == account_id) + { + memcpy (m->map, map, 16); + m->online = online; + m->lv = lv; + break; + } + } + if (i == MAX_PARTY) + { + if (battle_config.error_log) + printf ("party: not found member %d on %d[%s]", account_id, + party_id, p->name); + return 0; + } + + for (i = 0; i < MAX_PARTY; i++) + { // sd再設定 + struct map_session_data *sd = map_id2sd (p->member[i].account_id); + p->member[i].sd = (sd != NULL + && sd->status.party_id == p->party_id) ? sd : NULL; + } + + party_send_xy_clear (p); // 座標再通知要請 + + clif_party_info (p, -1); + return 0; } // パーティメンバの移動 -int party_send_movemap(struct map_session_data *sd) -{ - struct party *p; - - nullpo_retr(0, sd); - - if( sd->status.party_id==0 ) - return 0; - intif_party_changemap(sd,1); - - if( sd->party_sended!=0 ) // もうパーティデータは送信済み - return 0; - - // 競合確認 - party_check_conflict(sd); - - // あるならパーティ情報送信 - if( (p=party_search(sd->status.party_id))!=NULL ){ - party_check_member(p); // 所属を確認する - if(sd->status.party_id==p->party_id){ - clif_party_info(p,sd->fd); - clif_party_option(p,sd,0x100); - sd->party_sended=1; - } - } - - return 0; +int party_send_movemap (struct map_session_data *sd) +{ + struct party *p; + + nullpo_retr (0, sd); + + if (sd->status.party_id == 0) + return 0; + intif_party_changemap (sd, 1); + + if (sd->party_sended != 0) // もうパーティデータは送信済み + return 0; + + // 競合確認 + party_check_conflict (sd); + + // あるならパーティ情報送信 + if ((p = party_search (sd->status.party_id)) != NULL) + { + party_check_member (p); // 所属を確認する + if (sd->status.party_id == p->party_id) + { + clif_party_info (p, sd->fd); + clif_party_option (p, sd, 0x100); + sd->party_sended = 1; + } + } + + return 0; } + // パーティメンバのログアウト -int party_send_logout(struct map_session_data *sd) +int party_send_logout (struct map_session_data *sd) { - struct party *p; + struct party *p; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if( sd->status.party_id>0 ) - intif_party_changemap(sd,0); - - // sdが無効になるのでパーティ情報から削除 - if( (p=party_search(sd->status.party_id))!=NULL ){ - int i; - for(i=0;i<MAX_PARTY;i++) - if(p->member[i].sd==sd) - p->member[i].sd=NULL; - } - - return 0; + if (sd->status.party_id > 0) + intif_party_changemap (sd, 0); + + // sdが無効になるのでパーティ情報から削除 + if ((p = party_search (sd->status.party_id)) != NULL) + { + int i; + for (i = 0; i < MAX_PARTY; i++) + if (p->member[i].sd == sd) + p->member[i].sd = NULL; + } + + return 0; } + // パーティメッセージ送信 -int party_send_message(struct map_session_data *sd,char *mes,int len) +int party_send_message (struct map_session_data *sd, char *mes, int len) { - if(sd->status.party_id==0) - return 0; - intif_party_message(sd->status.party_id,sd->status.account_id,mes,len); - return 0; + if (sd->status.party_id == 0) + return 0; + intif_party_message (sd->status.party_id, sd->status.account_id, mes, + len); + return 0; } // パーティメッセージ受信 -int party_recv_message(int party_id,int account_id,char *mes,int len) +int party_recv_message (int party_id, int account_id, char *mes, int len) { - struct party *p; - if( (p=party_search(party_id))==NULL) - return 0; - clif_party_message(p,account_id,mes,len); - return 0; + struct party *p; + if ((p = party_search (party_id)) == NULL) + return 0; + clif_party_message (p, account_id, mes, len); + return 0; } + // パーティ競合確認 -int party_check_conflict(struct map_session_data *sd) +int party_check_conflict (struct map_session_data *sd) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - intif_party_checkconflict(sd->status.party_id,sd->status.account_id,sd->status.name); - return 0; + intif_party_checkconflict (sd->status.party_id, sd->status.account_id, + sd->status.name); + return 0; } - // 位置やHP通知用 -int party_send_xyhp_timer_sub(void *key,void *data,va_list ap) -{ - struct party *p=(struct party *)data; - int i; - - nullpo_retr(0, p); - - for(i=0;i<MAX_PARTY;i++){ - struct map_session_data *sd; - if((sd=p->member[i].sd)!=NULL){ - // 座標通知 - if(sd->party_x!=sd->bl.x || sd->party_y!=sd->bl.y){ - clif_party_xy(p,sd); - sd->party_x=sd->bl.x; - sd->party_y=sd->bl.y; - } - // HP通知 - if(sd->party_hp!=sd->status.hp){ - clif_party_hp(p,sd); - sd->party_hp=sd->status.hp; - } - - } - } - return 0; +int party_send_xyhp_timer_sub (void *key, void *data, va_list ap) +{ + struct party *p = (struct party *) data; + int i; + + nullpo_retr (0, p); + + for (i = 0; i < MAX_PARTY; i++) + { + struct map_session_data *sd; + if ((sd = p->member[i].sd) != NULL) + { + // 座標通知 + if (sd->party_x != sd->bl.x || sd->party_y != sd->bl.y) + { + clif_party_xy (p, sd); + sd->party_x = sd->bl.x; + sd->party_y = sd->bl.y; + } + // HP通知 + if (sd->party_hp != sd->status.hp) + { + clif_party_hp (p, sd); + sd->party_hp = sd->status.hp; + } + + } + } + return 0; } + // 位置やHP通知 -int party_send_xyhp_timer(int tid,unsigned int tick,int id,int data) +int party_send_xyhp_timer (int tid, unsigned int tick, int id, int data) { - numdb_foreach(party_db,party_send_xyhp_timer_sub,tick); - return 0; + numdb_foreach (party_db, party_send_xyhp_timer_sub, tick); + return 0; } // 位置通知クリア -int party_send_xy_clear(struct party *p) +int party_send_xy_clear (struct party *p) { - int i; + int i; - nullpo_retr(0, p); + nullpo_retr (0, p); - for(i=0;i<MAX_PARTY;i++){ - struct map_session_data *sd; - if((sd=p->member[i].sd)!=NULL){ - sd->party_x=-1; - sd->party_y=-1; - sd->party_hp=-1; - } - } - return 0; + for (i = 0; i < MAX_PARTY; i++) + { + struct map_session_data *sd; + if ((sd = p->member[i].sd) != NULL) + { + sd->party_x = -1; + sd->party_y = -1; + sd->party_hp = -1; + } + } + return 0; } + // HP通知の必要性検査用(map_foreachinmoveareaから呼ばれる) -int party_send_hp_check(struct block_list *bl,va_list ap) +int party_send_hp_check (struct block_list *bl, va_list ap) { - int party_id; - int *flag; - struct map_session_data *sd; + int party_id; + int *flag; + struct map_session_data *sd; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, sd = (struct map_session_data *) bl); - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, sd=(struct map_session_data *)bl); + party_id = va_arg (ap, int); + flag = va_arg (ap, int *); - party_id=va_arg(ap,int); - flag=va_arg(ap,int *); - - if(sd->status.party_id==party_id){ - *flag=1; - sd->party_hp=-1; - } - return 0; + if (sd->status.party_id == party_id) + { + *flag = 1; + sd->party_hp = -1; + } + return 0; } // 経験値公平分配 -int party_exp_share(struct party *p,int map,int base_exp,int job_exp) +int party_exp_share (struct party *p, int map, int base_exp, int job_exp) { - struct map_session_data *sd; - int i,c; + struct map_session_data *sd; + int i, c; + + nullpo_retr (0, p); - nullpo_retr(0, p); - - for(i=c=0;i<MAX_PARTY;i++) - if((sd=p->member[i].sd)!=NULL && sd->bl.m==map) - c++; - if(c==0) - return 0; - for(i=0;i<MAX_PARTY;i++) - if((sd=p->member[i].sd)!=NULL && sd->bl.m==map) - pc_gainexp(sd,base_exp/c+1,job_exp/c+1); - return 0; + for (i = c = 0; i < MAX_PARTY; i++) + if ((sd = p->member[i].sd) != NULL && sd->bl.m == map) + c++; + if (c == 0) + return 0; + for (i = 0; i < MAX_PARTY; i++) + if ((sd = p->member[i].sd) != NULL && sd->bl.m == map) + pc_gainexp (sd, base_exp / c + 1, job_exp / c + 1); + return 0; } // 同じマップのパーティメンバー全体に処理をかける // type==0 同じマップ // !=0 画面内 -void party_foreachsamemap(int (*func)(struct block_list*,va_list), - struct map_session_data *sd,int type,...) -{ - struct party *p; - va_list ap; - int i; - int x0,y0,x1,y1; - struct block_list *list[MAX_PARTY]; - int blockcount=0; - - nullpo_retv(sd); - - if((p=party_search(sd->status.party_id))==NULL) - return; - - x0=sd->bl.x-AREA_SIZE; - y0=sd->bl.y-AREA_SIZE; - x1=sd->bl.x+AREA_SIZE; - y1=sd->bl.y+AREA_SIZE; - - va_start(ap,type); - - for(i=0;i<MAX_PARTY;i++){ - struct party_member *m=&p->member[i]; - if(m->sd!=NULL){ - if(sd->bl.m!=m->sd->bl.m) - continue; - if(type!=0 && - (m->sd->bl.x<x0 || m->sd->bl.y<y0 || - m->sd->bl.x>x1 || m->sd->bl.y>y1 ) ) - continue; - list[blockcount++]=&m->sd->bl; - } - } - - map_freeblock_lock(); // メモリからの解放を禁止する - - for(i=0;i<blockcount;i++) - if(list[i]->prev) // 有効かどうかチェック - func(list[i],ap); - - map_freeblock_unlock(); // 解放を許可する - - va_end(ap); +void party_foreachsamemap (int (*func) (struct block_list *, va_list), + struct map_session_data *sd, int type, ...) +{ + struct party *p; + va_list ap; + int i; + int x0, y0, x1, y1; + struct block_list *list[MAX_PARTY]; + int blockcount = 0; + + nullpo_retv (sd); + + if ((p = party_search (sd->status.party_id)) == NULL) + return; + + x0 = sd->bl.x - AREA_SIZE; + y0 = sd->bl.y - AREA_SIZE; + x1 = sd->bl.x + AREA_SIZE; + y1 = sd->bl.y + AREA_SIZE; + + va_start (ap, type); + + for (i = 0; i < MAX_PARTY; i++) + { + struct party_member *m = &p->member[i]; + if (m->sd != NULL) + { + if (sd->bl.m != m->sd->bl.m) + continue; + if (type != 0 && + (m->sd->bl.x < x0 || m->sd->bl.y < y0 || + m->sd->bl.x > x1 || m->sd->bl.y > y1)) + continue; + list[blockcount++] = &m->sd->bl; + } + } + + map_freeblock_lock (); // メモリからの解放を禁止する + + for (i = 0; i < blockcount; i++) + if (list[i]->prev) // 有効かどうかチェック + func (list[i], ap); + + map_freeblock_unlock (); // 解放を許可する + + va_end (ap); } diff --git a/src/map/party.h b/src/map/party.h index 28d8096..2e8bf78 100644 --- a/src/map/party.h +++ b/src/map/party.h @@ -8,40 +8,45 @@ struct party; struct map_session_data; struct block_list; -void do_init_party(void); -void do_final_party(void); -struct party *party_search(int party_id); -struct party* party_searchname(char *str); - -int party_create(struct map_session_data *sd,char *name); -int party_created(int account_id,int fail,int party_id,char *name); -int party_request_info(int party_id); -int party_invite(struct map_session_data *sd,int account_id); -int party_member_added(int party_id,int account_id,int flag); -int party_leave(struct map_session_data *sd); -int party_removemember(struct map_session_data *sd,int account_id,char *name); -int party_member_leaved(int party_id,int account_id,char *name); -int party_reply_invite(struct map_session_data *sd,int account_id,int flag); -int party_recv_noinfo(int party_id); -int party_recv_info(struct party *sp); -int party_recv_movemap(int party_id,int account_id,char *map,int online,int lv); -int party_broken(int party_id); -int party_optionchanged(int party_id,int account_id,int exp,int item,int flag); -int party_changeoption(struct map_session_data *sd,int exp,int item); - -int party_send_movemap(struct map_session_data *sd); -int party_send_logout(struct map_session_data *sd); - -int party_send_message(struct map_session_data *sd,char *mes,int len); -int party_recv_message(int party_id,int account_id,char *mes,int len); - -int party_check_conflict(struct map_session_data *sd); - -int party_send_xy_clear(struct party *p); -int party_send_hp_check(struct block_list *bl,va_list ap); - -int party_exp_share(struct party *p,int map,int base_exp,int job_exp); - -void party_foreachsamemap(int (*func)(struct block_list *,va_list),struct map_session_data *sd,int type,...); +void do_init_party (void); +void do_final_party (void); +struct party *party_search (int party_id); +struct party *party_searchname (char *str); + +int party_create (struct map_session_data *sd, char *name); +int party_created (int account_id, int fail, int party_id, char *name); +int party_request_info (int party_id); +int party_invite (struct map_session_data *sd, int account_id); +int party_member_added (int party_id, int account_id, int flag); +int party_leave (struct map_session_data *sd); +int party_removemember (struct map_session_data *sd, int account_id, + char *name); +int party_member_leaved (int party_id, int account_id, char *name); +int party_reply_invite (struct map_session_data *sd, int account_id, + int flag); +int party_recv_noinfo (int party_id); +int party_recv_info (struct party *sp); +int party_recv_movemap (int party_id, int account_id, char *map, int online, + int lv); +int party_broken (int party_id); +int party_optionchanged (int party_id, int account_id, int exp, int item, + int flag); +int party_changeoption (struct map_session_data *sd, int exp, int item); + +int party_send_movemap (struct map_session_data *sd); +int party_send_logout (struct map_session_data *sd); + +int party_send_message (struct map_session_data *sd, char *mes, int len); +int party_recv_message (int party_id, int account_id, char *mes, int len); + +int party_check_conflict (struct map_session_data *sd); + +int party_send_xy_clear (struct party *p); +int party_send_hp_check (struct block_list *bl, va_list ap); + +int party_exp_share (struct party *p, int map, int base_exp, int job_exp); + +void party_foreachsamemap (int (*func) (struct block_list *, va_list), + struct map_session_data *sd, int type, ...); #endif diff --git a/src/map/path.c b/src/map/path.c index b2e0a78..a6e7535 100644 --- a/src/map/path.c +++ b/src/map/path.c @@ -14,29 +14,33 @@ //#define PATH_STANDALONETEST #define MAX_HEAP 150 -struct tmp_path { short x,y,dist,before,cost; char dir,flag;}; +struct tmp_path +{ + short x, y, dist, before, cost; + char dir, flag; +}; #define calc_index(x,y) (((x)+(y)*MAX_WALKPATH) & (MAX_WALKPATH*MAX_WALKPATH-1)) /*========================================== * 経路探索補助heap push *------------------------------------------ */ -static void push_heap_path(int *heap,struct tmp_path *tp,int index) +static void push_heap_path (int *heap, struct tmp_path *tp, int index) { - int i,h; + int i, h; - if( heap == NULL || tp == NULL ){ - printf("push_heap_path nullpo\n"); - return; - } + if (heap == NULL || tp == NULL) + { + printf ("push_heap_path nullpo\n"); + return; + } - heap[0]++; + heap[0]++; - for(h=heap[0]-1,i=(h-1)/2; - h>0 && tp[index].cost<tp[heap[i+1]].cost; - i=(h-1)/2) - heap[h+1]=heap[i+1],h=i; - heap[h+1]=index; + for (h = heap[0] - 1, i = (h - 1) / 2; + h > 0 && tp[index].cost < tp[heap[i + 1]].cost; i = (h - 1) / 2) + heap[h + 1] = heap[i + 1], h = i; + heap[h + 1] = index; } /*========================================== @@ -44,361 +48,398 @@ static void push_heap_path(int *heap,struct tmp_path *tp,int index) * costが減ったので根の方へ移動 *------------------------------------------ */ -static void update_heap_path(int *heap,struct tmp_path *tp,int index) +static void update_heap_path (int *heap, struct tmp_path *tp, int index) { - int i,h; - - nullpo_retv(heap); - nullpo_retv(tp); - - for(h=0;h<heap[0];h++) - if(heap[h+1]==index) - break; - if(h==heap[0]){ - fprintf(stderr,"update_heap_path bug\n"); - exit(1); - } - for(i=(h-1)/2; - h>0 && tp[index].cost<tp[heap[i+1]].cost; - i=(h-1)/2) - heap[h+1]=heap[i+1],h=i; - heap[h+1]=index; + int i, h; + + nullpo_retv (heap); + nullpo_retv (tp); + + for (h = 0; h < heap[0]; h++) + if (heap[h + 1] == index) + break; + if (h == heap[0]) + { + fprintf (stderr, "update_heap_path bug\n"); + exit (1); + } + for (i = (h - 1) / 2; + h > 0 && tp[index].cost < tp[heap[i + 1]].cost; i = (h - 1) / 2) + heap[h + 1] = heap[i + 1], h = i; + heap[h + 1] = index; } /*========================================== * 経路探索補助heap pop *------------------------------------------ */ -static int pop_heap_path(int *heap,struct tmp_path *tp) +static int pop_heap_path (int *heap, struct tmp_path *tp) { - int i,h,k; - int ret,last; - - nullpo_retr(-1, heap); - nullpo_retr(-1, tp); - - if(heap[0]<=0) - return -1; - ret=heap[1]; - last=heap[heap[0]]; - heap[0]--; - - for(h=0,k=2;k<heap[0];k=k*2+2){ - if(tp[heap[k+1]].cost>tp[heap[k]].cost) - k--; - heap[h+1]=heap[k+1], h=k; - } - if(k==heap[0]) - heap[h+1]=heap[k], h=k-1; - - for(i=(h-1)/2; - h>0 && tp[heap[i+1]].cost>tp[last].cost; - i=(h-1)/2) - heap[h+1]=heap[i+1],h=i; - heap[h+1]=last; - - return ret; + int i, h, k; + int ret, last; + + nullpo_retr (-1, heap); + nullpo_retr (-1, tp); + + if (heap[0] <= 0) + return -1; + ret = heap[1]; + last = heap[heap[0]]; + heap[0]--; + + for (h = 0, k = 2; k < heap[0]; k = k * 2 + 2) + { + if (tp[heap[k + 1]].cost > tp[heap[k]].cost) + k--; + heap[h + 1] = heap[k + 1], h = k; + } + if (k == heap[0]) + heap[h + 1] = heap[k], h = k - 1; + + for (i = (h - 1) / 2; + h > 0 && tp[heap[i + 1]].cost > tp[last].cost; i = (h - 1) / 2) + heap[h + 1] = heap[i + 1], h = i; + heap[h + 1] = last; + + return ret; } /*========================================== * 現在の点のcost計算 *------------------------------------------ */ -static int calc_cost(struct tmp_path *p,int x1,int y1) +static int calc_cost (struct tmp_path *p, int x1, int y1) { - int xd,yd; + int xd, yd; - nullpo_retr(0, p); + nullpo_retr (0, p); - xd=x1-p->x; - if(xd<0) xd=-xd; - yd=y1-p->y; - if(yd<0) yd=-yd; - return (xd+yd)*10+p->dist; + xd = x1 - p->x; + if (xd < 0) + xd = -xd; + yd = y1 - p->y; + if (yd < 0) + yd = -yd; + return (xd + yd) * 10 + p->dist; } /*========================================== * 必要ならpathを追加/修正する *------------------------------------------ */ -static int add_path(int *heap,struct tmp_path *tp,int x,int y,int dist,int dir,int before,int x1,int y1) +static int add_path (int *heap, struct tmp_path *tp, int x, int y, int dist, + int dir, int before, int x1, int y1) { - int i; - - nullpo_retr(0, heap); - nullpo_retr(0, tp); - - i=calc_index(x,y); - - if(tp[i].x==x && tp[i].y==y){ - if(tp[i].dist>dist){ - tp[i].dist=dist; - tp[i].dir=dir; - tp[i].before=before; - tp[i].cost=calc_cost(&tp[i],x1,y1); - if(tp[i].flag) - push_heap_path(heap,tp,i); - else - update_heap_path(heap,tp,i); - tp[i].flag=0; - } - return 0; - } - - if(tp[i].x || tp[i].y) - return 1; - - tp[i].x=x; - tp[i].y=y; - tp[i].dist=dist; - tp[i].dir=dir; - tp[i].before=before; - tp[i].cost=calc_cost(&tp[i],x1,y1); - tp[i].flag=0; - push_heap_path(heap,tp,i); - - return 0; + int i; + + nullpo_retr (0, heap); + nullpo_retr (0, tp); + + i = calc_index (x, y); + + if (tp[i].x == x && tp[i].y == y) + { + if (tp[i].dist > dist) + { + tp[i].dist = dist; + tp[i].dir = dir; + tp[i].before = before; + tp[i].cost = calc_cost (&tp[i], x1, y1); + if (tp[i].flag) + push_heap_path (heap, tp, i); + else + update_heap_path (heap, tp, i); + tp[i].flag = 0; + } + return 0; + } + + if (tp[i].x || tp[i].y) + return 1; + + tp[i].x = x; + tp[i].y = y; + tp[i].dist = dist; + tp[i].dir = dir; + tp[i].before = before; + tp[i].cost = calc_cost (&tp[i], x1, y1); + tp[i].flag = 0; + push_heap_path (heap, tp, i); + + return 0; } - /*========================================== * (x,y)が移動不可能地帯かどうか * flag 0x10000 遠距離攻撃判定 *------------------------------------------ */ -static int can_place(struct map_data *m,int x,int y,int flag) +static int can_place (struct map_data *m, int x, int y, int flag) { - int c; + int c; - nullpo_retr(0, m); + nullpo_retr (0, m); - c=read_gatp(m,x,y); + c = read_gatp (m, x, y); - if(c==1) - return 0; - if(!(flag&0x10000) && c==5) - return 0; - return 1; + if (c == 1) + return 0; + if (!(flag & 0x10000) && c == 5) + return 0; + return 1; } /*========================================== * (x0,y0)から(x1,y1)へ1歩で移動可能か計算 *------------------------------------------ */ -static int can_move(struct map_data *m,int x0,int y0,int x1,int y1,int flag) +static int can_move (struct map_data *m, int x0, int y0, int x1, int y1, + int flag) { - nullpo_retr(0, m); - - if(x0-x1<-1 || x0-x1>1 || y0-y1<-1 || y0-y1>1) - return 0; - if(x1<0 || y1<0 || x1>=m->xs || y1>=m->ys) - return 0; - if(!can_place(m,x0,y0,flag)) - return 0; - if(!can_place(m,x1,y1,flag)) - return 0; - if(x0==x1 || y0==y1) - return 1; - if(!can_place(m,x0,y1,flag) || !can_place(m,x1,y0,flag)) - return 0; - return 1; + nullpo_retr (0, m); + + if (x0 - x1 < -1 || x0 - x1 > 1 || y0 - y1 < -1 || y0 - y1 > 1) + return 0; + if (x1 < 0 || y1 < 0 || x1 >= m->xs || y1 >= m->ys) + return 0; + if (!can_place (m, x0, y0, flag)) + return 0; + if (!can_place (m, x1, y1, flag)) + return 0; + if (x0 == x1 || y0 == y1) + return 1; + if (!can_place (m, x0, y1, flag) || !can_place (m, x1, y0, flag)) + return 0; + return 1; } + /*========================================== * (x0,y0)から(dx,dy)方向へcountセル分 * 吹き飛ばしたあとの座標を所得 *------------------------------------------ */ -int path_blownpos(int m,int x0,int y0,int dx,int dy,int count) +int path_blownpos (int m, int x0, int y0, int dx, int dy, int count) { - struct map_data *md; - - if(!map[m].gat) - return -1; - md=&map[m]; - - if(count>15){ // 最大10マスに制限 - if(battle_config.error_log) - printf("path_blownpos: count too many %d !\n",count); - count=15; - } - if(dx>1 || dx<-1 || dy>1 || dy<-1){ - if(battle_config.error_log) - printf("path_blownpos: illeagal dx=%d or dy=%d !\n",dx,dy); - dx=(dx>=0)?1:((dx<0)?-1:0); - dy=(dy>=0)?1:((dy<0)?-1:0); - } - - while( (count--)>0 && (dx!=0 || dy!=0) ){ - if( !can_move(md,x0,y0,x0+dx,y0+dy,0) ){ - int fx=(dx!=0 && can_move(md,x0,y0,x0+dx,y0,0)); - int fy=(dy!=0 && can_move(md,x0,y0,x0,y0+dy,0)); - if( fx && fy ){ - if(rand()&1) dx=0; - else dy=0; - } - if( !fx ) dx=0; - if( !fy ) dy=0; - } - x0+=dx; - y0+=dy; - } - return (x0<<16)|y0; + struct map_data *md; + + if (!map[m].gat) + return -1; + md = &map[m]; + + if (count > 15) + { // 最大10マスに制限 + if (battle_config.error_log) + printf ("path_blownpos: count too many %d !\n", count); + count = 15; + } + if (dx > 1 || dx < -1 || dy > 1 || dy < -1) + { + if (battle_config.error_log) + printf ("path_blownpos: illeagal dx=%d or dy=%d !\n", dx, dy); + dx = (dx >= 0) ? 1 : ((dx < 0) ? -1 : 0); + dy = (dy >= 0) ? 1 : ((dy < 0) ? -1 : 0); + } + + while ((count--) > 0 && (dx != 0 || dy != 0)) + { + if (!can_move (md, x0, y0, x0 + dx, y0 + dy, 0)) + { + int fx = (dx != 0 && can_move (md, x0, y0, x0 + dx, y0, 0)); + int fy = (dy != 0 && can_move (md, x0, y0, x0, y0 + dy, 0)); + if (fx && fy) + { + if (rand () & 1) + dx = 0; + else + dy = 0; + } + if (!fx) + dx = 0; + if (!fy) + dy = 0; + } + x0 += dx; + y0 += dy; + } + return (x0 << 16) | y0; } /*========================================== * path探索 (x0,y0)->(x1,y1) *------------------------------------------ */ -int path_search(struct walkpath_data *wpd,int m,int x0,int y0,int x1,int y1,int flag) +int path_search (struct walkpath_data *wpd, int m, int x0, int y0, int x1, + int y1, int flag) { - int heap[MAX_HEAP+1]; - struct tmp_path tp[MAX_WALKPATH*MAX_WALKPATH]; - int i,rp,x,y; - struct map_data *md; - int dx,dy; - - nullpo_retr(0, wpd); - - if(!map[m].gat) - return -1; - md=&map[m]; - if(x1<0 || x1>=md->xs || y1<0 || y1>=md->ys || (i=read_gatp(md,x1,y1))==1 || i==5) - return -1; - - // easy - dx = (x1-x0<0) ? -1 : 1; - dy = (y1-y0<0) ? -1 : 1; - for(x=x0,y=y0,i=0;x!=x1 || y!=y1;){ - if(i>=sizeof(wpd->path)) - return -1; - if(x!=x1 && y!=y1){ - if(!can_move(md,x,y,x+dx,y+dy,flag)) - break; - x+=dx; - y+=dy; - wpd->path[i++]=(dx<0) ? ((dy>0)? 1 : 3) : ((dy<0)? 5 : 7); - } else if(x!=x1){ - if(!can_move(md,x,y,x+dx,y ,flag)) - break; - x+=dx; - wpd->path[i++]=(dx<0) ? 2 : 6; - } else { // y!=y1 - if(!can_move(md,x,y,x ,y+dy,flag)) - break; - y+=dy; - wpd->path[i++]=(dy>0) ? 0 : 4; - } - if(x==x1 && y==y1){ - wpd->path_len=i; - wpd->path_pos=0; - wpd->path_half=0; - return 0; - } - } - if(flag&1) - return -1; - - memset(tp,0,sizeof(tp)); - - i=calc_index(x0,y0); - tp[i].x=x0; - tp[i].y=y0; - tp[i].dist=0; - tp[i].dir=0; - tp[i].before=0; - tp[i].cost=calc_cost(&tp[i],x1,y1); - tp[i].flag=0; - heap[0]=0; - push_heap_path(heap,tp,calc_index(x0,y0)); - while(1){ - int e=0,fromdir; - - if(heap[0]==0) - return -1; - rp=pop_heap_path(heap,tp); - x=tp[rp].x; - y=tp[rp].y; - if(x==x1 && y==y1){ - int len,j; - - for(len=0,i=rp;len<100 && i!=calc_index(x0,y0);i=tp[i].before,len++); - if(len==100 || len>=sizeof(wpd->path)) - return -1; - wpd->path_len=len; - wpd->path_pos=0; - wpd->path_half=0; - for(i=rp,j=len-1;j>=0;i=tp[i].before,j--) - wpd->path[j]=tp[i].dir; - - return 0; - } - fromdir=tp[rp].dir; - if(can_move(md,x,y,x+1,y-1,flag)) - e+=add_path(heap,tp,x+1,y-1,tp[rp].dist+14,5,rp,x1,y1); - if(can_move(md,x,y,x+1,y ,flag)) - e+=add_path(heap,tp,x+1,y ,tp[rp].dist+10,6,rp,x1,y1); - if(can_move(md,x,y,x+1,y+1,flag)) - e+=add_path(heap,tp,x+1,y+1,tp[rp].dist+14,7,rp,x1,y1); - if(can_move(md,x,y,x ,y+1,flag)) - e+=add_path(heap,tp,x ,y+1,tp[rp].dist+10,0,rp,x1,y1); - if(can_move(md,x,y,x-1,y+1,flag)) - e+=add_path(heap,tp,x-1,y+1,tp[rp].dist+14,1,rp,x1,y1); - if(can_move(md,x,y,x-1,y ,flag)) - e+=add_path(heap,tp,x-1,y ,tp[rp].dist+10,2,rp,x1,y1); - if(can_move(md,x,y,x-1,y-1,flag)) - e+=add_path(heap,tp,x-1,y-1,tp[rp].dist+14,3,rp,x1,y1); - if(can_move(md,x,y,x ,y-1,flag)) - e+=add_path(heap,tp,x ,y-1,tp[rp].dist+10,4,rp,x1,y1); - tp[rp].flag=1; - if(e || heap[0]>=MAX_HEAP-5) - return -1; - } - return -1; + int heap[MAX_HEAP + 1]; + struct tmp_path tp[MAX_WALKPATH * MAX_WALKPATH]; + int i, rp, x, y; + struct map_data *md; + int dx, dy; + + nullpo_retr (0, wpd); + + if (!map[m].gat) + return -1; + md = &map[m]; + if (x1 < 0 || x1 >= md->xs || y1 < 0 || y1 >= md->ys + || (i = read_gatp (md, x1, y1)) == 1 || i == 5) + return -1; + + // easy + dx = (x1 - x0 < 0) ? -1 : 1; + dy = (y1 - y0 < 0) ? -1 : 1; + for (x = x0, y = y0, i = 0; x != x1 || y != y1;) + { + if (i >= sizeof (wpd->path)) + return -1; + if (x != x1 && y != y1) + { + if (!can_move (md, x, y, x + dx, y + dy, flag)) + break; + x += dx; + y += dy; + wpd->path[i++] = + (dx < 0) ? ((dy > 0) ? 1 : 3) : ((dy < 0) ? 5 : 7); + } + else if (x != x1) + { + if (!can_move (md, x, y, x + dx, y, flag)) + break; + x += dx; + wpd->path[i++] = (dx < 0) ? 2 : 6; + } + else + { // y!=y1 + if (!can_move (md, x, y, x, y + dy, flag)) + break; + y += dy; + wpd->path[i++] = (dy > 0) ? 0 : 4; + } + if (x == x1 && y == y1) + { + wpd->path_len = i; + wpd->path_pos = 0; + wpd->path_half = 0; + return 0; + } + } + if (flag & 1) + return -1; + + memset (tp, 0, sizeof (tp)); + + i = calc_index (x0, y0); + tp[i].x = x0; + tp[i].y = y0; + tp[i].dist = 0; + tp[i].dir = 0; + tp[i].before = 0; + tp[i].cost = calc_cost (&tp[i], x1, y1); + tp[i].flag = 0; + heap[0] = 0; + push_heap_path (heap, tp, calc_index (x0, y0)); + while (1) + { + int e = 0, fromdir; + + if (heap[0] == 0) + return -1; + rp = pop_heap_path (heap, tp); + x = tp[rp].x; + y = tp[rp].y; + if (x == x1 && y == y1) + { + int len, j; + + for (len = 0, i = rp; len < 100 && i != calc_index (x0, y0); + i = tp[i].before, len++); + if (len == 100 || len >= sizeof (wpd->path)) + return -1; + wpd->path_len = len; + wpd->path_pos = 0; + wpd->path_half = 0; + for (i = rp, j = len - 1; j >= 0; i = tp[i].before, j--) + wpd->path[j] = tp[i].dir; + + return 0; + } + fromdir = tp[rp].dir; + if (can_move (md, x, y, x + 1, y - 1, flag)) + e += add_path (heap, tp, x + 1, y - 1, tp[rp].dist + 14, 5, rp, + x1, y1); + if (can_move (md, x, y, x + 1, y, flag)) + e += add_path (heap, tp, x + 1, y, tp[rp].dist + 10, 6, rp, x1, + y1); + if (can_move (md, x, y, x + 1, y + 1, flag)) + e += add_path (heap, tp, x + 1, y + 1, tp[rp].dist + 14, 7, rp, + x1, y1); + if (can_move (md, x, y, x, y + 1, flag)) + e += add_path (heap, tp, x, y + 1, tp[rp].dist + 10, 0, rp, x1, + y1); + if (can_move (md, x, y, x - 1, y + 1, flag)) + e += add_path (heap, tp, x - 1, y + 1, tp[rp].dist + 14, 1, rp, + x1, y1); + if (can_move (md, x, y, x - 1, y, flag)) + e += add_path (heap, tp, x - 1, y, tp[rp].dist + 10, 2, rp, x1, + y1); + if (can_move (md, x, y, x - 1, y - 1, flag)) + e += add_path (heap, tp, x - 1, y - 1, tp[rp].dist + 14, 3, rp, + x1, y1); + if (can_move (md, x, y, x, y - 1, flag)) + e += add_path (heap, tp, x, y - 1, tp[rp].dist + 10, 4, rp, x1, + y1); + tp[rp].flag = 1; + if (e || heap[0] >= MAX_HEAP - 5) + return -1; + } + return -1; } #ifdef PATH_STANDALONETEST -char gat[64][64]={ - {0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,0,0,0,0,0,0}, - {0,0,0,0,1,0,0,0,0,0}, +char gat[64][64] = { + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {0, 0, 0, 0, 1, 0, 0, 0, 0, 0}, }; + struct map_data map[1]; /*========================================== * 経路探索ルーチン単体テスト用main関数 *------------------------------------------ */ -void main(int argc,char *argv[]) +void main (int argc, char *argv[]) { - struct walkpath_data wpd; - - map[0].gat=gat; - map[0].xs=64; - map[0].ys=64; - - path_search(&wpd,0,3,4,5,4); - path_search(&wpd,0,5,4,3,4); - path_search(&wpd,0,6,4,3,4); - path_search(&wpd,0,7,4,3,4); - path_search(&wpd,0,4,3,4,5); - path_search(&wpd,0,4,2,4,5); - path_search(&wpd,0,4,1,4,5); - path_search(&wpd,0,4,5,4,3); - path_search(&wpd,0,4,6,4,3); - path_search(&wpd,0,4,7,4,3); - path_search(&wpd,0,7,4,3,4); - path_search(&wpd,0,8,4,3,4); - path_search(&wpd,0,9,4,3,4); - path_search(&wpd,0,10,4,3,4); - path_search(&wpd,0,11,4,3,4); - path_search(&wpd,0,12,4,3,4); - path_search(&wpd,0,13,4,3,4); - path_search(&wpd,0,14,4,3,4); - path_search(&wpd,0,15,4,3,4); - path_search(&wpd,0,16,4,3,4); - path_search(&wpd,0,17,4,3,4); - path_search(&wpd,0,18,4,3,4); + struct walkpath_data wpd; + + map[0].gat = gat; + map[0].xs = 64; + map[0].ys = 64; + + path_search (&wpd, 0, 3, 4, 5, 4); + path_search (&wpd, 0, 5, 4, 3, 4); + path_search (&wpd, 0, 6, 4, 3, 4); + path_search (&wpd, 0, 7, 4, 3, 4); + path_search (&wpd, 0, 4, 3, 4, 5); + path_search (&wpd, 0, 4, 2, 4, 5); + path_search (&wpd, 0, 4, 1, 4, 5); + path_search (&wpd, 0, 4, 5, 4, 3); + path_search (&wpd, 0, 4, 6, 4, 3); + path_search (&wpd, 0, 4, 7, 4, 3); + path_search (&wpd, 0, 7, 4, 3, 4); + path_search (&wpd, 0, 8, 4, 3, 4); + path_search (&wpd, 0, 9, 4, 3, 4); + path_search (&wpd, 0, 10, 4, 3, 4); + path_search (&wpd, 0, 11, 4, 3, 4); + path_search (&wpd, 0, 12, 4, 3, 4); + path_search (&wpd, 0, 13, 4, 3, 4); + path_search (&wpd, 0, 14, 4, 3, 4); + path_search (&wpd, 0, 15, 4, 3, 4); + path_search (&wpd, 0, 16, 4, 3, 4); + path_search (&wpd, 0, 17, 4, 3, 4); + path_search (&wpd, 0, 18, 4, 3, 4); } #endif diff --git a/src/map/pc.c b/src/map/pc.c index 75ae42c..c3470db 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -5,7 +5,7 @@ #include <ctype.h> #include <time.h> -#include "socket.h" // [Valaris] +#include "socket.h" // [Valaris] #include "timer.h" #include "db.h" @@ -34,11 +34,11 @@ #include "memwatch.h" #endif -#define PVP_CALCRANK_INTERVAL 1000 // PVPソスソスソスハ計ソスZソスフ間隔 +#define PVP_CALCRANK_INTERVAL 1000 // PVPソスソスソスハ計ソスZソスフ間隔 #define STATE_BLIND 0x10 -#define MAGIC_SKILL_THRESHOLD 200 // [fate] At this threshold, the Astral Soul skill kicks in +#define MAGIC_SKILL_THRESHOLD 200 // [fate] At this threshold, the Astral Soul skill kicks in #define MAP_LOG_STATS(sd, suffix) \ MAP_LOG_PC(sd, "STAT %d %d %d %d %d %d " suffix, \ @@ -68,1021 +68,1162 @@ static int aspd_base[MAX_PC_CLASS][20]; static char job_bonus[3][MAX_PC_CLASS][MAX_LEVEL]; static int exp_table[14][MAX_LEVEL]; static char statp[255][7]; -static struct { - int id; - int max; - struct { - short id,lv; - } need[6]; +static struct +{ + int id; + int max; + struct + { + short id, lv; + } need[6]; } skill_tree[3][MAX_PC_CLASS][100]; -static int atkmods[3][20]; // ソスソスソスソスATKソスTソスCソスYソスCソスソス(size_fix.txt) -static int refinebonus[5][3]; // ソスソスソスBソス{ソス[ソスiソスXソスeソス[ソスuソスソス(refine_db.txt) -static int percentrefinery[5][10]; // ソスソスソスBソスソスソスソスソスソス(refine_db.txt) +static int atkmods[3][20]; // ソスソスソスソスATKソスTソスCソスYソスCソスソス(size_fix.txt) +static int refinebonus[5][3]; // ソスソスソスBソス{ソス[ソスiソスXソスeソス[ソスuソスソス(refine_db.txt) +static int percentrefinery[5][10]; // ソスソスソスBソスソスソスソスソスソス(refine_db.txt) -static int dirx[8]={0,-1,-1,-1,0,1,1,1}; -static int diry[8]={1,1,0,-1,-1,-1,0,1}; +static int dirx[8] = { 0, -1, -1, -1, 0, 1, 1, 1 }; +static int diry[8] = { 1, 1, 0, -1, -1, -1, 0, 1 }; -static unsigned int equip_pos[11]={0x0080,0x0008,0x0040,0x0004,0x0001,0x0200,0x0100,0x0010,0x0020,0x0002,0x8000}; +static unsigned int equip_pos[11] = + { 0x0080, 0x0008, 0x0040, 0x0004, 0x0001, 0x0200, 0x0100, 0x0010, 0x0020, + 0x0002, 0x8000 +}; //static struct dbt *gm_account_db; static struct gm_account *gm_account = NULL; static int GM_num = 0; -int pc_isGM(struct map_session_data *sd) { -// struct gm_account *p; - int i; +int pc_isGM (struct map_session_data *sd) +{ +// struct gm_account *p; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); /* p = numdb_search(gm_account_db, sd->status.account_id); if (p == NULL) return 0; return p->level;*/ - for(i = 0; i < GM_num; i++) - if (gm_account[i].account_id == sd->status.account_id) - return gm_account[i].level; - return 0; + for (i = 0; i < GM_num; i++) + if (gm_account[i].account_id == sd->status.account_id) + return gm_account[i].level; + return 0; } -int pc_iskiller(struct map_session_data *src, struct map_session_data *target) { - nullpo_retr(0, src); - - if(src->bl.type!=BL_PC ) - return 0; - if (src->special_state.killer) - return 1; +int pc_iskiller (struct map_session_data *src, + struct map_session_data *target) +{ + nullpo_retr (0, src); - if(target->bl.type!=BL_PC ) - return 0; - if (target->special_state.killable) - return 1; + if (src->bl.type != BL_PC) + return 0; + if (src->special_state.killer) + return 1; + if (target->bl.type != BL_PC) return 0; -} + if (target->special_state.killable) + return 1; + return 0; +} -int pc_set_gm_level(int account_id, int level) { - int i; - for (i = 0; i < GM_num; i++) { - if (account_id == gm_account[i].account_id) { +int pc_set_gm_level (int account_id, int level) +{ + int i; + for (i = 0; i < GM_num; i++) + { + if (account_id == gm_account[i].account_id) + { gm_account[i].level = level; return 0; } } GM_num++; - gm_account = realloc(gm_account, sizeof(struct gm_account) * GM_num); + gm_account = realloc (gm_account, sizeof (struct gm_account) * GM_num); gm_account[GM_num - 1].account_id = account_id; gm_account[GM_num - 1].level = level; return 0; } -int pc_getrefinebonus(int lv, int type) { - if (lv >= 0 && lv < 5 && type >= 0 && type < 3) - return refinebonus[lv][type]; - return 0; +int pc_getrefinebonus (int lv, int type) +{ + if (lv >= 0 && lv < 5 && type >= 0 && type < 3) + return refinebonus[lv][type]; + return 0; } -static int distance(int x0, int y0, int x1, int y1) { - int dx, dy; +static int distance (int x0, int y0, int x1, int y1) +{ + int dx, dy; - dx = abs(x0-x1); - dy = abs(y0-y1); - return dx>dy ? dx : dy; + dx = abs (x0 - x1); + dy = abs (y0 - y1); + return dx > dy ? dx : dy; } -static int pc_invincible_timer(int tid,unsigned int tick,int id,int data) { - struct map_session_data *sd; +static int pc_invincible_timer (int tid, unsigned int tick, int id, int data) +{ + struct map_session_data *sd; - if( (sd=(struct map_session_data *)map_id2sd(id)) == NULL || sd->bl.type!=BL_PC ) - return 1; + if ((sd = (struct map_session_data *) map_id2sd (id)) == NULL + || sd->bl.type != BL_PC) + return 1; - if(sd->invincible_timer != tid){ - if(battle_config.error_log) - printf("invincible_timer %d != %d\n",sd->invincible_timer,tid); - return 0; - } - sd->invincible_timer=-1; + if (sd->invincible_timer != tid) + { + if (battle_config.error_log) + printf ("invincible_timer %d != %d\n", sd->invincible_timer, tid); + return 0; + } + sd->invincible_timer = -1; - return 0; + return 0; } -int pc_setinvincibletimer(struct map_session_data *sd,int val) { - nullpo_retr(0, sd); +int pc_setinvincibletimer (struct map_session_data *sd, int val) +{ + nullpo_retr (0, sd); - if(sd->invincible_timer != -1) - delete_timer(sd->invincible_timer,pc_invincible_timer); - sd->invincible_timer = add_timer(gettick()+val,pc_invincible_timer,sd->bl.id,0); - return 0; + if (sd->invincible_timer != -1) + delete_timer (sd->invincible_timer, pc_invincible_timer); + sd->invincible_timer = + add_timer (gettick () + val, pc_invincible_timer, sd->bl.id, 0); + return 0; } -int pc_delinvincibletimer(struct map_session_data *sd) { - nullpo_retr(0, sd); +int pc_delinvincibletimer (struct map_session_data *sd) +{ + nullpo_retr (0, sd); - if(sd->invincible_timer != -1) { - delete_timer(sd->invincible_timer,pc_invincible_timer); - sd->invincible_timer = -1; - } - return 0; + if (sd->invincible_timer != -1) + { + delete_timer (sd->invincible_timer, pc_invincible_timer); + sd->invincible_timer = -1; + } + return 0; } -static int pc_spiritball_timer(int tid,unsigned int tick,int id,int data) { - struct map_session_data *sd; - int i; +static int pc_spiritball_timer (int tid, unsigned int tick, int id, int data) +{ + struct map_session_data *sd; + int i; - if( (sd=(struct map_session_data *)map_id2sd(id)) == NULL || sd->bl.type!=BL_PC ) - return 1; + if ((sd = (struct map_session_data *) map_id2sd (id)) == NULL + || sd->bl.type != BL_PC) + return 1; - if(sd->spirit_timer[0] != tid){ - if(battle_config.error_log) - printf("spirit_timer %d != %d\n",sd->spirit_timer[0],tid); - return 0; - } - sd->spirit_timer[0]=-1; - for(i=1;i<sd->spiritball;i++) { - sd->spirit_timer[i-1] = sd->spirit_timer[i]; - sd->spirit_timer[i] = -1; - } - sd->spiritball--; - if(sd->spiritball < 0) - sd->spiritball = 0; - clif_spiritball(sd); + if (sd->spirit_timer[0] != tid) + { + if (battle_config.error_log) + printf ("spirit_timer %d != %d\n", sd->spirit_timer[0], tid); + return 0; + } + sd->spirit_timer[0] = -1; + for (i = 1; i < sd->spiritball; i++) + { + sd->spirit_timer[i - 1] = sd->spirit_timer[i]; + sd->spirit_timer[i] = -1; + } + sd->spiritball--; + if (sd->spiritball < 0) + sd->spiritball = 0; + clif_spiritball (sd); - return 0; + return 0; } -int pc_addspiritball(struct map_session_data *sd,int interval,int max) { - int i; +int pc_addspiritball (struct map_session_data *sd, int interval, int max) +{ + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(max > MAX_SKILL_LEVEL) - max = MAX_SKILL_LEVEL; - if(sd->spiritball < 0) - sd->spiritball = 0; + if (max > MAX_SKILL_LEVEL) + max = MAX_SKILL_LEVEL; + if (sd->spiritball < 0) + sd->spiritball = 0; - if(sd->spiritball >= max) { - if(sd->spirit_timer[0] != -1) { - delete_timer(sd->spirit_timer[0],pc_spiritball_timer); - sd->spirit_timer[0] = -1; - } - for(i=1;i<max;i++) { - sd->spirit_timer[i-1] = sd->spirit_timer[i]; - sd->spirit_timer[i] = -1; - } - } - else - sd->spiritball++; + if (sd->spiritball >= max) + { + if (sd->spirit_timer[0] != -1) + { + delete_timer (sd->spirit_timer[0], pc_spiritball_timer); + sd->spirit_timer[0] = -1; + } + for (i = 1; i < max; i++) + { + sd->spirit_timer[i - 1] = sd->spirit_timer[i]; + sd->spirit_timer[i] = -1; + } + } + else + sd->spiritball++; - sd->spirit_timer[sd->spiritball-1] = add_timer(gettick()+interval,pc_spiritball_timer,sd->bl.id,0); - clif_spiritball(sd); + sd->spirit_timer[sd->spiritball - 1] = + add_timer (gettick () + interval, pc_spiritball_timer, sd->bl.id, 0); + clif_spiritball (sd); - return 0; + return 0; } -int pc_delspiritball(struct map_session_data *sd,int count,int type) { - int i; +int pc_delspiritball (struct map_session_data *sd, int count, int type) +{ + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->spiritball <= 0) { - sd->spiritball = 0; - return 0; - } + if (sd->spiritball <= 0) + { + sd->spiritball = 0; + return 0; + } - if(count > sd->spiritball) - count = sd->spiritball; - sd->spiritball -= count; - if(count > MAX_SKILL_LEVEL) - count = MAX_SKILL_LEVEL; - - for(i=0;i<count;i++) { - if(sd->spirit_timer[i] != -1) { - delete_timer(sd->spirit_timer[i],pc_spiritball_timer); - sd->spirit_timer[i] = -1; - } - } - for(i=count;i<MAX_SKILL_LEVEL;i++) { - sd->spirit_timer[i-count] = sd->spirit_timer[i]; - sd->spirit_timer[i] = -1; - } + if (count > sd->spiritball) + count = sd->spiritball; + sd->spiritball -= count; + if (count > MAX_SKILL_LEVEL) + count = MAX_SKILL_LEVEL; + + for (i = 0; i < count; i++) + { + if (sd->spirit_timer[i] != -1) + { + delete_timer (sd->spirit_timer[i], pc_spiritball_timer); + sd->spirit_timer[i] = -1; + } + } + for (i = count; i < MAX_SKILL_LEVEL; i++) + { + sd->spirit_timer[i - count] = sd->spirit_timer[i]; + sd->spirit_timer[i] = -1; + } - if(!type) - clif_spiritball(sd); + if (!type) + clif_spiritball (sd); - return 0; + return 0; } -int pc_setrestartvalue(struct map_session_data *sd,int type) { - //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス - struct pc_base_job s_class; +int pc_setrestartvalue (struct map_session_data *sd, int type) +{ + //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス + struct pc_base_job s_class; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - s_class = pc_calc_base_job(sd->status.class); + s_class = pc_calc_base_job (sd->status.class); - //----------------------- - // ソスソスソスSソスソスソスソス - if(sd->special_state.restart_full_recover) { // ソスIソスVソスソスソスXソスJソス[ソスh - sd->status.hp=sd->status.max_hp; - sd->status.sp=sd->status.max_sp; - } - else { - if(s_class.job == 0 && battle_config.restart_hp_rate < 50) { //ソスmソスrソスヘ費ソスソスソスソスソスソスソス - sd->status.hp=(sd->status.max_hp)/2; - } - else { - if(battle_config.restart_hp_rate <= 0) - sd->status.hp = 1; - else { - sd->status.hp = sd->status.max_hp * battle_config.restart_hp_rate /100; - if(sd->status.hp <= 0) - sd->status.hp = 1; - } - } - if(battle_config.restart_sp_rate > 0) { - int sp = sd->status.max_sp * battle_config.restart_sp_rate /100; - if(sd->status.sp < sp) - sd->status.sp = sp; - } - } - if(type&1) - clif_updatestatus(sd,SP_HP); - if(type&1) - clif_updatestatus(sd,SP_SP); - - /* removed exp penalty on spawn [Valaris] */ - - if(type&2 && sd->status.class != 0 && battle_config.zeny_penalty > 0 && !map[sd->bl.m].flag.nozenypenalty) { - int zeny = (int)((double)sd->status.zeny * (double)battle_config.zeny_penalty / 10000.); - if(zeny < 1) zeny = 1; - sd->status.zeny -= zeny; - if(sd->status.zeny < 0) sd->status.zeny = 0; - clif_updatestatus(sd,SP_ZENY); - } - sd->heal_xp = 0; // [Fate] Set gainable xp for healing this player to 0 + //----------------------- + // ソスソスソスSソスソスソスソス + if (sd->special_state.restart_full_recover) + { // ソスIソスVソスソスソスXソスJソス[ソスh + sd->status.hp = sd->status.max_hp; + sd->status.sp = sd->status.max_sp; + } + else + { + if (s_class.job == 0 && battle_config.restart_hp_rate < 50) + { //ソスmソスrソスヘ費ソスソスソスソスソスソスソス + sd->status.hp = (sd->status.max_hp) / 2; + } + else + { + if (battle_config.restart_hp_rate <= 0) + sd->status.hp = 1; + else + { + sd->status.hp = + sd->status.max_hp * battle_config.restart_hp_rate / 100; + if (sd->status.hp <= 0) + sd->status.hp = 1; + } + } + if (battle_config.restart_sp_rate > 0) + { + int sp = sd->status.max_sp * battle_config.restart_sp_rate / 100; + if (sd->status.sp < sp) + sd->status.sp = sp; + } + } + if (type & 1) + clif_updatestatus (sd, SP_HP); + if (type & 1) + clif_updatestatus (sd, SP_SP); + + /* removed exp penalty on spawn [Valaris] */ + + if (type & 2 && sd->status.class != 0 && battle_config.zeny_penalty > 0 + && !map[sd->bl.m].flag.nozenypenalty) + { + int zeny = + (int) ((double) sd->status.zeny * + (double) battle_config.zeny_penalty / 10000.); + if (zeny < 1) + zeny = 1; + sd->status.zeny -= zeny; + if (sd->status.zeny < 0) + sd->status.zeny = 0; + clif_updatestatus (sd, SP_ZENY); + } + sd->heal_xp = 0; // [Fate] Set gainable xp for healing this player to 0 - return 0; + return 0; } /*========================================== * ソスソスソスソスソスソスbソスNソスソスソストゑソスソスソスMOBソスフ撰ソスソス数ゑソスソスソス(foreachclient) *------------------------------------------ */ -static int pc_counttargeted_sub(struct block_list *bl,va_list ap) +static int pc_counttargeted_sub (struct block_list *bl, va_list ap) { - int id,*c,target_lv; - struct block_list *src; + int id, *c, target_lv; + struct block_list *src; - nullpo_retr(0, bl); - nullpo_retr(0, ap); + nullpo_retr (0, bl); + nullpo_retr (0, ap); - id=va_arg(ap,int); + id = va_arg (ap, int); - nullpo_retr(0, c=va_arg(ap,int *)); - - src=va_arg(ap,struct block_list *); - target_lv=va_arg(ap,int); - if(id == bl->id || (src && id == src->id)) return 0; - if(bl->type == BL_PC) { - struct map_session_data *sd=(struct map_session_data *)bl; - if( sd && sd->attacktarget == id && sd->attacktimer != -1 && sd->attacktarget_lv >= target_lv) - (*c)++; - } - else if(bl->type == BL_MOB) { - struct mob_data *md = (struct mob_data *)bl; - if(md && md->target_id == id && md->timer != -1 && md->state.state == MS_ATTACK && md->target_lv >= target_lv) + nullpo_retr (0, c = va_arg (ap, int *)); - (*c)++; - //printf("md->target_lv:%d, target_lv:%d\n",((struct mob_data *)bl)->target_lv,target_lv); - } - return 0; + src = va_arg (ap, struct block_list *); + target_lv = va_arg (ap, int); + if (id == bl->id || (src && id == src->id)) + return 0; + if (bl->type == BL_PC) + { + struct map_session_data *sd = (struct map_session_data *) bl; + if (sd && sd->attacktarget == id && sd->attacktimer != -1 + && sd->attacktarget_lv >= target_lv) + (*c)++; + } + else if (bl->type == BL_MOB) + { + struct mob_data *md = (struct mob_data *) bl; + if (md && md->target_id == id && md->timer != -1 + && md->state.state == MS_ATTACK && md->target_lv >= target_lv) + + (*c)++; + //printf("md->target_lv:%d, target_lv:%d\n",((struct mob_data *)bl)->target_lv,target_lv); + } + return 0; } -int pc_counttargeted(struct map_session_data *sd,struct block_list *src,int target_lv) +int pc_counttargeted (struct map_session_data *sd, struct block_list *src, + int target_lv) { - int c=0; - map_foreachinarea(pc_counttargeted_sub, sd->bl.m, - sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE, - sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,0,sd->bl.id,&c,src,target_lv); - return c; + int c = 0; + map_foreachinarea (pc_counttargeted_sub, sd->bl.m, + sd->bl.x - AREA_SIZE, sd->bl.y - AREA_SIZE, + sd->bl.x + AREA_SIZE, sd->bl.y + AREA_SIZE, 0, + sd->bl.id, &c, src, target_lv); + return c; } /*========================================== * ソスソスソス[ソスJソスソスソスvソスソスソスgソス^ソスCソスvソス骭セ (ソスKソスvソスネ包ソスソスフゑソス) *------------------------------------------ */ -static int pc_walktoxy_sub(struct map_session_data *); +static int pc_walktoxy_sub (struct map_session_data *); /*========================================== * saveソスノ必ソスvソスネスソスeソス[ソス^ソスXソスCソスソスソスソスソスsソスネゑソス *------------------------------------------ */ -int pc_makesavestatus(struct map_session_data *sd) -{ - nullpo_retr(0, sd); - - // ソスソスソスフ色ソスヘ色ソスXソスソスソスQソスソスソスソスソスソスソスフで保托ソスソスホ象にはゑソスソスネゑソス - if(!battle_config.save_clothcolor) - sd->status.clothes_color=0; - - // ソスソスソスSソスソスソスヤゑソスソスソスソスソスフゑソスhpソスソス1ソスAソスハ置ソスソスソスZソス[ソスuソス齒奇ソスノ変更 - if(pc_isdead(sd)){ - pc_setrestartvalue(sd,0); - memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point)); - } else { - memcpy(sd->status.last_point.map,sd->mapname,24); - sd->status.last_point.x = sd->bl.x; - sd->status.last_point.y = sd->bl.y; - } +int pc_makesavestatus (struct map_session_data *sd) +{ + nullpo_retr (0, sd); - // ソスZソス[ソスuソスヨ止ソス}ソスbソスvソスソスソスソスソスソスフで指ソスソスソスハ置ソスノ移難ソス - if(map[sd->bl.m].flag.nosave){ - struct map_data *m=&map[sd->bl.m]; - if(strcmp(m->save.map,"SavePoint")==0) - memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point)); - else - memcpy(&sd->status.last_point,&m->save,sizeof(sd->status.last_point)); - } + // ソスソスソスフ色ソスヘ色ソスXソスソスソスQソスソスソスソスソスソスソスフで保托ソスソスホ象にはゑソスソスネゑソス + if (!battle_config.save_clothcolor) + sd->status.clothes_color = 0; + + // ソスソスソスSソスソスソスヤゑソスソスソスソスソスフゑソスhpソスソス1ソスAソスハ置ソスソスソスZソス[ソスuソス齒奇ソスノ変更 + if (pc_isdead (sd)) + { + pc_setrestartvalue (sd, 0); + memcpy (&sd->status.last_point, &sd->status.save_point, + sizeof (sd->status.last_point)); + } + else + { + memcpy (sd->status.last_point.map, sd->mapname, 24); + sd->status.last_point.x = sd->bl.x; + sd->status.last_point.y = sd->bl.y; + } - //ソス}ソスiソス[ソス|ソスCソスソスソスgソスソスソスvソスソスソスXソスソスソスソスソスソス鼾0ソスソス - if(battle_config.muting_players && sd->status.manner > 0) - sd->status.manner = 0; - return 0; + // ソスZソス[ソスuソスヨ止ソス}ソスbソスvソスソスソスソスソスソスフで指ソスソスソスハ置ソスノ移難ソス + if (map[sd->bl.m].flag.nosave) + { + struct map_data *m = &map[sd->bl.m]; + if (strcmp (m->save.map, "SavePoint") == 0) + memcpy (&sd->status.last_point, &sd->status.save_point, + sizeof (sd->status.last_point)); + else + memcpy (&sd->status.last_point, &m->save, + sizeof (sd->status.last_point)); + } + + //ソス}ソスiソス[ソス|ソスCソスソスソスgソスソスソスvソスソスソスXソスソスソスソスソスソス鼾0ソスソス + if (battle_config.muting_players && sd->status.manner > 0) + sd->status.manner = 0; + return 0; } /*========================================== * ソスレ托ソスソスソスソスフ擾ソスソスソスソスソス *------------------------------------------ */ -int pc_setnewpc(struct map_session_data *sd, int account_id, int char_id, int login_id1, int client_tick, int sex, int fd) { - nullpo_retr(0, sd); - - sd->bl.id = account_id; - sd->char_id = char_id; - sd->login_id1 = login_id1; - sd->login_id2 = 0; // at this point, we can not know the value :( - sd->client_tick = client_tick; - sd->sex = sex; - sd->state.auth = 0; - sd->bl.type = BL_PC; - sd->canact_tick = sd->canmove_tick = gettick(); - sd->canlog_tick = gettick(); - sd->state.waitingdisconnect = 0; +int pc_setnewpc (struct map_session_data *sd, int account_id, int char_id, + int login_id1, int client_tick, int sex, int fd) +{ + nullpo_retr (0, sd); + + sd->bl.id = account_id; + sd->char_id = char_id; + sd->login_id1 = login_id1; + sd->login_id2 = 0; // at this point, we can not know the value :( + sd->client_tick = client_tick; + sd->sex = sex; + sd->state.auth = 0; + sd->bl.type = BL_PC; + sd->canact_tick = sd->canmove_tick = gettick (); + sd->canlog_tick = gettick (); + sd->state.waitingdisconnect = 0; - return 0; + return 0; } -int pc_equippoint(struct map_session_data *sd,int n) +int pc_equippoint (struct map_session_data *sd, int n) { - int ep = 0; - //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス - struct pc_base_job s_class; + int ep = 0; + //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス + struct pc_base_job s_class; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if (!sd->inventory_data[n]) - return 0; + if (!sd->inventory_data[n]) + return 0; - s_class = pc_calc_base_job(sd->status.class); + s_class = pc_calc_base_job (sd->status.class); - ep = sd->inventory_data[n]->equip; - if((sd->inventory_data[n]->look == 1 || sd->inventory_data[n]->look == 2 || sd->inventory_data[n]->look == 6) && - (ep == 2 && (pc_checkskill(sd,AS_LEFT) > 0 || s_class.job == 12))) { - return 34; - } + ep = sd->inventory_data[n]->equip; + if ((sd->inventory_data[n]->look == 1 || sd->inventory_data[n]->look == 2 + || sd->inventory_data[n]->look == 6) && (ep == 2 + && + (pc_checkskill (sd, AS_LEFT) + > 0 || s_class.job == 12))) + { + return 34; + } - return ep; + return ep; } -int pc_setinventorydata(struct map_session_data *sd) +int pc_setinventorydata (struct map_session_data *sd) { - int i,id; + int i, id; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - for(i=0;i<MAX_INVENTORY;i++) { - id = sd->status.inventory[i].nameid; - sd->inventory_data[i] = itemdb_search(id); - } - return 0; -} - -int pc_calcweapontype(struct map_session_data *sd) -{ - nullpo_retr(0, sd); - - if(sd->weapontype1 != 0 && sd->weapontype2 == 0) - sd->status.weapon = sd->weapontype1; - if(sd->weapontype1 == 0 && sd->weapontype2 != 0)// ソスソスソス阨撰ソスソス Only - sd->status.weapon = sd->weapontype2; - else if(sd->weapontype1 == 1 && sd->weapontype2 == 1)// ソスoソスZソスソス - sd->status.weapon = 0x11; - else if(sd->weapontype1 == 2 && sd->weapontype2 == 2)// ソスoソスPソス闌 - sd->status.weapon = 0x12; - else if(sd->weapontype1 == 6 && sd->weapontype2 == 6)// ソスoソスPソス阨 - sd->status.weapon = 0x13; - else if( (sd->weapontype1 == 1 && sd->weapontype2 == 2) || - (sd->weapontype1 == 2 && sd->weapontype2 == 1) ) // ソスZソスソス - ソスPソス闌 - sd->status.weapon = 0x14; - else if( (sd->weapontype1 == 1 && sd->weapontype2 == 6) || - (sd->weapontype1 == 6 && sd->weapontype2 == 1) ) // ソスZソスソス - ソスソス - sd->status.weapon = 0x15; - else if( (sd->weapontype1 == 2 && sd->weapontype2 == 6) || - (sd->weapontype1 == 6 && sd->weapontype2 == 2) ) // ソスPソス闌 - ソスソス - sd->status.weapon = 0x16; - else - sd->status.weapon = sd->weapontype1; - - return 0; -} - -int pc_setequipindex(struct map_session_data *sd) -{ - int i,j; - - nullpo_retr(0, sd); - - for(i=0;i<11;i++) - sd->equip_index[i] = -1; - - for(i=0;i<MAX_INVENTORY;i++) { - if(sd->status.inventory[i].nameid <= 0) - continue; - if(sd->status.inventory[i].equip) { - for(j=0;j<11;j++) - if(sd->status.inventory[i].equip & equip_pos[j]) - sd->equip_index[j] = i; - if(sd->status.inventory[i].equip & 0x0002) { - if(sd->inventory_data[i]) - sd->weapontype1 = sd->inventory_data[i]->look; - else - sd->weapontype1 = 0; - } - if(sd->status.inventory[i].equip & 0x0020) { - if(sd->inventory_data[i]) { - if(sd->inventory_data[i]->type == 4) { - if(sd->status.inventory[i].equip == 0x0020) - sd->weapontype2 = sd->inventory_data[i]->look; - else - sd->weapontype2 = 0; - } - else - sd->weapontype2 = 0; - } - else - sd->weapontype2 = 0; - } - } - } - pc_calcweapontype(sd); + for (i = 0; i < MAX_INVENTORY; i++) + { + id = sd->status.inventory[i].nameid; + sd->inventory_data[i] = itemdb_search (id); + } + return 0; +} + +int pc_calcweapontype (struct map_session_data *sd) +{ + nullpo_retr (0, sd); + + if (sd->weapontype1 != 0 && sd->weapontype2 == 0) + sd->status.weapon = sd->weapontype1; + if (sd->weapontype1 == 0 && sd->weapontype2 != 0) // ソスソスソス阨撰ソスソス Only + sd->status.weapon = sd->weapontype2; + else if (sd->weapontype1 == 1 && sd->weapontype2 == 1) // ソスoソスZソスソス + sd->status.weapon = 0x11; + else if (sd->weapontype1 == 2 && sd->weapontype2 == 2) // ソスoソスPソス闌 + sd->status.weapon = 0x12; + else if (sd->weapontype1 == 6 && sd->weapontype2 == 6) // ソスoソスPソス阨 + sd->status.weapon = 0x13; + else if ((sd->weapontype1 == 1 && sd->weapontype2 == 2) || (sd->weapontype1 == 2 && sd->weapontype2 == 1)) // ソスZソスソス - ソスPソス闌 + sd->status.weapon = 0x14; + else if ((sd->weapontype1 == 1 && sd->weapontype2 == 6) || (sd->weapontype1 == 6 && sd->weapontype2 == 1)) // ソスZソスソス - ソスソス + sd->status.weapon = 0x15; + else if ((sd->weapontype1 == 2 && sd->weapontype2 == 6) || (sd->weapontype1 == 6 && sd->weapontype2 == 2)) // ソスPソス闌 - ソスソス + sd->status.weapon = 0x16; + else + sd->status.weapon = sd->weapontype1; - return 0; + return 0; } -int pc_isequip(struct map_session_data *sd,int n) +int pc_setequipindex (struct map_session_data *sd) { - struct item_data *item; - struct status_change *sc_data; - //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス + int i, j; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - item = sd->inventory_data[n]; - sc_data = battle_get_sc_data(&sd->bl); - //s_class = pc_calc_base_job(sd->status.class); + for (i = 0; i < 11; i++) + sd->equip_index[i] = -1; - if( battle_config.gm_allequip>0 && pc_isGM(sd)>=battle_config.gm_allequip ) - return 1; + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid <= 0) + continue; + if (sd->status.inventory[i].equip) + { + for (j = 0; j < 11; j++) + if (sd->status.inventory[i].equip & equip_pos[j]) + sd->equip_index[j] = i; + if (sd->status.inventory[i].equip & 0x0002) + { + if (sd->inventory_data[i]) + sd->weapontype1 = sd->inventory_data[i]->look; + else + sd->weapontype1 = 0; + } + if (sd->status.inventory[i].equip & 0x0020) + { + if (sd->inventory_data[i]) + { + if (sd->inventory_data[i]->type == 4) + { + if (sd->status.inventory[i].equip == 0x0020) + sd->weapontype2 = sd->inventory_data[i]->look; + else + sd->weapontype2 = 0; + } + else + sd->weapontype2 = 0; + } + else + sd->weapontype2 = 0; + } + } + } + pc_calcweapontype (sd); - if(item == NULL) - return 0; - if(item->sex != 2 && sd->status.sex != item->sex) - return 0; - if(item->elv > 0 && sd->status.base_level < item->elv) - return 0; + return 0; +} - if(map[sd->bl.m].flag.pvp && (item->flag.no_equip==1 || item->flag.no_equip==3)) - return 0; - if(map[sd->bl.m].flag.gvg && (item->flag.no_equip==2 || item->flag.no_equip==3)) - return 0; - if(item->equip & 0x0002 && sc_data && sc_data[SC_STRIPWEAPON].timer != -1) - return 0; - if(item->equip & 0x0020 && sc_data && sc_data[SC_STRIPSHIELD].timer != -1) - return 0; - if(item->equip & 0x0010 && sc_data && sc_data[SC_STRIPARMOR].timer != -1) - return 0; - if(item->equip & 0x0100 && sc_data && sc_data[SC_STRIPHELM].timer != -1) - return 0; - return 1; +int pc_isequip (struct map_session_data *sd, int n) +{ + struct item_data *item; + struct status_change *sc_data; + //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス + + nullpo_retr (0, sd); + + item = sd->inventory_data[n]; + sc_data = battle_get_sc_data (&sd->bl); + //s_class = pc_calc_base_job(sd->status.class); + + if (battle_config.gm_allequip > 0 + && pc_isGM (sd) >= battle_config.gm_allequip) + return 1; + + if (item == NULL) + return 0; + if (item->sex != 2 && sd->status.sex != item->sex) + return 0; + if (item->elv > 0 && sd->status.base_level < item->elv) + return 0; + + if (map[sd->bl.m].flag.pvp + && (item->flag.no_equip == 1 || item->flag.no_equip == 3)) + return 0; + if (map[sd->bl.m].flag.gvg + && (item->flag.no_equip == 2 || item->flag.no_equip == 3)) + return 0; + if (item->equip & 0x0002 && sc_data + && sc_data[SC_STRIPWEAPON].timer != -1) + return 0; + if (item->equip & 0x0020 && sc_data + && sc_data[SC_STRIPSHIELD].timer != -1) + return 0; + if (item->equip & 0x0010 && sc_data && sc_data[SC_STRIPARMOR].timer != -1) + return 0; + if (item->equip & 0x0100 && sc_data && sc_data[SC_STRIPHELM].timer != -1) + return 0; + return 1; } /*========================================== * Weapon Breaking [Valaris] *------------------------------------------ */ -int pc_breakweapon(struct map_session_data *sd) +int pc_breakweapon (struct map_session_data *sd) { - struct item_data* item; - char output[255]; - int i; + struct item_data *item; + char output[255]; + int i; - if(sd==NULL) - return -1; - if(sd->unbreakable>=MRAND(100)) - return 0; - if(sd->sc_data && sd->sc_data[SC_CP_WEAPON].timer != -1) - return 0; + if (sd == NULL) + return -1; + if (sd->unbreakable >= MRAND (100)) + return 0; + if (sd->sc_data && sd->sc_data[SC_CP_WEAPON].timer != -1) + return 0; - for(i=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0002 && !sd->status.inventory[i].broken){ - item=sd->inventory_data[i]; - sd->status.inventory[i].broken=1; - //pc_unequipitem(sd,i,0); - if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0002 && - sd->status.inventory[i].broken==1){ - sprintf(output, "%s has broken.",item->jname); - clif_emotion(&sd->bl,23); - clif_displaymessage(sd->fd, output); - clif_equiplist(sd); - skill_status_change_start(&sd->bl,SC_BROKNWEAPON,0,0,0,0,0,0); - } - } - if(sd->status.inventory[i].broken==1) - return 0; - } - - return 0; + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].equip + && sd->status.inventory[i].equip & 0x0002 + && !sd->status.inventory[i].broken) + { + item = sd->inventory_data[i]; + sd->status.inventory[i].broken = 1; + //pc_unequipitem(sd,i,0); + if (sd->status.inventory[i].equip + && sd->status.inventory[i].equip & 0x0002 + && sd->status.inventory[i].broken == 1) + { + sprintf (output, "%s has broken.", item->jname); + clif_emotion (&sd->bl, 23); + clif_displaymessage (sd->fd, output); + clif_equiplist (sd); + skill_status_change_start (&sd->bl, SC_BROKNWEAPON, 0, 0, 0, + 0, 0, 0); + } + } + if (sd->status.inventory[i].broken == 1) + return 0; + } + + return 0; } + /*========================================== * Armor Breaking [Valaris] *------------------------------------------ */ -int pc_breakarmor(struct map_session_data *sd) +int pc_breakarmor (struct map_session_data *sd) { - struct item_data* item; - char output[255]; - int i; + struct item_data *item; + char output[255]; + int i; - if(sd==NULL) - return -1; - if(sd->unbreakable>=MRAND(100)) - return 0; - if(sd->sc_data && sd->sc_data[SC_CP_ARMOR].timer != -1) - return 0; + if (sd == NULL) + return -1; + if (sd->unbreakable >= MRAND (100)) + return 0; + if (sd->sc_data && sd->sc_data[SC_CP_ARMOR].timer != -1) + return 0; - for(i=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0010 && !sd->status.inventory[i].broken){ - item=sd->inventory_data[i]; - sd->status.inventory[i].broken=1; - //pc_unequipitem(sd,i,0); - if(sd->status.inventory[i].equip && sd->status.inventory[i].equip & 0x0010 && - sd->status.inventory[i].broken==1){ - sprintf(output, "%s has broken.",item->jname); - clif_emotion(&sd->bl,23); - clif_displaymessage(sd->fd, output); - clif_equiplist(sd); - skill_status_change_start(&sd->bl,SC_BROKNARMOR,0,0,0,0,0,0); - } - } - if(sd->status.inventory[i].broken==1) - return 0; - } - return 0; + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].equip + && sd->status.inventory[i].equip & 0x0010 + && !sd->status.inventory[i].broken) + { + item = sd->inventory_data[i]; + sd->status.inventory[i].broken = 1; + //pc_unequipitem(sd,i,0); + if (sd->status.inventory[i].equip + && sd->status.inventory[i].equip & 0x0010 + && sd->status.inventory[i].broken == 1) + { + sprintf (output, "%s has broken.", item->jname); + clif_emotion (&sd->bl, 23); + clif_displaymessage (sd->fd, output); + clif_equiplist (sd); + skill_status_change_start (&sd->bl, SC_BROKNARMOR, 0, 0, 0, 0, + 0, 0); + } + } + if (sd->status.inventory[i].broken == 1) + return 0; + } + return 0; } + /*========================================== * session idソスノ厄ソスソス阮ウソスソス * charソスIソスソスソス迹暦ソスソスソスソスソストゑソスソスソスソスXソスeソス[ソス^ソスXソスソスソスン抵ソス *------------------------------------------ */ -int pc_authok(int id, int login_id2, time_t connect_until_time, short tmw_version, struct mmo_charstatus *st) +int pc_authok (int id, int login_id2, time_t connect_until_time, + short tmw_version, struct mmo_charstatus *st) { - struct map_session_data *sd = NULL; + struct map_session_data *sd = NULL; - struct party *p; - struct guild *g; - int i; - unsigned long tick = gettick(); + struct party *p; + struct guild *g; + int i; + unsigned long tick = gettick (); - sd = map_id2sd(id); - if(sd==NULL) - return 1; + sd = map_id2sd (id); + if (sd == NULL) + return 1; - sd->login_id2 = login_id2; - sd->tmw_version = tmw_version; + sd->login_id2 = login_id2; + sd->tmw_version = tmw_version; - memcpy(&sd->status, st, sizeof(*st)); + memcpy (&sd->status, st, sizeof (*st)); - if (sd->status.sex != sd->sex) { - clif_authfail_fd(sd->fd, 0); - return 1; - } + if (sd->status.sex != sd->sex) + { + clif_authfail_fd (sd->fd, 0); + return 1; + } - MAP_LOG_STATS(sd, "LOGIN"); - MAP_LOG_XP(sd, "LOGIN"); - MAP_LOG_MAGIC(sd, "LOGIN"); - - memset(&sd->state, 0, sizeof(sd->state)); - // ソスソスソス{ソスIソスネ擾ソスソスソスソスソス - sd->state.connect_new = 1; - sd->bl.prev = sd->bl.next = NULL; - - sd->weapontype1 = sd->weapontype2 = 0; - sd->view_class = sd->status.class; - sd->speed = DEFAULT_WALK_SPEED; - sd->state.dead_sit = 0; - sd->dir = 0; - sd->head_dir = 0; - sd->state.auth = 1; - sd->walktimer = -1; - sd->attacktimer = -1; - sd->followtimer = -1; // [MouseJstr] - sd->skilltimer = -1; - sd->skillitem = -1; - sd->skillitemlv = -1; - sd->invincible_timer = -1; - sd->sg_count = 0; - - sd->deal_locked = 0; - sd->trade_partner = 0; - - sd->inchealhptick = 0; - sd->inchealsptick = 0; - sd->hp_sub = 0; - sd->sp_sub = 0; - sd->quick_regeneration_hp.amount = 0; - sd->quick_regeneration_sp.amount = 0; - sd->heal_xp = 0; - sd->inchealspirithptick = 0; - sd->inchealspiritsptick = 0; - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->attackabletime = tick; - sd->cast_tick = tick; - - sd->doridori_counter = 0; - - sd->spiritball = 0; - for(i = 0; i < MAX_SKILL_LEVEL; i++) - sd->spirit_timer[i] = -1; - for(i = 0; i < MAX_SKILLTIMERSKILL; i++) - sd->skilltimerskill[i].timer = -1; - - memset(&sd->dev,0,sizeof(struct square)); - for(i = 0; i < 5; i++) { - sd->dev.val1[i] = 0; - sd->dev.val2[i] = 0; - } - - // ソスAソスJソスEソスソスソスgソスマ撰ソスソスフ托ソスソスMソスvソスソス - intif_request_accountreg(sd); - - // ソスAソスCソスeソスソスソス`ソスFソスbソスN - pc_setinventorydata(sd); - pc_checkitem(sd); - - // ソスXソスeソス[ソス^ソスXソスル擾ソスソスフ擾ソスソスソスソスソス - for(i = 0; i < MAX_STATUSCHANGE; i++) { - sd->sc_data[i].timer=-1; - sd->sc_data[i].val1 = sd->sc_data[i].val2 = sd->sc_data[i].val3 = sd->sc_data[i].val4 = 0; - } - sd->sc_count=0; - if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && - (pc_isGM(sd) >= get_atcommand_level(AtCommand_Hide))) - sd->status.option &= (OPTION_MASK | OPTION_HIDE); - else - sd->status.option &= OPTION_MASK; - - // ソスXソスLソスソスソスソスソスjソスbソスgソスヨ係ソスフ擾ソスソスソスソスソス - memset(sd->skillunit, 0, sizeof(sd->skillunit)); - memset(sd->skillunittick, 0, sizeof(sd->skillunittick)); - - // init ignore list - memset(sd->ignore, 0, sizeof(sd->ignore)); - - // ソスpソス[ソスeソスBソス[ソスヨ係ソスフ擾ソスソスソスソスソス - sd->party_sended = 0; - sd->party_invite = 0; - sd->party_x = -1; - sd->party_y = -1; - sd->party_hp = -1; - - // ソスMソスソスソスhソスヨ係ソスフ擾ソスソスソスソスソス - sd->guild_sended = 0; - sd->guild_invite = 0; - sd->guild_alliance = 0; - - // ソスCソスxソスソスソスgソスヨ係ソスフ擾ソスソスソスソスソス - memset(sd->eventqueue, 0, sizeof(sd->eventqueue)); - for(i = 0; i < MAX_EVENTTIMER; i++) - sd->eventtimer[i] = -1; - - // ソスハ置ソスフ設抵ソス - pc_setpos(sd,sd->status.last_point.map, sd->status.last_point.x, sd->status.last_point.y, 0); - - // ソスpソス[ソスeソスBソスAソスMソスソスソスhソスfソス[ソス^ソスフ要ソスソス - if (sd->status.party_id > 0 && (p = party_search(sd->status.party_id)) == NULL) - party_request_info(sd->status.party_id); - if (sd->status.guild_id > 0 && (g = guild_search(sd->status.guild_id)) == NULL) - guild_request_info(sd->status.guild_id); - - // pvpソスフ設抵ソス - sd->pvp_rank = 0; - sd->pvp_point = 0; - sd->pvp_timer = -1; - - // ソスハ知 - - clif_authok(sd); - map_addnickdb(sd); - if (map_charid2nick(sd->status.char_id) == NULL) - map_addchariddb(sd->status.char_id, sd->status.name); - - //ソスXソスpソスmソスrソスpソスソスソスノカソスEソスソスソス^ソス[ソスフスソスNソスソスソスvソスgソスマ撰ソスソスソスソスソスソスフ読み出ソスソスソスソスsdソスヨのセソスbソスg - sd->die_counter = pc_readglobalreg(sd,"PC_DIE_COUNTER"); - - if (night_flag == 1) { - char tmpstr[1024]; - strcpy(tmpstr, msg_txt(500)); // Actually, it's the night... - clif_wis_message(sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1); - sd->opt2 |= STATE_BLIND; - } + MAP_LOG_STATS (sd, "LOGIN"); + MAP_LOG_XP (sd, "LOGIN"); + MAP_LOG_MAGIC (sd, "LOGIN"); + + memset (&sd->state, 0, sizeof (sd->state)); + // ソスソスソス{ソスIソスネ擾ソスソスソスソスソス + sd->state.connect_new = 1; + sd->bl.prev = sd->bl.next = NULL; + + sd->weapontype1 = sd->weapontype2 = 0; + sd->view_class = sd->status.class; + sd->speed = DEFAULT_WALK_SPEED; + sd->state.dead_sit = 0; + sd->dir = 0; + sd->head_dir = 0; + sd->state.auth = 1; + sd->walktimer = -1; + sd->attacktimer = -1; + sd->followtimer = -1; // [MouseJstr] + sd->skilltimer = -1; + sd->skillitem = -1; + sd->skillitemlv = -1; + sd->invincible_timer = -1; + sd->sg_count = 0; + + sd->deal_locked = 0; + sd->trade_partner = 0; + + sd->inchealhptick = 0; + sd->inchealsptick = 0; + sd->hp_sub = 0; + sd->sp_sub = 0; + sd->quick_regeneration_hp.amount = 0; + sd->quick_regeneration_sp.amount = 0; + sd->heal_xp = 0; + sd->inchealspirithptick = 0; + sd->inchealspiritsptick = 0; + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->attackabletime = tick; + sd->cast_tick = tick; + + sd->doridori_counter = 0; + + sd->spiritball = 0; + for (i = 0; i < MAX_SKILL_LEVEL; i++) + sd->spirit_timer[i] = -1; + for (i = 0; i < MAX_SKILLTIMERSKILL; i++) + sd->skilltimerskill[i].timer = -1; + + memset (&sd->dev, 0, sizeof (struct square)); + for (i = 0; i < 5; i++) + { + sd->dev.val1[i] = 0; + sd->dev.val2[i] = 0; + } - // ソスXソスeソス[ソス^ソスXソスソスソスソスソスvソスZソスネゑソス - pc_calcstatus(sd,1); + // ソスAソスJソスEソスソスソスgソスマ撰ソスソスフ托ソスソスMソスvソスソス + intif_request_accountreg (sd); - if (pc_isGM(sd)) - { - printf("Connection accepted: character '%s' (account: %d; GM level %d).\n", sd->status.name, sd->status.account_id, pc_isGM(sd)); - clif_updatestatus(sd, SP_GM); - } - else - printf("Connection accepted: Character '%s' (account: %d).\n", sd->status.name, sd->status.account_id); - - // Message of the Dayソスフ托ソスソスM - { - char buf[256]; - FILE *fp; - if ((fp = fopen_(motd_txt, "r")) != NULL) { - while (fgets(buf, sizeof(buf)-1, fp) != NULL) { - int i; - for(i=0; buf[i]; i++) { - if (buf[i] == '\r' || buf[i]== '\n') { - buf[i] = 0; - break; - } - } - clif_displaymessage(sd->fd, buf); - } - fclose_(fp); - } - } + // ソスAソスCソスeソスソスソス`ソスFソスbソスN + pc_setinventorydata (sd); + pc_checkitem (sd); - sd->auto_ban_info.in_progress = 0; + // ソスXソスeソス[ソス^ソスXソスル擾ソスソスフ擾ソスソスソスソスソス + for (i = 0; i < MAX_STATUSCHANGE; i++) + { + sd->sc_data[i].timer = -1; + sd->sc_data[i].val1 = sd->sc_data[i].val2 = sd->sc_data[i].val3 = + sd->sc_data[i].val4 = 0; + } + sd->sc_count = 0; + if ((battle_config.atc_gmonly == 0 || pc_isGM (sd)) && + (pc_isGM (sd) >= get_atcommand_level (AtCommand_Hide))) + sd->status.option &= (OPTION_MASK | OPTION_HIDE); + else + sd->status.option &= OPTION_MASK; + + // ソスXソスLソスソスソスソスソスjソスbソスgソスヨ係ソスフ擾ソスソスソスソスソス + memset (sd->skillunit, 0, sizeof (sd->skillunit)); + memset (sd->skillunittick, 0, sizeof (sd->skillunittick)); + + // init ignore list + memset (sd->ignore, 0, sizeof (sd->ignore)); + + // ソスpソス[ソスeソスBソス[ソスヨ係ソスフ擾ソスソスソスソスソス + sd->party_sended = 0; + sd->party_invite = 0; + sd->party_x = -1; + sd->party_y = -1; + sd->party_hp = -1; + + // ソスMソスソスソスhソスヨ係ソスフ擾ソスソスソスソスソス + sd->guild_sended = 0; + sd->guild_invite = 0; + sd->guild_alliance = 0; + + // ソスCソスxソスソスソスgソスヨ係ソスフ擾ソスソスソスソスソス + memset (sd->eventqueue, 0, sizeof (sd->eventqueue)); + for (i = 0; i < MAX_EVENTTIMER; i++) + sd->eventtimer[i] = -1; + + // ソスハ置ソスフ設抵ソス + pc_setpos (sd, sd->status.last_point.map, sd->status.last_point.x, + sd->status.last_point.y, 0); + + // ソスpソス[ソスeソスBソスAソスMソスソスソスhソスfソス[ソス^ソスフ要ソスソス + if (sd->status.party_id > 0 + && (p = party_search (sd->status.party_id)) == NULL) + party_request_info (sd->status.party_id); + if (sd->status.guild_id > 0 + && (g = guild_search (sd->status.guild_id)) == NULL) + guild_request_info (sd->status.guild_id); + + // pvpソスフ設抵ソス + sd->pvp_rank = 0; + sd->pvp_point = 0; + sd->pvp_timer = -1; + + // ソスハ知 + + clif_authok (sd); + map_addnickdb (sd); + if (map_charid2nick (sd->status.char_id) == NULL) + map_addchariddb (sd->status.char_id, sd->status.name); + + //ソスXソスpソスmソスrソスpソスソスソスノカソスEソスソスソス^ソス[ソスフスソスNソスソスソスvソスgソスマ撰ソスソスソスソスソスソスフ読み出ソスソスソスソスsdソスヨのセソスbソスg + sd->die_counter = pc_readglobalreg (sd, "PC_DIE_COUNTER"); + + if (night_flag == 1) + { + char tmpstr[1024]; + strcpy (tmpstr, msg_txt (500)); // Actually, it's the night... + clif_wis_message (sd->fd, wisp_server_name, tmpstr, + strlen (tmpstr) + 1); + sd->opt2 |= STATE_BLIND; + } - // Initialize antispam vars - sd->chat_reset_due = sd->chat_lines_in = sd->chat_total_repeats = sd->chat_repeat_reset_due = 0; - sd->chat_lastmsg[0] = '\0'; - sd->trade_reset_due = sd->trades_in = 0; - sd->sit_reset_due = sd->sits_in = 0; + // ソスXソスeソス[ソス^ソスXソスソスソスソスソスvソスZソスネゑソス + pc_calcstatus (sd, 1); - // message of the limited time of the account - if (connect_until_time != 0) { // don't display if it's unlimited or unknow value - char tmpstr[1024]; - strftime(tmpstr, sizeof(tmpstr) - 1, msg_txt(501), gmtime(&connect_until_time)); // "Your account time limit is: %d-%m-%Y %H:%M:%S." - clif_wis_message(sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1); - } - pc_calcstatus(sd,1); + if (pc_isGM (sd)) + { + printf + ("Connection accepted: character '%s' (account: %d; GM level %d).\n", + sd->status.name, sd->status.account_id, pc_isGM (sd)); + clif_updatestatus (sd, SP_GM); + } + else + printf ("Connection accepted: Character '%s' (account: %d).\n", + sd->status.name, sd->status.account_id); + + // Message of the Dayソスフ托ソスソスM + { + char buf[256]; + FILE *fp; + if ((fp = fopen_ (motd_txt, "r")) != NULL) + { + while (fgets (buf, sizeof (buf) - 1, fp) != NULL) + { + int i; + for (i = 0; buf[i]; i++) + { + if (buf[i] == '\r' || buf[i] == '\n') + { + buf[i] = 0; + break; + } + } + clif_displaymessage (sd->fd, buf); + } + fclose_ (fp); + } + } + + sd->auto_ban_info.in_progress = 0; + + // Initialize antispam vars + sd->chat_reset_due = sd->chat_lines_in = sd->chat_total_repeats = + sd->chat_repeat_reset_due = 0; + sd->chat_lastmsg[0] = '\0'; + sd->trade_reset_due = sd->trades_in = 0; + sd->sit_reset_due = sd->sits_in = 0; + + // message of the limited time of the account + if (connect_until_time != 0) + { // don't display if it's unlimited or unknow value + char tmpstr[1024]; + strftime (tmpstr, sizeof (tmpstr) - 1, msg_txt (501), gmtime (&connect_until_time)); // "Your account time limit is: %d-%m-%Y %H:%M:%S." + clif_wis_message (sd->fd, wisp_server_name, tmpstr, + strlen (tmpstr) + 1); + } + pc_calcstatus (sd, 1); - return 0; + return 0; } /*========================================== * session idソスノ厄ソスソス閧ソスソスソスネので鯉ソスソスnソスソス *------------------------------------------ */ -int pc_authfail(int id) { - struct map_session_data *sd; +int pc_authfail (int id) +{ + struct map_session_data *sd; - sd = map_id2sd(id); - if (sd == NULL) - return 1; + sd = map_id2sd (id); + if (sd == NULL) + return 1; - clif_authfail_fd(sd->fd, 0); + clif_authfail_fd (sd->fd, 0); - return 0; + return 0; } -static int pc_calc_skillpoint(struct map_session_data* sd) +static int pc_calc_skillpoint (struct map_session_data *sd) { - int i, skill_points = 0; + int i, skill_points = 0; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - for (i = 0; i < skill_pool_skills_size; i++) { - int lv = sd->status.skill[skill_pool_skills[i]].lv; - if (lv) - skill_points += ((lv * (lv + 1)) >> 1) - 1; - } + for (i = 0; i < skill_pool_skills_size; i++) + { + int lv = sd->status.skill[skill_pool_skills[i]].lv; + if (lv) + skill_points += ((lv * (lv + 1)) >> 1) - 1; + } - return skill_points; + return skill_points; } /*========================================== * ソスoソスソスソスソスソスソスソスソスソスXソスLソスソスソスフ計ソスZ *------------------------------------------ */ -int pc_calc_skilltree(struct map_session_data *sd) -{ - int i,id=0,flag; - int c=0, s=0; - //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス - struct pc_base_job s_class; - - nullpo_retr(0, sd); - - s_class = pc_calc_base_job(sd->status.class); - c = s_class.job; - s = (s_class.upper==1) ? 1 : 0 ; //ソス]ソスソスソスネ外ソスヘ通擾ソスソスフスソスLソスソスソスH - - if((battle_config.skillup_limit) && ((c >= 0 && c < 23) || (c >= 4001 && c < 4023) || (c >= 4023 && c < 4045))) { - int skill_point = pc_calc_skillpoint(sd); - if(skill_point < 9) - c = 0; - else if((sd->status.skill_point >= sd->status.job_level && skill_point < 58) && ((c > 6 && c < 23) || (c > 4007 && c < 4023) || (c > 4029 && c < 4045))) { - switch(c) { - case 7: - case 14: - c = 1; - break; - case 8: - case 15: - c = 4; - break; - case 9: - case 16: - c = 2; - break; - case 10: - case 18: - c = 5; - break; - case 11: - case 19: - case 20: - c = 3; - break; - case 12: - case 17: - c = 6; - break; - case 4008: - case 4015: - c = 4002; - break; - case 4009: - case 4016: - c = 4005; - break; - case 4010: - case 4017: - c = 4003; - break; - case 4011: - case 4019: - c = 4006; - break; - case 4012: - case 4020: - case 4021: - c = 4004; - break; - case 4013: - case 4018: - c = 4007; - break; - case 4030: - case 4037: - c = 4024; - break; - case 4031: - case 4038: - c = 4027; - break; - case 4032: - case 4039: - c = 4025; - break; - case 4033: - case 4040: - c = 4028; - break; - case 4034: - case 4041: - case 4042: - c = 4026; - break; - case 4035: - case 4043: - c = 4029; - break; - - } - } - } +int pc_calc_skilltree (struct map_session_data *sd) +{ + int i, id = 0, flag; + int c = 0, s = 0; + //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス + struct pc_base_job s_class; + + nullpo_retr (0, sd); + + s_class = pc_calc_base_job (sd->status.class); + c = s_class.job; + s = (s_class.upper == 1) ? 1 : 0; //ソス]ソスソスソスネ外ソスヘ通擾ソスソスフスソスLソスソスソスH + + if ((battle_config.skillup_limit) + && ((c >= 0 && c < 23) || (c >= 4001 && c < 4023) + || (c >= 4023 && c < 4045))) + { + int skill_point = pc_calc_skillpoint (sd); + if (skill_point < 9) + c = 0; + else if ((sd->status.skill_point >= sd->status.job_level + && skill_point < 58) && ((c > 6 && c < 23) || (c > 4007 + && c < 4023) + || (c > 4029 && c < 4045))) + { + switch (c) + { + case 7: + case 14: + c = 1; + break; + case 8: + case 15: + c = 4; + break; + case 9: + case 16: + c = 2; + break; + case 10: + case 18: + c = 5; + break; + case 11: + case 19: + case 20: + c = 3; + break; + case 12: + case 17: + c = 6; + break; + case 4008: + case 4015: + c = 4002; + break; + case 4009: + case 4016: + c = 4005; + break; + case 4010: + case 4017: + c = 4003; + break; + case 4011: + case 4019: + c = 4006; + break; + case 4012: + case 4020: + case 4021: + c = 4004; + break; + case 4013: + case 4018: + c = 4007; + break; + case 4030: + case 4037: + c = 4024; + break; + case 4031: + case 4038: + c = 4027; + break; + case 4032: + case 4039: + c = 4025; + break; + case 4033: + case 4040: + c = 4028; + break; + case 4034: + case 4041: + case 4042: + c = 4026; + break; + case 4035: + case 4043: + c = 4029; + break; - /*Comment this out for now, as we manage skills differently - for(i=0;i<MAX_SKILL;i++) - if (i < TMW_MAGIC || i > TMW_MAGIC_END){ // [Fate] This hack gets TMW magic working and persisted without bothering about the skill tree. - if (sd->status.skill[i].flag != 13) sd->status.skill[i].id=0; - if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ // cardソスXソスLソスソスソスネゑソスソスA - sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; // ソス{ソスソスソスソスlvソスソス - sd->status.skill[i].flag=0; // flagソスソス0ソスノゑソスソストゑソスソスソス - } - } - */ - - if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill){ - // ソスSソストのスソスLソスソス - for(i=1;i<158;i++) - sd->status.skill[i].id=i; - for(i=210;i<291;i++) - sd->status.skill[i].id=i; - for(i=304;i<337;i++) - sd->status.skill[i].id=i; - if(battle_config.enable_upper_class){ //confソスナ厄ソスソスソスソスナなゑソスソスソスソスホ読み搾ソスソスソス - for(i=355;i<MAX_SKILL;i++) - sd->status.skill[i].id=i; - } - - }else{ - // ソスハ擾ソスソスフ計ソスZ - do{ - flag=0; - for(i=0;(id=skill_tree[s][c][i].id)>0;i++){ - int j,f=1; - if(!battle_config.skillfree) { - for(j=0;j<5;j++) { - if( skill_tree[s][c][i].need[j].id && - pc_checkskill(sd,skill_tree[s][c][i].need[j].id) < skill_tree[s][c][i].need[j].lv) - f=0; - } - } - if(f && sd->status.skill[id].id==0 ){ - sd->status.skill[id].id=id; - flag=1; - } - } - }while(flag); - } -// if(battle_config.etc_log) -// printf("calc skill_tree\n"); - return 0; + } + } + } + + /*Comment this out for now, as we manage skills differently + * for(i=0;i<MAX_SKILL;i++) + * if (i < TMW_MAGIC || i > TMW_MAGIC_END){ // [Fate] This hack gets TMW magic working and persisted without bothering about the skill tree. + * if (sd->status.skill[i].flag != 13) sd->status.skill[i].id=0; + * if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ // cardソスXソスLソスソスソスネゑソスソスA + * sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; // ソス{ソスソスソスソスlvソスソス + * sd->status.skill[i].flag=0; // flagソスソス0ソスノゑソスソストゑソスソスソス + * } + * } + */ + + if (battle_config.gm_allskill > 0 + && pc_isGM (sd) >= battle_config.gm_allskill) + { + // ソスSソストのスソスLソスソス + for (i = 1; i < 158; i++) + sd->status.skill[i].id = i; + for (i = 210; i < 291; i++) + sd->status.skill[i].id = i; + for (i = 304; i < 337; i++) + sd->status.skill[i].id = i; + if (battle_config.enable_upper_class) + { //confソスナ厄ソスソスソスソスナなゑソスソスソスソスホ読み搾ソスソスソス + for (i = 355; i < MAX_SKILL; i++) + sd->status.skill[i].id = i; + } + + } + else + { + // ソスハ擾ソスソスフ計ソスZ + do + { + flag = 0; + for (i = 0; (id = skill_tree[s][c][i].id) > 0; i++) + { + int j, f = 1; + if (!battle_config.skillfree) + { + for (j = 0; j < 5; j++) + { + if (skill_tree[s][c][i].need[j].id && + pc_checkskill (sd, + skill_tree[s][c][i].need[j].id) < + skill_tree[s][c][i].need[j].lv) + f = 0; + } + } + if (f && sd->status.skill[id].id == 0) + { + sd->status.skill[id].id = id; + flag = 1; + } + } + } + while (flag); + } +// if(battle_config.etc_log) +// printf("calc skill_tree\n"); + return 0; } /*========================================== * ソスdソスハアソスCソスRソスソスソスフ確ソスF *------------------------------------------ */ -int pc_checkweighticon(struct map_session_data *sd) +int pc_checkweighticon (struct map_session_data *sd) { - int flag=0; + int flag = 0; - nullpo_retr(0, sd); + nullpo_retr (0, sd); + if (sd->weight * 2 >= sd->max_weight + && sd->sc_data[SC_FLYING_BACKPACK].timer == -1) + flag = 1; + if (sd->weight * 10 >= sd->max_weight * 9) + flag = 2; - if(sd->weight*2 >= sd->max_weight - && sd->sc_data[SC_FLYING_BACKPACK].timer == -1) - flag=1; - if(sd->weight*10 >= sd->max_weight*9) - flag=2; - - if(flag==1){ - if(sd->sc_data[SC_WEIGHT50].timer==-1) - skill_status_change_start(&sd->bl,SC_WEIGHT50,0,0,0,0,0,0); - }else{ - skill_status_change_end(&sd->bl,SC_WEIGHT50,-1); - } - if(flag==2){ - if(sd->sc_data[SC_WEIGHT90].timer==-1) - skill_status_change_start(&sd->bl,SC_WEIGHT90,0,0,0,0,0,0); - }else{ - skill_status_change_end(&sd->bl,SC_WEIGHT90,-1); - } - return 0; + if (flag == 1) + { + if (sd->sc_data[SC_WEIGHT50].timer == -1) + skill_status_change_start (&sd->bl, SC_WEIGHT50, 0, 0, 0, 0, 0, + 0); + } + else + { + skill_status_change_end (&sd->bl, SC_WEIGHT50, -1); + } + if (flag == 2) + { + if (sd->sc_data[SC_WEIGHT90].timer == -1) + skill_status_change_start (&sd->bl, SC_WEIGHT90, 0, 0, 0, 0, 0, + 0); + } + else + { + skill_status_change_end (&sd->bl, SC_WEIGHT90, -1); + } + return 0; } - -void -pc_set_weapon_look(struct map_session_data* sd) +void pc_set_weapon_look (struct map_session_data *sd) { - if (sd->attack_spell_override) - clif_changelook(&sd->bl, LOOK_WEAPON, sd->attack_spell_look_override); - else - clif_changelook(&sd->bl, LOOK_WEAPON, sd->status.weapon); + if (sd->attack_spell_override) + clif_changelook (&sd->bl, LOOK_WEAPON, + sd->attack_spell_look_override); + else + clif_changelook (&sd->bl, LOOK_WEAPON, sd->status.weapon); } /*========================================== @@ -1092,342 +1233,397 @@ pc_set_weapon_look(struct map_session_data* sd) * ソス\ソスソスソスIソスノ変会ソスソスソスソスソスソスソスソスpソスソスソスソスソス[ソス^ソスヘ趣ソスソスOソスソスsendソスソスソスソスソス謔、ソスソス *------------------------------------------ */ -int pc_calcstatus(struct map_session_data* sd,int first) -{ - int b_speed,b_max_hp,b_max_sp,b_hp,b_sp,b_weight,b_max_weight,b_paramb[6],b_parame[6],b_hit,b_flee; - int b_aspd,b_watk,b_def,b_watk2,b_def2,b_flee2,b_critical,b_attackrange,b_matk1,b_matk2,b_mdef,b_mdef2,b_class; - int b_base_atk; - struct skill b_skill[MAX_SKILL]; - int i,bl,index; - int skill,aspd_rate,wele,wele_,def_ele,refinedef=0; - int str,dstr,dex; - struct pc_base_job s_class; - - nullpo_retr(0, sd); - - //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス - s_class = pc_calc_base_job(sd->status.class); - - b_speed = sd->speed; - b_max_hp = sd->status.max_hp; - b_max_sp = sd->status.max_sp; - b_hp = sd->status.hp; - b_sp = sd->status.sp; - b_weight = sd->weight; - b_max_weight = sd->max_weight; - memcpy(b_paramb,&sd->paramb,sizeof(b_paramb)); - memcpy(b_parame,&sd->paramc,sizeof(b_parame)); - memcpy(b_skill,&sd->status.skill,sizeof(b_skill)); - b_hit = sd->hit; - b_flee = sd->flee; - b_aspd = sd->aspd; - b_watk = sd->watk; - b_def = sd->def; - b_watk2 = sd->watk2; - b_def2 = sd->def2; - b_flee2 = sd->flee2; - b_critical = sd->critical; - b_attackrange = sd->attackrange; - b_matk1 = sd->matk1; - b_matk2 = sd->matk2; - b_mdef = sd->mdef; - b_mdef2 = sd->mdef2; - b_class = sd->view_class; - sd->view_class = sd->status.class; - b_base_atk = sd->base_atk; - - pc_calc_skilltree(sd); // ソスXソスLソスソスソスcソスソスソス[ソスフ計ソスZ - - sd->max_weight = max_weight_base[s_class.job]+sd->status.str*300; - - if(first&1) { - sd->weight=0; - for(i=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].nameid==0 || sd->inventory_data[i] == NULL) - continue; - sd->weight += sd->inventory_data[i]->weight*sd->status.inventory[i].amount; - } - sd->cart_max_weight=battle_config.max_cart_weight; - sd->cart_weight=0; - sd->cart_max_num=MAX_CART; - sd->cart_num=0; - for(i=0;i<MAX_CART;i++){ - if(sd->status.cart[i].nameid==0) - continue; - sd->cart_weight+=itemdb_weight(sd->status.cart[i].nameid)*sd->status.cart[i].amount; - sd->cart_num++; - } - } +int pc_calcstatus (struct map_session_data *sd, int first) +{ + int b_speed, b_max_hp, b_max_sp, b_hp, b_sp, b_weight, b_max_weight, + b_paramb[6], b_parame[6], b_hit, b_flee; + int b_aspd, b_watk, b_def, b_watk2, b_def2, b_flee2, b_critical, + b_attackrange, b_matk1, b_matk2, b_mdef, b_mdef2, b_class; + int b_base_atk; + struct skill b_skill[MAX_SKILL]; + int i, bl, index; + int skill, aspd_rate, wele, wele_, def_ele, refinedef = 0; + int str, dstr, dex; + struct pc_base_job s_class; + + nullpo_retr (0, sd); + + //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス + s_class = pc_calc_base_job (sd->status.class); + + b_speed = sd->speed; + b_max_hp = sd->status.max_hp; + b_max_sp = sd->status.max_sp; + b_hp = sd->status.hp; + b_sp = sd->status.sp; + b_weight = sd->weight; + b_max_weight = sd->max_weight; + memcpy (b_paramb, &sd->paramb, sizeof (b_paramb)); + memcpy (b_parame, &sd->paramc, sizeof (b_parame)); + memcpy (b_skill, &sd->status.skill, sizeof (b_skill)); + b_hit = sd->hit; + b_flee = sd->flee; + b_aspd = sd->aspd; + b_watk = sd->watk; + b_def = sd->def; + b_watk2 = sd->watk2; + b_def2 = sd->def2; + b_flee2 = sd->flee2; + b_critical = sd->critical; + b_attackrange = sd->attackrange; + b_matk1 = sd->matk1; + b_matk2 = sd->matk2; + b_mdef = sd->mdef; + b_mdef2 = sd->mdef2; + b_class = sd->view_class; + sd->view_class = sd->status.class; + b_base_atk = sd->base_atk; + + pc_calc_skilltree (sd); // ソスXソスLソスソスソスcソスソスソス[ソスフ計ソスZ + + sd->max_weight = max_weight_base[s_class.job] + sd->status.str * 300; + + if (first & 1) + { + sd->weight = 0; + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid == 0 + || sd->inventory_data[i] == NULL) + continue; + sd->weight += + sd->inventory_data[i]->weight * + sd->status.inventory[i].amount; + } + sd->cart_max_weight = battle_config.max_cart_weight; + sd->cart_weight = 0; + sd->cart_max_num = MAX_CART; + sd->cart_num = 0; + for (i = 0; i < MAX_CART; i++) + { + if (sd->status.cart[i].nameid == 0) + continue; + sd->cart_weight += + itemdb_weight (sd->status.cart[i].nameid) * + sd->status.cart[i].amount; + sd->cart_num++; + } + } - memset(sd->paramb,0,sizeof(sd->paramb)); - memset(sd->parame,0,sizeof(sd->parame)); - sd->hit = 0; - sd->flee = 0; - sd->flee2 = 0; - sd->critical = 0; - sd->aspd = 0; - sd->watk = 0; - sd->def = 0; - sd->mdef = 0; - sd->watk2 = 0; - sd->def2 = 0; - sd->mdef2 = 0; - sd->status.max_hp = 0; - sd->status.max_sp = 0; - sd->attackrange = 0; - sd->attackrange_ = 0; - sd->atk_ele = 0; - sd->def_ele = 0; - sd->star =0; - sd->overrefine =0; - sd->matk1 =0; - sd->matk2 =0; - sd->speed = DEFAULT_WALK_SPEED ; - sd->hprate=100; - sd->sprate=100; - sd->castrate=100; - sd->dsprate=100; - sd->base_atk=0; - sd->arrow_atk=0; - sd->arrow_ele=0; - sd->arrow_hit=0; - sd->arrow_range=0; - sd->nhealhp=sd->nhealsp=sd->nshealhp=sd->nshealsp=sd->nsshealhp=sd->nsshealsp=0; - memset(sd->addele,0,sizeof(sd->addele)); - memset(sd->addrace,0,sizeof(sd->addrace)); - memset(sd->addsize,0,sizeof(sd->addsize)); - memset(sd->addele_,0,sizeof(sd->addele_)); - memset(sd->addrace_,0,sizeof(sd->addrace_)); - memset(sd->addsize_,0,sizeof(sd->addsize_)); - memset(sd->subele,0,sizeof(sd->subele)); - memset(sd->subrace,0,sizeof(sd->subrace)); - memset(sd->addeff,0,sizeof(sd->addeff)); - memset(sd->addeff2,0,sizeof(sd->addeff2)); - memset(sd->reseff,0,sizeof(sd->reseff)); - memset(&sd->special_state,0,sizeof(sd->special_state)); - memset(sd->weapon_coma_ele,0,sizeof(sd->weapon_coma_ele)); - memset(sd->weapon_coma_race,0,sizeof(sd->weapon_coma_race)); - - sd->watk_ = 0; //ソス刀暦ソスソスp(ソスソス) - sd->watk_2 = 0; - sd->atk_ele_ = 0; - sd->star_ = 0; - sd->overrefine_ = 0; - - sd->aspd_rate = 100; - sd->speed_rate = 100; - sd->hprecov_rate = 100; - sd->sprecov_rate = 100; - sd->critical_def = 0; - sd->double_rate = 0; - sd->near_attack_def_rate = sd->long_attack_def_rate = 0; - sd->atk_rate = sd->matk_rate = 100; - sd->ignore_def_ele = sd->ignore_def_race = 0; - sd->ignore_def_ele_ = sd->ignore_def_race_ = 0; - sd->ignore_mdef_ele = sd->ignore_mdef_race = 0; - sd->arrow_cri = 0; - sd->magic_def_rate = sd->misc_def_rate = 0; - memset(sd->arrow_addele,0,sizeof(sd->arrow_addele)); - memset(sd->arrow_addrace,0,sizeof(sd->arrow_addrace)); - memset(sd->arrow_addsize,0,sizeof(sd->arrow_addsize)); - memset(sd->arrow_addeff,0,sizeof(sd->arrow_addeff)); - memset(sd->arrow_addeff2,0,sizeof(sd->arrow_addeff2)); - memset(sd->magic_addele,0,sizeof(sd->magic_addele)); - memset(sd->magic_addrace,0,sizeof(sd->magic_addrace)); - memset(sd->magic_subrace,0,sizeof(sd->magic_subrace)); - sd->perfect_hit = 0; - sd->critical_rate = sd->hit_rate = sd->flee_rate = sd->flee2_rate = 100; - sd->def_rate = sd->def2_rate = sd->mdef_rate = sd->mdef2_rate = 100; - sd->def_ratio_atk_ele = sd->def_ratio_atk_ele_ = 0; - sd->def_ratio_atk_race = sd->def_ratio_atk_race_ = 0; - sd->get_zeny_num = 0; - sd->add_damage_class_count = sd->add_damage_class_count_ = sd->add_magic_damage_class_count = 0; - sd->add_def_class_count = sd->add_mdef_class_count = 0; - sd->monster_drop_item_count = 0; - memset(sd->add_damage_classrate,0,sizeof(sd->add_damage_classrate)); - memset(sd->add_damage_classrate_,0,sizeof(sd->add_damage_classrate_)); - memset(sd->add_magic_damage_classrate,0,sizeof(sd->add_magic_damage_classrate)); - memset(sd->add_def_classrate,0,sizeof(sd->add_def_classrate)); - memset(sd->add_mdef_classrate,0,sizeof(sd->add_mdef_classrate)); - memset(sd->monster_drop_race,0,sizeof(sd->monster_drop_race)); - memset(sd->monster_drop_itemrate,0,sizeof(sd->monster_drop_itemrate)); - sd->speed_add_rate = sd->aspd_add_rate = 100; - sd->double_add_rate = sd->perfect_hit_add = sd->get_zeny_add_num = 0; - sd->splash_range = sd->splash_add_range = 0; - sd->autospell_id = sd->autospell_lv = sd->autospell_rate = 0; - sd->hp_drain_rate = sd->hp_drain_per = sd->sp_drain_rate = sd->sp_drain_per = 0; - sd->hp_drain_rate_ = sd->hp_drain_per_ = sd->sp_drain_rate_ = sd->sp_drain_per_ = 0; - sd->short_weapon_damage_return = sd->long_weapon_damage_return = 0; - sd->magic_damage_return = 0; //AppleGirl Was Here - sd->random_attack_increase_add = sd->random_attack_increase_per = 0; - - if(!sd->disguiseflag && sd->disguise) { - sd->disguise=0; - pc_set_weapon_look(sd); - clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield); - clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom); - clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top); - clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid); - clif_clearchar(&sd->bl, 9); - pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3); - } + memset (sd->paramb, 0, sizeof (sd->paramb)); + memset (sd->parame, 0, sizeof (sd->parame)); + sd->hit = 0; + sd->flee = 0; + sd->flee2 = 0; + sd->critical = 0; + sd->aspd = 0; + sd->watk = 0; + sd->def = 0; + sd->mdef = 0; + sd->watk2 = 0; + sd->def2 = 0; + sd->mdef2 = 0; + sd->status.max_hp = 0; + sd->status.max_sp = 0; + sd->attackrange = 0; + sd->attackrange_ = 0; + sd->atk_ele = 0; + sd->def_ele = 0; + sd->star = 0; + sd->overrefine = 0; + sd->matk1 = 0; + sd->matk2 = 0; + sd->speed = DEFAULT_WALK_SPEED; + sd->hprate = 100; + sd->sprate = 100; + sd->castrate = 100; + sd->dsprate = 100; + sd->base_atk = 0; + sd->arrow_atk = 0; + sd->arrow_ele = 0; + sd->arrow_hit = 0; + sd->arrow_range = 0; + sd->nhealhp = sd->nhealsp = sd->nshealhp = sd->nshealsp = sd->nsshealhp = + sd->nsshealsp = 0; + memset (sd->addele, 0, sizeof (sd->addele)); + memset (sd->addrace, 0, sizeof (sd->addrace)); + memset (sd->addsize, 0, sizeof (sd->addsize)); + memset (sd->addele_, 0, sizeof (sd->addele_)); + memset (sd->addrace_, 0, sizeof (sd->addrace_)); + memset (sd->addsize_, 0, sizeof (sd->addsize_)); + memset (sd->subele, 0, sizeof (sd->subele)); + memset (sd->subrace, 0, sizeof (sd->subrace)); + memset (sd->addeff, 0, sizeof (sd->addeff)); + memset (sd->addeff2, 0, sizeof (sd->addeff2)); + memset (sd->reseff, 0, sizeof (sd->reseff)); + memset (&sd->special_state, 0, sizeof (sd->special_state)); + memset (sd->weapon_coma_ele, 0, sizeof (sd->weapon_coma_ele)); + memset (sd->weapon_coma_race, 0, sizeof (sd->weapon_coma_race)); + + sd->watk_ = 0; //ソス刀暦ソスソスp(ソスソス) + sd->watk_2 = 0; + sd->atk_ele_ = 0; + sd->star_ = 0; + sd->overrefine_ = 0; + + sd->aspd_rate = 100; + sd->speed_rate = 100; + sd->hprecov_rate = 100; + sd->sprecov_rate = 100; + sd->critical_def = 0; + sd->double_rate = 0; + sd->near_attack_def_rate = sd->long_attack_def_rate = 0; + sd->atk_rate = sd->matk_rate = 100; + sd->ignore_def_ele = sd->ignore_def_race = 0; + sd->ignore_def_ele_ = sd->ignore_def_race_ = 0; + sd->ignore_mdef_ele = sd->ignore_mdef_race = 0; + sd->arrow_cri = 0; + sd->magic_def_rate = sd->misc_def_rate = 0; + memset (sd->arrow_addele, 0, sizeof (sd->arrow_addele)); + memset (sd->arrow_addrace, 0, sizeof (sd->arrow_addrace)); + memset (sd->arrow_addsize, 0, sizeof (sd->arrow_addsize)); + memset (sd->arrow_addeff, 0, sizeof (sd->arrow_addeff)); + memset (sd->arrow_addeff2, 0, sizeof (sd->arrow_addeff2)); + memset (sd->magic_addele, 0, sizeof (sd->magic_addele)); + memset (sd->magic_addrace, 0, sizeof (sd->magic_addrace)); + memset (sd->magic_subrace, 0, sizeof (sd->magic_subrace)); + sd->perfect_hit = 0; + sd->critical_rate = sd->hit_rate = sd->flee_rate = sd->flee2_rate = 100; + sd->def_rate = sd->def2_rate = sd->mdef_rate = sd->mdef2_rate = 100; + sd->def_ratio_atk_ele = sd->def_ratio_atk_ele_ = 0; + sd->def_ratio_atk_race = sd->def_ratio_atk_race_ = 0; + sd->get_zeny_num = 0; + sd->add_damage_class_count = sd->add_damage_class_count_ = + sd->add_magic_damage_class_count = 0; + sd->add_def_class_count = sd->add_mdef_class_count = 0; + sd->monster_drop_item_count = 0; + memset (sd->add_damage_classrate, 0, sizeof (sd->add_damage_classrate)); + memset (sd->add_damage_classrate_, 0, sizeof (sd->add_damage_classrate_)); + memset (sd->add_magic_damage_classrate, 0, + sizeof (sd->add_magic_damage_classrate)); + memset (sd->add_def_classrate, 0, sizeof (sd->add_def_classrate)); + memset (sd->add_mdef_classrate, 0, sizeof (sd->add_mdef_classrate)); + memset (sd->monster_drop_race, 0, sizeof (sd->monster_drop_race)); + memset (sd->monster_drop_itemrate, 0, sizeof (sd->monster_drop_itemrate)); + sd->speed_add_rate = sd->aspd_add_rate = 100; + sd->double_add_rate = sd->perfect_hit_add = sd->get_zeny_add_num = 0; + sd->splash_range = sd->splash_add_range = 0; + sd->autospell_id = sd->autospell_lv = sd->autospell_rate = 0; + sd->hp_drain_rate = sd->hp_drain_per = sd->sp_drain_rate = + sd->sp_drain_per = 0; + sd->hp_drain_rate_ = sd->hp_drain_per_ = sd->sp_drain_rate_ = + sd->sp_drain_per_ = 0; + sd->short_weapon_damage_return = sd->long_weapon_damage_return = 0; + sd->magic_damage_return = 0; //AppleGirl Was Here + sd->random_attack_increase_add = sd->random_attack_increase_per = 0; + + if (!sd->disguiseflag && sd->disguise) + { + sd->disguise = 0; + pc_set_weapon_look (sd); + clif_changelook (&sd->bl, LOOK_SHIELD, sd->status.shield); + clif_changelook (&sd->bl, LOOK_HEAD_BOTTOM, sd->status.head_bottom); + clif_changelook (&sd->bl, LOOK_HEAD_TOP, sd->status.head_top); + clif_changelook (&sd->bl, LOOK_HEAD_MID, sd->status.head_mid); + clif_clearchar (&sd->bl, 9); + pc_setpos (sd, sd->mapname, sd->bl.x, sd->bl.y, 3); + } - sd->spellpower_bonus_target = 0; - - for(i=0;i<10;i++) { - index = sd->equip_index[i]; - if(index < 0) - continue; - if(i == 9 && sd->equip_index[8] == index) - continue; - if(i == 5 && sd->equip_index[4] == index) - continue; - if(i == 6 && (sd->equip_index[5] == index || sd->equip_index[4] == index)) - continue; - - if(sd->inventory_data[index]) { - sd->spellpower_bonus_target += sd->inventory_data[index]->magic_bonus; - - if(sd->inventory_data[index]->type == 4) { - if(sd->status.inventory[index].card[0]!=0x00ff && sd->status.inventory[index].card[0]!=0x00fe && sd->status.inventory[index].card[0]!=(short)0xff00) { - int j; - for(j=0;j<sd->inventory_data[index]->slot;j++){ // ソスJソス[ソスh - int c=sd->status.inventory[index].card[j]; - if(c>0){ - if(i == 8 && sd->status.inventory[index].equip == 0x20) - sd->state.lr_flag = 1; - run_script(itemdb_equipscript(c),0,sd->bl.id,0); - sd->state.lr_flag = 0; - } - } - } - } - else if(sd->inventory_data[index]->type==5){ // ソスhソスソス - if(sd->status.inventory[index].card[0]!=0x00ff && sd->status.inventory[index].card[0]!=0x00fe && sd->status.inventory[index].card[0]!=(short)0xff00) { - int j; - for(j=0;j<sd->inventory_data[index]->slot;j++){ // ソスJソス[ソスh - int c=sd->status.inventory[index].card[j]; - if(c>0) - run_script(itemdb_equipscript(c),0,sd->bl.id,0); - } - } - } - } - } + sd->spellpower_bonus_target = 0; + + for (i = 0; i < 10; i++) + { + index = sd->equip_index[i]; + if (index < 0) + continue; + if (i == 9 && sd->equip_index[8] == index) + continue; + if (i == 5 && sd->equip_index[4] == index) + continue; + if (i == 6 + && (sd->equip_index[5] == index || sd->equip_index[4] == index)) + continue; + + if (sd->inventory_data[index]) + { + sd->spellpower_bonus_target += + sd->inventory_data[index]->magic_bonus; + + if (sd->inventory_data[index]->type == 4) + { + if (sd->status.inventory[index].card[0] != 0x00ff + && sd->status.inventory[index].card[0] != 0x00fe + && sd->status.inventory[index].card[0] != (short) 0xff00) + { + int j; + for (j = 0; j < sd->inventory_data[index]->slot; j++) + { // ソスJソス[ソスh + int c = sd->status.inventory[index].card[j]; + if (c > 0) + { + if (i == 8 + && sd->status.inventory[index].equip == 0x20) + sd->state.lr_flag = 1; + run_script (itemdb_equipscript (c), 0, sd->bl.id, + 0); + sd->state.lr_flag = 0; + } + } + } + } + else if (sd->inventory_data[index]->type == 5) + { // ソスhソスソス + if (sd->status.inventory[index].card[0] != 0x00ff + && sd->status.inventory[index].card[0] != 0x00fe + && sd->status.inventory[index].card[0] != (short) 0xff00) + { + int j; + for (j = 0; j < sd->inventory_data[index]->slot; j++) + { // ソスJソス[ソスh + int c = sd->status.inventory[index].card[j]; + if (c > 0) + run_script (itemdb_equipscript (c), 0, sd->bl.id, + 0); + } + } + } + } + } - if (sd->spellpower_bonus_target < 0) - sd->spellpower_bonus_target = (sd->spellpower_bonus_target * 256) / (MIN (128 + skill_power(sd, TMW_ASTRAL_SOUL), 256)); - - if (sd->spellpower_bonus_target < sd->spellpower_bonus_current) - sd->spellpower_bonus_current = sd->spellpower_bonus_target; - - wele = sd->atk_ele; - wele_ = sd->atk_ele_; - def_ele = sd->def_ele; - memcpy(sd->paramcard,sd->parame,sizeof(sd->paramcard)); - - // ソスソスソスソスソスiソスノゑソスソスソスソスXソスeソス[ソス^ソスXソスマ会ソスソスヘゑソスソスソスソスナ趣ソスs - for(i=0;i<10;i++) { - index = sd->equip_index[i]; - if(index < 0) - continue; - if(i == 9 && sd->equip_index[8] == index) - continue; - if(i == 5 && sd->equip_index[4] == index) - continue; - if(i == 6 && (sd->equip_index[5] == index || sd->equip_index[4] == index)) - continue; - if(sd->inventory_data[index]) { - sd->def += sd->inventory_data[index]->def; - if(sd->inventory_data[index]->type == 4) { - int r,wlv = sd->inventory_data[index]->wlv; - if(i == 8 && sd->status.inventory[index].equip == 0x20) { - //ソス刀暦ソスソスpソスfソス[ソス^ソスソスソスソス - sd->watk_ += sd->inventory_data[index]->atk; - sd->watk_2 = (r=sd->status.inventory[index].refine)* // ソスソスソスBソスUソスソスソスソス - refinebonus[wlv][0]; - if( (r-=refinebonus[wlv][2])>0 ) // ソス゚剰精ソスBソス{ソス[ソスiソスX - sd->overrefine_ = r*refinebonus[wlv][1]; - - if(sd->status.inventory[index].card[0]==0x00ff){ // ソスソスソスソスソスソスソスソス - sd->star_ = (sd->status.inventory[index].card[1]>>8); // ソスソスソスフゑソスソスソスソスソス - wele_= (sd->status.inventory[index].card[1]&0x0f); // ソスソス ソスソス - } - sd->attackrange_ += sd->inventory_data[index]->range; - sd->state.lr_flag = 1; - run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0); - sd->state.lr_flag = 0; - } - else { //ソス刀暦ソスソスソスソスソスソスネ外 - sd->watk += sd->inventory_data[index]->atk; - sd->watk2 += (r=sd->status.inventory[index].refine)* // ソスソスソスBソスUソスソスソスソス - refinebonus[wlv][0]; - if( (r-=refinebonus[wlv][2])>0 ) // ソス゚剰精ソスBソス{ソス[ソスiソスX - sd->overrefine += r*refinebonus[wlv][1]; - - if(sd->status.inventory[index].card[0]==0x00ff){ // ソスソスソスソスソスソスソスソス - sd->star += (sd->status.inventory[index].card[1]>>8); // ソスソスソスフゑソスソスソスソスソス - wele = (sd->status.inventory[index].card[1]&0x0f); // ソスソス ソスソス - } - sd->attackrange += sd->inventory_data[index]->range; - run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0); - } - } - else if(sd->inventory_data[index]->type == 5) { - sd->watk += sd->inventory_data[index]->atk; - refinedef += sd->status.inventory[index].refine*refinebonus[0][0]; - run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0); - } - } - } + if (sd->spellpower_bonus_target < 0) + sd->spellpower_bonus_target = + (sd->spellpower_bonus_target * 256) / + (MIN (128 + skill_power (sd, TMW_ASTRAL_SOUL), 256)); + + if (sd->spellpower_bonus_target < sd->spellpower_bonus_current) + sd->spellpower_bonus_current = sd->spellpower_bonus_target; + + wele = sd->atk_ele; + wele_ = sd->atk_ele_; + def_ele = sd->def_ele; + memcpy (sd->paramcard, sd->parame, sizeof (sd->paramcard)); + + // ソスソスソスソスソスiソスノゑソスソスソスソスXソスeソス[ソス^ソスXソスマ会ソスソスヘゑソスソスソスソスナ趣ソスs + for (i = 0; i < 10; i++) + { + index = sd->equip_index[i]; + if (index < 0) + continue; + if (i == 9 && sd->equip_index[8] == index) + continue; + if (i == 5 && sd->equip_index[4] == index) + continue; + if (i == 6 + && (sd->equip_index[5] == index || sd->equip_index[4] == index)) + continue; + if (sd->inventory_data[index]) + { + sd->def += sd->inventory_data[index]->def; + if (sd->inventory_data[index]->type == 4) + { + int r, wlv = sd->inventory_data[index]->wlv; + if (i == 8 && sd->status.inventory[index].equip == 0x20) + { + //ソス刀暦ソスソスpソスfソス[ソス^ソスソスソスソス + sd->watk_ += sd->inventory_data[index]->atk; + sd->watk_2 = (r = sd->status.inventory[index].refine) * // ソスソスソスBソスUソスソスソスソス + refinebonus[wlv][0]; + if ((r -= refinebonus[wlv][2]) > 0) // ソス゚剰精ソスBソス{ソス[ソスiソスX + sd->overrefine_ = r * refinebonus[wlv][1]; + + if (sd->status.inventory[index].card[0] == 0x00ff) + { // ソスソスソスソスソスソスソスソス + sd->star_ = (sd->status.inventory[index].card[1] >> 8); // ソスソスソスフゑソスソスソスソスソス + wele_ = (sd->status.inventory[index].card[1] & 0x0f); // ソスソス ソスソス + } + sd->attackrange_ += sd->inventory_data[index]->range; + sd->state.lr_flag = 1; + run_script (sd->inventory_data[index]->equip_script, 0, + sd->bl.id, 0); + sd->state.lr_flag = 0; + } + else + { //ソス刀暦ソスソスソスソスソスソスネ外 + sd->watk += sd->inventory_data[index]->atk; + sd->watk2 += (r = sd->status.inventory[index].refine) * // ソスソスソスBソスUソスソスソスソス + refinebonus[wlv][0]; + if ((r -= refinebonus[wlv][2]) > 0) // ソス゚剰精ソスBソス{ソス[ソスiソスX + sd->overrefine += r * refinebonus[wlv][1]; + + if (sd->status.inventory[index].card[0] == 0x00ff) + { // ソスソスソスソスソスソスソスソス + sd->star += (sd->status.inventory[index].card[1] >> 8); // ソスソスソスフゑソスソスソスソスソス + wele = (sd->status.inventory[index].card[1] & 0x0f); // ソスソス ソスソス + } + sd->attackrange += sd->inventory_data[index]->range; + run_script (sd->inventory_data[index]->equip_script, 0, + sd->bl.id, 0); + } + } + else if (sd->inventory_data[index]->type == 5) + { + sd->watk += sd->inventory_data[index]->atk; + refinedef += + sd->status.inventory[index].refine * refinebonus[0][0]; + run_script (sd->inventory_data[index]->equip_script, 0, + sd->bl.id, 0); + } + } + } - if (battle_is_unarmed(&sd->bl)) { - sd->watk += skill_power(sd, TMW_BRAWLING) / 3; // +66 for 200 - sd->watk2 += skill_power(sd, TMW_BRAWLING) >> 3; // +25 for 200 - sd->watk_ += skill_power(sd, TMW_BRAWLING) / 3; // +66 for 200 - sd->watk_2 += skill_power(sd, TMW_BRAWLING) >> 3; // +25 for 200 - } - - if(sd->equip_index[10] >= 0){ // ソスソス - index = sd->equip_index[10]; - if(sd->inventory_data[index]){ //ソスワゑソスソスソスソスソスソスソスソスソスソスソストゑソスソスネゑソス - sd->state.lr_flag = 2; - run_script(sd->inventory_data[index]->equip_script,0,sd->bl.id,0); - sd->state.lr_flag = 0; - sd->arrow_atk += sd->inventory_data[index]->atk; - } - } - sd->def += (refinedef+50)/100; - - if(sd->attackrange < 1) sd->attackrange = 1; - if(sd->attackrange_ < 1) sd->attackrange_ = 1; - if(sd->attackrange < sd->attackrange_) - sd->attackrange = sd->attackrange_; - if(sd->status.weapon == 11) - sd->attackrange += sd->arrow_range; - if(wele > 0) - sd->atk_ele = wele; - if(wele_ > 0) - sd->atk_ele_ = wele_; - if(def_ele > 0) - sd->def_ele = def_ele; - sd->double_rate += sd->double_add_rate; - sd->perfect_hit += sd->perfect_hit_add; - sd->get_zeny_num += sd->get_zeny_add_num; - sd->splash_range += sd->splash_add_range; - if(sd->speed_add_rate != 100) - sd->speed_rate += sd->speed_add_rate - 100; - if(sd->aspd_add_rate != 100) - sd->aspd_rate += sd->aspd_add_rate - 100; - - // ソスソスソスソスATKソスTソスCソスYソス竦ウ (ソスEソスソス) - sd->atkmods[0] = atkmods[0][sd->weapontype1]; - sd->atkmods[1] = atkmods[1][sd->weapontype1]; - sd->atkmods[2] = atkmods[2][sd->weapontype1]; - //ソスソスソスソスATKソスTソスCソスYソス竦ウ (ソスソスソスソス) - sd->atkmods_[0] = atkmods[0][sd->weapontype2]; - sd->atkmods_[1] = atkmods[1][sd->weapontype2]; - sd->atkmods_[2] = atkmods[2][sd->weapontype2]; + if (battle_is_unarmed (&sd->bl)) + { + sd->watk += skill_power (sd, TMW_BRAWLING) / 3; // +66 for 200 + sd->watk2 += skill_power (sd, TMW_BRAWLING) >> 3; // +25 for 200 + sd->watk_ += skill_power (sd, TMW_BRAWLING) / 3; // +66 for 200 + sd->watk_2 += skill_power (sd, TMW_BRAWLING) >> 3; // +25 for 200 + } + + if (sd->equip_index[10] >= 0) + { // ソスソス + index = sd->equip_index[10]; + if (sd->inventory_data[index]) + { //ソスワゑソスソスソスソスソスソスソスソスソスソスソストゑソスソスネゑソス + sd->state.lr_flag = 2; + run_script (sd->inventory_data[index]->equip_script, 0, sd->bl.id, + 0); + sd->state.lr_flag = 0; + sd->arrow_atk += sd->inventory_data[index]->atk; + } + } + sd->def += (refinedef + 50) / 100; + + if (sd->attackrange < 1) + sd->attackrange = 1; + if (sd->attackrange_ < 1) + sd->attackrange_ = 1; + if (sd->attackrange < sd->attackrange_) + sd->attackrange = sd->attackrange_; + if (sd->status.weapon == 11) + sd->attackrange += sd->arrow_range; + if (wele > 0) + sd->atk_ele = wele; + if (wele_ > 0) + sd->atk_ele_ = wele_; + if (def_ele > 0) + sd->def_ele = def_ele; + sd->double_rate += sd->double_add_rate; + sd->perfect_hit += sd->perfect_hit_add; + sd->get_zeny_num += sd->get_zeny_add_num; + sd->splash_range += sd->splash_add_range; + if (sd->speed_add_rate != 100) + sd->speed_rate += sd->speed_add_rate - 100; + if (sd->aspd_add_rate != 100) + sd->aspd_rate += sd->aspd_add_rate - 100; + + // ソスソスソスソスATKソスTソスCソスYソス竦ウ (ソスEソスソス) + sd->atkmods[0] = atkmods[0][sd->weapontype1]; + sd->atkmods[1] = atkmods[1][sd->weapontype1]; + sd->atkmods[2] = atkmods[2][sd->weapontype1]; + //ソスソスソスソスATKソスTソスCソスYソス竦ウ (ソスソスソスソス) + sd->atkmods_[0] = atkmods[0][sd->weapontype2]; + sd->atkmods_[1] = atkmods[1][sd->weapontype2]; + sd->atkmods_[2] = atkmods[2][sd->weapontype2]; /* // jobソス{ソス[ソスiソスXソスソス @@ -1437,50 +1633,69 @@ int pc_calcstatus(struct map_session_data* sd,int first) } */ - if( (skill=pc_checkskill(sd,MC_INCCARRY))>0 ) // skill can be used with an item now, thanks to orn [Valaris] - sd->max_weight += skill*1000; - - // ソスXソスeソス[ソス^ソスXソスマ会ソスソスノゑソスソスソスソスソスソス{ソスpソスソスソスソスソス[ソス^ソス竦ウ - if(sd->sc_count){ - if(sd->sc_data[SC_CONCENTRATE].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1){ // ソスWソスソスソスヘ鯉ソスソスソス - sd->paramb[1]+= (sd->status.agi+sd->paramb[1]+sd->parame[1]-sd->paramcard[1])*(2+sd->sc_data[SC_CONCENTRATE].val1)/100; - sd->paramb[4]+= (sd->status.dex+sd->paramb[4]+sd->parame[4]-sd->paramcard[4])*(2+sd->sc_data[SC_CONCENTRATE].val1)/100; - } - if(sd->sc_data[SC_INCREASEAGI].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1){ // ソスソスソスxソスソスソスソス - sd->paramb[1]+= 2+sd->sc_data[SC_INCREASEAGI].val1; - sd->speed -= sd->speed *25/100; - } - if(sd->sc_data[SC_DECREASEAGI].timer!=-1) // ソスソスソスxソスソスソスソス(agiソスソスbattle.cソスソス) - sd->speed = sd->speed *125/100; - if(sd->sc_data[SC_CLOAKING].timer!=-1) - sd->speed = (sd->speed*(76+(sd->sc_data[SC_INCREASEAGI].val1*3)))/100; - if(sd->sc_data[SC_BLESSING].timer!=-1){ // ソスuソスソスソスbソスVソスソスソスO - sd->paramb[0]+= sd->sc_data[SC_BLESSING].val1; - sd->paramb[3]+= sd->sc_data[SC_BLESSING].val1; - sd->paramb[4]+= sd->sc_data[SC_BLESSING].val1; - } - if(sd->sc_data[SC_GLORIA].timer!=-1) // ソスOソスソスソスソスソスA - sd->paramb[5]+= 30; - if(sd->sc_data[SC_LOUD].timer!=-1 && sd->sc_data[SC_QUAGMIRE].timer == -1) // ソスソスソスEソスhソス{ソスCソスX - sd->paramb[0]+= 4; - if(sd->sc_data[SC_QUAGMIRE].timer!=-1){ // ソスNソス@ソスOソス}ソスCソスA - sd->speed = sd->speed*3/2; - sd->paramb[1]-=(sd->status.agi+sd->paramb[1]+sd->parame[1])/2; - sd->paramb[4]-=(sd->status.dex+sd->paramb[4]+sd->parame[4])/2; - } - if(sd->sc_data[SC_TRUESIGHT].timer!=-1){ // ソスgソスDソスソスソス[ソスTソスCソスg - sd->paramb[0]+= 5; - sd->paramb[1]+= 5; - sd->paramb[2]+= 5; - sd->paramb[3]+= 5; - sd->paramb[4]+= 5; - sd->paramb[5]+= 5; - } - } - sd->speed -= skill_power(sd, TMW_SPEED) >> 3; - sd->aspd_rate -= skill_power(sd, TMW_SPEED) / 10; - if (sd->aspd_rate < 20) - sd->aspd_rate = 20; + if ((skill = pc_checkskill (sd, MC_INCCARRY)) > 0) // skill can be used with an item now, thanks to orn [Valaris] + sd->max_weight += skill * 1000; + + // ソスXソスeソス[ソス^ソスXソスマ会ソスソスノゑソスソスソスソスソスソス{ソスpソスソスソスソスソス[ソス^ソス竦ウ + if (sd->sc_count) + { + if (sd->sc_data[SC_CONCENTRATE].timer != -1 + && sd->sc_data[SC_QUAGMIRE].timer == -1) + { // ソスWソスソスソスヘ鯉ソスソスソス + sd->paramb[1] += + (sd->status.agi + sd->paramb[1] + sd->parame[1] - + sd->paramcard[1]) * (2 + + sd->sc_data[SC_CONCENTRATE].val1) / 100; + sd->paramb[4] += + (sd->status.dex + sd->paramb[4] + sd->parame[4] - + sd->paramcard[4]) * (2 + + sd->sc_data[SC_CONCENTRATE].val1) / 100; + } + if (sd->sc_data[SC_INCREASEAGI].timer != -1 + && sd->sc_data[SC_QUAGMIRE].timer == -1 + && sd->sc_data[SC_DONTFORGETME].timer == -1) + { // ソスソスソスxソスソスソスソス + sd->paramb[1] += 2 + sd->sc_data[SC_INCREASEAGI].val1; + sd->speed -= sd->speed * 25 / 100; + } + if (sd->sc_data[SC_DECREASEAGI].timer != -1) // ソスソスソスxソスソスソスソス(agiソスソスbattle.cソスソス) + sd->speed = sd->speed * 125 / 100; + if (sd->sc_data[SC_CLOAKING].timer != -1) + sd->speed = + (sd->speed * (76 + (sd->sc_data[SC_INCREASEAGI].val1 * 3))) / + 100; + if (sd->sc_data[SC_BLESSING].timer != -1) + { // ソスuソスソスソスbソスVソスソスソスO + sd->paramb[0] += sd->sc_data[SC_BLESSING].val1; + sd->paramb[3] += sd->sc_data[SC_BLESSING].val1; + sd->paramb[4] += sd->sc_data[SC_BLESSING].val1; + } + if (sd->sc_data[SC_GLORIA].timer != -1) // ソスOソスソスソスソスソスA + sd->paramb[5] += 30; + if (sd->sc_data[SC_LOUD].timer != -1 && sd->sc_data[SC_QUAGMIRE].timer == -1) // ソスソスソスEソスhソス{ソスCソスX + sd->paramb[0] += 4; + if (sd->sc_data[SC_QUAGMIRE].timer != -1) + { // ソスNソス@ソスOソス}ソスCソスA + sd->speed = sd->speed * 3 / 2; + sd->paramb[1] -= + (sd->status.agi + sd->paramb[1] + sd->parame[1]) / 2; + sd->paramb[4] -= + (sd->status.dex + sd->paramb[4] + sd->parame[4]) / 2; + } + if (sd->sc_data[SC_TRUESIGHT].timer != -1) + { // ソスgソスDソスソスソス[ソスTソスCソスg + sd->paramb[0] += 5; + sd->paramb[1] += 5; + sd->paramb[2] += 5; + sd->paramb[3] += 5; + sd->paramb[4] += 5; + sd->paramb[5] += 5; + } + } + sd->speed -= skill_power (sd, TMW_SPEED) >> 3; + sd->aspd_rate -= skill_power (sd, TMW_SPEED) / 10; + if (sd->aspd_rate < 20) + sd->aspd_rate = 20; /* //1ソスxソスソスソスソスソスナなゑソスJob70ソスXソスpソスmソスrソスソス+10 @@ -1493,1241 +1708,1464 @@ int pc_calcstatus(struct map_session_data* sd,int first) sd->paramb[5]+= 15; } */ - sd->paramc[0]=sd->status.str+sd->paramb[0]+sd->parame[0]; - sd->paramc[1]=sd->status.agi+sd->paramb[1]+sd->parame[1]; - sd->paramc[2]=sd->status.vit+sd->paramb[2]+sd->parame[2]; - sd->paramc[3]=sd->status.int_+sd->paramb[3]+sd->parame[3]; - sd->paramc[4]=sd->status.dex+sd->paramb[4]+sd->parame[4]; - sd->paramc[5]=sd->status.luk+sd->paramb[5]+sd->parame[5]; - for(i=0;i<6;i++) - if(sd->paramc[i] < 0) sd->paramc[i] = 0; - - if(sd->status.weapon == 11 || sd->status.weapon == 13 || sd->status.weapon == 14) { - str = sd->paramc[4]; - dex = sd->paramc[0]; - } - else { - str = sd->paramc[0]; - dex = sd->paramc[4]; - sd->critical += ((dex * 3) >> 1); - } - dstr = str/10; - sd->base_atk += str + dstr*dstr + dex/5 + sd->paramc[5]/5; + sd->paramc[0] = sd->status.str + sd->paramb[0] + sd->parame[0]; + sd->paramc[1] = sd->status.agi + sd->paramb[1] + sd->parame[1]; + sd->paramc[2] = sd->status.vit + sd->paramb[2] + sd->parame[2]; + sd->paramc[3] = sd->status.int_ + sd->paramb[3] + sd->parame[3]; + sd->paramc[4] = sd->status.dex + sd->paramb[4] + sd->parame[4]; + sd->paramc[5] = sd->status.luk + sd->paramb[5] + sd->parame[5]; + for (i = 0; i < 6; i++) + if (sd->paramc[i] < 0) + sd->paramc[i] = 0; + + if (sd->status.weapon == 11 || sd->status.weapon == 13 + || sd->status.weapon == 14) + { + str = sd->paramc[4]; + dex = sd->paramc[0]; + } + else + { + str = sd->paramc[0]; + dex = sd->paramc[4]; + sd->critical += ((dex * 3) >> 1); + } + dstr = str / 10; + sd->base_atk += str + dstr * dstr + dex / 5 + sd->paramc[5] / 5; //fprintf(stderr, "baseatk = %d = x + %d + %d + %d + %d\n", sd->base_atk, str, dstr*dstr, dex/5, sd->paramc[5]/5); - sd->matk1 += sd->paramc[3]+(sd->paramc[3]/5)*(sd->paramc[3]/5); - sd->matk2 += sd->paramc[3]+(sd->paramc[3]/7)*(sd->paramc[3]/7); - if(sd->matk1 < sd->matk2) { - int temp = sd->matk2; - sd->matk2 = sd->matk1; - sd->matk1 = temp; - } - // [Fate] New tmw magic system - sd->matk1 += sd->status.base_level + sd->spellpower_bonus_current; - if (sd->matk1 > MAGIC_SKILL_THRESHOLD) { - int bonus = sd->matk1 - MAGIC_SKILL_THRESHOLD; - int bound = 2 * skill_power(sd, TMW_ASTRAL_SOUL); - if (bonus > bound) - bonus = (bonus * 100) / (100 + bonus - bound); - - sd->matk1 = MAGIC_SKILL_THRESHOLD + bonus; - } - sd->matk2 = 0; - if (sd->matk1 < 0) - sd->matk1 = 0; - - sd->hit += sd->paramc[4] + sd->status.base_level; - sd->flee += sd->paramc[1] + sd->status.base_level; - sd->def2 += sd->paramc[2]; - sd->mdef2 += sd->paramc[3]; - sd->flee2 += sd->paramc[5]+10; - sd->critical += (sd->paramc[5]*3)+10; - - if(sd->base_atk < 1) - sd->base_atk = 1; - if(sd->critical_rate != 100) - sd->critical = (sd->critical*sd->critical_rate)/100; - if(sd->critical < 10) sd->critical = 10; - if(sd->hit_rate != 100) - sd->hit = (sd->hit*sd->hit_rate)/100; - if(sd->hit < 1) sd->hit = 1; - if(sd->flee_rate != 100) - sd->flee = (sd->flee*sd->flee_rate)/100; - if(sd->flee < 1) sd->flee = 1; - if(sd->flee2_rate != 100) - sd->flee2 = (sd->flee2*sd->flee2_rate)/100; - if(sd->flee2 < 10) sd->flee2 = 10; - if(sd->def_rate != 100) - sd->def = (sd->def*sd->def_rate)/100; - if(sd->def < 0) sd->def = 0; - if(sd->def2_rate != 100) - sd->def2 = (sd->def2*sd->def2_rate)/100; - if(sd->def2 < 1) sd->def2 = 1; - if(sd->mdef_rate != 100) - sd->mdef = (sd->mdef*sd->mdef_rate)/100; - if(sd->mdef < 0) sd->mdef = 0; - if(sd->mdef2_rate != 100) - sd->mdef2 = (sd->mdef2*sd->mdef2_rate)/100; - if(sd->mdef2 < 1) sd->mdef2 = 1; - - // ソス刀暦ソス ASPD ソスCソスソス - if (sd->status.weapon <= 16) - sd->aspd += aspd_base[s_class.job][sd->status.weapon]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->status.weapon]/1000; - else - sd->aspd += ( - (aspd_base[s_class.job][sd->weapontype1]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->weapontype1]/1000) + - (aspd_base[s_class.job][sd->weapontype2]-(sd->paramc[1]*4+sd->paramc[4])*aspd_base[s_class.job][sd->weapontype2]/1000) - ) * 140 / 200; - - aspd_rate = sd->aspd_rate; - - //ソスUソスソスソスソスソスxソスソスソスソス - - if( (skill=pc_checkskill(sd,AC_VULTURE))>0){ // ソスソスソスVソスフ厄ソス - sd->hit += skill; - if (sd->status.weapon == 11) - sd->attackrange += skill; - } + sd->matk1 += sd->paramc[3] + (sd->paramc[3] / 5) * (sd->paramc[3] / 5); + sd->matk2 += sd->paramc[3] + (sd->paramc[3] / 7) * (sd->paramc[3] / 7); + if (sd->matk1 < sd->matk2) + { + int temp = sd->matk2; + sd->matk2 = sd->matk1; + sd->matk1 = temp; + } + // [Fate] New tmw magic system + sd->matk1 += sd->status.base_level + sd->spellpower_bonus_current; + if (sd->matk1 > MAGIC_SKILL_THRESHOLD) + { + int bonus = sd->matk1 - MAGIC_SKILL_THRESHOLD; + int bound = 2 * skill_power (sd, TMW_ASTRAL_SOUL); + if (bonus > bound) + bonus = (bonus * 100) / (100 + bonus - bound); + + sd->matk1 = MAGIC_SKILL_THRESHOLD + bonus; + } + sd->matk2 = 0; + if (sd->matk1 < 0) + sd->matk1 = 0; + + sd->hit += sd->paramc[4] + sd->status.base_level; + sd->flee += sd->paramc[1] + sd->status.base_level; + sd->def2 += sd->paramc[2]; + sd->mdef2 += sd->paramc[3]; + sd->flee2 += sd->paramc[5] + 10; + sd->critical += (sd->paramc[5] * 3) + 10; + + if (sd->base_atk < 1) + sd->base_atk = 1; + if (sd->critical_rate != 100) + sd->critical = (sd->critical * sd->critical_rate) / 100; + if (sd->critical < 10) + sd->critical = 10; + if (sd->hit_rate != 100) + sd->hit = (sd->hit * sd->hit_rate) / 100; + if (sd->hit < 1) + sd->hit = 1; + if (sd->flee_rate != 100) + sd->flee = (sd->flee * sd->flee_rate) / 100; + if (sd->flee < 1) + sd->flee = 1; + if (sd->flee2_rate != 100) + sd->flee2 = (sd->flee2 * sd->flee2_rate) / 100; + if (sd->flee2 < 10) + sd->flee2 = 10; + if (sd->def_rate != 100) + sd->def = (sd->def * sd->def_rate) / 100; + if (sd->def < 0) + sd->def = 0; + if (sd->def2_rate != 100) + sd->def2 = (sd->def2 * sd->def2_rate) / 100; + if (sd->def2 < 1) + sd->def2 = 1; + if (sd->mdef_rate != 100) + sd->mdef = (sd->mdef * sd->mdef_rate) / 100; + if (sd->mdef < 0) + sd->mdef = 0; + if (sd->mdef2_rate != 100) + sd->mdef2 = (sd->mdef2 * sd->mdef2_rate) / 100; + if (sd->mdef2 < 1) + sd->mdef2 = 1; + + // ソス刀暦ソス ASPD ソスCソスソス + if (sd->status.weapon <= 16) + sd->aspd += + aspd_base[s_class.job][sd->status.weapon] - (sd->paramc[1] * 4 + + sd->paramc[4]) * + aspd_base[s_class.job][sd->status.weapon] / 1000; + else + sd->aspd += ((aspd_base[s_class.job][sd->weapontype1] - + (sd->paramc[1] * 4 + + sd->paramc[4]) * + aspd_base[s_class.job][sd->weapontype1] / 1000) + + (aspd_base[s_class.job][sd->weapontype2] - + (sd->paramc[1] * 4 + + sd->paramc[4]) * + aspd_base[s_class.job][sd->weapontype2] / 1000)) * 140 / + 200; + + aspd_rate = sd->aspd_rate; + + //ソスUソスソスソスソスソスxソスソスソスソス + + if ((skill = pc_checkskill (sd, AC_VULTURE)) > 0) + { // ソスソスソスVソスフ厄ソス + sd->hit += skill; + if (sd->status.weapon == 11) + sd->attackrange += skill; + } - if (sd->attackrange > 2) { // [fate] ranged weapon? - sd->attackrange += MIN(skill_power(sd, AC_OWL) / 60, 3); - sd->hit += skill_power(sd, AC_OWL) / 10; // 20 for 200 - } - - if( (skill=pc_checkskill(sd,BS_WEAPONRESEARCH))>0) // ソスソスソス研ソスソスソスフ厄ソスソスソスソスソスソスソスソスソス - sd->hit += skill*2; - if(sd->status.option&2 && (skill = pc_checkskill(sd,RG_TUNNELDRIVE))>0 ) // ソスgソスソスソスlソスソスソスhソスソスソスCソスu // ソスgソスソスソスlソスソスソスhソスソスソスCソスu - sd->speed += (1.2*DEFAULT_WALK_SPEED - skill*9); - if (pc_iscarton(sd) && (skill=pc_checkskill(sd,MC_PUSHCART))>0) // ソスJソス[ソスgソスノゑソスソス髑ャソスxソス瘟コ - sd->speed += (10-skill) * (DEFAULT_WALK_SPEED * 0.1); - else if (pc_isriding(sd)) // ソスyソスRソスyソスRソスソスソスソスソスノゑソスソス髑ャソスxソスソスソスソス - sd->speed -= (0.25 * DEFAULT_WALK_SPEED); - sd->max_weight += 1000; - if(sd->sc_count){ - if(sd->sc_data[SC_WINDWALK].timer!=-1) //ソスEソスBソスソスソスhソスEソスHソス[ソスNソスソスソスソスLv*2%ソスソスソスZ - sd->speed -= sd->speed *(sd->sc_data[SC_WINDWALK].val1*2)/100; - if(sd->sc_data[SC_CARTBOOST].timer!=-1) // ソスJソス[ソスgソスuソス[ソスXソスg - sd->speed -= (DEFAULT_WALK_SPEED * 20)/100; - if(sd->sc_data[SC_BERSERK].timer!=-1) //ソスoソス[ソスTソス[ソスNソスソスソスソスIAソスニ難ソスソスソスソスソスソス轤「ソスソスソスソスソスH - sd->speed -= sd->speed *25/100; - if(sd->sc_data[SC_WEDDING].timer!=-1) //ソスソスソスソスソスソスソスヘ包ソスソスフゑソスソスxソスソス - sd->speed = 2*DEFAULT_WALK_SPEED; - } + if (sd->attackrange > 2) + { // [fate] ranged weapon? + sd->attackrange += MIN (skill_power (sd, AC_OWL) / 60, 3); + sd->hit += skill_power (sd, AC_OWL) / 10; // 20 for 200 + } - if((skill=pc_checkskill(sd,CR_TRUST))>0) { // ソスtソスFソスCソスX - sd->status.max_hp += skill*200; - sd->subele[6] += skill*5; - } - if((skill=pc_checkskill(sd,BS_SKINTEMPER))>0) - sd->subele[3] += skill*4; - - bl=sd->status.base_level; - - sd->status.max_hp += (3500 + bl*hp_coefficient2[s_class.job] + hp_sigma_val[s_class.job][(bl > 0)? bl-1:0])/100 * (100 + sd->paramc[2])/100 + (sd->parame[2] - sd->paramcard[2]); - if (s_class.upper==1) // [MouseJstr] - sd->status.max_hp = sd->status.max_hp * 130/100; - if(sd->hprate!=100) - sd->status.max_hp = sd->status.max_hp*sd->hprate/100; - - if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1){ // ソスoソス[ソスTソス[ソスN - sd->status.max_hp = sd->status.max_hp * 3; - sd->status.hp = sd->status.hp * 3; - if(sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris - sd->status.max_hp = battle_config.max_hp; - if(sd->status.hp > battle_config.max_hp) // removed negative max hp bug by Valaris - sd->status.hp = battle_config.max_hp; - } - if(s_class.job == 23 && sd->status.base_level >= 99){ - sd->status.max_hp = sd->status.max_hp + 2000; - } + if ((skill = pc_checkskill (sd, BS_WEAPONRESEARCH)) > 0) // ソスソスソス研ソスソスソスフ厄ソスソスソスソスソスソスソスソスソス + sd->hit += skill * 2; + if (sd->status.option & 2 && (skill = pc_checkskill (sd, RG_TUNNELDRIVE)) > 0) // ソスgソスソスソスlソスソスソスhソスソスソスCソスu // ソスgソスソスソスlソスソスソスhソスソスソスCソスu + sd->speed += (1.2 * DEFAULT_WALK_SPEED - skill * 9); + if (pc_iscarton (sd) && (skill = pc_checkskill (sd, MC_PUSHCART)) > 0) // ソスJソス[ソスgソスノゑソスソス髑ャソスxソス瘟コ + sd->speed += (10 - skill) * (DEFAULT_WALK_SPEED * 0.1); + else if (pc_isriding (sd)) // ソスyソスRソスyソスRソスソスソスソスソスノゑソスソス髑ャソスxソスソスソスソス + sd->speed -= (0.25 * DEFAULT_WALK_SPEED); + sd->max_weight += 1000; + if (sd->sc_count) + { + if (sd->sc_data[SC_WINDWALK].timer != -1) //ソスEソスBソスソスソスhソスEソスHソス[ソスNソスソスソスソスLv*2%ソスソスソスZ + sd->speed -= + sd->speed * (sd->sc_data[SC_WINDWALK].val1 * 2) / 100; + if (sd->sc_data[SC_CARTBOOST].timer != -1) // ソスJソス[ソスgソスuソス[ソスXソスg + sd->speed -= (DEFAULT_WALK_SPEED * 20) / 100; + if (sd->sc_data[SC_BERSERK].timer != -1) //ソスoソス[ソスTソス[ソスNソスソスソスソスIAソスニ難ソスソスソスソスソスソス轤「ソスソスソスソスソスH + sd->speed -= sd->speed * 25 / 100; + if (sd->sc_data[SC_WEDDING].timer != -1) //ソスソスソスソスソスソスソスヘ包ソスソスフゑソスソスxソスソス + sd->speed = 2 * DEFAULT_WALK_SPEED; + } - if(sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris - sd->status.max_hp = battle_config.max_hp; - if(sd->status.max_hp <= 0) sd->status.max_hp = 1; // end - - // ソスナ托ソスSPソスvソスZ - sd->status.max_sp += ((sp_coefficient[s_class.job] * bl) + 1000)/100 * (100 + sd->paramc[3])/100 + (sd->parame[3] - sd->paramcard[3]); - if (s_class.upper==1) // [MouseJstr] - sd->status.max_sp = sd->status.max_sp * 130/100; - if(sd->sprate!=100) - sd->status.max_sp = sd->status.max_sp*sd->sprate/100; - - if((skill=pc_checkskill(sd,HP_MEDITATIO))>0) // ソスソスソスfソスBソスeソスCソスeソスBソスI - sd->status.max_sp += sd->status.max_sp*skill/100; - if((skill=pc_checkskill(sd,HW_SOULDRAIN))>0) /* ソス\ソスEソスソスソスhソスソスソスCソスソス */ - sd->status.max_sp += sd->status.max_sp*2*skill/100; - - if(sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp) - sd->status.max_sp = battle_config.max_sp; - - //ソスソスソスRソスソスソスソスHP - sd->nhealhp = 1 + (sd->paramc[2]/5) + (sd->status.max_hp/200); - if((skill=pc_checkskill(sd,SM_RECOVERY)) > 0) { /* HPソス復力鯉ソスソスソス */ - sd->nshealhp = skill*5 + (sd->status.max_hp*skill/500); - if(sd->nshealhp > 0x7fff) sd->nshealhp = 0x7fff; - } - //ソスソスソスRソスソスソスソスSP - sd->nhealsp = 1 + (sd->paramc[3]/6) + (sd->status.max_sp/100); - if(sd->paramc[3] >= 120) - sd->nhealsp += ((sd->paramc[3]-120)>>1) + 4; - if((skill=pc_checkskill(sd,MG_SRECOVERY)) > 0) { /* SPソス復力鯉ソスソスソス */ - sd->nshealsp = skill*3 + (sd->status.max_sp*skill/500); - if(sd->nshealsp > 0x7fff) sd->nshealsp = 0x7fff; - } + if ((skill = pc_checkskill (sd, CR_TRUST)) > 0) + { // ソスtソスFソスCソスX + sd->status.max_hp += skill * 200; + sd->subele[6] += skill * 5; + } + if ((skill = pc_checkskill (sd, BS_SKINTEMPER)) > 0) + sd->subele[3] += skill * 4; + + bl = sd->status.base_level; + + sd->status.max_hp += + (3500 + bl * hp_coefficient2[s_class.job] + + hp_sigma_val[s_class.job][(bl > 0) ? bl - 1 : 0]) / 100 * (100 + + sd->paramc + [2]) / + 100 + (sd->parame[2] - sd->paramcard[2]); + if (s_class.upper == 1) // [MouseJstr] + sd->status.max_hp = sd->status.max_hp * 130 / 100; + if (sd->hprate != 100) + sd->status.max_hp = sd->status.max_hp * sd->hprate / 100; + + if (sd->sc_data && sd->sc_data[SC_BERSERK].timer != -1) + { // ソスoソス[ソスTソス[ソスN + sd->status.max_hp = sd->status.max_hp * 3; + sd->status.hp = sd->status.hp * 3; + if (sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris + sd->status.max_hp = battle_config.max_hp; + if (sd->status.hp > battle_config.max_hp) // removed negative max hp bug by Valaris + sd->status.hp = battle_config.max_hp; + } + if (s_class.job == 23 && sd->status.base_level >= 99) + { + sd->status.max_hp = sd->status.max_hp + 2000; + } - if((skill = pc_checkskill(sd,MO_SPIRITSRECOVERY)) > 0) { - sd->nsshealhp = skill*4 + (sd->status.max_hp*skill/500); - sd->nsshealsp = skill*2 + (sd->status.max_sp*skill/500); - if(sd->nsshealhp > 0x7fff) sd->nsshealhp = 0x7fff; - if(sd->nsshealsp > 0x7fff) sd->nsshealsp = 0x7fff; - } - if(sd->hprecov_rate != 100) { - sd->nhealhp = sd->nhealhp*sd->hprecov_rate/100; - if(sd->nhealhp < 1) sd->nhealhp = 1; - } - if(sd->sprecov_rate != 100) { - sd->nhealsp = sd->nhealsp*sd->sprecov_rate/100; - if(sd->nhealsp < 1) sd->nhealsp = 1; - } - if((skill=pc_checkskill(sd,HP_MEDITATIO)) > 0) { // ソスソスソスfソスBソスeソスCソスeソスBソスIソスソスSPRソスナはなゑソスソスソスソスRソス復にゑソスソスソスソスソス - sd->nhealsp += 3*skill*(sd->status.max_sp)/100; - if(sd->nhealsp > 0x7fff) sd->nhealsp = 0x7fff; - } + if (sd->status.max_hp > battle_config.max_hp) // removed negative max hp bug by Valaris + sd->status.max_hp = battle_config.max_hp; + if (sd->status.max_hp <= 0) + sd->status.max_hp = 1; // end + + // ソスナ托ソスSPソスvソスZ + sd->status.max_sp += + ((sp_coefficient[s_class.job] * bl) + 1000) / 100 * (100 + + sd->paramc[3]) / + 100 + (sd->parame[3] - sd->paramcard[3]); + if (s_class.upper == 1) // [MouseJstr] + sd->status.max_sp = sd->status.max_sp * 130 / 100; + if (sd->sprate != 100) + sd->status.max_sp = sd->status.max_sp * sd->sprate / 100; + + if ((skill = pc_checkskill (sd, HP_MEDITATIO)) > 0) // ソスソスソスfソスBソスeソスCソスeソスBソスI + sd->status.max_sp += sd->status.max_sp * skill / 100; + if ((skill = pc_checkskill (sd, HW_SOULDRAIN)) > 0) /* ソス\ソスEソスソスソスhソスソスソスCソスソス */ + sd->status.max_sp += sd->status.max_sp * 2 * skill / 100; + + if (sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp) + sd->status.max_sp = battle_config.max_sp; + + //ソスソスソスRソスソスソスソスHP + sd->nhealhp = 1 + (sd->paramc[2] / 5) + (sd->status.max_hp / 200); + if ((skill = pc_checkskill (sd, SM_RECOVERY)) > 0) + { /* HPソス復力鯉ソスソスソス */ + sd->nshealhp = skill * 5 + (sd->status.max_hp * skill / 500); + if (sd->nshealhp > 0x7fff) + sd->nshealhp = 0x7fff; + } + //ソスソスソスRソスソスソスソスSP + sd->nhealsp = 1 + (sd->paramc[3] / 6) + (sd->status.max_sp / 100); + if (sd->paramc[3] >= 120) + sd->nhealsp += ((sd->paramc[3] - 120) >> 1) + 4; + if ((skill = pc_checkskill (sd, MG_SRECOVERY)) > 0) + { /* SPソス復力鯉ソスソスソス */ + sd->nshealsp = skill * 3 + (sd->status.max_sp * skill / 500); + if (sd->nshealsp > 0x7fff) + sd->nshealsp = 0x7fff; + } - // ソス族ソスマ撰ソスソスiソスソスソスソスソスナゑソスソスソスソスフ? ソスfソスBソスoソスCソスソスソスvソスソスソスeソスNソスVソスソスソスソスソスニ難ソスソスソスソスソスソスソスソスソスソスソスソス驍ゥソスソスソスj - if( (skill=pc_checkskill(sd,SA_DRAGONOLOGY))>0 ){ // ソスhソスソスソスSソスmソスソスソスWソス[ - skill = skill*4; - sd->addrace[9]+=skill; - sd->addrace_[9]+=skill; - sd->subrace[9]+=skill; - sd->magic_addrace[9]+=skill; - sd->magic_subrace[9]-=skill; - } + if ((skill = pc_checkskill (sd, MO_SPIRITSRECOVERY)) > 0) + { + sd->nsshealhp = skill * 4 + (sd->status.max_hp * skill / 500); + sd->nsshealsp = skill * 2 + (sd->status.max_sp * skill / 500); + if (sd->nsshealhp > 0x7fff) + sd->nsshealhp = 0x7fff; + if (sd->nsshealsp > 0x7fff) + sd->nsshealsp = 0x7fff; + } + if (sd->hprecov_rate != 100) + { + sd->nhealhp = sd->nhealhp * sd->hprecov_rate / 100; + if (sd->nhealhp < 1) + sd->nhealhp = 1; + } + if (sd->sprecov_rate != 100) + { + sd->nhealsp = sd->nhealsp * sd->sprecov_rate / 100; + if (sd->nhealsp < 1) + sd->nhealsp = 1; + } + if ((skill = pc_checkskill (sd, HP_MEDITATIO)) > 0) + { // ソスソスソスfソスBソスeソスCソスeソスBソスIソスソスSPRソスナはなゑソスソスソスソスRソス復にゑソスソスソスソスソス + sd->nhealsp += 3 * skill * (sd->status.max_sp) / 100; + if (sd->nhealsp > 0x7fff) + sd->nhealsp = 0x7fff; + } - //Fleeソス繽ク - if( (skill=pc_checkskill(sd,TF_MISS))>0 ){ // ソスソスソス率托ソスソスソス - if(sd->status.class==6||sd->status.class==4007 || sd->status.class==23){ - sd->flee += skill*3; - } - if(sd->status.class==12||sd->status.class==17||sd->status.class==4013||sd->status.class==4018) - sd->flee += skill*4; - if(sd->status.class==12||sd->status.class==4013) - sd->speed -= sd->speed *(skill*.5)/100; - } - if( (skill=pc_checkskill(sd,MO_DODGE))>0 ) // ソスソスソスリゑソス - sd->flee += (skill*3)>>1; - - // ソスXソスLソスソスソスソスソスXソスeソス[ソス^ソスXソスル擾ソスソスノゑソスソスソスソスcソスソスソスフパソスソスソスソスソス[ソス^ソス竦ウ - if(sd->sc_count){ - // ATK/DEFソスマ会ソスソス` - if(sd->sc_data[SC_ANGELUS].timer!=-1) // ソスGソスソスソスWソスFソスソスソスX - sd->def2 = sd->def2*(110+5*sd->sc_data[SC_ANGELUS].val1)/100; - if(sd->sc_data[SC_IMPOSITIO].timer!=-1) {// ソスCソスソスソス|ソスVソスeソスBソスIソス}ソスkソスX - sd->watk += sd->sc_data[SC_IMPOSITIO].val1*5; - index = sd->equip_index[8]; - if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4) - sd->watk_ += sd->sc_data[SC_IMPOSITIO].val1*5; - } - if(sd->sc_data[SC_PROVOKE].timer!=-1){ // ソスvソスソスソス{ソスbソスN - sd->def2 = sd->def2*(100-6*sd->sc_data[SC_PROVOKE].val1)/100; - sd->base_atk = sd->base_atk*(100+2*sd->sc_data[SC_PROVOKE].val1)/100; - sd->watk = sd->watk*(100+2*sd->sc_data[SC_PROVOKE].val1)/100; - index = sd->equip_index[8]; - if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4) - sd->watk_ = sd->watk_*(100+2*sd->sc_data[SC_PROVOKE].val1)/100; - } - if(sd->sc_data[SC_ENDURE].timer!=-1) - sd->mdef2 += sd->sc_data[SC_ENDURE].val1; - if(sd->sc_data[SC_MINDBREAKER].timer!=-1){ // ソスvソスソスソス{ソスbソスN - sd->mdef2 = sd->mdef2*(100-6*sd->sc_data[SC_MINDBREAKER].val1)/100; - sd->matk1 = sd->matk1*(100+2*sd->sc_data[SC_MINDBREAKER].val1)/100; - sd->matk2 = sd->matk2*(100+2*sd->sc_data[SC_MINDBREAKER].val1)/100; - } - if(sd->sc_data[SC_POISON].timer!=-1) // ソスナ擾ソスソスソス - sd->def2 = sd->def2*75/100; - if(sd->sc_data[SC_DRUMBATTLE].timer!=-1){ // ソス太ソスロの具ソスソスソス - sd->watk += sd->sc_data[SC_DRUMBATTLE].val2; - sd->def += sd->sc_data[SC_DRUMBATTLE].val3; - index = sd->equip_index[8]; - if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4) - sd->watk_ += sd->sc_data[SC_DRUMBATTLE].val2; - } - if(sd->sc_data[SC_NIBELUNGEN].timer!=-1) { // ソスjソス[ソスxソスソスソスソスソスOソスフ指ソスソス - index = sd->equip_index[9]; - if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 3) - sd->watk += sd->sc_data[SC_NIBELUNGEN].val3; - index = sd->equip_index[8]; - if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 3) - sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val3; - if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 4) - sd->watk += sd->sc_data[SC_NIBELUNGEN].val2; - index = sd->equip_index[8]; - if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->wlv == 4) - sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val2; - } - - if(sd->sc_data[SC_VOLCANO].timer!=-1 && sd->def_ele==3){ // ソス{ソスソスソスPソス[ソスm - sd->watk += sd->sc_data[SC_VIOLENTGALE].val3; - } - - if(sd->sc_data[SC_SIGNUMCRUCIS].timer!=-1) - sd->def = sd->def * (100 - sd->sc_data[SC_SIGNUMCRUCIS].val2)/100; - if(sd->sc_data[SC_ETERNALCHAOS].timer!=-1) // ソスGソス^ソス[ソスiソスソスソスJソスIソスX - sd->def=0; - - if(sd->sc_data[SC_CONCENTRATION].timer!=-1){ //ソスRソスソスソスZソスソスソスgソスソスソス[ソスVソスソスソスソス - sd->watk = sd->watk * (100 + 5*sd->sc_data[SC_CONCENTRATION].val1)/100; - index = sd->equip_index[8]; - if(index >= 0 && sd->inventory_data[index] && sd->inventory_data[index]->type == 4) - sd->watk_ = sd->watk * (100 + 5*sd->sc_data[SC_CONCENTRATION].val1)/100; - sd->def = sd->def * (100 - 5*sd->sc_data[SC_CONCENTRATION].val1)/100; - } - - if(sd->sc_data[SC_MAGICPOWER].timer!=-1){ //ソスソスソス@ソスヘ托ソスソスソス - sd->matk1 = sd->matk1*(100+2*sd->sc_data[SC_MAGICPOWER].val1)/100; - sd->matk2 = sd->matk2*(100+2*sd->sc_data[SC_MAGICPOWER].val1)/100; - } - if(sd->sc_data[SC_ATKPOT].timer!=-1) - sd->watk += sd->sc_data[SC_ATKPOT].val1; - if(sd->sc_data[SC_MATKPOT].timer!=-1){ - sd->matk1 += sd->sc_data[SC_MATKPOT].val1; - sd->matk2 += sd->sc_data[SC_MATKPOT].val1; - } - - // ASPD/ソスレ難ソスソスソスソスxソスマ会ソスソスn - if(sd->sc_data[SC_TWOHANDQUICKEN].timer != -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // 2HQ - aspd_rate -= 30; - if(sd->sc_data[SC_ADRENALINE].timer != -1 && sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 && - sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) { // ソスAソスhソスソスソスiソスソスソスソスソスソスソスbソスVソスソス - if(sd->sc_data[SC_ADRENALINE].val2 || !battle_config.party_skill_penaly) - aspd_rate -= 30; - else - aspd_rate -= 25; - } - if(sd->sc_data[SC_SPEARSQUICKEN].timer != -1 && sd->sc_data[SC_ADRENALINE].timer == -1 && - sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // ソスXソスsソスAソスNソスBソスbソスPソスソス - aspd_rate -= sd->sc_data[SC_SPEARSQUICKEN].val2; - if(sd->sc_data[SC_ASSNCROS].timer!=-1 && // ソス[ソスzソスフアソスTソスVソスソスソスNソスソスソスX - sd->sc_data[SC_TWOHANDQUICKEN].timer==-1 && sd->sc_data[SC_ADRENALINE].timer==-1 && sd->sc_data[SC_SPEARSQUICKEN].timer==-1 && - sd->sc_data[SC_DONTFORGETME].timer == -1) - aspd_rate -= 5+sd->sc_data[SC_ASSNCROS].val1+sd->sc_data[SC_ASSNCROS].val2+sd->sc_data[SC_ASSNCROS].val3; - if(sd->sc_data[SC_DONTFORGETME].timer!=-1){ // ソスソスソスソスソスYソスソスソスネゑソスソスソス - aspd_rate += sd->sc_data[SC_DONTFORGETME].val1*3 + sd->sc_data[SC_DONTFORGETME].val2 + (sd->sc_data[SC_DONTFORGETME].val3>>16); - sd->speed= sd->speed*(100+sd->sc_data[SC_DONTFORGETME].val1*2 + sd->sc_data[SC_DONTFORGETME].val2 + (sd->sc_data[SC_DONTFORGETME].val3&0xffff))/100; - } - if( sd->sc_data[i=SC_SPEEDPOTION2].timer!=-1 || - sd->sc_data[i=SC_SPEEDPOTION1].timer!=-1 || - sd->sc_data[i=SC_SPEEDPOTION0].timer!=-1) // ソスソス ソスソスソス|ソス[ソスVソスソスソスソス - aspd_rate -= sd->sc_data[i].val1; - - if (sd->sc_data[SC_HASTE].timer != -1) - aspd_rate -= sd->sc_data[SC_HASTE].val1; - - - /* Slow down if protected */ - - if (sd->sc_data[SC_PHYS_SHIELD].timer != -1) - aspd_rate += sd->sc_data[SC_PHYS_SHIELD].val1; - - // HIT/FLEEソスマ会ソスソスn - if(sd->sc_data[SC_WHISTLE].timer!=-1){ // ソスソスソスJ - sd->flee += sd->flee * (sd->sc_data[SC_WHISTLE].val1 - +sd->sc_data[SC_WHISTLE].val2+(sd->sc_data[SC_WHISTLE].val3>>16))/100; - sd->flee2+= (sd->sc_data[SC_WHISTLE].val1+sd->sc_data[SC_WHISTLE].val2+(sd->sc_data[SC_WHISTLE].val3&0xffff)) * 10; - } - if(sd->sc_data[SC_HUMMING].timer!=-1) // ソスnソス~ソスソスソスO - sd->hit += (sd->sc_data[SC_HUMMING].val1*2+sd->sc_data[SC_HUMMING].val2 - +sd->sc_data[SC_HUMMING].val3) * sd->hit/100; - if(sd->sc_data[SC_VIOLENTGALE].timer!=-1 && sd->def_ele==4){ // ソスoソスCソスIソスソスソスソスソスgソスQソスCソスソス - sd->flee += sd->flee*sd->sc_data[SC_VIOLENTGALE].val3/100; - } - if(sd->sc_data[SC_BLIND].timer!=-1){ // ソステ搾ソス - sd->hit -= sd->hit*25/100; - sd->flee -= sd->flee*25/100; - } - if(sd->sc_data[SC_WINDWALK].timer!=-1) // ソスEソスBソスソスソスhソスEソスHソス[ソスN - sd->flee += sd->flee*(sd->sc_data[SC_WINDWALK].val2)/100; - if(sd->sc_data[SC_SPIDERWEB].timer!=-1) //ソスXソスpソスCソス_ソス[ソスEソスFソスu - sd->flee -= sd->flee*50/100; - if(sd->sc_data[SC_TRUESIGHT].timer!=-1) //ソスgソスDソスソスソス[ソスTソスCソスg - sd->hit += 3*(sd->sc_data[SC_TRUESIGHT].val1); - if(sd->sc_data[SC_CONCENTRATION].timer!=-1) //ソスRソスソスソスZソスソスソスgソスソスソス[ソスVソスソスソスソス - sd->hit += (10*(sd->sc_data[SC_CONCENTRATION].val1)); - - // ソスマ撰ソス - if(sd->sc_data[SC_SIEGFRIED].timer!=-1){ // ソスsソスソスソスgソスフジソス[ソスNソスtソスソスソス[ソスh - sd->subele[1] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス - sd->subele[2] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス - sd->subele[3] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス - sd->subele[4] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス - sd->subele[5] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス - sd->subele[6] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス - sd->subele[7] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス - sd->subele[8] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス - sd->subele[9] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス - } - if(sd->sc_data[SC_PROVIDENCE].timer!=-1){ // ソスvソスソスソスソスソスBソスfソスソスソスX - sd->subele[6] += sd->sc_data[SC_PROVIDENCE].val2; // ソスソス ソスソスソスソスソスソス - sd->subrace[6] += sd->sc_data[SC_PROVIDENCE].val2; // ソスソス ソスソスソスソス - } - - // ソスソスソスフ托ソス - if(sd->sc_data[SC_APPLEIDUN].timer!=-1){ // ソスCソスhソスDソスソスソスフ林鯉ソス - sd->status.max_hp += ((5+sd->sc_data[SC_APPLEIDUN].val1*2+((sd->sc_data[SC_APPLEIDUN].val2+1)>>1) - +sd->sc_data[SC_APPLEIDUN].val3/10) * sd->status.max_hp)/100; - if(sd->status.max_hp < 0 || sd->status.max_hp > battle_config.max_hp) - sd->status.max_hp = battle_config.max_hp; - } - if(sd->sc_data[SC_DELUGE].timer!=-1 && sd->def_ele==1){ // ソスfソスソスソスソスソス[ソスW - sd->status.max_hp += sd->status.max_hp*sd->sc_data[SC_DELUGE].val3/100; - if(sd->status.max_hp < 0 || sd->status.max_hp > battle_config.max_hp) - sd->status.max_hp = battle_config.max_hp; - } - if(sd->sc_data[SC_SERVICE4U].timer!=-1) { // ソスTソス[ソスrソスXソスtソスHソス[ソスソスソス[ - sd->status.max_sp += sd->status.max_sp*(10+sd->sc_data[SC_SERVICE4U].val1+sd->sc_data[SC_SERVICE4U].val2 - +sd->sc_data[SC_SERVICE4U].val3)/100; - if(sd->status.max_sp < 0 || sd->status.max_sp > battle_config.max_sp) - sd->status.max_sp = battle_config.max_sp; - sd->dsprate-=(10+sd->sc_data[SC_SERVICE4U].val1*3+sd->sc_data[SC_SERVICE4U].val2 - +sd->sc_data[SC_SERVICE4U].val3); - if(sd->dsprate<0)sd->dsprate=0; - } - - if(sd->sc_data[SC_FORTUNE].timer!=-1) // ソスKソス^ソスフキソスX - sd->critical += (10+sd->sc_data[SC_FORTUNE].val1+sd->sc_data[SC_FORTUNE].val2 - +sd->sc_data[SC_FORTUNE].val3)*10; - - if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer!=-1){ // ソスソスソスソスソスgソスソス - if(s_class.job==23) - sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val1*100; - else - sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val2; - } - - if(sd->sc_data[SC_STEELBODY].timer!=-1){ // ソスソス - sd->def = 90; - sd->mdef = 90; - aspd_rate += 25; - sd->speed = (sd->speed * 125) / 100; - } - if(sd->sc_data[SC_DEFENDER].timer != -1) { - sd->aspd += (550 - sd->sc_data[SC_DEFENDER].val1*50); - sd->speed = (sd->speed * (155 - sd->sc_data[SC_DEFENDER].val1*5)) / 100; - } - if(sd->sc_data[SC_ENCPOISON].timer != -1) - sd->addeff[4] += sd->sc_data[SC_ENCPOISON].val2; - - if( sd->sc_data[SC_DANCING].timer!=-1 ){ // ソスソスソスt/ソス_ソスソスソスXソスgソスpソスソス - sd->speed*=4; - sd->nhealsp = 0; - sd->nshealsp = 0; - sd->nsshealsp = 0; - } - if(sd->sc_data[SC_CURSE].timer!=-1) - sd->speed += 450; - - if(sd->sc_data[SC_TRUESIGHT].timer!=-1) //ソスgソスDソスソスソス[ソスTソスCソスg - sd->critical += sd->critical*(sd->sc_data[SC_TRUESIGHT].val1)/100; + // ソス族ソスマ撰ソスソスiソスソスソスソスソスナゑソスソスソスソスフ? ソスfソスBソスoソスCソスソスソスvソスソスソスeソスNソスVソスソスソスソスソスニ難ソスソスソスソスソスソスソスソスソスソスソスソス驍ゥソスソスソスj + if ((skill = pc_checkskill (sd, SA_DRAGONOLOGY)) > 0) + { // ソスhソスソスソスSソスmソスソスソスWソス[ + skill = skill * 4; + sd->addrace[9] += skill; + sd->addrace_[9] += skill; + sd->subrace[9] += skill; + sd->magic_addrace[9] += skill; + sd->magic_subrace[9] -= skill; + } + + //Fleeソス繽ク + if ((skill = pc_checkskill (sd, TF_MISS)) > 0) + { // ソスソスソス率托ソスソスソス + if (sd->status.class == 6 || sd->status.class == 4007 + || sd->status.class == 23) + { + sd->flee += skill * 3; + } + if (sd->status.class == 12 || sd->status.class == 17 + || sd->status.class == 4013 || sd->status.class == 4018) + sd->flee += skill * 4; + if (sd->status.class == 12 || sd->status.class == 4013) + sd->speed -= sd->speed * (skill * .5) / 100; + } + if ((skill = pc_checkskill (sd, MO_DODGE)) > 0) // ソスソスソスリゑソス + sd->flee += (skill * 3) >> 1; + + // ソスXソスLソスソスソスソスソスXソスeソス[ソス^ソスXソスル擾ソスソスノゑソスソスソスソスcソスソスソスフパソスソスソスソスソス[ソス^ソス竦ウ + if (sd->sc_count) + { + // ATK/DEFソスマ会ソスソス` + if (sd->sc_data[SC_ANGELUS].timer != -1) // ソスGソスソスソスWソスFソスソスソスX + sd->def2 = + sd->def2 * (110 + 5 * sd->sc_data[SC_ANGELUS].val1) / 100; + if (sd->sc_data[SC_IMPOSITIO].timer != -1) + { // ソスCソスソスソス|ソスVソスeソスBソスIソス}ソスkソスX + sd->watk += sd->sc_data[SC_IMPOSITIO].val1 * 5; + index = sd->equip_index[8]; + if (index >= 0 && sd->inventory_data[index] + && sd->inventory_data[index]->type == 4) + sd->watk_ += sd->sc_data[SC_IMPOSITIO].val1 * 5; + } + if (sd->sc_data[SC_PROVOKE].timer != -1) + { // ソスvソスソスソス{ソスbソスN + sd->def2 = + sd->def2 * (100 - 6 * sd->sc_data[SC_PROVOKE].val1) / 100; + sd->base_atk = + sd->base_atk * (100 + 2 * sd->sc_data[SC_PROVOKE].val1) / 100; + sd->watk = + sd->watk * (100 + 2 * sd->sc_data[SC_PROVOKE].val1) / 100; + index = sd->equip_index[8]; + if (index >= 0 && sd->inventory_data[index] + && sd->inventory_data[index]->type == 4) + sd->watk_ = + sd->watk_ * (100 + + 2 * sd->sc_data[SC_PROVOKE].val1) / 100; + } + if (sd->sc_data[SC_ENDURE].timer != -1) + sd->mdef2 += sd->sc_data[SC_ENDURE].val1; + if (sd->sc_data[SC_MINDBREAKER].timer != -1) + { // ソスvソスソスソス{ソスbソスN + sd->mdef2 = + sd->mdef2 * (100 - + 6 * sd->sc_data[SC_MINDBREAKER].val1) / 100; + sd->matk1 = + sd->matk1 * (100 + + 2 * sd->sc_data[SC_MINDBREAKER].val1) / 100; + sd->matk2 = + sd->matk2 * (100 + + 2 * sd->sc_data[SC_MINDBREAKER].val1) / 100; + } + if (sd->sc_data[SC_POISON].timer != -1) // ソスナ擾ソスソスソス + sd->def2 = sd->def2 * 75 / 100; + if (sd->sc_data[SC_DRUMBATTLE].timer != -1) + { // ソス太ソスロの具ソスソスソス + sd->watk += sd->sc_data[SC_DRUMBATTLE].val2; + sd->def += sd->sc_data[SC_DRUMBATTLE].val3; + index = sd->equip_index[8]; + if (index >= 0 && sd->inventory_data[index] + && sd->inventory_data[index]->type == 4) + sd->watk_ += sd->sc_data[SC_DRUMBATTLE].val2; + } + if (sd->sc_data[SC_NIBELUNGEN].timer != -1) + { // ソスjソス[ソスxソスソスソスソスソスOソスフ指ソスソス + index = sd->equip_index[9]; + if (index >= 0 && sd->inventory_data[index] + && sd->inventory_data[index]->wlv == 3) + sd->watk += sd->sc_data[SC_NIBELUNGEN].val3; + index = sd->equip_index[8]; + if (index >= 0 && sd->inventory_data[index] + && sd->inventory_data[index]->wlv == 3) + sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val3; + if (index >= 0 && sd->inventory_data[index] + && sd->inventory_data[index]->wlv == 4) + sd->watk += sd->sc_data[SC_NIBELUNGEN].val2; + index = sd->equip_index[8]; + if (index >= 0 && sd->inventory_data[index] + && sd->inventory_data[index]->wlv == 4) + sd->watk_ += sd->sc_data[SC_NIBELUNGEN].val2; + } + + if (sd->sc_data[SC_VOLCANO].timer != -1 && sd->def_ele == 3) + { // ソス{ソスソスソスPソス[ソスm + sd->watk += sd->sc_data[SC_VIOLENTGALE].val3; + } + + if (sd->sc_data[SC_SIGNUMCRUCIS].timer != -1) + sd->def = + sd->def * (100 - sd->sc_data[SC_SIGNUMCRUCIS].val2) / 100; + if (sd->sc_data[SC_ETERNALCHAOS].timer != -1) // ソスGソス^ソス[ソスiソスソスソスJソスIソスX + sd->def = 0; + + if (sd->sc_data[SC_CONCENTRATION].timer != -1) + { //ソスRソスソスソスZソスソスソスgソスソスソス[ソスVソスソスソスソス + sd->watk = + sd->watk * (100 + + 5 * sd->sc_data[SC_CONCENTRATION].val1) / 100; + index = sd->equip_index[8]; + if (index >= 0 && sd->inventory_data[index] + && sd->inventory_data[index]->type == 4) + sd->watk_ = + sd->watk * (100 + + 5 * sd->sc_data[SC_CONCENTRATION].val1) / 100; + sd->def = + sd->def * (100 - + 5 * sd->sc_data[SC_CONCENTRATION].val1) / 100; + } + + if (sd->sc_data[SC_MAGICPOWER].timer != -1) + { //ソスソスソス@ソスヘ托ソスソスソス + sd->matk1 = + sd->matk1 * (100 + 2 * sd->sc_data[SC_MAGICPOWER].val1) / 100; + sd->matk2 = + sd->matk2 * (100 + 2 * sd->sc_data[SC_MAGICPOWER].val1) / 100; + } + if (sd->sc_data[SC_ATKPOT].timer != -1) + sd->watk += sd->sc_data[SC_ATKPOT].val1; + if (sd->sc_data[SC_MATKPOT].timer != -1) + { + sd->matk1 += sd->sc_data[SC_MATKPOT].val1; + sd->matk2 += sd->sc_data[SC_MATKPOT].val1; + } + + // ASPD/ソスレ難ソスソスソスソスxソスマ会ソスソスn + if (sd->sc_data[SC_TWOHANDQUICKEN].timer != -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // 2HQ + aspd_rate -= 30; + if (sd->sc_data[SC_ADRENALINE].timer != -1 + && sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 + && sd->sc_data[SC_QUAGMIRE].timer == -1 + && sd->sc_data[SC_DONTFORGETME].timer == -1) + { // ソスAソスhソスソスソスiソスソスソスソスソスソスソスbソスVソスソス + if (sd->sc_data[SC_ADRENALINE].val2 + || !battle_config.party_skill_penaly) + aspd_rate -= 30; + else + aspd_rate -= 25; + } + if (sd->sc_data[SC_SPEARSQUICKEN].timer != -1 && sd->sc_data[SC_ADRENALINE].timer == -1 && sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 && sd->sc_data[SC_QUAGMIRE].timer == -1 && sd->sc_data[SC_DONTFORGETME].timer == -1) // ソスXソスsソスAソスNソスBソスbソスPソスソス + aspd_rate -= sd->sc_data[SC_SPEARSQUICKEN].val2; + if (sd->sc_data[SC_ASSNCROS].timer != -1 && // ソス[ソスzソスフアソスTソスVソスソスソスNソスソスソスX + sd->sc_data[SC_TWOHANDQUICKEN].timer == -1 + && sd->sc_data[SC_ADRENALINE].timer == -1 + && sd->sc_data[SC_SPEARSQUICKEN].timer == -1 + && sd->sc_data[SC_DONTFORGETME].timer == -1) + aspd_rate -= + 5 + sd->sc_data[SC_ASSNCROS].val1 + + sd->sc_data[SC_ASSNCROS].val2 + sd->sc_data[SC_ASSNCROS].val3; + if (sd->sc_data[SC_DONTFORGETME].timer != -1) + { // ソスソスソスソスソスYソスソスソスネゑソスソスソス + aspd_rate += + sd->sc_data[SC_DONTFORGETME].val1 * 3 + + sd->sc_data[SC_DONTFORGETME].val2 + + (sd->sc_data[SC_DONTFORGETME].val3 >> 16); + sd->speed = + sd->speed * (100 + sd->sc_data[SC_DONTFORGETME].val1 * 2 + + sd->sc_data[SC_DONTFORGETME].val2 + + (sd->sc_data[SC_DONTFORGETME].val3 & 0xffff)) / + 100; + } + if (sd->sc_data[i = SC_SPEEDPOTION2].timer != -1 || sd->sc_data[i = SC_SPEEDPOTION1].timer != -1 || sd->sc_data[i = SC_SPEEDPOTION0].timer != -1) // ソスソス ソスソスソス|ソス[ソスVソスソスソスソス + aspd_rate -= sd->sc_data[i].val1; + + if (sd->sc_data[SC_HASTE].timer != -1) + aspd_rate -= sd->sc_data[SC_HASTE].val1; + + /* Slow down if protected */ + + if (sd->sc_data[SC_PHYS_SHIELD].timer != -1) + aspd_rate += sd->sc_data[SC_PHYS_SHIELD].val1; + + // HIT/FLEEソスマ会ソスソスn + if (sd->sc_data[SC_WHISTLE].timer != -1) + { // ソスソスソスJ + sd->flee += sd->flee * (sd->sc_data[SC_WHISTLE].val1 + + sd->sc_data[SC_WHISTLE].val2 + + (sd->sc_data[SC_WHISTLE].val3 >> 16)) / + 100; + sd->flee2 += + (sd->sc_data[SC_WHISTLE].val1 + sd->sc_data[SC_WHISTLE].val2 + + (sd->sc_data[SC_WHISTLE].val3 & 0xffff)) * 10; + } + if (sd->sc_data[SC_HUMMING].timer != -1) // ソスnソス~ソスソスソスO + sd->hit += + (sd->sc_data[SC_HUMMING].val1 * 2 + + sd->sc_data[SC_HUMMING].val2 + + sd->sc_data[SC_HUMMING].val3) * sd->hit / 100; + if (sd->sc_data[SC_VIOLENTGALE].timer != -1 && sd->def_ele == 4) + { // ソスoソスCソスIソスソスソスソスソスgソスQソスCソスソス + sd->flee += sd->flee * sd->sc_data[SC_VIOLENTGALE].val3 / 100; + } + if (sd->sc_data[SC_BLIND].timer != -1) + { // ソステ搾ソス + sd->hit -= sd->hit * 25 / 100; + sd->flee -= sd->flee * 25 / 100; + } + if (sd->sc_data[SC_WINDWALK].timer != -1) // ソスEソスBソスソスソスhソスEソスHソス[ソスN + sd->flee += sd->flee * (sd->sc_data[SC_WINDWALK].val2) / 100; + if (sd->sc_data[SC_SPIDERWEB].timer != -1) //ソスXソスpソスCソス_ソス[ソスEソスFソスu + sd->flee -= sd->flee * 50 / 100; + if (sd->sc_data[SC_TRUESIGHT].timer != -1) //ソスgソスDソスソスソス[ソスTソスCソスg + sd->hit += 3 * (sd->sc_data[SC_TRUESIGHT].val1); + if (sd->sc_data[SC_CONCENTRATION].timer != -1) //ソスRソスソスソスZソスソスソスgソスソスソス[ソスVソスソスソスソス + sd->hit += (10 * (sd->sc_data[SC_CONCENTRATION].val1)); + + // ソスマ撰ソス + if (sd->sc_data[SC_SIEGFRIED].timer != -1) + { // ソスsソスソスソスgソスフジソス[ソスNソスtソスソスソス[ソスh + sd->subele[1] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス + sd->subele[2] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス + sd->subele[3] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス + sd->subele[4] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス + sd->subele[5] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス + sd->subele[6] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス + sd->subele[7] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス + sd->subele[8] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス + sd->subele[9] += sd->sc_data[SC_SIEGFRIED].val2; // ソスソス + } + if (sd->sc_data[SC_PROVIDENCE].timer != -1) + { // ソスvソスソスソスソスソスBソスfソスソスソスX + sd->subele[6] += sd->sc_data[SC_PROVIDENCE].val2; // ソスソス ソスソスソスソスソスソス + sd->subrace[6] += sd->sc_data[SC_PROVIDENCE].val2; // ソスソス ソスソスソスソス + } + + // ソスソスソスフ托ソス + if (sd->sc_data[SC_APPLEIDUN].timer != -1) + { // ソスCソスhソスDソスソスソスフ林鯉ソス + sd->status.max_hp += + ((5 + sd->sc_data[SC_APPLEIDUN].val1 * 2 + + ((sd->sc_data[SC_APPLEIDUN].val2 + 1) >> 1) + + sd->sc_data[SC_APPLEIDUN].val3 / 10) * sd->status.max_hp) / + 100; + if (sd->status.max_hp < 0 + || sd->status.max_hp > battle_config.max_hp) + sd->status.max_hp = battle_config.max_hp; + } + if (sd->sc_data[SC_DELUGE].timer != -1 && sd->def_ele == 1) + { // ソスfソスソスソスソスソス[ソスW + sd->status.max_hp += + sd->status.max_hp * sd->sc_data[SC_DELUGE].val3 / 100; + if (sd->status.max_hp < 0 + || sd->status.max_hp > battle_config.max_hp) + sd->status.max_hp = battle_config.max_hp; + } + if (sd->sc_data[SC_SERVICE4U].timer != -1) + { // ソスTソス[ソスrソスXソスtソスHソス[ソスソスソス[ + sd->status.max_sp += + sd->status.max_sp * (10 + sd->sc_data[SC_SERVICE4U].val1 + + sd->sc_data[SC_SERVICE4U].val2 + + sd->sc_data[SC_SERVICE4U].val3) / 100; + if (sd->status.max_sp < 0 + || sd->status.max_sp > battle_config.max_sp) + sd->status.max_sp = battle_config.max_sp; + sd->dsprate -= + (10 + sd->sc_data[SC_SERVICE4U].val1 * 3 + + sd->sc_data[SC_SERVICE4U].val2 + + sd->sc_data[SC_SERVICE4U].val3); + if (sd->dsprate < 0) + sd->dsprate = 0; + } + + if (sd->sc_data[SC_FORTUNE].timer != -1) // ソスKソス^ソスフキソスX + sd->critical += + (10 + sd->sc_data[SC_FORTUNE].val1 + + sd->sc_data[SC_FORTUNE].val2 + + sd->sc_data[SC_FORTUNE].val3) * 10; + + if (sd->sc_data[SC_EXPLOSIONSPIRITS].timer != -1) + { // ソスソスソスソスソスgソスソス + if (s_class.job == 23) + sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val1 * 100; + else + sd->critical += sd->sc_data[SC_EXPLOSIONSPIRITS].val2; + } + + if (sd->sc_data[SC_STEELBODY].timer != -1) + { // ソスソス + sd->def = 90; + sd->mdef = 90; + aspd_rate += 25; + sd->speed = (sd->speed * 125) / 100; + } + if (sd->sc_data[SC_DEFENDER].timer != -1) + { + sd->aspd += (550 - sd->sc_data[SC_DEFENDER].val1 * 50); + sd->speed = + (sd->speed * (155 - sd->sc_data[SC_DEFENDER].val1 * 5)) / 100; + } + if (sd->sc_data[SC_ENCPOISON].timer != -1) + sd->addeff[4] += sd->sc_data[SC_ENCPOISON].val2; + + if (sd->sc_data[SC_DANCING].timer != -1) + { // ソスソスソスt/ソス_ソスソスソスXソスgソスpソスソス + sd->speed *= 4; + sd->nhealsp = 0; + sd->nshealsp = 0; + sd->nsshealsp = 0; + } + if (sd->sc_data[SC_CURSE].timer != -1) + sd->speed += 450; + + if (sd->sc_data[SC_TRUESIGHT].timer != -1) //ソスgソスDソスソスソス[ソスTソスCソスg + sd->critical += + sd->critical * (sd->sc_data[SC_TRUESIGHT].val1) / 100; /* if(sd->sc_data[SC_VOLCANO].timer!=-1) // ソスGソスソスソス`ソスソスソスソスソスgソス|ソスCソスYソスソス(ソスソスソスソスソスソスbattle.cソスソス) sd->addeff[2]+=sd->sc_data[SC_VOLCANO].val2;//% of granting if(sd->sc_data[SC_DELUGE].timer!=-1) // ソスGソスソスソス`ソスソスソスソスソスgソス|ソスCソスYソスソス(ソスソスソスソスソスソスbattle.cソスソス) sd->addeff[0]+=sd->sc_data[SC_DELUGE].val2;//% of granting */ - } - - if(sd->speed_rate != 100) - sd->speed = sd->speed*sd->speed_rate/100; - if(sd->speed < 1) sd->speed = 1; - if(aspd_rate != 100) - sd->aspd = sd->aspd*aspd_rate/100; - if(pc_isriding(sd)) // ソスRソスソスソスCソスソス - sd->aspd = sd->aspd*(100 + 10*(5 - pc_checkskill(sd,KN_CAVALIERMASTERY)))/ 100; - - if (sd->attack_spell_override) - sd->aspd = sd->attack_spell_delay; - - if(sd->aspd < battle_config.max_aspd) sd->aspd = battle_config.max_aspd; - sd->amotion = sd->aspd; - sd->dmotion = 800-sd->paramc[1]*4; - if(sd->dmotion<400) - sd->dmotion = 400; - if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0) { - sd->prev_speed = sd->speed; - sd->speed = sd->speed*(175 - skill*5)/100; - } + } - if(sd->status.hp>sd->status.max_hp) - sd->status.hp=sd->status.max_hp; - if(sd->status.sp>sd->status.max_sp) - sd->status.sp=sd->status.max_sp; + if (sd->speed_rate != 100) + sd->speed = sd->speed * sd->speed_rate / 100; + if (sd->speed < 1) + sd->speed = 1; + if (aspd_rate != 100) + sd->aspd = sd->aspd * aspd_rate / 100; + if (pc_isriding (sd)) // ソスRソスソスソスCソスソス + sd->aspd = + sd->aspd * (100 + + 10 * (5 - + pc_checkskill (sd, KN_CAVALIERMASTERY))) / 100; + + if (sd->attack_spell_override) + sd->aspd = sd->attack_spell_delay; + + if (sd->aspd < battle_config.max_aspd) + sd->aspd = battle_config.max_aspd; + sd->amotion = sd->aspd; + sd->dmotion = 800 - sd->paramc[1] * 4; + if (sd->dmotion < 400) + sd->dmotion = 400; + if (sd->skilltimer != -1 && (skill = pc_checkskill (sd, SA_FREECAST)) > 0) + { + sd->prev_speed = sd->speed; + sd->speed = sd->speed * (175 - skill * 5) / 100; + } - if(first&4) - return 0; - if(first&3) { - clif_updatestatus(sd,SP_SPEED); - clif_updatestatus(sd,SP_MAXHP); - clif_updatestatus(sd,SP_MAXSP); - if(first&1) { - clif_updatestatus(sd,SP_HP); - clif_updatestatus(sd,SP_SP); - } - return 0; - } + if (sd->status.hp > sd->status.max_hp) + sd->status.hp = sd->status.max_hp; + if (sd->status.sp > sd->status.max_sp) + sd->status.sp = sd->status.max_sp; - if(b_class != sd->view_class) { - clif_changelook(&sd->bl,LOOK_BASE,sd->view_class); - clif_changelook(&sd->bl,LOOK_WEAPON,0); - } + if (first & 4) + return 0; + if (first & 3) + { + clif_updatestatus (sd, SP_SPEED); + clif_updatestatus (sd, SP_MAXHP); + clif_updatestatus (sd, SP_MAXSP); + if (first & 1) + { + clif_updatestatus (sd, SP_HP); + clif_updatestatus (sd, SP_SP); + } + return 0; + } - if( memcmp(b_skill,sd->status.skill,sizeof(sd->status.skill)) || b_attackrange != sd->attackrange) - clif_skillinfoblock(sd); // ソスXソスLソスソスソスソスソスM + if (b_class != sd->view_class) + { + clif_changelook (&sd->bl, LOOK_BASE, sd->view_class); + clif_changelook (&sd->bl, LOOK_WEAPON, 0); + } - if(b_speed != sd->speed) - clif_updatestatus(sd,SP_SPEED); - if(b_weight != sd->weight) - clif_updatestatus(sd,SP_WEIGHT); - if(b_max_weight != sd->max_weight) { - clif_updatestatus(sd,SP_MAXWEIGHT); - pc_checkweighticon(sd); - } - for(i=0;i<6;i++) - if(b_paramb[i] + b_parame[i] != sd->paramb[i] + sd->parame[i]) - clif_updatestatus(sd,SP_STR+i); - if(b_hit != sd->hit) - clif_updatestatus(sd,SP_HIT); - if(b_flee != sd->flee) - clif_updatestatus(sd,SP_FLEE1); - if(b_aspd != sd->aspd) - clif_updatestatus(sd,SP_ASPD); - if(b_watk != sd->watk || b_base_atk != sd->base_atk) - clif_updatestatus(sd,SP_ATK1); - if(b_def != sd->def) - clif_updatestatus(sd,SP_DEF1); - if(b_watk2 != sd->watk2) - clif_updatestatus(sd,SP_ATK2); - if(b_def2 != sd->def2) - clif_updatestatus(sd,SP_DEF2); - if(b_flee2 != sd->flee2) - clif_updatestatus(sd,SP_FLEE2); - if(b_critical != sd->critical) - clif_updatestatus(sd,SP_CRITICAL); - if(b_matk1 != sd->matk1) - clif_updatestatus(sd,SP_MATK1); - if(b_matk2 != sd->matk2) - clif_updatestatus(sd,SP_MATK2); - if(b_mdef != sd->mdef) - clif_updatestatus(sd,SP_MDEF1); - if(b_mdef2 != sd->mdef2) - clif_updatestatus(sd,SP_MDEF2); - if(b_attackrange != sd->attackrange) - clif_updatestatus(sd,SP_ATTACKRANGE); - if(b_max_hp != sd->status.max_hp) - clif_updatestatus(sd,SP_MAXHP); - if(b_max_sp != sd->status.max_sp) - clif_updatestatus(sd,SP_MAXSP); - if(b_hp != sd->status.hp) - clif_updatestatus(sd,SP_HP); - if(b_sp != sd->status.sp) - clif_updatestatus(sd,SP_SP); + if (memcmp (b_skill, sd->status.skill, sizeof (sd->status.skill)) + || b_attackrange != sd->attackrange) + clif_skillinfoblock (sd); // ソスXソスLソスソスソスソスソスM + + if (b_speed != sd->speed) + clif_updatestatus (sd, SP_SPEED); + if (b_weight != sd->weight) + clif_updatestatus (sd, SP_WEIGHT); + if (b_max_weight != sd->max_weight) + { + clif_updatestatus (sd, SP_MAXWEIGHT); + pc_checkweighticon (sd); + } + for (i = 0; i < 6; i++) + if (b_paramb[i] + b_parame[i] != sd->paramb[i] + sd->parame[i]) + clif_updatestatus (sd, SP_STR + i); + if (b_hit != sd->hit) + clif_updatestatus (sd, SP_HIT); + if (b_flee != sd->flee) + clif_updatestatus (sd, SP_FLEE1); + if (b_aspd != sd->aspd) + clif_updatestatus (sd, SP_ASPD); + if (b_watk != sd->watk || b_base_atk != sd->base_atk) + clif_updatestatus (sd, SP_ATK1); + if (b_def != sd->def) + clif_updatestatus (sd, SP_DEF1); + if (b_watk2 != sd->watk2) + clif_updatestatus (sd, SP_ATK2); + if (b_def2 != sd->def2) + clif_updatestatus (sd, SP_DEF2); + if (b_flee2 != sd->flee2) + clif_updatestatus (sd, SP_FLEE2); + if (b_critical != sd->critical) + clif_updatestatus (sd, SP_CRITICAL); + if (b_matk1 != sd->matk1) + clif_updatestatus (sd, SP_MATK1); + if (b_matk2 != sd->matk2) + clif_updatestatus (sd, SP_MATK2); + if (b_mdef != sd->mdef) + clif_updatestatus (sd, SP_MDEF1); + if (b_mdef2 != sd->mdef2) + clif_updatestatus (sd, SP_MDEF2); + if (b_attackrange != sd->attackrange) + clif_updatestatus (sd, SP_ATTACKRANGE); + if (b_max_hp != sd->status.max_hp) + clif_updatestatus (sd, SP_MAXHP); + if (b_max_sp != sd->status.max_sp) + clif_updatestatus (sd, SP_MAXSP); + if (b_hp != sd->status.hp) + clif_updatestatus (sd, SP_HP); + if (b_sp != sd->status.sp) + clif_updatestatus (sd, SP_SP); /* if(before.cart_num != before.cart_num || before.cart_max_num != before.cart_max_num || before.cart_weight != before.cart_weight || before.cart_max_weight != before.cart_max_weight ) clif_updatestatus(sd,SP_CARTINFO);*/ - if(sd->status.hp<sd->status.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 && - (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 ) && !pc_isdead(sd)) - // ソスIソス[ソスgソスoソス[ソスTソス[ソスNソスソスソスソス - skill_status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0); + if (sd->status.hp < sd->status.max_hp >> 2 + && pc_checkskill (sd, SM_AUTOBERSERK) > 0 + && (sd->sc_data[SC_PROVOKE].timer == -1 + || sd->sc_data[SC_PROVOKE].val2 == 0) && !pc_isdead (sd)) + // ソスIソス[ソスgソスoソス[ソスTソス[ソスNソスソスソスソス + skill_status_change_start (&sd->bl, SC_PROVOKE, 10, 1, 0, 0, 0, 0); - return 0; + return 0; } /*========================================== * ソスソス ソスソスソスiソスノゑソスソスソスソス\ソスヘ難ソスソスフボソス[ソスiソスXソスン抵ソス *------------------------------------------ */ -int pc_bonus(struct map_session_data *sd,int type,int val) -{ - nullpo_retr(0, sd); - - switch(type){ - case SP_STR: - case SP_AGI: - case SP_VIT: - case SP_INT: - case SP_DEX: - case SP_LUK: - if(sd->state.lr_flag != 2) - sd->parame[type-SP_STR]+=val; - break; - case SP_ATK1: - if(!sd->state.lr_flag) - sd->watk+=val; - else if(sd->state.lr_flag == 1) - sd->watk_+=val; - break; - case SP_ATK2: - if(!sd->state.lr_flag) - sd->watk2+=val; - else if(sd->state.lr_flag == 1) - sd->watk_2+=val; - break; - case SP_BASE_ATK: - if(sd->state.lr_flag != 2) - sd->base_atk+=val; - break; - case SP_MATK1: - if(sd->state.lr_flag != 2) - sd->matk1 += val; - break; - case SP_MATK2: - if(sd->state.lr_flag != 2) - sd->matk2 += val; - break; - case SP_MATK: - if(sd->state.lr_flag != 2) { - sd->matk1 += val; - sd->matk2 += val; - } - break; - case SP_DEF1: - if(sd->state.lr_flag != 2) - sd->def+=val; - break; - case SP_MDEF1: - if(sd->state.lr_flag != 2) - sd->mdef+=val; - break; - case SP_MDEF2: - if(sd->state.lr_flag != 2) - sd->mdef+=val; - break; - case SP_HIT: - if(sd->state.lr_flag != 2) - sd->hit+=val; - else - sd->arrow_hit+=val; - break; - case SP_FLEE1: - if(sd->state.lr_flag != 2) - sd->flee+=val; - break; - case SP_FLEE2: - if(sd->state.lr_flag != 2) - sd->flee2+=val*10; - break; - case SP_CRITICAL: - if(sd->state.lr_flag != 2) - sd->critical+=val*10; - else - sd->arrow_cri += val*10; - break; - case SP_ATKELE: - if(!sd->state.lr_flag) - sd->atk_ele=val; - else if(sd->state.lr_flag == 1) - sd->atk_ele_=val; - else if(sd->state.lr_flag == 2) - sd->arrow_ele=val; - break; - case SP_DEFELE: - if(sd->state.lr_flag != 2) - sd->def_ele=val; - break; - case SP_MAXHP: - if(sd->state.lr_flag != 2) - sd->status.max_hp+=val; - break; - case SP_MAXSP: - if(sd->state.lr_flag != 2) - sd->status.max_sp+=val; - break; - case SP_CASTRATE: - if(sd->state.lr_flag != 2) - sd->castrate+=val; - break; - case SP_MAXHPRATE: - if(sd->state.lr_flag != 2) - sd->hprate+=val; - break; - case SP_MAXSPRATE: - if(sd->state.lr_flag != 2) - sd->sprate+=val; - break; - case SP_SPRATE: - if(sd->state.lr_flag != 2) - sd->dsprate+=val; - break; - case SP_ATTACKRANGE: - if(!sd->state.lr_flag) - sd->attackrange += val; - else if(sd->state.lr_flag == 1) - sd->attackrange_ += val; - else if(sd->state.lr_flag == 2) - sd->arrow_range += val; - break; - case SP_ADD_SPEED: - if(sd->state.lr_flag != 2) - sd->speed -= val; - break; - case SP_SPEED_RATE: - if(sd->state.lr_flag != 2) { - if(sd->speed_rate > 100-val) - sd->speed_rate = 100-val; - } - break; - case SP_SPEED_ADDRATE: - if(sd->state.lr_flag != 2) - sd->speed_add_rate = sd->speed_add_rate * (100-val)/100; - break; - case SP_ASPD: - if(sd->state.lr_flag != 2) - sd->aspd -= val*10; - break; - case SP_ASPD_RATE: - if(sd->state.lr_flag != 2) { - if(sd->aspd_rate > 100-val) - sd->aspd_rate = 100-val; - } - break; - case SP_ASPD_ADDRATE: - if(sd->state.lr_flag != 2) - sd->aspd_add_rate = sd->aspd_add_rate * (100-val)/100; - break; - case SP_HP_RECOV_RATE: - if(sd->state.lr_flag != 2) - sd->hprecov_rate += val; - break; - case SP_SP_RECOV_RATE: - if(sd->state.lr_flag != 2) - sd->sprecov_rate += val; - break; - case SP_CRITICAL_DEF: - if(sd->state.lr_flag != 2) - sd->critical_def += val; - break; - case SP_NEAR_ATK_DEF: - if(sd->state.lr_flag != 2) - sd->near_attack_def_rate += val; - break; - case SP_LONG_ATK_DEF: - if(sd->state.lr_flag != 2) - sd->long_attack_def_rate += val; - break; - case SP_DOUBLE_RATE: - if(sd->state.lr_flag == 0 && sd->double_rate < val) - sd->double_rate = val; - break; - case SP_DOUBLE_ADD_RATE: - if(sd->state.lr_flag == 0) - sd->double_add_rate += val; - break; - case SP_MATK_RATE: - if(sd->state.lr_flag != 2) - sd->matk_rate += val; - break; - case SP_IGNORE_DEF_ELE: - if(!sd->state.lr_flag) - sd->ignore_def_ele |= 1<<val; - else if(sd->state.lr_flag == 1) - sd->ignore_def_ele_ |= 1<<val; - break; - case SP_IGNORE_DEF_RACE: - if(!sd->state.lr_flag) - sd->ignore_def_race |= 1<<val; - else if(sd->state.lr_flag == 1) - sd->ignore_def_race_ |= 1<<val; - break; - case SP_ATK_RATE: - if(sd->state.lr_flag != 2) - sd->atk_rate += val; - break; - case SP_MAGIC_ATK_DEF: - if(sd->state.lr_flag != 2) - sd->magic_def_rate += val; - break; - case SP_MISC_ATK_DEF: - if(sd->state.lr_flag != 2) - sd->misc_def_rate += val; - break; - case SP_IGNORE_MDEF_ELE: - if(sd->state.lr_flag != 2) - sd->ignore_mdef_ele |= 1<<val; - break; - case SP_IGNORE_MDEF_RACE: - if(sd->state.lr_flag != 2) - sd->ignore_mdef_race |= 1<<val; - break; - case SP_PERFECT_HIT_RATE: - if(sd->state.lr_flag != 2 && sd->perfect_hit < val) - sd->perfect_hit = val; - break; - case SP_PERFECT_HIT_ADD_RATE: - if(sd->state.lr_flag != 2) - sd->perfect_hit_add += val; - break; - case SP_CRITICAL_RATE: - if(sd->state.lr_flag != 2) - sd->critical_rate+=val; - break; - case SP_GET_ZENY_NUM: - if(sd->state.lr_flag != 2 && sd->get_zeny_num < val) - sd->get_zeny_num = val; - break; - case SP_ADD_GET_ZENY_NUM: - if(sd->state.lr_flag != 2) - sd->get_zeny_add_num += val; - break; - case SP_DEF_RATIO_ATK_ELE: - if(!sd->state.lr_flag) - sd->def_ratio_atk_ele |= 1<<val; - else if(sd->state.lr_flag == 1) - sd->def_ratio_atk_ele_ |= 1<<val; - break; - case SP_DEF_RATIO_ATK_RACE: - if(!sd->state.lr_flag) - sd->def_ratio_atk_race |= 1<<val; - else if(sd->state.lr_flag == 1) - sd->def_ratio_atk_race_ |= 1<<val; - break; - case SP_HIT_RATE: - if(sd->state.lr_flag != 2) - sd->hit_rate += val; - break; - case SP_FLEE_RATE: - if(sd->state.lr_flag != 2) - sd->flee_rate += val; - break; - case SP_FLEE2_RATE: - if(sd->state.lr_flag != 2) - sd->flee2_rate += val; - break; - case SP_DEF_RATE: - if(sd->state.lr_flag != 2) - sd->def_rate += val; - break; - case SP_DEF2_RATE: - if(sd->state.lr_flag != 2) - sd->def2_rate += val; - break; - case SP_MDEF_RATE: - if(sd->state.lr_flag != 2) - sd->mdef_rate += val; - break; - case SP_MDEF2_RATE: - if(sd->state.lr_flag != 2) - sd->mdef2_rate += val; - break; - case SP_RESTART_FULL_RECORVER: - if(sd->state.lr_flag != 2) - sd->special_state.restart_full_recover = 1; - break; - case SP_NO_CASTCANCEL: - if(sd->state.lr_flag != 2) - sd->special_state.no_castcancel = 1; - break; - case SP_NO_CASTCANCEL2: - if(sd->state.lr_flag != 2) - sd->special_state.no_castcancel2 = 1; - break; - case SP_NO_SIZEFIX: - if(sd->state.lr_flag != 2) - sd->special_state.no_sizefix = 1; - break; - case SP_NO_MAGIC_DAMAGE: - if(sd->state.lr_flag != 2) - sd->special_state.no_magic_damage = 1; - break; - case SP_NO_WEAPON_DAMAGE: - if(sd->state.lr_flag != 2) - sd->special_state.no_weapon_damage = 1; - break; - case SP_NO_GEMSTONE: - if(sd->state.lr_flag != 2) - sd->special_state.no_gemstone = 1; - break; - case SP_INFINITE_ENDURE: - if(sd->state.lr_flag != 2) - sd->special_state.infinite_endure = 1; - break; - case SP_SPLASH_RANGE: - if(sd->state.lr_flag != 2 && sd->splash_range < val) - sd->splash_range = val; - break; - case SP_SPLASH_ADD_RANGE: - if(sd->state.lr_flag != 2) - sd->splash_add_range += val; - break; - case SP_SHORT_WEAPON_DAMAGE_RETURN: - if(sd->state.lr_flag != 2) - sd->short_weapon_damage_return += val; - break; - case SP_LONG_WEAPON_DAMAGE_RETURN: - if(sd->state.lr_flag != 2) - sd->long_weapon_damage_return += val; - break; - case SP_MAGIC_DAMAGE_RETURN: //AppleGirl Was Here - if(sd->state.lr_flag != 2) - sd->magic_damage_return += val; - break; - case SP_ALL_STATS: // [Valaris] - if(sd->state.lr_flag!=2) { - sd->parame[SP_STR-SP_STR]+=val; - sd->parame[SP_AGI-SP_STR]+=val; - sd->parame[SP_VIT-SP_STR]+=val; - sd->parame[SP_INT-SP_STR]+=val; - sd->parame[SP_DEX-SP_STR]+=val; - sd->parame[SP_LUK-SP_STR]+=val; - clif_updatestatus(sd,13); - clif_updatestatus(sd,14); - clif_updatestatus(sd,15); - clif_updatestatus(sd,16); - clif_updatestatus(sd,17); - clif_updatestatus(sd,18); - } - break; - case SP_AGI_VIT: // [Valaris] - if(sd->state.lr_flag!=2) { - sd->parame[SP_AGI-SP_STR]+=val; - sd->parame[SP_VIT-SP_STR]+=val; - clif_updatestatus(sd,14); - clif_updatestatus(sd,15); - } - break; - case SP_AGI_DEX_STR: // [Valaris] - if(sd->state.lr_flag!=2) { - sd->parame[SP_AGI-SP_STR]+=val; - sd->parame[SP_DEX-SP_STR]+=val; - sd->parame[SP_STR-SP_STR]+=val; - clif_updatestatus(sd,14); - clif_updatestatus(sd,17); - clif_updatestatus(sd,13); - } - break; - case SP_PERFECT_HIDE: // [Valaris] - if(sd->state.lr_flag!=2) { - sd->perfect_hiding=1; - } - break; - case SP_DISGUISE: // Disguise script for items [Valaris] - if(sd->state.lr_flag!=2 && sd->disguiseflag==0) { - if(pc_isriding(sd)) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] - clif_displaymessage(sd->fd, "Cannot wear disguise when riding a Peco."); - break; - } - sd->disguise=val; - clif_clearchar(&sd->bl, 9); - pc_setpos(sd, sd->mapname, sd->bl.x, sd->bl.y, 3); - } - break; - case SP_UNBREAKABLE: - if(sd->state.lr_flag!=2) { - sd->unbreakable += val; - } - break; - case SP_DEAF: - sd->special_state.deaf = 1; - break; - default: - if(battle_config.error_log) - printf("pc_bonus: unknown type %d %d !\n",type,val); - break; - } - return 0; +int pc_bonus (struct map_session_data *sd, int type, int val) +{ + nullpo_retr (0, sd); + + switch (type) + { + case SP_STR: + case SP_AGI: + case SP_VIT: + case SP_INT: + case SP_DEX: + case SP_LUK: + if (sd->state.lr_flag != 2) + sd->parame[type - SP_STR] += val; + break; + case SP_ATK1: + if (!sd->state.lr_flag) + sd->watk += val; + else if (sd->state.lr_flag == 1) + sd->watk_ += val; + break; + case SP_ATK2: + if (!sd->state.lr_flag) + sd->watk2 += val; + else if (sd->state.lr_flag == 1) + sd->watk_2 += val; + break; + case SP_BASE_ATK: + if (sd->state.lr_flag != 2) + sd->base_atk += val; + break; + case SP_MATK1: + if (sd->state.lr_flag != 2) + sd->matk1 += val; + break; + case SP_MATK2: + if (sd->state.lr_flag != 2) + sd->matk2 += val; + break; + case SP_MATK: + if (sd->state.lr_flag != 2) + { + sd->matk1 += val; + sd->matk2 += val; + } + break; + case SP_DEF1: + if (sd->state.lr_flag != 2) + sd->def += val; + break; + case SP_MDEF1: + if (sd->state.lr_flag != 2) + sd->mdef += val; + break; + case SP_MDEF2: + if (sd->state.lr_flag != 2) + sd->mdef += val; + break; + case SP_HIT: + if (sd->state.lr_flag != 2) + sd->hit += val; + else + sd->arrow_hit += val; + break; + case SP_FLEE1: + if (sd->state.lr_flag != 2) + sd->flee += val; + break; + case SP_FLEE2: + if (sd->state.lr_flag != 2) + sd->flee2 += val * 10; + break; + case SP_CRITICAL: + if (sd->state.lr_flag != 2) + sd->critical += val * 10; + else + sd->arrow_cri += val * 10; + break; + case SP_ATKELE: + if (!sd->state.lr_flag) + sd->atk_ele = val; + else if (sd->state.lr_flag == 1) + sd->atk_ele_ = val; + else if (sd->state.lr_flag == 2) + sd->arrow_ele = val; + break; + case SP_DEFELE: + if (sd->state.lr_flag != 2) + sd->def_ele = val; + break; + case SP_MAXHP: + if (sd->state.lr_flag != 2) + sd->status.max_hp += val; + break; + case SP_MAXSP: + if (sd->state.lr_flag != 2) + sd->status.max_sp += val; + break; + case SP_CASTRATE: + if (sd->state.lr_flag != 2) + sd->castrate += val; + break; + case SP_MAXHPRATE: + if (sd->state.lr_flag != 2) + sd->hprate += val; + break; + case SP_MAXSPRATE: + if (sd->state.lr_flag != 2) + sd->sprate += val; + break; + case SP_SPRATE: + if (sd->state.lr_flag != 2) + sd->dsprate += val; + break; + case SP_ATTACKRANGE: + if (!sd->state.lr_flag) + sd->attackrange += val; + else if (sd->state.lr_flag == 1) + sd->attackrange_ += val; + else if (sd->state.lr_flag == 2) + sd->arrow_range += val; + break; + case SP_ADD_SPEED: + if (sd->state.lr_flag != 2) + sd->speed -= val; + break; + case SP_SPEED_RATE: + if (sd->state.lr_flag != 2) + { + if (sd->speed_rate > 100 - val) + sd->speed_rate = 100 - val; + } + break; + case SP_SPEED_ADDRATE: + if (sd->state.lr_flag != 2) + sd->speed_add_rate = sd->speed_add_rate * (100 - val) / 100; + break; + case SP_ASPD: + if (sd->state.lr_flag != 2) + sd->aspd -= val * 10; + break; + case SP_ASPD_RATE: + if (sd->state.lr_flag != 2) + { + if (sd->aspd_rate > 100 - val) + sd->aspd_rate = 100 - val; + } + break; + case SP_ASPD_ADDRATE: + if (sd->state.lr_flag != 2) + sd->aspd_add_rate = sd->aspd_add_rate * (100 - val) / 100; + break; + case SP_HP_RECOV_RATE: + if (sd->state.lr_flag != 2) + sd->hprecov_rate += val; + break; + case SP_SP_RECOV_RATE: + if (sd->state.lr_flag != 2) + sd->sprecov_rate += val; + break; + case SP_CRITICAL_DEF: + if (sd->state.lr_flag != 2) + sd->critical_def += val; + break; + case SP_NEAR_ATK_DEF: + if (sd->state.lr_flag != 2) + sd->near_attack_def_rate += val; + break; + case SP_LONG_ATK_DEF: + if (sd->state.lr_flag != 2) + sd->long_attack_def_rate += val; + break; + case SP_DOUBLE_RATE: + if (sd->state.lr_flag == 0 && sd->double_rate < val) + sd->double_rate = val; + break; + case SP_DOUBLE_ADD_RATE: + if (sd->state.lr_flag == 0) + sd->double_add_rate += val; + break; + case SP_MATK_RATE: + if (sd->state.lr_flag != 2) + sd->matk_rate += val; + break; + case SP_IGNORE_DEF_ELE: + if (!sd->state.lr_flag) + sd->ignore_def_ele |= 1 << val; + else if (sd->state.lr_flag == 1) + sd->ignore_def_ele_ |= 1 << val; + break; + case SP_IGNORE_DEF_RACE: + if (!sd->state.lr_flag) + sd->ignore_def_race |= 1 << val; + else if (sd->state.lr_flag == 1) + sd->ignore_def_race_ |= 1 << val; + break; + case SP_ATK_RATE: + if (sd->state.lr_flag != 2) + sd->atk_rate += val; + break; + case SP_MAGIC_ATK_DEF: + if (sd->state.lr_flag != 2) + sd->magic_def_rate += val; + break; + case SP_MISC_ATK_DEF: + if (sd->state.lr_flag != 2) + sd->misc_def_rate += val; + break; + case SP_IGNORE_MDEF_ELE: + if (sd->state.lr_flag != 2) + sd->ignore_mdef_ele |= 1 << val; + break; + case SP_IGNORE_MDEF_RACE: + if (sd->state.lr_flag != 2) + sd->ignore_mdef_race |= 1 << val; + break; + case SP_PERFECT_HIT_RATE: + if (sd->state.lr_flag != 2 && sd->perfect_hit < val) + sd->perfect_hit = val; + break; + case SP_PERFECT_HIT_ADD_RATE: + if (sd->state.lr_flag != 2) + sd->perfect_hit_add += val; + break; + case SP_CRITICAL_RATE: + if (sd->state.lr_flag != 2) + sd->critical_rate += val; + break; + case SP_GET_ZENY_NUM: + if (sd->state.lr_flag != 2 && sd->get_zeny_num < val) + sd->get_zeny_num = val; + break; + case SP_ADD_GET_ZENY_NUM: + if (sd->state.lr_flag != 2) + sd->get_zeny_add_num += val; + break; + case SP_DEF_RATIO_ATK_ELE: + if (!sd->state.lr_flag) + sd->def_ratio_atk_ele |= 1 << val; + else if (sd->state.lr_flag == 1) + sd->def_ratio_atk_ele_ |= 1 << val; + break; + case SP_DEF_RATIO_ATK_RACE: + if (!sd->state.lr_flag) + sd->def_ratio_atk_race |= 1 << val; + else if (sd->state.lr_flag == 1) + sd->def_ratio_atk_race_ |= 1 << val; + break; + case SP_HIT_RATE: + if (sd->state.lr_flag != 2) + sd->hit_rate += val; + break; + case SP_FLEE_RATE: + if (sd->state.lr_flag != 2) + sd->flee_rate += val; + break; + case SP_FLEE2_RATE: + if (sd->state.lr_flag != 2) + sd->flee2_rate += val; + break; + case SP_DEF_RATE: + if (sd->state.lr_flag != 2) + sd->def_rate += val; + break; + case SP_DEF2_RATE: + if (sd->state.lr_flag != 2) + sd->def2_rate += val; + break; + case SP_MDEF_RATE: + if (sd->state.lr_flag != 2) + sd->mdef_rate += val; + break; + case SP_MDEF2_RATE: + if (sd->state.lr_flag != 2) + sd->mdef2_rate += val; + break; + case SP_RESTART_FULL_RECORVER: + if (sd->state.lr_flag != 2) + sd->special_state.restart_full_recover = 1; + break; + case SP_NO_CASTCANCEL: + if (sd->state.lr_flag != 2) + sd->special_state.no_castcancel = 1; + break; + case SP_NO_CASTCANCEL2: + if (sd->state.lr_flag != 2) + sd->special_state.no_castcancel2 = 1; + break; + case SP_NO_SIZEFIX: + if (sd->state.lr_flag != 2) + sd->special_state.no_sizefix = 1; + break; + case SP_NO_MAGIC_DAMAGE: + if (sd->state.lr_flag != 2) + sd->special_state.no_magic_damage = 1; + break; + case SP_NO_WEAPON_DAMAGE: + if (sd->state.lr_flag != 2) + sd->special_state.no_weapon_damage = 1; + break; + case SP_NO_GEMSTONE: + if (sd->state.lr_flag != 2) + sd->special_state.no_gemstone = 1; + break; + case SP_INFINITE_ENDURE: + if (sd->state.lr_flag != 2) + sd->special_state.infinite_endure = 1; + break; + case SP_SPLASH_RANGE: + if (sd->state.lr_flag != 2 && sd->splash_range < val) + sd->splash_range = val; + break; + case SP_SPLASH_ADD_RANGE: + if (sd->state.lr_flag != 2) + sd->splash_add_range += val; + break; + case SP_SHORT_WEAPON_DAMAGE_RETURN: + if (sd->state.lr_flag != 2) + sd->short_weapon_damage_return += val; + break; + case SP_LONG_WEAPON_DAMAGE_RETURN: + if (sd->state.lr_flag != 2) + sd->long_weapon_damage_return += val; + break; + case SP_MAGIC_DAMAGE_RETURN: //AppleGirl Was Here + if (sd->state.lr_flag != 2) + sd->magic_damage_return += val; + break; + case SP_ALL_STATS: // [Valaris] + if (sd->state.lr_flag != 2) + { + sd->parame[SP_STR - SP_STR] += val; + sd->parame[SP_AGI - SP_STR] += val; + sd->parame[SP_VIT - SP_STR] += val; + sd->parame[SP_INT - SP_STR] += val; + sd->parame[SP_DEX - SP_STR] += val; + sd->parame[SP_LUK - SP_STR] += val; + clif_updatestatus (sd, 13); + clif_updatestatus (sd, 14); + clif_updatestatus (sd, 15); + clif_updatestatus (sd, 16); + clif_updatestatus (sd, 17); + clif_updatestatus (sd, 18); + } + break; + case SP_AGI_VIT: // [Valaris] + if (sd->state.lr_flag != 2) + { + sd->parame[SP_AGI - SP_STR] += val; + sd->parame[SP_VIT - SP_STR] += val; + clif_updatestatus (sd, 14); + clif_updatestatus (sd, 15); + } + break; + case SP_AGI_DEX_STR: // [Valaris] + if (sd->state.lr_flag != 2) + { + sd->parame[SP_AGI - SP_STR] += val; + sd->parame[SP_DEX - SP_STR] += val; + sd->parame[SP_STR - SP_STR] += val; + clif_updatestatus (sd, 14); + clif_updatestatus (sd, 17); + clif_updatestatus (sd, 13); + } + break; + case SP_PERFECT_HIDE: // [Valaris] + if (sd->state.lr_flag != 2) + { + sd->perfect_hiding = 1; + } + break; + case SP_DISGUISE: // Disguise script for items [Valaris] + if (sd->state.lr_flag != 2 && sd->disguiseflag == 0) + { + if (pc_isriding (sd)) + { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] + clif_displaymessage (sd->fd, + "Cannot wear disguise when riding a Peco."); + break; + } + sd->disguise = val; + clif_clearchar (&sd->bl, 9); + pc_setpos (sd, sd->mapname, sd->bl.x, sd->bl.y, 3); + } + break; + case SP_UNBREAKABLE: + if (sd->state.lr_flag != 2) + { + sd->unbreakable += val; + } + break; + case SP_DEAF: + sd->special_state.deaf = 1; + break; + default: + if (battle_config.error_log) + printf ("pc_bonus: unknown type %d %d !\n", type, val); + break; + } + return 0; } /*========================================== * ソスソス ソスソスソスiソスノゑソスソスソスソス\ソスヘ難ソスソスフボソス[ソスiソスXソスン抵ソス *------------------------------------------ */ -int pc_bonus2(struct map_session_data *sd,int type,int type2,int val) -{ - int i; - - nullpo_retr(0, sd); - - switch(type){ - case SP_ADDELE: - if(!sd->state.lr_flag) - sd->addele[type2]+=val; - else if(sd->state.lr_flag == 1) - sd->addele_[type2]+=val; - else if(sd->state.lr_flag == 2) - sd->arrow_addele[type2]+=val; - break; - case SP_ADDRACE: - if(!sd->state.lr_flag) - sd->addrace[type2]+=val; - else if(sd->state.lr_flag == 1) - sd->addrace_[type2]+=val; - else if(sd->state.lr_flag == 2) - sd->arrow_addrace[type2]+=val; - break; - case SP_ADDSIZE: - if(!sd->state.lr_flag) - sd->addsize[type2]+=val; - else if(sd->state.lr_flag == 1) - sd->addsize_[type2]+=val; - else if(sd->state.lr_flag == 2) - sd->arrow_addsize[type2]+=val; - break; - case SP_SUBELE: - if(sd->state.lr_flag != 2) - sd->subele[type2]+=val; - break; - case SP_SUBRACE: - if(sd->state.lr_flag != 2) - sd->subrace[type2]+=val; - break; - case SP_ADDEFF: - if(sd->state.lr_flag != 2) - sd->addeff[type2]+=val; - else - sd->arrow_addeff[type2]+=val; - break; - case SP_ADDEFF2: - if(sd->state.lr_flag != 2) - sd->addeff2[type2]+=val; - else - sd->arrow_addeff2[type2]+=val; - break; - case SP_RESEFF: - if(sd->state.lr_flag != 2) - sd->reseff[type2]+=val; - break; - case SP_MAGIC_ADDELE: - if(sd->state.lr_flag != 2) - sd->magic_addele[type2]+=val; - break; - case SP_MAGIC_ADDRACE: - if(sd->state.lr_flag != 2) - sd->magic_addrace[type2]+=val; - break; - case SP_MAGIC_SUBRACE: - if(sd->state.lr_flag != 2) - sd->magic_subrace[type2]+=val; - break; - case SP_ADD_DAMAGE_CLASS: - if(!sd->state.lr_flag) { - for(i=0;i<sd->add_damage_class_count;i++) { - if(sd->add_damage_classid[i] == type2) { - sd->add_damage_classrate[i] += val; - break; - } - } - if(i >= sd->add_damage_class_count && sd->add_damage_class_count < 10) { - sd->add_damage_classid[sd->add_damage_class_count] = type2; - sd->add_damage_classrate[sd->add_damage_class_count] += val; - sd->add_damage_class_count++; - } - } - else if(sd->state.lr_flag == 1) { - for(i=0;i<sd->add_damage_class_count_;i++) { - if(sd->add_damage_classid_[i] == type2) { - sd->add_damage_classrate_[i] += val; - break; - } - } - if(i >= sd->add_damage_class_count_ && sd->add_damage_class_count_ < 10) { - sd->add_damage_classid_[sd->add_damage_class_count_] = type2; - sd->add_damage_classrate_[sd->add_damage_class_count_] += val; - sd->add_damage_class_count_++; - } - } - break; - case SP_ADD_MAGIC_DAMAGE_CLASS: - if(sd->state.lr_flag != 2) { - for(i=0;i<sd->add_magic_damage_class_count;i++) { - if(sd->add_magic_damage_classid[i] == type2) { - sd->add_magic_damage_classrate[i] += val; - break; - } - } - if(i >= sd->add_magic_damage_class_count && sd->add_magic_damage_class_count < 10) { - sd->add_magic_damage_classid[sd->add_magic_damage_class_count] = type2; - sd->add_magic_damage_classrate[sd->add_magic_damage_class_count] += val; - sd->add_magic_damage_class_count++; - } - } - break; - case SP_ADD_DEF_CLASS: - if(sd->state.lr_flag != 2) { - for(i=0;i<sd->add_def_class_count;i++) { - if(sd->add_def_classid[i] == type2) { - sd->add_def_classrate[i] += val; - break; - } - } - if(i >= sd->add_def_class_count && sd->add_def_class_count < 10) { - sd->add_def_classid[sd->add_def_class_count] = type2; - sd->add_def_classrate[sd->add_def_class_count] += val; - sd->add_def_class_count++; - } - } - break; - case SP_ADD_MDEF_CLASS: - if(sd->state.lr_flag != 2) { - for(i=0;i<sd->add_mdef_class_count;i++) { - if(sd->add_mdef_classid[i] == type2) { - sd->add_mdef_classrate[i] += val; - break; - } - } - if(i >= sd->add_mdef_class_count && sd->add_mdef_class_count < 10) { - sd->add_mdef_classid[sd->add_mdef_class_count] = type2; - sd->add_mdef_classrate[sd->add_mdef_class_count] += val; - sd->add_mdef_class_count++; - } - } - break; - case SP_HP_DRAIN_RATE: - if(!sd->state.lr_flag) { - sd->hp_drain_rate += type2; - sd->hp_drain_per += val; - } - else if(sd->state.lr_flag == 1) { - sd->hp_drain_rate_ += type2; - sd->hp_drain_per_ += val; - } - break; - case SP_SP_DRAIN_RATE: - if(!sd->state.lr_flag) { - sd->sp_drain_rate += type2; - sd->sp_drain_per += val; - } - else if(sd->state.lr_flag == 1) { - sd->sp_drain_rate_ += type2; - sd->sp_drain_per_ += val; - } - break; - case SP_WEAPON_COMA_ELE: - if(sd->state.lr_flag != 2) - sd->weapon_coma_ele[type2] += val; - break; - case SP_WEAPON_COMA_RACE: - if(sd->state.lr_flag != 2) - sd->weapon_coma_race[type2] += val; - break; - case SP_RANDOM_ATTACK_INCREASE: // [Valaris] - if(sd->state.lr_flag !=2){ - sd->random_attack_increase_add = type2; - sd->random_attack_increase_per += val; - break; - } // end addition - default: - if(battle_config.error_log) - printf("pc_bonus2: unknown type %d %d %d!\n",type,type2,val); - break; - } - return 0; -} - -int pc_bonus3(struct map_session_data *sd,int type,int type2,int type3,int val) -{ - int i; - switch(type){ - case SP_ADD_MONSTER_DROP_ITEM: - if(sd->state.lr_flag != 2) { - for(i=0;i<sd->monster_drop_item_count;i++) { - if(sd->monster_drop_itemid[i] == type2) { - sd->monster_drop_race[i] |= 1<<type3; - if(sd->monster_drop_itemrate[i] < val) - sd->monster_drop_itemrate[i] = val; - break; - } - } - if(i >= sd->monster_drop_item_count && sd->monster_drop_item_count < 10) { - sd->monster_drop_itemid[sd->monster_drop_item_count] = type2; - sd->monster_drop_race[sd->monster_drop_item_count] |= 1<<type3; - sd->monster_drop_itemrate[sd->monster_drop_item_count] = val; - sd->monster_drop_item_count++; - } - } - break; - case SP_AUTOSPELL: - if(sd->state.lr_flag != 2){ - sd->autospell_id = type2; - sd->autospell_lv = type3; - sd->autospell_rate = val; - } - break; - default: - if(battle_config.error_log) - printf("pc_bonus3: unknown type %d %d %d %d!\n",type,type2,type3,val); - break; - } +int pc_bonus2 (struct map_session_data *sd, int type, int type2, int val) +{ + int i; + + nullpo_retr (0, sd); + + switch (type) + { + case SP_ADDELE: + if (!sd->state.lr_flag) + sd->addele[type2] += val; + else if (sd->state.lr_flag == 1) + sd->addele_[type2] += val; + else if (sd->state.lr_flag == 2) + sd->arrow_addele[type2] += val; + break; + case SP_ADDRACE: + if (!sd->state.lr_flag) + sd->addrace[type2] += val; + else if (sd->state.lr_flag == 1) + sd->addrace_[type2] += val; + else if (sd->state.lr_flag == 2) + sd->arrow_addrace[type2] += val; + break; + case SP_ADDSIZE: + if (!sd->state.lr_flag) + sd->addsize[type2] += val; + else if (sd->state.lr_flag == 1) + sd->addsize_[type2] += val; + else if (sd->state.lr_flag == 2) + sd->arrow_addsize[type2] += val; + break; + case SP_SUBELE: + if (sd->state.lr_flag != 2) + sd->subele[type2] += val; + break; + case SP_SUBRACE: + if (sd->state.lr_flag != 2) + sd->subrace[type2] += val; + break; + case SP_ADDEFF: + if (sd->state.lr_flag != 2) + sd->addeff[type2] += val; + else + sd->arrow_addeff[type2] += val; + break; + case SP_ADDEFF2: + if (sd->state.lr_flag != 2) + sd->addeff2[type2] += val; + else + sd->arrow_addeff2[type2] += val; + break; + case SP_RESEFF: + if (sd->state.lr_flag != 2) + sd->reseff[type2] += val; + break; + case SP_MAGIC_ADDELE: + if (sd->state.lr_flag != 2) + sd->magic_addele[type2] += val; + break; + case SP_MAGIC_ADDRACE: + if (sd->state.lr_flag != 2) + sd->magic_addrace[type2] += val; + break; + case SP_MAGIC_SUBRACE: + if (sd->state.lr_flag != 2) + sd->magic_subrace[type2] += val; + break; + case SP_ADD_DAMAGE_CLASS: + if (!sd->state.lr_flag) + { + for (i = 0; i < sd->add_damage_class_count; i++) + { + if (sd->add_damage_classid[i] == type2) + { + sd->add_damage_classrate[i] += val; + break; + } + } + if (i >= sd->add_damage_class_count + && sd->add_damage_class_count < 10) + { + sd->add_damage_classid[sd->add_damage_class_count] = + type2; + sd->add_damage_classrate[sd->add_damage_class_count] += + val; + sd->add_damage_class_count++; + } + } + else if (sd->state.lr_flag == 1) + { + for (i = 0; i < sd->add_damage_class_count_; i++) + { + if (sd->add_damage_classid_[i] == type2) + { + sd->add_damage_classrate_[i] += val; + break; + } + } + if (i >= sd->add_damage_class_count_ + && sd->add_damage_class_count_ < 10) + { + sd->add_damage_classid_[sd->add_damage_class_count_] = + type2; + sd->add_damage_classrate_[sd->add_damage_class_count_] += + val; + sd->add_damage_class_count_++; + } + } + break; + case SP_ADD_MAGIC_DAMAGE_CLASS: + if (sd->state.lr_flag != 2) + { + for (i = 0; i < sd->add_magic_damage_class_count; i++) + { + if (sd->add_magic_damage_classid[i] == type2) + { + sd->add_magic_damage_classrate[i] += val; + break; + } + } + if (i >= sd->add_magic_damage_class_count + && sd->add_magic_damage_class_count < 10) + { + sd->add_magic_damage_classid + [sd->add_magic_damage_class_count] = type2; + sd->add_magic_damage_classrate + [sd->add_magic_damage_class_count] += val; + sd->add_magic_damage_class_count++; + } + } + break; + case SP_ADD_DEF_CLASS: + if (sd->state.lr_flag != 2) + { + for (i = 0; i < sd->add_def_class_count; i++) + { + if (sd->add_def_classid[i] == type2) + { + sd->add_def_classrate[i] += val; + break; + } + } + if (i >= sd->add_def_class_count + && sd->add_def_class_count < 10) + { + sd->add_def_classid[sd->add_def_class_count] = type2; + sd->add_def_classrate[sd->add_def_class_count] += val; + sd->add_def_class_count++; + } + } + break; + case SP_ADD_MDEF_CLASS: + if (sd->state.lr_flag != 2) + { + for (i = 0; i < sd->add_mdef_class_count; i++) + { + if (sd->add_mdef_classid[i] == type2) + { + sd->add_mdef_classrate[i] += val; + break; + } + } + if (i >= sd->add_mdef_class_count + && sd->add_mdef_class_count < 10) + { + sd->add_mdef_classid[sd->add_mdef_class_count] = type2; + sd->add_mdef_classrate[sd->add_mdef_class_count] += val; + sd->add_mdef_class_count++; + } + } + break; + case SP_HP_DRAIN_RATE: + if (!sd->state.lr_flag) + { + sd->hp_drain_rate += type2; + sd->hp_drain_per += val; + } + else if (sd->state.lr_flag == 1) + { + sd->hp_drain_rate_ += type2; + sd->hp_drain_per_ += val; + } + break; + case SP_SP_DRAIN_RATE: + if (!sd->state.lr_flag) + { + sd->sp_drain_rate += type2; + sd->sp_drain_per += val; + } + else if (sd->state.lr_flag == 1) + { + sd->sp_drain_rate_ += type2; + sd->sp_drain_per_ += val; + } + break; + case SP_WEAPON_COMA_ELE: + if (sd->state.lr_flag != 2) + sd->weapon_coma_ele[type2] += val; + break; + case SP_WEAPON_COMA_RACE: + if (sd->state.lr_flag != 2) + sd->weapon_coma_race[type2] += val; + break; + case SP_RANDOM_ATTACK_INCREASE: // [Valaris] + if (sd->state.lr_flag != 2) + { + sd->random_attack_increase_add = type2; + sd->random_attack_increase_per += val; + break; + } // end addition + default: + if (battle_config.error_log) + printf ("pc_bonus2: unknown type %d %d %d!\n", type, type2, + val); + break; + } + return 0; +} + +int pc_bonus3 (struct map_session_data *sd, int type, int type2, int type3, + int val) +{ + int i; + switch (type) + { + case SP_ADD_MONSTER_DROP_ITEM: + if (sd->state.lr_flag != 2) + { + for (i = 0; i < sd->monster_drop_item_count; i++) + { + if (sd->monster_drop_itemid[i] == type2) + { + sd->monster_drop_race[i] |= 1 << type3; + if (sd->monster_drop_itemrate[i] < val) + sd->monster_drop_itemrate[i] = val; + break; + } + } + if (i >= sd->monster_drop_item_count + && sd->monster_drop_item_count < 10) + { + sd->monster_drop_itemid[sd->monster_drop_item_count] = + type2; + sd->monster_drop_race[sd->monster_drop_item_count] |= + 1 << type3; + sd->monster_drop_itemrate[sd->monster_drop_item_count] = + val; + sd->monster_drop_item_count++; + } + } + break; + case SP_AUTOSPELL: + if (sd->state.lr_flag != 2) + { + sd->autospell_id = type2; + sd->autospell_lv = type3; + sd->autospell_rate = val; + } + break; + default: + if (battle_config.error_log) + printf ("pc_bonus3: unknown type %d %d %d %d!\n", type, type2, + type3, val); + break; + } - return 0; + return 0; } /*========================================== * ソスXソスNソスソスソスvソスgソスノゑソスソスソスソスXソスLソスソスソスソスソスソス *------------------------------------------ */ -int pc_skill(struct map_session_data *sd,int id,int level,int flag) +int pc_skill (struct map_session_data *sd, int id, int level, int flag) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(level>MAX_SKILL_LEVEL){ - if(battle_config.error_log) - printf("support card skill only!\n"); - return 0; - } - if(!flag && (sd->status.skill[id].id == id || level == 0)){ // ソスNソスGソスXソスgソスソスソスソスソスネらこソスソスソスナ擾ソスソスソスmソスFソスソスソスト托ソスソスMソスソスソスソス - sd->status.skill[id].lv=level; - pc_calcstatus(sd,0); - clif_skillinfoblock(sd); - } - else if(sd->status.skill[id].lv < level){ // ソスoソスソスソスソスソスソスソス驍ェlvソスソスソスソスソスソスソスソスソスネゑソス - sd->status.skill[id].id=id; - sd->status.skill[id].lv=level; - } + if (level > MAX_SKILL_LEVEL) + { + if (battle_config.error_log) + printf ("support card skill only!\n"); + return 0; + } + if (!flag && (sd->status.skill[id].id == id || level == 0)) + { // ソスNソスGソスXソスgソスソスソスソスソスネらこソスソスソスナ擾ソスソスソスmソスFソスソスソスト托ソスソスMソスソスソスソス + sd->status.skill[id].lv = level; + pc_calcstatus (sd, 0); + clif_skillinfoblock (sd); + } + else if (sd->status.skill[id].lv < level) + { // ソスoソスソスソスソスソスソスソス驍ェlvソスソスソスソスソスソスソスソスソスネゑソス + sd->status.skill[id].id = id; + sd->status.skill[id].lv = level; + } - return 0; + return 0; } /*========================================== * ソスJソス[ソスhソス}ソスソス *------------------------------------------ */ -int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip) -{ - nullpo_retr(0, sd); - - if(idx_card >= 0 && idx_card < MAX_INVENTORY && idx_equip >= 0 && idx_equip < MAX_INVENTORY && sd->inventory_data[idx_card]) { - int i; - int nameid=sd->status.inventory[idx_equip].nameid; - int cardid=sd->status.inventory[idx_card].nameid; - int ep=sd->inventory_data[idx_card]->equip; - - if( nameid <= 0 || sd->inventory_data[idx_equip] == NULL || - (sd->inventory_data[idx_equip]->type!=4 && sd->inventory_data[idx_equip]->type!=5)|| // ソスソス ソスソスソスソスネゑソス - ( sd->status.inventory[idx_equip].identify==0 ) || // ソスソスソスモ抵ソス - ( sd->status.inventory[idx_equip].card[0]==0x00ff) || // ソスソスソスソスソスソスソスソス - ( sd->status.inventory[idx_equip].card[0]==0x00fe) || - ( (sd->inventory_data[idx_equip]->equip&ep)==0 ) || // ソスソス ソスソスソスツ擾ソスソス痰「 - ( sd->inventory_data[idx_equip]->type==4 && ep==32) || // ソスソス ソス阨撰ソスソスソスニ擾ソスソスJソス[ソスh - ( sd->status.inventory[idx_equip].card[0]==(short)0xff00) || sd->status.inventory[idx_equip].equip){ - - clif_insert_card(sd,idx_equip,idx_card,1); - return 0; - } - for(i=0;i<sd->inventory_data[idx_equip]->slot;i++){ - if( sd->status.inventory[idx_equip].card[i] == 0){ - // ソスきスソスソスソスbソスgソスソスソスソスソスソスソスソスフで搾ソスソスソスソスソスソスソス - sd->status.inventory[idx_equip].card[i]=cardid; - - // ソスJソス[ソスhソスヘ鯉ソスソス轤キ - clif_insert_card(sd,idx_equip,idx_card,0); - pc_delitem(sd,idx_card,1,1); - return 0; - } - } - } - else - clif_insert_card(sd,idx_equip,idx_card,1); +int pc_insert_card (struct map_session_data *sd, int idx_card, int idx_equip) +{ + nullpo_retr (0, sd); + + if (idx_card >= 0 && idx_card < MAX_INVENTORY && idx_equip >= 0 + && idx_equip < MAX_INVENTORY && sd->inventory_data[idx_card]) + { + int i; + int nameid = sd->status.inventory[idx_equip].nameid; + int cardid = sd->status.inventory[idx_card].nameid; + int ep = sd->inventory_data[idx_card]->equip; + + if (nameid <= 0 || sd->inventory_data[idx_equip] == NULL || (sd->inventory_data[idx_equip]->type != 4 && sd->inventory_data[idx_equip]->type != 5) || // ソスソス ソスソスソスソスネゑソス + (sd->status.inventory[idx_equip].identify == 0) || // ソスソスソスモ抵ソス + (sd->status.inventory[idx_equip].card[0] == 0x00ff) || // ソスソスソスソスソスソスソスソス + (sd->status.inventory[idx_equip].card[0] == 0x00fe) || ((sd->inventory_data[idx_equip]->equip & ep) == 0) || // ソスソス ソスソスソスツ擾ソスソス痰「 + (sd->inventory_data[idx_equip]->type == 4 && ep == 32) || // ソスソス ソス阨撰ソスソスソスニ擾ソスソスJソス[ソスh + (sd->status.inventory[idx_equip].card[0] == (short) 0xff00) + || sd->status.inventory[idx_equip].equip) + { + + clif_insert_card (sd, idx_equip, idx_card, 1); + return 0; + } + for (i = 0; i < sd->inventory_data[idx_equip]->slot; i++) + { + if (sd->status.inventory[idx_equip].card[i] == 0) + { + // ソスきスソスソスソスbソスgソスソスソスソスソスソスソスソスフで搾ソスソスソスソスソスソスソス + sd->status.inventory[idx_equip].card[i] = cardid; + + // ソスJソス[ソスhソスヘ鯉ソスソス轤キ + clif_insert_card (sd, idx_equip, idx_card, 0); + pc_delitem (sd, idx_card, 1, 1); + return 0; + } + } + } + else + clif_insert_card (sd, idx_equip, idx_card, 1); - return 0; + return 0; } // @@ -2738,37 +3176,42 @@ int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip) * ソスXソスLソスソスソスノゑソスソス髞ソスソスソスlソスCソスソス *------------------------------------------ */ -int pc_modifybuyvalue(struct map_session_data *sd,int orig_value) +int pc_modifybuyvalue (struct map_session_data *sd, int orig_value) { - int skill,val = orig_value,rate1 = 0,rate2 = 0; - if((skill=pc_checkskill(sd,MC_DISCOUNT))>0) // ソスfソスBソスXソスJソスEソスソスソスg - rate1 = 5+skill*2-((skill==10)? 1:0); - if((skill=pc_checkskill(sd,RG_COMPULSION))>0) // ソスRソスソスソスpソスソスソスVソスソスソスソスソスfソスBソスXソスJソスEソスソスソスg - rate2 = 5+skill*4; - if(rate1 < rate2) rate1 = rate2; - if(rate1) - val = (int)((double)orig_value*(double)(100-rate1)/100.); - if(val < 0) val = 0; - if(orig_value > 0 && val < 1) val = 1; + int skill, val = orig_value, rate1 = 0, rate2 = 0; + if ((skill = pc_checkskill (sd, MC_DISCOUNT)) > 0) // ソスfソスBソスXソスJソスEソスソスソスg + rate1 = 5 + skill * 2 - ((skill == 10) ? 1 : 0); + if ((skill = pc_checkskill (sd, RG_COMPULSION)) > 0) // ソスRソスソスソスpソスソスソスVソスソスソスソスソスfソスBソスXソスJソスEソスソスソスg + rate2 = 5 + skill * 4; + if (rate1 < rate2) + rate1 = rate2; + if (rate1) + val = (int) ((double) orig_value * (double) (100 - rate1) / 100.); + if (val < 0) + val = 0; + if (orig_value > 0 && val < 1) + val = 1; - return val; + return val; } /*========================================== * ソスXソスLソスソスソスノゑソスソス髞ソスソスソスlソスCソスソス *------------------------------------------ */ -int pc_modifysellvalue(struct map_session_data *sd,int orig_value) +int pc_modifysellvalue (struct map_session_data *sd, int orig_value) { - int skill,val = orig_value,rate = 0; - if((skill=pc_checkskill(sd,MC_OVERCHARGE))>0) // ソスIソス[ソスoソス[ソス`ソスソスソス[ソスW - rate = 5+skill*2-((skill==10)? 1:0); - if(rate) - val = (int)((double)orig_value*(double)(100+rate)/100.); - if(val < 0) val = 0; - if(orig_value > 0 && val < 1) val = 1; + int skill, val = orig_value, rate = 0; + if ((skill = pc_checkskill (sd, MC_OVERCHARGE)) > 0) // ソスIソス[ソスoソス[ソス`ソスソスソス[ソスW + rate = 5 + skill * 2 - ((skill == 10) ? 1 : 0); + if (rate) + val = (int) ((double) orig_value * (double) (100 + rate) / 100.); + if (val < 0) + val = 0; + if (orig_value > 0 && val < 1) + val = 1; - return val; + return val; } /*========================================== @@ -2776,114 +3219,119 @@ int pc_modifysellvalue(struct map_session_data *sd,int orig_value) * 3ソスソスソスツ撰ソスソスソスノゑソスソスソスソス驍ゥソスmソスF *------------------------------------------ */ -int pc_checkadditem(struct map_session_data *sd,int nameid,int amount) +int pc_checkadditem (struct map_session_data *sd, int nameid, int amount) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(itemdb_isequip(nameid)) - return ADDITEM_NEW; + if (itemdb_isequip (nameid)) + return ADDITEM_NEW; - for(i=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].nameid==nameid){ - if(sd->status.inventory[i].amount+amount > MAX_AMOUNT) - return ADDITEM_OVERAMOUNT; - return ADDITEM_EXIST; - } - } + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid == nameid) + { + if (sd->status.inventory[i].amount + amount > MAX_AMOUNT) + return ADDITEM_OVERAMOUNT; + return ADDITEM_EXIST; + } + } - if(amount > MAX_AMOUNT) - return ADDITEM_OVERAMOUNT; - return ADDITEM_NEW; + if (amount > MAX_AMOUNT) + return ADDITEM_OVERAMOUNT; + return ADDITEM_NEW; } /*========================================== * ソスきアソスCソスeソスソスソスソスソスフ個撰ソス *------------------------------------------ */ -int pc_inventoryblank(struct map_session_data *sd) +int pc_inventoryblank (struct map_session_data *sd) { - int i,b; + int i, b; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - for(i=0,b=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].nameid==0) - b++; - } + for (i = 0, b = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid == 0) + b++; + } - return b; + return b; } /*========================================== * ソスソスソスソスソス払ゑソス *------------------------------------------ */ -int pc_payzeny(struct map_session_data *sd,int zeny) +int pc_payzeny (struct map_session_data *sd, int zeny) { - double z; + double z; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - z = (double)sd->status.zeny; - if(sd->status.zeny<zeny || z - (double)zeny > MAX_ZENY) - return 1; - sd->status.zeny-=zeny; - clif_updatestatus(sd,SP_ZENY); + z = (double) sd->status.zeny; + if (sd->status.zeny < zeny || z - (double) zeny > MAX_ZENY) + return 1; + sd->status.zeny -= zeny; + clif_updatestatus (sd, SP_ZENY); - return 0; + return 0; } /*========================================== * ソスソスソスソスソス得ゑソス *------------------------------------------ */ -int pc_getzeny(struct map_session_data *sd,int zeny) +int pc_getzeny (struct map_session_data *sd, int zeny) { - double z; + double z; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - z = (double)sd->status.zeny; - if(z + (double)zeny > MAX_ZENY) { - zeny = 0; - sd->status.zeny = MAX_ZENY; - } - sd->status.zeny+=zeny; - clif_updatestatus(sd,SP_ZENY); + z = (double) sd->status.zeny; + if (z + (double) zeny > MAX_ZENY) + { + zeny = 0; + sd->status.zeny = MAX_ZENY; + } + sd->status.zeny += zeny; + clif_updatestatus (sd, SP_ZENY); - return 0; + return 0; } /*========================================== * ソスAソスCソスeソスソスソスソスソスTソスソスソスト、ソスCソスソスソスfソスbソスNソスXソスソスソスヤゑソス *------------------------------------------ */ -int pc_search_inventory(struct map_session_data *sd,int item_id) +int pc_search_inventory (struct map_session_data *sd, int item_id) { - int i; + int i; - nullpo_retr(-1, sd); + nullpo_retr (-1, sd); - for(i=0;i<MAX_INVENTORY;i++) { - if(sd->status.inventory[i].nameid == item_id && - (sd->status.inventory[i].amount > 0 || item_id == 0)) - return i; - } + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid == item_id && + (sd->status.inventory[i].amount > 0 || item_id == 0)) + return i; + } - return -1; + return -1; } -int -pc_count_all_items(struct map_session_data *player, int item_id) +int pc_count_all_items (struct map_session_data *player, int item_id) { - int i; - int count = 0; + int i; + int count = 0; - nullpo_retr(0, player); + nullpo_retr (0, player); - for (i = 0; i < MAX_INVENTORY; i++) { + for (i = 0; i < MAX_INVENTORY; i++) + { if (player->status.inventory[i].nameid == item_id) count += player->status.inventory[i].amount; } @@ -2891,26 +3339,28 @@ pc_count_all_items(struct map_session_data *player, int item_id) return count; } -int -pc_remove_items(struct map_session_data *player, int item_id, int count) +int pc_remove_items (struct map_session_data *player, int item_id, int count) { - int i; + int i; - nullpo_retr(0, player); + nullpo_retr (0, player); if (player->trade_partner != 0) - trade_tradecancel(player); + trade_tradecancel (player); - for (i = 0; i < MAX_INVENTORY && count; i++) { - if (player->status.inventory[i].nameid == item_id) { - int to_delete = count; + for (i = 0; i < MAX_INVENTORY && count; i++) + { + if (player->status.inventory[i].nameid == item_id) + { + int to_delete = count; /* only delete as much as we have */ if (to_delete > player->status.inventory[i].amount) to_delete = player->status.inventory[i].amount; count -= to_delete; - pc_delitem(player, i, to_delete, 0 /* means `really delete and update status' */); + pc_delitem (player, i, to_delete, + 0 /* means `really delete and update status' */ ); if (!count) return 0; @@ -2923,110 +3373,122 @@ pc_remove_items(struct map_session_data *player, int item_id, int count) * ソスAソスCソスeソスソスソスヌ会ソスBソスツ撰ソスソスフゑソスitemソス\ソスソスソスフの撰ソスソスソスソス無趣ソス *------------------------------------------ */ -int pc_additem(struct map_session_data *sd,struct item *item_data,int amount) -{ - struct item_data *data; - int i,w; - - MAP_LOG_PC(sd, "PICKUP %d %d", item_data->nameid , amount); - - nullpo_retr(1, sd); - nullpo_retr(1, item_data); - - if(item_data->nameid <= 0 || amount <= 0) - return 1; - data = itemdb_search(item_data->nameid); - if((w = data->weight*amount) + sd->weight > sd->max_weight) - return 2; - - i = MAX_INVENTORY; - - if(!itemdb_isequip2(data)){ - // ソスソス ソスソスソスiソスナはなゑソスソスフで、ソスソスソスソスソスLソスiソスネゑソスソスツ撰ソスソスフみ変会ソスソスソスソスソスソスソス - for(i=0;i<MAX_INVENTORY;i++) - if(sd->status.inventory[i].nameid == item_data->nameid && - sd->status.inventory[i].card[0] == item_data->card[0] && sd->status.inventory[i].card[1] == item_data->card[1] && - sd->status.inventory[i].card[2] == item_data->card[2] && sd->status.inventory[i].card[3] == item_data->card[3]) { - if(sd->status.inventory[i].amount+amount > MAX_AMOUNT) - return 5; - sd->status.inventory[i].amount+=amount; - clif_additem(sd,i,amount,0); - break; - } - } - if(i >= MAX_INVENTORY){ - // ソスソス ソスソスソスiソスソスソスソスソスソスソスLソスiソスソスソスソスソスソスフで空き暦ソスソスヨ追会ソス - i = pc_search_inventory(sd,0); - if(i >= 0) { - memcpy(&sd->status.inventory[i],item_data,sizeof(sd->status.inventory[0])); - sd->status.inventory[i].amount=amount; - sd->inventory_data[i]=data; - clif_additem(sd,i,amount,0); - } - else return 4; - } - sd->weight += w; - clif_updatestatus(sd,SP_WEIGHT); +int pc_additem (struct map_session_data *sd, struct item *item_data, + int amount) +{ + struct item_data *data; + int i, w; + + MAP_LOG_PC (sd, "PICKUP %d %d", item_data->nameid, amount); + + nullpo_retr (1, sd); + nullpo_retr (1, item_data); + + if (item_data->nameid <= 0 || amount <= 0) + return 1; + data = itemdb_search (item_data->nameid); + if ((w = data->weight * amount) + sd->weight > sd->max_weight) + return 2; + + i = MAX_INVENTORY; + + if (!itemdb_isequip2 (data)) + { + // ソスソス ソスソスソスiソスナはなゑソスソスフで、ソスソスソスソスソスLソスiソスネゑソスソスツ撰ソスソスフみ変会ソスソスソスソスソスソスソス + for (i = 0; i < MAX_INVENTORY; i++) + if (sd->status.inventory[i].nameid == item_data->nameid && + sd->status.inventory[i].card[0] == item_data->card[0] + && sd->status.inventory[i].card[1] == item_data->card[1] + && sd->status.inventory[i].card[2] == item_data->card[2] + && sd->status.inventory[i].card[3] == item_data->card[3]) + { + if (sd->status.inventory[i].amount + amount > MAX_AMOUNT) + return 5; + sd->status.inventory[i].amount += amount; + clif_additem (sd, i, amount, 0); + break; + } + } + if (i >= MAX_INVENTORY) + { + // ソスソス ソスソスソスiソスソスソスソスソスソスソスLソスiソスソスソスソスソスソスフで空き暦ソスソスヨ追会ソス + i = pc_search_inventory (sd, 0); + if (i >= 0) + { + memcpy (&sd->status.inventory[i], item_data, + sizeof (sd->status.inventory[0])); + sd->status.inventory[i].amount = amount; + sd->inventory_data[i] = data; + clif_additem (sd, i, amount, 0); + } + else + return 4; + } + sd->weight += w; + clif_updatestatus (sd, SP_WEIGHT); - return 0; + return 0; } /*========================================== * ソスAソスCソスeソスソスソスソス轤キ *------------------------------------------ */ -int pc_delitem(struct map_session_data *sd,int n,int amount,int type) -{ - nullpo_retr(1, sd); - - if(sd->status.inventory[n].nameid==0 || amount <= 0 || sd->status.inventory[n].amount<amount || sd->inventory_data[n] == NULL) - return 1; - - sd->status.inventory[n].amount -= amount; - sd->weight -= sd->inventory_data[n]->weight*amount ; - if(sd->status.inventory[n].amount<=0){ - if(sd->status.inventory[n].equip) - pc_unequipitem(sd,n,0); - memset(&sd->status.inventory[n],0,sizeof(sd->status.inventory[0])); - sd->inventory_data[n] = NULL; - } - if(!(type&1)) - clif_delitem(sd,n,amount); - if(!(type&2)) - clif_updatestatus(sd,SP_WEIGHT); +int pc_delitem (struct map_session_data *sd, int n, int amount, int type) +{ + nullpo_retr (1, sd); + + if (sd->status.inventory[n].nameid == 0 || amount <= 0 + || sd->status.inventory[n].amount < amount + || sd->inventory_data[n] == NULL) + return 1; + + sd->status.inventory[n].amount -= amount; + sd->weight -= sd->inventory_data[n]->weight * amount; + if (sd->status.inventory[n].amount <= 0) + { + if (sd->status.inventory[n].equip) + pc_unequipitem (sd, n, 0); + memset (&sd->status.inventory[n], 0, + sizeof (sd->status.inventory[0])); + sd->inventory_data[n] = NULL; + } + if (!(type & 1)) + clif_delitem (sd, n, amount); + if (!(type & 2)) + clif_updatestatus (sd, SP_WEIGHT); - return 0; + return 0; } /*========================================== * ソスAソスCソスeソスソスソス落ゑソス *------------------------------------------ */ -int pc_dropitem(struct map_session_data *sd,int n,int amount) +int pc_dropitem (struct map_session_data *sd, int n, int amount) { - nullpo_retr(1, sd); - - if (sd->trade_partner != 0 || sd->npc_id != 0 || sd->state.storage_flag) - return 0; // no dropping while trading/npc/storage + nullpo_retr (1, sd); - if(n < 0 || n >= MAX_INVENTORY) - return 0; + if (sd->trade_partner != 0 || sd->npc_id != 0 || sd->state.storage_flag) + return 0; // no dropping while trading/npc/storage - if(amount <= 0) - return 0; + if (n < 0 || n >= MAX_INVENTORY) + return 0; - pc_unequipinvyitem(sd, n, 1); + if (amount <= 0) + return 0; + pc_unequipinvyitem (sd, n, 1); - if (sd->status.inventory[n].nameid <= 0 || - sd->status.inventory[n].amount < amount || - sd->trade_partner != 0 || - sd->status.inventory[n].amount <= 0) - return 1; - map_addflooritem(&sd->status.inventory[n], amount, sd->bl.m, sd->bl.x, sd->bl.y, NULL, NULL, NULL, 0); - pc_delitem(sd, n, amount, 0); + if (sd->status.inventory[n].nameid <= 0 || + sd->status.inventory[n].amount < amount || + sd->trade_partner != 0 || sd->status.inventory[n].amount <= 0) + return 1; + map_addflooritem (&sd->status.inventory[n], amount, sd->bl.m, sd->bl.x, + sd->bl.y, NULL, NULL, NULL, 0); + pc_delitem (sd, n, amount, 0); - return 0; + return 0; } /*========================================== @@ -3034,433 +3496,480 @@ int pc_dropitem(struct map_session_data *sd,int n,int amount) *------------------------------------------ */ -static int -can_pick_item_up_from(struct map_session_data *self, int other_id) +static int can_pick_item_up_from (struct map_session_data *self, int other_id) { - struct party *p = party_search(self->status.party_id); + struct party *p = party_search (self->status.party_id); - /* From ourselves or from no-one? */ - if (!self - || self->bl.id == other_id - || !other_id) - return 1; + /* From ourselves or from no-one? */ + if (!self || self->bl.id == other_id || !other_id) + return 1; - struct map_session_data *other = map_id2sd(other_id); + struct map_session_data *other = map_id2sd (other_id); - /* Other no longer exists? */ - if (!other) - return 1; + /* Other no longer exists? */ + if (!other) + return 1; - /* From our partner? */ - if (self->status.partner_id == other->status.char_id) - return 1; + /* From our partner? */ + if (self->status.partner_id == other->status.char_id) + return 1; - /* From a party member? */ - if (self->status.party_id - && self->status.party_id == other->status.party_id - && p && p->item != 0 - ) - return 1; + /* From a party member? */ + if (self->status.party_id + && self->status.party_id == other->status.party_id + && p && p->item != 0) + return 1; - /* From someone who is far away? */ - /* On another map? */ - if (other->bl.m != self->bl.m) - return 1; - else { - int distance_x = abs(other->bl.x - self->bl.x); - int distance_y = abs(other->bl.y - self->bl.y); - int distance = (distance_x > distance_y) ? distance_x : distance_y; + /* From someone who is far away? */ + /* On another map? */ + if (other->bl.m != self->bl.m) + return 1; + else + { + int distance_x = abs (other->bl.x - self->bl.x); + int distance_y = abs (other->bl.y - self->bl.y); + int distance = (distance_x > distance_y) ? distance_x : distance_y; - return distance > battle_config.drop_pickup_safety_zone; - } + return distance > battle_config.drop_pickup_safety_zone; + } } -int pc_takeitem(struct map_session_data *sd,struct flooritem_data *fitem) +int pc_takeitem (struct map_session_data *sd, struct flooritem_data *fitem) { - int flag; - unsigned int tick = gettick(); - int can_take; + int flag; + unsigned int tick = gettick (); + int can_take; - nullpo_retr(0, sd); - nullpo_retr(0, fitem); + nullpo_retr (0, sd); + nullpo_retr (0, fitem); - /* Sometimes the owners reported to us are buggy: */ + /* Sometimes the owners reported to us are buggy: */ - if (fitem->first_get_id == fitem->third_get_id - || fitem->second_get_id == fitem->third_get_id) - fitem->third_get_id = 0; + if (fitem->first_get_id == fitem->third_get_id + || fitem->second_get_id == fitem->third_get_id) + fitem->third_get_id = 0; - if (fitem->first_get_id == fitem->second_get_id) { - fitem->second_get_id = fitem->third_get_id; - fitem->third_get_id = 0; - } + if (fitem->first_get_id == fitem->second_get_id) + { + fitem->second_get_id = fitem->third_get_id; + fitem->third_get_id = 0; + } - can_take = can_pick_item_up_from (sd, fitem->first_get_id); - if (!can_take) - can_take = fitem->first_get_tick <= tick - && can_pick_item_up_from (sd, fitem->second_get_id); + can_take = can_pick_item_up_from (sd, fitem->first_get_id); + if (!can_take) + can_take = fitem->first_get_tick <= tick + && can_pick_item_up_from (sd, fitem->second_get_id); - if (!can_take) - can_take = fitem->second_get_tick <= tick - && can_pick_item_up_from (sd, fitem->third_get_id); + if (!can_take) + can_take = fitem->second_get_tick <= tick + && can_pick_item_up_from (sd, fitem->third_get_id); - if (!can_take) - can_take = fitem->third_get_tick <= tick; + if (!can_take) + can_take = fitem->third_get_tick <= tick; - if (can_take) { - /* Can pick up */ + if (can_take) + { + /* Can pick up */ - if((flag = pc_additem(sd,&fitem->item_data,fitem->item_data.amount))) - // ソスdソスソスoverソスナ取得ソスソスソスs - clif_additem(sd,0,0,flag); - else { - /* ソス謫セソスソスソスソス */ - if(sd->attacktimer != -1) - pc_stopattack(sd); - clif_takeitem(&sd->bl,&fitem->bl); - map_clearflooritem(fitem->bl.id); - } - return 0; + if ((flag = + pc_additem (sd, &fitem->item_data, fitem->item_data.amount))) + // ソスdソスソスoverソスナ取得ソスソスソスs + clif_additem (sd, 0, 0, flag); + else + { + /* ソス謫セソスソスソスソス */ + if (sd->attacktimer != -1) + pc_stopattack (sd); + clif_takeitem (&sd->bl, &fitem->bl); + map_clearflooritem (fitem->bl.id); } - - /* Otherwise, we can't pick up */ - clif_additem(sd,0,0,6); return 0; + } + + /* Otherwise, we can't pick up */ + clif_additem (sd, 0, 0, 6); + return 0; } -int pc_isUseitem(struct map_session_data *sd,int n) +int pc_isUseitem (struct map_session_data *sd, int n) { - struct item_data *item; - int nameid; + struct item_data *item; + int nameid; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - item = sd->inventory_data[n]; - nameid = sd->status.inventory[n].nameid; + item = sd->inventory_data[n]; + nameid = sd->status.inventory[n].nameid; - if(item == NULL) - return 0; - if (itemdb_type(nameid) != 0) - return 0; - if((nameid == 605) && map[sd->bl.m].flag.gvg) - return 0; - if(nameid == 601 && (map[sd->bl.m].flag.noteleport || map[sd->bl.m].flag.gvg)) { - clif_skill_teleportmessage(sd,0); - return 0; - } + if (item == NULL) + return 0; + if (itemdb_type (nameid) != 0) + return 0; + if ((nameid == 605) && map[sd->bl.m].flag.gvg) + return 0; + if (nameid == 601 + && (map[sd->bl.m].flag.noteleport || map[sd->bl.m].flag.gvg)) + { + clif_skill_teleportmessage (sd, 0); + return 0; + } - if(nameid == 602 && map[sd->bl.m].flag.noreturn) - return 0; - if(nameid == 604 && (map[sd->bl.m].flag.nobranch || map[sd->bl.m].flag.gvg)) - return 0; - if(item->sex != 2 && sd->status.sex != item->sex) - return 0; - if(item->elv > 0 && sd->status.base_level < item->elv) - return 0; + if (nameid == 602 && map[sd->bl.m].flag.noreturn) + return 0; + if (nameid == 604 + && (map[sd->bl.m].flag.nobranch || map[sd->bl.m].flag.gvg)) + return 0; + if (item->sex != 2 && sd->status.sex != item->sex) + return 0; + if (item->elv > 0 && sd->status.base_level < item->elv) + return 0; - return 1; + return 1; } /*========================================== * ソスAソスCソスeソスソスソスソスソスgソスソス *------------------------------------------ */ -int pc_useitem(struct map_session_data *sd,int n) -{ - int nameid,amount; - - nullpo_retr(1, sd); - - if(n >=0 && n < MAX_INVENTORY && sd->inventory_data[n]) { - nameid = sd->status.inventory[n].nameid; - amount = sd->status.inventory[n].amount; - if(sd->status.inventory[n].nameid <= 0 || sd->status.inventory[n].amount <= 0 || sd->sc_data[SC_BERSERK].timer!=-1 || !pc_isUseitem(sd,n) ) { - clif_useitemack(sd,n,0,0); - return 1; - } +int pc_useitem (struct map_session_data *sd, int n) +{ + int nameid, amount; + + nullpo_retr (1, sd); + + if (n >= 0 && n < MAX_INVENTORY && sd->inventory_data[n]) + { + nameid = sd->status.inventory[n].nameid; + amount = sd->status.inventory[n].amount; + if (sd->status.inventory[n].nameid <= 0 + || sd->status.inventory[n].amount <= 0 + || sd->sc_data[SC_BERSERK].timer != -1 || !pc_isUseitem (sd, n)) + { + clif_useitemack (sd, n, 0, 0); + return 1; + } - run_script(sd->inventory_data[n]->use_script,0,sd->bl.id,0); + run_script (sd->inventory_data[n]->use_script, 0, sd->bl.id, 0); - clif_useitemack(sd,n,amount-1,1); - pc_delitem(sd,n,1,1); - } + clif_useitemack (sd, n, amount - 1, 1); + pc_delitem (sd, n, 1, 1); + } - return 0; + return 0; } /*========================================== * ソスJソス[ソスgソスAソスCソスeソスソスソスヌ会ソスBソスツ撰ソスソスフゑソスitemソス\ソスソスソスフの撰ソスソスソスソス無趣ソス *------------------------------------------ */ -int pc_cart_additem(struct map_session_data *sd,struct item *item_data,int amount) -{ - struct item_data *data; - int i,w; - - nullpo_retr(1, sd); - nullpo_retr(1, item_data); - - if(item_data->nameid <= 0 || amount <= 0) - return 1; - data = itemdb_search(item_data->nameid); - - if((w=data->weight*amount) + sd->cart_weight > sd->cart_max_weight) - return 1; - - i=MAX_CART; - if(!itemdb_isequip2(data)){ - // ソスソス ソスソスソスiソスナはなゑソスソスフで、ソスソスソスソスソスLソスiソスネゑソスソスツ撰ソスソスフみ変会ソスソスソスソスソスソスソス - for(i=0;i<MAX_CART;i++){ - if(sd->status.cart[i].nameid==item_data->nameid && - sd->status.cart[i].card[0] == item_data->card[0] && sd->status.cart[i].card[1] == item_data->card[1] && - sd->status.cart[i].card[2] == item_data->card[2] && sd->status.cart[i].card[3] == item_data->card[3]){ - if(sd->status.cart[i].amount+amount > MAX_AMOUNT) - return 1; - sd->status.cart[i].amount+=amount; - clif_cart_additem(sd,i,amount,0); - break; - } - } - } - if(i >= MAX_CART){ - // ソスソス ソスソスソスiソスソスソスソスソスソスソスLソスiソスソスソスソスソスソスフで空き暦ソスソスヨ追会ソス - for(i=0;i<MAX_CART;i++){ - if(sd->status.cart[i].nameid==0){ - memcpy(&sd->status.cart[i],item_data,sizeof(sd->status.cart[0])); - sd->status.cart[i].amount=amount; - sd->cart_num++; - clif_cart_additem(sd,i,amount,0); - break; - } - } - if(i >= MAX_CART) - return 1; - } - sd->cart_weight += w; - clif_updatestatus(sd,SP_CARTINFO); +int pc_cart_additem (struct map_session_data *sd, struct item *item_data, + int amount) +{ + struct item_data *data; + int i, w; + + nullpo_retr (1, sd); + nullpo_retr (1, item_data); + + if (item_data->nameid <= 0 || amount <= 0) + return 1; + data = itemdb_search (item_data->nameid); + + if ((w = data->weight * amount) + sd->cart_weight > sd->cart_max_weight) + return 1; + + i = MAX_CART; + if (!itemdb_isequip2 (data)) + { + // ソスソス ソスソスソスiソスナはなゑソスソスフで、ソスソスソスソスソスLソスiソスネゑソスソスツ撰ソスソスフみ変会ソスソスソスソスソスソスソス + for (i = 0; i < MAX_CART; i++) + { + if (sd->status.cart[i].nameid == item_data->nameid && + sd->status.cart[i].card[0] == item_data->card[0] + && sd->status.cart[i].card[1] == item_data->card[1] + && sd->status.cart[i].card[2] == item_data->card[2] + && sd->status.cart[i].card[3] == item_data->card[3]) + { + if (sd->status.cart[i].amount + amount > MAX_AMOUNT) + return 1; + sd->status.cart[i].amount += amount; + clif_cart_additem (sd, i, amount, 0); + break; + } + } + } + if (i >= MAX_CART) + { + // ソスソス ソスソスソスiソスソスソスソスソスソスソスLソスiソスソスソスソスソスソスフで空き暦ソスソスヨ追会ソス + for (i = 0; i < MAX_CART; i++) + { + if (sd->status.cart[i].nameid == 0) + { + memcpy (&sd->status.cart[i], item_data, + sizeof (sd->status.cart[0])); + sd->status.cart[i].amount = amount; + sd->cart_num++; + clif_cart_additem (sd, i, amount, 0); + break; + } + } + if (i >= MAX_CART) + return 1; + } + sd->cart_weight += w; + clif_updatestatus (sd, SP_CARTINFO); - return 0; + return 0; } /*========================================== * ソスJソス[ソスgソスAソスCソスeソスソスソスソス轤キ *------------------------------------------ */ -int pc_cart_delitem(struct map_session_data *sd,int n,int amount,int type) +int pc_cart_delitem (struct map_session_data *sd, int n, int amount, int type) { - nullpo_retr(1, sd); + nullpo_retr (1, sd); - if(sd->status.cart[n].nameid==0 || - sd->status.cart[n].amount<amount) - return 1; + if (sd->status.cart[n].nameid == 0 || sd->status.cart[n].amount < amount) + return 1; - sd->status.cart[n].amount -= amount; - sd->cart_weight -= itemdb_weight(sd->status.cart[n].nameid)*amount ; - if(sd->status.cart[n].amount <= 0){ - memset(&sd->status.cart[n],0,sizeof(sd->status.cart[0])); - sd->cart_num--; - } - if(!type) { - clif_cart_delitem(sd,n,amount); - clif_updatestatus(sd,SP_CARTINFO); - } + sd->status.cart[n].amount -= amount; + sd->cart_weight -= itemdb_weight (sd->status.cart[n].nameid) * amount; + if (sd->status.cart[n].amount <= 0) + { + memset (&sd->status.cart[n], 0, sizeof (sd->status.cart[0])); + sd->cart_num--; + } + if (!type) + { + clif_cart_delitem (sd, n, amount); + clif_updatestatus (sd, SP_CARTINFO); + } - return 0; + return 0; } /*========================================== * ソスJソス[ソスgソスヨアソスCソスeソスソスソスレ難ソス *------------------------------------------ */ -int pc_putitemtocart(struct map_session_data *sd,int idx,int amount) { - struct item *item_data; +int pc_putitemtocart (struct map_session_data *sd, int idx, int amount) +{ + struct item *item_data; - nullpo_retr(0, sd); - nullpo_retr(0, item_data = &sd->status.inventory[idx]); + nullpo_retr (0, sd); + nullpo_retr (0, item_data = &sd->status.inventory[idx]); - if (item_data->nameid==0 || item_data->amount<amount) - return 1; - if (pc_cart_additem(sd,item_data,amount) == 0) - return pc_delitem(sd,idx,amount,0); + if (item_data->nameid == 0 || item_data->amount < amount) + return 1; + if (pc_cart_additem (sd, item_data, amount) == 0) + return pc_delitem (sd, idx, amount, 0); - return 1; + return 1; } /*========================================== * ソスJソス[ソスgソスソスソスフアソスCソスeソスソスソスソスソスmソスF(ソスツ撰ソスソスフ搾ソスソスソスソスソスソスヤゑソス) *------------------------------------------ */ -int pc_cartitem_amount(struct map_session_data *sd,int idx,int amount) +int pc_cartitem_amount (struct map_session_data *sd, int idx, int amount) { - struct item *item_data; + struct item *item_data; - nullpo_retr(-1, sd); - nullpo_retr(-1, item_data=&sd->status.cart[idx]); + nullpo_retr (-1, sd); + nullpo_retr (-1, item_data = &sd->status.cart[idx]); - if( item_data->nameid==0 || !item_data->amount) - return -1; - return item_data->amount-amount; + if (item_data->nameid == 0 || !item_data->amount) + return -1; + return item_data->amount - amount; } + /*========================================== * ソスJソス[ソスgソスソスソスソスソスAソスCソスeソスソスソスレ難ソス *------------------------------------------ */ -int pc_getitemfromcart(struct map_session_data *sd,int idx,int amount) +int pc_getitemfromcart (struct map_session_data *sd, int idx, int amount) { - struct item *item_data; - int flag; + struct item *item_data; + int flag; - nullpo_retr(0, sd); - nullpo_retr(0, item_data=&sd->status.cart[idx]); + nullpo_retr (0, sd); + nullpo_retr (0, item_data = &sd->status.cart[idx]); - if( item_data->nameid==0 || item_data->amount<amount) - return 1; - if((flag = pc_additem(sd,item_data,amount)) == 0) - return pc_cart_delitem(sd,idx,amount,0); + if (item_data->nameid == 0 || item_data->amount < amount) + return 1; + if ((flag = pc_additem (sd, item_data, amount)) == 0) + return pc_cart_delitem (sd, idx, amount, 0); - clif_additem(sd,0,0,flag); - return 1; + clif_additem (sd, 0, 0, flag); + return 1; } /*========================================== * ソスAソスCソスeソスソスソスモ抵ソス *------------------------------------------ */ -int pc_item_identify(struct map_session_data *sd,int idx) +int pc_item_identify (struct map_session_data *sd, int idx) { - int flag=1; + int flag = 1; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(idx >= 0 && idx < MAX_INVENTORY) { - if(sd->status.inventory[idx].nameid > 0 && sd->status.inventory[idx].identify == 0 ){ - flag=0; - sd->status.inventory[idx].identify=1; - } - clif_item_identified(sd,idx,flag); - } - else - clif_item_identified(sd,idx,flag); + if (idx >= 0 && idx < MAX_INVENTORY) + { + if (sd->status.inventory[idx].nameid > 0 + && sd->status.inventory[idx].identify == 0) + { + flag = 0; + sd->status.inventory[idx].identify = 1; + } + clif_item_identified (sd, idx, flag); + } + else + clif_item_identified (sd, idx, flag); - return !flag; + return !flag; } /*========================================== * ソスXソスeソスBソスソスソスiソスソスソスJ *------------------------------------------ */ -int pc_show_steal(struct block_list *bl,va_list ap) -{ - struct map_session_data *sd; - int itemid; - int type; - - struct item_data *item=NULL; - char output[100]; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, sd=va_arg(ap,struct map_session_data *)); - - itemid=va_arg(ap,int); - type=va_arg(ap,int); - - if(!type){ - if((item=itemdb_exists(itemid))==NULL) - sprintf(output,"%s stole an Unknown_Item.",sd->status.name); - else - sprintf(output,"%s stole %s.",sd->status.name,item->jname); - clif_displaymessage( ((struct map_session_data *)bl)->fd, output); - }else{ - sprintf(output,"%s has not stolen the item because of being overweight.",sd->status.name); - clif_displaymessage( ((struct map_session_data *)bl)->fd, output); - } +int pc_show_steal (struct block_list *bl, va_list ap) +{ + struct map_session_data *sd; + int itemid; + int type; + + struct item_data *item = NULL; + char output[100]; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, sd = va_arg (ap, struct map_session_data *)); - return 0; + itemid = va_arg (ap, int); + type = va_arg (ap, int); + + if (!type) + { + if ((item = itemdb_exists (itemid)) == NULL) + sprintf (output, "%s stole an Unknown_Item.", sd->status.name); + else + sprintf (output, "%s stole %s.", sd->status.name, item->jname); + clif_displaymessage (((struct map_session_data *) bl)->fd, output); + } + else + { + sprintf (output, + "%s has not stolen the item because of being overweight.", + sd->status.name); + clif_displaymessage (((struct map_session_data *) bl)->fd, output); + } + + return 0; } + /*========================================== * *------------------------------------------ */ //** pc.c: Small Steal Item fix by fritz -int pc_steal_item(struct map_session_data *sd,struct block_list *bl) -{ - if(sd != NULL && bl != NULL && bl->type == BL_MOB) { - int i,skill,rate,itemid,flag, count; - struct mob_data *md; - md=(struct mob_data *)bl; - if(!md->state.steal_flag && mob_db[md->class].mexp <= 0 && !(mob_db[md->class].mode&0x20) && md->sc_data[SC_STONE].timer == -1 && md->sc_data[SC_FREEZE].timer == -1 && - (!(md->class>1324 && md->class<1364))) // prevent stealing from treasure boxes [Valaris] - { - skill = sd->paramc[4] - mob_db[md->class].dex + pc_checkskill(sd,TF_STEAL) + 10; - - if(0 < skill) - { - for(count = 8; count <= 8 && count != 0; count--) - { - i = rand()%8; - itemid = mob_db[md->class].dropitem[i].nameid; - - if(itemid > 0 && itemdb_type(itemid) != 6) - { - rate = (mob_db[md->class].dropitem[i].p / battle_config.item_rate_common * 100 * skill)/100; - - if(rand()%10000 < rate) - { - struct item tmp_item; - memset(&tmp_item,0,sizeof(tmp_item)); - tmp_item.nameid = itemid; - tmp_item.amount = 1; - tmp_item.identify = 1; - flag = pc_additem(sd,&tmp_item,1); - if(battle_config.show_steal_in_same_party) - { - party_foreachsamemap(pc_show_steal,sd,1,sd,tmp_item.nameid,0); - } - - if(flag) - { - if(battle_config.show_steal_in_same_party) - { - party_foreachsamemap(pc_show_steal,sd,1,sd,tmp_item.nameid,1); - } - - clif_additem(sd,0,0,flag); - } - md->state.steal_flag = 1; - return 1; - } - } - } - } - } - } - return 0; +int pc_steal_item (struct map_session_data *sd, struct block_list *bl) +{ + if (sd != NULL && bl != NULL && bl->type == BL_MOB) + { + int i, skill, rate, itemid, flag, count; + struct mob_data *md; + md = (struct mob_data *) bl; + if (!md->state.steal_flag && mob_db[md->class].mexp <= 0 && !(mob_db[md->class].mode & 0x20) && md->sc_data[SC_STONE].timer == -1 && md->sc_data[SC_FREEZE].timer == -1 && (!(md->class > 1324 && md->class < 1364))) // prevent stealing from treasure boxes [Valaris] + { + skill = + sd->paramc[4] - mob_db[md->class].dex + pc_checkskill (sd, + TF_STEAL) + + 10; + + if (0 < skill) + { + for (count = 8; count <= 8 && count != 0; count--) + { + i = rand () % 8; + itemid = mob_db[md->class].dropitem[i].nameid; + + if (itemid > 0 && itemdb_type (itemid) != 6) + { + rate = + (mob_db[md->class].dropitem[i].p / + battle_config.item_rate_common * 100 * skill) / + 100; + + if (rand () % 10000 < rate) + { + struct item tmp_item; + memset (&tmp_item, 0, sizeof (tmp_item)); + tmp_item.nameid = itemid; + tmp_item.amount = 1; + tmp_item.identify = 1; + flag = pc_additem (sd, &tmp_item, 1); + if (battle_config.show_steal_in_same_party) + { + party_foreachsamemap (pc_show_steal, sd, 1, + sd, tmp_item.nameid, 0); + } + + if (flag) + { + if (battle_config.show_steal_in_same_party) + { + party_foreachsamemap (pc_show_steal, sd, + 1, sd, + tmp_item.nameid, 1); + } + + clif_additem (sd, 0, 0, flag); + } + md->state.steal_flag = 1; + return 1; + } + } + } + } + } + } + return 0; } /*========================================== * *------------------------------------------ */ -int pc_steal_coin(struct map_session_data *sd,struct block_list *bl) -{ - if(sd != NULL && bl != NULL && bl->type == BL_MOB) { - int rate,skill; - struct mob_data *md=(struct mob_data *)bl; - if(md && !md->state.steal_coin_flag && md->sc_data && md->sc_data[SC_STONE].timer == -1 && md->sc_data[SC_FREEZE].timer == -1) { - skill = pc_checkskill(sd,RG_STEALCOIN)*10; - rate = skill + (sd->status.base_level - mob_db[md->class].lv)*3 + sd->paramc[4]*2 + sd->paramc[5]*2; - if(MRAND(1000) < rate) { - pc_getzeny(sd,mob_db[md->class].lv*10 + MRAND(100)); - md->state.steal_coin_flag = 1; - return 1; - } - } - } +int pc_steal_coin (struct map_session_data *sd, struct block_list *bl) +{ + if (sd != NULL && bl != NULL && bl->type == BL_MOB) + { + int rate, skill; + struct mob_data *md = (struct mob_data *) bl; + if (md && !md->state.steal_coin_flag && md->sc_data + && md->sc_data[SC_STONE].timer == -1 + && md->sc_data[SC_FREEZE].timer == -1) + { + skill = pc_checkskill (sd, RG_STEALCOIN) * 10; + rate = + skill + (sd->status.base_level - mob_db[md->class].lv) * 3 + + sd->paramc[4] * 2 + sd->paramc[5] * 2; + if (MRAND (1000) < rate) + { + pc_getzeny (sd, mob_db[md->class].lv * 10 + MRAND (100)); + md->state.steal_coin_flag = 1; + return 1; + } + } + } - return 0; + return 0; } + // // // @@ -3468,232 +3977,258 @@ int pc_steal_coin(struct map_session_data *sd,struct block_list *bl) * PCソスフ位置ソスン抵ソス *------------------------------------------ */ -int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrtype) -{ - char mapname[24]; - int m=0,c=0,disguise=0; - - nullpo_retr(0, sd); - - if(sd->chatID) // ソス`ソスソスソスbソスgソスソスソスソスソスoソスソス - chat_leavechat(sd); - if(sd->trade_partner) // ソスソスソスソスソス中断ソスソスソスソス - trade_tradecancel(sd); - if(sd->state.storage_flag == 1) - storage_storage_quit(sd); // ソスqソスノゑソスソスJソスソスソストゑソスソスネゑソスソスロ托ソスソスソスソスソス - else if (sd->state.storage_flag == 2) - storage_guild_storage_quit(sd,0); - - if(sd->party_invite>0) // ソスpソス[ソスeソスBソスソスソスUソスソスロゑソスソスソス - party_reply_invite(sd,sd->party_invite_account,0); - if(sd->guild_invite>0) // ソスMソスソスソスhソスソスソスUソスソスロゑソスソスソス - guild_reply_invite(sd,sd->guild_invite,0); - if(sd->guild_alliance>0) // ソスMソスソスソスhソスソスソスソスソスソスソスUソスソスロゑソスソスソス - guild_reply_reqalliance(sd,sd->guild_alliance_account,0); - - skill_castcancel(&sd->bl,0); // ソスrソスソスソスソスソスf - pc_stop_walking(sd,0); // ソスソスソスsソスソスソスf - pc_stopattack(sd); // ソスUソスソスソスソスソスf - - if(pc_issit(sd)) { - pc_setstand(sd); - skill_gangsterparadise(sd,0); - } +int pc_setpos (struct map_session_data *sd, char *mapname_org, int x, int y, + int clrtype) +{ + char mapname[24]; + int m = 0, c = 0, disguise = 0; + + nullpo_retr (0, sd); + + if (sd->chatID) // ソス`ソスソスソスbソスgソスソスソスソスソスoソスソス + chat_leavechat (sd); + if (sd->trade_partner) // ソスソスソスソスソス中断ソスソスソスソス + trade_tradecancel (sd); + if (sd->state.storage_flag == 1) + storage_storage_quit (sd); // ソスqソスノゑソスソスJソスソスソストゑソスソスネゑソスソスロ托ソスソスソスソスソス + else if (sd->state.storage_flag == 2) + storage_guild_storage_quit (sd, 0); + + if (sd->party_invite > 0) // ソスpソス[ソスeソスBソスソスソスUソスソスロゑソスソスソス + party_reply_invite (sd, sd->party_invite_account, 0); + if (sd->guild_invite > 0) // ソスMソスソスソスhソスソスソスUソスソスロゑソスソスソス + guild_reply_invite (sd, sd->guild_invite, 0); + if (sd->guild_alliance > 0) // ソスMソスソスソスhソスソスソスソスソスソスソスUソスソスロゑソスソスソス + guild_reply_reqalliance (sd, sd->guild_alliance_account, 0); + + skill_castcancel (&sd->bl, 0); // ソスrソスソスソスソスソスf + pc_stop_walking (sd, 0); // ソスソスソスsソスソスソスf + pc_stopattack (sd); // ソスUソスソスソスソスソスf + + if (pc_issit (sd)) + { + pc_setstand (sd); + skill_gangsterparadise (sd, 0); + } - if(sd->sc_data[SC_TRICKDEAD].timer != -1) - skill_status_change_end(&sd->bl, SC_TRICKDEAD, -1); - if(sd->status.option&2) - skill_status_change_end(&sd->bl, SC_HIDING, -1); - if(sd->status.option&4) - skill_status_change_end(&sd->bl, SC_CLOAKING, -1); - if(sd->status.option&16386) - skill_status_change_end(&sd->bl, SC_CHASEWALK, -1); - if(sd->sc_data[SC_BLADESTOP].timer!=-1) - skill_status_change_end(&sd->bl,SC_BLADESTOP,-1); - if(sd->sc_data[SC_DANCING].timer!=-1) // clear dance effect when warping [Valaris] - skill_stop_dancing(&sd->bl,0); - - if(sd->disguise) { // clear disguises when warping [Valaris] - clif_clearchar(&sd->bl, 9); - disguise=sd->disguise; - sd->disguise=0; - } + if (sd->sc_data[SC_TRICKDEAD].timer != -1) + skill_status_change_end (&sd->bl, SC_TRICKDEAD, -1); + if (sd->status.option & 2) + skill_status_change_end (&sd->bl, SC_HIDING, -1); + if (sd->status.option & 4) + skill_status_change_end (&sd->bl, SC_CLOAKING, -1); + if (sd->status.option & 16386) + skill_status_change_end (&sd->bl, SC_CHASEWALK, -1); + if (sd->sc_data[SC_BLADESTOP].timer != -1) + skill_status_change_end (&sd->bl, SC_BLADESTOP, -1); + if (sd->sc_data[SC_DANCING].timer != -1) // clear dance effect when warping [Valaris] + skill_stop_dancing (&sd->bl, 0); + + if (sd->disguise) + { // clear disguises when warping [Valaris] + clif_clearchar (&sd->bl, 9); + disguise = sd->disguise; + sd->disguise = 0; + } - memcpy(mapname,mapname_org,24); - mapname[16]=0; - if(strstr(mapname,".gat")==NULL && strlen(mapname)<16){ - strcat(mapname,".gat"); - } + memcpy (mapname, mapname_org, 24); + mapname[16] = 0; + if (strstr (mapname, ".gat") == NULL && strlen (mapname) < 16) + { + strcat (mapname, ".gat"); + } - m=map_mapname2mapid(mapname); - if(m<0){ - if(sd->mapname[0]){ - int ip,port; - if(map_mapname2ipport(mapname,&ip,&port)==0){ - skill_stop_dancing(&sd->bl,1); - skill_unit_out_all(&sd->bl,gettick(),1); - clif_clearchar_area(&sd->bl,clrtype&0xffff); - skill_gangsterparadise(sd,0); - map_delblock(&sd->bl); - memcpy(sd->mapname,mapname,24); - sd->bl.x=x; - sd->bl.y=y; - sd->state.waitingdisconnect=1; - pc_makesavestatus(sd); - //The storage close routines save the char data. [Skotlex] - if (!sd->state.storage_flag) - chrif_save(sd); - else if (sd->state.storage_flag == 1) - storage_storage_quit(sd); - else if (sd->state.storage_flag == 2) - storage_guild_storage_quit(sd,1); - - chrif_changemapserver(sd, mapname, x, y, ip, port); - return 0; - } - } + m = map_mapname2mapid (mapname); + if (m < 0) + { + if (sd->mapname[0]) + { + int ip, port; + if (map_mapname2ipport (mapname, &ip, &port) == 0) + { + skill_stop_dancing (&sd->bl, 1); + skill_unit_out_all (&sd->bl, gettick (), 1); + clif_clearchar_area (&sd->bl, clrtype & 0xffff); + skill_gangsterparadise (sd, 0); + map_delblock (&sd->bl); + memcpy (sd->mapname, mapname, 24); + sd->bl.x = x; + sd->bl.y = y; + sd->state.waitingdisconnect = 1; + pc_makesavestatus (sd); + //The storage close routines save the char data. [Skotlex] + if (!sd->state.storage_flag) + chrif_save (sd); + else if (sd->state.storage_flag == 1) + storage_storage_quit (sd); + else if (sd->state.storage_flag == 2) + storage_guild_storage_quit (sd, 1); + + chrif_changemapserver (sd, mapname, x, y, ip, port); + return 0; + } + } #if 0 - clif_authfail_fd(sd->fd,0); // cancel - clif_setwaitclose(sd->fd); + clif_authfail_fd (sd->fd, 0); // cancel + clif_setwaitclose (sd->fd); #endif - return 1; - } + return 1; + } - if(x <0 || x >= map[m].xs || y <0 || y >= map[m].ys) - x=y=0; - if((x==0 && y==0) || (c=read_gat(m,x,y))==1 || c==5){ - if(x||y) { - if(battle_config.error_log) - printf("stacked (%d,%d)\n",x,y); - } - do { - x=MRAND(map[m].xs-2)+1; - y=MRAND(map[m].ys-2)+1; - } while((c=read_gat(m,x,y))==1 || c==5); - } + if (x < 0 || x >= map[m].xs || y < 0 || y >= map[m].ys) + x = y = 0; + if ((x == 0 && y == 0) || (c = read_gat (m, x, y)) == 1 || c == 5) + { + if (x || y) + { + if (battle_config.error_log) + printf ("stacked (%d,%d)\n", x, y); + } + do + { + x = MRAND (map[m].xs - 2) + 1; + y = MRAND (map[m].ys - 2) + 1; + } + while ((c = read_gat (m, x, y)) == 1 || c == 5); + } - if(sd->mapname[0] && sd->bl.prev != NULL){ - skill_unit_out_all(&sd->bl,gettick(),1); - clif_clearchar_area(&sd->bl,clrtype&0xffff); - skill_gangsterparadise(sd,0); - map_delblock(&sd->bl); - clif_changemap(sd,map[m].name,x,y); // [MouseJstr] - } + if (sd->mapname[0] && sd->bl.prev != NULL) + { + skill_unit_out_all (&sd->bl, gettick (), 1); + clif_clearchar_area (&sd->bl, clrtype & 0xffff); + skill_gangsterparadise (sd, 0); + map_delblock (&sd->bl); + clif_changemap (sd, map[m].name, x, y); // [MouseJstr] + } - if(disguise) // disguise teleport fix [Valaris] - sd->disguise=disguise; - - memcpy(sd->mapname,mapname,24); - sd->bl.m = m; - sd->to_x = x; - sd->to_y = y; + if (disguise) // disguise teleport fix [Valaris] + sd->disguise = disguise; - // moved and changed dance effect stopping + memcpy (sd->mapname, mapname, 24); + sd->bl.m = m; + sd->to_x = x; + sd->to_y = y; - sd->bl.x = x; - sd->bl.y = y; + // moved and changed dance effect stopping -// map_addblock(&sd->bl); /// ソスuソスソスソスbソスNソスoソス^ソスソスspawnソスソス -// clif_spawnpc(sd); + sd->bl.x = x; + sd->bl.y = y; - return 0; +// map_addblock(&sd->bl); /// ソスuソスソスソスbソスNソスoソス^ソスソスspawnソスソス +// clif_spawnpc(sd); + + return 0; } /*========================================== * PCソスフソスソスソスソス_ソスソスソスソスソス[ソスv *------------------------------------------ */ -int pc_randomwarp(struct map_session_data *sd, int type) { - int x,y,c,i=0; - int m; +int pc_randomwarp (struct map_session_data *sd, int type) +{ + int x, y, c, i = 0; + int m; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - m=sd->bl.m; + m = sd->bl.m; - if (map[sd->bl.m].flag.noteleport) // ソスeソスソスソス|ソス[ソスgソスヨ止 - return 0; + if (map[sd->bl.m].flag.noteleport) // ソスeソスソスソス|ソス[ソスgソスヨ止 + return 0; - do{ - x=MRAND(map[m].xs-2)+1; - y=MRAND(map[m].ys-2)+1; - } while (((c=read_gat(m,x,y)) == 1 || c == 5) && (i++) < 1000); + do + { + x = MRAND (map[m].xs - 2) + 1; + y = MRAND (map[m].ys - 2) + 1; + } + while (((c = read_gat (m, x, y)) == 1 || c == 5) && (i++) < 1000); - if (i < 1000) - pc_setpos(sd,map[m].name,x,y,type); + if (i < 1000) + pc_setpos (sd, map[m].name, x, y, type); - return 0; + return 0; } /*========================================== * ソスソスソスン位置ソスフソスソスソス *------------------------------------------ */ -int pc_memo(struct map_session_data *sd, int i) { - int skill; - int j; +int pc_memo (struct map_session_data *sd, int i) +{ + int skill; + int j; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - skill = pc_checkskill(sd, AL_WARP); + skill = pc_checkskill (sd, AL_WARP); - if (i >= MIN_PORTAL_MEMO) - i -= MIN_PORTAL_MEMO; - else if (map[sd->bl.m].flag.nomemo || (map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd))) { - clif_skill_teleportmessage(sd, 1); - return 0; - } + if (i >= MIN_PORTAL_MEMO) + i -= MIN_PORTAL_MEMO; + else if (map[sd->bl.m].flag.nomemo + || (map[sd->bl.m].flag.nowarpto + && battle_config.any_warp_GM_min_level > pc_isGM (sd))) + { + clif_skill_teleportmessage (sd, 1); + return 0; + } - if (skill < 1) { - clif_skill_memo(sd,2); - } + if (skill < 1) + { + clif_skill_memo (sd, 2); + } - if (skill < 2 || i < -1 || i > 2) { - clif_skill_memo(sd, 1); - return 0; - } + if (skill < 2 || i < -1 || i > 2) + { + clif_skill_memo (sd, 1); + return 0; + } - for(j = 0 ; j < 3; j++) { - if (strcmp(sd->status.memo_point[j].map, map[sd->bl.m].name) == 0) { - i = j; - break; - } - } + for (j = 0; j < 3; j++) + { + if (strcmp (sd->status.memo_point[j].map, map[sd->bl.m].name) == 0) + { + i = j; + break; + } + } - if (i == -1) { - for(i = skill - 3; i >= 0; i--) { - memcpy(&sd->status.memo_point[i+1],&sd->status.memo_point[i], - sizeof(struct point)); - } - i = 0; - } - memcpy(sd->status.memo_point[i].map, map[sd->bl.m].name, 24); - sd->status.memo_point[i].x = sd->bl.x; - sd->status.memo_point[i].y = sd->bl.y; + if (i == -1) + { + for (i = skill - 3; i >= 0; i--) + { + memcpy (&sd->status.memo_point[i + 1], &sd->status.memo_point[i], + sizeof (struct point)); + } + i = 0; + } + memcpy (sd->status.memo_point[i].map, map[sd->bl.m].name, 24); + sd->status.memo_point[i].x = sd->bl.x; + sd->status.memo_point[i].y = sd->bl.y; - clif_skill_memo(sd, 0); + clif_skill_memo (sd, 0); - return 1; + return 1; } /*========================================== * *------------------------------------------ */ -int pc_can_reach(struct map_session_data *sd,int x,int y) +int pc_can_reach (struct map_session_data *sd, int x, int y) { - struct walkpath_data wpd; + struct walkpath_data wpd; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if( sd->bl.x==x && sd->bl.y==y ) // ソスソスソスソスソス}ソスX - return 1; + if (sd->bl.x == x && sd->bl.y == y) // ソスソスソスソスソス}ソスX + return 1; - // ソスソスソスQソスソスソスソスソスソス - wpd.path_len=0; - wpd.path_pos=0; - wpd.path_half=0; - return (path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,x,y,0)!=-1)?1:0; + // ソスソスソスQソスソスソスソスソスソス + wpd.path_len = 0; + wpd.path_pos = 0; + wpd.path_half = 0; + return (path_search (&wpd, sd->bl.m, sd->bl.x, sd->bl.y, x, y, 0) != + -1) ? 1 : 0; } // @@ -3703,270 +4238,315 @@ int pc_can_reach(struct map_session_data *sd,int x,int y) * ソスソスソスソス1ソスソスソスノゑソスソスソスソス骼橸ソスヤゑソスソスvソスZ *------------------------------------------ */ -static int calc_next_walk_step(struct map_session_data *sd) +static int calc_next_walk_step (struct map_session_data *sd) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->walkpath.path_pos>=sd->walkpath.path_len) - return -1; - if(sd->walkpath.path[sd->walkpath.path_pos]&1) - return sd->speed*14/10; + if (sd->walkpath.path_pos >= sd->walkpath.path_len) + return -1; + if (sd->walkpath.path[sd->walkpath.path_pos] & 1) + return sd->speed * 14 / 10; - return sd->speed; + return sd->speed; } /*========================================== * ソスソスソスソスソスiソスソス(timerソスヨ撰ソス) *------------------------------------------ */ -static int pc_walk(int tid,unsigned int tick,int id,int data) +static int pc_walk (int tid, unsigned int tick, int id, int data) { - struct map_session_data *sd; - int i,ctype; - int moveblock; - int x,y,dx,dy; + struct map_session_data *sd; + int i, ctype; + int moveblock; + int x, y, dx, dy; - sd=map_id2sd(id); - if(sd==NULL) - return 0; + sd = map_id2sd (id); + if (sd == NULL) + return 0; - if(sd->walktimer != tid){ - if(battle_config.error_log) - printf("pc_walk %d != %d\n",sd->walktimer,tid); - return 0; - } - sd->walktimer=-1; - if(sd->walkpath.path_pos>=sd->walkpath.path_len || sd->walkpath.path_pos!=data) - return 0; + if (sd->walktimer != tid) + { + if (battle_config.error_log) + printf ("pc_walk %d != %d\n", sd->walktimer, tid); + return 0; + } + sd->walktimer = -1; + if (sd->walkpath.path_pos >= sd->walkpath.path_len + || sd->walkpath.path_pos != data) + return 0; - //ソスソスソスソスソスフで托ソスソスソスソスフタソスCソス}ソス[ソスソスソスソスソス - sd->inchealspirithptick = 0; - sd->inchealspiritsptick = 0; - - sd->walkpath.path_half ^= 1; - if(sd->walkpath.path_half==0){ // ソス}ソスXソスレ抵ソスソスSソスヨ難ソスソスソス - sd->walkpath.path_pos++; - if(sd->state.change_walk_target){ - pc_walktoxy_sub(sd); - return 0; - } - } else { // ソス}ソスXソスレ具ソスソスEソスヨ難ソスソスソス - if(sd->walkpath.path[sd->walkpath.path_pos]>=8) - return 1; - - x = sd->bl.x; - y = sd->bl.y; - ctype = map_getcell(sd->bl.m,x,y); - if(ctype == 1 || ctype == 5) { - pc_stop_walking(sd,1); - return 0; - } - sd->dir=sd->head_dir=sd->walkpath.path[sd->walkpath.path_pos]; - dx = dirx[(int)sd->dir]; - dy = diry[(int)sd->dir]; - ctype = map_getcell(sd->bl.m,x+dx,y+dy); - if(ctype == 1 || ctype == 5) { - pc_walktoxy_sub(sd); - return 0; - } - - moveblock = ( x/BLOCK_SIZE != (x+dx)/BLOCK_SIZE || y/BLOCK_SIZE != (y+dy)/BLOCK_SIZE); - - sd->walktimer = 1; - map_foreachinmovearea(clif_pcoutsight,sd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,0,sd); - - x += dx; - y += dy; - - if(moveblock) map_delblock(&sd->bl); - sd->bl.x = x; - sd->bl.y = y; - if(moveblock) map_addblock(&sd->bl); - - if(sd->sc_data[SC_DANCING].timer!=-1) - skill_unit_move_unit_group((struct skill_unit_group *)sd->sc_data[SC_DANCING].val2,sd->bl.m,dx,dy); - - map_foreachinmovearea(clif_pcinsight,sd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,0,sd); - sd->walktimer = -1; - - if(sd->status.party_id>0){ // ソスpソス[ソスeソスBソスフHソスoソスソスソスソスソスハ知ソスソスソスソス - struct party *p=party_search(sd->status.party_id); - if(p!=NULL){ - int p_flag=0; - map_foreachinmovearea(party_send_hp_check,sd->bl.m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,-dx,-dy,BL_PC,sd->status.party_id,&p_flag); - if(p_flag) - sd->party_hp=-1; - } - } - if(sd->status.option&4) // ソスNソスソスソス[ソスLソスソスソスOソスフ擾ソスナ鯉ソスソスソス - skill_check_cloaking(&sd->bl); - /* ソスfソスBソス{ソス[ソスVソスソスソスソスソスソスソスソス */ - for(i=0;i<5;i++) - if(sd->dev.val1[i]){ - skill_devotion3(&sd->bl,sd->dev.val1[i]); - break; - } - /* ソスソスソスfソスBソス{ソス[ソスVソスソスソスソスソスソスソスソス */ - if( sd->sc_data && sd->sc_data[SC_DEVOTION].val1){ - skill_devotion2(&sd->bl,sd->sc_data[SC_DEVOTION].val1); - } - - skill_unit_move(&sd->bl,tick,1); // ソスXソスLソスソスソスソスソスjソスbソスgソスフ鯉ソスソスソス - - if(map_getcell(sd->bl.m,x,y)&0x80) - npc_touch_areanpc(sd,sd->bl.m,x,y); - else - sd->areanpc_id=0; - } - if((i=calc_next_walk_step(sd))>0) { - i = i>>1; - if(i < 1 && sd->walkpath.path_half == 0) - i = 1; - sd->walktimer=add_timer(tick+i,pc_walk,id,sd->walkpath.path_pos); - } + //ソスソスソスソスソスフで托ソスソスソスソスフタソスCソス}ソス[ソスソスソスソスソス + sd->inchealspirithptick = 0; + sd->inchealspiritsptick = 0; + + sd->walkpath.path_half ^= 1; + if (sd->walkpath.path_half == 0) + { // ソス}ソスXソスレ抵ソスソスSソスヨ難ソスソスソス + sd->walkpath.path_pos++; + if (sd->state.change_walk_target) + { + pc_walktoxy_sub (sd); + return 0; + } + } + else + { // ソス}ソスXソスレ具ソスソスEソスヨ難ソスソスソス + if (sd->walkpath.path[sd->walkpath.path_pos] >= 8) + return 1; + + x = sd->bl.x; + y = sd->bl.y; + ctype = map_getcell (sd->bl.m, x, y); + if (ctype == 1 || ctype == 5) + { + pc_stop_walking (sd, 1); + return 0; + } + sd->dir = sd->head_dir = sd->walkpath.path[sd->walkpath.path_pos]; + dx = dirx[(int) sd->dir]; + dy = diry[(int) sd->dir]; + ctype = map_getcell (sd->bl.m, x + dx, y + dy); + if (ctype == 1 || ctype == 5) + { + pc_walktoxy_sub (sd); + return 0; + } + + moveblock = (x / BLOCK_SIZE != (x + dx) / BLOCK_SIZE + || y / BLOCK_SIZE != (y + dy) / BLOCK_SIZE); + + sd->walktimer = 1; + map_foreachinmovearea (clif_pcoutsight, sd->bl.m, x - AREA_SIZE, + y - AREA_SIZE, x + AREA_SIZE, y + AREA_SIZE, + dx, dy, 0, sd); + + x += dx; + y += dy; + + if (moveblock) + map_delblock (&sd->bl); + sd->bl.x = x; + sd->bl.y = y; + if (moveblock) + map_addblock (&sd->bl); + + if (sd->sc_data[SC_DANCING].timer != -1) + skill_unit_move_unit_group ((struct skill_unit_group *) + sd->sc_data[SC_DANCING].val2, + sd->bl.m, dx, dy); + + map_foreachinmovearea (clif_pcinsight, sd->bl.m, x - AREA_SIZE, + y - AREA_SIZE, x + AREA_SIZE, y + AREA_SIZE, + -dx, -dy, 0, sd); + sd->walktimer = -1; + + if (sd->status.party_id > 0) + { // ソスpソス[ソスeソスBソスフHソスoソスソスソスソスソスハ知ソスソスソスソス + struct party *p = party_search (sd->status.party_id); + if (p != NULL) + { + int p_flag = 0; + map_foreachinmovearea (party_send_hp_check, sd->bl.m, + x - AREA_SIZE, y - AREA_SIZE, + x + AREA_SIZE, y + AREA_SIZE, -dx, -dy, + BL_PC, sd->status.party_id, &p_flag); + if (p_flag) + sd->party_hp = -1; + } + } + if (sd->status.option & 4) // ソスNソスソスソス[ソスLソスソスソスOソスフ擾ソスナ鯉ソスソスソス + skill_check_cloaking (&sd->bl); + /* ソスfソスBソス{ソス[ソスVソスソスソスソスソスソスソスソス */ + for (i = 0; i < 5; i++) + if (sd->dev.val1[i]) + { + skill_devotion3 (&sd->bl, sd->dev.val1[i]); + break; + } + /* ソスソスソスfソスBソス{ソス[ソスVソスソスソスソスソスソスソスソス */ + if (sd->sc_data && sd->sc_data[SC_DEVOTION].val1) + { + skill_devotion2 (&sd->bl, sd->sc_data[SC_DEVOTION].val1); + } + + skill_unit_move (&sd->bl, tick, 1); // ソスXソスLソスソスソスソスソスjソスbソスgソスフ鯉ソスソスソス + + if (map_getcell (sd->bl.m, x, y) & 0x80) + npc_touch_areanpc (sd, sd->bl.m, x, y); + else + sd->areanpc_id = 0; + } + if ((i = calc_next_walk_step (sd)) > 0) + { + i = i >> 1; + if (i < 1 && sd->walkpath.path_half == 0) + i = 1; + sd->walktimer = + add_timer (tick + i, pc_walk, id, sd->walkpath.path_pos); + } - return 0; + return 0; } /*========================================== * ソスレ難ソスソスツ能ソスソスソスmソスFソスソスソスト、ソスツ能ソスネゑソスソスソスソスsソスJソスn *------------------------------------------ */ -static int pc_walktoxy_sub(struct map_session_data *sd) +static int pc_walktoxy_sub (struct map_session_data *sd) { - struct walkpath_data wpd; - int i; + struct walkpath_data wpd; + int i; - nullpo_retr(1, sd); + nullpo_retr (1, sd); - if(path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,sd->to_x,sd->to_y,0)) - return 1; - memcpy(&sd->walkpath,&wpd,sizeof(wpd)); + if (path_search + (&wpd, sd->bl.m, sd->bl.x, sd->bl.y, sd->to_x, sd->to_y, 0)) + return 1; + memcpy (&sd->walkpath, &wpd, sizeof (wpd)); - clif_walkok(sd); - sd->state.change_walk_target=0; + clif_walkok (sd); + sd->state.change_walk_target = 0; - if((i=calc_next_walk_step(sd))>0){ - i = i>>2; - sd->walktimer=add_timer(gettick()+i,pc_walk,sd->bl.id,0); - } - clif_movechar(sd); + if ((i = calc_next_walk_step (sd)) > 0) + { + i = i >> 2; + sd->walktimer = add_timer (gettick () + i, pc_walk, sd->bl.id, 0); + } + clif_movechar (sd); - return 0; + return 0; } /*========================================== * pcソスソス ソスsソスvソスソス *------------------------------------------ */ -int pc_walktoxy(struct map_session_data *sd,int x,int y) +int pc_walktoxy (struct map_session_data *sd, int x, int y) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - sd->to_x=x; - sd->to_y=y; + sd->to_x = x; + sd->to_y = y; - if (pc_issit (sd)) - pc_setstand(sd); + if (pc_issit (sd)) + pc_setstand (sd); - if(sd->walktimer != -1 && sd->state.change_walk_target==0){ - // ソスソスソスン包ソスソストゑソスソスソスソスナ抵ソスソスフ目的ソスnソスマ更ソスネのでマソスXソスレの抵ソスソスSソスノ暦ソスソスソスソスソスソスソス - // timerソスヨ撰ソスソスソスソスソスpc_walktoxy_subソスソスソストぶようソスノゑソスソスソス - sd->state.change_walk_target=1; - } else { - pc_walktoxy_sub(sd); - } + if (sd->walktimer != -1 && sd->state.change_walk_target == 0) + { + // ソスソスソスン包ソスソストゑソスソスソスソスナ抵ソスソスフ目的ソスnソスマ更ソスネのでマソスXソスレの抵ソスソスSソスノ暦ソスソスソスソスソスソスソス + // timerソスヨ撰ソスソスソスソスソスpc_walktoxy_subソスソスソストぶようソスノゑソスソスソス + sd->state.change_walk_target = 1; + } + else + { + pc_walktoxy_sub (sd); + } - return 0; + return 0; } /*========================================== * ソスソス ソスsソスソスソス~ *------------------------------------------ */ -int pc_stop_walking(struct map_session_data *sd,int type) +int pc_stop_walking (struct map_session_data *sd, int type) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->walktimer != -1) { - delete_timer(sd->walktimer,pc_walk); - sd->walktimer=-1; - } - sd->walkpath.path_len=0; - sd->to_x = sd->bl.x; - sd->to_y = sd->bl.y; - if(type&0x01) - clif_fixpos(&sd->bl); - if(type&0x02 && battle_config.pc_damage_delay) { - unsigned int tick = gettick(); - int delay = battle_get_dmotion(&sd->bl); - if(sd->canmove_tick < tick) - sd->canmove_tick = tick + delay; - } + if (sd->walktimer != -1) + { + delete_timer (sd->walktimer, pc_walk); + sd->walktimer = -1; + } + sd->walkpath.path_len = 0; + sd->to_x = sd->bl.x; + sd->to_y = sd->bl.y; + if (type & 0x01) + clif_fixpos (&sd->bl); + if (type & 0x02 && battle_config.pc_damage_delay) + { + unsigned int tick = gettick (); + int delay = battle_get_dmotion (&sd->bl); + if (sd->canmove_tick < tick) + sd->canmove_tick = tick + delay; + } - return 0; + return 0; } -void -pc_touch_all_relevant_npcs(struct map_session_data *sd) +void pc_touch_all_relevant_npcs (struct map_session_data *sd) { - if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y)&0x80) - npc_touch_areanpc(sd,sd->bl.m,sd->bl.x,sd->bl.y); - else - sd->areanpc_id=0; + if (map_getcell (sd->bl.m, sd->bl.x, sd->bl.y) & 0x80) + npc_touch_areanpc (sd, sd->bl.m, sd->bl.x, sd->bl.y); + else + sd->areanpc_id = 0; } /*========================================== * *------------------------------------------ */ -int pc_movepos(struct map_session_data *sd,int dst_x,int dst_y) -{ - int moveblock; - int dx,dy,dist; - - struct walkpath_data wpd; - - nullpo_retr(0, sd); - - if(path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,dst_x,dst_y,0)) - return 1; - - sd->dir = sd->head_dir = map_calc_dir(&sd->bl, dst_x,dst_y); - - dx = dst_x - sd->bl.x; - dy = dst_y - sd->bl.y; - dist = distance(sd->bl.x,sd->bl.y,dst_x,dst_y); - - moveblock = ( sd->bl.x/BLOCK_SIZE != dst_x/BLOCK_SIZE || sd->bl.y/BLOCK_SIZE != dst_y/BLOCK_SIZE); - - map_foreachinmovearea(clif_pcoutsight,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,dx,dy,0,sd); - - if(moveblock) map_delblock(&sd->bl); - sd->bl.x = dst_x; - sd->bl.y = dst_y; - if(moveblock) map_addblock(&sd->bl); - - map_foreachinmovearea(clif_pcinsight,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,-dx,-dy,0,sd); - - if(sd->status.party_id>0){ // ソスpソス[ソスeソスBソスフHソスoソスソスソスソスソスハ知ソスソスソスソス - struct party *p=party_search(sd->status.party_id); - if(p!=NULL){ - int flag=0; - map_foreachinmovearea(party_send_hp_check,sd->bl.m,sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,-dx,-dy,BL_PC,sd->status.party_id,&flag); - if(flag) - sd->party_hp=-1; - } - } +int pc_movepos (struct map_session_data *sd, int dst_x, int dst_y) +{ + int moveblock; + int dx, dy, dist; + + struct walkpath_data wpd; + + nullpo_retr (0, sd); + + if (path_search (&wpd, sd->bl.m, sd->bl.x, sd->bl.y, dst_x, dst_y, 0)) + return 1; + + sd->dir = sd->head_dir = map_calc_dir (&sd->bl, dst_x, dst_y); + + dx = dst_x - sd->bl.x; + dy = dst_y - sd->bl.y; + dist = distance (sd->bl.x, sd->bl.y, dst_x, dst_y); + + moveblock = (sd->bl.x / BLOCK_SIZE != dst_x / BLOCK_SIZE + || sd->bl.y / BLOCK_SIZE != dst_y / BLOCK_SIZE); + + map_foreachinmovearea (clif_pcoutsight, sd->bl.m, sd->bl.x - AREA_SIZE, + sd->bl.y - AREA_SIZE, sd->bl.x + AREA_SIZE, + sd->bl.y + AREA_SIZE, dx, dy, 0, sd); + + if (moveblock) + map_delblock (&sd->bl); + sd->bl.x = dst_x; + sd->bl.y = dst_y; + if (moveblock) + map_addblock (&sd->bl); + + map_foreachinmovearea (clif_pcinsight, sd->bl.m, sd->bl.x - AREA_SIZE, + sd->bl.y - AREA_SIZE, sd->bl.x + AREA_SIZE, + sd->bl.y + AREA_SIZE, -dx, -dy, 0, sd); + + if (sd->status.party_id > 0) + { // ソスpソス[ソスeソスBソスフHソスoソスソスソスソスソスハ知ソスソスソスソス + struct party *p = party_search (sd->status.party_id); + if (p != NULL) + { + int flag = 0; + map_foreachinmovearea (party_send_hp_check, sd->bl.m, + sd->bl.x - AREA_SIZE, sd->bl.y - AREA_SIZE, + sd->bl.x + AREA_SIZE, sd->bl.y + AREA_SIZE, + -dx, -dy, BL_PC, sd->status.party_id, + &flag); + if (flag) + sd->party_hp = -1; + } + } - if(sd->status.option&4) // ソスNソスソスソス[ソスLソスソスソスOソスフ擾ソスナ鯉ソスソスソス - skill_check_cloaking(&sd->bl); + if (sd->status.option & 4) // ソスNソスソスソス[ソスLソスソスソスOソスフ擾ソスナ鯉ソスソスソス + skill_check_cloaking (&sd->bl); - skill_unit_move(&sd->bl,gettick(),dist+7); // ソスXソスLソスソスソスソスソスjソスbソスgソスフ鯉ソスソスソス + skill_unit_move (&sd->bl, gettick (), dist + 7); // ソスXソスLソスソスソスソスソスjソスbソスgソスフ鯉ソスソスソス - pc_touch_all_relevant_npcs(sd); - return 0; + pc_touch_all_relevant_npcs (sd); + return 0; } // @@ -3976,20 +4556,23 @@ int pc_movepos(struct map_session_data *sd,int dst_x,int dst_y) * ソスXソスLソスソスソスフ鯉ソスソスソス ソスソスソスLソスソスソストゑソスソスソスソス鼾Lvソスソスソスヤゑソス *------------------------------------------ */ -int pc_checkskill(struct map_session_data *sd,int skill_id) +int pc_checkskill (struct map_session_data *sd, int skill_id) { - if(sd == NULL) return 0; - if( skill_id>=10000 ){ - struct guild *g; - if( sd->status.guild_id>0 && (g=guild_search(sd->status.guild_id))!=NULL) - return guild_checkskill(g,skill_id); - return 0; - } + if (sd == NULL) + return 0; + if (skill_id >= 10000) + { + struct guild *g; + if (sd->status.guild_id > 0 + && (g = guild_search (sd->status.guild_id)) != NULL) + return guild_checkskill (g, skill_id); + return 0; + } - if(sd->status.skill[skill_id].id == skill_id) - return (sd->status.skill[skill_id].lv); + if (sd->status.skill[skill_id].id == skill_id) + return (sd->status.skill[skill_id].lv); - return 0; + return 0; } /*========================================== @@ -4002,233 +4585,287 @@ int pc_checkskill(struct map_session_data *sd,int skill_id) * -1 ソスXソスLソスソスソスソスソスソスソスソス *------------------------------------------ */ -int pc_checkallowskill(struct map_session_data *sd) +int pc_checkallowskill (struct map_session_data *sd) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if( sd->sc_data == NULL ) - return 0; + if (sd->sc_data == NULL) + return 0; - if(!(skill_get_weapontype(KN_TWOHANDQUICKEN)&(1<<sd->status.weapon)) && sd->sc_data[SC_TWOHANDQUICKEN].timer!=-1) { // 2HQ - skill_status_change_end(&sd->bl,SC_TWOHANDQUICKEN,-1); // 2HQソスソスソスソスソスソス - return -1; - } - if(!(skill_get_weapontype(LK_AURABLADE)&(1<<sd->status.weapon)) && sd->sc_data[SC_AURABLADE].timer!=-1) { /* ソスIソス[ソスソスソスuソスソスソス[ソスh */ - skill_status_change_end(&sd->bl,SC_AURABLADE,-1); /* ソスIソス[ソスソスソスuソスソスソス[ソスhソスソスソスソスソスソス */ - return -1; - } - if(!(skill_get_weapontype(LK_PARRYING)&(1<<sd->status.weapon)) && sd->sc_data[SC_PARRYING].timer!=-1) { /* ソスpソスソスソスCソスソスソスO */ - skill_status_change_end(&sd->bl,SC_PARRYING,-1); /* ソスpソスソスソスCソスソスソスOソスソスソスソスソスソス */ - return -1; - } - if(!(skill_get_weapontype(LK_CONCENTRATION)&(1<<sd->status.weapon)) && sd->sc_data[SC_CONCENTRATION].timer!=-1) { /* ソスRソスソスソスZソスソスソスgソスソスソス[ソスVソスソスソスソス */ - skill_status_change_end(&sd->bl,SC_CONCENTRATION,-1); /* ソスRソスソスソスZソスソスソスgソスソスソス[ソスVソスソスソスソスソスソスソスソスソスソス */ - return -1; - } - if(!(skill_get_weapontype(CR_SPEARQUICKEN)&(1<<sd->status.weapon)) && sd->sc_data[SC_SPEARSQUICKEN].timer!=-1){ // ソスXソスsソスAソスNソスBソスbソスPソスソス - skill_status_change_end(&sd->bl,SC_SPEARSQUICKEN,-1); // ソスXソスsソスAソスNソスCソスbソスPソスソスソスソスソスソスソスソス - return -1; - } - if(!(skill_get_weapontype(BS_ADRENALINE)&(1<<sd->status.weapon)) && sd->sc_data[SC_ADRENALINE].timer!=-1){ // ソスAソスhソスソスソスiソスソスソスソスソスソスソスbソスVソスソス - skill_status_change_end(&sd->bl,SC_ADRENALINE,-1); // ソスAソスhソスソスソスiソスソスソスソスソスソスソスbソスVソスソスソスソスソスソスソスソス - return -1; - } + if (!(skill_get_weapontype (KN_TWOHANDQUICKEN) & (1 << sd->status.weapon)) + && sd->sc_data[SC_TWOHANDQUICKEN].timer != -1) + { // 2HQ + skill_status_change_end (&sd->bl, SC_TWOHANDQUICKEN, -1); // 2HQソスソスソスソスソスソス + return -1; + } + if (!(skill_get_weapontype (LK_AURABLADE) & (1 << sd->status.weapon)) + && sd->sc_data[SC_AURABLADE].timer != -1) + { /* ソスIソス[ソスソスソスuソスソスソス[ソスh */ + skill_status_change_end (&sd->bl, SC_AURABLADE, -1); /* ソスIソス[ソスソスソスuソスソスソス[ソスhソスソスソスソスソスソス */ + return -1; + } + if (!(skill_get_weapontype (LK_PARRYING) & (1 << sd->status.weapon)) + && sd->sc_data[SC_PARRYING].timer != -1) + { /* ソスpソスソスソスCソスソスソスO */ + skill_status_change_end (&sd->bl, SC_PARRYING, -1); /* ソスpソスソスソスCソスソスソスOソスソスソスソスソスソス */ + return -1; + } + if (!(skill_get_weapontype (LK_CONCENTRATION) & (1 << sd->status.weapon)) + && sd->sc_data[SC_CONCENTRATION].timer != -1) + { /* ソスRソスソスソスZソスソスソスgソスソスソス[ソスVソスソスソスソス */ + skill_status_change_end (&sd->bl, SC_CONCENTRATION, -1); /* ソスRソスソスソスZソスソスソスgソスソスソス[ソスVソスソスソスソスソスソスソスソスソスソス */ + return -1; + } + if (!(skill_get_weapontype (CR_SPEARQUICKEN) & (1 << sd->status.weapon)) + && sd->sc_data[SC_SPEARSQUICKEN].timer != -1) + { // ソスXソスsソスAソスNソスBソスbソスPソスソス + skill_status_change_end (&sd->bl, SC_SPEARSQUICKEN, -1); // ソスXソスsソスAソスNソスCソスbソスPソスソスソスソスソスソスソスソス + return -1; + } + if (!(skill_get_weapontype (BS_ADRENALINE) & (1 << sd->status.weapon)) + && sd->sc_data[SC_ADRENALINE].timer != -1) + { // ソスAソスhソスソスソスiソスソスソスソスソスソスソスbソスVソスソス + skill_status_change_end (&sd->bl, SC_ADRENALINE, -1); // ソスAソスhソスソスソスiソスソスソスソスソスソスソスbソスVソスソスソスソスソスソスソスソス + return -1; + } - if(sd->status.shield <= 0) { - if(sd->sc_data[SC_AUTOGUARD].timer!=-1){ // ソスIソス[ソスgソスKソス[ソスh - skill_status_change_end(&sd->bl,SC_AUTOGUARD,-1); - return -1; - } - if(sd->sc_data[SC_DEFENDER].timer!=-1){ // ソスfソスBソスtソスFソスソスソス_ソス[ - skill_status_change_end(&sd->bl,SC_DEFENDER,-1); - return -1; - } - if(sd->sc_data[SC_REFLECTSHIELD].timer!=-1){ //ソスソスソスtソスソスソスNソスgソスVソス[ソスソスソスh - skill_status_change_end(&sd->bl,SC_REFLECTSHIELD,-1); - return -1; - } - } + if (sd->status.shield <= 0) + { + if (sd->sc_data[SC_AUTOGUARD].timer != -1) + { // ソスIソス[ソスgソスKソス[ソスh + skill_status_change_end (&sd->bl, SC_AUTOGUARD, -1); + return -1; + } + if (sd->sc_data[SC_DEFENDER].timer != -1) + { // ソスfソスBソスtソスFソスソスソス_ソス[ + skill_status_change_end (&sd->bl, SC_DEFENDER, -1); + return -1; + } + if (sd->sc_data[SC_REFLECTSHIELD].timer != -1) + { //ソスソスソスtソスソスソスNソスgソスVソス[ソスソスソスh + skill_status_change_end (&sd->bl, SC_REFLECTSHIELD, -1); + return -1; + } + } - return 0; + return 0; } /*========================================== * ソスソス ソスソスソスiソスフチソスFソスbソスN *------------------------------------------ */ -int pc_checkequip(struct map_session_data *sd,int pos) +int pc_checkequip (struct map_session_data *sd, int pos) { - int i; + int i; - nullpo_retr(-1, sd); + nullpo_retr (-1, sd); - for(i=0;i<11;i++){ - if(pos & equip_pos[i]) - return sd->equip_index[i]; - } + for (i = 0; i < 11; i++) + { + if (pos & equip_pos[i]) + return sd->equip_index[i]; + } - return -1; + return -1; } /*========================================== * ソス]ソスソスソスEソスソスソス{ソスqソスEソスフ鯉ソスソスフ職ソスニゑソスソスヤゑソス *------------------------------------------ */ -struct pc_base_job pc_calc_base_job(int b_class) -{ - struct pc_base_job bj; - //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス - if(b_class < MAX_PC_CLASS){ //ソスハ擾ソス - bj.job = b_class; - bj.upper = 0; - }else if(b_class >= 4001 && b_class < 4023){ //ソス]ソスソスソスE - bj.job = b_class - 4001; - bj.upper = 1; - }else if(b_class == 23 + 4023 -1){ //ソス{ソスqソスXソスpソスmソスr - bj.job = b_class - (4023 - 1); - bj.upper = 2; - }else{ //ソス{ソスqソスXソスpソスmソスrソスネ外ソスフ養ソスq - bj.job = b_class - 4023; - bj.upper = 2; - } +struct pc_base_job pc_calc_base_job (int b_class) +{ + struct pc_base_job bj; + //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス + if (b_class < MAX_PC_CLASS) + { //ソスハ擾ソス + bj.job = b_class; + bj.upper = 0; + } + else if (b_class >= 4001 && b_class < 4023) + { //ソス]ソスソスソスE + bj.job = b_class - 4001; + bj.upper = 1; + } + else if (b_class == 23 + 4023 - 1) + { //ソス{ソスqソスXソスpソスmソスr + bj.job = b_class - (4023 - 1); + bj.upper = 2; + } + else + { //ソス{ソスqソスXソスpソスmソスrソスネ外ソスフ養ソスq + bj.job = b_class - 4023; + bj.upper = 2; + } - if(battle_config.enable_upper_class==0){ //confソスナ厄ソスソスソスソスノなゑソストゑソスソスソスソスソスupper=0 - bj.upper = 0; - } + if (battle_config.enable_upper_class == 0) + { //confソスナ厄ソスソスソスソスノなゑソストゑソスソスソスソスソスupper=0 + bj.upper = 0; + } - if(bj.job == 0){ - bj.type = 0; - }else if(bj.job < 7){ - bj.type = 1; - }else{ - bj.type = 2; - } - - return bj; + if (bj.job == 0) + { + bj.type = 0; + } + else if (bj.job < 7) + { + bj.type = 1; + } + else + { + bj.type = 2; + } + + return bj; } /*========================================== * PCソスフ攻ソスソス (timerソスヨ撰ソス) *------------------------------------------ */ -int pc_attack_timer(int tid,unsigned int tick,int id,int data) +int pc_attack_timer (int tid, unsigned int tick, int id, int data) { - struct map_session_data *sd; - struct block_list *bl; - struct status_change *sc_data; - short *opt; - int dist,skill,range; - int attack_spell_delay; + struct map_session_data *sd; + struct block_list *bl; + struct status_change *sc_data; + short *opt; + int dist, skill, range; + int attack_spell_delay; - sd=map_id2sd(id); - if(sd == NULL) - return 0; - if(sd->attacktimer != tid){ - if(battle_config.error_log) - printf("pc_attack_timer %d != %d\n",sd->attacktimer,tid); - return 0; - } - sd->attacktimer=-1; + sd = map_id2sd (id); + if (sd == NULL) + return 0; + if (sd->attacktimer != tid) + { + if (battle_config.error_log) + printf ("pc_attack_timer %d != %d\n", sd->attacktimer, tid); + return 0; + } + sd->attacktimer = -1; - if(sd->bl.prev == NULL) - return 0; + if (sd->bl.prev == NULL) + return 0; - bl=map_id2bl(sd->attacktarget); - if(bl==NULL || bl->prev == NULL) - return 0; + bl = map_id2bl (sd->attacktarget); + if (bl == NULL || bl->prev == NULL) + return 0; - if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) - return 0; + if (bl->type == BL_PC && pc_isdead ((struct map_session_data *) bl)) + return 0; - // ソスソスソスソスmapソスナなゑソスソスネゑソスソスUソスソスソスソスソスネゑソス - // PCソスソスソスソスソスソスソスナてゑソスソスUソスソスソスソスソスネゑソス - if(sd->bl.m != bl->m || pc_isdead(sd)) - return 0; + // ソスソスソスソスmapソスナなゑソスソスネゑソスソスUソスソスソスソスソスネゑソス + // PCソスソスソスソスソスソスソスナてゑソスソスUソスソスソスソスソスネゑソス + if (sd->bl.m != bl->m || pc_isdead (sd)) + return 0; - if( sd->opt1>0 || sd->status.option&2 || sd->status.option&16388) // ソスル擾ソスソスネどで攻ソスソスソスナゑソスソスネゑソス - return 0; + if (sd->opt1 > 0 || sd->status.option & 2 || sd->status.option & 16388) // ソスル擾ソスソスネどで攻ソスソスソスナゑソスソスネゑソス + return 0; - if(sd->sc_data[SC_AUTOCOUNTER].timer != -1) - return 0; - if(sd->sc_data[SC_BLADESTOP].timer != -1) - return 0; + if (sd->sc_data[SC_AUTOCOUNTER].timer != -1) + return 0; + if (sd->sc_data[SC_BLADESTOP].timer != -1) + return 0; - if((opt = battle_get_option(bl)) != NULL && *opt&0x46) - return 0; - if(((sc_data = battle_get_sc_data(bl)) != NULL && sc_data[SC_TRICKDEAD].timer != -1) || - ((sc_data = battle_get_sc_data(bl)) != NULL && sc_data[SC_BASILICA].timer != -1 )) - return 0; + if ((opt = battle_get_option (bl)) != NULL && *opt & 0x46) + return 0; + if (((sc_data = battle_get_sc_data (bl)) != NULL + && sc_data[SC_TRICKDEAD].timer != -1) + || ((sc_data = battle_get_sc_data (bl)) != NULL + && sc_data[SC_BASILICA].timer != -1)) + return 0; - if(sd->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) <= 0) - return 0; + if (sd->skilltimer != -1 && pc_checkskill (sd, SA_FREECAST) <= 0) + return 0; - if(!battle_config.sdelay_attack_enable && pc_checkskill(sd,SA_FREECAST) <= 0) { - if(DIFF_TICK(tick , sd->canact_tick) < 0) { - clif_skill_fail(sd,1,4,0); - return 0; - } - } + if (!battle_config.sdelay_attack_enable + && pc_checkskill (sd, SA_FREECAST) <= 0) + { + if (DIFF_TICK (tick, sd->canact_tick) < 0) + { + clif_skill_fail (sd, 1, 4, 0); + return 0; + } + } - if (sd->attackabletime > tick) - return 0; // cannot attack yet - - attack_spell_delay = sd->attack_spell_delay; - if (sd->attack_spell_override // [Fate] If we have an active attack spell, use that - && spell_attack(id, sd->attacktarget)) { - // Return if the spell succeeded. If the spell had disspiated, spell_attack() may fail. - sd->attackabletime = tick + attack_spell_delay; - - } else { - dist = distance(sd->bl.x,sd->bl.y,bl->x,bl->y); - range = sd->attackrange; - if(sd->status.weapon != 11) range++; - if( dist > range ){ // ソスソス ソスソスソスネゑソスソスフで移難ソス - //if(pc_can_reach(sd,bl->x,bl->y)) - //clif_movetoattack(sd,bl); - return 0; - } + if (sd->attackabletime > tick) + return 0; // cannot attack yet - if(dist <= range && !battle_check_range(&sd->bl,bl,range) ) { - if(pc_can_reach(sd,bl->x,bl->y) && sd->canmove_tick < tick && (sd->sc_data[SC_ANKLE].timer == -1 || sd->sc_data[SC_SPIDERWEB].timer == -1)) - // TMW client doesn't support this - //pc_walktoxy(sd,bl->x,bl->y); - clif_movetoattack(sd, bl); - sd->attackabletime = tick + (sd->aspd<<1); - } - else { - if(battle_config.pc_attack_direction_change) - sd->dir=sd->head_dir=map_calc_dir(&sd->bl, bl->x,bl->y ); // ソスソスソスソスソスン抵ソス - - if(sd->walktimer != -1) - pc_stop_walking(sd,1); - - if(sd->sc_data[SC_COMBO].timer == -1) { - map_freeblock_lock(); - pc_stop_walking(sd,0); - sd->attacktarget_lv = battle_weapon_attack(&sd->bl,bl,tick,0); - if(!(battle_config.pc_cloak_check_type&2) && sd->sc_data[SC_CLOAKING].timer != -1) - skill_status_change_end(&sd->bl,SC_CLOAKING,-1); - map_freeblock_unlock(); - if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0 ) // ソスtソスソスソス[ソスLソスソスソスXソスg - sd->attackabletime = tick + ((sd->aspd<<1)*(150 - skill*5)/100); - else - sd->attackabletime = tick + (sd->aspd<<1); - } - else if(sd->attackabletime <= tick) { - if(sd->skilltimer != -1 && (skill = pc_checkskill(sd,SA_FREECAST)) > 0 ) // ソスtソスソスソス[ソスLソスソスソスXソスg - sd->attackabletime = tick + ((sd->aspd<<1)*(150 - skill*5)/100); - else - sd->attackabletime = tick + (sd->aspd<<1); - } - if(sd->attackabletime <= tick) sd->attackabletime = tick + (battle_config.max_aspd<<1); - } + attack_spell_delay = sd->attack_spell_delay; + if (sd->attack_spell_override // [Fate] If we have an active attack spell, use that + && spell_attack (id, sd->attacktarget)) + { + // Return if the spell succeeded. If the spell had disspiated, spell_attack() may fail. + sd->attackabletime = tick + attack_spell_delay; + + } + else + { + dist = distance (sd->bl.x, sd->bl.y, bl->x, bl->y); + range = sd->attackrange; + if (sd->status.weapon != 11) + range++; + if (dist > range) + { // ソスソス ソスソスソスネゑソスソスフで移難ソス + //if(pc_can_reach(sd,bl->x,bl->y)) + //clif_movetoattack(sd,bl); + return 0; } - if(sd->state.attack_continue) { - sd->attacktimer=add_timer(sd->attackabletime,pc_attack_timer,sd->bl.id,0); - } + if (dist <= range && !battle_check_range (&sd->bl, bl, range)) + { + if (pc_can_reach (sd, bl->x, bl->y) && sd->canmove_tick < tick + && (sd->sc_data[SC_ANKLE].timer == -1 + || sd->sc_data[SC_SPIDERWEB].timer == -1)) + // TMW client doesn't support this + //pc_walktoxy(sd,bl->x,bl->y); + clif_movetoattack (sd, bl); + sd->attackabletime = tick + (sd->aspd << 1); + } + else + { + if (battle_config.pc_attack_direction_change) + sd->dir = sd->head_dir = map_calc_dir (&sd->bl, bl->x, bl->y); // ソスソスソスソスソスン抵ソス + + if (sd->walktimer != -1) + pc_stop_walking (sd, 1); + + if (sd->sc_data[SC_COMBO].timer == -1) + { + map_freeblock_lock (); + pc_stop_walking (sd, 0); + sd->attacktarget_lv = + battle_weapon_attack (&sd->bl, bl, tick, 0); + if (!(battle_config.pc_cloak_check_type & 2) + && sd->sc_data[SC_CLOAKING].timer != -1) + skill_status_change_end (&sd->bl, SC_CLOAKING, -1); + map_freeblock_unlock (); + if (sd->skilltimer != -1 && (skill = pc_checkskill (sd, SA_FREECAST)) > 0) // ソスtソスソスソス[ソスLソスソスソスXソスg + sd->attackabletime = + tick + ((sd->aspd << 1) * (150 - skill * 5) / 100); + else + sd->attackabletime = tick + (sd->aspd << 1); + } + else if (sd->attackabletime <= tick) + { + if (sd->skilltimer != -1 && (skill = pc_checkskill (sd, SA_FREECAST)) > 0) // ソスtソスソスソス[ソスLソスソスソスXソスg + sd->attackabletime = + tick + ((sd->aspd << 1) * (150 - skill * 5) / 100); + else + sd->attackabletime = tick + (sd->aspd << 1); + } + if (sd->attackabletime <= tick) + sd->attackabletime = tick + (battle_config.max_aspd << 1); + } + } - return 0; + if (sd->state.attack_continue) + { + sd->attacktimer = + add_timer (sd->attackabletime, pc_attack_timer, sd->bl.id, 0); + } + + return 0; } /*========================================== @@ -4236,1009 +4873,1166 @@ int pc_attack_timer(int tid,unsigned int tick,int id,int data) * typeソスソス1ソスネゑソスソスpソスソスソスUソスソス *------------------------------------------ */ -int pc_attack(struct map_session_data *sd,int target_id,int type) +int pc_attack (struct map_session_data *sd, int target_id, int type) { - struct block_list *bl; - int d; + struct block_list *bl; + int d; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - bl=map_id2bl(target_id); - if(bl==NULL) - return 1; - - if(bl->type==BL_NPC) { // monster npcs [Valaris] - npc_click(sd,RFIFOL(sd->fd,2)); - return 0; - } - - if(!battle_check_target(&sd->bl,bl,BCT_ENEMY)) - return 1; - if(sd->attacktimer != -1) - pc_stopattack(sd); - sd->attacktarget=target_id; - sd->state.attack_continue=type; - - d=DIFF_TICK(sd->attackabletime,gettick()); - if(d>0 && d<2000){ // ソスUソスソスdelayソスソス - sd->attacktimer=add_timer(sd->attackabletime,pc_attack_timer,sd->bl.id,0); - } else { - // ソス{ソスソスtimerソスヨ撰ソスソスネので茨ソスソスソスソスソスせソスソス - pc_attack_timer(-1,gettick(),sd->bl.id,0); - } + bl = map_id2bl (target_id); + if (bl == NULL) + return 1; + + if (bl->type == BL_NPC) + { // monster npcs [Valaris] + npc_click (sd, RFIFOL (sd->fd, 2)); + return 0; + } + + if (!battle_check_target (&sd->bl, bl, BCT_ENEMY)) + return 1; + if (sd->attacktimer != -1) + pc_stopattack (sd); + sd->attacktarget = target_id; + sd->state.attack_continue = type; + + d = DIFF_TICK (sd->attackabletime, gettick ()); + if (d > 0 && d < 2000) + { // ソスUソスソスdelayソスソス + sd->attacktimer = + add_timer (sd->attackabletime, pc_attack_timer, sd->bl.id, 0); + } + else + { + // ソス{ソスソスtimerソスヨ撰ソスソスネので茨ソスソスソスソスソスせソスソス + pc_attack_timer (-1, gettick (), sd->bl.id, 0); + } - return 0; + return 0; } /*========================================== * ソスpソスソスソスUソスソスソスソスソス~ *------------------------------------------ */ -int pc_stopattack(struct map_session_data *sd) +int pc_stopattack (struct map_session_data *sd) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->attacktimer != -1) { - delete_timer(sd->attacktimer,pc_attack_timer); - sd->attacktimer=-1; - } - sd->attacktarget=0; - sd->state.attack_continue=0; + if (sd->attacktimer != -1) + { + delete_timer (sd->attacktimer, pc_attack_timer); + sd->attacktimer = -1; + } + sd->attacktarget = 0; + sd->state.attack_continue = 0; - return 0; + return 0; } -int pc_follow_timer(int tid,unsigned int tick,int id,int data) +int pc_follow_timer (int tid, unsigned int tick, int id, int data) { - struct map_session_data *sd, *bl; + struct map_session_data *sd, *bl; - sd=map_id2sd(id); - if(sd == NULL || sd->followtimer != tid) - return 0; + sd = map_id2sd (id); + if (sd == NULL || sd->followtimer != tid) + return 0; - sd->followtimer=-1; + sd->followtimer = -1; - do { - if(sd->bl.prev == NULL) - break; + do + { + if (sd->bl.prev == NULL) + break; - bl=(struct map_session_data *) map_id2bl(sd->followtarget); + bl = (struct map_session_data *) map_id2bl (sd->followtarget); - if(bl==NULL) - return 0; + if (bl == NULL) + return 0; - if(bl->bl.prev == NULL) - break; + if (bl->bl.prev == NULL) + break; - if(bl->bl.type == BL_PC && pc_isdead((struct map_session_data *)bl)) - return 0; + if (bl->bl.type == BL_PC + && pc_isdead ((struct map_session_data *) bl)) + return 0; - if (sd->skilltimer == -1 && sd->attacktimer == -1 && sd->walktimer == -1) { - if((sd->bl.m == bl->bl.m) && pc_can_reach(sd,bl->bl.x,bl->bl.y)) { - if (distance(sd->bl.x,sd->bl.y,bl->bl.x,bl->bl.y) > 5) - pc_walktoxy(sd,bl->bl.x,bl->bl.y); - } else - pc_setpos((struct map_session_data*)sd, bl->mapname, bl->bl.x, bl->bl.y, 3); + if (sd->skilltimer == -1 && sd->attacktimer == -1 + && sd->walktimer == -1) + { + if ((sd->bl.m == bl->bl.m) + && pc_can_reach (sd, bl->bl.x, bl->bl.y)) + { + if (distance (sd->bl.x, sd->bl.y, bl->bl.x, bl->bl.y) > 5) + pc_walktoxy (sd, bl->bl.x, bl->bl.y); + } + else + pc_setpos ((struct map_session_data *) sd, bl->mapname, + bl->bl.x, bl->bl.y, 3); + } } - } while (0); + while (0); - sd->followtimer=add_timer(tick + sd->aspd,pc_follow_timer,sd->bl.id,0); + sd->followtimer = + add_timer (tick + sd->aspd, pc_follow_timer, sd->bl.id, 0); - return 0; + return 0; } -int pc_follow(struct map_session_data *sd,int target_id) +int pc_follow (struct map_session_data *sd, int target_id) { - struct block_list *bl; + struct block_list *bl; - bl=map_id2bl(target_id); - if(bl==NULL) - return 1; - sd->followtarget=target_id; - if(sd->followtimer != -1) { - delete_timer(sd->followtimer,pc_follow_timer); - sd->followtimer = -1; - } + bl = map_id2bl (target_id); + if (bl == NULL) + return 1; + sd->followtarget = target_id; + if (sd->followtimer != -1) + { + delete_timer (sd->followtimer, pc_follow_timer); + sd->followtimer = -1; + } - pc_follow_timer(-1,gettick(),sd->bl.id,0); + pc_follow_timer (-1, gettick (), sd->bl.id, 0); - return 0; + return 0; } -int pc_checkbaselevelup(struct map_session_data *sd) -{ - int next = pc_nextbaseexp(sd); - - nullpo_retr(0, sd); - - if(sd->status.base_exp >= next && next > 0){ - struct pc_base_job s_class = pc_calc_base_job(sd->status.class); - - // baseソスソスソスソスソスxソスソスソスAソスbソスvソスソスソスソス - sd->status.base_exp -= next; - - sd->status.base_level ++; - sd->status.status_point += (sd->status.base_level + 14) / 4; - clif_updatestatus(sd,SP_STATUSPOINT); - clif_updatestatus(sd,SP_BASELEVEL); - clif_updatestatus(sd,SP_NEXTBASEEXP); - pc_calcstatus(sd,0); - pc_heal(sd,sd->status.max_hp,sd->status.max_sp); - - //ソスXソスpソスmソスrソスヘキソスソスソスGソスAソスCソスソスソス|ソスAソス}ソスjソスsソスAソスOソスソスソスAソスTソスtソスソスLv1ソスソスソスソスソスソスソスソス - if(s_class.job == 23){ - skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_KYRIE],1,0,0,0,skill_get_time(PR_KYRIE,1),0 ); - skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_IMPOSITIO],1,0,0,0,skill_get_time(PR_IMPOSITIO,1),0 ); - skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_MAGNIFICAT],1,0,0,0,skill_get_time(PR_MAGNIFICAT,1),0 ); - skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_GLORIA],1,0,0,0,skill_get_time(PR_GLORIA,1),0 ); - skill_status_change_start(&sd->bl,SkillStatusChangeTable[PR_SUFFRAGIUM],1,0,0,0,skill_get_time(PR_SUFFRAGIUM,1),0 ); - } +int pc_checkbaselevelup (struct map_session_data *sd) +{ + int next = pc_nextbaseexp (sd); + + nullpo_retr (0, sd); + + if (sd->status.base_exp >= next && next > 0) + { + struct pc_base_job s_class = pc_calc_base_job (sd->status.class); + + // baseソスソスソスソスソスxソスソスソスAソスbソスvソスソスソスソス + sd->status.base_exp -= next; + + sd->status.base_level++; + sd->status.status_point += (sd->status.base_level + 14) / 4; + clif_updatestatus (sd, SP_STATUSPOINT); + clif_updatestatus (sd, SP_BASELEVEL); + clif_updatestatus (sd, SP_NEXTBASEEXP); + pc_calcstatus (sd, 0); + pc_heal (sd, sd->status.max_hp, sd->status.max_sp); + + //ソスXソスpソスmソスrソスヘキソスソスソスGソスAソスCソスソスソス|ソスAソス}ソスjソスsソスAソスOソスソスソスAソスTソスtソスソスLv1ソスソスソスソスソスソスソスソス + if (s_class.job == 23) + { + skill_status_change_start (&sd->bl, + SkillStatusChangeTable[PR_KYRIE], 1, 0, + 0, 0, skill_get_time (PR_KYRIE, 1), 0); + skill_status_change_start (&sd->bl, + SkillStatusChangeTable[PR_IMPOSITIO], + 1, 0, 0, 0, + skill_get_time (PR_IMPOSITIO, 1), 0); + skill_status_change_start (&sd->bl, + SkillStatusChangeTable[PR_MAGNIFICAT], + 1, 0, 0, 0, + skill_get_time (PR_MAGNIFICAT, 1), 0); + skill_status_change_start (&sd->bl, + SkillStatusChangeTable[PR_GLORIA], 1, + 0, 0, 0, skill_get_time (PR_GLORIA, 1), + 0); + skill_status_change_start (&sd->bl, + SkillStatusChangeTable[PR_SUFFRAGIUM], + 1, 0, 0, 0, + skill_get_time (PR_SUFFRAGIUM, 1), 0); + } - clif_misceffect(&sd->bl,0); - //ソスソスソスxソスソスソスAソスbソスvソスソスソスソスソスフでパソス[ソスeソスBソス[ソスソスソスソスソスソスソスXソスVソスソスソスソス - //(ソスソスヘ囲チソスFソスbソスN) - party_send_movemap(sd); - MAP_LOG_XP(sd, "LEVELUP") - return 1; - } + clif_misceffect (&sd->bl, 0); + //ソスソスソスxソスソスソスAソスbソスvソスソスソスソスソスフでパソス[ソスeソスBソス[ソスソスソスソスソスソスソスXソスVソスソスソスソス + //(ソスソスヘ囲チソスFソスbソスN) + party_send_movemap (sd); + MAP_LOG_XP (sd, "LEVELUP") return 1; + } - return 0; + return 0; } /*======================================== * Compute the maximum for sd->skill_point, i.e., the max. number of skill points that can still be filled in *---------------------------------------- */ -int pc_skillpt_potential(struct map_session_data *sd) +int pc_skillpt_potential (struct map_session_data *sd) { - int skill_id; - int potential = 0; + int skill_id; + int potential = 0; #define RAISE_COST(x) (((x)*((x)+1))>>1) - for (skill_id = 0; skill_id < MAX_SKILL; skill_id++) - if (sd->status.skill[skill_id].id != 0 - && sd->status.skill[skill_id].lv < skill_db[skill_id].max_raise) - potential += RAISE_COST(skill_db[skill_id].max_raise) - - RAISE_COST(sd->status.skill[skill_id].lv); + for (skill_id = 0; skill_id < MAX_SKILL; skill_id++) + if (sd->status.skill[skill_id].id != 0 + && sd->status.skill[skill_id].lv < skill_db[skill_id].max_raise) + potential += RAISE_COST (skill_db[skill_id].max_raise) + - RAISE_COST (sd->status.skill[skill_id].lv); #undef RAISE_COST - return potential; + return potential; } -int pc_checkjoblevelup(struct map_session_data *sd) +int pc_checkjoblevelup (struct map_session_data *sd) { - int next = pc_nextjobexp(sd); + int next = pc_nextjobexp (sd); - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if (sd->status.job_exp >= next - && next > 0) { + if (sd->status.job_exp >= next && next > 0) + { - if (pc_skillpt_potential(sd) < sd->status.skill_point) { // [Fate] Bah, this is is painful. - // But the alternative is quite error-prone, and eAthena has far worse performance issues... - sd->status.job_exp = next - 1; - return 0; - } + if (pc_skillpt_potential (sd) < sd->status.skill_point) + { // [Fate] Bah, this is is painful. + // But the alternative is quite error-prone, and eAthena has far worse performance issues... + sd->status.job_exp = next - 1; + return 0; + } - // jobソスソスソスソスソスxソスソスソスAソスbソスvソスソスソスソス - sd->status.job_exp -= next; - clif_updatestatus(sd,SP_NEXTJOBEXP); - sd->status.skill_point++; - clif_updatestatus(sd,SP_SKILLPOINT); - pc_calcstatus(sd,0); + // jobソスソスソスソスソスxソスソスソスAソスbソスvソスソスソスソス + sd->status.job_exp -= next; + clif_updatestatus (sd, SP_NEXTJOBEXP); + sd->status.skill_point++; + clif_updatestatus (sd, SP_SKILLPOINT); + pc_calcstatus (sd, 0); - MAP_LOG_PC(sd, "SKILLPOINTS-UP %d", sd->status.skill_point); + MAP_LOG_PC (sd, "SKILLPOINTS-UP %d", sd->status.skill_point); - if (sd->status.job_level < 250 - && sd->status.job_level < sd->status.base_level * 2) - sd->status.job_level++; // Make levelling up a little harder + if (sd->status.job_level < 250 + && sd->status.job_level < sd->status.base_level * 2) + sd->status.job_level++; // Make levelling up a little harder - clif_misceffect(&sd->bl,1); - return 1; - } + clif_misceffect (&sd->bl, 1); + return 1; + } - return 0; + return 0; } /*========================================== * ソスoソスソスソスlソス謫セ *------------------------------------------ */ -int pc_gainexp(struct map_session_data *sd,int base_exp,int job_exp) +int pc_gainexp (struct map_session_data *sd, int base_exp, int job_exp) { - return pc_gainexp_reason(sd, base_exp, job_exp, PC_GAINEXP_REASON_KILLING); + return pc_gainexp_reason (sd, base_exp, job_exp, + PC_GAINEXP_REASON_KILLING); } -int pc_gainexp_reason(struct map_session_data *sd,int base_exp,int job_exp, int reason) +int pc_gainexp_reason (struct map_session_data *sd, int base_exp, int job_exp, + int reason) { - char output[256]; - nullpo_retr(0, sd); + char output[256]; + nullpo_retr (0, sd); - if(sd->bl.prev == NULL || pc_isdead(sd)) - return 0; + if (sd->bl.prev == NULL || pc_isdead (sd)) + return 0; - if((battle_config.pvp_exp == 0) && map[sd->bl.m].flag.pvp) // [MouseJstr] - return 0; // no exp on pvp maps + if ((battle_config.pvp_exp == 0) && map[sd->bl.m].flag.pvp) // [MouseJstr] + return 0; // no exp on pvp maps - MAP_LOG_PC(sd, "GAINXP %d %d %s", base_exp, job_exp, ((reason == 2)? "SCRIPTXP" : ((reason == 1) ? "HEALXP" : "KILLXP"))); + MAP_LOG_PC (sd, "GAINXP %d %d %s", base_exp, job_exp, + ((reason == + 2) ? "SCRIPTXP" : ((reason == 1) ? "HEALXP" : "KILLXP"))); - if(sd->sc_data[SC_RICHMANKIM].timer != -1) { // added bounds checking [Vaalris] - base_exp += base_exp*(25 + sd->sc_data[SC_RICHMANKIM].val1*25)/100; - job_exp += job_exp*(25 + sd->sc_data[SC_RICHMANKIM].val1*25)/100; - } + if (sd->sc_data[SC_RICHMANKIM].timer != -1) + { // added bounds checking [Vaalris] + base_exp += + base_exp * (25 + sd->sc_data[SC_RICHMANKIM].val1 * 25) / 100; + job_exp += + job_exp * (25 + sd->sc_data[SC_RICHMANKIM].val1 * 25) / 100; + } - if(sd->status.guild_id>0){ // ソスMソスソスソスhソスノ擾ソスソス[ - base_exp-=guild_payexp(sd,base_exp); - if(base_exp < 0) - base_exp = 0; - } + if (sd->status.guild_id > 0) + { // ソスMソスソスソスhソスノ擾ソスソス[ + base_exp -= guild_payexp (sd, base_exp); + if (base_exp < 0) + base_exp = 0; + } - if(!battle_config.multi_level_up && pc_nextbaseafter(sd)) { - while(sd->status.base_exp+base_exp >=pc_nextbaseafter(sd) && sd->status.base_exp <= pc_nextbaseexp(sd) && pc_nextbaseafter(sd) > 0) { - base_exp*=.90; - } - } + if (!battle_config.multi_level_up && pc_nextbaseafter (sd)) + { + while (sd->status.base_exp + base_exp >= pc_nextbaseafter (sd) + && sd->status.base_exp <= pc_nextbaseexp (sd) + && pc_nextbaseafter (sd) > 0) + { + base_exp *= .90; + } + } - sd->status.base_exp += base_exp; + sd->status.base_exp += base_exp; - // [Fate] Adjust experience points that healers can extract from this character - if (reason != PC_GAINEXP_REASON_HEALING) { - const int max_heal_xp = 20 + (sd->status.base_level * sd->status.base_level); + // [Fate] Adjust experience points that healers can extract from this character + if (reason != PC_GAINEXP_REASON_HEALING) + { + const int max_heal_xp = + 20 + (sd->status.base_level * sd->status.base_level); - sd->heal_xp += base_exp; - if (sd->heal_xp > max_heal_xp) - sd->heal_xp = max_heal_xp; - } + sd->heal_xp += base_exp; + if (sd->heal_xp > max_heal_xp) + sd->heal_xp = max_heal_xp; + } - if(sd->status.base_exp < 0) - sd->status.base_exp = 0; - - while(pc_checkbaselevelup(sd)) ; + if (sd->status.base_exp < 0) + sd->status.base_exp = 0; - clif_updatestatus(sd,SP_BASEEXP); - if(!battle_config.multi_level_up && pc_nextjobafter(sd)) { - while(sd->status.job_exp+job_exp >= pc_nextjobafter(sd) && sd->status.job_exp <= pc_nextjobexp(sd) && pc_nextjobafter(sd) > 0) { - job_exp*=.90; - } - } + while (pc_checkbaselevelup (sd)); - sd->status.job_exp += job_exp; - if(sd->status.job_exp < 0) - sd->status.job_exp = 0; - - while(pc_checkjoblevelup(sd)) ; + clif_updatestatus (sd, SP_BASEEXP); + if (!battle_config.multi_level_up && pc_nextjobafter (sd)) + { + while (sd->status.job_exp + job_exp >= pc_nextjobafter (sd) + && sd->status.job_exp <= pc_nextjobexp (sd) + && pc_nextjobafter (sd) > 0) + { + job_exp *= .90; + } + } - clif_updatestatus(sd,SP_JOBEXP); + sd->status.job_exp += job_exp; + if (sd->status.job_exp < 0) + sd->status.job_exp = 0; - if(battle_config.disp_experience){ - sprintf(output, - "Experienced Gained Base:%d Job:%d",base_exp,job_exp); - clif_disp_onlyself(sd,output,strlen(output)); - } + while (pc_checkjoblevelup (sd)); + + clif_updatestatus (sd, SP_JOBEXP); - return 0; + if (battle_config.disp_experience) + { + sprintf (output, + "Experienced Gained Base:%d Job:%d", base_exp, job_exp); + clif_disp_onlyself (sd, output, strlen (output)); + } + + return 0; } -int -pc_extract_healer_exp(struct map_session_data *sd, int max) +int pc_extract_healer_exp (struct map_session_data *sd, int max) { - int amount; - nullpo_retr(0, sd); + int amount; + nullpo_retr (0, sd); - amount = sd->heal_xp; - if (max < amount) - amount = max; + amount = sd->heal_xp; + if (max < amount) + amount = max; - sd->heal_xp -= amount; - return amount; + sd->heal_xp -= amount; + return amount; } /*========================================== * base levelソスソスソスKソスvソスoソスソスソスlソスvソスZ *------------------------------------------ */ -int pc_nextbaseexp(struct map_session_data *sd) +int pc_nextbaseexp (struct map_session_data *sd) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->status.base_level>=MAX_LEVEL || sd->status.base_level<=0) - return 0; + if (sd->status.base_level >= MAX_LEVEL || sd->status.base_level <= 0) + return 0; - if(sd->status.class==0) i=0; - else if(sd->status.class<=6) i=1; - else if(sd->status.class<=22) i=2; - else if(sd->status.class==23) i=3; - else if(sd->status.class==4001) i=4; - else if(sd->status.class<=4007) i=5; - else i=6; + if (sd->status.class == 0) + i = 0; + else if (sd->status.class <= 6) + i = 1; + else if (sd->status.class <= 22) + i = 2; + else if (sd->status.class == 23) + i = 3; + else if (sd->status.class == 4001) + i = 4; + else if (sd->status.class <= 4007) + i = 5; + else + i = 6; - return exp_table[i][sd->status.base_level-1]; + return exp_table[i][sd->status.base_level - 1]; } /*========================================== * job levelソスソスソスKソスvソスoソスソスソスlソスvソスZ *------------------------------------------ */ -int pc_nextjobexp(struct map_session_data *sd) +int pc_nextjobexp (struct map_session_data *sd) { - // [fate] For normal levels, this ranges from 20k to 50k, depending on job level. - // Job level is at most twice the player's experience level (base_level). Levelling - // from 2 to 9 is 44 points, i.e., 880k to 2.2M job experience points (this is per - // skill, obviously.) + // [fate] For normal levels, this ranges from 20k to 50k, depending on job level. + // Job level is at most twice the player's experience level (base_level). Levelling + // from 2 to 9 is 44 points, i.e., 880k to 2.2M job experience points (this is per + // skill, obviously.) - return 20000 + sd->status.job_level * 150; + return 20000 + sd->status.job_level * 150; } /*========================================== * base level after next [Valaris] *------------------------------------------ */ -int pc_nextbaseafter(struct map_session_data *sd) +int pc_nextbaseafter (struct map_session_data *sd) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->status.base_level>=MAX_LEVEL || sd->status.base_level<=0) - return 0; + if (sd->status.base_level >= MAX_LEVEL || sd->status.base_level <= 0) + return 0; - if(sd->status.class==0) i=0; - else if(sd->status.class<=6) i=1; - else if(sd->status.class<=22) i=2; - else if(sd->status.class==23) i=3; - else if(sd->status.class==4001) i=4; - else if(sd->status.class<=4007) i=5; - else i=6; + if (sd->status.class == 0) + i = 0; + else if (sd->status.class <= 6) + i = 1; + else if (sd->status.class <= 22) + i = 2; + else if (sd->status.class == 23) + i = 3; + else if (sd->status.class == 4001) + i = 4; + else if (sd->status.class <= 4007) + i = 5; + else + i = 6; - return exp_table[i][sd->status.base_level]; + return exp_table[i][sd->status.base_level]; } /*========================================== * job level after next [Valaris] *------------------------------------------ */ -int pc_nextjobafter(struct map_session_data *sd) +int pc_nextjobafter (struct map_session_data *sd) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->status.job_level>=MAX_LEVEL || sd->status.job_level<=0) - return 0; + if (sd->status.job_level >= MAX_LEVEL || sd->status.job_level <= 0) + return 0; - if(sd->status.class==0) i=7; - else if(sd->status.class<=6) i=8; - else if(sd->status.class<=22) i=9; - else if(sd->status.class==23) i=10; - else if(sd->status.class==4001) i=11; - else if(sd->status.class<=4007) i=12; - else i=13; + if (sd->status.class == 0) + i = 7; + else if (sd->status.class <= 6) + i = 8; + else if (sd->status.class <= 22) + i = 9; + else if (sd->status.class == 23) + i = 10; + else if (sd->status.class == 4001) + i = 11; + else if (sd->status.class <= 4007) + i = 12; + else + i = 13; - return exp_table[i][sd->status.job_level]; + return exp_table[i][sd->status.job_level]; } + /*========================================== * ソスKソスvソスXソスeソス[ソス^ソスXソス|ソスCソスソスソスgソスvソスZ *------------------------------------------ */ -int pc_need_status_point(struct map_session_data *sd,int type) +int pc_need_status_point (struct map_session_data *sd, int type) { - int val; + int val; - nullpo_retr(-1, sd); + nullpo_retr (-1, sd); - if(type<SP_STR || type>SP_LUK) - return -1; - val = - type==SP_STR ? sd->status.str : - type==SP_AGI ? sd->status.agi : - type==SP_VIT ? sd->status.vit : - type==SP_INT ? sd->status.int_: - type==SP_DEX ? sd->status.dex : sd->status.luk; + if (type < SP_STR || type > SP_LUK) + return -1; + val = + type == SP_STR ? sd->status.str : + type == SP_AGI ? sd->status.agi : + type == SP_VIT ? sd->status.vit : + type == SP_INT ? sd->status.int_ : + type == SP_DEX ? sd->status.dex : sd->status.luk; - return (val+9)/10+1; + return (val + 9) / 10 + 1; } /*========================================== * ソス\ソスヘ値ソスソスソスソス *------------------------------------------ */ -int pc_statusup(struct map_session_data *sd,int type) -{ - int need,val = 0; - - nullpo_retr(0, sd); - - switch(type){ - case SP_STR: - val= sd->status.str; - break; - case SP_AGI: - val= sd->status.agi; - break; - case SP_VIT: - val= sd->status.vit; - break; - case SP_INT: - val= sd->status.int_; - break; - case SP_DEX: - val= sd->status.dex; - break; - case SP_LUK: - val= sd->status.luk; - break; - } +int pc_statusup (struct map_session_data *sd, int type) +{ + int need, val = 0; + + nullpo_retr (0, sd); + + switch (type) + { + case SP_STR: + val = sd->status.str; + break; + case SP_AGI: + val = sd->status.agi; + break; + case SP_VIT: + val = sd->status.vit; + break; + case SP_INT: + val = sd->status.int_; + break; + case SP_DEX: + val = sd->status.dex; + break; + case SP_LUK: + val = sd->status.luk; + break; + } - need=pc_need_status_point(sd,type); - if(type<SP_STR || type>SP_LUK || need<0 || need>sd->status.status_point || val >= battle_config.max_parameter){ - clif_statusupack(sd,type,0,val); - return 1; - } - switch(type){ - case SP_STR: - val= ++sd->status.str; - break; - case SP_AGI: - val= ++sd->status.agi; - break; - case SP_VIT: - val= ++sd->status.vit; - break; - case SP_INT: - val= ++sd->status.int_; - break; - case SP_DEX: - val= ++sd->status.dex; - break; - case SP_LUK: - val= ++sd->status.luk; - break; - } - sd->status.status_point-=need; - if(need!=pc_need_status_point(sd,type)){ - clif_updatestatus(sd,type-SP_STR+SP_USTR); - } - clif_updatestatus(sd,SP_STATUSPOINT); - clif_updatestatus(sd,type); - pc_calcstatus(sd,0); - clif_statusupack(sd,type,1,val); + need = pc_need_status_point (sd, type); + if (type < SP_STR || type > SP_LUK || need < 0 + || need > sd->status.status_point + || val >= battle_config.max_parameter) + { + clif_statusupack (sd, type, 0, val); + return 1; + } + switch (type) + { + case SP_STR: + val = ++sd->status.str; + break; + case SP_AGI: + val = ++sd->status.agi; + break; + case SP_VIT: + val = ++sd->status.vit; + break; + case SP_INT: + val = ++sd->status.int_; + break; + case SP_DEX: + val = ++sd->status.dex; + break; + case SP_LUK: + val = ++sd->status.luk; + break; + } + sd->status.status_point -= need; + if (need != pc_need_status_point (sd, type)) + { + clif_updatestatus (sd, type - SP_STR + SP_USTR); + } + clif_updatestatus (sd, SP_STATUSPOINT); + clif_updatestatus (sd, type); + pc_calcstatus (sd, 0); + clif_statusupack (sd, type, 1, val); - MAP_LOG_STATS(sd, "STATUP"); + MAP_LOG_STATS (sd, "STATUP"); - return 0; + return 0; } /*========================================== * ソス\ソスヘ値ソスソスソスソス *------------------------------------------ */ -int pc_statusup2(struct map_session_data *sd,int type,int val) +int pc_statusup2 (struct map_session_data *sd, int type, int val) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(type<SP_STR || type>SP_LUK){ - clif_statusupack(sd,type,0,0); - return 1; - } - switch(type){ - case SP_STR: - if(sd->status.str + val >= battle_config.max_parameter) - val = battle_config.max_parameter; - else if(sd->status.str + val < 1) - val = 1; - else - val += sd->status.str; - sd->status.str = val; - break; - case SP_AGI: - if(sd->status.agi + val >= battle_config.max_parameter) - val = battle_config.max_parameter; - else if(sd->status.agi + val < 1) - val = 1; - else - val += sd->status.agi; - sd->status.agi = val; - break; - case SP_VIT: - if(sd->status.vit + val >= battle_config.max_parameter) - val = battle_config.max_parameter; - else if(sd->status.vit + val < 1) - val = 1; - else - val += sd->status.vit; - sd->status.vit = val; - break; - case SP_INT: - if(sd->status.int_ + val >= battle_config.max_parameter) - val = battle_config.max_parameter; - else if(sd->status.int_ + val < 1) - val = 1; - else - val += sd->status.int_; - sd->status.int_ = val; - break; - case SP_DEX: - if(sd->status.dex + val >= battle_config.max_parameter) - val = battle_config.max_parameter; - else if(sd->status.dex + val < 1) - val = 1; - else - val += sd->status.dex; - sd->status.dex = val; - break; - case SP_LUK: - if(sd->status.luk + val >= battle_config.max_parameter) - val = battle_config.max_parameter; - else if(sd->status.luk + val < 1) - val = 1; - else - val = sd->status.luk + val; - sd->status.luk = val; - break; - } - clif_updatestatus(sd,type-SP_STR+SP_USTR); - clif_updatestatus(sd,type); - pc_calcstatus(sd,0); - clif_statusupack(sd,type,1,val); - MAP_LOG_STATS(sd, "STATUP2"); + if (type < SP_STR || type > SP_LUK) + { + clif_statusupack (sd, type, 0, 0); + return 1; + } + switch (type) + { + case SP_STR: + if (sd->status.str + val >= battle_config.max_parameter) + val = battle_config.max_parameter; + else if (sd->status.str + val < 1) + val = 1; + else + val += sd->status.str; + sd->status.str = val; + break; + case SP_AGI: + if (sd->status.agi + val >= battle_config.max_parameter) + val = battle_config.max_parameter; + else if (sd->status.agi + val < 1) + val = 1; + else + val += sd->status.agi; + sd->status.agi = val; + break; + case SP_VIT: + if (sd->status.vit + val >= battle_config.max_parameter) + val = battle_config.max_parameter; + else if (sd->status.vit + val < 1) + val = 1; + else + val += sd->status.vit; + sd->status.vit = val; + break; + case SP_INT: + if (sd->status.int_ + val >= battle_config.max_parameter) + val = battle_config.max_parameter; + else if (sd->status.int_ + val < 1) + val = 1; + else + val += sd->status.int_; + sd->status.int_ = val; + break; + case SP_DEX: + if (sd->status.dex + val >= battle_config.max_parameter) + val = battle_config.max_parameter; + else if (sd->status.dex + val < 1) + val = 1; + else + val += sd->status.dex; + sd->status.dex = val; + break; + case SP_LUK: + if (sd->status.luk + val >= battle_config.max_parameter) + val = battle_config.max_parameter; + else if (sd->status.luk + val < 1) + val = 1; + else + val = sd->status.luk + val; + sd->status.luk = val; + break; + } + clif_updatestatus (sd, type - SP_STR + SP_USTR); + clif_updatestatus (sd, type); + pc_calcstatus (sd, 0); + clif_statusupack (sd, type, 1, val); + MAP_LOG_STATS (sd, "STATUP2"); - return 0; + return 0; } /*========================================== * ソスXソスLソスソスソス|ソスCソスソスソスgソスソスソスソスソスUソスソス *------------------------------------------ */ -int pc_skillup(struct map_session_data *sd,int skill_num) -{ - nullpo_retr(0, sd); - - if (sd->status.skill[skill_num].id !=0 - && sd->status.skill_point > sd->status.skill[skill_num].lv - && sd->status.skill[skill_num].lv < skill_db[skill_num].max_raise) { - sd->status.skill[skill_num].lv++; - sd->status.skill_point -= sd->status.skill[skill_num].lv; - - pc_calcstatus(sd,0); - clif_skillup(sd,skill_num); - clif_updatestatus(sd,SP_SKILLPOINT); - clif_skillinfoblock(sd); - MAP_LOG_PC(sd, "SKILLUP %d %d %d", - skill_num, sd->status.skill[skill_num].lv, skill_power(sd, skill_num)); - } +int pc_skillup (struct map_session_data *sd, int skill_num) +{ + nullpo_retr (0, sd); + + if (sd->status.skill[skill_num].id != 0 + && sd->status.skill_point > sd->status.skill[skill_num].lv + && sd->status.skill[skill_num].lv < skill_db[skill_num].max_raise) + { + sd->status.skill[skill_num].lv++; + sd->status.skill_point -= sd->status.skill[skill_num].lv; + + pc_calcstatus (sd, 0); + clif_skillup (sd, skill_num); + clif_updatestatus (sd, SP_SKILLPOINT); + clif_skillinfoblock (sd); + MAP_LOG_PC (sd, "SKILLUP %d %d %d", + skill_num, sd->status.skill[skill_num].lv, + skill_power (sd, skill_num)); + } - return 0; + return 0; } /*========================================== * /allskill *------------------------------------------ */ -int pc_allskillup(struct map_session_data *sd) -{ - int i,id; - int c=0, s=0; - //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス - struct pc_base_job s_class; - - nullpo_retr(0, sd); - - s_class = pc_calc_base_job(sd->status.class); - c = s_class.job; - s = (s_class.upper==1) ? 1 : 0 ; //ソス]ソスソスソスネ外ソスヘ通擾ソスソスフスソスLソスソスソスH - - for(i=0;i<MAX_SKILL;i++) - sd->status.skill[i].id=0; - - if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill){ - // ソスSソストのスソスLソスソス - for(i=1;i<158;i++) - sd->status.skill[i].lv=skill_get_max(i); - for(i=210;i<291;i++) - sd->status.skill[i].lv=skill_get_max(i); - for(i=304;i<MAX_SKILL;i++) - sd->status.skill[i].lv=skill_get_max(i); - } - else { - for(i=0;(id=skill_tree[s][c][i].id)>0;i++){ - if(sd->status.skill[id].id==0 && skill_get_inf2(id)&0x01 ) - sd->status.skill[id].lv=skill_get_max(id); - } - } - pc_calcstatus(sd,0); +int pc_allskillup (struct map_session_data *sd) +{ + int i, id; + int c = 0, s = 0; + //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス + struct pc_base_job s_class; + + nullpo_retr (0, sd); + + s_class = pc_calc_base_job (sd->status.class); + c = s_class.job; + s = (s_class.upper == 1) ? 1 : 0; //ソス]ソスソスソスネ外ソスヘ通擾ソスソスフスソスLソスソスソスH + + for (i = 0; i < MAX_SKILL; i++) + sd->status.skill[i].id = 0; + + if (battle_config.gm_allskill > 0 + && pc_isGM (sd) >= battle_config.gm_allskill) + { + // ソスSソストのスソスLソスソス + for (i = 1; i < 158; i++) + sd->status.skill[i].lv = skill_get_max (i); + for (i = 210; i < 291; i++) + sd->status.skill[i].lv = skill_get_max (i); + for (i = 304; i < MAX_SKILL; i++) + sd->status.skill[i].lv = skill_get_max (i); + } + else + { + for (i = 0; (id = skill_tree[s][c][i].id) > 0; i++) + { + if (sd->status.skill[id].id == 0 && skill_get_inf2 (id) & 0x01) + sd->status.skill[id].lv = skill_get_max (id); + } + } + pc_calcstatus (sd, 0); - return 0; + return 0; } /*========================================== * /resetlvl *------------------------------------------ */ -int pc_resetlvl(struct map_session_data* sd,int type) -{ - int i; - - nullpo_retr(0, sd); - - for(i=1;i<MAX_SKILL;i++){ - sd->status.skill[i].lv = 0; - } +int pc_resetlvl (struct map_session_data *sd, int type) +{ + int i; - if(type == 1){ - sd->status.skill_point=0; - sd->status.base_level=1; - sd->status.job_level=1; - sd->status.base_exp=sd->status.base_exp=0; - sd->status.job_exp=sd->status.job_exp=0; - if(sd->status.option !=0) - sd->status.option = 0; - - sd->status.str=1; - sd->status.agi=1; - sd->status.vit=1; - sd->status.int_=1; - sd->status.dex=1; - sd->status.luk=1; - if(sd->status.class == 4001) - sd->status.status_point=100; - } + nullpo_retr (0, sd); - if(type == 2){ - sd->status.skill_point=0; - sd->status.base_level=1; - sd->status.job_level=1; - sd->status.base_exp=0; - sd->status.job_exp=0; - } - if(type == 3){ - sd->status.base_level=1; - sd->status.base_exp=0; - } - if(type == 4){ - sd->status.job_level=1; - sd->status.job_exp=0; - } - - clif_updatestatus(sd,SP_STATUSPOINT); - clif_updatestatus(sd,SP_STR); - clif_updatestatus(sd,SP_AGI); - clif_updatestatus(sd,SP_VIT); - clif_updatestatus(sd,SP_INT); - clif_updatestatus(sd,SP_DEX); - clif_updatestatus(sd,SP_LUK); - clif_updatestatus(sd,SP_BASELEVEL); - clif_updatestatus(sd,SP_JOBLEVEL); - clif_updatestatus(sd,SP_STATUSPOINT); - clif_updatestatus(sd,SP_NEXTBASEEXP); - clif_updatestatus(sd,SP_NEXTJOBEXP); - clif_updatestatus(sd,SP_SKILLPOINT); - - clif_updatestatus(sd,SP_USTR); // Updates needed stat points - Valaris - clif_updatestatus(sd,SP_UAGI); - clif_updatestatus(sd,SP_UVIT); - clif_updatestatus(sd,SP_UINT); - clif_updatestatus(sd,SP_UDEX); - clif_updatestatus(sd,SP_ULUK); // End Addition - - for(i=0;i<11;i++) { // unequip items that can't be equipped by base 1 [Valaris] - if(sd->equip_index[i] >= 0) - if(!pc_isequip(sd,sd->equip_index[i])) { - pc_unequipitem(sd,sd->equip_index[i],1); - sd->equip_index[i] = -1; - } - } + for (i = 1; i < MAX_SKILL; i++) + { + sd->status.skill[i].lv = 0; + } - clif_skillinfoblock(sd); - pc_calcstatus(sd,0); + if (type == 1) + { + sd->status.skill_point = 0; + sd->status.base_level = 1; + sd->status.job_level = 1; + sd->status.base_exp = sd->status.base_exp = 0; + sd->status.job_exp = sd->status.job_exp = 0; + if (sd->status.option != 0) + sd->status.option = 0; + + sd->status.str = 1; + sd->status.agi = 1; + sd->status.vit = 1; + sd->status.int_ = 1; + sd->status.dex = 1; + sd->status.luk = 1; + if (sd->status.class == 4001) + sd->status.status_point = 100; + } - MAP_LOG_STATS(sd, "STATRESET"); + if (type == 2) + { + sd->status.skill_point = 0; + sd->status.base_level = 1; + sd->status.job_level = 1; + sd->status.base_exp = 0; + sd->status.job_exp = 0; + } + if (type == 3) + { + sd->status.base_level = 1; + sd->status.base_exp = 0; + } + if (type == 4) + { + sd->status.job_level = 1; + sd->status.job_exp = 0; + } - return 0; + clif_updatestatus (sd, SP_STATUSPOINT); + clif_updatestatus (sd, SP_STR); + clif_updatestatus (sd, SP_AGI); + clif_updatestatus (sd, SP_VIT); + clif_updatestatus (sd, SP_INT); + clif_updatestatus (sd, SP_DEX); + clif_updatestatus (sd, SP_LUK); + clif_updatestatus (sd, SP_BASELEVEL); + clif_updatestatus (sd, SP_JOBLEVEL); + clif_updatestatus (sd, SP_STATUSPOINT); + clif_updatestatus (sd, SP_NEXTBASEEXP); + clif_updatestatus (sd, SP_NEXTJOBEXP); + clif_updatestatus (sd, SP_SKILLPOINT); + + clif_updatestatus (sd, SP_USTR); // Updates needed stat points - Valaris + clif_updatestatus (sd, SP_UAGI); + clif_updatestatus (sd, SP_UVIT); + clif_updatestatus (sd, SP_UINT); + clif_updatestatus (sd, SP_UDEX); + clif_updatestatus (sd, SP_ULUK); // End Addition + + for (i = 0; i < 11; i++) + { // unequip items that can't be equipped by base 1 [Valaris] + if (sd->equip_index[i] >= 0) + if (!pc_isequip (sd, sd->equip_index[i])) + { + pc_unequipitem (sd, sd->equip_index[i], 1); + sd->equip_index[i] = -1; + } + } + + clif_skillinfoblock (sd); + pc_calcstatus (sd, 0); + + MAP_LOG_STATS (sd, "STATRESET"); + + return 0; } + /*========================================== * /resetstate *------------------------------------------ */ -int pc_resetstate(struct map_session_data* sd) -{ - #define sumsp(a) ((a)*((a-2)/10+2) - 5*((a-2)/10)*((a-2)/10) - 6*((a-2)/10) -2) -// int add=0; // Removed by Dexity - - nullpo_retr(0, sd); - -// New statpoint table used here - Dexity - sd->status.status_point = atoi (statp[sd->status.base_level - 1]); -// End addition - -// Removed by Dexity - old count -// add += sumsp(sd->status.str); -// add += sumsp(sd->status.agi); -// add += sumsp(sd->status.vit); -// add += sumsp(sd->status.int_); -// add += sumsp(sd->status.dex); -// add += sumsp(sd->status.luk); -// sd->status.status_point+=add; - - clif_updatestatus(sd,SP_STATUSPOINT); - - sd->status.str=1; - sd->status.agi=1; - sd->status.vit=1; - sd->status.int_=1; - sd->status.dex=1; - sd->status.luk=1; +int pc_resetstate (struct map_session_data *sd) +{ +#define sumsp(a) ((a)*((a-2)/10+2) - 5*((a-2)/10)*((a-2)/10) - 6*((a-2)/10) -2) +// int add=0; // Removed by Dexity + + nullpo_retr (0, sd); + +// New statpoint table used here - Dexity + sd->status.status_point = atoi (statp[sd->status.base_level - 1]); +// End addition + +// Removed by Dexity - old count +// add += sumsp(sd->status.str); +// add += sumsp(sd->status.agi); +// add += sumsp(sd->status.vit); +// add += sumsp(sd->status.int_); +// add += sumsp(sd->status.dex); +// add += sumsp(sd->status.luk); +// sd->status.status_point+=add; + + clif_updatestatus (sd, SP_STATUSPOINT); + + sd->status.str = 1; + sd->status.agi = 1; + sd->status.vit = 1; + sd->status.int_ = 1; + sd->status.dex = 1; + sd->status.luk = 1; + + clif_updatestatus (sd, SP_STR); + clif_updatestatus (sd, SP_AGI); + clif_updatestatus (sd, SP_VIT); + clif_updatestatus (sd, SP_INT); + clif_updatestatus (sd, SP_DEX); + clif_updatestatus (sd, SP_LUK); + + clif_updatestatus (sd, SP_USTR); // Updates needed stat points - Valaris + clif_updatestatus (sd, SP_UAGI); + clif_updatestatus (sd, SP_UVIT); + clif_updatestatus (sd, SP_UINT); + clif_updatestatus (sd, SP_UDEX); + clif_updatestatus (sd, SP_ULUK); // End Addition + + pc_calcstatus (sd, 0); - clif_updatestatus(sd,SP_STR); - clif_updatestatus(sd,SP_AGI); - clif_updatestatus(sd,SP_VIT); - clif_updatestatus(sd,SP_INT); - clif_updatestatus(sd,SP_DEX); - clif_updatestatus(sd,SP_LUK); - - clif_updatestatus(sd,SP_USTR); // Updates needed stat points - Valaris - clif_updatestatus(sd,SP_UAGI); - clif_updatestatus(sd,SP_UVIT); - clif_updatestatus(sd,SP_UINT); - clif_updatestatus(sd,SP_UDEX); - clif_updatestatus(sd,SP_ULUK); // End Addition - - pc_calcstatus(sd,0); - - return 0; + return 0; } /*========================================== * /resetskill *------------------------------------------ */ -int pc_resetskill(struct map_session_data* sd) +int pc_resetskill (struct map_session_data *sd) { - int i,skill; + int i, skill; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - sd->status.skill_point += pc_calc_skillpoint(sd); + sd->status.skill_point += pc_calc_skillpoint (sd); - for(i=1;i<MAX_SKILL;i++) - if( (skill = pc_checkskill(sd,i)) > 0) { - sd->status.skill[i].lv = 0; - sd->status.skill[i].flags = 0; - } + for (i = 1; i < MAX_SKILL; i++) + if ((skill = pc_checkskill (sd, i)) > 0) + { + sd->status.skill[i].lv = 0; + sd->status.skill[i].flags = 0; + } - clif_updatestatus(sd,SP_SKILLPOINT); - clif_skillinfoblock(sd); - pc_calcstatus(sd,0); + clif_updatestatus (sd, SP_SKILLPOINT); + clif_skillinfoblock (sd); + pc_calcstatus (sd, 0); - return 0; + return 0; } /*========================================== * pcソスノダソスソスソス[ソスWソスソスソス^ソスソスソスソス *------------------------------------------ */ -int pc_damage(struct block_list *src,struct map_session_data *sd,int damage) +int pc_damage (struct block_list *src, struct map_session_data *sd, + int damage) { - int i=0,j=0; - struct pc_base_job s_class; + int i = 0, j = 0; + struct pc_base_job s_class; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス - s_class = pc_calc_base_job(sd->status.class); - // ソスソスソスノ趣ソスソスソスソスナゑソスソスソスソス逍ウソスソス - if(pc_isdead(sd)) - return 0; - // ソスソスソストゑソスソス逞ァソスソスソス繧ェソスソス - if(pc_issit(sd)) { - pc_setstand(sd); - skill_gangsterparadise(sd,0); - } + //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス + s_class = pc_calc_base_job (sd->status.class); + // ソスソスソスノ趣ソスソスソスソスナゑソスソスソスソス逍ウソスソス + if (pc_isdead (sd)) + return 0; + // ソスソスソストゑソスソス逞ァソスソスソス繧ェソスソス + if (pc_issit (sd)) + { + pc_setstand (sd); + skill_gangsterparadise (sd, 0); + } - if (src) { - if (src->type == BL_PC) { - MAP_LOG_PC(sd, "INJURED-BY PC%d FOR %d", ((struct map_session_data *)src)->status.char_id, damage); - } else { - MAP_LOG_PC(sd, "INJURED-BY MOB%d FOR %d", src->id, damage); - } - } else - MAP_LOG_PC(sd, "INJURED-BY null FOR %d", damage); - - // ソスソス ソスソスソストゑソスソスソスソス迹ォソスソスソス~ソス゚ゑソス - if(sd->sc_data[SC_ENDURE].timer == -1 && !sd->special_state.infinite_endure) - pc_stop_walking(sd,3); - // ソスソスソスt/ソス_ソスソスソスXソスフ抵ソスソスf - if(damage > sd->status.max_hp>>2) - skill_stop_dancing(&sd->bl,0); - - sd->status.hp-=damage; - - if (sd->sc_data[SC_TRICKDEAD].timer != -1) - skill_status_change_end(&sd->bl, SC_TRICKDEAD, -1); - if(sd->status.option&2) - skill_status_change_end(&sd->bl, SC_HIDING, -1); - if(sd->status.option&4) - skill_status_change_end(&sd->bl, SC_CLOAKING, -1); - if(sd->status.option&16386) - skill_status_change_end(&sd->bl, SC_CHASEWALK, -1); - - if(sd->status.hp>0){ - // ソスワゑソスソスソスソスソスソストゑソスソスソスソスネゑソスHPソスXソスV - clif_updatestatus(sd,SP_HP); - - if(sd->status.hp<sd->status.max_hp>>2 && pc_checkskill(sd,SM_AUTOBERSERK)>0 && - (sd->sc_data[SC_PROVOKE].timer==-1 || sd->sc_data[SC_PROVOKE].val2==0 )) - // ソスIソス[ソスgソスoソス[ソスTソス[ソスNソスソスソスソス - skill_status_change_start(&sd->bl,SC_PROVOKE,10,1,0,0,0,0); - - sd->canlog_tick = gettick(); - - if(sd->status.party_id>0) { // on-the-fly party hp updates [Valaris] - struct party *p=party_search(sd->status.party_id); - if(p!=NULL) clif_party_hp(p,sd); - } // end addition [Valaris] + if (src) + { + if (src->type == BL_PC) + { + MAP_LOG_PC (sd, "INJURED-BY PC%d FOR %d", + ((struct map_session_data *) src)->status.char_id, + damage); + } + else + { + MAP_LOG_PC (sd, "INJURED-BY MOB%d FOR %d", src->id, damage); + } + } + else + MAP_LOG_PC (sd, "INJURED-BY null FOR %d", damage); + + // ソスソス ソスソスソストゑソスソスソスソス迹ォソスソスソス~ソス゚ゑソス + if (sd->sc_data[SC_ENDURE].timer == -1 + && !sd->special_state.infinite_endure) + pc_stop_walking (sd, 3); + // ソスソスソスt/ソス_ソスソスソスXソスフ抵ソスソスf + if (damage > sd->status.max_hp >> 2) + skill_stop_dancing (&sd->bl, 0); + + sd->status.hp -= damage; + + if (sd->sc_data[SC_TRICKDEAD].timer != -1) + skill_status_change_end (&sd->bl, SC_TRICKDEAD, -1); + if (sd->status.option & 2) + skill_status_change_end (&sd->bl, SC_HIDING, -1); + if (sd->status.option & 4) + skill_status_change_end (&sd->bl, SC_CLOAKING, -1); + if (sd->status.option & 16386) + skill_status_change_end (&sd->bl, SC_CHASEWALK, -1); + + if (sd->status.hp > 0) + { + // ソスワゑソスソスソスソスソスソストゑソスソスソスソスネゑソスHPソスXソスV + clif_updatestatus (sd, SP_HP); + + if (sd->status.hp < sd->status.max_hp >> 2 + && pc_checkskill (sd, SM_AUTOBERSERK) > 0 + && (sd->sc_data[SC_PROVOKE].timer == -1 + || sd->sc_data[SC_PROVOKE].val2 == 0)) + // ソスIソス[ソスgソスoソス[ソスTソス[ソスNソスソスソスソス + skill_status_change_start (&sd->bl, SC_PROVOKE, 10, 1, 0, 0, 0, + 0); + + sd->canlog_tick = gettick (); + + if (sd->status.party_id > 0) + { // on-the-fly party hp updates [Valaris] + struct party *p = party_search (sd->status.party_id); + if (p != NULL) + clif_party_hp (p, sd); + } // end addition [Valaris] - return 0; - } + return 0; + } - MAP_LOG_PC(sd, "DEAD%s", ""); - - // Character is dead! - - sd->status.hp = 0; - // [Fate] Stop quickregen - sd->quick_regeneration_hp.amount = 0; - sd->quick_regeneration_sp.amount = 0; - skill_update_heal_animation(sd); - - pc_setdead(sd); - - pc_stop_walking(sd,0); - skill_castcancel(&sd->bl,0); // ソスrソスソスソスフ抵ソスソス~ - clif_clearchar_area(&sd->bl,1); - skill_unit_out_all(&sd->bl,gettick(),1); - if(sd->sc_data[SC_BLADESTOP].timer!=-1)//ソスソスソスnソスヘ趣ソスソスOソスノ会ソスソスソス - skill_status_change_end(&sd->bl,SC_BLADESTOP,-1); - pc_setglobalreg(sd,"PC_DIE_COUNTER",++sd->die_counter); //ソスソスソスノカソスEソスソスソス^ソス[ソスソスソスソスソスソスソスソス - skill_status_change_clear(&sd->bl,0); // ソスXソスeソス[ソス^ソスXソスル擾ソスソスソスソスソスソスソスソス - clif_updatestatus(sd,SP_HP); - pc_calcstatus(sd,0); - // [Fate] Reset magic - sd->cast_tick = gettick(); - magic_stop_completely(sd); - - for(i=0;i<5;i++) - if(sd->dev.val1[i]){ - skill_status_change_end(&map_id2sd(sd->dev.val1[i])->bl,SC_DEVOTION,-1); - sd->dev.val1[i] = sd->dev.val2[i]=0; - } - - if(battle_config.death_penalty_type>0 && sd->status.base_level >= 20) { // changed penalty options, added death by player if pk_mode [Valaris] - if(!map[sd->bl.m].flag.nopenalty && !map[sd->bl.m].flag.gvg){ - if(battle_config.death_penalty_type==1 && battle_config.death_penalty_base > 0) - sd->status.base_exp -= (double)pc_nextbaseexp(sd) * (double)battle_config.death_penalty_base/10000; - if(battle_config.pk_mode && src && src->type==BL_PC) - sd->status.base_exp -= (double)pc_nextbaseexp(sd) * (double)battle_config.death_penalty_base/10000; - else if(battle_config.death_penalty_type==2 && battle_config.death_penalty_base > 0) { - if(pc_nextbaseexp(sd) > 0) - sd->status.base_exp -= (double)sd->status.base_exp * (double)battle_config.death_penalty_base/10000; - if(battle_config.pk_mode && src && src->type==BL_PC) - sd->status.base_exp -= (double)sd->status.base_exp * (double)battle_config.death_penalty_base/10000; - } - if(sd->status.base_exp < 0) - sd->status.base_exp = 0; - clif_updatestatus(sd,SP_BASEEXP); - - if(battle_config.death_penalty_type==1 && battle_config.death_penalty_job > 0) - sd->status.job_exp -= (double)pc_nextjobexp(sd) * (double)battle_config.death_penalty_job/10000; - if(battle_config.pk_mode && src && src->type==BL_PC) - sd->status.job_exp -= (double)pc_nextjobexp(sd) * (double)battle_config.death_penalty_job/10000; - else if(battle_config.death_penalty_type==2 && battle_config.death_penalty_job > 0) { - if(pc_nextjobexp(sd) > 0) - sd->status.job_exp -= (double)sd->status.job_exp * (double)battle_config.death_penalty_job/10000; - if(battle_config.pk_mode && src && src->type==BL_PC) - sd->status.job_exp -= (double)sd->status.job_exp * (double)battle_config.death_penalty_job/10000; - } - if(sd->status.job_exp < 0) - sd->status.job_exp = 0; - clif_updatestatus(sd,SP_JOBEXP); - } - } - //ソスiソスCソスgソスソスソスAソスソスソス[ソスhソスAソスCソスeソスソスソスhソスソスソスbソスv - if(map[sd->bl.m].flag.pvp_nightmaredrop){ // Moved this outside so it works when PVP isnt enabled and during pk mode [Ancyker] - for(j=0;j<MAX_DROP_PER_MAP;j++){ - int id = map[sd->bl.m].drop_list[j].drop_id; - int type = map[sd->bl.m].drop_list[j].drop_type; - int per = map[sd->bl.m].drop_list[j].drop_per; - if(id == 0) - continue; - if(id == -1){//ソスソスソスソスソス_ソスソスソスhソスソスソスbソスv - int eq_num=0,eq_n[MAX_INVENTORY]; - memset(eq_n,0,sizeof(eq_n)); - //ソス謔クソスソスソスソストゑソスソスソスソスAソスCソスeソスソスソスソスソスソスソスJソスEソスソスソスg - for(i=0;i<MAX_INVENTORY;i++){ - int k; - if( (type == 1 && !sd->status.inventory[i].equip) - || (type == 2 && sd->status.inventory[i].equip) - || type == 3){ - //InventoryIndexソスソスソスiソス[ - for(k=0;k<MAX_INVENTORY;k++){ - if(eq_n[k] <= 0){ - eq_n[k]=i; - break; - } - } - eq_num++; - } - } - if(eq_num > 0){ - int n = eq_n[MRAND(eq_num)];//ソスYソスソスソスAソスCソスeソスソスソスフ抵ソスソスソスソス辜会ソスソスソス_ソスソス - if(MRAND(10000) < per){ - if(sd->status.inventory[n].equip) - pc_unequipitem(sd,n,0); - pc_dropitem(sd,n,1); - } - } - } - else if(id > 0){ - for(i=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].nameid == id//ItemIDソスソスソスソスソスvソスソスソストゑソスソスソス - && MRAND(10000) < per//ソスhソスソスソスbソスvソスソスソスソスソスソスソスソスOKソスソス - && ((type == 1 && !sd->status.inventory[i].equip)//ソス^ソスCソスvソスソスソスソスソスソスOKソスネゑソスソスhソスソスソスbソスv - || (type == 2 && sd->status.inventory[i].equip) - || type == 3) ){ - if(sd->status.inventory[i].equip) - pc_unequipitem(sd,i,0); - pc_dropitem(sd,i,1); - break; - } - } - } - } - } - // pvp - if( map[sd->bl.m].flag.pvp && !battle_config.pk_mode){ // disable certain pvp functions on pk_mode [Valaris] - //ソスソスソスソスソスLソスソスソスOソスvソスZ - if(!map[sd->bl.m].flag.pvp_nocalcrank){ - sd->pvp_point-=5; - if(src && src->type==BL_PC ) - ((struct map_session_data *)src)->pvp_point++; - //} //fixed wrong '{' placement by Lupus - pc_setdead(sd); - } - // ソスソスソスソスソスソスソスソス - if( sd->pvp_point < 0 ){ - sd->pvp_point=0; - pc_setstand(sd); - pc_setrestartvalue(sd,3); - pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,0); - } - } - //GvG - if(map[sd->bl.m].flag.gvg){ - pc_setstand(sd); - pc_setrestartvalue(sd,3); - pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,0); - } + MAP_LOG_PC (sd, "DEAD%s", ""); + + // Character is dead! + + sd->status.hp = 0; + // [Fate] Stop quickregen + sd->quick_regeneration_hp.amount = 0; + sd->quick_regeneration_sp.amount = 0; + skill_update_heal_animation (sd); + + pc_setdead (sd); + + pc_stop_walking (sd, 0); + skill_castcancel (&sd->bl, 0); // ソスrソスソスソスフ抵ソスソス~ + clif_clearchar_area (&sd->bl, 1); + skill_unit_out_all (&sd->bl, gettick (), 1); + if (sd->sc_data[SC_BLADESTOP].timer != -1) //ソスソスソスnソスヘ趣ソスソスOソスノ会ソスソスソス + skill_status_change_end (&sd->bl, SC_BLADESTOP, -1); + pc_setglobalreg (sd, "PC_DIE_COUNTER", ++sd->die_counter); //ソスソスソスノカソスEソスソスソス^ソス[ソスソスソスソスソスソスソスソス + skill_status_change_clear (&sd->bl, 0); // ソスXソスeソス[ソス^ソスXソスル擾ソスソスソスソスソスソスソスソス + clif_updatestatus (sd, SP_HP); + pc_calcstatus (sd, 0); + // [Fate] Reset magic + sd->cast_tick = gettick (); + magic_stop_completely (sd); + + for (i = 0; i < 5; i++) + if (sd->dev.val1[i]) + { + skill_status_change_end (&map_id2sd (sd->dev.val1[i])->bl, + SC_DEVOTION, -1); + sd->dev.val1[i] = sd->dev.val2[i] = 0; + } - if (src && src->type == BL_PC) { - // [Fate] PK death, trigger scripts - argrec_t arg[3]; - arg[0].name = "@killerrid"; - arg[0].v.i = src->id; - arg[1].name = "@victimrid"; - arg[1].v.i = sd->bl.id; - arg[2].name = "@victimlvl"; - arg[2].v.i = sd->status.base_level; - npc_event_doall_l("OnPCKilledEvent", sd->bl.id, 3, arg); - npc_event_doall_l("OnPCKillEvent", src->id, 3, arg); + if (battle_config.death_penalty_type > 0 && sd->status.base_level >= 20) + { // changed penalty options, added death by player if pk_mode [Valaris] + if (!map[sd->bl.m].flag.nopenalty && !map[sd->bl.m].flag.gvg) + { + if (battle_config.death_penalty_type == 1 + && battle_config.death_penalty_base > 0) + sd->status.base_exp -= + (double) pc_nextbaseexp (sd) * + (double) battle_config.death_penalty_base / 10000; + if (battle_config.pk_mode && src && src->type == BL_PC) + sd->status.base_exp -= + (double) pc_nextbaseexp (sd) * + (double) battle_config.death_penalty_base / 10000; + else if (battle_config.death_penalty_type == 2 + && battle_config.death_penalty_base > 0) + { + if (pc_nextbaseexp (sd) > 0) + sd->status.base_exp -= + (double) sd->status.base_exp * + (double) battle_config.death_penalty_base / 10000; + if (battle_config.pk_mode && src && src->type == BL_PC) + sd->status.base_exp -= + (double) sd->status.base_exp * + (double) battle_config.death_penalty_base / 10000; + } + if (sd->status.base_exp < 0) + sd->status.base_exp = 0; + clif_updatestatus (sd, SP_BASEEXP); + + if (battle_config.death_penalty_type == 1 + && battle_config.death_penalty_job > 0) + sd->status.job_exp -= + (double) pc_nextjobexp (sd) * + (double) battle_config.death_penalty_job / 10000; + if (battle_config.pk_mode && src && src->type == BL_PC) + sd->status.job_exp -= + (double) pc_nextjobexp (sd) * + (double) battle_config.death_penalty_job / 10000; + else if (battle_config.death_penalty_type == 2 + && battle_config.death_penalty_job > 0) + { + if (pc_nextjobexp (sd) > 0) + sd->status.job_exp -= + (double) sd->status.job_exp * + (double) battle_config.death_penalty_job / 10000; + if (battle_config.pk_mode && src && src->type == BL_PC) + sd->status.job_exp -= + (double) sd->status.job_exp * + (double) battle_config.death_penalty_job / 10000; + } + if (sd->status.job_exp < 0) + sd->status.job_exp = 0; + clif_updatestatus (sd, SP_JOBEXP); + } + } + //ソスiソスCソスgソスソスソスAソスソスソス[ソスhソスAソスCソスeソスソスソスhソスソスソスbソスv + if (map[sd->bl.m].flag.pvp_nightmaredrop) + { // Moved this outside so it works when PVP isnt enabled and during pk mode [Ancyker] + for (j = 0; j < MAX_DROP_PER_MAP; j++) + { + int id = map[sd->bl.m].drop_list[j].drop_id; + int type = map[sd->bl.m].drop_list[j].drop_type; + int per = map[sd->bl.m].drop_list[j].drop_per; + if (id == 0) + continue; + if (id == -1) + { //ソスソスソスソスソス_ソスソスソスhソスソスソスbソスv + int eq_num = 0, eq_n[MAX_INVENTORY]; + memset (eq_n, 0, sizeof (eq_n)); + //ソス謔クソスソスソスソストゑソスソスソスソスAソスCソスeソスソスソスソスソスソスソスJソスEソスソスソスg + for (i = 0; i < MAX_INVENTORY; i++) + { + int k; + if ((type == 1 && !sd->status.inventory[i].equip) + || (type == 2 && sd->status.inventory[i].equip) + || type == 3) + { + //InventoryIndexソスソスソスiソス[ + for (k = 0; k < MAX_INVENTORY; k++) + { + if (eq_n[k] <= 0) + { + eq_n[k] = i; + break; + } + } + eq_num++; + } + } + if (eq_num > 0) + { + int n = eq_n[MRAND (eq_num)]; //ソスYソスソスソスAソスCソスeソスソスソスフ抵ソスソスソスソス辜会ソスソスソス_ソスソス + if (MRAND (10000) < per) + { + if (sd->status.inventory[n].equip) + pc_unequipitem (sd, n, 0); + pc_dropitem (sd, n, 1); + } + } + } + else if (id > 0) + { + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid == id //ItemIDソスソスソスソスソスvソスソスソストゑソスソスソス + && MRAND (10000) < per //ソスhソスソスソスbソスvソスソスソスソスソスソスソスソスOKソスソス + && ((type == 1 && !sd->status.inventory[i].equip) //ソス^ソスCソスvソスソスソスソスソスソスOKソスネゑソスソスhソスソスソスbソスv + || (type == 2 && sd->status.inventory[i].equip) + || type == 3)) + { + if (sd->status.inventory[i].equip) + pc_unequipitem (sd, i, 0); + pc_dropitem (sd, i, 1); + break; + } + } + } + } + } + // pvp + if (map[sd->bl.m].flag.pvp && !battle_config.pk_mode) + { // disable certain pvp functions on pk_mode [Valaris] + //ソスソスソスソスソスLソスソスソスOソスvソスZ + if (!map[sd->bl.m].flag.pvp_nocalcrank) + { + sd->pvp_point -= 5; + if (src && src->type == BL_PC) + ((struct map_session_data *) src)->pvp_point++; + //} //fixed wrong '{' placement by Lupus + pc_setdead (sd); } - npc_event_doall_l("OnPCDieEvent", sd->bl.id, 0, NULL); + // ソスソスソスソスソスソスソスソス + if (sd->pvp_point < 0) + { + sd->pvp_point = 0; + pc_setstand (sd); + pc_setrestartvalue (sd, 3); + pc_setpos (sd, sd->status.save_point.map, sd->status.save_point.x, + sd->status.save_point.y, 0); + } + } + //GvG + if (map[sd->bl.m].flag.gvg) + { + pc_setstand (sd); + pc_setrestartvalue (sd, 3); + pc_setpos (sd, sd->status.save_point.map, sd->status.save_point.x, + sd->status.save_point.y, 0); + } - return 0; + if (src && src->type == BL_PC) + { + // [Fate] PK death, trigger scripts + argrec_t arg[3]; + arg[0].name = "@killerrid"; + arg[0].v.i = src->id; + arg[1].name = "@victimrid"; + arg[1].v.i = sd->bl.id; + arg[2].name = "@victimlvl"; + arg[2].v.i = sd->status.base_level; + npc_event_doall_l ("OnPCKilledEvent", sd->bl.id, 3, arg); + npc_event_doall_l ("OnPCKillEvent", src->id, 3, arg); + } + npc_event_doall_l ("OnPCDieEvent", sd->bl.id, 0, NULL); + + return 0; } // @@ -5248,466 +6042,508 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage) * scriptソスpPCソスXソスeソス[ソス^ソスXソスヌみ出ソスソス *------------------------------------------ */ -int pc_readparam(struct map_session_data *sd,int type) -{ - int val=0; - struct pc_base_job s_class; - - s_class = pc_calc_base_job(sd->status.class); - - nullpo_retr(0, sd); - - switch(type){ - case SP_SKILLPOINT: - val= sd->status.skill_point; - break; - case SP_STATUSPOINT: - val= sd->status.status_point; - break; - case SP_ZENY: - val= sd->status.zeny; - break; - case SP_BASELEVEL: - val= sd->status.base_level; - break; - case SP_JOBLEVEL: - val= sd->status.job_level; - break; - case SP_CLASS: - if(val>=24 && val < 45) - val+=3978; - else - val= sd->status.class; - break; - case SP_UPPER: - val= s_class.upper; - break; - case SP_SEX: - val= sd->sex; - break; - case SP_WEIGHT: - val= sd->weight; - break; - case SP_MAXWEIGHT: - val= sd->max_weight; - break; - case SP_BASEEXP: - val= sd->status.base_exp; - break; - case SP_JOBEXP: - val= sd->status.job_exp; - break; - case SP_NEXTBASEEXP: - val= pc_nextbaseexp(sd); - break; - case SP_NEXTJOBEXP: - val= pc_nextjobexp(sd); - break; - case SP_HP: - val= sd->status.hp; - break; - case SP_MAXHP: - val= sd->status.max_hp; - break; - case SP_SP: - val= sd->status.sp; - break; - case SP_MAXSP: - val= sd->status.max_sp; - break; - case SP_STR: - val= sd->status.str; - break; - case SP_AGI: - val= sd->status.agi; - break; - case SP_VIT: - val= sd->status.vit; - break; - case SP_INT: - val= sd->status.int_; - break; - case SP_DEX: - val= sd->status.dex; - break; - case SP_LUK: - val= sd->status.luk; - break; - case SP_FAME: - val= sd->fame; - break; - } +int pc_readparam (struct map_session_data *sd, int type) +{ + int val = 0; + struct pc_base_job s_class; + + s_class = pc_calc_base_job (sd->status.class); + + nullpo_retr (0, sd); + + switch (type) + { + case SP_SKILLPOINT: + val = sd->status.skill_point; + break; + case SP_STATUSPOINT: + val = sd->status.status_point; + break; + case SP_ZENY: + val = sd->status.zeny; + break; + case SP_BASELEVEL: + val = sd->status.base_level; + break; + case SP_JOBLEVEL: + val = sd->status.job_level; + break; + case SP_CLASS: + if (val >= 24 && val < 45) + val += 3978; + else + val = sd->status.class; + break; + case SP_UPPER: + val = s_class.upper; + break; + case SP_SEX: + val = sd->sex; + break; + case SP_WEIGHT: + val = sd->weight; + break; + case SP_MAXWEIGHT: + val = sd->max_weight; + break; + case SP_BASEEXP: + val = sd->status.base_exp; + break; + case SP_JOBEXP: + val = sd->status.job_exp; + break; + case SP_NEXTBASEEXP: + val = pc_nextbaseexp (sd); + break; + case SP_NEXTJOBEXP: + val = pc_nextjobexp (sd); + break; + case SP_HP: + val = sd->status.hp; + break; + case SP_MAXHP: + val = sd->status.max_hp; + break; + case SP_SP: + val = sd->status.sp; + break; + case SP_MAXSP: + val = sd->status.max_sp; + break; + case SP_STR: + val = sd->status.str; + break; + case SP_AGI: + val = sd->status.agi; + break; + case SP_VIT: + val = sd->status.vit; + break; + case SP_INT: + val = sd->status.int_; + break; + case SP_DEX: + val = sd->status.dex; + break; + case SP_LUK: + val = sd->status.luk; + break; + case SP_FAME: + val = sd->fame; + break; + } - return val; + return val; } /*========================================== * scriptソスpPCソスXソスeソス[ソス^ソスXソスン抵ソス *------------------------------------------ */ -int pc_setparam(struct map_session_data *sd,int type,int val) -{ - int i = 0,up_level = 50; - struct pc_base_job s_class; - - nullpo_retr(0, sd); - - s_class = pc_calc_base_job(sd->status.class); - - switch(type){ - case SP_BASELEVEL: - if (val > sd->status.base_level) { - for (i = 1; i <= (val - sd->status.base_level); i++) - sd->status.status_point += (sd->status.base_level + i + 14) / 4; - } - sd->status.base_level = val; - sd->status.base_exp = 0; - clif_updatestatus(sd, SP_BASELEVEL); - clif_updatestatus(sd, SP_NEXTBASEEXP); - clif_updatestatus(sd, SP_STATUSPOINT); - clif_updatestatus(sd, SP_BASEEXP); - pc_calcstatus(sd, 0); - pc_heal(sd, sd->status.max_hp, sd->status.max_sp); - break; - case SP_JOBLEVEL: - if (sd->status.class == 0) - up_level -= 40; - if ((sd->status.class == 23) || (sd->status.class >= 4001 && sd->status.class <= 4022)) - up_level += 20; - if (val >= sd->status.job_level) { - if (val > up_level)val = up_level; - sd->status.skill_point += (val-sd->status.job_level); - sd->status.job_level = val; - sd->status.job_exp = 0; - clif_updatestatus(sd, SP_JOBLEVEL); - clif_updatestatus(sd, SP_NEXTJOBEXP); - clif_updatestatus(sd, SP_JOBEXP); - clif_updatestatus(sd, SP_SKILLPOINT); - pc_calcstatus(sd, 0); - clif_misceffect(&sd->bl, 1); - } else { - sd->status.job_level = val; - sd->status.job_exp = 0; - clif_updatestatus(sd, SP_JOBLEVEL); - clif_updatestatus(sd, SP_NEXTJOBEXP); - clif_updatestatus(sd, SP_JOBEXP); - pc_calcstatus(sd, 0); - } - clif_updatestatus(sd,type); - break; - case SP_SKILLPOINT: - sd->status.skill_point = val; - break; - case SP_STATUSPOINT: - sd->status.status_point = val; - break; - case SP_ZENY: - sd->status.zeny = val; - break; - case SP_BASEEXP: - if(pc_nextbaseexp(sd) > 0) { - sd->status.base_exp = val; - if(sd->status.base_exp < 0) - sd->status.base_exp=0; - pc_checkbaselevelup(sd); - } - break; - case SP_JOBEXP: - if(pc_nextjobexp(sd) > 0) { - sd->status.job_exp = val; - if(sd->status.job_exp < 0) - sd->status.job_exp=0; - pc_checkjoblevelup(sd); - } - break; - case SP_SEX: - sd->sex = val; - break; - case SP_WEIGHT: - sd->weight = val; - break; - case SP_MAXWEIGHT: - sd->max_weight = val; - break; - case SP_HP: - sd->status.hp = val; - break; - case SP_MAXHP: - sd->status.max_hp = val; - break; - case SP_SP: - sd->status.sp = val; - break; - case SP_MAXSP: - sd->status.max_sp = val; - break; - case SP_STR: - sd->status.str = val; - break; - case SP_AGI: - sd->status.agi = val; - break; - case SP_VIT: - sd->status.vit = val; - break; - case SP_INT: - sd->status.int_ = val; - break; - case SP_DEX: - sd->status.dex = val; - break; - case SP_LUK: - sd->status.luk = val; - break; - case SP_FAME: - sd->fame = val; - break; - } - clif_updatestatus(sd,type); +int pc_setparam (struct map_session_data *sd, int type, int val) +{ + int i = 0, up_level = 50; + struct pc_base_job s_class; + + nullpo_retr (0, sd); - return 0; + s_class = pc_calc_base_job (sd->status.class); + + switch (type) + { + case SP_BASELEVEL: + if (val > sd->status.base_level) + { + for (i = 1; i <= (val - sd->status.base_level); i++) + sd->status.status_point += + (sd->status.base_level + i + 14) / 4; + } + sd->status.base_level = val; + sd->status.base_exp = 0; + clif_updatestatus (sd, SP_BASELEVEL); + clif_updatestatus (sd, SP_NEXTBASEEXP); + clif_updatestatus (sd, SP_STATUSPOINT); + clif_updatestatus (sd, SP_BASEEXP); + pc_calcstatus (sd, 0); + pc_heal (sd, sd->status.max_hp, sd->status.max_sp); + break; + case SP_JOBLEVEL: + if (sd->status.class == 0) + up_level -= 40; + if ((sd->status.class == 23) + || (sd->status.class >= 4001 && sd->status.class <= 4022)) + up_level += 20; + if (val >= sd->status.job_level) + { + if (val > up_level) + val = up_level; + sd->status.skill_point += (val - sd->status.job_level); + sd->status.job_level = val; + sd->status.job_exp = 0; + clif_updatestatus (sd, SP_JOBLEVEL); + clif_updatestatus (sd, SP_NEXTJOBEXP); + clif_updatestatus (sd, SP_JOBEXP); + clif_updatestatus (sd, SP_SKILLPOINT); + pc_calcstatus (sd, 0); + clif_misceffect (&sd->bl, 1); + } + else + { + sd->status.job_level = val; + sd->status.job_exp = 0; + clif_updatestatus (sd, SP_JOBLEVEL); + clif_updatestatus (sd, SP_NEXTJOBEXP); + clif_updatestatus (sd, SP_JOBEXP); + pc_calcstatus (sd, 0); + } + clif_updatestatus (sd, type); + break; + case SP_SKILLPOINT: + sd->status.skill_point = val; + break; + case SP_STATUSPOINT: + sd->status.status_point = val; + break; + case SP_ZENY: + sd->status.zeny = val; + break; + case SP_BASEEXP: + if (pc_nextbaseexp (sd) > 0) + { + sd->status.base_exp = val; + if (sd->status.base_exp < 0) + sd->status.base_exp = 0; + pc_checkbaselevelup (sd); + } + break; + case SP_JOBEXP: + if (pc_nextjobexp (sd) > 0) + { + sd->status.job_exp = val; + if (sd->status.job_exp < 0) + sd->status.job_exp = 0; + pc_checkjoblevelup (sd); + } + break; + case SP_SEX: + sd->sex = val; + break; + case SP_WEIGHT: + sd->weight = val; + break; + case SP_MAXWEIGHT: + sd->max_weight = val; + break; + case SP_HP: + sd->status.hp = val; + break; + case SP_MAXHP: + sd->status.max_hp = val; + break; + case SP_SP: + sd->status.sp = val; + break; + case SP_MAXSP: + sd->status.max_sp = val; + break; + case SP_STR: + sd->status.str = val; + break; + case SP_AGI: + sd->status.agi = val; + break; + case SP_VIT: + sd->status.vit = val; + break; + case SP_INT: + sd->status.int_ = val; + break; + case SP_DEX: + sd->status.dex = val; + break; + case SP_LUK: + sd->status.luk = val; + break; + case SP_FAME: + sd->fame = val; + break; + } + clif_updatestatus (sd, type); + + return 0; } /*========================================== * HP/SPソスソスソスソス *------------------------------------------ */ -int pc_heal(struct map_session_data *sd,int hp,int sp) +int pc_heal (struct map_session_data *sd, int hp, int sp) { -// if(battle_config.battle_log) -// printf("heal %d %d\n",hp,sp); +// if(battle_config.battle_log) +// printf("heal %d %d\n",hp,sp); - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(pc_checkoverhp(sd)) { - if(hp > 0) - hp = 0; - } - if(pc_checkoversp(sd)) { - if(sp > 0) - sp = 0; - } + if (pc_checkoverhp (sd)) + { + if (hp > 0) + hp = 0; + } + if (pc_checkoversp (sd)) + { + if (sp > 0) + sp = 0; + } - if(sd->sc_data && sd->sc_data[SC_BERSERK].timer!=-1) //ソスoソス[ソスTソス[ソスNソスソスソスヘ回復ゑソスソスソスソスネゑソスソス轤オソスソス - return 0; + if (sd->sc_data && sd->sc_data[SC_BERSERK].timer != -1) //ソスoソス[ソスTソス[ソスNソスソスソスヘ回復ゑソスソスソスソスネゑソスソス轤オソスソス + return 0; - if(hp+sd->status.hp>sd->status.max_hp) - hp=sd->status.max_hp-sd->status.hp; - if(sp+sd->status.sp>sd->status.max_sp) - sp=sd->status.max_sp-sd->status.sp; - sd->status.hp+=hp; - if(sd->status.hp <= 0) { - sd->status.hp = 0; - pc_damage(NULL,sd,1); - hp = 0; - } - sd->status.sp+=sp; - if(sd->status.sp <= 0) - sd->status.sp = 0; - if(hp) - clif_updatestatus(sd,SP_HP); - if(sp) - clif_updatestatus(sd,SP_SP); + if (hp + sd->status.hp > sd->status.max_hp) + hp = sd->status.max_hp - sd->status.hp; + if (sp + sd->status.sp > sd->status.max_sp) + sp = sd->status.max_sp - sd->status.sp; + sd->status.hp += hp; + if (sd->status.hp <= 0) + { + sd->status.hp = 0; + pc_damage (NULL, sd, 1); + hp = 0; + } + sd->status.sp += sp; + if (sd->status.sp <= 0) + sd->status.sp = 0; + if (hp) + clif_updatestatus (sd, SP_HP); + if (sp) + clif_updatestatus (sd, SP_SP); - if(sd->status.party_id>0) { // on-the-fly party hp updates [Valaris] - struct party *p=party_search(sd->status.party_id); - if(p!=NULL) clif_party_hp(p,sd); - } // end addition [Valaris] + if (sd->status.party_id > 0) + { // on-the-fly party hp updates [Valaris] + struct party *p = party_search (sd->status.party_id); + if (p != NULL) + clif_party_hp (p, sd); + } // end addition [Valaris] - return hp + sp; + return hp + sp; } /*========================================== * HP/SPソスソスソスソス *------------------------------------------ */ -static int pc_itemheal_effect(struct map_session_data *sd,int hp,int sp); +static int pc_itemheal_effect (struct map_session_data *sd, int hp, int sp); -static int // Compute how quickly we regenerate (less is faster) for that amount -pc_heal_quick_speed(int amount) +static int // Compute how quickly we regenerate (less is faster) for that amount +pc_heal_quick_speed (int amount) { - if (amount >= 100) { - if (amount >= 500) - return 0; - if (amount >= 250) - return 1; - return 2; - } else { // < 100 - if (amount >= 50) - return 3; - if (amount >= 20) - return 4; - return 5; - } + if (amount >= 100) + { + if (amount >= 500) + return 0; + if (amount >= 250) + return 1; + return 2; + } + else + { // < 100 + if (amount >= 50) + return 3; + if (amount >= 20) + return 4; + return 5; + } } static void -pc_heal_quick_accumulate(int new_amount, struct quick_regeneration *quick_regen, int max) +pc_heal_quick_accumulate (int new_amount, + struct quick_regeneration *quick_regen, int max) { - int current_amount = quick_regen->amount; - int current_speed = quick_regen->speed; - int new_speed = pc_heal_quick_speed(new_amount); + int current_amount = quick_regen->amount; + int current_speed = quick_regen->speed; + int new_speed = pc_heal_quick_speed (new_amount); - int average_speed = ((new_speed * new_amount) + (current_speed * current_amount)) / (current_amount + new_amount); // new_amount > 0, current_amount >= 0 + int average_speed = ((new_speed * new_amount) + (current_speed * current_amount)) / (current_amount + new_amount); // new_amount > 0, current_amount >= 0 - quick_regen->speed = average_speed; - quick_regen->amount = MIN(current_amount + new_amount, max); + quick_regen->speed = average_speed; + quick_regen->amount = MIN (current_amount + new_amount, max); - quick_regen->tickdelay = MIN(quick_regen->speed, quick_regen->tickdelay); + quick_regen->tickdelay = MIN (quick_regen->speed, quick_regen->tickdelay); } -int pc_itemheal(struct map_session_data *sd,int hp,int sp) +int pc_itemheal (struct map_session_data *sd, int hp, int sp) { - /* defer healing */ - if (hp > 0) { - pc_heal_quick_accumulate(hp, - &sd->quick_regeneration_hp, - sd->status.max_hp - sd->status.hp); - hp = 0; - } - if (sp > 0) { - pc_heal_quick_accumulate(sp, - &sd->quick_regeneration_sp, - sd->status.max_sp - sd->status.sp); + /* defer healing */ + if (hp > 0) + { + pc_heal_quick_accumulate (hp, + &sd->quick_regeneration_hp, + sd->status.max_hp - sd->status.hp); + hp = 0; + } + if (sp > 0) + { + pc_heal_quick_accumulate (sp, + &sd->quick_regeneration_sp, + sd->status.max_sp - sd->status.sp); - sp = 0; - } + sp = 0; + } - /* Hurt right away, if necessary */ - if (hp < 0 || sp < 0) - pc_itemheal_effect(sd, hp, sp); + /* Hurt right away, if necessary */ + if (hp < 0 || sp < 0) + pc_itemheal_effect (sd, hp, sp); - return 0; + return 0; } - /* pc_itemheal_effect is invoked once every 0.5s whenever the pc * has health recovery queued up (cf. pc_natural_heal_sub). */ -static int pc_itemheal_effect(struct map_session_data *sd,int hp,int sp) +static int pc_itemheal_effect (struct map_session_data *sd, int hp, int sp) { - int bonus; -// if(battle_config.battle_log) -// printf("heal %d %d\n",hp,sp); + int bonus; +// if(battle_config.battle_log) +// printf("heal %d %d\n",hp,sp); - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->sc_data && sd->sc_data[SC_GOSPEL].timer!=-1) //ソスoソス[ソスTソス[ソスNソスソスソスヘ回復ゑソスソスソスソスネゑソスソス轤オソスソス - return 0; + if (sd->sc_data && sd->sc_data[SC_GOSPEL].timer != -1) //ソスoソス[ソスTソス[ソスNソスソスソスヘ回復ゑソスソスソスソスネゑソスソス轤オソスソス + return 0; - if(sd->state.potionpitcher_flag) { - sd->potion_hp = hp; - sd->potion_sp = sp; - return 0; - } + if (sd->state.potionpitcher_flag) + { + sd->potion_hp = hp; + sd->potion_sp = sp; + return 0; + } - if(pc_checkoverhp(sd)) { - if(hp > 0) - hp = 0; - } - if(pc_checkoversp(sd)) { - if(sp > 0) - sp = 0; - } - if(hp > 0) { - bonus = (sd->paramc[2]<<1) + 100 + pc_checkskill(sd,SM_RECOVERY)*10; - if(bonus != 100) - hp = hp * bonus / 100; - bonus = 100 + pc_checkskill(sd,AM_LEARNINGPOTION)*5; - if(bonus != 100) - hp = hp * bonus / 100; - } - if(sp > 0) { - bonus = (sd->paramc[3]<<1) + 100 + pc_checkskill(sd,MG_SRECOVERY)*10; - if(bonus != 100) - sp = sp * bonus / 100; - bonus = 100 + pc_checkskill(sd,AM_LEARNINGPOTION)*5; - if(bonus != 100) - sp = sp * bonus / 100; - } - if(hp+sd->status.hp>sd->status.max_hp) - hp=sd->status.max_hp-sd->status.hp; - if(sp+sd->status.sp>sd->status.max_sp) - sp=sd->status.max_sp-sd->status.sp; - sd->status.hp+=hp; - if(sd->status.hp <= 0) { - sd->status.hp = 0; - pc_damage(NULL,sd,1); - hp = 0; - } - sd->status.sp+=sp; - if(sd->status.sp <= 0) - sd->status.sp = 0; - if(hp) - clif_updatestatus(sd,SP_HP); - if(sp) - clif_updatestatus(sd,SP_SP); + if (pc_checkoverhp (sd)) + { + if (hp > 0) + hp = 0; + } + if (pc_checkoversp (sd)) + { + if (sp > 0) + sp = 0; + } + if (hp > 0) + { + bonus = + (sd->paramc[2] << 1) + 100 + pc_checkskill (sd, SM_RECOVERY) * 10; + if (bonus != 100) + hp = hp * bonus / 100; + bonus = 100 + pc_checkskill (sd, AM_LEARNINGPOTION) * 5; + if (bonus != 100) + hp = hp * bonus / 100; + } + if (sp > 0) + { + bonus = + (sd->paramc[3] << 1) + 100 + pc_checkskill (sd, + MG_SRECOVERY) * 10; + if (bonus != 100) + sp = sp * bonus / 100; + bonus = 100 + pc_checkskill (sd, AM_LEARNINGPOTION) * 5; + if (bonus != 100) + sp = sp * bonus / 100; + } + if (hp + sd->status.hp > sd->status.max_hp) + hp = sd->status.max_hp - sd->status.hp; + if (sp + sd->status.sp > sd->status.max_sp) + sp = sd->status.max_sp - sd->status.sp; + sd->status.hp += hp; + if (sd->status.hp <= 0) + { + sd->status.hp = 0; + pc_damage (NULL, sd, 1); + hp = 0; + } + sd->status.sp += sp; + if (sd->status.sp <= 0) + sd->status.sp = 0; + if (hp) + clif_updatestatus (sd, SP_HP); + if (sp) + clif_updatestatus (sd, SP_SP); - return 0; + return 0; } /*========================================== * HP/SPソスソスソスソス *------------------------------------------ */ -int pc_percentheal(struct map_session_data *sd,int hp,int sp) +int pc_percentheal (struct map_session_data *sd, int hp, int sp) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->state.potionpitcher_flag) { - sd->potion_per_hp = hp; - sd->potion_per_sp = sp; - return 0; - } + if (sd->state.potionpitcher_flag) + { + sd->potion_per_hp = hp; + sd->potion_per_sp = sp; + return 0; + } - if(pc_checkoverhp(sd)) { - if(hp > 0) - hp = 0; - } - if(pc_checkoversp(sd)) { - if(sp > 0) - sp = 0; - } - if(hp) { - if(hp >= 100) { - sd->status.hp = sd->status.max_hp; - } - else if(hp <= -100) { - sd->status.hp = 0; - pc_damage(NULL,sd,1); - } - else { - sd->status.hp += sd->status.max_hp*hp/100; - if(sd->status.hp > sd->status.max_hp) - sd->status.hp = sd->status.max_hp; - if(sd->status.hp <= 0) { - sd->status.hp = 0; - pc_damage(NULL,sd,1); - hp = 0; - } - } - } - if(sp) { - if(sp >= 100) { - sd->status.sp = sd->status.max_sp; - } - else if(sp <= -100) { - sd->status.sp = 0; - } - else { - sd->status.sp += sd->status.max_sp*sp/100; - if(sd->status.sp > sd->status.max_sp) - sd->status.sp = sd->status.max_sp; - if(sd->status.sp < 0) - sd->status.sp = 0; - } - } - if(hp) - clif_updatestatus(sd,SP_HP); - if(sp) - clif_updatestatus(sd,SP_SP); + if (pc_checkoverhp (sd)) + { + if (hp > 0) + hp = 0; + } + if (pc_checkoversp (sd)) + { + if (sp > 0) + sp = 0; + } + if (hp) + { + if (hp >= 100) + { + sd->status.hp = sd->status.max_hp; + } + else if (hp <= -100) + { + sd->status.hp = 0; + pc_damage (NULL, sd, 1); + } + else + { + sd->status.hp += sd->status.max_hp * hp / 100; + if (sd->status.hp > sd->status.max_hp) + sd->status.hp = sd->status.max_hp; + if (sd->status.hp <= 0) + { + sd->status.hp = 0; + pc_damage (NULL, sd, 1); + hp = 0; + } + } + } + if (sp) + { + if (sp >= 100) + { + sd->status.sp = sd->status.max_sp; + } + else if (sp <= -100) + { + sd->status.sp = 0; + } + else + { + sd->status.sp += sd->status.max_sp * sp / 100; + if (sd->status.sp > sd->status.max_sp) + sd->status.sp = sd->status.max_sp; + if (sd->status.sp < 0) + sd->status.sp = 0; + } + } + if (hp) + clif_updatestatus (sd, SP_HP); + if (sp) + clif_updatestatus (sd, SP_SP); - return 0; + return 0; } /*========================================== @@ -5716,627 +6552,703 @@ int pc_percentheal(struct map_session_data *sd,int hp,int sp) * upper ソスハ擾ソス 0, ソス]ソスソス 1, ソス{ソスq 2, ソスソスソスフまゑソス -1 *------------------------------------------ */ -int pc_jobchange(struct map_session_data *sd,int job, int upper) -{ - int i; - int b_class = 0; - //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス - struct pc_base_job s_class = pc_calc_base_job(sd->status.class); - - nullpo_retr(0, sd); - - if((job > 23) && (job < 68)) - job += 3977; - - if((job > 69) && (job < 4000)) - return 1; - - if(upper < 0) //ソスソスソスン転ソスソスソスソスソスヌゑソスソスソスソス判断ソスソスソスソス - upper = s_class.upper; - - if(upper == 0){ //ソスハ擾ソスソスEソスネゑソスjobソスソスソスフまゑソスソスソス - b_class = job; - }else if(upper == 1){ - if(job == 23){ //ソス]ソスソスソスノスソスpソスmソスrソスヘ托ソスソスンゑソスソスネゑソスソスフでゑソスソスfソスソス - return 1; - }else{ - b_class = job + 4001; - } - }else if(upper == 2){ //ソス{ソスqソスノ鯉ソスソスソスソスヘなゑソスソスソスソスヌどゑソスソスソスソスソスソスナ蹴ソスソスソスソスソス驍ゥソス轤「ソスソスソスソス - b_class = (job==23)?job + 4022:job + 4023; - }else{ - return 1; - } +int pc_jobchange (struct map_session_data *sd, int job, int upper) +{ + int i; + int b_class = 0; + //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス + struct pc_base_job s_class = pc_calc_base_job (sd->status.class); - if((sd->status.sex == 0 && job == 19) || (sd->status.sex == 1 && job == 20) || - (sd->status.sex == 0 && job == 4020) || (sd->status.sex == 1 && job == 4021) || - job ==22 || sd->status.class == b_class) //ソスソスソスヘバソス[ソスhソスノなゑソスソスネゑソスソスAソスソスソスヘダソスソスソスTソス[ソスノなゑソスソスネゑソスソスAソスソスソスソスソス゚裳ゑソスソスfソスソス - return 1; - - sd->status.class = sd->view_class = b_class; - - sd->status.job_level=1; - sd->status.job_exp=0; - clif_updatestatus(sd,SP_JOBLEVEL); - clif_updatestatus(sd,SP_JOBEXP); - clif_updatestatus(sd,SP_NEXTJOBEXP); - - for(i=0;i<11;i++) { - if(sd->equip_index[i] >= 0) - if(!pc_isequip(sd,sd->equip_index[i])) - pc_unequipitem(sd,sd->equip_index[i],1); // ソスソスソスソスソスOソスソス - } + nullpo_retr (0, sd); - clif_changelook(&sd->bl,LOOK_BASE,sd->view_class); // move sprite update to prevent client crashes with incompatible equipment [Valaris] - if(sd->status.clothes_color > 0) - clif_changelook(&sd->bl,LOOK_CLOTHES_COLOR,sd->status.clothes_color); - if(battle_config.muting_players && sd->status.manner < 0) - clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner); - - pc_calcstatus(sd,0); - pc_checkallowskill(sd); - pc_equiplookall(sd); - clif_equiplist(sd); - - if(pc_isriding(sd)) { // remove peco status if changing into invalid class [Valaris] - if(!(pc_checkskill(sd,KN_RIDING))) - pc_setoption(sd,sd->status.option|-0x0000); - if(pc_checkskill(sd,KN_RIDING)>0) - pc_setriding(sd); - } - - return 0; + if ((job > 23) && (job < 68)) + job += 3977; + + if ((job > 69) && (job < 4000)) + return 1; + + if (upper < 0) //ソスソスソスン転ソスソスソスソスソスヌゑソスソスソスソス判断ソスソスソスソス + upper = s_class.upper; + + if (upper == 0) + { //ソスハ擾ソスソスEソスネゑソスjobソスソスソスフまゑソスソスソス + b_class = job; + } + else if (upper == 1) + { + if (job == 23) + { //ソス]ソスソスソスノスソスpソスmソスrソスヘ托ソスソスンゑソスソスネゑソスソスフでゑソスソスfソスソス + return 1; + } + else + { + b_class = job + 4001; + } + } + else if (upper == 2) + { //ソス{ソスqソスノ鯉ソスソスソスソスヘなゑソスソスソスソスヌどゑソスソスソスソスソスソスナ蹴ソスソスソスソスソス驍ゥソス轤「ソスソスソスソス + b_class = (job == 23) ? job + 4022 : job + 4023; + } + else + { + return 1; + } + + if ((sd->status.sex == 0 && job == 19) || (sd->status.sex == 1 && job == 20) || (sd->status.sex == 0 && job == 4020) || (sd->status.sex == 1 && job == 4021) || job == 22 || sd->status.class == b_class) //ソスソスソスヘバソス[ソスhソスノなゑソスソスネゑソスソスAソスソスソスヘダソスソスソスTソス[ソスノなゑソスソスネゑソスソスAソスソスソスソスソス゚裳ゑソスソスfソスソス + return 1; + + sd->status.class = sd->view_class = b_class; + + sd->status.job_level = 1; + sd->status.job_exp = 0; + clif_updatestatus (sd, SP_JOBLEVEL); + clif_updatestatus (sd, SP_JOBEXP); + clif_updatestatus (sd, SP_NEXTJOBEXP); + + for (i = 0; i < 11; i++) + { + if (sd->equip_index[i] >= 0) + if (!pc_isequip (sd, sd->equip_index[i])) + pc_unequipitem (sd, sd->equip_index[i], 1); // ソスソスソスソスソスOソスソス + } + + clif_changelook (&sd->bl, LOOK_BASE, sd->view_class); // move sprite update to prevent client crashes with incompatible equipment [Valaris] + if (sd->status.clothes_color > 0) + clif_changelook (&sd->bl, LOOK_CLOTHES_COLOR, + sd->status.clothes_color); + if (battle_config.muting_players && sd->status.manner < 0) + clif_changestatus (&sd->bl, SP_MANNER, sd->status.manner); + + pc_calcstatus (sd, 0); + pc_checkallowskill (sd); + pc_equiplookall (sd); + clif_equiplist (sd); + + if (pc_isriding (sd)) + { // remove peco status if changing into invalid class [Valaris] + if (!(pc_checkskill (sd, KN_RIDING))) + pc_setoption (sd, sd->status.option | -0x0000); + if (pc_checkskill (sd, KN_RIDING) > 0) + pc_setriding (sd); + } + + return 0; } /*========================================== * ソスソスソスソスソスレ変更 *------------------------------------------ */ -int pc_equiplookall(struct map_session_data *sd) +int pc_equiplookall (struct map_session_data *sd) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - clif_changelook(&sd->bl,LOOK_WEAPON,0); -// clif_changelook(&sd->bl,LOOK_SHOES,0); - clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom); - clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top); - clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid); + clif_changelook (&sd->bl, LOOK_WEAPON, 0); +// clif_changelook(&sd->bl,LOOK_SHOES,0); + clif_changelook (&sd->bl, LOOK_HEAD_BOTTOM, sd->status.head_bottom); + clif_changelook (&sd->bl, LOOK_HEAD_TOP, sd->status.head_top); + clif_changelook (&sd->bl, LOOK_HEAD_MID, sd->status.head_mid); - clif_changelook_accessories(&sd->bl, NULL); + clif_changelook_accessories (&sd->bl, NULL); - return 0; + return 0; } /*========================================== * ソスソスソスソスソスレ変更 *------------------------------------------ */ -int pc_changelook(struct map_session_data *sd,int type,int val) -{ - nullpo_retr(0, sd); - - switch(type){ - case LOOK_HAIR: - sd->status.hair=val; - break; - case LOOK_WEAPON: - sd->status.weapon=val; - break; - case LOOK_HEAD_BOTTOM: - sd->status.head_bottom=val; - break; - case LOOK_HEAD_TOP: - sd->status.head_top=val; - break; - case LOOK_HEAD_MID: - sd->status.head_mid=val; - break; - case LOOK_HAIR_COLOR: - sd->status.hair_color=val; - break; - case LOOK_CLOTHES_COLOR: - sd->status.clothes_color=val; - break; - case LOOK_SHIELD: - sd->status.shield=val; - break; - case LOOK_SHOES: - break; - } - clif_changelook(&sd->bl,type,val); +int pc_changelook (struct map_session_data *sd, int type, int val) +{ + nullpo_retr (0, sd); + + switch (type) + { + case LOOK_HAIR: + sd->status.hair = val; + break; + case LOOK_WEAPON: + sd->status.weapon = val; + break; + case LOOK_HEAD_BOTTOM: + sd->status.head_bottom = val; + break; + case LOOK_HEAD_TOP: + sd->status.head_top = val; + break; + case LOOK_HEAD_MID: + sd->status.head_mid = val; + break; + case LOOK_HAIR_COLOR: + sd->status.hair_color = val; + break; + case LOOK_CLOTHES_COLOR: + sd->status.clothes_color = val; + break; + case LOOK_SHIELD: + sd->status.shield = val; + break; + case LOOK_SHOES: + break; + } + clif_changelook (&sd->bl, type, val); - return 0; + return 0; } /*========================================== * ソスtソスソスソスi(ソスソス,ソスyソスR,ソスJソス[ソスg)ソスン抵ソス *------------------------------------------ */ -int pc_setoption(struct map_session_data *sd,int type) +int pc_setoption (struct map_session_data *sd, int type) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - sd->status.option=type; - clif_changeoption(&sd->bl); - pc_calcstatus(sd,0); + sd->status.option = type; + clif_changeoption (&sd->bl); + pc_calcstatus (sd, 0); - return 0; + return 0; } /*========================================== * ソスJソス[ソスgソスン抵ソス *------------------------------------------ */ -int pc_setcart(struct map_session_data *sd,int type) -{ - int cart[6]={0x0000,0x0008,0x0080,0x0100,0x0200,0x0400}; - - nullpo_retr(0, sd); - - if(pc_checkskill(sd,MC_PUSHCART)>0){ // ソスvソスbソスVソスソスソスJソス[ソスgソスXソスLソスソスソスソスソスソス - if(!pc_iscarton(sd)){ // ソスJソス[ソスgソスソスソスtソスソスソストゑソスソスネゑソス - pc_setoption(sd,cart[type]); - clif_cart_itemlist(sd); - clif_cart_equiplist(sd); - clif_updatestatus(sd,SP_CARTINFO); - clif_status_change(&sd->bl,0x0c,0); - } - else{ - pc_setoption(sd,cart[type]); - } - } +int pc_setcart (struct map_session_data *sd, int type) +{ + int cart[6] = { 0x0000, 0x0008, 0x0080, 0x0100, 0x0200, 0x0400 }; + + nullpo_retr (0, sd); + + if (pc_checkskill (sd, MC_PUSHCART) > 0) + { // ソスvソスbソスVソスソスソスJソス[ソスgソスXソスLソスソスソスソスソスソス + if (!pc_iscarton (sd)) + { // ソスJソス[ソスgソスソスソスtソスソスソストゑソスソスネゑソス + pc_setoption (sd, cart[type]); + clif_cart_itemlist (sd); + clif_cart_equiplist (sd); + clif_updatestatus (sd, SP_CARTINFO); + clif_status_change (&sd->bl, 0x0c, 0); + } + else + { + pc_setoption (sd, cart[type]); + } + } - return 0; + return 0; } /*========================================== * ソスソスソスン抵ソス *------------------------------------------ */ -int pc_setfalcon(struct map_session_data *sd) +int pc_setfalcon (struct map_session_data *sd) { - if(pc_checkskill(sd,HT_FALCON)>0){ // ソスtソス@ソスソスソスRソスソスソス}ソスXソス^ソスソスソス[ソスXソスLソスソスソスソスソスソス - pc_setoption(sd,sd->status.option|0x0010); - } + if (pc_checkskill (sd, HT_FALCON) > 0) + { // ソスtソス@ソスソスソスRソスソスソス}ソスXソス^ソスソスソス[ソスXソスLソスソスソスソスソスソス + pc_setoption (sd, sd->status.option | 0x0010); + } - return 0; + return 0; } /*========================================== * ソスyソスRソスyソスRソスン抵ソス *------------------------------------------ */ -int pc_setriding(struct map_session_data *sd) +int pc_setriding (struct map_session_data *sd) { - if(sd->disguise > 0) { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] - clif_displaymessage(sd->fd, "Cannot mount a Peco while in disguise."); - return 0; - } + if (sd->disguise > 0) + { // temporary prevention of crash caused by peco + disguise, will look into a better solution [Valaris] + clif_displaymessage (sd->fd, + "Cannot mount a Peco while in disguise."); + return 0; + } - if((pc_checkskill(sd,KN_RIDING)>0)){ // ソスソスソスCソスfソスBソスソスソスOソスXソスLソスソスソスソスソスソス - pc_setoption(sd,sd->status.option|0x0020); - - if(sd->status.class==7) - sd->status.class=sd->view_class=13; - - if(sd->status.class==14) - sd->status.class=sd->view_class=21; - - if(sd->status.class==4008) - sd->status.class=sd->view_class=4014; - - if(sd->status.class==4015) - sd->status.class=sd->view_class=4022; - } + if ((pc_checkskill (sd, KN_RIDING) > 0)) + { // ソスソスソスCソスfソスBソスソスソスOソスXソスLソスソスソスソスソスソス + pc_setoption (sd, sd->status.option | 0x0020); + + if (sd->status.class == 7) + sd->status.class = sd->view_class = 13; + + if (sd->status.class == 14) + sd->status.class = sd->view_class = 21; + + if (sd->status.class == 4008) + sd->status.class = sd->view_class = 4014; + + if (sd->status.class == 4015) + sd->status.class = sd->view_class = 4022; + } - return 0; + return 0; } /*========================================== * scriptソスpソスマ撰ソスソスフ値ソスソスソスヌゑソス *------------------------------------------ */ -int pc_readreg(struct map_session_data *sd,int reg) +int pc_readreg (struct map_session_data *sd, int reg) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - for(i=0;i<sd->reg_num;i++) - if(sd->reg[i].index==reg) - return sd->reg[i].data; + for (i = 0; i < sd->reg_num; i++) + if (sd->reg[i].index == reg) + return sd->reg[i].data; - return 0; + return 0; } + /*========================================== * scriptソスpソスマ撰ソスソスフ値ソスソスソスン抵ソス *------------------------------------------ */ -int pc_setreg(struct map_session_data *sd,int reg,int val) +int pc_setreg (struct map_session_data *sd, int reg, int val) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - for (i = 0; i < sd->reg_num; i++) { - if (sd->reg[i].index == reg){ - sd->reg[i].data = val; - return 0; - } - } - sd->reg_num++; - sd->reg = realloc(sd->reg, sizeof(*(sd->reg)) * sd->reg_num); - if (sd->reg == NULL){ - printf("out of memory : pc_setreg\n"); - exit(1); - } + for (i = 0; i < sd->reg_num; i++) + { + if (sd->reg[i].index == reg) + { + sd->reg[i].data = val; + return 0; + } + } + sd->reg_num++; + sd->reg = realloc (sd->reg, sizeof (*(sd->reg)) * sd->reg_num); + if (sd->reg == NULL) + { + printf ("out of memory : pc_setreg\n"); + exit (1); + } /* memset(sd->reg + (sd->reg_num - 1) * sizeof(*(sd->reg)), 0, sizeof(*(sd->reg))); */ - sd->reg[i].index = reg; - sd->reg[i].data = val; + sd->reg[i].index = reg; + sd->reg[i].data = val; - return 0; + return 0; } /*========================================== * scriptソスpソスソスソスソスソスソスソスマ撰ソスソスフ値ソスソスソスヌゑソス *------------------------------------------ */ -char *pc_readregstr(struct map_session_data *sd,int reg) +char *pc_readregstr (struct map_session_data *sd, int reg) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - for(i=0;i<sd->regstr_num;i++) - if(sd->regstr[i].index==reg) - return sd->regstr[i].data; + for (i = 0; i < sd->regstr_num; i++) + if (sd->regstr[i].index == reg) + return sd->regstr[i].data; - return NULL; + return NULL; } + /*========================================== * scriptソスpソスソスソスソスソスソスソスマ撰ソスソスフ値ソスソスソスン抵ソス *------------------------------------------ */ -int pc_setregstr(struct map_session_data *sd,int reg,char *str) +int pc_setregstr (struct map_session_data *sd, int reg, char *str) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(strlen(str)+1 >= sizeof(sd->regstr[0].data)){ - printf("pc_setregstr: string too long !\n"); - return 0; - } + if (strlen (str) + 1 >= sizeof (sd->regstr[0].data)) + { + printf ("pc_setregstr: string too long !\n"); + return 0; + } - for(i=0;i<sd->regstr_num;i++) - if(sd->regstr[i].index==reg){ - strcpy(sd->regstr[i].data,str); - return 0; - } - sd->regstr_num++; - sd->regstr = realloc(sd->regstr, sizeof(sd->regstr[0]) * sd->regstr_num); - if(sd->regstr==NULL){ - printf("out of memory : pc_setreg\n"); - exit(1); - } + for (i = 0; i < sd->regstr_num; i++) + if (sd->regstr[i].index == reg) + { + strcpy (sd->regstr[i].data, str); + return 0; + } + sd->regstr_num++; + sd->regstr = + realloc (sd->regstr, sizeof (sd->regstr[0]) * sd->regstr_num); + if (sd->regstr == NULL) + { + printf ("out of memory : pc_setreg\n"); + exit (1); + } /* memset(sd->reg + (sd->reg_num - 1) * sizeof(*(sd->reg)), 0, sizeof(*(sd->reg))); */ - sd->regstr[i].index=reg; - strcpy(sd->regstr[i].data,str); + sd->regstr[i].index = reg; + strcpy (sd->regstr[i].data, str); - return 0; + return 0; } /*========================================== * scriptソスpソスOソスソスソス[ソスoソスソスソスマ撰ソスソスフ値ソスソスソスヌゑソス *------------------------------------------ */ -int pc_readglobalreg(struct map_session_data *sd,char *reg) +int pc_readglobalreg (struct map_session_data *sd, char *reg) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - for(i=0;i<sd->status.global_reg_num;i++){ - if(strcmp(sd->status.global_reg[i].str,reg)==0) - return sd->status.global_reg[i].value; - } + for (i = 0; i < sd->status.global_reg_num; i++) + { + if (strcmp (sd->status.global_reg[i].str, reg) == 0) + return sd->status.global_reg[i].value; + } - return 0; + return 0; } /*========================================== * scriptソスpソスOソスソスソス[ソスoソスソスソスマ撰ソスソスフ値ソスソスソスン抵ソス *------------------------------------------ */ -int pc_setglobalreg(struct map_session_data *sd,char *reg,int val) +int pc_setglobalreg (struct map_session_data *sd, char *reg, int val) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - //PC_DIE_COUNTERソスソスソスXソスNソスソスソスvソスgソスネどで変更ソスソスソス黷スソスソスソスフ擾ソスソスソス - if(strcmp(reg,"PC_DIE_COUNTER") == 0 && sd->die_counter != val){ - sd->die_counter = val; - pc_calcstatus(sd,0); - } - if(val==0){ - for(i=0;i<sd->status.global_reg_num;i++){ - if(strcmp(sd->status.global_reg[i].str,reg)==0){ - sd->status.global_reg[i]=sd->status.global_reg[sd->status.global_reg_num-1]; - sd->status.global_reg_num--; - break; - } - } - return 0; - } - for(i=0;i<sd->status.global_reg_num;i++){ - if(strcmp(sd->status.global_reg[i].str,reg)==0){ - sd->status.global_reg[i].value=val; - return 0; - } - } - if(sd->status.global_reg_num<GLOBAL_REG_NUM){ - strcpy(sd->status.global_reg[i].str,reg); - sd->status.global_reg[i].value=val; - sd->status.global_reg_num++; - return 0; - } - if(battle_config.error_log) - printf("pc_setglobalreg : couldn't set %s (GLOBAL_REG_NUM = %d)\n", reg, GLOBAL_REG_NUM); + //PC_DIE_COUNTERソスソスソスXソスNソスソスソスvソスgソスネどで変更ソスソスソス黷スソスソスソスフ擾ソスソスソス + if (strcmp (reg, "PC_DIE_COUNTER") == 0 && sd->die_counter != val) + { + sd->die_counter = val; + pc_calcstatus (sd, 0); + } + if (val == 0) + { + for (i = 0; i < sd->status.global_reg_num; i++) + { + if (strcmp (sd->status.global_reg[i].str, reg) == 0) + { + sd->status.global_reg[i] = + sd->status.global_reg[sd->status.global_reg_num - 1]; + sd->status.global_reg_num--; + break; + } + } + return 0; + } + for (i = 0; i < sd->status.global_reg_num; i++) + { + if (strcmp (sd->status.global_reg[i].str, reg) == 0) + { + sd->status.global_reg[i].value = val; + return 0; + } + } + if (sd->status.global_reg_num < GLOBAL_REG_NUM) + { + strcpy (sd->status.global_reg[i].str, reg); + sd->status.global_reg[i].value = val; + sd->status.global_reg_num++; + return 0; + } + if (battle_config.error_log) + printf ("pc_setglobalreg : couldn't set %s (GLOBAL_REG_NUM = %d)\n", + reg, GLOBAL_REG_NUM); - return 1; + return 1; } /*========================================== * scriptソスpソスAソスJソスEソスソスソスgソスマ撰ソスソスフ値ソスソスソスヌゑソス *------------------------------------------ */ -int pc_readaccountreg(struct map_session_data *sd,char *reg) +int pc_readaccountreg (struct map_session_data *sd, char *reg) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - for(i=0;i<sd->status.account_reg_num;i++){ - if(strcmp(sd->status.account_reg[i].str,reg)==0) - return sd->status.account_reg[i].value; - } + for (i = 0; i < sd->status.account_reg_num; i++) + { + if (strcmp (sd->status.account_reg[i].str, reg) == 0) + return sd->status.account_reg[i].value; + } - return 0; + return 0; } + /*========================================== * scriptソスpソスAソスJソスEソスソスソスgソスマ撰ソスソスフ値ソスソスソスン抵ソス *------------------------------------------ */ -int pc_setaccountreg(struct map_session_data *sd,char *reg,int val) -{ - int i; - - nullpo_retr(0, sd); - - if(val==0){ - for(i=0;i<sd->status.account_reg_num;i++){ - if(strcmp(sd->status.account_reg[i].str,reg)==0){ - sd->status.account_reg[i]=sd->status.account_reg[sd->status.account_reg_num-1]; - sd->status.account_reg_num--; - break; - } - } - intif_saveaccountreg(sd); - return 0; - } - for(i=0;i<sd->status.account_reg_num;i++){ - if(strcmp(sd->status.account_reg[i].str,reg)==0){ - sd->status.account_reg[i].value=val; - intif_saveaccountreg(sd); - return 0; - } - } - if(sd->status.account_reg_num<ACCOUNT_REG_NUM){ - strcpy(sd->status.account_reg[i].str,reg); - sd->status.account_reg[i].value=val; - sd->status.account_reg_num++; - intif_saveaccountreg(sd); - return 0; - } - if(battle_config.error_log) - printf("pc_setaccountreg : couldn't set %s (ACCOUNT_REG_NUM = %d)\n", reg, ACCOUNT_REG_NUM); +int pc_setaccountreg (struct map_session_data *sd, char *reg, int val) +{ + int i; + + nullpo_retr (0, sd); + + if (val == 0) + { + for (i = 0; i < sd->status.account_reg_num; i++) + { + if (strcmp (sd->status.account_reg[i].str, reg) == 0) + { + sd->status.account_reg[i] = + sd->status.account_reg[sd->status.account_reg_num - 1]; + sd->status.account_reg_num--; + break; + } + } + intif_saveaccountreg (sd); + return 0; + } + for (i = 0; i < sd->status.account_reg_num; i++) + { + if (strcmp (sd->status.account_reg[i].str, reg) == 0) + { + sd->status.account_reg[i].value = val; + intif_saveaccountreg (sd); + return 0; + } + } + if (sd->status.account_reg_num < ACCOUNT_REG_NUM) + { + strcpy (sd->status.account_reg[i].str, reg); + sd->status.account_reg[i].value = val; + sd->status.account_reg_num++; + intif_saveaccountreg (sd); + return 0; + } + if (battle_config.error_log) + printf ("pc_setaccountreg : couldn't set %s (ACCOUNT_REG_NUM = %d)\n", + reg, ACCOUNT_REG_NUM); - return 1; + return 1; } + /*========================================== * scriptソスpソスAソスJソスEソスソスソスgソスマ撰ソス2ソスフ値ソスソスソスヌゑソス *------------------------------------------ */ -int pc_readaccountreg2(struct map_session_data *sd,char *reg) +int pc_readaccountreg2 (struct map_session_data *sd, char *reg) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - for(i=0;i<sd->status.account_reg2_num;i++){ - if(strcmp(sd->status.account_reg2[i].str,reg)==0) - return sd->status.account_reg2[i].value; - } + for (i = 0; i < sd->status.account_reg2_num; i++) + { + if (strcmp (sd->status.account_reg2[i].str, reg) == 0) + return sd->status.account_reg2[i].value; + } - return 0; + return 0; } + /*========================================== * scriptソスpソスAソスJソスEソスソスソスgソスマ撰ソス2ソスフ値ソスソスソスン抵ソス *------------------------------------------ */ -int pc_setaccountreg2(struct map_session_data *sd,char *reg,int val) -{ - int i; - - nullpo_retr(1, sd); - - if(val==0){ - for(i=0;i<sd->status.account_reg2_num;i++){ - if(strcmp(sd->status.account_reg2[i].str,reg)==0){ - sd->status.account_reg2[i]=sd->status.account_reg2[sd->status.account_reg2_num-1]; - sd->status.account_reg2_num--; - break; - } - } - chrif_saveaccountreg2(sd); - return 0; - } - for(i=0;i<sd->status.account_reg2_num;i++){ - if(strcmp(sd->status.account_reg2[i].str,reg)==0){ - sd->status.account_reg2[i].value=val; - chrif_saveaccountreg2(sd); - return 0; - } - } - if(sd->status.account_reg2_num<ACCOUNT_REG2_NUM){ - strcpy(sd->status.account_reg2[i].str,reg); - sd->status.account_reg2[i].value=val; - sd->status.account_reg2_num++; - chrif_saveaccountreg2(sd); - return 0; - } - if(battle_config.error_log) - printf("pc_setaccountreg2 : couldn't set %s (ACCOUNT_REG2_NUM = %d)\n", reg, ACCOUNT_REG2_NUM); +int pc_setaccountreg2 (struct map_session_data *sd, char *reg, int val) +{ + int i; + + nullpo_retr (1, sd); + + if (val == 0) + { + for (i = 0; i < sd->status.account_reg2_num; i++) + { + if (strcmp (sd->status.account_reg2[i].str, reg) == 0) + { + sd->status.account_reg2[i] = + sd->status.account_reg2[sd->status.account_reg2_num - 1]; + sd->status.account_reg2_num--; + break; + } + } + chrif_saveaccountreg2 (sd); + return 0; + } + for (i = 0; i < sd->status.account_reg2_num; i++) + { + if (strcmp (sd->status.account_reg2[i].str, reg) == 0) + { + sd->status.account_reg2[i].value = val; + chrif_saveaccountreg2 (sd); + return 0; + } + } + if (sd->status.account_reg2_num < ACCOUNT_REG2_NUM) + { + strcpy (sd->status.account_reg2[i].str, reg); + sd->status.account_reg2[i].value = val; + sd->status.account_reg2_num++; + chrif_saveaccountreg2 (sd); + return 0; + } + if (battle_config.error_log) + printf + ("pc_setaccountreg2 : couldn't set %s (ACCOUNT_REG2_NUM = %d)\n", + reg, ACCOUNT_REG2_NUM); - return 1; + return 1; } + /*========================================== * ソスソスソスBソスソスソスソスソスソス *------------------------------------------ */ -int pc_percentrefinery(struct map_session_data *sd,struct item *item) +int pc_percentrefinery (struct map_session_data *sd, struct item *item) { - int percent; + int percent; - nullpo_retr(0, item); - percent=percentrefinery[itemdb_wlv(item->nameid)][(int)item->refine]; + nullpo_retr (0, item); + percent = percentrefinery[itemdb_wlv (item->nameid)][(int) item->refine]; - percent += pc_checkskill(sd,BS_WEAPONRESEARCH); // ソスソスソス研ソスソスソスXソスLソスソスソスソスソスソス + percent += pc_checkskill (sd, BS_WEAPONRESEARCH); // ソスソスソス研ソスソスソスXソスLソスソスソスソスソスソス - // ソスmソスソスソスフ有ソスソスソスヘ囲チソスFソスbソスN - if( percent > 100 ){ - percent = 100; - } - if( percent < 0 ){ - percent = 0; - } + // ソスmソスソスソスフ有ソスソスソスヘ囲チソスFソスbソスN + if (percent > 100) + { + percent = 100; + } + if (percent < 0) + { + percent = 0; + } - return percent; + return percent; } /*========================================== * ソスCソスxソスソスソスgソス^ソスCソス}ソス[ソスソスソスソス *------------------------------------------ */ -int pc_eventtimer(int tid,unsigned int tick,int id,int data) +int pc_eventtimer (int tid, unsigned int tick, int id, int data) { - struct map_session_data *sd=map_id2sd(id); - int i; - if(sd==NULL) - return 0; + struct map_session_data *sd = map_id2sd (id); + int i; + if (sd == NULL) + return 0; - for(i=0;i<MAX_EVENTTIMER;i++){ - if( sd->eventtimer[i]==tid ){ - sd->eventtimer[i]=-1; - npc_event(sd,(const char *)data,0); - break; - } - } - free((void *)data); - if(i==MAX_EVENTTIMER) { - if(battle_config.error_log) - printf("pc_eventtimer: no such event timer\n"); - } + for (i = 0; i < MAX_EVENTTIMER; i++) + { + if (sd->eventtimer[i] == tid) + { + sd->eventtimer[i] = -1; + npc_event (sd, (const char *) data, 0); + break; + } + } + free ((void *) data); + if (i == MAX_EVENTTIMER) + { + if (battle_config.error_log) + printf ("pc_eventtimer: no such event timer\n"); + } - return 0; + return 0; } /*========================================== * ソスCソスxソスソスソスgソス^ソスCソス}ソス[ソスヌ会ソス *------------------------------------------ */ -int pc_addeventtimer(struct map_session_data *sd,int tick,const char *name) -{ - int i; - - nullpo_retr(0, sd); - - for(i=0;i<MAX_EVENTTIMER;i++) - if( sd->eventtimer[i]==-1 ) - break; - if(i<MAX_EVENTTIMER){ - char *evname=(char *)aCalloc(24,sizeof(char)); - memcpy(evname,name,24); - sd->eventtimer[i]=add_timer(gettick()+tick, - pc_eventtimer,sd->bl.id,(int)evname); - } +int pc_addeventtimer (struct map_session_data *sd, int tick, const char *name) +{ + int i; + + nullpo_retr (0, sd); + + for (i = 0; i < MAX_EVENTTIMER; i++) + if (sd->eventtimer[i] == -1) + break; + if (i < MAX_EVENTTIMER) + { + char *evname = (char *) aCalloc (24, sizeof (char)); + memcpy (evname, name, 24); + sd->eventtimer[i] = add_timer (gettick () + tick, + pc_eventtimer, sd->bl.id, + (int) evname); + } - return 0; + return 0; } /*========================================== * ソスCソスxソスソスソスgソス^ソスCソス}ソス[ソス除 *------------------------------------------ */ -int pc_deleventtimer(struct map_session_data *sd,const char *name) +int pc_deleventtimer (struct map_session_data *sd, const char *name) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - for(i=0;i<MAX_EVENTTIMER;i++) - if( sd->eventtimer[i]!=-1 && strcmp( - (char *)(get_timer(sd->eventtimer[i])->data), name)==0 ){ - delete_timer(sd->eventtimer[i],pc_eventtimer); - sd->eventtimer[i]=-1; - break; - } + for (i = 0; i < MAX_EVENTTIMER; i++) + if (sd->eventtimer[i] != -1 && strcmp ((char + *) (get_timer (sd->eventtimer + [i])->data), + name) == 0) + { + delete_timer (sd->eventtimer[i], pc_eventtimer); + sd->eventtimer[i] = -1; + break; + } - return 0; + return 0; } /*========================================== * ソスCソスxソスソスソスgソス^ソスCソス}ソス[ソスJソスEソスソスソスgソスlソスヌ会ソス *------------------------------------------ */ -int pc_addeventtimercount(struct map_session_data *sd,const char *name,int tick) +int pc_addeventtimercount (struct map_session_data *sd, const char *name, + int tick) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - for(i=0;i<MAX_EVENTTIMER;i++) - if( sd->eventtimer[i]!=-1 && strcmp( - (char *)(get_timer(sd->eventtimer[i])->data), name)==0 ){ - addtick_timer(sd->eventtimer[i],tick); - break; - } + for (i = 0; i < MAX_EVENTTIMER; i++) + if (sd->eventtimer[i] != -1 && strcmp ((char + *) (get_timer (sd->eventtimer + [i])->data), + name) == 0) + { + addtick_timer (sd->eventtimer[i], tick); + break; + } - return 0; + return 0; } /*========================================== * ソスCソスxソスソスソスgソス^ソスCソス}ソス[ソスSソス除 *------------------------------------------ */ -int pc_cleareventtimer(struct map_session_data *sd) +int pc_cleareventtimer (struct map_session_data *sd) { - int i; + int i; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - for(i=0;i<MAX_EVENTTIMER;i++) - if( sd->eventtimer[i]!=-1 ){ - delete_timer(sd->eventtimer[i],pc_eventtimer); - sd->eventtimer[i]=-1; - } + for (i = 0; i < MAX_EVENTTIMER; i++) + if (sd->eventtimer[i] != -1) + { + delete_timer (sd->eventtimer[i], pc_eventtimer); + sd->eventtimer[i] = -1; + } - return 0; + return 0; } // @@ -6347,254 +7259,295 @@ int pc_cleareventtimer(struct map_session_data *sd) *------------------------------------------ */ static int -pc_signal_advanced_equipment_change(struct map_session_data *sd,int n) -{ - if(sd->status.inventory[n].equip & 0x0040) - clif_changelook(&sd->bl,LOOK_SHOES,0); - if(sd->status.inventory[n].equip & 0x0004) - clif_changelook(&sd->bl, LOOK_GLOVES, 0); - if(sd->status.inventory[n].equip & 0x0008) - clif_changelook(&sd->bl, LOOK_CAPE, 0); - if(sd->status.inventory[n].equip & 0x0010) - clif_changelook(&sd->bl, LOOK_MISC1, 0); - if(sd->status.inventory[n].equip & 0x0080) - clif_changelook(&sd->bl, LOOK_MISC2, 0); - return 0; +pc_signal_advanced_equipment_change (struct map_session_data *sd, int n) +{ + if (sd->status.inventory[n].equip & 0x0040) + clif_changelook (&sd->bl, LOOK_SHOES, 0); + if (sd->status.inventory[n].equip & 0x0004) + clif_changelook (&sd->bl, LOOK_GLOVES, 0); + if (sd->status.inventory[n].equip & 0x0008) + clif_changelook (&sd->bl, LOOK_CAPE, 0); + if (sd->status.inventory[n].equip & 0x0010) + clif_changelook (&sd->bl, LOOK_MISC1, 0); + if (sd->status.inventory[n].equip & 0x0080) + clif_changelook (&sd->bl, LOOK_MISC2, 0); + return 0; } - -int pc_equipitem(struct map_session_data *sd,int n,int pos) +int pc_equipitem (struct map_session_data *sd, int n, int pos) { - int i,nameid, arrow, view; - struct item_data *id; - //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス + int i, nameid, arrow, view; + struct item_data *id; + //ソス]ソスソスソスソスソス{ソスqソスフ場合ソスフ鯉ソスソスフ職ソスニゑソスソスZソスoソスソスソスソス - nullpo_retr(0, sd); + nullpo_retr (0, sd); - - if (n < 0 || n >= MAX_INVENTORY) { - clif_equipitemack(sd, 0, 0, 0); - return 0; - } + if (n < 0 || n >= MAX_INVENTORY) + { + clif_equipitemack (sd, 0, 0, 0); + return 0; + } - nameid = sd->status.inventory[n].nameid; - id = sd->inventory_data[n]; - pos = pc_equippoint(sd,n); + nameid = sd->status.inventory[n].nameid; + id = sd->inventory_data[n]; + pos = pc_equippoint (sd, n); - if(battle_config.battle_log) - printf("equip %d(%d) %x:%x\n",nameid,n,id->equip,pos); - if(!pc_isequip(sd,n) || !pos || sd->status.inventory[n].broken==1 ) { // [Valaris] - clif_equipitemack(sd,n,0,0); // fail - return 0; - } + if (battle_config.battle_log) + printf ("equip %d(%d) %x:%x\n", nameid, n, id->equip, pos); + if (!pc_isequip (sd, n) || !pos || sd->status.inventory[n].broken == 1) + { // [Valaris] + clif_equipitemack (sd, n, 0, 0); // fail + return 0; + } // -- moonsoul (if player is berserk then cannot equip) // - if(sd->sc_data[SC_BERSERK].timer!=-1){ - clif_equipitemack(sd,n,0,0); // fail - return 0; - } + if (sd->sc_data[SC_BERSERK].timer != -1) + { + clif_equipitemack (sd, n, 0, 0); // fail + return 0; + } - if(pos==0x88){ // ソスAソスNソスZソスTソスソスソスpソスソスソスOソスソスソスソス - int epor=0; - if(sd->equip_index[0] >= 0) - epor |= sd->status.inventory[sd->equip_index[0]].equip; - if(sd->equip_index[1] >= 0) - epor |= sd->status.inventory[sd->equip_index[1]].equip; - epor &= 0x88; - pos = epor == 0x08 ? 0x80 : 0x08; - } + if (pos == 0x88) + { // ソスAソスNソスZソスTソスソスソスpソスソスソスOソスソスソスソス + int epor = 0; + if (sd->equip_index[0] >= 0) + epor |= sd->status.inventory[sd->equip_index[0]].equip; + if (sd->equip_index[1] >= 0) + epor |= sd->status.inventory[sd->equip_index[1]].equip; + epor &= 0x88; + pos = epor == 0x08 ? 0x80 : 0x08; + } - // ソス刀暦ソスソスソスソスソス - if ((pos==0x22) // ソス皷橸ソスAソスソスソスソスソスvソスソスソスモ擾ソスソスソスソス刀暦ソスソスソスソスかソス`ソスFソスbソスNソスソスソスソス - && (id->equip==2) // ソスP ソス阨撰ソスソス - && (pc_checkskill(sd, AS_LEFT) > 0 || sd->status.class == 12) ) // ソスソスソスソスソスCソスBソスL - { - int tpos=0; - if(sd->equip_index[8] >= 0) - tpos |= sd->status.inventory[sd->equip_index[8]].equip; - if(sd->equip_index[9] >= 0) - tpos |= sd->status.inventory[sd->equip_index[9]].equip; - tpos &= 0x02; - pos = tpos == 0x02 ? 0x20 : 0x02; - } + // ソス刀暦ソスソスソスソスソス + if ((pos == 0x22) // ソス皷橸ソスAソスソスソスソスソスvソスソスソスモ擾ソスソスソスソス刀暦ソスソスソスソスかソス`ソスFソスbソスNソスソスソスソス + && (id->equip == 2) // ソスP ソス阨撰ソスソス + && (pc_checkskill (sd, AS_LEFT) > 0 || sd->status.class == 12)) // ソスソスソスソスソスCソスBソスL + { + int tpos = 0; + if (sd->equip_index[8] >= 0) + tpos |= sd->status.inventory[sd->equip_index[8]].equip; + if (sd->equip_index[9] >= 0) + tpos |= sd->status.inventory[sd->equip_index[9]].equip; + tpos &= 0x02; + pos = tpos == 0x02 ? 0x20 : 0x02; + } - arrow=pc_search_inventory(sd,pc_checkequip(sd,9)); // Added by RoVeRT - for(i=0;i<11;i++) { - if (pos & equip_pos[i]) { - if (sd->equip_index[i] >= 0) //Slot taken, remove item from there. - pc_unequipitem(sd, sd->equip_index[i], 1); - sd->equip_index[i] = n; - } - } - // ソス|ソス装ソスソス - if(pos==0x8000){ - clif_arrowequip(sd,n); - clif_arrow_fail(sd,3); // 3=ソスがソスソスソスソスソスナゑソスソスワゑソスソスソス - } - else { - /* Don't update re-equipping if we're using a spell */ - if (!(pos == 4 && sd->attack_spell_override)) - clif_equipitemack(sd,n,pos,1); + arrow = pc_search_inventory (sd, pc_checkequip (sd, 9)); // Added by RoVeRT + for (i = 0; i < 11; i++) + { + if (pos & equip_pos[i]) + { + if (sd->equip_index[i] >= 0) //Slot taken, remove item from there. + pc_unequipitem (sd, sd->equip_index[i], 1); + sd->equip_index[i] = n; } + } + // ソス|ソス装ソスソス + if (pos == 0x8000) + { + clif_arrowequip (sd, n); + clif_arrow_fail (sd, 3); // 3=ソスがソスソスソスソスソスナゑソスソスワゑソスソスソス + } + else + { + /* Don't update re-equipping if we're using a spell */ + if (!(pos == 4 && sd->attack_spell_override)) + clif_equipitemack (sd, n, pos, 1); + } - for(i=0;i<11;i++) { - if(pos & equip_pos[i]) - sd->equip_index[i] = n; - } - sd->status.inventory[n].equip=pos; + for (i = 0; i < 11; i++) + { + if (pos & equip_pos[i]) + sd->equip_index[i] = n; + } + sd->status.inventory[n].equip = pos; - if(sd->inventory_data[n]) { - view = sd->inventory_data[n]->look; - if (view == 0) view = sd->inventory_data[n]->nameid; - } else { - view = 0; - } + if (sd->inventory_data[n]) + { + view = sd->inventory_data[n]->look; + if (view == 0) + view = sd->inventory_data[n]->nameid; + } + else + { + view = 0; + } - if(sd->status.inventory[n].equip & 0x0002) { - sd->weapontype1 = view; - pc_calcweapontype(sd); - pc_set_weapon_look(sd); - } - if(sd->status.inventory[n].equip & 0x0020) { - if(sd->inventory_data[n]) { - if(sd->inventory_data[n]->type == 4) { - sd->status.shield = 0; - if(sd->status.inventory[n].equip == 0x0020) - sd->weapontype2 = view; - } - else if(sd->inventory_data[n]->type == 5) { - sd->status.shield = view; - sd->weapontype2 = 0; - } - } - else - sd->status.shield = sd->weapontype2 = 0; - pc_calcweapontype(sd); - clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield); - } - if(sd->status.inventory[n].equip & 0x0001) { - sd->status.head_bottom = view; - clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom); - } - if(sd->status.inventory[n].equip & 0x0100) { - sd->status.head_top = view; - clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top); - } - if(sd->status.inventory[n].equip & 0x0200) { - sd->status.head_mid = view; - clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid); - } - pc_signal_advanced_equipment_change(sd, n); + if (sd->status.inventory[n].equip & 0x0002) + { + sd->weapontype1 = view; + pc_calcweapontype (sd); + pc_set_weapon_look (sd); + } + if (sd->status.inventory[n].equip & 0x0020) + { + if (sd->inventory_data[n]) + { + if (sd->inventory_data[n]->type == 4) + { + sd->status.shield = 0; + if (sd->status.inventory[n].equip == 0x0020) + sd->weapontype2 = view; + } + else if (sd->inventory_data[n]->type == 5) + { + sd->status.shield = view; + sd->weapontype2 = 0; + } + } + else + sd->status.shield = sd->weapontype2 = 0; + pc_calcweapontype (sd); + clif_changelook (&sd->bl, LOOK_SHIELD, sd->status.shield); + } + if (sd->status.inventory[n].equip & 0x0001) + { + sd->status.head_bottom = view; + clif_changelook (&sd->bl, LOOK_HEAD_BOTTOM, sd->status.head_bottom); + } + if (sd->status.inventory[n].equip & 0x0100) + { + sd->status.head_top = view; + clif_changelook (&sd->bl, LOOK_HEAD_TOP, sd->status.head_top); + } + if (sd->status.inventory[n].equip & 0x0200) + { + sd->status.head_mid = view; + clif_changelook (&sd->bl, LOOK_HEAD_MID, sd->status.head_mid); + } + pc_signal_advanced_equipment_change (sd, n); - pc_checkallowskill(sd); // ソスソスソスソスソスiソスナスソスLソスソスソスソスソスソスソスソスソスソス驍ゥソス`ソスFソスbソスN - if (itemdb_look(sd->status.inventory[n].nameid) == 11 && arrow){ // Added by RoVeRT - clif_arrowequip(sd,arrow); - sd->status.inventory[arrow].equip=32768; - } - pc_calcstatus(sd,0); + pc_checkallowskill (sd); // ソスソスソスソスソスiソスナスソスLソスソスソスソスソスソスソスソスソスソス驍ゥソス`ソスFソスbソスN + if (itemdb_look (sd->status.inventory[n].nameid) == 11 && arrow) + { // Added by RoVeRT + clif_arrowequip (sd, arrow); + sd->status.inventory[arrow].equip = 32768; + } + pc_calcstatus (sd, 0); - if(sd->special_state.infinite_endure) { - if(sd->sc_data[SC_ENDURE].timer == -1) - skill_status_change_start(&sd->bl,SC_ENDURE,10,1,0,0,0,0); - } - else { - if(sd->sc_data[SC_ENDURE].timer != -1 && sd->sc_data[SC_ENDURE].val2) - skill_status_change_end(&sd->bl,SC_ENDURE,-1); - } + if (sd->special_state.infinite_endure) + { + if (sd->sc_data[SC_ENDURE].timer == -1) + skill_status_change_start (&sd->bl, SC_ENDURE, 10, 1, 0, 0, 0, 0); + } + else + { + if (sd->sc_data[SC_ENDURE].timer != -1 && sd->sc_data[SC_ENDURE].val2) + skill_status_change_end (&sd->bl, SC_ENDURE, -1); + } - if(sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele)) - skill_status_change_end(&sd->bl,SC_SIGNUMCRUCIS,-1); - if(sd->sc_data[SC_DANCING].timer!=-1 && (sd->status.weapon != 13 && sd->status.weapon !=14)) - skill_stop_dancing(&sd->bl,0); + if (sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 + && !battle_check_undead (7, sd->def_ele)) + skill_status_change_end (&sd->bl, SC_SIGNUMCRUCIS, -1); + if (sd->sc_data[SC_DANCING].timer != -1 + && (sd->status.weapon != 13 && sd->status.weapon != 14)) + skill_stop_dancing (&sd->bl, 0); - return 0; + return 0; } /*========================================== * ソスソス ソスソスソスソスソスソスソスソスOソスソス *------------------------------------------ */ -int pc_unequipitem(struct map_session_data *sd,int n,int type) +int pc_unequipitem (struct map_session_data *sd, int n, int type) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); -// -- moonsoul (if player is berserk then cannot unequip) +// -- moonsoul (if player is berserk then cannot unequip) // - if(sd->sc_data[SC_BERSERK].timer!=-1){ - clif_unequipitemack(sd,n,0,0); - return 0; - } + if (sd->sc_data[SC_BERSERK].timer != -1) + { + clif_unequipitemack (sd, n, 0, 0); + return 0; + } - if(battle_config.battle_log) - printf("unequip %d %x:%x\n",n,pc_equippoint(sd,n),sd->status.inventory[n].equip); - if(sd->status.inventory[n].equip){ - int i; - for(i=0;i<11;i++) { - if(sd->status.inventory[n].equip & equip_pos[i]) - sd->equip_index[i] = -1; - } - if(sd->status.inventory[n].equip & 0x0002) { - sd->weapontype1 = 0; - sd->status.weapon = sd->weapontype2; - pc_calcweapontype(sd); - pc_set_weapon_look(sd); - } - if(sd->status.inventory[n].equip & 0x0020) { - sd->status.shield = sd->weapontype2 = 0; - pc_calcweapontype(sd); - clif_changelook(&sd->bl,LOOK_SHIELD,sd->status.shield); - } - if(sd->status.inventory[n].equip & 0x0001) { - sd->status.head_bottom = 0; - clif_changelook(&sd->bl,LOOK_HEAD_BOTTOM,sd->status.head_bottom); - } - if(sd->status.inventory[n].equip & 0x0100) { - sd->status.head_top = 0; - clif_changelook(&sd->bl,LOOK_HEAD_TOP,sd->status.head_top); - } - if(sd->status.inventory[n].equip & 0x0200) { - sd->status.head_mid = 0; - clif_changelook(&sd->bl,LOOK_HEAD_MID,sd->status.head_mid); - } - pc_signal_advanced_equipment_change(sd, n); - - if(sd->sc_data[SC_BROKNWEAPON].timer != -1 && sd->status.inventory[n].equip & 0x0002 && - sd->status.inventory[i].broken==1) - skill_status_change_end(&sd->bl,SC_BROKNWEAPON,-1); - - clif_unequipitemack(sd,n,sd->status.inventory[n].equip,1); - sd->status.inventory[n].equip=0; - if(!type) - pc_checkallowskill(sd); - if(sd->weapontype1 == 0 && sd->weapontype2 == 0) - skill_encchant_eremental_end(&sd->bl,-1); //ソスソスソス持ソスソスソスソスソスソスソスヘ厄ソスソスソスナ托ソスソスソスソスtソス^ソスソスソスソス - } else { - clif_unequipitemack(sd,n,0,0); - } - if(!type) { - pc_calcstatus(sd,0); - if(sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 && !battle_check_undead(7,sd->def_ele)) - skill_status_change_end(&sd->bl,SC_SIGNUMCRUCIS,-1); - } + if (battle_config.battle_log) + printf ("unequip %d %x:%x\n", n, pc_equippoint (sd, n), + sd->status.inventory[n].equip); + if (sd->status.inventory[n].equip) + { + int i; + for (i = 0; i < 11; i++) + { + if (sd->status.inventory[n].equip & equip_pos[i]) + sd->equip_index[i] = -1; + } + if (sd->status.inventory[n].equip & 0x0002) + { + sd->weapontype1 = 0; + sd->status.weapon = sd->weapontype2; + pc_calcweapontype (sd); + pc_set_weapon_look (sd); + } + if (sd->status.inventory[n].equip & 0x0020) + { + sd->status.shield = sd->weapontype2 = 0; + pc_calcweapontype (sd); + clif_changelook (&sd->bl, LOOK_SHIELD, sd->status.shield); + } + if (sd->status.inventory[n].equip & 0x0001) + { + sd->status.head_bottom = 0; + clif_changelook (&sd->bl, LOOK_HEAD_BOTTOM, + sd->status.head_bottom); + } + if (sd->status.inventory[n].equip & 0x0100) + { + sd->status.head_top = 0; + clif_changelook (&sd->bl, LOOK_HEAD_TOP, sd->status.head_top); + } + if (sd->status.inventory[n].equip & 0x0200) + { + sd->status.head_mid = 0; + clif_changelook (&sd->bl, LOOK_HEAD_MID, sd->status.head_mid); + } + pc_signal_advanced_equipment_change (sd, n); + + if (sd->sc_data[SC_BROKNWEAPON].timer != -1 + && sd->status.inventory[n].equip & 0x0002 + && sd->status.inventory[i].broken == 1) + skill_status_change_end (&sd->bl, SC_BROKNWEAPON, -1); + + clif_unequipitemack (sd, n, sd->status.inventory[n].equip, 1); + sd->status.inventory[n].equip = 0; + if (!type) + pc_checkallowskill (sd); + if (sd->weapontype1 == 0 && sd->weapontype2 == 0) + skill_encchant_eremental_end (&sd->bl, -1); //ソスソスソス持ソスソスソスソスソスソスソスヘ厄ソスソスソスナ托ソスソスソスソスtソス^ソスソスソスソス + } + else + { + clif_unequipitemack (sd, n, 0, 0); + } + if (!type) + { + pc_calcstatus (sd, 0); + if (sd->sc_data[SC_SIGNUMCRUCIS].timer != -1 + && !battle_check_undead (7, sd->def_ele)) + skill_status_change_end (&sd->bl, SC_SIGNUMCRUCIS, -1); + } - return 0; + return 0; } -int pc_unequipinvyitem(struct map_session_data* sd, int n, int type) +int pc_unequipinvyitem (struct map_session_data *sd, int n, int type) { - int i; + int i; - nullpo_retr(1, sd); + nullpo_retr (1, sd); - for (i = 0; i < 11; i++) { - if (equip_pos[i] > 0 && sd->equip_index[i] == n) { //Slot taken, remove item from there. - pc_unequipitem(sd, sd->equip_index[i], type); - sd->equip_index[i] = -1; - } - } + for (i = 0; i < 11; i++) + { + if (equip_pos[i] > 0 && sd->equip_index[i] == n) + { //Slot taken, remove item from there. + pc_unequipitem (sd, sd->equip_index[i], type); + sd->equip_index[i] = -1; + } + } - return 0; + return 0; } /*========================================== @@ -6602,247 +7555,278 @@ int pc_unequipinvyitem(struct map_session_data* sd, int n, int type) * ソスソス ソスソスソスiソスフ托ソスソスソスソスツ能ソス`ソスFソスbソスNソスソスソスsソスネゑソス *------------------------------------------ */ -int pc_checkitem(struct map_session_data *sd) -{ - int i,j,k,id,calc_flag = 0; - struct item_data *it=NULL; - - nullpo_retr(0, sd); - - // ソスソスソスソスソスiソスき詰ソスソス - for(i=j=0;i<MAX_INVENTORY;i++){ - if( (id=sd->status.inventory[i].nameid)==0) - continue; - if( battle_config.item_check && !itemdb_available(id) ){ - if(battle_config.error_log) - printf("illeagal item id %d in %d[%s] inventory.\n",id,sd->bl.id,sd->status.name); - pc_delitem(sd,i,sd->status.inventory[i].amount,3); - continue; - } - if(i>j){ - memcpy(&sd->status.inventory[j],&sd->status.inventory[i],sizeof(struct item)); - sd->inventory_data[j] = sd->inventory_data[i]; - } - j++; - } - if(j < MAX_INVENTORY) - memset(&sd->status.inventory[j],0,sizeof(struct item)*(MAX_INVENTORY-j)); - for(k=j;k<MAX_INVENTORY;k++) - sd->inventory_data[k] = NULL; - - // ソスJソス[ソスgソスソスソスき詰ソスソス - for(i=j=0;i<MAX_CART;i++){ - if( (id=sd->status.cart[i].nameid)==0 ) - continue; - if( battle_config.item_check && !itemdb_available(id) ){ - if(battle_config.error_log) - printf("illeagal item id %d in %d[%s] cart.\n",id,sd->bl.id,sd->status.name); - pc_cart_delitem(sd,i,sd->status.cart[i].amount,1); - continue; - } - if(i>j){ - memcpy(&sd->status.cart[j],&sd->status.cart[i],sizeof(struct item)); - } - j++; - } - if(j < MAX_CART) - memset(&sd->status.cart[j],0,sizeof(struct item)*(MAX_CART-j)); - - // ソスソス ソスソスソスハ置ソス`ソスFソスbソスN - - for(i=0;i<MAX_INVENTORY;i++){ - - it=sd->inventory_data[i]; - - if(sd->status.inventory[i].nameid==0) - continue; - if(sd->status.inventory[i].equip & ~pc_equippoint(sd,i)) { - sd->status.inventory[i].equip=0; - calc_flag = 1; - } - //ソスソスソスソスソス`ソスFソスbソスN - if(sd->status.inventory[i].equip && map[sd->bl.m].flag.pvp && (it->flag.no_equip==1 || it->flag.no_equip==3)){//PvPソスソスソスソス - sd->status.inventory[i].equip=0; - calc_flag = 1; - }else if(sd->status.inventory[i].equip && map[sd->bl.m].flag.gvg && (it->flag.no_equip==2 || it->flag.no_equip==3)){//GvGソスソスソスソス - sd->status.inventory[i].equip=0; - calc_flag = 1; - } - } +int pc_checkitem (struct map_session_data *sd) +{ + int i, j, k, id, calc_flag = 0; + struct item_data *it = NULL; + + nullpo_retr (0, sd); + + // ソスソスソスソスソスiソスき詰ソスソス + for (i = j = 0; i < MAX_INVENTORY; i++) + { + if ((id = sd->status.inventory[i].nameid) == 0) + continue; + if (battle_config.item_check && !itemdb_available (id)) + { + if (battle_config.error_log) + printf ("illeagal item id %d in %d[%s] inventory.\n", id, + sd->bl.id, sd->status.name); + pc_delitem (sd, i, sd->status.inventory[i].amount, 3); + continue; + } + if (i > j) + { + memcpy (&sd->status.inventory[j], &sd->status.inventory[i], + sizeof (struct item)); + sd->inventory_data[j] = sd->inventory_data[i]; + } + j++; + } + if (j < MAX_INVENTORY) + memset (&sd->status.inventory[j], 0, + sizeof (struct item) * (MAX_INVENTORY - j)); + for (k = j; k < MAX_INVENTORY; k++) + sd->inventory_data[k] = NULL; + + // ソスJソス[ソスgソスソスソスき詰ソスソス + for (i = j = 0; i < MAX_CART; i++) + { + if ((id = sd->status.cart[i].nameid) == 0) + continue; + if (battle_config.item_check && !itemdb_available (id)) + { + if (battle_config.error_log) + printf ("illeagal item id %d in %d[%s] cart.\n", id, + sd->bl.id, sd->status.name); + pc_cart_delitem (sd, i, sd->status.cart[i].amount, 1); + continue; + } + if (i > j) + { + memcpy (&sd->status.cart[j], &sd->status.cart[i], + sizeof (struct item)); + } + j++; + } + if (j < MAX_CART) + memset (&sd->status.cart[j], 0, + sizeof (struct item) * (MAX_CART - j)); + + // ソスソス ソスソスソスハ置ソス`ソスFソスbソスN - pc_setequipindex(sd); - if(calc_flag) - pc_calcstatus(sd,2); + for (i = 0; i < MAX_INVENTORY; i++) + { - return 0; + it = sd->inventory_data[i]; + + if (sd->status.inventory[i].nameid == 0) + continue; + if (sd->status.inventory[i].equip & ~pc_equippoint (sd, i)) + { + sd->status.inventory[i].equip = 0; + calc_flag = 1; + } + //ソスソスソスソスソス`ソスFソスbソスN + if (sd->status.inventory[i].equip && map[sd->bl.m].flag.pvp + && (it->flag.no_equip == 1 || it->flag.no_equip == 3)) + { //PvPソスソスソスソス + sd->status.inventory[i].equip = 0; + calc_flag = 1; + } + else if (sd->status.inventory[i].equip && map[sd->bl.m].flag.gvg + && (it->flag.no_equip == 2 || it->flag.no_equip == 3)) + { //GvGソスソスソスソス + sd->status.inventory[i].equip = 0; + calc_flag = 1; + } + } + + pc_setequipindex (sd); + if (calc_flag) + pc_calcstatus (sd, 2); + + return 0; } -int pc_checkoverhp(struct map_session_data *sd) +int pc_checkoverhp (struct map_session_data *sd) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->status.hp == sd->status.max_hp) - return 1; - if(sd->status.hp > sd->status.max_hp) { - sd->status.hp = sd->status.max_hp; - clif_updatestatus(sd,SP_HP); - return 2; - } + if (sd->status.hp == sd->status.max_hp) + return 1; + if (sd->status.hp > sd->status.max_hp) + { + sd->status.hp = sd->status.max_hp; + clif_updatestatus (sd, SP_HP); + return 2; + } - return 0; + return 0; } -int pc_checkoversp(struct map_session_data *sd) +int pc_checkoversp (struct map_session_data *sd) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(sd->status.sp == sd->status.max_sp) - return 1; - if(sd->status.sp > sd->status.max_sp) { - sd->status.sp = sd->status.max_sp; - clif_updatestatus(sd,SP_SP); - return 2; - } + if (sd->status.sp == sd->status.max_sp) + return 1; + if (sd->status.sp > sd->status.max_sp) + { + sd->status.sp = sd->status.max_sp; + clif_updatestatus (sd, SP_SP); + return 2; + } - return 0; + return 0; } /*========================================== * PVPソスソスソスハ計ソスZソスp(foreachinarea) *------------------------------------------ */ -int pc_calc_pvprank_sub(struct block_list *bl,va_list ap) +int pc_calc_pvprank_sub (struct block_list *bl, va_list ap) { - struct map_session_data *sd1,*sd2=NULL; + struct map_session_data *sd1, *sd2 = NULL; - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, sd1=(struct map_session_data *)bl); - nullpo_retr(0, sd2=va_arg(ap,struct map_session_data *)); + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, sd1 = (struct map_session_data *) bl); + nullpo_retr (0, sd2 = va_arg (ap, struct map_session_data *)); - if( sd1->pvp_point > sd2->pvp_point ) - sd2->pvp_rank++; - return 0; + if (sd1->pvp_point > sd2->pvp_point) + sd2->pvp_rank++; + return 0; } + /*========================================== * PVPソスソスソスハ計ソスZ *------------------------------------------ */ -int pc_calc_pvprank(struct map_session_data *sd) +int pc_calc_pvprank (struct map_session_data *sd) { - int old; - struct map_data *m; + int old; + struct map_data *m; - nullpo_retr(0, sd); - nullpo_retr(0, m=&map[sd->bl.m]); - - old=sd->pvp_rank; + nullpo_retr (0, sd); + nullpo_retr (0, m = &map[sd->bl.m]); - if( !(m->flag.pvp) ) - return 0; - sd->pvp_rank=1; - map_foreachinarea(pc_calc_pvprank_sub,sd->bl.m,0,0,m->xs,m->ys,BL_PC,sd); - if(old!=sd->pvp_rank || sd->pvp_lastusers!=m->users) - clif_pvpset(sd,sd->pvp_rank,sd->pvp_lastusers=m->users,0); - return sd->pvp_rank; + old = sd->pvp_rank; + + if (!(m->flag.pvp)) + return 0; + sd->pvp_rank = 1; + map_foreachinarea (pc_calc_pvprank_sub, sd->bl.m, 0, 0, m->xs, m->ys, + BL_PC, sd); + if (old != sd->pvp_rank || sd->pvp_lastusers != m->users) + clif_pvpset (sd, sd->pvp_rank, sd->pvp_lastusers = m->users, 0); + return sd->pvp_rank; } + /*========================================== * PVPソスソスソスハ計ソスZ(timer) *------------------------------------------ */ -int pc_calc_pvprank_timer(int tid,unsigned int tick,int id,int data) +int pc_calc_pvprank_timer (int tid, unsigned int tick, int id, int data) { - struct map_session_data *sd=NULL; - if(battle_config.pk_mode) // disable pvp ranking if pk_mode on [Valaris] - return 0; + struct map_session_data *sd = NULL; + if (battle_config.pk_mode) // disable pvp ranking if pk_mode on [Valaris] + return 0; - sd=map_id2sd(id); - if(sd==NULL) - return 0; - sd->pvp_timer=-1; - if( pc_calc_pvprank(sd)>0 ) - sd->pvp_timer=add_timer( - gettick()+PVP_CALCRANK_INTERVAL, - pc_calc_pvprank_timer,id,data); - return 0; + sd = map_id2sd (id); + if (sd == NULL) + return 0; + sd->pvp_timer = -1; + if (pc_calc_pvprank (sd) > 0) + sd->pvp_timer = add_timer (gettick () + PVP_CALCRANK_INTERVAL, + pc_calc_pvprank_timer, id, data); + return 0; } /*========================================== * sdソスヘ鯉ソスソスソスソスソスソストゑソスソス驍ゥ(ソスソスソスソスソスフ場合ソスヘ托ソスソスソスソスソスchar_idソスソスソスヤゑソス) *------------------------------------------ */ -int pc_ismarried(struct map_session_data *sd) +int pc_ismarried (struct map_session_data *sd) { - if(sd == NULL) - return -1; - if(sd->status.partner_id > 0) - return sd->status.partner_id; - else - return 0; + if (sd == NULL) + return -1; + if (sd->status.partner_id > 0) + return sd->status.partner_id; + else + return 0; } + /*========================================== * sdソスソスdstsdソスニ鯉ソスソスソス(dstsdソスソスsdソスフ鯉ソスソスソスソスソスソスソスソスソスソスソスソスノ行ソスソス) *------------------------------------------ */ -int pc_marriage(struct map_session_data *sd,struct map_session_data *dstsd) +int pc_marriage (struct map_session_data *sd, struct map_session_data *dstsd) { - if(sd == NULL || dstsd == NULL || sd->status.partner_id > 0 || dstsd->status.partner_id > 0) - return -1; - sd->status.partner_id=dstsd->status.char_id; - dstsd->status.partner_id=sd->status.char_id; - return 0; + if (sd == NULL || dstsd == NULL || sd->status.partner_id > 0 + || dstsd->status.partner_id > 0) + return -1; + sd->status.partner_id = dstsd->status.char_id; + dstsd->status.partner_id = sd->status.char_id; + return 0; } /*========================================== * sdソスソスソスソスソスソス(ソスソスソスソスソスソスsd->status.partner_idソスノ依ゑソス)(ソスソスソスソスソスソスソスソスソスノ暦ソスソスソスソスEソスソスソスソスソスwソスヨ趣ソスソスソスソスソスソスD) *------------------------------------------ */ -int pc_divorce(struct map_session_data *sd) -{ - struct map_session_data *p_sd=NULL; - if(sd == NULL || !pc_ismarried(sd)) - return -1; - - // If both are on map server we don't need to bother the char server - if( (p_sd=map_nick2sd(map_charid2nick(sd->status.partner_id))) !=NULL) { - if(p_sd->status.partner_id != sd->status.char_id || sd->status.partner_id != p_sd->status.char_id){ - printf("pc_divorce: Illegal partner_id sd=%d p_sd=%d\n",sd->status.partner_id,p_sd->status.partner_id); - return -1; - } - p_sd->status.partner_id=0; - sd->status.partner_id=0; - - if (sd->npc_flags.divorce){ - sd->npc_flags.divorce = 0; - map_scriptcont(sd, sd->npc_id); - } - } - else - chrif_send_divorce(sd->status.char_id); +int pc_divorce (struct map_session_data *sd) +{ + struct map_session_data *p_sd = NULL; + if (sd == NULL || !pc_ismarried (sd)) + return -1; + + // If both are on map server we don't need to bother the char server + if ((p_sd = + map_nick2sd (map_charid2nick (sd->status.partner_id))) != NULL) + { + if (p_sd->status.partner_id != sd->status.char_id + || sd->status.partner_id != p_sd->status.char_id) + { + printf ("pc_divorce: Illegal partner_id sd=%d p_sd=%d\n", + sd->status.partner_id, p_sd->status.partner_id); + return -1; + } + p_sd->status.partner_id = 0; + sd->status.partner_id = 0; + + if (sd->npc_flags.divorce) + { + sd->npc_flags.divorce = 0; + map_scriptcont (sd, sd->npc_id); + } + } + else + chrif_send_divorce (sd->status.char_id); - return 0; + return 0; } /*========================================== * sdソスフ托ソスソスソスソスソスmap_session_dataソスソスソスヤゑソス *------------------------------------------ */ -struct map_session_data *pc_get_partner(struct map_session_data *sd) +struct map_session_data *pc_get_partner (struct map_session_data *sd) { - struct map_session_data *p_sd = NULL; - char *nick; - if(sd == NULL || !pc_ismarried(sd)) - return NULL; + struct map_session_data *p_sd = NULL; + char *nick; + if (sd == NULL || !pc_ismarried (sd)) + return NULL; - nick=map_charid2nick(sd->status.partner_id); + nick = map_charid2nick (sd->status.partner_id); - if (nick==NULL) - return NULL; + if (nick == NULL) + return NULL; - if((p_sd=map_nick2sd(nick)) == NULL ) - return NULL; + if ((p_sd = map_nick2sd (nick)) == NULL) + return NULL; - return p_sd; + return p_sd; } // @@ -6852,553 +7836,660 @@ struct map_session_data *pc_get_partner(struct map_session_data *sd) * SPソス復量計ソスZ *------------------------------------------ */ -static int natural_heal_tick,natural_heal_prev_tick,natural_heal_diff_tick; -static int pc_spheal(struct map_session_data *sd) +static int natural_heal_tick, natural_heal_prev_tick, natural_heal_diff_tick; +static int pc_spheal (struct map_session_data *sd) { - int a; - struct guild_castle *gc = NULL; + int a; + struct guild_castle *gc = NULL; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - a = natural_heal_diff_tick; - if(pc_issit(sd)) a += a; - if( sd->sc_data[SC_MAGNIFICAT].timer!=-1 ) // ソス}ソスOソスjソスtソスBソスJソス[ソスg - a += a; + a = natural_heal_diff_tick; + if (pc_issit (sd)) + a += a; + if (sd->sc_data[SC_MAGNIFICAT].timer != -1) // ソス}ソスOソスjソスtソスBソスJソス[ソスg + a += a; - gc=guild_mapname2gc(sd->mapname); // Increased guild castle regen [Valaris] - if(gc) { - struct guild *g; - g=guild_search(sd->status.guild_id); - if(g && g->guild_id == gc->guild_id) - a += a; - } // end addition [Valaris] + gc = guild_mapname2gc (sd->mapname); // Increased guild castle regen [Valaris] + if (gc) + { + struct guild *g; + g = guild_search (sd->status.guild_id); + if (g && g->guild_id == gc->guild_id) + a += a; + } // end addition [Valaris] - return a; + return a; } /*========================================== * HPソス復量計ソスZ *------------------------------------------ */ -static int pc_hpheal(struct map_session_data *sd) +static int pc_hpheal (struct map_session_data *sd) { - int a; - struct guild_castle *gc; + int a; + struct guild_castle *gc; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - a = natural_heal_diff_tick; - if(pc_issit(sd)) a += a; - if( sd->sc_data[SC_MAGNIFICAT].timer!=-1 ) // Modified by RoVeRT - a += a; + a = natural_heal_diff_tick; + if (pc_issit (sd)) + a += a; + if (sd->sc_data[SC_MAGNIFICAT].timer != -1) // Modified by RoVeRT + a += a; - gc=guild_mapname2gc(sd->mapname); // Increased guild castle regen [Valaris] - if(gc) { - struct guild *g; - g=guild_search(sd->status.guild_id); - if(g && g->guild_id == gc->guild_id) - a += a; - } // end addition [Valaris] + gc = guild_mapname2gc (sd->mapname); // Increased guild castle regen [Valaris] + if (gc) + { + struct guild *g; + g = guild_search (sd->status.guild_id); + if (g && g->guild_id == gc->guild_id) + a += a; + } // end addition [Valaris] - return a; + return a; } -static int pc_natural_heal_hp(struct map_session_data *sd) +static int pc_natural_heal_hp (struct map_session_data *sd) { - int bhp; - int inc_num,bonus,skill,hp_flag; + int bhp; + int inc_num, bonus, skill, hp_flag; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if (sd->sc_data[SC_TRICKDEAD].timer != -1) // Modified by RoVeRT - return 0; + if (sd->sc_data[SC_TRICKDEAD].timer != -1) // Modified by RoVeRT + return 0; - if(pc_checkoverhp(sd)) { - sd->hp_sub = sd->inchealhptick = 0; - return 0; - } + if (pc_checkoverhp (sd)) + { + sd->hp_sub = sd->inchealhptick = 0; + return 0; + } - bhp=sd->status.hp; - hp_flag = (pc_checkskill(sd,SM_MOVINGRECOVERY) > 0 && sd->walktimer != -1); - - if(sd->walktimer == -1) { - inc_num = pc_hpheal(sd); - if( sd->sc_data[SC_TENSIONRELAX].timer!=-1 ){ // ソスeソスソスソスVソスソスソスソスソスソスソスソスソスbソスNソスX - sd->hp_sub += 2*inc_num; - sd->inchealhptick += 3*natural_heal_diff_tick; - }else{ - sd->hp_sub += inc_num; - sd->inchealhptick += natural_heal_diff_tick; - } - } - else if(hp_flag) { - inc_num = pc_hpheal(sd); - sd->hp_sub += inc_num; - sd->inchealhptick = 0; - } - else { - sd->hp_sub = sd->inchealhptick = 0; - return 0; - } + bhp = sd->status.hp; + hp_flag = (pc_checkskill (sd, SM_MOVINGRECOVERY) > 0 + && sd->walktimer != -1); + + if (sd->walktimer == -1) + { + inc_num = pc_hpheal (sd); + if (sd->sc_data[SC_TENSIONRELAX].timer != -1) + { // ソスeソスソスソスVソスソスソスソスソスソスソスソスソスbソスNソスX + sd->hp_sub += 2 * inc_num; + sd->inchealhptick += 3 * natural_heal_diff_tick; + } + else + { + sd->hp_sub += inc_num; + sd->inchealhptick += natural_heal_diff_tick; + } + } + else if (hp_flag) + { + inc_num = pc_hpheal (sd); + sd->hp_sub += inc_num; + sd->inchealhptick = 0; + } + else + { + sd->hp_sub = sd->inchealhptick = 0; + return 0; + } - if(sd->hp_sub >= battle_config.natural_healhp_interval) { - bonus = sd->nhealhp; - if(hp_flag) { - bonus >>= 2; - if(bonus <= 0) bonus = 1; - } - while(sd->hp_sub >= battle_config.natural_healhp_interval) { - sd->hp_sub -= battle_config.natural_healhp_interval; - if(sd->status.hp + bonus <= sd->status.max_hp) - sd->status.hp += bonus; - else { - sd->status.hp = sd->status.max_hp; - sd->hp_sub = sd->inchealhptick = 0; - } - } - } - if(bhp!=sd->status.hp) - clif_updatestatus(sd,SP_HP); - - if(sd->nshealhp > 0) { - if(sd->inchealhptick >= battle_config.natural_heal_skill_interval && sd->status.hp < sd->status.max_hp) { - bonus = sd->nshealhp; - while(sd->inchealhptick >= battle_config.natural_heal_skill_interval) { - sd->inchealhptick -= battle_config.natural_heal_skill_interval; - if(sd->status.hp + bonus <= sd->status.max_hp) - sd->status.hp += bonus; - else { - bonus = sd->status.max_hp - sd->status.hp; - sd->status.hp = sd->status.max_hp; - sd->hp_sub = sd->inchealhptick = 0; - } - clif_heal(sd->fd,SP_HP,bonus); - } - } - } - else sd->inchealhptick = 0; - - return 0; - - if(sd->sc_data[SC_APPLEIDUN].timer!=-1) { // Apple of Idun - if(sd->inchealhptick >= 6000 && sd->status.hp < sd->status.max_hp) { - bonus = skill*20; - while(sd->inchealhptick >= 6000) { - sd->inchealhptick -= 6000; - if(sd->status.hp + bonus <= sd->status.max_hp) - sd->status.hp += bonus; - else { - bonus = sd->status.max_hp - sd->status.hp; - sd->status.hp = sd->status.max_hp; - sd->hp_sub = sd->inchealhptick = 0; - } - clif_heal(sd->fd,SP_HP,bonus); - } - } - } - else sd->inchealhptick = 0; + if (sd->hp_sub >= battle_config.natural_healhp_interval) + { + bonus = sd->nhealhp; + if (hp_flag) + { + bonus >>= 2; + if (bonus <= 0) + bonus = 1; + } + while (sd->hp_sub >= battle_config.natural_healhp_interval) + { + sd->hp_sub -= battle_config.natural_healhp_interval; + if (sd->status.hp + bonus <= sd->status.max_hp) + sd->status.hp += bonus; + else + { + sd->status.hp = sd->status.max_hp; + sd->hp_sub = sd->inchealhptick = 0; + } + } + } + if (bhp != sd->status.hp) + clif_updatestatus (sd, SP_HP); + + if (sd->nshealhp > 0) + { + if (sd->inchealhptick >= battle_config.natural_heal_skill_interval + && sd->status.hp < sd->status.max_hp) + { + bonus = sd->nshealhp; + while (sd->inchealhptick >= + battle_config.natural_heal_skill_interval) + { + sd->inchealhptick -= + battle_config.natural_heal_skill_interval; + if (sd->status.hp + bonus <= sd->status.max_hp) + sd->status.hp += bonus; + else + { + bonus = sd->status.max_hp - sd->status.hp; + sd->status.hp = sd->status.max_hp; + sd->hp_sub = sd->inchealhptick = 0; + } + clif_heal (sd->fd, SP_HP, bonus); + } + } + } + else + sd->inchealhptick = 0; + + return 0; + + if (sd->sc_data[SC_APPLEIDUN].timer != -1) + { // Apple of Idun + if (sd->inchealhptick >= 6000 && sd->status.hp < sd->status.max_hp) + { + bonus = skill * 20; + while (sd->inchealhptick >= 6000) + { + sd->inchealhptick -= 6000; + if (sd->status.hp + bonus <= sd->status.max_hp) + sd->status.hp += bonus; + else + { + bonus = sd->status.max_hp - sd->status.hp; + sd->status.hp = sd->status.max_hp; + sd->hp_sub = sd->inchealhptick = 0; + } + clif_heal (sd->fd, SP_HP, bonus); + } + } + } + else + sd->inchealhptick = 0; - return 0; + return 0; } -static int pc_natural_heal_sp(struct map_session_data *sd) +static int pc_natural_heal_sp (struct map_session_data *sd) { - int bsp; - int inc_num,bonus; + int bsp; + int inc_num, bonus; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if (sd->sc_data[SC_TRICKDEAD].timer != -1) // Modified by RoVeRT - return 0; + if (sd->sc_data[SC_TRICKDEAD].timer != -1) // Modified by RoVeRT + return 0; - if(pc_checkoversp(sd)) { - sd->sp_sub = sd->inchealsptick = 0; - return 0; - } + if (pc_checkoversp (sd)) + { + sd->sp_sub = sd->inchealsptick = 0; + return 0; + } - bsp=sd->status.sp; - - inc_num = pc_spheal(sd); - if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1) - sd->sp_sub += inc_num; - if(sd->walktimer == -1) - sd->inchealsptick += natural_heal_diff_tick; - else sd->inchealsptick = 0; - - if(sd->sp_sub >= battle_config.natural_healsp_interval){ - bonus = sd->nhealsp;; - while(sd->sp_sub >= battle_config.natural_healsp_interval){ - sd->sp_sub -= battle_config.natural_healsp_interval; - if(sd->status.sp + bonus <= sd->status.max_sp) - sd->status.sp += bonus; - else { - sd->status.sp = sd->status.max_sp; - sd->sp_sub = sd->inchealsptick = 0; - } - } - } + bsp = sd->status.sp; + + inc_num = pc_spheal (sd); + if (sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1) + sd->sp_sub += inc_num; + if (sd->walktimer == -1) + sd->inchealsptick += natural_heal_diff_tick; + else + sd->inchealsptick = 0; + + if (sd->sp_sub >= battle_config.natural_healsp_interval) + { + bonus = sd->nhealsp;; + while (sd->sp_sub >= battle_config.natural_healsp_interval) + { + sd->sp_sub -= battle_config.natural_healsp_interval; + if (sd->status.sp + bonus <= sd->status.max_sp) + sd->status.sp += bonus; + else + { + sd->status.sp = sd->status.max_sp; + sd->sp_sub = sd->inchealsptick = 0; + } + } + } - if(bsp != sd->status.sp) - clif_updatestatus(sd,SP_SP); - - if(sd->nshealsp > 0) { - if(sd->inchealsptick >= battle_config.natural_heal_skill_interval && sd->status.sp < sd->status.max_sp) { - struct pc_base_job s_class = pc_calc_base_job(sd->status.class); - if(sd->doridori_counter && s_class.job == 23) - bonus = sd->nshealsp*2; - else - bonus = sd->nshealsp; - sd->doridori_counter = 0; - while(sd->inchealsptick >= battle_config.natural_heal_skill_interval) { - sd->inchealsptick -= battle_config.natural_heal_skill_interval; - if(sd->status.sp + bonus <= sd->status.max_sp) - sd->status.sp += bonus; - else { - bonus = sd->status.max_sp - sd->status.sp; - sd->status.sp = sd->status.max_sp; - sd->sp_sub = sd->inchealsptick = 0; - } - clif_heal(sd->fd,SP_SP,bonus); - } - } - } - else sd->inchealsptick = 0; + if (bsp != sd->status.sp) + clif_updatestatus (sd, SP_SP); + + if (sd->nshealsp > 0) + { + if (sd->inchealsptick >= battle_config.natural_heal_skill_interval + && sd->status.sp < sd->status.max_sp) + { + struct pc_base_job s_class = pc_calc_base_job (sd->status.class); + if (sd->doridori_counter && s_class.job == 23) + bonus = sd->nshealsp * 2; + else + bonus = sd->nshealsp; + sd->doridori_counter = 0; + while (sd->inchealsptick >= + battle_config.natural_heal_skill_interval) + { + sd->inchealsptick -= + battle_config.natural_heal_skill_interval; + if (sd->status.sp + bonus <= sd->status.max_sp) + sd->status.sp += bonus; + else + { + bonus = sd->status.max_sp - sd->status.sp; + sd->status.sp = sd->status.max_sp; + sd->sp_sub = sd->inchealsptick = 0; + } + clif_heal (sd->fd, SP_SP, bonus); + } + } + } + else + sd->inchealsptick = 0; - return 0; + return 0; } -static int pc_spirit_heal_hp(struct map_session_data *sd,int level) +static int pc_spirit_heal_hp (struct map_session_data *sd, int level) { - int bonus_hp,interval = battle_config.natural_heal_skill_interval; - struct status_change *sc_data = battle_get_sc_data(&sd->bl); + int bonus_hp, interval = battle_config.natural_heal_skill_interval; + struct status_change *sc_data = battle_get_sc_data (&sd->bl); - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(pc_checkoverhp(sd)) { - sd->inchealspirithptick = 0; - return 0; - } + if (pc_checkoverhp (sd)) + { + sd->inchealspirithptick = 0; + return 0; + } - sd->inchealspirithptick += natural_heal_diff_tick; - - if(sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate - && sc_data[SC_FLYING_BACKPACK].timer == -1) - interval += interval; - - if(sd->inchealspirithptick >= interval) { - bonus_hp = sd->nsshealhp; - while(sd->inchealspirithptick >= interval) { - if(pc_issit(sd)) { - sd->inchealspirithptick -= interval; - if(sd->status.hp < sd->status.max_hp) { - if(sd->status.hp + bonus_hp <= sd->status.max_hp) - sd->status.hp += bonus_hp; - else { - bonus_hp = sd->status.max_hp - sd->status.hp; - sd->status.hp = sd->status.max_hp; - } - clif_heal(sd->fd,SP_HP,bonus_hp); - sd->inchealspirithptick = 0; - } - }else{ - sd->inchealspirithptick -= natural_heal_diff_tick; - break; - } - } - } + sd->inchealspirithptick += natural_heal_diff_tick; + + if (sd->weight * 100 / sd->max_weight >= + battle_config.natural_heal_weight_rate + && sc_data[SC_FLYING_BACKPACK].timer == -1) + interval += interval; + + if (sd->inchealspirithptick >= interval) + { + bonus_hp = sd->nsshealhp; + while (sd->inchealspirithptick >= interval) + { + if (pc_issit (sd)) + { + sd->inchealspirithptick -= interval; + if (sd->status.hp < sd->status.max_hp) + { + if (sd->status.hp + bonus_hp <= sd->status.max_hp) + sd->status.hp += bonus_hp; + else + { + bonus_hp = sd->status.max_hp - sd->status.hp; + sd->status.hp = sd->status.max_hp; + } + clif_heal (sd->fd, SP_HP, bonus_hp); + sd->inchealspirithptick = 0; + } + } + else + { + sd->inchealspirithptick -= natural_heal_diff_tick; + break; + } + } + } - return 0; + return 0; } -static int pc_spirit_heal_sp(struct map_session_data *sd,int level) + +static int pc_spirit_heal_sp (struct map_session_data *sd, int level) { - int bonus_sp,interval = battle_config.natural_heal_skill_interval; + int bonus_sp, interval = battle_config.natural_heal_skill_interval; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(pc_checkoversp(sd)) { - sd->inchealspiritsptick = 0; - return 0; - } + if (pc_checkoversp (sd)) + { + sd->inchealspiritsptick = 0; + return 0; + } - sd->inchealspiritsptick += natural_heal_diff_tick; - - if(sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate) - interval += interval; - - if(sd->inchealspiritsptick >= interval) { - bonus_sp = sd->nsshealsp; - while(sd->inchealspiritsptick >= interval) { - if(pc_issit(sd)) { - sd->inchealspiritsptick -= interval; - if(sd->status.sp < sd->status.max_sp) { - if(sd->status.sp + bonus_sp <= sd->status.max_sp) - sd->status.sp += bonus_sp; - else { - bonus_sp = sd->status.max_sp - sd->status.sp; - sd->status.sp = sd->status.max_sp; - } - clif_heal(sd->fd,SP_SP,bonus_sp); - sd->inchealspiritsptick = 0; - } - }else{ - sd->inchealspiritsptick -= natural_heal_diff_tick; - break; - } - } - } + sd->inchealspiritsptick += natural_heal_diff_tick; + + if (sd->weight * 100 / sd->max_weight >= + battle_config.natural_heal_weight_rate) + interval += interval; + + if (sd->inchealspiritsptick >= interval) + { + bonus_sp = sd->nsshealsp; + while (sd->inchealspiritsptick >= interval) + { + if (pc_issit (sd)) + { + sd->inchealspiritsptick -= interval; + if (sd->status.sp < sd->status.max_sp) + { + if (sd->status.sp + bonus_sp <= sd->status.max_sp) + sd->status.sp += bonus_sp; + else + { + bonus_sp = sd->status.max_sp - sd->status.sp; + sd->status.sp = sd->status.max_sp; + } + clif_heal (sd->fd, SP_SP, bonus_sp); + sd->inchealspiritsptick = 0; + } + } + else + { + sd->inchealspiritsptick -= natural_heal_diff_tick; + break; + } + } + } - return 0; + return 0; } /*========================================== * HP/SP ソスソスソスRソスソスソスソス ソスeソスNソスソスソスCソスAソスソスソスg *------------------------------------------ */ -static int pc_itemheal_effect(struct map_session_data *sd, int hp, int sp); +static int pc_itemheal_effect (struct map_session_data *sd, int hp, int sp); static int -pc_quickregenerate_effect(struct quick_regeneration *quick_regen, int heal_speed) +pc_quickregenerate_effect (struct quick_regeneration *quick_regen, + int heal_speed) { - if (!(quick_regen->tickdelay--)) { - int bonus = MIN(heal_speed * battle_config.itemheal_regeneration_factor, - quick_regen->amount); + if (!(quick_regen->tickdelay--)) + { + int bonus = + MIN (heal_speed * battle_config.itemheal_regeneration_factor, + quick_regen->amount); - quick_regen->amount -= bonus; + quick_regen->amount -= bonus; - quick_regen->tickdelay = quick_regen->speed; + quick_regen->tickdelay = quick_regen->speed; - return bonus; - } + return bonus; + } - return 0; + return 0; } -static int pc_natural_heal_sub(struct map_session_data *sd,va_list ap) { - int skill; +static int pc_natural_heal_sub (struct map_session_data *sd, va_list ap) +{ + int skill; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if (sd->heal_xp > 0) { - if (sd->heal_xp < 64) - --sd->heal_xp; // [Fate] Slowly reduce XP that healers can get for healing this char - else - sd->heal_xp -= (sd->heal_xp >> 6); - } + if (sd->heal_xp > 0) + { + if (sd->heal_xp < 64) + --sd->heal_xp; // [Fate] Slowly reduce XP that healers can get for healing this char + else + sd->heal_xp -= (sd->heal_xp >> 6); + } - // Hijack this callback: Adjust spellpower bonus - if (sd->spellpower_bonus_target < sd->spellpower_bonus_current) { - sd->spellpower_bonus_current = sd->spellpower_bonus_target; - pc_calcstatus(sd, 0); - } - else if (sd->spellpower_bonus_target > sd->spellpower_bonus_current) { - sd->spellpower_bonus_current += 1 + ((sd->spellpower_bonus_target - sd->spellpower_bonus_current) >> 5); - pc_calcstatus(sd, 0); - } + // Hijack this callback: Adjust spellpower bonus + if (sd->spellpower_bonus_target < sd->spellpower_bonus_current) + { + sd->spellpower_bonus_current = sd->spellpower_bonus_target; + pc_calcstatus (sd, 0); + } + else if (sd->spellpower_bonus_target > sd->spellpower_bonus_current) + { + sd->spellpower_bonus_current += + 1 + + ((sd->spellpower_bonus_target - + sd->spellpower_bonus_current) >> 5); + pc_calcstatus (sd, 0); + } - if (sd->sc_data[SC_HALT_REGENERATE].timer != -1) - return 0; + if (sd->sc_data[SC_HALT_REGENERATE].timer != -1) + return 0; - if (sd->quick_regeneration_hp.amount || sd->quick_regeneration_sp.amount) { - int hp_bonus = pc_quickregenerate_effect(&sd->quick_regeneration_hp, - (sd->sc_data[SC_POISON].timer == -1 || sd->sc_data[SC_SLOWPOISON].timer != -1) ? - sd->nhealhp : 1); // [fate] slow down when poisoned - int sp_bonus = pc_quickregenerate_effect(&sd->quick_regeneration_sp, sd->nhealsp); + if (sd->quick_regeneration_hp.amount || sd->quick_regeneration_sp.amount) + { + int hp_bonus = pc_quickregenerate_effect (&sd->quick_regeneration_hp, + (sd->sc_data[SC_POISON].timer == -1 || sd->sc_data[SC_SLOWPOISON].timer != -1) ? sd->nhealhp : 1); // [fate] slow down when poisoned + int sp_bonus = pc_quickregenerate_effect (&sd->quick_regeneration_sp, + sd->nhealsp); - pc_itemheal_effect(sd, hp_bonus, sp_bonus); - } - skill_update_heal_animation(sd); // if needed. + pc_itemheal_effect (sd, hp_bonus, sp_bonus); + } + skill_update_heal_animation (sd); // if needed. // -- moonsoul (if conditions below altered to disallow natural healing if under berserk status) - if ((sd->sc_data[SC_FLYING_BACKPACK].timer != -1 - || battle_config.natural_heal_weight_rate > 100 - || sd->weight*100/sd->max_weight < battle_config.natural_heal_weight_rate) && - !pc_isdead(sd) && - !pc_ishiding(sd) && - sd->sc_data[SC_POISON].timer == -1 - ) { - pc_natural_heal_hp(sd); - if( sd->sc_data && sd->sc_data[SC_EXTREMITYFIST].timer == -1 && //ソスソスソスCソスソスソスソスソスヤでゑソスSPソスソスソス復ゑソスソスネゑソス - sd->sc_data[SC_DANCING].timer == -1 && //ソス_ソスソスソスXソスソスソスヤでゑソスSPソスソスソス復ゑソスソスネゑソス - sd->sc_data[SC_BERSERK].timer == -1 //ソスoソス[ソスTソス[ソスNソスソスソスヤでゑソスSPソスソスソス復ゑソスソスネゑソス - ) - pc_natural_heal_sp(sd); - } else { - sd->hp_sub = sd->inchealhptick = 0; - sd->sp_sub = sd->inchealsptick = 0; - } - if((skill = pc_checkskill(sd,MO_SPIRITSRECOVERY)) > 0 && !pc_ishiding(sd) && sd->sc_data[SC_POISON].timer == -1 && sd->sc_data[SC_BERSERK].timer == -1){ - pc_spirit_heal_hp(sd,skill); - pc_spirit_heal_sp(sd,skill); - } - else { - sd->inchealspirithptick = 0; - sd->inchealspiritsptick = 0; - } - return 0; + if ((sd->sc_data[SC_FLYING_BACKPACK].timer != -1 + || battle_config.natural_heal_weight_rate > 100 + || sd->weight * 100 / sd->max_weight < + battle_config.natural_heal_weight_rate) && !pc_isdead (sd) + && !pc_ishiding (sd) && sd->sc_data[SC_POISON].timer == -1) + { + pc_natural_heal_hp (sd); + if (sd->sc_data && sd->sc_data[SC_EXTREMITYFIST].timer == -1 && //ソスソスソスCソスソスソスソスソスヤでゑソスSPソスソスソス復ゑソスソスネゑソス + sd->sc_data[SC_DANCING].timer == -1 && //ソス_ソスソスソスXソスソスソスヤでゑソスSPソスソスソス復ゑソスソスネゑソス + sd->sc_data[SC_BERSERK].timer == -1 //ソスoソス[ソスTソス[ソスNソスソスソスヤでゑソスSPソスソスソス復ゑソスソスネゑソス + ) + pc_natural_heal_sp (sd); + } + else + { + sd->hp_sub = sd->inchealhptick = 0; + sd->sp_sub = sd->inchealsptick = 0; + } + if ((skill = pc_checkskill (sd, MO_SPIRITSRECOVERY)) > 0 + && !pc_ishiding (sd) && sd->sc_data[SC_POISON].timer == -1 + && sd->sc_data[SC_BERSERK].timer == -1) + { + pc_spirit_heal_hp (sd, skill); + pc_spirit_heal_sp (sd, skill); + } + else + { + sd->inchealspirithptick = 0; + sd->inchealspiritsptick = 0; + } + return 0; } /*========================================== * HP/SPソスソスソスRソスソスソスソス (interval timerソスヨ撰ソス) *------------------------------------------ */ -int pc_natural_heal(int tid,unsigned int tick,int id,int data) +int pc_natural_heal (int tid, unsigned int tick, int id, int data) { - natural_heal_tick = tick; - natural_heal_diff_tick = DIFF_TICK(natural_heal_tick,natural_heal_prev_tick); - clif_foreachclient(pc_natural_heal_sub); + natural_heal_tick = tick; + natural_heal_diff_tick = + DIFF_TICK (natural_heal_tick, natural_heal_prev_tick); + clif_foreachclient (pc_natural_heal_sub); - natural_heal_prev_tick = tick; - return 0; + natural_heal_prev_tick = tick; + return 0; } /*========================================== * ソスZソス[ソスuソス|ソスCソスソスソスgソスフ保托ソス *------------------------------------------ */ -int pc_setsavepoint(struct map_session_data *sd,char *mapname,int x,int y) +int pc_setsavepoint (struct map_session_data *sd, char *mapname, int x, int y) { - nullpo_retr(0, sd); + nullpo_retr (0, sd); - strncpy(sd->status.save_point.map,mapname,24); - sd->status.save_point.x = x; - sd->status.save_point.y = y; + strncpy (sd->status.save_point.map, mapname, 24); + sd->status.save_point.x = x; + sd->status.save_point.y = y; - return 0; + return 0; } /*========================================== * ソスソスソスソスソスZソス[ソスu ソスeソスNソスソスソスCソスAソスソスソスg *------------------------------------------ */ -static int last_save_fd,save_flag; -static int pc_autosave_sub(struct map_session_data *sd,va_list ap) -{ - nullpo_retr(0, sd); - - if(save_flag==0 && sd->fd>last_save_fd){ - struct guild_castle *gc=NULL; - int i; - - pc_makesavestatus(sd); - chrif_save(sd); - - for(i=0;i<MAX_GUILDCASTLE;i++){ - gc=guild_castle_search(i); - if(!gc) continue; - if(gc->visibleG0==1) guild_castledatasave(gc->castle_id,18,gc->Ghp0); - if(gc->visibleG1==1) guild_castledatasave(gc->castle_id,19,gc->Ghp1); - if(gc->visibleG2==1) guild_castledatasave(gc->castle_id,20,gc->Ghp2); - if(gc->visibleG3==1) guild_castledatasave(gc->castle_id,21,gc->Ghp3); - if(gc->visibleG4==1) guild_castledatasave(gc->castle_id,22,gc->Ghp4); - if(gc->visibleG5==1) guild_castledatasave(gc->castle_id,23,gc->Ghp5); - if(gc->visibleG6==1) guild_castledatasave(gc->castle_id,24,gc->Ghp6); - if(gc->visibleG7==1) guild_castledatasave(gc->castle_id,25,gc->Ghp7); - } - - save_flag=1; - last_save_fd = sd->fd; - } +static int last_save_fd, save_flag; +static int pc_autosave_sub (struct map_session_data *sd, va_list ap) +{ + nullpo_retr (0, sd); + + if (save_flag == 0 && sd->fd > last_save_fd) + { + struct guild_castle *gc = NULL; + int i; + + pc_makesavestatus (sd); + chrif_save (sd); + + for (i = 0; i < MAX_GUILDCASTLE; i++) + { + gc = guild_castle_search (i); + if (!gc) + continue; + if (gc->visibleG0 == 1) + guild_castledatasave (gc->castle_id, 18, gc->Ghp0); + if (gc->visibleG1 == 1) + guild_castledatasave (gc->castle_id, 19, gc->Ghp1); + if (gc->visibleG2 == 1) + guild_castledatasave (gc->castle_id, 20, gc->Ghp2); + if (gc->visibleG3 == 1) + guild_castledatasave (gc->castle_id, 21, gc->Ghp3); + if (gc->visibleG4 == 1) + guild_castledatasave (gc->castle_id, 22, gc->Ghp4); + if (gc->visibleG5 == 1) + guild_castledatasave (gc->castle_id, 23, gc->Ghp5); + if (gc->visibleG6 == 1) + guild_castledatasave (gc->castle_id, 24, gc->Ghp6); + if (gc->visibleG7 == 1) + guild_castledatasave (gc->castle_id, 25, gc->Ghp7); + } - return 0; + save_flag = 1; + last_save_fd = sd->fd; + } + + return 0; } /*========================================== * ソスソスソスソスソスZソス[ソスu (timerソスヨ撰ソス) *------------------------------------------ */ -int pc_autosave(int tid,unsigned int tick,int id,int data) +int pc_autosave (int tid, unsigned int tick, int id, int data) { - int interval; + int interval; - save_flag=0; - clif_foreachclient(pc_autosave_sub); - if(save_flag==0) - last_save_fd=0; + save_flag = 0; + clif_foreachclient (pc_autosave_sub); + if (save_flag == 0) + last_save_fd = 0; - interval = autosave_interval/(clif_countusers()+1); - if(interval <= 0) - interval = 1; - add_timer(gettick()+interval,pc_autosave,0,0); + interval = autosave_interval / (clif_countusers () + 1); + if (interval <= 0) + interval = 1; + add_timer (gettick () + interval, pc_autosave, 0, 0); - return 0; + return 0; } -int pc_read_gm_account(int fd) +int pc_read_gm_account (int fd) { - int i = 0; - if (gm_account != NULL) - free(gm_account); - GM_num = 0; + int i = 0; + if (gm_account != NULL) + free (gm_account); + GM_num = 0; - gm_account = calloc(sizeof(struct gm_account) * ((RFIFOW(fd,2) - 4) / 5), 1); - for (i = 4; i < RFIFOW(fd,2); i = i + 5) { - gm_account[GM_num].account_id = RFIFOL(fd,i); - gm_account[GM_num].level = (int)RFIFOB(fd,i+4); - //printf("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level); - GM_num++; - } - return GM_num; + gm_account = + calloc (sizeof (struct gm_account) * ((RFIFOW (fd, 2) - 4) / 5), 1); + for (i = 4; i < RFIFOW (fd, 2); i = i + 5) + { + gm_account[GM_num].account_id = RFIFOL (fd, i); + gm_account[GM_num].level = (int) RFIFOB (fd, i + 4); + //printf("GM account: %d -> level %d\n", gm_account[GM_num].account_id, gm_account[GM_num].level); + GM_num++; + } + return GM_num; } /*========================================== * timer to do the day *------------------------------------------ */ -int map_day_timer(int tid, unsigned int tick, int id, int data) { // by [yor] - struct map_session_data *pl_sd = NULL; - int i; - char tmpstr[1024]; - - if (battle_config.day_duration > 0) { // if we want a day - if (night_flag != 0) { - strcpy(tmpstr, msg_txt(502)); // The day has arrived! - night_flag = 0; // 0=day, 1=night [Yor] - for(i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - pl_sd->opt2 &= ~STATE_BLIND; - clif_changeoption(&pl_sd->bl); - clif_wis_message(pl_sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1); - } - } - } - } +int map_day_timer (int tid, unsigned int tick, int id, int data) +{ // by [yor] + struct map_session_data *pl_sd = NULL; + int i; + char tmpstr[1024]; + + if (battle_config.day_duration > 0) + { // if we want a day + if (night_flag != 0) + { + strcpy (tmpstr, msg_txt (502)); // The day has arrived! + night_flag = 0; // 0=day, 1=night [Yor] + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + pl_sd->opt2 &= ~STATE_BLIND; + clif_changeoption (&pl_sd->bl); + clif_wis_message (pl_sd->fd, wisp_server_name, tmpstr, + strlen (tmpstr) + 1); + } + } + } + } - return 0; + return 0; } /*========================================== * timer to do the night *------------------------------------------ */ -int map_night_timer(int tid, unsigned int tick, int id, int data) { // by [yor] - struct map_session_data *pl_sd = NULL; - int i; - char tmpstr[1024]; - - if (battle_config.night_duration > 0) { // if we want a night - if (night_flag == 0) { - strcpy(tmpstr, msg_txt(503)); // The night has fallen... - night_flag = 1; // 0=day, 1=night [Yor] - for(i = 0; i < fd_max; i++) { - if (session[i] && (pl_sd = session[i]->session_data) && pl_sd->state.auth) { - pl_sd->opt2 |= STATE_BLIND; - clif_changeoption(&pl_sd->bl); - clif_wis_message(pl_sd->fd, wisp_server_name, tmpstr, strlen(tmpstr)+1); - } - } - } - } +int map_night_timer (int tid, unsigned int tick, int id, int data) +{ // by [yor] + struct map_session_data *pl_sd = NULL; + int i; + char tmpstr[1024]; + + if (battle_config.night_duration > 0) + { // if we want a night + if (night_flag == 0) + { + strcpy (tmpstr, msg_txt (503)); // The night has fallen... + night_flag = 1; // 0=day, 1=night [Yor] + for (i = 0; i < fd_max; i++) + { + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + pl_sd->opt2 |= STATE_BLIND; + clif_changeoption (&pl_sd->bl); + clif_wis_message (pl_sd->fd, wisp_server_name, tmpstr, + strlen (tmpstr) + 1); + } + } + } + } - return 0; + return 0; } -void pc_setstand(struct map_session_data *sd){ - nullpo_retv(sd); +void pc_setstand (struct map_session_data *sd) +{ + nullpo_retv (sd); - if(sd->sc_data && sd->sc_data[SC_TENSIONRELAX].timer!=-1) - skill_status_change_end(&sd->bl,SC_TENSIONRELAX,-1); + if (sd->sc_data && sd->sc_data[SC_TENSIONRELAX].timer != -1) + skill_status_change_end (&sd->bl, SC_TENSIONRELAX, -1); - sd->state.dead_sit = 0; + sd->state.dead_sit = 0; } // @@ -7415,408 +8506,468 @@ void pc_setstand(struct map_session_data *sd){ * refine_db.txt ソスソスソスBソスfソス[ソス^ソスeソス[ソスuソスソス *------------------------------------------ */ -int pc_readdb(void) +int pc_readdb (void) { - int i,j,k; - FILE *fp; - char line[1024],*p; + int i, j, k; + FILE *fp; + char line[1024], *p; - // ソスKソスvソスoソスソスソスlソスヌみ搾ソスソスソス + // ソスKソスvソスoソスソスソスlソスヌみ搾ソスソスソス - fp=fopen_("db/exp.txt","r"); - if(fp==NULL){ - printf("can't read db/exp.txt\n"); - return 1; - } - i=0; - while(fgets(line, sizeof(line)-1, fp)){ - int bn,b1,b2,b3,b4,b5,b6,jn,j1,j2,j3,j4,j5,j6; - if(line[0]=='/' && line[1]=='/') - continue; - if(sscanf(line,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",&bn,&b1,&b2,&b3,&b4,&b5,&b6,&jn,&j1,&j2,&j3,&j4,&j5,&j6)!=14) - continue; - exp_table[0][i]=bn; - exp_table[1][i]=b1; - exp_table[2][i]=b2; - exp_table[3][i]=b3; - exp_table[4][i]=b4; - exp_table[5][i]=b5; - exp_table[6][i]=b6; - exp_table[7][i]=jn; - exp_table[8][i]=j1; - exp_table[9][i]=j2; - exp_table[10][i]=j3; - exp_table[11][i]=j4; - exp_table[12][i]=j5; - exp_table[13][i]=j6; - i++; - if(i >= battle_config.maximum_level) - break; - } - fclose_(fp); - printf("read db/exp.txt done\n"); - - // JOBソス竦ウソスソスソスlソスP - fp=fopen_("db/job_db1.txt","r"); - if(fp==NULL){ - printf("can't read db/job_db1.txt\n"); - return 1; - } - i=0; - while(fgets(line, sizeof(line)-1, fp)){ - char *split[50]; - if(line[0]=='/' && line[1]=='/') - continue; - for(j=0,p=line;j<21 && p;j++){ - split[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } - if(j<21) - continue; - max_weight_base[i]=atoi(split[0]); - hp_coefficient[i]=atoi(split[1]); - hp_coefficient2[i]=atoi(split[2]); - sp_coefficient[i]=atoi(split[3]); - for(j=0;j<17;j++) - aspd_base[i][j]=atoi(split[j+4]); - i++; + fp = fopen_ ("db/exp.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/exp.txt\n"); + return 1; + } + i = 0; + while (fgets (line, sizeof (line) - 1, fp)) + { + int bn, b1, b2, b3, b4, b5, b6, jn, j1, j2, j3, j4, j5, j6; + if (line[0] == '/' && line[1] == '/') + continue; + if (sscanf + (line, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d", &bn, &b1, &b2, + &b3, &b4, &b5, &b6, &jn, &j1, &j2, &j3, &j4, &j5, &j6) != 14) + continue; + exp_table[0][i] = bn; + exp_table[1][i] = b1; + exp_table[2][i] = b2; + exp_table[3][i] = b3; + exp_table[4][i] = b4; + exp_table[5][i] = b5; + exp_table[6][i] = b6; + exp_table[7][i] = jn; + exp_table[8][i] = j1; + exp_table[9][i] = j2; + exp_table[10][i] = j3; + exp_table[11][i] = j4; + exp_table[12][i] = j5; + exp_table[13][i] = j6; + i++; + if (i >= battle_config.maximum_level) + break; + } + fclose_ (fp); + printf ("read db/exp.txt done\n"); + + // JOBソス竦ウソスソスソスlソスP + fp = fopen_ ("db/job_db1.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/job_db1.txt\n"); + return 1; + } + i = 0; + while (fgets (line, sizeof (line) - 1, fp)) + { + char *split[50]; + if (line[0] == '/' && line[1] == '/') + continue; + for (j = 0, p = line; j < 21 && p; j++) + { + split[j] = p; + p = strchr (p, ','); + if (p) + *p++ = 0; + } + if (j < 21) + continue; + max_weight_base[i] = atoi (split[0]); + hp_coefficient[i] = atoi (split[1]); + hp_coefficient2[i] = atoi (split[2]); + sp_coefficient[i] = atoi (split[3]); + for (j = 0; j < 17; j++) + aspd_base[i][j] = atoi (split[j + 4]); + i++; // -- moonsoul (below two lines added to accommodate high numbered new class ids) - if(i==24) - i=4001; - if(i==MAX_PC_CLASS) - break; - } - fclose_(fp); - printf("read db/job_db1.txt done\n"); - - // JOBソス{ソス[ソスiソスX - fp=fopen_("db/job_db2.txt","r"); - if(fp==NULL){ - printf("can't read db/job_db2.txt\n"); - return 1; - } - i=0; - while(fgets(line, sizeof(line)-1, fp)){ - if(line[0]=='/' && line[1]=='/') - continue; - for(j=0,p=line;j<MAX_LEVEL && p;j++){ - if(sscanf(p,"%d",&k)==0) - break; - job_bonus[0][i][j]=k; - job_bonus[2][i][j]=k; //ソス{ソスqソスEソスフボソス[ソスiソスXソスヘ包ソスソスソスソスソスソスネゑソスソスフで会ソス - p=strchr(p,','); - if(p) p++; - } - i++; + if (i == 24) + i = 4001; + if (i == MAX_PC_CLASS) + break; + } + fclose_ (fp); + printf ("read db/job_db1.txt done\n"); + + // JOBソス{ソス[ソスiソスX + fp = fopen_ ("db/job_db2.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/job_db2.txt\n"); + return 1; + } + i = 0; + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + for (j = 0, p = line; j < MAX_LEVEL && p; j++) + { + if (sscanf (p, "%d", &k) == 0) + break; + job_bonus[0][i][j] = k; + job_bonus[2][i][j] = k; //ソス{ソスqソスEソスフボソス[ソスiソスXソスヘ包ソスソスソスソスソスソスネゑソスソスフで会ソス + p = strchr (p, ','); + if (p) + p++; + } + i++; // -- moonsoul (below two lines added to accommodate high numbered new class ids) - if(i==24) - i=4001; - if(i==MAX_PC_CLASS) - break; - } - fclose_(fp); - printf("read db/job_db2.txt done\n"); - - // JOBソス{ソス[ソスiソスX2 ソス]ソスソスソスEソスp - fp=fopen_("db/job_db2-2.txt","r"); - if(fp==NULL){ - printf("can't read db/job_db2-2.txt\n"); - return 1; - } - i=0; - while(fgets(line, sizeof(line)-1, fp)){ - if(line[0]=='/' && line[1]=='/') - continue; - for(j=0,p=line;j<MAX_LEVEL && p;j++){ - if(sscanf(p,"%d",&k)==0) - break; - job_bonus[1][i][j]=k; - p=strchr(p,','); - if(p) p++; - } - i++; - if(i==MAX_PC_CLASS) - break; - } - fclose_(fp); - printf("read db/job_db2-2.txt done\n"); - - // ソスXソスLソスソスソスcソスソスソス[ - memset(skill_tree,0,sizeof(skill_tree)); - fp=fopen_("db/skill_tree.txt","r"); - if(fp==NULL){ - printf("can't read db/skill_tree.txt\n"); - return 1; - } - while(fgets(line, sizeof(line)-1, fp)){ - char *split[50]; - if(line[0]=='/' && line[1]=='/') - continue; - for(j=0,p=line;j<13 && p;j++){ - split[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } - if(j<13) - continue; - i=atoi(split[0]); - for(j=0;skill_tree[0][i][j].id;j++); - skill_tree[0][i][j].id=atoi(split[1]); - skill_tree[0][i][j].max=atoi(split[2]); - skill_tree[2][i][j].id=atoi(split[1]); //ソス{ソスqソスEソスヘ良ゑソスソスソスソスソスソスソスソスネゑソスソスフで暫ソスソス - skill_tree[2][i][j].max=atoi(split[2]); //ソス{ソスqソスEソスヘ良ゑソスソスソスソスソスソスソスソスネゑソスソスフで暫ソスソス - for(k=0;k<5;k++){ - skill_tree[0][i][j].need[k].id=atoi(split[k*2+3]); - skill_tree[0][i][j].need[k].lv=atoi(split[k*2+4]); - skill_tree[2][i][j].need[k].id=atoi(split[k*2+3]); //ソス{ソスqソスEソスヘ良ゑソスソスソスソスソスソスソスソスネゑソスソスフで暫ソスソス - skill_tree[2][i][j].need[k].lv=atoi(split[k*2+4]); //ソス{ソスqソスEソスヘ良ゑソスソスソスソスソスソスソスソスネゑソスソスフで暫ソスソス - } - } - fclose_(fp); - printf("read db/skill_tree.txt done\n"); - - // ソスソスソスソスソスCソスソスソスeソス[ソスuソスソス - for(i=0;i<4;i++) - for(j=0;j<10;j++) - for(k=0;k<10;k++) - attr_fix_table[i][j][k]=100; - fp=fopen_("db/attr_fix.txt","r"); - if(fp==NULL){ - printf("can't read db/attr_fix.txt\n"); - return 1; - } - while(fgets(line, sizeof(line)-1, fp)){ - char *split[10]; - int lv,n; - if(line[0]=='/' && line[1]=='/') - continue; - for(j=0,p=line;j<3 && p;j++){ - split[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } - lv=atoi(split[0]); - n=atoi(split[1]); -// printf("%d %d\n",lv,n); - - for(i=0;i<n;){ - if( !fgets(line, sizeof(line)-1, fp) ) - break; - if(line[0]=='/' && line[1]=='/') - continue; - - for(j=0,p=line;j<n && p;j++){ - while(*p==32 && *p>0) - p++; - attr_fix_table[lv-1][i][j]=atoi(p); - if(battle_config.attr_recover == 0 && attr_fix_table[lv-1][i][j] < 0) - attr_fix_table[lv-1][i][j] = 0; - p=strchr(p,','); - if(p) *p++=0; - } - - i++; - } - } - fclose_(fp); - printf("read db/attr_fix.txt done\n"); - - // ソスTソスCソスYソス竦ウソスeソス[ソスuソスソス - for(i=0;i<3;i++) - for(j=0;j<20;j++) - atkmods[i][j]=100; - fp=fopen_("db/size_fix.txt","r"); - if(fp==NULL){ - printf("can't read db/size_fix.txt\n"); - return 1; - } - i=0; - while(fgets(line, sizeof(line)-1, fp)){ - char *split[20]; - if(line[0]=='/' && line[1]=='/') - continue; - if(atoi(line)<=0) - continue; - memset(split,0,sizeof(split)); - for(j=0,p=line;j<20 && p;j++){ - split[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } - for(j=0;j<20 && split[j];j++) - atkmods[i][j]=atoi(split[j]); - i++; - } - fclose_(fp); - printf("read db/size_fix.txt done\n"); - - // ソスソスソスBソスfソス[ソス^ソスeソス[ソスuソスソス - for(i=0;i<5;i++){ - for(j=0;j<10;j++) - percentrefinery[i][j]=100; - refinebonus[i][0]=0; - refinebonus[i][1]=0; - refinebonus[i][2]=10; - } - fp=fopen_("db/refine_db.txt","r"); - if(fp==NULL){ - printf("can't read db/refine_db.txt\n"); - return 1; - } - i=0; - while(fgets(line, sizeof(line)-1, fp)){ - char *split[16]; - if(line[0]=='/' && line[1]=='/') - continue; - if(atoi(line)<=0) - continue; - memset(split,0,sizeof(split)); - for(j=0,p=line;j<16 && p;j++){ - split[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } - refinebonus[i][0]=atoi(split[0]); // ソスソスソスBソス{ソス[ソスiソスX - refinebonus[i][1]=atoi(split[1]); // ソス゚剰精ソスBソス{ソス[ソスiソスX - refinebonus[i][2]=atoi(split[2]); // ソスソスSソスソスソスBソスソスE - for(j=0;j<10 && split[j];j++) - percentrefinery[i][j]=atoi(split[j+3]); - i++; - } - fclose_(fp); //Lupus. close this file!!! - printf("read db/refine_db.txt done\n"); + if (i == 24) + i = 4001; + if (i == MAX_PC_CLASS) + break; + } + fclose_ (fp); + printf ("read db/job_db2.txt done\n"); + + // JOBソス{ソス[ソスiソスX2 ソス]ソスソスソスEソスp + fp = fopen_ ("db/job_db2-2.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/job_db2-2.txt\n"); + return 1; + } + i = 0; + while (fgets (line, sizeof (line) - 1, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + for (j = 0, p = line; j < MAX_LEVEL && p; j++) + { + if (sscanf (p, "%d", &k) == 0) + break; + job_bonus[1][i][j] = k; + p = strchr (p, ','); + if (p) + p++; + } + i++; + if (i == MAX_PC_CLASS) + break; + } + fclose_ (fp); + printf ("read db/job_db2-2.txt done\n"); + + // ソスXソスLソスソスソスcソスソスソス[ + memset (skill_tree, 0, sizeof (skill_tree)); + fp = fopen_ ("db/skill_tree.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/skill_tree.txt\n"); + return 1; + } + while (fgets (line, sizeof (line) - 1, fp)) + { + char *split[50]; + if (line[0] == '/' && line[1] == '/') + continue; + for (j = 0, p = line; j < 13 && p; j++) + { + split[j] = p; + p = strchr (p, ','); + if (p) + *p++ = 0; + } + if (j < 13) + continue; + i = atoi (split[0]); + for (j = 0; skill_tree[0][i][j].id; j++); + skill_tree[0][i][j].id = atoi (split[1]); + skill_tree[0][i][j].max = atoi (split[2]); + skill_tree[2][i][j].id = atoi (split[1]); //ソス{ソスqソスEソスヘ良ゑソスソスソスソスソスソスソスソスネゑソスソスフで暫ソスソス + skill_tree[2][i][j].max = atoi (split[2]); //ソス{ソスqソスEソスヘ良ゑソスソスソスソスソスソスソスソスネゑソスソスフで暫ソスソス + for (k = 0; k < 5; k++) + { + skill_tree[0][i][j].need[k].id = atoi (split[k * 2 + 3]); + skill_tree[0][i][j].need[k].lv = atoi (split[k * 2 + 4]); + skill_tree[2][i][j].need[k].id = atoi (split[k * 2 + 3]); //ソス{ソスqソスEソスヘ良ゑソスソスソスソスソスソスソスソスネゑソスソスフで暫ソスソス + skill_tree[2][i][j].need[k].lv = atoi (split[k * 2 + 4]); //ソス{ソスqソスEソスヘ良ゑソスソスソスソスソスソスソスソスネゑソスソスフで暫ソスソス + } + } + fclose_ (fp); + printf ("read db/skill_tree.txt done\n"); + + // ソスソスソスソスソスCソスソスソスeソス[ソスuソスソス + for (i = 0; i < 4; i++) + for (j = 0; j < 10; j++) + for (k = 0; k < 10; k++) + attr_fix_table[i][j][k] = 100; + fp = fopen_ ("db/attr_fix.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/attr_fix.txt\n"); + return 1; + } + while (fgets (line, sizeof (line) - 1, fp)) + { + char *split[10]; + int lv, n; + if (line[0] == '/' && line[1] == '/') + continue; + for (j = 0, p = line; j < 3 && p; j++) + { + split[j] = p; + p = strchr (p, ','); + if (p) + *p++ = 0; + } + lv = atoi (split[0]); + n = atoi (split[1]); +// printf("%d %d\n",lv,n); + + for (i = 0; i < n;) + { + if (!fgets (line, sizeof (line) - 1, fp)) + break; + if (line[0] == '/' && line[1] == '/') + continue; + + for (j = 0, p = line; j < n && p; j++) + { + while (*p == 32 && *p > 0) + p++; + attr_fix_table[lv - 1][i][j] = atoi (p); + if (battle_config.attr_recover == 0 + && attr_fix_table[lv - 1][i][j] < 0) + attr_fix_table[lv - 1][i][j] = 0; + p = strchr (p, ','); + if (p) + *p++ = 0; + } + + i++; + } + } + fclose_ (fp); + printf ("read db/attr_fix.txt done\n"); + + // ソスTソスCソスYソス竦ウソスeソス[ソスuソスソス + for (i = 0; i < 3; i++) + for (j = 0; j < 20; j++) + atkmods[i][j] = 100; + fp = fopen_ ("db/size_fix.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/size_fix.txt\n"); + return 1; + } + i = 0; + while (fgets (line, sizeof (line) - 1, fp)) + { + char *split[20]; + if (line[0] == '/' && line[1] == '/') + continue; + if (atoi (line) <= 0) + continue; + memset (split, 0, sizeof (split)); + for (j = 0, p = line; j < 20 && p; j++) + { + split[j] = p; + p = strchr (p, ','); + if (p) + *p++ = 0; + } + for (j = 0; j < 20 && split[j]; j++) + atkmods[i][j] = atoi (split[j]); + i++; + } + fclose_ (fp); + printf ("read db/size_fix.txt done\n"); + + // ソスソスソスBソスfソス[ソス^ソスeソス[ソスuソスソス + for (i = 0; i < 5; i++) + { + for (j = 0; j < 10; j++) + percentrefinery[i][j] = 100; + refinebonus[i][0] = 0; + refinebonus[i][1] = 0; + refinebonus[i][2] = 10; + } + fp = fopen_ ("db/refine_db.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/refine_db.txt\n"); + return 1; + } + i = 0; + while (fgets (line, sizeof (line) - 1, fp)) + { + char *split[16]; + if (line[0] == '/' && line[1] == '/') + continue; + if (atoi (line) <= 0) + continue; + memset (split, 0, sizeof (split)); + for (j = 0, p = line; j < 16 && p; j++) + { + split[j] = p; + p = strchr (p, ','); + if (p) + *p++ = 0; + } + refinebonus[i][0] = atoi (split[0]); // ソスソスソスBソス{ソス[ソスiソスX + refinebonus[i][1] = atoi (split[1]); // ソス゚剰精ソスBソス{ソス[ソスiソスX + refinebonus[i][2] = atoi (split[2]); // ソスソスSソスソスソスBソスソスE + for (j = 0; j < 10 && split[j]; j++) + percentrefinery[i][j] = atoi (split[j + 3]); + i++; + } + fclose_ (fp); //Lupus. close this file!!! + printf ("read db/refine_db.txt done\n"); - return 0; + return 0; } -static int pc_calc_sigma(void) +static int pc_calc_sigma (void) { - int i,j,k; + int i, j, k; - for(i=0;i<MAX_PC_CLASS;i++) { - memset(hp_sigma_val[i],0,sizeof(hp_sigma_val[i])); - for(k=0,j=2;j<=MAX_LEVEL;j++) { - k += hp_coefficient[i]*j + 50; - k -= k%100; - hp_sigma_val[i][j-1] = k; - } - } - return 0; + for (i = 0; i < MAX_PC_CLASS; i++) + { + memset (hp_sigma_val[i], 0, sizeof (hp_sigma_val[i])); + for (k = 0, j = 2; j <= MAX_LEVEL; j++) + { + k += hp_coefficient[i] * j + 50; + k -= k % 100; + hp_sigma_val[i][j - 1] = k; + } + } + return 0; } -static void pc_statpointdb(void) +static void pc_statpointdb (void) { - char * buf_stat; - int i=0,j=0,k=0,l=0, end = 0; + char *buf_stat; + int i = 0, j = 0, k = 0, l = 0, end = 0; - FILE *stp; + FILE *stp; - stp=fopen_("db/statpoint.txt","r"); + stp = fopen_ ("db/statpoint.txt", "r"); - if(stp==NULL){ - printf("can't read db/statpoint.txt\n"); - return; - } - - fseek(stp, 0, SEEK_END); - end = ftell(stp); - rewind(stp); - - buf_stat = (char *) malloc (end + 1); - l = fread(buf_stat,1,end,stp); - fclose_(stp); - printf("read db/statpoint.txt done (size=%d)\n",l); + if (stp == NULL) + { + printf ("can't read db/statpoint.txt\n"); + return; + } - for(i=0;i<255;i++) { - j=0; - while (*(buf_stat+k)!='\n') { - statp[i][j]=*(buf_stat+k); - j++;k++; - } - statp[i][j+1]='\0'; + fseek (stp, 0, SEEK_END); + end = ftell (stp); + rewind (stp); + + buf_stat = (char *) malloc (end + 1); + l = fread (buf_stat, 1, end, stp); + fclose_ (stp); + printf ("read db/statpoint.txt done (size=%d)\n", l); + + for (i = 0; i < 255; i++) + { + j = 0; + while (*(buf_stat + k) != '\n') + { + statp[i][j] = *(buf_stat + k); + j++; k++; - } + } + statp[i][j + 1] = '\0'; + k++; + } - free(buf_stat); + free (buf_stat); } /*========================================== * pcソスソス ソスWソスソスソスソスソスソス *------------------------------------------ */ -int do_init_pc(void) { - pc_readdb(); - pc_statpointdb(); - pc_calc_sigma(); - -// gm_account_db = numdb_init(); - - add_timer_func_list(pc_walk, "pc_walk"); - add_timer_func_list(pc_attack_timer, "pc_attack_timer"); - add_timer_func_list(pc_natural_heal, "pc_natural_heal"); - add_timer_func_list(pc_invincible_timer, "pc_invincible_timer"); - add_timer_func_list(pc_eventtimer, "pc_eventtimer"); - add_timer_func_list(pc_calc_pvprank_timer, "pc_calc_pvprank_timer"); - add_timer_func_list(pc_autosave, "pc_autosave"); - add_timer_func_list(pc_spiritball_timer, "pc_spiritball_timer"); - add_timer_interval((natural_heal_prev_tick = gettick() + NATURAL_HEAL_INTERVAL), pc_natural_heal, 0, 0, NATURAL_HEAL_INTERVAL); - add_timer(gettick() + autosave_interval, pc_autosave, 0, 0); - - // add night/day timer (by [yor]) - add_timer_func_list(map_day_timer, "map_day_timer"); // by [yor] - add_timer_func_list(map_night_timer, "map_night_timer"); // by [yor] - { - int day_duration = battle_config.day_duration; - int night_duration = battle_config.night_duration; - if (day_duration < 60000) - day_duration = 60000; - if (night_duration < 60000) - night_duration = 60000; - if (battle_config.night_at_start == 0) { - night_flag = 0; // 0=day, 1=night [Yor] - day_timer_tid = add_timer_interval(gettick() + day_duration + night_duration, map_day_timer, 0, 0, day_duration + night_duration); - night_timer_tid = add_timer_interval(gettick() + day_duration, map_night_timer, 0, 0, day_duration + night_duration); - } else { - night_flag = 1; // 0=day, 1=night [Yor] - day_timer_tid = add_timer_interval(gettick() + night_duration, map_day_timer, 0, 0, day_duration + night_duration); - night_timer_tid = add_timer_interval(gettick() + day_duration + night_duration, map_night_timer, 0, 0, day_duration + night_duration); - } - } +int do_init_pc (void) +{ + pc_readdb (); + pc_statpointdb (); + pc_calc_sigma (); + +// gm_account_db = numdb_init(); + + add_timer_func_list (pc_walk, "pc_walk"); + add_timer_func_list (pc_attack_timer, "pc_attack_timer"); + add_timer_func_list (pc_natural_heal, "pc_natural_heal"); + add_timer_func_list (pc_invincible_timer, "pc_invincible_timer"); + add_timer_func_list (pc_eventtimer, "pc_eventtimer"); + add_timer_func_list (pc_calc_pvprank_timer, "pc_calc_pvprank_timer"); + add_timer_func_list (pc_autosave, "pc_autosave"); + add_timer_func_list (pc_spiritball_timer, "pc_spiritball_timer"); + add_timer_interval ((natural_heal_prev_tick = + gettick () + NATURAL_HEAL_INTERVAL), pc_natural_heal, + 0, 0, NATURAL_HEAL_INTERVAL); + add_timer (gettick () + autosave_interval, pc_autosave, 0, 0); + + // add night/day timer (by [yor]) + add_timer_func_list (map_day_timer, "map_day_timer"); // by [yor] + add_timer_func_list (map_night_timer, "map_night_timer"); // by [yor] + { + int day_duration = battle_config.day_duration; + int night_duration = battle_config.night_duration; + if (day_duration < 60000) + day_duration = 60000; + if (night_duration < 60000) + night_duration = 60000; + if (battle_config.night_at_start == 0) + { + night_flag = 0; // 0=day, 1=night [Yor] + day_timer_tid = + add_timer_interval (gettick () + day_duration + + night_duration, map_day_timer, 0, 0, + day_duration + night_duration); + night_timer_tid = + add_timer_interval (gettick () + day_duration, + map_night_timer, 0, 0, + day_duration + night_duration); + } + else + { + night_flag = 1; // 0=day, 1=night [Yor] + day_timer_tid = + add_timer_interval (gettick () + night_duration, + map_day_timer, 0, 0, + day_duration + night_duration); + night_timer_tid = + add_timer_interval (gettick () + day_duration + + night_duration, map_night_timer, 0, 0, + day_duration + night_duration); + } + } - return 0; + return 0; } -void -pc_cleanup(struct map_session_data *sd) +void pc_cleanup (struct map_session_data *sd) { - magic_stop_completely(sd); + magic_stop_completely (sd); } - -void -pc_invisibility(struct map_session_data *sd, int enabled) +void pc_invisibility (struct map_session_data *sd, int enabled) { - if (enabled && !(sd->status.option & OPTION_INVISIBILITY)) { - clif_clearchar_area(&sd->bl, 3); - sd->status.option |= OPTION_INVISIBILITY; - clif_status_change(&sd->bl, CLIF_OPTION_SC_INVISIBILITY, 1); - } else if (!enabled) { - sd->status.option &= ~OPTION_INVISIBILITY; - clif_status_change(&sd->bl, CLIF_OPTION_SC_INVISIBILITY, 0); - pc_setpos(sd, map[sd->bl.m].name, sd->bl.x, sd->bl.y, 3); - } + if (enabled && !(sd->status.option & OPTION_INVISIBILITY)) + { + clif_clearchar_area (&sd->bl, 3); + sd->status.option |= OPTION_INVISIBILITY; + clif_status_change (&sd->bl, CLIF_OPTION_SC_INVISIBILITY, 1); + } + else if (!enabled) + { + sd->status.option &= ~OPTION_INVISIBILITY; + clif_status_change (&sd->bl, CLIF_OPTION_SC_INVISIBILITY, 0); + pc_setpos (sd, map[sd->bl.m].name, sd->bl.x, sd->bl.y, 3); + } } -int pc_logout(struct map_session_data *sd) // [fate] Player logs out +int pc_logout (struct map_session_data *sd) // [fate] Player logs out { - if (!sd) - return 0; - - if (sd->sc_data[SC_POISON].timer != -1) - sd->status.hp = 1; // Logging out while poisoned -> bad + if (!sd) + return 0; - MAP_LOG_STATS(sd, "LOGOUT") + if (sd->sc_data[SC_POISON].timer != -1) + sd->status.hp = 1; // Logging out while poisoned -> bad - return 0; + MAP_LOG_STATS (sd, "LOGOUT") return 0; } diff --git a/src/map/pc.h b/src/map/pc.h index 31d8c8a..ec5afb9 100644 --- a/src/map/pc.h +++ b/src/map/pc.h @@ -20,182 +20,191 @@ #define pc_isfalcon(sd) ((sd)->status.option&0x0010) #define pc_isriding(sd) ((sd)->status.option&0x0020) #define pc_isinvisible(sd) ((sd)->status.option&0x0040) -#define pc_is50overweight(sd) (sd->weight*2 >= sd->max_weight) +#define pc_is50overweight(sd) (sd->weight*2 >= sd->max_weight) #define pc_is90overweight(sd) (sd->weight*10 >= sd->max_weight*9) -void pc_touch_all_relevant_npcs(struct map_session_data *sd); /* Checks all npcs/warps at the same location to see whether they - ** should do something with the specified player. */ - -int pc_isGM(struct map_session_data *sd); -int pc_iskiller(struct map_session_data *src, struct map_session_data *target); // [MouseJstr] -int pc_getrefinebonus(int lv,int type); - -void pc_invisibility(struct map_session_data *sd, int enabled); // [Fate] -int pc_counttargeted(struct map_session_data *sd,struct block_list *src,int target_lv); -int pc_setrestartvalue(struct map_session_data *sd,int type); -int pc_makesavestatus(struct map_session_data *); -int pc_setnewpc(struct map_session_data*,int,int,int,int,int,int); -int pc_authok(int, int, time_t, short tmw_version, struct mmo_charstatus *); -int pc_authfail(int); - -int pc_isequip(struct map_session_data *sd,int n); -int pc_equippoint(struct map_session_data *sd,int n); - -int pc_breakweapon(struct map_session_data *sd); // weapon breaking [Valaris] -int pc_breakarmor(struct map_session_data *sd); // armor breaking [Valaris] - -int pc_checkskill(struct map_session_data *sd,int skill_id); -int pc_checkallowskill(struct map_session_data *sd); -int pc_checkequip(struct map_session_data *sd,int pos); - -int pc_checkoverhp(struct map_session_data*); -int pc_checkoversp(struct map_session_data*); - -int pc_can_reach(struct map_session_data*,int,int); -int pc_walktoxy(struct map_session_data*,int,int); -int pc_stop_walking(struct map_session_data*,int); -int pc_movepos(struct map_session_data*,int,int); -int pc_setpos(struct map_session_data*,char*,int,int,int); -int pc_setsavepoint(struct map_session_data*,char*,int,int); -int pc_randomwarp(struct map_session_data *sd,int type); -int pc_memo(struct map_session_data *sd,int i); - -int pc_checkadditem(struct map_session_data*,int,int); -int pc_inventoryblank(struct map_session_data*); -int pc_search_inventory(struct map_session_data *sd,int item_id); -int pc_payzeny(struct map_session_data*,int); -int pc_additem(struct map_session_data*,struct item*,int); -int pc_getzeny(struct map_session_data*,int); -int pc_delitem(struct map_session_data*,int,int,int); -int pc_checkitem(struct map_session_data*); -int pc_count_all_items(struct map_session_data* player, int item_id); -int pc_remove_items(struct map_session_data* player, int item_id, int count); - -int pc_cart_additem(struct map_session_data *sd,struct item *item_data,int amount); -int pc_cart_delitem(struct map_session_data *sd,int n,int amount,int type); -int pc_putitemtocart(struct map_session_data *sd,int idx,int amount); -int pc_getitemfromcart(struct map_session_data *sd,int idx,int amount); -int pc_cartitem_amount(struct map_session_data *sd,int idx,int amount); - -int pc_takeitem(struct map_session_data*,struct flooritem_data*); -int pc_dropitem(struct map_session_data*,int,int); - -int pc_checkweighticon(struct map_session_data *sd); - -int pc_calcstatus(struct map_session_data*,int); -int pc_bonus(struct map_session_data*,int,int); -int pc_bonus2(struct map_session_data *sd,int,int,int); -int pc_bonus3(struct map_session_data *sd,int,int,int,int); -int pc_skill(struct map_session_data*,int,int,int); - -int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip); - -int pc_item_identify(struct map_session_data *sd,int idx); -int pc_steal_item(struct map_session_data *sd,struct block_list *bl); -int pc_steal_coin(struct map_session_data *sd,struct block_list *bl); - -int pc_modifybuyvalue(struct map_session_data*,int); -int pc_modifysellvalue(struct map_session_data*,int); - -int pc_attack(struct map_session_data*,int,int); -int pc_stopattack(struct map_session_data*); - -int pc_follow(struct map_session_data*, int); // [MouseJstr] - -int pc_checkbaselevelup(struct map_session_data *sd); -int pc_checkjoblevelup(struct map_session_data *sd); -int pc_gainexp(struct map_session_data*,int,int); +void pc_touch_all_relevant_npcs (struct map_session_data *sd); /* Checks all npcs/warps at the same location to see whether they + ** should do something with the specified player. */ + +int pc_isGM (struct map_session_data *sd); +int pc_iskiller (struct map_session_data *src, struct map_session_data *target); // [MouseJstr] +int pc_getrefinebonus (int lv, int type); + +void pc_invisibility (struct map_session_data *sd, int enabled); // [Fate] +int pc_counttargeted (struct map_session_data *sd, struct block_list *src, + int target_lv); +int pc_setrestartvalue (struct map_session_data *sd, int type); +int pc_makesavestatus (struct map_session_data *); +int pc_setnewpc (struct map_session_data *, int, int, int, int, int, int); +int pc_authok (int, int, time_t, short tmw_version, struct mmo_charstatus *); +int pc_authfail (int); + +int pc_isequip (struct map_session_data *sd, int n); +int pc_equippoint (struct map_session_data *sd, int n); + +int pc_breakweapon (struct map_session_data *sd); // weapon breaking [Valaris] +int pc_breakarmor (struct map_session_data *sd); // armor breaking [Valaris] + +int pc_checkskill (struct map_session_data *sd, int skill_id); +int pc_checkallowskill (struct map_session_data *sd); +int pc_checkequip (struct map_session_data *sd, int pos); + +int pc_checkoverhp (struct map_session_data *); +int pc_checkoversp (struct map_session_data *); + +int pc_can_reach (struct map_session_data *, int, int); +int pc_walktoxy (struct map_session_data *, int, int); +int pc_stop_walking (struct map_session_data *, int); +int pc_movepos (struct map_session_data *, int, int); +int pc_setpos (struct map_session_data *, char *, int, int, int); +int pc_setsavepoint (struct map_session_data *, char *, int, int); +int pc_randomwarp (struct map_session_data *sd, int type); +int pc_memo (struct map_session_data *sd, int i); + +int pc_checkadditem (struct map_session_data *, int, int); +int pc_inventoryblank (struct map_session_data *); +int pc_search_inventory (struct map_session_data *sd, int item_id); +int pc_payzeny (struct map_session_data *, int); +int pc_additem (struct map_session_data *, struct item *, int); +int pc_getzeny (struct map_session_data *, int); +int pc_delitem (struct map_session_data *, int, int, int); +int pc_checkitem (struct map_session_data *); +int pc_count_all_items (struct map_session_data *player, int item_id); +int pc_remove_items (struct map_session_data *player, int item_id, + int count); + +int pc_cart_additem (struct map_session_data *sd, struct item *item_data, + int amount); +int pc_cart_delitem (struct map_session_data *sd, int n, int amount, + int type); +int pc_putitemtocart (struct map_session_data *sd, int idx, int amount); +int pc_getitemfromcart (struct map_session_data *sd, int idx, int amount); +int pc_cartitem_amount (struct map_session_data *sd, int idx, int amount); + +int pc_takeitem (struct map_session_data *, struct flooritem_data *); +int pc_dropitem (struct map_session_data *, int, int); + +int pc_checkweighticon (struct map_session_data *sd); + +int pc_calcstatus (struct map_session_data *, int); +int pc_bonus (struct map_session_data *, int, int); +int pc_bonus2 (struct map_session_data *sd, int, int, int); +int pc_bonus3 (struct map_session_data *sd, int, int, int, int); +int pc_skill (struct map_session_data *, int, int, int); + +int pc_insert_card (struct map_session_data *sd, int idx_card, + int idx_equip); + +int pc_item_identify (struct map_session_data *sd, int idx); +int pc_steal_item (struct map_session_data *sd, struct block_list *bl); +int pc_steal_coin (struct map_session_data *sd, struct block_list *bl); + +int pc_modifybuyvalue (struct map_session_data *, int); +int pc_modifysellvalue (struct map_session_data *, int); + +int pc_attack (struct map_session_data *, int, int); +int pc_stopattack (struct map_session_data *); + +int pc_follow (struct map_session_data *, int); // [MouseJstr] + +int pc_checkbaselevelup (struct map_session_data *sd); +int pc_checkjoblevelup (struct map_session_data *sd); +int pc_gainexp (struct map_session_data *, int, int); #define PC_GAINEXP_REASON_KILLING 0 #define PC_GAINEXP_REASON_HEALING 1 #define PC_GAINEXP_REASON_SCRIPT 2 -int pc_gainexp_reason(struct map_session_data*,int,int, int reason); -int pc_extract_healer_exp(struct map_session_data*, int max); // [Fate] Used by healers: extract healer-xp from the target, return result (up to max) - -int pc_nextbaseexp(struct map_session_data *); -int pc_nextbaseafter(struct map_session_data *); // [Valaris] -int pc_nextjobexp(struct map_session_data *); -int pc_nextjobafter(struct map_session_data *); // [Valaris] -int pc_need_status_point(struct map_session_data *,int); -int pc_statusup(struct map_session_data*,int); -int pc_statusup2(struct map_session_data*,int,int); -int pc_skillup(struct map_session_data*,int); -int pc_allskillup(struct map_session_data*); -int pc_resetlvl(struct map_session_data*,int type); -int pc_resetstate(struct map_session_data*); -int pc_resetskill(struct map_session_data*); -int pc_equipitem(struct map_session_data*,int,int); -int pc_unequipitem(struct map_session_data*,int,int); -int pc_unequipinvyitem(struct map_session_data*,int,int); -int pc_checkitem(struct map_session_data*); -int pc_useitem(struct map_session_data*,int); - -int pc_damage(struct block_list *,struct map_session_data*,int); -int pc_heal(struct map_session_data *,int,int); -int pc_itemheal(struct map_session_data *sd,int hp,int sp); -int pc_percentheal(struct map_session_data *sd,int,int); -int pc_jobchange(struct map_session_data *,int, int); -int pc_setoption(struct map_session_data *,int); -int pc_setcart(struct map_session_data *sd,int type); -int pc_setfalcon(struct map_session_data *sd); -int pc_setriding(struct map_session_data *sd); -int pc_changelook(struct map_session_data *,int,int); -int pc_equiplookall(struct map_session_data *sd); - -int pc_readparam(struct map_session_data*,int); -int pc_setparam(struct map_session_data*,int,int); -int pc_readreg(struct map_session_data*,int); -int pc_setreg(struct map_session_data*,int,int); -char *pc_readregstr(struct map_session_data *sd,int reg); -int pc_setregstr(struct map_session_data *sd,int reg,char *str); -int pc_readglobalreg(struct map_session_data*,char*); -int pc_setglobalreg(struct map_session_data*,char*,int); -int pc_readaccountreg(struct map_session_data*,char*); -int pc_setaccountreg(struct map_session_data*,char*,int); -int pc_readaccountreg2(struct map_session_data*,char*); -int pc_setaccountreg2(struct map_session_data*,char*,int); -int pc_percentrefinery(struct map_session_data *sd,struct item *item); - -int pc_addeventtimer(struct map_session_data *sd,int tick,const char *name); -int pc_deleventtimer(struct map_session_data *sd,const char *name); -int pc_cleareventtimer(struct map_session_data *sd); -int pc_addeventtimercount(struct map_session_data *sd,const char *name,int tick); - -int pc_calc_pvprank(struct map_session_data *sd); -int pc_calc_pvprank_timer(int tid,unsigned int tick,int id,int data); - -int pc_ismarried(struct map_session_data *sd); -int pc_marriage(struct map_session_data *sd,struct map_session_data *dstsd); -int pc_divorce(struct map_session_data *sd); -struct map_session_data *pc_get_partner(struct map_session_data *sd); -int pc_set_gm_level(int account_id, int level); -void pc_setstand(struct map_session_data *sd); -void pc_cleanup(struct map_session_data *sd); // [Fate] Clean up after a logged-out PC - -struct pc_base_job{ - int job; //職業、ただし転生職や養子職の場合は元の職業を返す(廃プリ→プリ) - int type; //ノビ 0, 一次職 1, 二次職 2, スパノビ 3 - int upper; //通常 0, 転生 1, 養子 2 +int pc_gainexp_reason (struct map_session_data *, int, int, int reason); +int pc_extract_healer_exp (struct map_session_data *, int max); // [Fate] Used by healers: extract healer-xp from the target, return result (up to max) + +int pc_nextbaseexp (struct map_session_data *); +int pc_nextbaseafter (struct map_session_data *); // [Valaris] +int pc_nextjobexp (struct map_session_data *); +int pc_nextjobafter (struct map_session_data *); // [Valaris] +int pc_need_status_point (struct map_session_data *, int); +int pc_statusup (struct map_session_data *, int); +int pc_statusup2 (struct map_session_data *, int, int); +int pc_skillup (struct map_session_data *, int); +int pc_allskillup (struct map_session_data *); +int pc_resetlvl (struct map_session_data *, int type); +int pc_resetstate (struct map_session_data *); +int pc_resetskill (struct map_session_data *); +int pc_equipitem (struct map_session_data *, int, int); +int pc_unequipitem (struct map_session_data *, int, int); +int pc_unequipinvyitem (struct map_session_data *, int, int); +int pc_checkitem (struct map_session_data *); +int pc_useitem (struct map_session_data *, int); + +int pc_damage (struct block_list *, struct map_session_data *, int); +int pc_heal (struct map_session_data *, int, int); +int pc_itemheal (struct map_session_data *sd, int hp, int sp); +int pc_percentheal (struct map_session_data *sd, int, int); +int pc_jobchange (struct map_session_data *, int, int); +int pc_setoption (struct map_session_data *, int); +int pc_setcart (struct map_session_data *sd, int type); +int pc_setfalcon (struct map_session_data *sd); +int pc_setriding (struct map_session_data *sd); +int pc_changelook (struct map_session_data *, int, int); +int pc_equiplookall (struct map_session_data *sd); + +int pc_readparam (struct map_session_data *, int); +int pc_setparam (struct map_session_data *, int, int); +int pc_readreg (struct map_session_data *, int); +int pc_setreg (struct map_session_data *, int, int); +char *pc_readregstr (struct map_session_data *sd, int reg); +int pc_setregstr (struct map_session_data *sd, int reg, char *str); +int pc_readglobalreg (struct map_session_data *, char *); +int pc_setglobalreg (struct map_session_data *, char *, int); +int pc_readaccountreg (struct map_session_data *, char *); +int pc_setaccountreg (struct map_session_data *, char *, int); +int pc_readaccountreg2 (struct map_session_data *, char *); +int pc_setaccountreg2 (struct map_session_data *, char *, int); +int pc_percentrefinery (struct map_session_data *sd, struct item *item); + +int pc_addeventtimer (struct map_session_data *sd, int tick, + const char *name); +int pc_deleventtimer (struct map_session_data *sd, const char *name); +int pc_cleareventtimer (struct map_session_data *sd); +int pc_addeventtimercount (struct map_session_data *sd, const char *name, + int tick); + +int pc_calc_pvprank (struct map_session_data *sd); +int pc_calc_pvprank_timer (int tid, unsigned int tick, int id, int data); + +int pc_ismarried (struct map_session_data *sd); +int pc_marriage (struct map_session_data *sd, + struct map_session_data *dstsd); +int pc_divorce (struct map_session_data *sd); +struct map_session_data *pc_get_partner (struct map_session_data *sd); +int pc_set_gm_level (int account_id, int level); +void pc_setstand (struct map_session_data *sd); +void pc_cleanup (struct map_session_data *sd); // [Fate] Clean up after a logged-out PC + +struct pc_base_job +{ + int job; //職業、ただし転生職や養子職の場合は元の職業を返す(廃プリ→プリ) + int type; //ノビ 0, 一次職 1, 二次職 2, スパノビ 3 + int upper; //通常 0, 転生 1, 養子 2 }; -struct pc_base_job pc_calc_base_job(int b_class);//転生や養子職の元の職業を返す +struct pc_base_job pc_calc_base_job (int b_class); //転生や養子職の元の職業を返す -int pc_read_gm_account(int fd); -int pc_setinvincibletimer(struct map_session_data *sd,int); -int pc_delinvincibletimer(struct map_session_data *sd); -int pc_addspiritball(struct map_session_data *sd,int,int); -int pc_delspiritball(struct map_session_data *sd,int,int); -int pc_logout(struct map_session_data *sd); // [fate] Player logs out +int pc_read_gm_account (int fd); +int pc_setinvincibletimer (struct map_session_data *sd, int); +int pc_delinvincibletimer (struct map_session_data *sd); +int pc_addspiritball (struct map_session_data *sd, int, int); +int pc_delspiritball (struct map_session_data *sd, int, int); +int pc_logout (struct map_session_data *sd); // [fate] Player logs out -int do_init_pc(void); +int do_init_pc (void); -enum {ADDITEM_EXIST,ADDITEM_NEW,ADDITEM_OVERAMOUNT}; +enum +{ ADDITEM_EXIST, ADDITEM_NEW, ADDITEM_OVERAMOUNT }; // timer for night.day -int day_timer_tid; -int night_timer_tid; -int map_day_timer(int,unsigned int,int,int); // by [yor] -int map_night_timer(int,unsigned int,int,int); // by [yor] +int day_timer_tid; +int night_timer_tid; +int map_day_timer (int, unsigned int, int, int); // by [yor] +int map_night_timer (int, unsigned int, int, int); // by [yor] #endif - diff --git a/src/map/script.c b/src/map/script.c index 7c63b85..bbde20c 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -44,493 +44,716 @@ #endif #define SCRIPT_BLOCK_SIZE 256 -enum { LABEL_NEXTLINE=1,LABEL_START }; -static unsigned char * script_buf; -static int script_pos,script_size; +enum +{ LABEL_NEXTLINE = 1, LABEL_START }; +static unsigned char *script_buf; +static int script_pos, script_size; char *str_buf; -int str_pos,str_size; -static struct { - int type; - int str; - int backpatch; - int label; - int (*func)(); - int val; - int next; -} *str_data; -int str_num=LABEL_START,str_data_size; -int str_hash[16]; - -static struct dbt *mapreg_db=NULL; -static struct dbt *mapregstr_db=NULL; -static int mapreg_dirty=-1; -char mapreg_txt[256]="save/mapreg.txt"; +int str_pos, str_size; +static struct +{ + int type; + int str; + int backpatch; + int label; + int (*func) (); + int val; + int next; +} *str_data; +int str_num = LABEL_START, str_data_size; +int str_hash[16]; + +static struct dbt *mapreg_db = NULL; +static struct dbt *mapregstr_db = NULL; +static int mapreg_dirty = -1; +char mapreg_txt[256] = "save/mapreg.txt"; #define MAPREG_AUTOSAVE_INTERVAL (10*1000) -static struct dbt *scriptlabel_db=NULL; -static struct dbt *userfunc_db=NULL; +static struct dbt *scriptlabel_db = NULL; +static struct dbt *userfunc_db = NULL; -struct dbt* script_get_label_db(){ return scriptlabel_db; } -struct dbt* script_get_userfunc_db(){ if(!userfunc_db) userfunc_db=strdb_init(50); return userfunc_db; } +struct dbt *script_get_label_db () +{ + return scriptlabel_db; +} + +struct dbt *script_get_userfunc_db () +{ + if (!userfunc_db) + userfunc_db = strdb_init (50); + return userfunc_db; +} -int scriptlabel_final(void *k,void *d,va_list ap){ return 0; } -static char pos[11][100] = {"頭","体","左手","右手","ローブ","靴","アクセサリー1","アクセサリー2","頭2","頭3","装着していない"}; +int scriptlabel_final (void *k, void *d, va_list ap) +{ + return 0; +} + +static char pos[11][100] = + { "頭", "体", "左手", "右手", "ローブ", "靴", "アクセサリー1", + "アクセサリー2", "頭2", "頭3", "装着していない" +}; -static struct Script_Config { - int warn_func_no_comma; - int warn_cmd_no_comma; - int warn_func_mismatch_paramnum; - int warn_cmd_mismatch_paramnum; - int check_cmdcount; - int check_gotocount; +static struct Script_Config +{ + int warn_func_no_comma; + int warn_cmd_no_comma; + int warn_func_mismatch_paramnum; + int warn_cmd_mismatch_paramnum; + int check_cmdcount; + int check_gotocount; } script_config; -static int parse_cmd_if=0; +static int parse_cmd_if = 0; static int parse_cmd; /*========================================== * ローカルプロトタイプ宣言 (必要な物のみ) *------------------------------------------ */ -unsigned char* parse_subexpr(unsigned char *,int); -int buildin_mes(struct script_state *st); -int buildin_goto(struct script_state *st); -int buildin_callsub(struct script_state *st); -int buildin_callfunc(struct script_state *st); -int buildin_return(struct script_state *st); -int buildin_getarg(struct script_state *st); -int buildin_next(struct script_state *st); -int buildin_close(struct script_state *st); -int buildin_close2(struct script_state *st); -int buildin_menu(struct script_state *st); -int buildin_rand(struct script_state *st); -int buildin_pow(struct script_state *st); -int buildin_warp(struct script_state *st); -int buildin_isat(struct script_state *st); -int buildin_areawarp(struct script_state *st); -int buildin_heal(struct script_state *st); -int buildin_itemheal(struct script_state *st); -int buildin_percentheal(struct script_state *st); -int buildin_jobchange(struct script_state *st); -int buildin_input(struct script_state *st); -int buildin_setlook(struct script_state *st); -int buildin_set(struct script_state *st); -int buildin_setarray(struct script_state *st); -int buildin_cleararray(struct script_state *st); -int buildin_copyarray(struct script_state *st); -int buildin_getarraysize(struct script_state *st); -int buildin_deletearray(struct script_state *st); -int buildin_getelementofarray(struct script_state *st); -int buildin_if(struct script_state *st); -int buildin_getitem(struct script_state *st); -int buildin_getitem2(struct script_state *st); -int buildin_makeitem(struct script_state *st); -int buildin_delitem(struct script_state *st); -int buildin_viewpoint(struct script_state *st); -int buildin_countitem(struct script_state *st); -int buildin_checkweight(struct script_state *st); -int buildin_readparam(struct script_state *st); -int buildin_getcharid(struct script_state *st); -int buildin_getpartyname(struct script_state *st); -int buildin_getpartymember(struct script_state *st); -int buildin_getguildname(struct script_state *st); -int buildin_getguildmaster(struct script_state *st); -int buildin_getguildmasterid(struct script_state *st); -int buildin_strcharinfo(struct script_state *st); -int buildin_getequipid(struct script_state *st); -int buildin_getequipname(struct script_state *st); -int buildin_getbrokenid(struct script_state *st); // [Valaris] -int buildin_repair(struct script_state *st); // [Valaris] -int buildin_getequipisequiped(struct script_state *st); -int buildin_getequipisenableref(struct script_state *st); -int buildin_getequipisidentify(struct script_state *st); -int buildin_getequiprefinerycnt(struct script_state *st); -int buildin_getequipweaponlv(struct script_state *st); -int buildin_getequippercentrefinery(struct script_state *st); -int buildin_successrefitem(struct script_state *st); -int buildin_failedrefitem(struct script_state *st); -int buildin_cutin(struct script_state *st); -int buildin_cutincard(struct script_state *st); -int buildin_statusup(struct script_state *st); -int buildin_statusup2(struct script_state *st); -int buildin_bonus(struct script_state *st); -int buildin_bonus2(struct script_state *st); -int buildin_bonus3(struct script_state *st); -int buildin_skill(struct script_state *st); -int buildin_setskill(struct script_state *st); -int buildin_guildskill(struct script_state *st); -int buildin_getskilllv(struct script_state *st); -int buildin_getgdskilllv(struct script_state *st); -int buildin_basicskillcheck(struct script_state *st); -int buildin_getgmlevel(struct script_state *st); -int buildin_end(struct script_state *st); -int buildin_checkoption(struct script_state *st); -int buildin_setoption(struct script_state *st); -int buildin_setcart(struct script_state *st); -int buildin_checkcart(struct script_state *st); // check cart [Valaris] -int buildin_setfalcon(struct script_state *st); -int buildin_checkfalcon(struct script_state *st); // check falcon [Valaris] -int buildin_setriding(struct script_state *st); -int buildin_checkriding(struct script_state *st); // check for pecopeco [Valaris] -int buildin_savepoint(struct script_state *st); -int buildin_gettimetick(struct script_state *st); -int buildin_gettime(struct script_state *st); -int buildin_gettimestr(struct script_state *st); -int buildin_openstorage(struct script_state *st); -int buildin_guildopenstorage(struct script_state *st); -int buildin_itemskill(struct script_state *st); -int buildin_monster(struct script_state *st); -int buildin_areamonster(struct script_state *st); -int buildin_killmonster(struct script_state *st); -int buildin_killmonsterall(struct script_state *st); -int buildin_doevent(struct script_state *st); -int buildin_donpcevent(struct script_state *st); -int buildin_addtimer(struct script_state *st); -int buildin_deltimer(struct script_state *st); -int buildin_addtimercount(struct script_state *st); -int buildin_initnpctimer(struct script_state *st); -int buildin_stopnpctimer(struct script_state *st); -int buildin_startnpctimer(struct script_state *st); -int buildin_setnpctimer(struct script_state *st); -int buildin_getnpctimer(struct script_state *st); -int buildin_announce(struct script_state *st); -int buildin_mapannounce(struct script_state *st); -int buildin_areaannounce(struct script_state *st); -int buildin_getusers(struct script_state *st); -int buildin_getmapusers(struct script_state *st); -int buildin_getareausers(struct script_state *st); -int buildin_getareadropitem(struct script_state *st); -int buildin_enablenpc(struct script_state *st); -int buildin_disablenpc(struct script_state *st); -int buildin_enablearena(struct script_state *st); // Added by RoVeRT -int buildin_disablearena(struct script_state *st); // Added by RoVeRT -int buildin_hideoffnpc(struct script_state *st); -int buildin_hideonnpc(struct script_state *st); -int buildin_sc_start(struct script_state *st); -int buildin_sc_start2(struct script_state *st); -int buildin_sc_end(struct script_state *st); -int buildin_sc_check(struct script_state *st); // [Fate] -int buildin_getscrate(struct script_state *st); -int buildin_debugmes(struct script_state *st); -int buildin_resetlvl(struct script_state *st); -int buildin_resetstatus(struct script_state *st); -int buildin_resetskill(struct script_state *st); -int buildin_changebase(struct script_state *st); -int buildin_changesex(struct script_state *st); -int buildin_waitingroom(struct script_state *st); -int buildin_delwaitingroom(struct script_state *st); -int buildin_enablewaitingroomevent(struct script_state *st); -int buildin_disablewaitingroomevent(struct script_state *st); -int buildin_getwaitingroomstate(struct script_state *st); -int buildin_warpwaitingpc(struct script_state *st); -int buildin_attachrid(struct script_state *st); -int buildin_detachrid(struct script_state *st); -int buildin_isloggedin(struct script_state *st); -int buildin_setmapflagnosave(struct script_state *st); -int buildin_setmapflag(struct script_state *st); -int buildin_removemapflag(struct script_state *st); -int buildin_pvpon(struct script_state *st); -int buildin_pvpoff(struct script_state *st); -int buildin_gvgon(struct script_state *st); -int buildin_gvgoff(struct script_state *st); -int buildin_emotion(struct script_state *st); -int buildin_maprespawnguildid(struct script_state *st); -int buildin_agitstart(struct script_state *st); // <Agit> -int buildin_agitend(struct script_state *st); -int buildin_agitcheck(struct script_state *st); // <Agitcheck> -int buildin_flagemblem(struct script_state *st); // Flag Emblem -int buildin_getcastlename(struct script_state *st); -int buildin_getcastledata(struct script_state *st); -int buildin_setcastledata(struct script_state *st); -int buildin_requestguildinfo(struct script_state *st); -int buildin_getequipcardcnt(struct script_state *st); -int buildin_successremovecards(struct script_state *st); -int buildin_failedremovecards(struct script_state *st); -int buildin_marriage(struct script_state *st); -int buildin_wedding_effect(struct script_state *st); -int buildin_divorce(struct script_state *st); -int buildin_getitemname(struct script_state *st); -int buildin_getspellinvocation(struct script_state *st); // [Fate] -int buildin_getanchorinvocation(struct script_state *st); // [Fate] -int buildin_getexp(struct script_state *st); -int buildin_getinventorylist(struct script_state *st); -int buildin_getskilllist(struct script_state *st); -int buildin_get_pool_skills(struct script_state *st); // [fate] -int buildin_get_activated_pool_skills(struct script_state *st); // [fate] -int buildin_activate_pool_skill(struct script_state *st); // [fate] -int buildin_deactivate_pool_skill(struct script_state *st); // [fate] -int buildin_check_pool_skill(struct script_state *st); // [fate] -int buildin_getskilllist(struct script_state *st); -int buildin_getskilllist(struct script_state *st); -int buildin_clearitem(struct script_state *st); -int buildin_classchange(struct script_state *st); -int buildin_misceffect(struct script_state *st); -int buildin_soundeffect(struct script_state *st); -int buildin_setcastledata(struct script_state *st); -int buildin_mapwarp(struct script_state *st); -int buildin_inittimer(struct script_state *st); -int buildin_stoptimer(struct script_state *st); -int buildin_cmdothernpc(struct script_state *st); -int buildin_mobcount(struct script_state *st); -int buildin_strmobinfo(struct script_state *st); // Script for displaying mob info [Valaris] -int buildin_guardian(struct script_state *st); // Script for displaying mob info [Valaris] -int buildin_guardianinfo(struct script_state *st); // Script for displaying mob info [Valaris] -int buildin_npcskilleffect(struct script_state *st); // skill effects for npcs [Valaris] -int buildin_specialeffect(struct script_state *st); // special effect script [Valaris] -int buildin_specialeffect2(struct script_state *st); // special effect script [Valaris] -int buildin_nude(struct script_state *st); // nude [Valaris] -int buildin_gmcommand(struct script_state *st); // [MouseJstr] -int buildin_movenpc(struct script_state *st); // [MouseJstr] -int buildin_message(struct script_state *st); // [MouseJstr] -int buildin_npctalk(struct script_state *st); // [Valaris] -int buildin_hasitems(struct script_state *st); // [Valaris] -int buildin_getlook(struct script_state *st); //Lorky [Lupus] -int buildin_getsavepoint(struct script_state *st); //Lorky [Lupus] -int buildin_getpartnerid(struct script_state *st); // [Fate] -int buildin_areatimer(struct script_state *st); // [Jaxad0127] -int buildin_isin(struct script_state *st); // [Jaxad0127] -int buildin_shop(struct script_state *st); // [MadCamel] -int buildin_isdead(struct script_state *st); // [Jaxad0127] -int buildin_fakenpcname(struct script_state *st); //[Kage] -int buildin_unequip_by_id(struct script_state *st); // [Freeyorp] - -void push_val(struct script_stack *stack,int type,int val); -int run_func(struct script_state *st); - -int mapreg_setreg(int num,int val); -int mapreg_setregstr(int num,const char *str); - -struct { - int (*func)(); - char *name; - char *arg; -} buildin_func[]={ - {buildin_mes,"mes","s"}, - {buildin_next,"next",""}, - {buildin_close,"close",""}, - {buildin_close2,"close2",""}, - {buildin_menu,"menu","*"}, - {buildin_goto,"goto","l"}, - {buildin_callsub,"callsub","i*"}, - {buildin_callfunc,"callfunc","s*"}, - {buildin_return,"return","*"}, - {buildin_getarg,"getarg","i"}, - {buildin_jobchange,"jobchange","i*"}, - {buildin_input,"input","*"}, - {buildin_warp,"warp","sii"}, - {buildin_isat,"isat","sii"}, - {buildin_areawarp,"areawarp","siiiisii"}, - {buildin_setlook,"setlook","ii"}, - {buildin_set,"set","ii"}, - {buildin_setarray,"setarray","ii*"}, - {buildin_cleararray,"cleararray","iii"}, - {buildin_copyarray,"copyarray","iii"}, - {buildin_getarraysize,"getarraysize","i"}, - {buildin_deletearray,"deletearray","ii"}, - {buildin_getelementofarray,"getelementofarray","ii"}, - {buildin_if,"if","i*"}, - {buildin_getitem,"getitem","ii**"}, - {buildin_getitem2,"getitem2","iiiiiiiii*"}, - {buildin_makeitem,"makeitem","iisii"}, - {buildin_delitem,"delitem","ii"}, - {buildin_cutin,"cutin","si"}, - {buildin_cutincard,"cutincard","i"}, - {buildin_viewpoint,"viewpoint","iiiii"}, - {buildin_heal,"heal","ii"}, - {buildin_itemheal,"itemheal","ii"}, - {buildin_percentheal,"percentheal","ii"}, - {buildin_rand,"rand","i*"}, - {buildin_pow,"pow","ii"}, - {buildin_countitem,"countitem","i"}, - {buildin_checkweight,"checkweight","ii"}, - {buildin_readparam,"readparam","i*"}, - {buildin_getcharid,"getcharid","i*"}, - {buildin_getpartyname,"getpartyname","i"}, - {buildin_getpartymember,"getpartymember","i"}, - {buildin_getguildname,"getguildname","i"}, - {buildin_getguildmaster,"getguildmaster","i"}, - {buildin_getguildmasterid,"getguildmasterid","i"}, - {buildin_strcharinfo,"strcharinfo","i"}, - {buildin_getequipid,"getequipid","i"}, - {buildin_getequipname,"getequipname","i"}, - {buildin_getbrokenid,"getbrokenid","i"}, // [Valaris] - {buildin_repair,"repair","i"}, // [Valaris] - {buildin_getequipisequiped,"getequipisequiped","i"}, - {buildin_getequipisenableref,"getequipisenableref","i"}, - {buildin_getequipisidentify,"getequipisidentify","i"}, - {buildin_getequiprefinerycnt,"getequiprefinerycnt","i"}, - {buildin_getequipweaponlv,"getequipweaponlv","i"}, - {buildin_getequippercentrefinery,"getequippercentrefinery","i"}, - {buildin_successrefitem,"successrefitem","i"}, - {buildin_failedrefitem,"failedrefitem","i"}, - {buildin_statusup,"statusup","i"}, - {buildin_statusup2,"statusup2","ii"}, - {buildin_bonus,"bonus","ii"}, - {buildin_bonus2,"bonus2","iii"}, - {buildin_bonus3,"bonus3","iiii"}, - {buildin_skill,"skill","ii*"}, - {buildin_setskill,"setskill","ii"}, // [Fate] - {buildin_guildskill,"guildskill","ii"}, - {buildin_getskilllv,"getskilllv","i"}, - {buildin_getgdskilllv,"getgdskilllv","ii"}, - {buildin_basicskillcheck,"basicskillcheck","*"}, - {buildin_getgmlevel,"getgmlevel","*"}, - {buildin_end,"end",""}, - {buildin_end,"break",""}, - {buildin_checkoption,"checkoption","i"}, - {buildin_setoption,"setoption","i"}, - {buildin_setcart,"setcart",""}, - {buildin_checkcart,"checkcart","*"}, //fixed by Lupus (added '*') - {buildin_setfalcon,"setfalcon",""}, - {buildin_checkfalcon,"checkfalcon","*"}, //fixed by Lupus (fixed wrong pointer, added '*') - {buildin_setriding,"setriding",""}, - {buildin_checkriding,"checkriding","*"}, //fixed by Lupus (fixed wrong pointer, added '*') - {buildin_savepoint,"save","sii"}, - {buildin_savepoint,"savepoint","sii"}, - {buildin_gettimetick,"gettimetick","i"}, - {buildin_gettime,"gettime","i"}, - {buildin_gettimestr,"gettimestr","si"}, - {buildin_openstorage,"openstorage","*"}, - {buildin_guildopenstorage,"guildopenstorage","*"}, - {buildin_itemskill,"itemskill","iis"}, - {buildin_monster,"monster","siisii*"}, - {buildin_areamonster,"areamonster","siiiisii*"}, - {buildin_killmonster,"killmonster","ss"}, - {buildin_killmonsterall,"killmonsterall","s"}, - {buildin_doevent,"doevent","s"}, - {buildin_donpcevent,"donpcevent","s"}, - {buildin_addtimer,"addtimer","is"}, - {buildin_deltimer,"deltimer","s"}, - {buildin_addtimercount,"addtimercount","si"}, - {buildin_initnpctimer,"initnpctimer","*"}, - {buildin_stopnpctimer,"stopnpctimer","*"}, - {buildin_startnpctimer,"startnpctimer","*"}, - {buildin_setnpctimer,"setnpctimer","*"}, - {buildin_getnpctimer,"getnpctimer","i*"}, - {buildin_announce,"announce","si"}, - {buildin_mapannounce,"mapannounce","ssi"}, - {buildin_areaannounce,"areaannounce","siiiisi"}, - {buildin_getusers,"getusers","i"}, - {buildin_getmapusers,"getmapusers","s"}, - {buildin_getareausers,"getareausers","siiii"}, - {buildin_getareadropitem,"getareadropitem","siiiii"}, - {buildin_enablenpc,"enablenpc","s"}, - {buildin_disablenpc,"disablenpc","s"}, - {buildin_enablearena,"enablearena",""}, // Added by RoVeRT - {buildin_disablearena,"disablearena",""}, // Added by RoVeRT - {buildin_hideoffnpc,"hideoffnpc","s"}, - {buildin_hideonnpc,"hideonnpc","s"}, - {buildin_sc_start,"sc_start","iii*"}, - {buildin_sc_start2,"sc_start2","iiii*"}, - {buildin_sc_end,"sc_end","i"}, - {buildin_sc_check,"sc_check","i"}, - {buildin_getscrate,"getscrate","ii*"}, - {buildin_debugmes,"debugmes","s"}, - {buildin_resetlvl,"resetlvl","i"}, - {buildin_resetstatus,"resetstatus",""}, - {buildin_resetskill,"resetskill",""}, - {buildin_changebase,"changebase","i"}, - {buildin_changesex,"changesex",""}, - {buildin_waitingroom,"waitingroom","si*"}, - {buildin_warpwaitingpc,"warpwaitingpc","sii"}, - {buildin_delwaitingroom,"delwaitingroom","*"}, - {buildin_enablewaitingroomevent,"enablewaitingroomevent","*"}, - {buildin_disablewaitingroomevent,"disablewaitingroomevent","*"}, - {buildin_getwaitingroomstate,"getwaitingroomstate","i*"}, - {buildin_warpwaitingpc,"warpwaitingpc","sii*"}, - {buildin_attachrid,"attachrid","i"}, - {buildin_detachrid,"detachrid",""}, - {buildin_isloggedin,"isloggedin","i"}, - {buildin_setmapflagnosave,"setmapflagnosave","ssii"}, - {buildin_setmapflag,"setmapflag","si"}, - {buildin_removemapflag,"removemapflag","si"}, - {buildin_pvpon,"pvpon","s"}, - {buildin_pvpoff,"pvpoff","s"}, - {buildin_gvgon,"gvgon","s"}, - {buildin_gvgoff,"gvgoff","s"}, - {buildin_emotion,"emotion","i"}, - {buildin_maprespawnguildid,"maprespawnguildid","sii"}, - {buildin_agitstart,"agitstart",""}, // <Agit> - {buildin_agitend,"agitend",""}, - {buildin_agitcheck,"agitcheck","i"}, // <Agitcheck> - {buildin_flagemblem,"flagemblem","i"}, // Flag Emblem - {buildin_getcastlename,"getcastlename","s"}, - {buildin_getcastledata,"getcastledata","si*"}, - {buildin_setcastledata,"setcastledata","sii"}, - {buildin_requestguildinfo,"requestguildinfo","i*"}, - {buildin_getequipcardcnt,"getequipcardcnt","i"}, - {buildin_successremovecards,"successremovecards","i"}, - {buildin_failedremovecards,"failedremovecards","ii"}, - {buildin_marriage,"marriage","s"}, - {buildin_wedding_effect,"wedding",""}, - {buildin_divorce,"divorce","i"}, - {buildin_getitemname,"getitemname","*"}, - {buildin_getspellinvocation,"getspellinvocation","s"}, - {buildin_getanchorinvocation,"getanchorinvocation","s"}, - {buildin_getpartnerid,"getpartnerid2","i"}, - {buildin_getexp,"getexp","ii"}, - {buildin_getinventorylist,"getinventorylist",""}, - {buildin_getskilllist,"getskilllist",""}, - {buildin_get_pool_skills,"getpoolskilllist",""}, - {buildin_get_activated_pool_skills,"getactivatedpoolskilllist",""}, - {buildin_activate_pool_skill,"poolskill","i"}, - {buildin_deactivate_pool_skill,"unpoolskill","i"}, - {buildin_check_pool_skill,"checkpoolskill","i"}, - {buildin_clearitem,"clearitem",""}, - {buildin_classchange,"classchange","ii"}, - {buildin_misceffect,"misceffect","i*"}, - {buildin_soundeffect,"soundeffect","si"}, - {buildin_strmobinfo,"strmobinfo","ii"}, // display mob data [Valaris] - {buildin_guardian,"guardian","siisii*i"}, // summon guardians - {buildin_guardianinfo,"guardianinfo","i"}, // display guardian data [Valaris] - {buildin_npcskilleffect,"npcskilleffect","iiii"}, // npc skill effect [Valaris] - {buildin_specialeffect,"specialeffect","i"}, // npc skill effect [Valaris] - {buildin_specialeffect2,"specialeffect2","i"}, // skill effect on players[Valaris] - {buildin_nude,"nude",""}, // nude command [Valaris] - {buildin_mapwarp,"mapwarp","ssii"}, // Added by RoVeRT - {buildin_inittimer,"inittimer",""}, - {buildin_stoptimer,"stoptimer",""}, - {buildin_cmdothernpc,"cmdothernpc","ss"}, - {buildin_gmcommand,"gmcommand","*"}, // [MouseJstr] -// {buildin_movenpc,"movenpc","siis"}, // [MouseJstr] - {buildin_message,"message","s*"}, // [MouseJstr] - {buildin_npctalk,"npctalk","*"}, // [Valaris] - {buildin_hasitems,"hasitems","*"}, // [Valaris] - {buildin_mobcount,"mobcount","ss"}, - {buildin_getlook,"getlook","i"}, - {buildin_getsavepoint,"getsavepoint","i"}, - {buildin_areatimer,"areatimer","siiiiis"}, - {buildin_isin,"isin","siiii"}, - {buildin_shop,"shop","s"}, - {buildin_isdead,"isdead","i"}, - {buildin_fakenpcname,"fakenpcname","ssi"}, - {buildin_unequip_by_id,"unequipbyid","i"}, // [Freeyorp] - // End Additions - {NULL,NULL,NULL}, -}; -int buildin_message(struct script_state *st); // [MouseJstr] - - -enum { - C_NOP,C_POS,C_INT,C_PARAM,C_FUNC,C_STR,C_CONSTSTR,C_ARG, - C_NAME,C_EOL, C_RETINFO, - - C_LOR,C_LAND,C_LE,C_LT,C_GE,C_GT,C_EQ,C_NE, //operator - C_XOR,C_OR,C_AND,C_ADD,C_SUB,C_MUL,C_DIV,C_MOD,C_NEG,C_LNOT,C_NOT,C_R_SHIFT,C_L_SHIFT +unsigned char *parse_subexpr (unsigned char *, int); +int buildin_mes (struct script_state *st); +int buildin_goto (struct script_state *st); +int buildin_callsub (struct script_state *st); +int buildin_callfunc (struct script_state *st); +int buildin_return (struct script_state *st); +int buildin_getarg (struct script_state *st); +int buildin_next (struct script_state *st); +int buildin_close (struct script_state *st); +int buildin_close2 (struct script_state *st); +int buildin_menu (struct script_state *st); +int buildin_rand (struct script_state *st); +int buildin_pow (struct script_state *st); +int buildin_warp (struct script_state *st); +int buildin_isat (struct script_state *st); +int buildin_areawarp (struct script_state *st); +int buildin_heal (struct script_state *st); +int buildin_itemheal (struct script_state *st); +int buildin_percentheal (struct script_state *st); +int buildin_jobchange (struct script_state *st); +int buildin_input (struct script_state *st); +int buildin_setlook (struct script_state *st); +int buildin_set (struct script_state *st); +int buildin_setarray (struct script_state *st); +int buildin_cleararray (struct script_state *st); +int buildin_copyarray (struct script_state *st); +int buildin_getarraysize (struct script_state *st); +int buildin_deletearray (struct script_state *st); +int buildin_getelementofarray (struct script_state *st); +int buildin_if (struct script_state *st); +int buildin_getitem (struct script_state *st); +int buildin_getitem2 (struct script_state *st); +int buildin_makeitem (struct script_state *st); +int buildin_delitem (struct script_state *st); +int buildin_viewpoint (struct script_state *st); +int buildin_countitem (struct script_state *st); +int buildin_checkweight (struct script_state *st); +int buildin_readparam (struct script_state *st); +int buildin_getcharid (struct script_state *st); +int buildin_getpartyname (struct script_state *st); +int buildin_getpartymember (struct script_state *st); +int buildin_getguildname (struct script_state *st); +int buildin_getguildmaster (struct script_state *st); +int buildin_getguildmasterid (struct script_state *st); +int buildin_strcharinfo (struct script_state *st); +int buildin_getequipid (struct script_state *st); +int buildin_getequipname (struct script_state *st); +int buildin_getbrokenid (struct script_state *st); // [Valaris] +int buildin_repair (struct script_state *st); // [Valaris] +int buildin_getequipisequiped (struct script_state *st); +int buildin_getequipisenableref (struct script_state *st); +int buildin_getequipisidentify (struct script_state *st); +int buildin_getequiprefinerycnt (struct script_state *st); +int buildin_getequipweaponlv (struct script_state *st); +int buildin_getequippercentrefinery (struct script_state *st); +int buildin_successrefitem (struct script_state *st); +int buildin_failedrefitem (struct script_state *st); +int buildin_cutin (struct script_state *st); +int buildin_cutincard (struct script_state *st); +int buildin_statusup (struct script_state *st); +int buildin_statusup2 (struct script_state *st); +int buildin_bonus (struct script_state *st); +int buildin_bonus2 (struct script_state *st); +int buildin_bonus3 (struct script_state *st); +int buildin_skill (struct script_state *st); +int buildin_setskill (struct script_state *st); +int buildin_guildskill (struct script_state *st); +int buildin_getskilllv (struct script_state *st); +int buildin_getgdskilllv (struct script_state *st); +int buildin_basicskillcheck (struct script_state *st); +int buildin_getgmlevel (struct script_state *st); +int buildin_end (struct script_state *st); +int buildin_checkoption (struct script_state *st); +int buildin_setoption (struct script_state *st); +int buildin_setcart (struct script_state *st); +int buildin_checkcart (struct script_state *st); // check cart [Valaris] +int buildin_setfalcon (struct script_state *st); +int buildin_checkfalcon (struct script_state *st); // check falcon [Valaris] +int buildin_setriding (struct script_state *st); +int buildin_checkriding (struct script_state *st); // check for pecopeco [Valaris] +int buildin_savepoint (struct script_state *st); +int buildin_gettimetick (struct script_state *st); +int buildin_gettime (struct script_state *st); +int buildin_gettimestr (struct script_state *st); +int buildin_openstorage (struct script_state *st); +int buildin_guildopenstorage (struct script_state *st); +int buildin_itemskill (struct script_state *st); +int buildin_monster (struct script_state *st); +int buildin_areamonster (struct script_state *st); +int buildin_killmonster (struct script_state *st); +int buildin_killmonsterall (struct script_state *st); +int buildin_doevent (struct script_state *st); +int buildin_donpcevent (struct script_state *st); +int buildin_addtimer (struct script_state *st); +int buildin_deltimer (struct script_state *st); +int buildin_addtimercount (struct script_state *st); +int buildin_initnpctimer (struct script_state *st); +int buildin_stopnpctimer (struct script_state *st); +int buildin_startnpctimer (struct script_state *st); +int buildin_setnpctimer (struct script_state *st); +int buildin_getnpctimer (struct script_state *st); +int buildin_announce (struct script_state *st); +int buildin_mapannounce (struct script_state *st); +int buildin_areaannounce (struct script_state *st); +int buildin_getusers (struct script_state *st); +int buildin_getmapusers (struct script_state *st); +int buildin_getareausers (struct script_state *st); +int buildin_getareadropitem (struct script_state *st); +int buildin_enablenpc (struct script_state *st); +int buildin_disablenpc (struct script_state *st); +int buildin_enablearena (struct script_state *st); // Added by RoVeRT +int buildin_disablearena (struct script_state *st); // Added by RoVeRT +int buildin_hideoffnpc (struct script_state *st); +int buildin_hideonnpc (struct script_state *st); +int buildin_sc_start (struct script_state *st); +int buildin_sc_start2 (struct script_state *st); +int buildin_sc_end (struct script_state *st); +int buildin_sc_check (struct script_state *st); // [Fate] +int buildin_getscrate (struct script_state *st); +int buildin_debugmes (struct script_state *st); +int buildin_resetlvl (struct script_state *st); +int buildin_resetstatus (struct script_state *st); +int buildin_resetskill (struct script_state *st); +int buildin_changebase (struct script_state *st); +int buildin_changesex (struct script_state *st); +int buildin_waitingroom (struct script_state *st); +int buildin_delwaitingroom (struct script_state *st); +int buildin_enablewaitingroomevent (struct script_state *st); +int buildin_disablewaitingroomevent (struct script_state *st); +int buildin_getwaitingroomstate (struct script_state *st); +int buildin_warpwaitingpc (struct script_state *st); +int buildin_attachrid (struct script_state *st); +int buildin_detachrid (struct script_state *st); +int buildin_isloggedin (struct script_state *st); +int buildin_setmapflagnosave (struct script_state *st); +int buildin_setmapflag (struct script_state *st); +int buildin_removemapflag (struct script_state *st); +int buildin_pvpon (struct script_state *st); +int buildin_pvpoff (struct script_state *st); +int buildin_gvgon (struct script_state *st); +int buildin_gvgoff (struct script_state *st); +int buildin_emotion (struct script_state *st); +int buildin_maprespawnguildid (struct script_state *st); +int buildin_agitstart (struct script_state *st); // <Agit> +int buildin_agitend (struct script_state *st); +int buildin_agitcheck (struct script_state *st); // <Agitcheck> +int buildin_flagemblem (struct script_state *st); // Flag Emblem +int buildin_getcastlename (struct script_state *st); +int buildin_getcastledata (struct script_state *st); +int buildin_setcastledata (struct script_state *st); +int buildin_requestguildinfo (struct script_state *st); +int buildin_getequipcardcnt (struct script_state *st); +int buildin_successremovecards (struct script_state *st); +int buildin_failedremovecards (struct script_state *st); +int buildin_marriage (struct script_state *st); +int buildin_wedding_effect (struct script_state *st); +int buildin_divorce (struct script_state *st); +int buildin_getitemname (struct script_state *st); +int buildin_getspellinvocation (struct script_state *st); // [Fate] +int buildin_getanchorinvocation (struct script_state *st); // [Fate] +int buildin_getexp (struct script_state *st); +int buildin_getinventorylist (struct script_state *st); +int buildin_getskilllist (struct script_state *st); +int buildin_get_pool_skills (struct script_state *st); // [fate] +int buildin_get_activated_pool_skills (struct script_state *st); // [fate] +int buildin_activate_pool_skill (struct script_state *st); // [fate] +int buildin_deactivate_pool_skill (struct script_state *st); // [fate] +int buildin_check_pool_skill (struct script_state *st); // [fate] +int buildin_getskilllist (struct script_state *st); +int buildin_getskilllist (struct script_state *st); +int buildin_clearitem (struct script_state *st); +int buildin_classchange (struct script_state *st); +int buildin_misceffect (struct script_state *st); +int buildin_soundeffect (struct script_state *st); +int buildin_setcastledata (struct script_state *st); +int buildin_mapwarp (struct script_state *st); +int buildin_inittimer (struct script_state *st); +int buildin_stoptimer (struct script_state *st); +int buildin_cmdothernpc (struct script_state *st); +int buildin_mobcount (struct script_state *st); +int buildin_strmobinfo (struct script_state *st); // Script for displaying mob info [Valaris] +int buildin_guardian (struct script_state *st); // Script for displaying mob info [Valaris] +int buildin_guardianinfo (struct script_state *st); // Script for displaying mob info [Valaris] +int buildin_npcskilleffect (struct script_state *st); // skill effects for npcs [Valaris] +int buildin_specialeffect (struct script_state *st); // special effect script [Valaris] +int buildin_specialeffect2 (struct script_state *st); // special effect script [Valaris] +int buildin_nude (struct script_state *st); // nude [Valaris] +int buildin_gmcommand (struct script_state *st); // [MouseJstr] +int buildin_movenpc (struct script_state *st); // [MouseJstr] +int buildin_message (struct script_state *st); // [MouseJstr] +int buildin_npctalk (struct script_state *st); // [Valaris] +int buildin_hasitems (struct script_state *st); // [Valaris] +int buildin_getlook (struct script_state *st); //Lorky [Lupus] +int buildin_getsavepoint (struct script_state *st); //Lorky [Lupus] +int buildin_getpartnerid (struct script_state *st); // [Fate] +int buildin_areatimer (struct script_state *st); // [Jaxad0127] +int buildin_isin (struct script_state *st); // [Jaxad0127] +int buildin_shop (struct script_state *st); // [MadCamel] +int buildin_isdead (struct script_state *st); // [Jaxad0127] +int buildin_fakenpcname (struct script_state *st); //[Kage] +int buildin_unequip_by_id (struct script_state *st); // [Freeyorp] + +void push_val (struct script_stack *stack, int type, int val); +int run_func (struct script_state *st); + +int mapreg_setreg (int num, int val); +int mapreg_setregstr (int num, const char *str); + +struct +{ + int (*func) (); + char *name; + char *arg; +} buildin_func[] = +{ + { + buildin_mes, "mes", "s"}, + { + buildin_next, "next", ""}, + { + buildin_close, "close", ""}, + { + buildin_close2, "close2", ""}, + { + buildin_menu, "menu", "*"}, + { + buildin_goto, "goto", "l"}, + { + buildin_callsub, "callsub", "i*"}, + { + buildin_callfunc, "callfunc", "s*"}, + { + buildin_return, "return", "*"}, + { + buildin_getarg, "getarg", "i"}, + { + buildin_jobchange, "jobchange", "i*"}, + { + buildin_input, "input", "*"}, + { + buildin_warp, "warp", "sii"}, + { + buildin_isat, "isat", "sii"}, + { + buildin_areawarp, "areawarp", "siiiisii"}, + { + buildin_setlook, "setlook", "ii"}, + { + buildin_set, "set", "ii"}, + { + buildin_setarray, "setarray", "ii*"}, + { + buildin_cleararray, "cleararray", "iii"}, + { + buildin_copyarray, "copyarray", "iii"}, + { + buildin_getarraysize, "getarraysize", "i"}, + { + buildin_deletearray, "deletearray", "ii"}, + { + buildin_getelementofarray, "getelementofarray", "ii"}, + { + buildin_if, "if", "i*"}, + { + buildin_getitem, "getitem", "ii**"}, + { + buildin_getitem2, "getitem2", "iiiiiiiii*"}, + { + buildin_makeitem, "makeitem", "iisii"}, + { + buildin_delitem, "delitem", "ii"}, + { + buildin_cutin, "cutin", "si"}, + { + buildin_cutincard, "cutincard", "i"}, + { + buildin_viewpoint, "viewpoint", "iiiii"}, + { + buildin_heal, "heal", "ii"}, + { + buildin_itemheal, "itemheal", "ii"}, + { + buildin_percentheal, "percentheal", "ii"}, + { + buildin_rand, "rand", "i*"}, + { + buildin_pow, "pow", "ii"}, + { + buildin_countitem, "countitem", "i"}, + { + buildin_checkweight, "checkweight", "ii"}, + { + buildin_readparam, "readparam", "i*"}, + { + buildin_getcharid, "getcharid", "i*"}, + { + buildin_getpartyname, "getpartyname", "i"}, + { + buildin_getpartymember, "getpartymember", "i"}, + { + buildin_getguildname, "getguildname", "i"}, + { + buildin_getguildmaster, "getguildmaster", "i"}, + { + buildin_getguildmasterid, "getguildmasterid", "i"}, + { + buildin_strcharinfo, "strcharinfo", "i"}, + { + buildin_getequipid, "getequipid", "i"}, + { + buildin_getequipname, "getequipname", "i"}, + { + buildin_getbrokenid, "getbrokenid", "i"}, // [Valaris] + { + buildin_repair, "repair", "i"}, // [Valaris] + { + buildin_getequipisequiped, "getequipisequiped", "i"}, + { + buildin_getequipisenableref, "getequipisenableref", "i"}, + { + buildin_getequipisidentify, "getequipisidentify", "i"}, + { + buildin_getequiprefinerycnt, "getequiprefinerycnt", "i"}, + { + buildin_getequipweaponlv, "getequipweaponlv", "i"}, + { + buildin_getequippercentrefinery, "getequippercentrefinery", "i"}, + { + buildin_successrefitem, "successrefitem", "i"}, + { + buildin_failedrefitem, "failedrefitem", "i"}, + { + buildin_statusup, "statusup", "i"}, + { + buildin_statusup2, "statusup2", "ii"}, + { + buildin_bonus, "bonus", "ii"}, + { + buildin_bonus2, "bonus2", "iii"}, + { + buildin_bonus3, "bonus3", "iiii"}, + { + buildin_skill, "skill", "ii*"}, + { + buildin_setskill, "setskill", "ii"}, // [Fate] + { + buildin_guildskill, "guildskill", "ii"}, + { + buildin_getskilllv, "getskilllv", "i"}, + { + buildin_getgdskilllv, "getgdskilllv", "ii"}, + { + buildin_basicskillcheck, "basicskillcheck", "*"}, + { + buildin_getgmlevel, "getgmlevel", "*"}, + { + buildin_end, "end", ""}, + { + buildin_end, "break", ""}, + { + buildin_checkoption, "checkoption", "i"}, + { + buildin_setoption, "setoption", "i"}, + { + buildin_setcart, "setcart", ""}, + { + buildin_checkcart, "checkcart", "*"}, //fixed by Lupus (added '*') + { + buildin_setfalcon, "setfalcon", ""}, + { + buildin_checkfalcon, "checkfalcon", "*"}, //fixed by Lupus (fixed wrong pointer, added '*') + { + buildin_setriding, "setriding", ""}, + { + buildin_checkriding, "checkriding", "*"}, //fixed by Lupus (fixed wrong pointer, added '*') + { + buildin_savepoint, "save", "sii"}, + { + buildin_savepoint, "savepoint", "sii"}, + { + buildin_gettimetick, "gettimetick", "i"}, + { + buildin_gettime, "gettime", "i"}, + { + buildin_gettimestr, "gettimestr", "si"}, + { + buildin_openstorage, "openstorage", "*"}, + { + buildin_guildopenstorage, "guildopenstorage", "*"}, + { + buildin_itemskill, "itemskill", "iis"}, + { + buildin_monster, "monster", "siisii*"}, + { + buildin_areamonster, "areamonster", "siiiisii*"}, + { + buildin_killmonster, "killmonster", "ss"}, + { + buildin_killmonsterall, "killmonsterall", "s"}, + { + buildin_doevent, "doevent", "s"}, + { + buildin_donpcevent, "donpcevent", "s"}, + { + buildin_addtimer, "addtimer", "is"}, + { + buildin_deltimer, "deltimer", "s"}, + { + buildin_addtimercount, "addtimercount", "si"}, + { + buildin_initnpctimer, "initnpctimer", "*"}, + { + buildin_stopnpctimer, "stopnpctimer", "*"}, + { + buildin_startnpctimer, "startnpctimer", "*"}, + { + buildin_setnpctimer, "setnpctimer", "*"}, + { + buildin_getnpctimer, "getnpctimer", "i*"}, + { + buildin_announce, "announce", "si"}, + { + buildin_mapannounce, "mapannounce", "ssi"}, + { + buildin_areaannounce, "areaannounce", "siiiisi"}, + { + buildin_getusers, "getusers", "i"}, + { + buildin_getmapusers, "getmapusers", "s"}, + { + buildin_getareausers, "getareausers", "siiii"}, + { + buildin_getareadropitem, "getareadropitem", "siiiii"}, + { + buildin_enablenpc, "enablenpc", "s"}, + { + buildin_disablenpc, "disablenpc", "s"}, + { + buildin_enablearena, "enablearena", ""}, // Added by RoVeRT + { + buildin_disablearena, "disablearena", ""}, // Added by RoVeRT + { + buildin_hideoffnpc, "hideoffnpc", "s"}, + { + buildin_hideonnpc, "hideonnpc", "s"}, + { + buildin_sc_start, "sc_start", "iii*"}, + { + buildin_sc_start2, "sc_start2", "iiii*"}, + { + buildin_sc_end, "sc_end", "i"}, + { + buildin_sc_check, "sc_check", "i"}, + { + buildin_getscrate, "getscrate", "ii*"}, + { + buildin_debugmes, "debugmes", "s"}, + { + buildin_resetlvl, "resetlvl", "i"}, + { + buildin_resetstatus, "resetstatus", ""}, + { + buildin_resetskill, "resetskill", ""}, + { + buildin_changebase, "changebase", "i"}, + { + buildin_changesex, "changesex", ""}, + { + buildin_waitingroom, "waitingroom", "si*"}, + { + buildin_warpwaitingpc, "warpwaitingpc", "sii"}, + { + buildin_delwaitingroom, "delwaitingroom", "*"}, + { + buildin_enablewaitingroomevent, "enablewaitingroomevent", "*"}, + { + buildin_disablewaitingroomevent, "disablewaitingroomevent", "*"}, + { + buildin_getwaitingroomstate, "getwaitingroomstate", "i*"}, + { + buildin_warpwaitingpc, "warpwaitingpc", "sii*"}, + { + buildin_attachrid, "attachrid", "i"}, + { + buildin_detachrid, "detachrid", ""}, + { + buildin_isloggedin, "isloggedin", "i"}, + { + buildin_setmapflagnosave, "setmapflagnosave", "ssii"}, + { + buildin_setmapflag, "setmapflag", "si"}, + { + buildin_removemapflag, "removemapflag", "si"}, + { + buildin_pvpon, "pvpon", "s"}, + { + buildin_pvpoff, "pvpoff", "s"}, + { + buildin_gvgon, "gvgon", "s"}, + { + buildin_gvgoff, "gvgoff", "s"}, + { + buildin_emotion, "emotion", "i"}, + { + buildin_maprespawnguildid, "maprespawnguildid", "sii"}, + { + buildin_agitstart, "agitstart", ""}, // <Agit> + { + buildin_agitend, "agitend", ""}, + { + buildin_agitcheck, "agitcheck", "i"}, // <Agitcheck> + { + buildin_flagemblem, "flagemblem", "i"}, // Flag Emblem + { + buildin_getcastlename, "getcastlename", "s"}, + { + buildin_getcastledata, "getcastledata", "si*"}, + { + buildin_setcastledata, "setcastledata", "sii"}, + { + buildin_requestguildinfo, "requestguildinfo", "i*"}, + { + buildin_getequipcardcnt, "getequipcardcnt", "i"}, + { + buildin_successremovecards, "successremovecards", "i"}, + { + buildin_failedremovecards, "failedremovecards", "ii"}, + { + buildin_marriage, "marriage", "s"}, + { + buildin_wedding_effect, "wedding", ""}, + { + buildin_divorce, "divorce", "i"}, + { + buildin_getitemname, "getitemname", "*"}, + { + buildin_getspellinvocation, "getspellinvocation", "s"}, + { + buildin_getanchorinvocation, "getanchorinvocation", "s"}, + { + buildin_getpartnerid, "getpartnerid2", "i"}, + { + buildin_getexp, "getexp", "ii"}, + { + buildin_getinventorylist, "getinventorylist", ""}, + { + buildin_getskilllist, "getskilllist", ""}, + { + buildin_get_pool_skills, "getpoolskilllist", ""}, + { + buildin_get_activated_pool_skills, "getactivatedpoolskilllist", ""}, + { + buildin_activate_pool_skill, "poolskill", "i"}, + { + buildin_deactivate_pool_skill, "unpoolskill", "i"}, + { + buildin_check_pool_skill, "checkpoolskill", "i"}, + { + buildin_clearitem, "clearitem", ""}, + { + buildin_classchange, "classchange", "ii"}, + { + buildin_misceffect, "misceffect", "i*"}, + { + buildin_soundeffect, "soundeffect", "si"}, + { + buildin_strmobinfo, "strmobinfo", "ii"}, // display mob data [Valaris] + { + buildin_guardian, "guardian", "siisii*i"}, // summon guardians + { + buildin_guardianinfo, "guardianinfo", "i"}, // display guardian data [Valaris] + { + buildin_npcskilleffect, "npcskilleffect", "iiii"}, // npc skill effect [Valaris] + { + buildin_specialeffect, "specialeffect", "i"}, // npc skill effect [Valaris] + { + buildin_specialeffect2, "specialeffect2", "i"}, // skill effect on players[Valaris] + { + buildin_nude, "nude", ""}, // nude command [Valaris] + { + buildin_mapwarp, "mapwarp", "ssii"}, // Added by RoVeRT + { + buildin_inittimer, "inittimer", ""}, + { + buildin_stoptimer, "stoptimer", ""}, + { + buildin_cmdothernpc, "cmdothernpc", "ss"}, + { + buildin_gmcommand, "gmcommand", "*"}, // [MouseJstr] +// {buildin_movenpc,"movenpc","siis"}, // [MouseJstr] + { + buildin_message, "message", "s*"}, // [MouseJstr] + { + buildin_npctalk, "npctalk", "*"}, // [Valaris] + { + buildin_hasitems, "hasitems", "*"}, // [Valaris] + { + buildin_mobcount, "mobcount", "ss"}, + { + buildin_getlook, "getlook", "i"}, + { + buildin_getsavepoint, "getsavepoint", "i"}, + { + buildin_areatimer, "areatimer", "siiiiis"}, + { + buildin_isin, "isin", "siiii"}, + { + buildin_shop, "shop", "s"}, + { + buildin_isdead, "isdead", "i"}, + { + buildin_fakenpcname, "fakenpcname", "ssi"}, + { + buildin_unequip_by_id, "unequipbyid", "i"}, // [Freeyorp] + // End Additions + { +NULL, NULL, NULL},}; + +int buildin_message (struct script_state *st); // [MouseJstr] + +enum +{ + C_NOP, C_POS, C_INT, C_PARAM, C_FUNC, C_STR, C_CONSTSTR, C_ARG, + C_NAME, C_EOL, C_RETINFO, + + C_LOR, C_LAND, C_LE, C_LT, C_GE, C_GT, C_EQ, C_NE, //operator + C_XOR, C_OR, C_AND, C_ADD, C_SUB, C_MUL, C_DIV, C_MOD, C_NEG, C_LNOT, + C_NOT, C_R_SHIFT, C_L_SHIFT }; /*========================================== * 文字列のハッシュを計算 *------------------------------------------ */ -static int calc_hash(const unsigned char *p) +static int calc_hash (const unsigned char *p) { - int h=0; - while(*p){ - h=(h<<1)+(h>>3)+(h>>5)+(h>>8); - h+=*p++; - } - return h&15; + int h = 0; + while (*p) + { + h = (h << 1) + (h >> 3) + (h >> 5) + (h >> 8); + h += *p++; + } + return h & 15; } /*========================================== @@ -538,17 +761,19 @@ static int calc_hash(const unsigned char *p) *------------------------------------------ */ // 既存のであれば番号、無ければ-1 -static int search_str(const unsigned char *p) -{ - int i; - i=str_hash[calc_hash(p)]; - while(i){ - if(strcmp(str_buf+str_data[i].str,p)==0){ - return i; - } - i=str_data[i].next; - } - return -1; +static int search_str (const unsigned char *p) +{ + int i; + i = str_hash[calc_hash (p)]; + while (i) + { + if (strcmp (str_buf + str_data[i].str, p) == 0) + { + return i; + } + i = str_data[i].next; + } + return -1; } /*========================================== @@ -556,105 +781,115 @@ static int search_str(const unsigned char *p) *------------------------------------------ */ // 既存のであれば番号、無ければ登録して新規番号 -static int add_str(const unsigned char *p) -{ - int i; - char *lowcase; - - lowcase=strdup(p); - for(i=0;lowcase[i];i++) - lowcase[i]=tolower(lowcase[i]); - if((i=search_str(lowcase))>=0){ - free(lowcase); - return i; - } - free(lowcase); - - i=calc_hash(p); - if(str_hash[i]==0){ - str_hash[i]=str_num; - } else { - i=str_hash[i]; - for(;;){ - if(strcmp(str_buf+str_data[i].str,p)==0){ - return i; - } - if(str_data[i].next==0) - break; - i=str_data[i].next; - } - str_data[i].next=str_num; - } - if(str_num>=str_data_size){ - str_data_size+=128; - str_data=aRealloc(str_data,sizeof(str_data[0])*str_data_size); - memset(str_data + (str_data_size - 128), '\0', 128); - } - while(str_pos+strlen(p)+1>=str_size){ - str_size+=256; - str_buf=(char *)aRealloc(str_buf,str_size); - memset(str_buf + (str_size - 256), '\0', 256); - } - strcpy(str_buf+str_pos,p); - str_data[str_num].type=C_NOP; - str_data[str_num].str=str_pos; - str_data[str_num].next=0; - str_data[str_num].func=NULL; - str_data[str_num].backpatch=-1; - str_data[str_num].label=-1; - str_pos+=strlen(p)+1; - return str_num++; +static int add_str (const unsigned char *p) +{ + int i; + char *lowcase; + + lowcase = strdup (p); + for (i = 0; lowcase[i]; i++) + lowcase[i] = tolower (lowcase[i]); + if ((i = search_str (lowcase)) >= 0) + { + free (lowcase); + return i; + } + free (lowcase); + + i = calc_hash (p); + if (str_hash[i] == 0) + { + str_hash[i] = str_num; + } + else + { + i = str_hash[i]; + for (;;) + { + if (strcmp (str_buf + str_data[i].str, p) == 0) + { + return i; + } + if (str_data[i].next == 0) + break; + i = str_data[i].next; + } + str_data[i].next = str_num; + } + if (str_num >= str_data_size) + { + str_data_size += 128; + str_data = aRealloc (str_data, sizeof (str_data[0]) * str_data_size); + memset (str_data + (str_data_size - 128), '\0', 128); + } + while (str_pos + strlen (p) + 1 >= str_size) + { + str_size += 256; + str_buf = (char *) aRealloc (str_buf, str_size); + memset (str_buf + (str_size - 256), '\0', 256); + } + strcpy (str_buf + str_pos, p); + str_data[str_num].type = C_NOP; + str_data[str_num].str = str_pos; + str_data[str_num].next = 0; + str_data[str_num].func = NULL; + str_data[str_num].backpatch = -1; + str_data[str_num].label = -1; + str_pos += strlen (p) + 1; + return str_num++; } - /*========================================== * スクリプトバッファサイズの確認と拡張 *------------------------------------------ */ -static void check_script_buf(int size) +static void check_script_buf (int size) { - if(script_pos+size>=script_size){ - script_size+=SCRIPT_BLOCK_SIZE; - script_buf=(char *)aRealloc(script_buf,script_size); - memset(script_buf + script_size - SCRIPT_BLOCK_SIZE, '\0', - SCRIPT_BLOCK_SIZE); - } + if (script_pos + size >= script_size) + { + script_size += SCRIPT_BLOCK_SIZE; + script_buf = (char *) aRealloc (script_buf, script_size); + memset (script_buf + script_size - SCRIPT_BLOCK_SIZE, '\0', + SCRIPT_BLOCK_SIZE); + } } /*========================================== * スクリプトバッファに1バイト書き込む *------------------------------------------ */ -static void add_scriptb(int a) +static void add_scriptb (int a) { - check_script_buf(1); - script_buf[script_pos++]=a; + check_script_buf (1); + script_buf[script_pos++] = a; } /*========================================== * スクリプトバッファにデータタイプを書き込む *------------------------------------------ */ -static void add_scriptc(int a) +static void add_scriptc (int a) { - while(a>=0x40){ - add_scriptb((a&0x3f)|0x40); - a=(a-0x40)>>6; - } - add_scriptb(a&0x3f); + while (a >= 0x40) + { + add_scriptb ((a & 0x3f) | 0x40); + a = (a - 0x40) >> 6; + } + add_scriptb (a & 0x3f); } /*========================================== * スクリプトバッファに整数を書き込む *------------------------------------------ */ -static void add_scripti(int a) +static void add_scripti (int a) { - while(a>=0x40){ - add_scriptb(a|0xc0); - a=(a-0x40)>>6; - } - add_scriptb(a|0x80); + while (a >= 0x40) + { + add_scriptb (a | 0xc0); + a = (a - 0x40) >> 6; + } + add_scriptb (a | 0x80); } /*========================================== @@ -662,104 +897,120 @@ static void add_scripti(int a) *------------------------------------------ */ // 最大16Mまで -static void add_scriptl(int l) -{ - int backpatch = str_data[l].backpatch; - - switch(str_data[l].type){ - case C_POS: - add_scriptc(C_POS); - add_scriptb(str_data[l].label); - add_scriptb(str_data[l].label>>8); - add_scriptb(str_data[l].label>>16); - break; - case C_NOP: - // ラベルの可能性があるのでbackpatch用データ埋め込み - add_scriptc(C_NAME); - str_data[l].backpatch=script_pos; - add_scriptb(backpatch); - add_scriptb(backpatch>>8); - add_scriptb(backpatch>>16); - break; - case C_INT: - add_scripti(str_data[l].val); - break; - default: - // もう他の用途と確定してるので数字をそのまま - add_scriptc(C_NAME); - add_scriptb(l); - add_scriptb(l>>8); - add_scriptb(l>>16); - break; - } +static void add_scriptl (int l) +{ + int backpatch = str_data[l].backpatch; + + switch (str_data[l].type) + { + case C_POS: + add_scriptc (C_POS); + add_scriptb (str_data[l].label); + add_scriptb (str_data[l].label >> 8); + add_scriptb (str_data[l].label >> 16); + break; + case C_NOP: + // ラベルの可能性があるのでbackpatch用データ埋め込み + add_scriptc (C_NAME); + str_data[l].backpatch = script_pos; + add_scriptb (backpatch); + add_scriptb (backpatch >> 8); + add_scriptb (backpatch >> 16); + break; + case C_INT: + add_scripti (str_data[l].val); + break; + default: + // もう他の用途と確定してるので数字をそのまま + add_scriptc (C_NAME); + add_scriptb (l); + add_scriptb (l >> 8); + add_scriptb (l >> 16); + break; + } } /*========================================== * ラベルを解決する *------------------------------------------ */ -void set_label(int l,int pos) +void set_label (int l, int pos) { - int i,next; + int i, next; - str_data[l].type=C_POS; - str_data[l].label=pos; - for(i=str_data[l].backpatch;i>=0 && i!=0x00ffffff;){ - next=(*(int*)(script_buf+i)) & 0x00ffffff; - script_buf[i-1]=C_POS; - script_buf[i]=pos; - script_buf[i+1]=pos>>8; - script_buf[i+2]=pos>>16; - i=next; - } + str_data[l].type = C_POS; + str_data[l].label = pos; + for (i = str_data[l].backpatch; i >= 0 && i != 0x00ffffff;) + { + next = (*(int *) (script_buf + i)) & 0x00ffffff; + script_buf[i - 1] = C_POS; + script_buf[i] = pos; + script_buf[i + 1] = pos >> 8; + script_buf[i + 2] = pos >> 16; + i = next; + } } /*========================================== * スペース/コメント読み飛ばし *------------------------------------------ */ -static unsigned char *skip_space(unsigned char *p) -{ - while(1){ - while(isspace(*p)) - p++; - if(p[0]=='/' && p[1]=='/'){ - while(*p && *p!='\n') - p++; - } else if(p[0]=='/' && p[1]=='*'){ - p++; - while(*p && (p[-1]!='*' || p[0]!='/')) - p++; - if(*p) p++; - } else - break; - } - return p; +static unsigned char *skip_space (unsigned char *p) +{ + while (1) + { + while (isspace (*p)) + p++; + if (p[0] == '/' && p[1] == '/') + { + while (*p && *p != '\n') + p++; + } + else if (p[0] == '/' && p[1] == '*') + { + p++; + while (*p && (p[-1] != '*' || p[0] != '/')) + p++; + if (*p) + p++; + } + else + break; + } + return p; } /*========================================== * 1単語スキップ *------------------------------------------ */ -static unsigned char *skip_word(unsigned char *p) -{ - // prefix - if(*p=='$') p++; // MAP鯖内共有変数用 - if(*p=='@') p++; // 一時的変数用(like weiss) - if(*p=='#') p++; // account変数用 - if(*p=='#') p++; // ワールドaccount変数用 - if(*p=='l') p++; // 一時的変数用(like weiss) - - while(isalnum(*p)||*p=='_'|| *p>=0x81) - if(*p>=0x81 && p[1]){ - p+=2; - } else - p++; +static unsigned char *skip_word (unsigned char *p) +{ + // prefix + if (*p == '$') + p++; // MAP鯖内共有変数用 + if (*p == '@') + p++; // 一時的変数用(like weiss) + if (*p == '#') + p++; // account変数用 + if (*p == '#') + p++; // ワールドaccount変数用 + if (*p == 'l') + p++; // 一時的変数用(like weiss) + + while (isalnum (*p) || *p == '_' || *p >= 0x81) + if (*p >= 0x81 && p[1]) + { + p += 2; + } + else + p++; - // postfix - if(*p=='$') p++; // 文字列変数 + // postfix + if (*p == '$') + p++; // 文字列変数 - return p; + return p; } static unsigned char *startptr; @@ -769,99 +1020,119 @@ static int startline; * エラーメッセージ出力 *------------------------------------------ */ -static void disp_error_message(const char *mes,const unsigned char *pos) +static void disp_error_message (const char *mes, const unsigned char *pos) { - int line,c=0,i; - unsigned char *p,*linestart,*lineend; + int line, c = 0, i; + unsigned char *p, *linestart, *lineend; - for(line=startline,p=startptr;p && *p;line++){ - linestart=p; - lineend=strchr(p,'\n'); - if(lineend){ - c=*lineend; - *lineend=0; - } - if(lineend==NULL || pos<lineend){ - printf("%s line %d : ",mes,line); - for(i=0;(linestart[i]!='\r') && (linestart[i]!='\n') && linestart[i];i++){ - if(linestart+i!=pos) - printf("%c",linestart[i]); - else - printf("\'%c\'",linestart[i]); - } - printf("\a\n"); - if(lineend) - *lineend=c; - return; - } - *lineend=c; - p=lineend+1; - } + for (line = startline, p = startptr; p && *p; line++) + { + linestart = p; + lineend = strchr (p, '\n'); + if (lineend) + { + c = *lineend; + *lineend = 0; + } + if (lineend == NULL || pos < lineend) + { + printf ("%s line %d : ", mes, line); + for (i = 0; + (linestart[i] != '\r') && (linestart[i] != '\n') + && linestart[i]; i++) + { + if (linestart + i != pos) + printf ("%c", linestart[i]); + else + printf ("\'%c\'", linestart[i]); + } + printf ("\a\n"); + if (lineend) + *lineend = c; + return; + } + *lineend = c; + p = lineend + 1; + } } /*========================================== * 項の解析 *------------------------------------------ */ -unsigned char* parse_simpleexpr(unsigned char *p) +unsigned char *parse_simpleexpr (unsigned char *p) { - int i; - p=skip_space(p); + int i; + p = skip_space (p); #ifdef DEBUG_FUNCIN - if(battle_config.etc_log) - printf("parse_simpleexpr %s\n",p); + if (battle_config.etc_log) + printf ("parse_simpleexpr %s\n", p); #endif - if(*p==';' || *p==','){ - disp_error_message("unexpected expr end",p); - exit(1); - } - if(*p=='('){ - - p=parse_subexpr(p+1,-1); - p=skip_space(p); - if((*p++)!=')'){ - disp_error_message("unmatch ')'",p); - exit(1); - } - } else if(isdigit(*p) || ((*p=='-' || *p=='+') && isdigit(p[1]))){ - char *np; - i=strtoul(p,&np,0); - add_scripti(i); - p=np; - } else if(*p=='"'){ - add_scriptc(C_STR); - p++; - while(*p && *p!='"'){ - if(p[-1]<=0x7e && *p=='\\') - p++; - else if(*p=='\n'){ - disp_error_message("unexpected newline @ string",p); - exit(1); - } - add_scriptb(*p++); - } - if(!*p){ - disp_error_message("unexpected eof @ string",p); - exit(1); - } - add_scriptb(0); - p++; //'"' - } else { - int c,l; - char *p2; - // label , register , function etc - if(skip_word(p)==p){ - disp_error_message("unexpected character",p); - exit(1); - } - p2=skip_word(p); - c=*p2; *p2=0; // 名前をadd_strする - l=add_str(p); - - parse_cmd=l; // warn_*_mismatch_paramnumのために必要 - if(l==search_str("if")) // warn_cmd_no_commaのために必要 - parse_cmd_if++; + if (*p == ';' || *p == ',') + { + disp_error_message ("unexpected expr end", p); + exit (1); + } + if (*p == '(') + { + + p = parse_subexpr (p + 1, -1); + p = skip_space (p); + if ((*p++) != ')') + { + disp_error_message ("unmatch ')'", p); + exit (1); + } + } + else if (isdigit (*p) || ((*p == '-' || *p == '+') && isdigit (p[1]))) + { + char *np; + i = strtoul (p, &np, 0); + add_scripti (i); + p = np; + } + else if (*p == '"') + { + add_scriptc (C_STR); + p++; + while (*p && *p != '"') + { + if (p[-1] <= 0x7e && *p == '\\') + p++; + else if (*p == '\n') + { + disp_error_message ("unexpected newline @ string", p); + exit (1); + } + add_scriptb (*p++); + } + if (!*p) + { + disp_error_message ("unexpected eof @ string", p); + exit (1); + } + add_scriptb (0); + p++; //'"' + } + else + { + int c, l; + char *p2; + // label , register , function etc + if (skip_word (p) == p) + { + disp_error_message ("unexpected character", p); + exit (1); + } + p2 = skip_word (p); + c = *p2; + *p2 = 0; // 名前をadd_strする + l = add_str (p); + + parse_cmd = l; // warn_*_mismatch_paramnumのために必要 + if (l == search_str ("if")) // warn_cmd_no_commaのために必要 + parse_cmd_if++; /* // 廃止予定のl14/l15,およびプレフィックスlの警告 if( strcmp(str_buf+str_data[l].str,"l14")==0 || @@ -871,622 +1142,746 @@ unsigned char* parse_simpleexpr(unsigned char *p) disp_error_message("prefix 'l' is DEPRECATED. use prefix '@' instead.",p2); } */ - *p2=c; p=p2; - - if(str_data[l].type!=C_FUNC && c=='['){ - // array(name[i] => getelementofarray(name,i) ) - add_scriptl(search_str("getelementofarray")); - add_scriptc(C_ARG); - add_scriptl(l); - p=parse_subexpr(p+1,-1); - p=skip_space(p); - if((*p++)!=']'){ - disp_error_message("unmatch ']'",p); - exit(1); - } - add_scriptc(C_FUNC); - }else - add_scriptl(l); + *p2 = c; + p = p2; + + if (str_data[l].type != C_FUNC && c == '[') + { + // array(name[i] => getelementofarray(name,i) ) + add_scriptl (search_str ("getelementofarray")); + add_scriptc (C_ARG); + add_scriptl (l); + p = parse_subexpr (p + 1, -1); + p = skip_space (p); + if ((*p++) != ']') + { + disp_error_message ("unmatch ']'", p); + exit (1); + } + add_scriptc (C_FUNC); + } + else + add_scriptl (l); - } + } #ifdef DEBUG_FUNCIN - if(battle_config.etc_log) - printf("parse_simpleexpr end %s\n",p); + if (battle_config.etc_log) + printf ("parse_simpleexpr end %s\n", p); #endif - return p; + return p; } /*========================================== * 式の解析 *------------------------------------------ */ -unsigned char* parse_subexpr(unsigned char *p,int limit) +unsigned char *parse_subexpr (unsigned char *p, int limit) { - int op,opl,len; - char *tmpp; + int op, opl, len; + char *tmpp; #ifdef DEBUG_FUNCIN - if(battle_config.etc_log) - printf("parse_subexpr %s\n",p); + if (battle_config.etc_log) + printf ("parse_subexpr %s\n", p); #endif - p=skip_space(p); - - if(*p=='-'){ - tmpp=skip_space(p+1); - if(*tmpp==';' || *tmpp==','){ - add_scriptl(LABEL_NEXTLINE); - p++; - return p; - } - } - tmpp=p; - if((op=C_NEG,*p=='-') || (op=C_LNOT,*p=='!') || (op=C_NOT,*p=='~')){ - p=parse_subexpr(p+1,100); - add_scriptc(op); - } else - p=parse_simpleexpr(p); - p=skip_space(p); - while(((op=C_ADD,opl=6,len=1,*p=='+') || - (op=C_SUB,opl=6,len=1,*p=='-') || - (op=C_MUL,opl=7,len=1,*p=='*') || - (op=C_DIV,opl=7,len=1,*p=='/') || - (op=C_MOD,opl=7,len=1,*p=='%') || - (op=C_FUNC,opl=8,len=1,*p=='(') || - (op=C_LAND,opl=1,len=2,*p=='&' && p[1]=='&') || - (op=C_AND,opl=5,len=1,*p=='&') || - (op=C_LOR,opl=0,len=2,*p=='|' && p[1]=='|') || - (op=C_OR,opl=4,len=1,*p=='|') || - (op=C_XOR,opl=3,len=1,*p=='^') || - (op=C_EQ,opl=2,len=2,*p=='=' && p[1]=='=') || - (op=C_NE,opl=2,len=2,*p=='!' && p[1]=='=') || - (op=C_R_SHIFT,opl=5,len=2,*p=='>' && p[1]=='>') || - (op=C_GE,opl=2,len=2,*p=='>' && p[1]=='=') || - (op=C_GT,opl=2,len=1,*p=='>') || - (op=C_L_SHIFT,opl=5,len=2,*p=='<' && p[1]=='<') || - (op=C_LE,opl=2,len=2,*p=='<' && p[1]=='=') || - (op=C_LT,opl=2,len=1,*p=='<')) && opl>limit){ - p+=len; - if(op==C_FUNC){ - int i=0,func=parse_cmd; - const char *plist[128]; - - if( str_data[func].type!=C_FUNC ){ - disp_error_message("expect function",tmpp); - exit(0); - } - - add_scriptc(C_ARG); - do { - plist[i]=p; - p=parse_subexpr(p,-1); - p=skip_space(p); - if(*p==',') p++; - else if(*p!=')' && script_config.warn_func_no_comma){ - disp_error_message("expect ',' or ')' at func params",p); - } - p=skip_space(p); - i++; - } while(*p && *p!=')' && i<128); - plist[i]=p; - if(*(p++)!=')'){ - disp_error_message("func request '(' ')'",p); - exit(1); - } - - if( str_data[func].type==C_FUNC && script_config.warn_func_mismatch_paramnum){ - const char *arg=buildin_func[str_data[func].val].arg; - int j=0; - for(j=0;arg[j];j++) if(arg[j]=='*')break; - if( (arg[j]==0 && i!=j) || (arg[j]=='*' && i<j) ){ - disp_error_message("illegal number of parameters",plist[(i<j)?i:j]); - } - } - } else { - p=parse_subexpr(p,opl); - } - add_scriptc(op); - p=skip_space(p); - } + p = skip_space (p); + + if (*p == '-') + { + tmpp = skip_space (p + 1); + if (*tmpp == ';' || *tmpp == ',') + { + add_scriptl (LABEL_NEXTLINE); + p++; + return p; + } + } + tmpp = p; + if ((op = C_NEG, *p == '-') || (op = C_LNOT, *p == '!') + || (op = C_NOT, *p == '~')) + { + p = parse_subexpr (p + 1, 100); + add_scriptc (op); + } + else + p = parse_simpleexpr (p); + p = skip_space (p); + while (((op = C_ADD, opl = 6, len = 1, *p == '+') || + (op = C_SUB, opl = 6, len = 1, *p == '-') || + (op = C_MUL, opl = 7, len = 1, *p == '*') || + (op = C_DIV, opl = 7, len = 1, *p == '/') || + (op = C_MOD, opl = 7, len = 1, *p == '%') || + (op = C_FUNC, opl = 8, len = 1, *p == '(') || + (op = C_LAND, opl = 1, len = 2, *p == '&' && p[1] == '&') || + (op = C_AND, opl = 5, len = 1, *p == '&') || + (op = C_LOR, opl = 0, len = 2, *p == '|' && p[1] == '|') || + (op = C_OR, opl = 4, len = 1, *p == '|') || + (op = C_XOR, opl = 3, len = 1, *p == '^') || + (op = C_EQ, opl = 2, len = 2, *p == '=' && p[1] == '=') || + (op = C_NE, opl = 2, len = 2, *p == '!' && p[1] == '=') || + (op = C_R_SHIFT, opl = 5, len = 2, *p == '>' && p[1] == '>') || + (op = C_GE, opl = 2, len = 2, *p == '>' && p[1] == '=') || + (op = C_GT, opl = 2, len = 1, *p == '>') || + (op = C_L_SHIFT, opl = 5, len = 2, *p == '<' && p[1] == '<') || + (op = C_LE, opl = 2, len = 2, *p == '<' && p[1] == '=') || + (op = C_LT, opl = 2, len = 1, *p == '<')) && opl > limit) + { + p += len; + if (op == C_FUNC) + { + int i = 0, func = parse_cmd; + const char *plist[128]; + + if (str_data[func].type != C_FUNC) + { + disp_error_message ("expect function", tmpp); + exit (0); + } + + add_scriptc (C_ARG); + do + { + plist[i] = p; + p = parse_subexpr (p, -1); + p = skip_space (p); + if (*p == ',') + p++; + else if (*p != ')' && script_config.warn_func_no_comma) + { + disp_error_message ("expect ',' or ')' at func params", + p); + } + p = skip_space (p); + i++; + } + while (*p && *p != ')' && i < 128); + plist[i] = p; + if (*(p++) != ')') + { + disp_error_message ("func request '(' ')'", p); + exit (1); + } + + if (str_data[func].type == C_FUNC + && script_config.warn_func_mismatch_paramnum) + { + const char *arg = buildin_func[str_data[func].val].arg; + int j = 0; + for (j = 0; arg[j]; j++) + if (arg[j] == '*') + break; + if ((arg[j] == 0 && i != j) || (arg[j] == '*' && i < j)) + { + disp_error_message ("illegal number of parameters", + plist[(i < j) ? i : j]); + } + } + } + else + { + p = parse_subexpr (p, opl); + } + add_scriptc (op); + p = skip_space (p); + } #ifdef DEBUG_FUNCIN - if(battle_config.etc_log) - printf("parse_subexpr end %s\n",p); + if (battle_config.etc_log) + printf ("parse_subexpr end %s\n", p); #endif - return p; /* return first untreated operator */ + return p; /* return first untreated operator */ } /*========================================== * 式の評価 *------------------------------------------ */ -unsigned char* parse_expr(unsigned char *p) +unsigned char *parse_expr (unsigned char *p) { #ifdef DEBUG_FUNCIN - if(battle_config.etc_log) - printf("parse_expr %s\n",p); + if (battle_config.etc_log) + printf ("parse_expr %s\n", p); #endif - switch(*p){ - case ')': case ';': case ':': case '[': case ']': - case '}': - disp_error_message("unexpected char",p); - exit(1); - } - p=parse_subexpr(p,-1); + switch (*p) + { + case ')': + case ';': + case ':': + case '[': + case ']': + case '}': + disp_error_message ("unexpected char", p); + exit (1); + } + p = parse_subexpr (p, -1); #ifdef DEBUG_FUNCIN - if(battle_config.etc_log) - printf("parse_expr end %s\n",p); + if (battle_config.etc_log) + printf ("parse_expr end %s\n", p); #endif - return p; + return p; } /*========================================== * 行の解析 *------------------------------------------ */ -unsigned char* parse_line(unsigned char *p) -{ - int i=0,cmd; - const char *plist[128]; - char *p2; - - p=skip_space(p); - if(*p==';') - return p; - - parse_cmd_if=0; // warn_cmd_no_commaのために必要 - - // 最初は関数名 - p2=p; - p=parse_simpleexpr(p); - p=skip_space(p); - - cmd=parse_cmd; - if( str_data[cmd].type!=C_FUNC ){ - disp_error_message("expect command",p2); -// exit(0); - } - - add_scriptc(C_ARG); - while(p && *p && *p!=';' && i<128){ - plist[i]=p; - - p=parse_expr(p); - p=skip_space(p); - // 引数区切りの,処理 - if(*p==',') p++; - else if(*p!=';' && script_config.warn_cmd_no_comma && parse_cmd_if*2<=i ){ - disp_error_message("expect ',' or ';' at cmd params",p); - } - p=skip_space(p); - i++; - } - plist[i]=p; - if(!p || *(p++)!=';'){ - disp_error_message("need ';'",p); - exit(1); - } - add_scriptc(C_FUNC); - - if( str_data[cmd].type==C_FUNC && script_config.warn_cmd_mismatch_paramnum){ - const char *arg=buildin_func[str_data[cmd].val].arg; - int j=0; - for(j=0;arg[j];j++) if(arg[j]=='*')break; - if( (arg[j]==0 && i!=j) || (arg[j]=='*' && i<j) ){ - disp_error_message("illegal number of parameters",plist[(i<j)?i:j]); - } - } - +unsigned char *parse_line (unsigned char *p) +{ + int i = 0, cmd; + const char *plist[128]; + char *p2; + + p = skip_space (p); + if (*p == ';') + return p; + + parse_cmd_if = 0; // warn_cmd_no_commaのために必要 + + // 最初は関数名 + p2 = p; + p = parse_simpleexpr (p); + p = skip_space (p); + + cmd = parse_cmd; + if (str_data[cmd].type != C_FUNC) + { + disp_error_message ("expect command", p2); +// exit(0); + } + + add_scriptc (C_ARG); + while (p && *p && *p != ';' && i < 128) + { + plist[i] = p; + + p = parse_expr (p); + p = skip_space (p); + // 引数区切りの,処理 + if (*p == ',') + p++; + else if (*p != ';' && script_config.warn_cmd_no_comma + && parse_cmd_if * 2 <= i) + { + disp_error_message ("expect ',' or ';' at cmd params", p); + } + p = skip_space (p); + i++; + } + plist[i] = p; + if (!p || *(p++) != ';') + { + disp_error_message ("need ';'", p); + exit (1); + } + add_scriptc (C_FUNC); + + if (str_data[cmd].type == C_FUNC + && script_config.warn_cmd_mismatch_paramnum) + { + const char *arg = buildin_func[str_data[cmd].val].arg; + int j = 0; + for (j = 0; arg[j]; j++) + if (arg[j] == '*') + break; + if ((arg[j] == 0 && i != j) || (arg[j] == '*' && i < j)) + { + disp_error_message ("illegal number of parameters", + plist[(i < j) ? i : j]); + } + } - return p; + return p; } /*========================================== * 組み込み関数の追加 *------------------------------------------ */ -static void add_buildin_func(void) +static void add_buildin_func (void) { - int i,n; - for(i=0;buildin_func[i].func;i++){ - n=add_str(buildin_func[i].name); - str_data[n].type=C_FUNC; - str_data[n].val=i; - str_data[n].func=buildin_func[i].func; - } + int i, n; + for (i = 0; buildin_func[i].func; i++) + { + n = add_str (buildin_func[i].name); + str_data[n].type = C_FUNC; + str_data[n].val = i; + str_data[n].func = buildin_func[i].func; + } } /*========================================== * 定数データベースの読み込み *------------------------------------------ */ -static void read_constdb(void) -{ - FILE *fp; - char line[1024],name[1024]; - int val,n,i,type; - - fp=fopen_("db/const.txt","r"); - if(fp==NULL){ - printf("can't read db/const.txt\n"); - return ; - } - while(fgets(line,1020,fp)){ - if(line[0]=='/' && line[1]=='/') - continue; - type=0; - if(sscanf(line,"%[A-Za-z0-9_],%d,%d",name,&val,&type)>=2 || - sscanf(line,"%[A-Za-z0-9_] %d %d",name,&val,&type)>=2){ - for(i=0;name[i];i++) - name[i]=tolower(name[i]); - n=add_str(name); - if(type==0) - str_data[n].type=C_INT; - else - str_data[n].type=C_PARAM; - str_data[n].val=val; - } - } - fclose_(fp); +static void read_constdb (void) +{ + FILE *fp; + char line[1024], name[1024]; + int val, n, i, type; + + fp = fopen_ ("db/const.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/const.txt\n"); + return; + } + while (fgets (line, 1020, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + type = 0; + if (sscanf (line, "%[A-Za-z0-9_],%d,%d", name, &val, &type) >= 2 || + sscanf (line, "%[A-Za-z0-9_] %d %d", name, &val, &type) >= 2) + { + for (i = 0; name[i]; i++) + name[i] = tolower (name[i]); + n = add_str (name); + if (type == 0) + str_data[n].type = C_INT; + else + str_data[n].type = C_PARAM; + str_data[n].val = val; + } + } + fclose_ (fp); } /*========================================== * スクリプトの解析 *------------------------------------------ */ -unsigned char* parse_script(unsigned char *src,int line) -{ - unsigned char *p,*tmpp; - int i; - static int first=1; - - if(first){ - add_buildin_func(); - read_constdb(); - } - first=0; - script_buf=(unsigned char *)aCalloc(SCRIPT_BLOCK_SIZE,sizeof(unsigned char)); - script_pos=0; - script_size=SCRIPT_BLOCK_SIZE; - str_data[LABEL_NEXTLINE].type=C_NOP; - str_data[LABEL_NEXTLINE].backpatch=-1; - str_data[LABEL_NEXTLINE].label=-1; - for(i=LABEL_START;i<str_num;i++){ - if(str_data[i].type==C_POS || str_data[i].type==C_NAME){ - str_data[i].type=C_NOP; - str_data[i].backpatch=-1; - str_data[i].label=-1; - } - } - - // 外部用label dbの初期化 - if(scriptlabel_db!=NULL) - strdb_final(scriptlabel_db,scriptlabel_final); - scriptlabel_db=strdb_init(50); - - // for error message - startptr = src; - startline = line; - - p=src; - p=skip_space(p); - if(*p!='{'){ - disp_error_message("not found '{'",p); - return NULL; - } - for(p++;p && *p && *p!='}';){ - p=skip_space(p); - // labelだけ特殊処理 - tmpp=skip_space(skip_word(p)); - if(*tmpp==':'){ - int l,c; - - c=*skip_word(p); - *skip_word(p)=0; - l=add_str(p); - if(str_data[l].label!=-1){ - *skip_word(p)=c; - disp_error_message("dup label ",p); - exit(1); - } - set_label(l,script_pos); - strdb_insert(scriptlabel_db,p,script_pos); // 外部用label db登録 - *skip_word(p)=c; - p=tmpp+1; - continue; - } - - // 他は全部一緒くた - p=parse_line(p); - p=skip_space(p); - add_scriptc(C_EOL); - - set_label(LABEL_NEXTLINE,script_pos); - str_data[LABEL_NEXTLINE].type=C_NOP; - str_data[LABEL_NEXTLINE].backpatch=-1; - str_data[LABEL_NEXTLINE].label=-1; - } +unsigned char *parse_script (unsigned char *src, int line) +{ + unsigned char *p, *tmpp; + int i; + static int first = 1; + + if (first) + { + add_buildin_func (); + read_constdb (); + } + first = 0; + script_buf = + (unsigned char *) aCalloc (SCRIPT_BLOCK_SIZE, sizeof (unsigned char)); + script_pos = 0; + script_size = SCRIPT_BLOCK_SIZE; + str_data[LABEL_NEXTLINE].type = C_NOP; + str_data[LABEL_NEXTLINE].backpatch = -1; + str_data[LABEL_NEXTLINE].label = -1; + for (i = LABEL_START; i < str_num; i++) + { + if (str_data[i].type == C_POS || str_data[i].type == C_NAME) + { + str_data[i].type = C_NOP; + str_data[i].backpatch = -1; + str_data[i].label = -1; + } + } + + // 外部用label dbの初期化 + if (scriptlabel_db != NULL) + strdb_final (scriptlabel_db, scriptlabel_final); + scriptlabel_db = strdb_init (50); + + // for error message + startptr = src; + startline = line; + + p = src; + p = skip_space (p); + if (*p != '{') + { + disp_error_message ("not found '{'", p); + return NULL; + } + for (p++; p && *p && *p != '}';) + { + p = skip_space (p); + // labelだけ特殊処理 + tmpp = skip_space (skip_word (p)); + if (*tmpp == ':') + { + int l, c; + + c = *skip_word (p); + *skip_word (p) = 0; + l = add_str (p); + if (str_data[l].label != -1) + { + *skip_word (p) = c; + disp_error_message ("dup label ", p); + exit (1); + } + set_label (l, script_pos); + strdb_insert (scriptlabel_db, p, script_pos); // 外部用label db登録 + *skip_word (p) = c; + p = tmpp + 1; + continue; + } - add_scriptc(C_NOP); - - script_size = script_pos; - script_buf=(char *)aRealloc(script_buf,script_pos + 1); - - // 未解決のラベルを解決 - for(i=LABEL_START;i<str_num;i++){ - if(str_data[i].type==C_NOP){ - int j,next; - str_data[i].type=C_NAME; - str_data[i].label=i; - for(j=str_data[i].backpatch;j>=0 && j!=0x00ffffff;){ - next=(*(int*)(script_buf+j)) & 0x00ffffff; - script_buf[j]=i; - script_buf[j+1]=i>>8; - script_buf[j+2]=i>>16; - j=next; - } - } - } + // 他は全部一緒くた + p = parse_line (p); + p = skip_space (p); + add_scriptc (C_EOL); + + set_label (LABEL_NEXTLINE, script_pos); + str_data[LABEL_NEXTLINE].type = C_NOP; + str_data[LABEL_NEXTLINE].backpatch = -1; + str_data[LABEL_NEXTLINE].label = -1; + } + + add_scriptc (C_NOP); + + script_size = script_pos; + script_buf = (char *) aRealloc (script_buf, script_pos + 1); + + // 未解決のラベルを解決 + for (i = LABEL_START; i < str_num; i++) + { + if (str_data[i].type == C_NOP) + { + int j, next; + str_data[i].type = C_NAME; + str_data[i].label = i; + for (j = str_data[i].backpatch; j >= 0 && j != 0x00ffffff;) + { + next = (*(int *) (script_buf + j)) & 0x00ffffff; + script_buf[j] = i; + script_buf[j + 1] = i >> 8; + script_buf[j + 2] = i >> 16; + j = next; + } + } + } #ifdef DEBUG_DISP - for(i=0;i<script_pos;i++){ - if((i&15)==0) printf("%04x : ",i); - printf("%02x ",script_buf[i]); - if((i&15)==15) printf("\n"); - } - printf("\n"); + for (i = 0; i < script_pos; i++) + { + if ((i & 15) == 0) + printf ("%04x : ", i); + printf ("%02x ", script_buf[i]); + if ((i & 15) == 15) + printf ("\n"); + } + printf ("\n"); #endif - return script_buf; + return script_buf; } // // 実行系 // -enum {STOP=1,END,RERUNLINE,GOTO,RETFUNC}; +enum +{ STOP = 1, END, RERUNLINE, GOTO, RETFUNC }; /*========================================== * ridからsdへの解決 *------------------------------------------ */ -struct map_session_data *script_rid2sd(struct script_state *st) +struct map_session_data *script_rid2sd (struct script_state *st) { - struct map_session_data *sd=map_id2sd(st->rid); - if(!sd){ - printf("script_rid2sd: fatal error ! player not attached!\n"); - } - return sd; + struct map_session_data *sd = map_id2sd (st->rid); + if (!sd) + { + printf ("script_rid2sd: fatal error ! player not attached!\n"); + } + return sd; } - /*========================================== * 変数の読み取り *------------------------------------------ */ -int get_val(struct script_state*st,struct script_data* data) +int get_val (struct script_state *st, struct script_data *data) { - struct map_session_data *sd=NULL; - if(data->type==C_NAME){ - char *name=str_buf+str_data[data->u.num&0x00ffffff].str; - char prefix=*name; - char postfix=name[strlen(name)-1]; - - if(prefix!='$'){ - if((sd=script_rid2sd(st))==NULL) - printf("get_val error name?:%s\n",name); - } - if(postfix=='$'){ - - data->type=C_CONSTSTR; - if( prefix=='@' || prefix=='l' ){ - if(sd) - data->u.str = pc_readregstr(sd,data->u.num); - }else if(prefix=='$'){ - data->u.str = (char *)numdb_search(mapregstr_db,data->u.num); - }else{ - printf("script: get_val: illegal scope string variable.\n"); - data->u.str = "!!ERROR!!"; - } - if( data->u.str == NULL ) - data->u.str =""; - - }else{ - - data->type=C_INT; - if(str_data[data->u.num&0x00ffffff].type==C_INT){ - data->u.num = str_data[data->u.num&0x00ffffff].val; - }else if(str_data[data->u.num&0x00ffffff].type==C_PARAM){ - if(sd) - data->u.num = pc_readparam(sd,str_data[data->u.num&0x00ffffff].val); - }else if(prefix=='@' || prefix=='l'){ - if(sd) - data->u.num = pc_readreg(sd,data->u.num); - }else if(prefix=='$'){ - data->u.num = (int)numdb_search(mapreg_db,data->u.num); - }else if(prefix=='#'){ - if( name[1]=='#'){ - if(sd) - data->u.num = pc_readaccountreg2(sd,name); - }else{ - if(sd) - data->u.num = pc_readaccountreg(sd,name); - } - }else{ - if(sd) - data->u.num = pc_readglobalreg(sd,name); - } - } - } - return 0; + struct map_session_data *sd = NULL; + if (data->type == C_NAME) + { + char *name = str_buf + str_data[data->u.num & 0x00ffffff].str; + char prefix = *name; + char postfix = name[strlen (name) - 1]; + + if (prefix != '$') + { + if ((sd = script_rid2sd (st)) == NULL) + printf ("get_val error name?:%s\n", name); + } + if (postfix == '$') + { + + data->type = C_CONSTSTR; + if (prefix == '@' || prefix == 'l') + { + if (sd) + data->u.str = pc_readregstr (sd, data->u.num); + } + else if (prefix == '$') + { + data->u.str = + (char *) numdb_search (mapregstr_db, data->u.num); + } + else + { + printf ("script: get_val: illegal scope string variable.\n"); + data->u.str = "!!ERROR!!"; + } + if (data->u.str == NULL) + data->u.str = ""; + + } + else + { + + data->type = C_INT; + if (str_data[data->u.num & 0x00ffffff].type == C_INT) + { + data->u.num = str_data[data->u.num & 0x00ffffff].val; + } + else if (str_data[data->u.num & 0x00ffffff].type == C_PARAM) + { + if (sd) + data->u.num = + pc_readparam (sd, + str_data[data->u.num & 0x00ffffff].val); + } + else if (prefix == '@' || prefix == 'l') + { + if (sd) + data->u.num = pc_readreg (sd, data->u.num); + } + else if (prefix == '$') + { + data->u.num = (int) numdb_search (mapreg_db, data->u.num); + } + else if (prefix == '#') + { + if (name[1] == '#') + { + if (sd) + data->u.num = pc_readaccountreg2 (sd, name); + } + else + { + if (sd) + data->u.num = pc_readaccountreg (sd, name); + } + } + else + { + if (sd) + data->u.num = pc_readglobalreg (sd, name); + } + } + } + return 0; } + /*========================================== * 変数の読み取り2 *------------------------------------------ */ -void* get_val2(struct script_state*st,int num) +void *get_val2 (struct script_state *st, int num) { - struct script_data dat; - dat.type=C_NAME; - dat.u.num=num; - get_val(st,&dat); - if( dat.type==C_INT ) return (void*)dat.u.num; - else return (void*)dat.u.str; + struct script_data dat; + dat.type = C_NAME; + dat.u.num = num; + get_val (st, &dat); + if (dat.type == C_INT) + return (void *) dat.u.num; + else + return (void *) dat.u.str; } /*========================================== * 変数設定用 *------------------------------------------ */ -static int set_reg(struct map_session_data *sd,int num,char *name,void *v) +static int set_reg (struct map_session_data *sd, int num, char *name, void *v) { - char prefix=*name; - char postfix=name[strlen(name)-1]; + char prefix = *name; + char postfix = name[strlen (name) - 1]; - if( postfix=='$' ){ - char *str=(char*)v; - if( prefix=='@' || prefix=='l'){ - pc_setregstr(sd,num,str); - }else if(prefix=='$') { - mapreg_setregstr(num,str); - }else{ - printf("script: set_reg: illegal scope string variable !"); - } - }else{ - // 数値 - int val = (int)v; - if(str_data[num&0x00ffffff].type==C_PARAM){ - pc_setparam(sd,str_data[num&0x00ffffff].val,val); - }else if(prefix=='@' || prefix=='l') { - pc_setreg(sd,num,val); - }else if(prefix=='$') { - mapreg_setreg(num,val); - }else if(prefix=='#') { - if( name[1]=='#' ) - pc_setaccountreg2(sd,name,val); - else - pc_setaccountreg(sd,name,val); - }else{ - pc_setglobalreg(sd,name,val); - } - } - return 0; + if (postfix == '$') + { + char *str = (char *) v; + if (prefix == '@' || prefix == 'l') + { + pc_setregstr (sd, num, str); + } + else if (prefix == '$') + { + mapreg_setregstr (num, str); + } + else + { + printf ("script: set_reg: illegal scope string variable !"); + } + } + else + { + // 数値 + int val = (int) v; + if (str_data[num & 0x00ffffff].type == C_PARAM) + { + pc_setparam (sd, str_data[num & 0x00ffffff].val, val); + } + else if (prefix == '@' || prefix == 'l') + { + pc_setreg (sd, num, val); + } + else if (prefix == '$') + { + mapreg_setreg (num, val); + } + else if (prefix == '#') + { + if (name[1] == '#') + pc_setaccountreg2 (sd, name, val); + else + pc_setaccountreg (sd, name, val); + } + else + { + pc_setglobalreg (sd, name, val); + } + } + return 0; } /*========================================== * 文字列への変換 *------------------------------------------ */ -char* conv_str(struct script_state *st,struct script_data *data) +char *conv_str (struct script_state *st, struct script_data *data) { - get_val(st,data); - if(data->type==C_INT){ - char *buf; - buf=(char *)aCalloc(16,sizeof(char)); - sprintf(buf,"%d",data->u.num); - data->type=C_STR; - data->u.str=buf; + get_val (st, data); + if (data->type == C_INT) + { + char *buf; + buf = (char *) aCalloc (16, sizeof (char)); + sprintf (buf, "%d", data->u.num); + data->type = C_STR; + data->u.str = buf; #if 1 - } else if(data->type==C_NAME){ - // テンポラリ。本来無いはず - data->type=C_CONSTSTR; - data->u.str=str_buf+str_data[data->u.num].str; + } + else if (data->type == C_NAME) + { + // テンポラリ。本来無いはず + data->type = C_CONSTSTR; + data->u.str = str_buf + str_data[data->u.num].str; #endif - } - return data->u.str; + } + return data->u.str; } /*========================================== * 数値へ変換 *------------------------------------------ */ -int conv_num(struct script_state *st,struct script_data *data) +int conv_num (struct script_state *st, struct script_data *data) { - char *p; - get_val(st,data); - if(data->type==C_STR || data->type==C_CONSTSTR){ - p=data->u.str; - data->u.num = atoi(p); - if(data->type==C_STR) - free(p); - data->type=C_INT; - } - return data->u.num; + char *p; + get_val (st, data); + if (data->type == C_STR || data->type == C_CONSTSTR) + { + p = data->u.str; + data->u.num = atoi (p); + if (data->type == C_STR) + free (p); + data->type = C_INT; + } + return data->u.num; } /*========================================== * スタックへ数値をプッシュ *------------------------------------------ */ -void push_val(struct script_stack *stack,int type,int val) +void push_val (struct script_stack *stack, int type, int val) { - if(stack->sp >= stack->sp_max){ - stack->sp_max += 64; - stack->stack_data = (struct script_data *)aRealloc(stack->stack_data, - sizeof(stack->stack_data[0]) * stack->sp_max); - memset(stack->stack_data + (stack->sp_max - 64), 0, - 64 * sizeof(*(stack->stack_data))); - } -// if(battle_config.etc_log) -// printf("push (%d,%d)-> %d\n",type,val,stack->sp); - stack->stack_data[stack->sp].type=type; - stack->stack_data[stack->sp].u.num=val; - stack->sp++; + if (stack->sp >= stack->sp_max) + { + stack->sp_max += 64; + stack->stack_data = + (struct script_data *) aRealloc (stack->stack_data, + sizeof (stack->stack_data[0]) * + stack->sp_max); + memset (stack->stack_data + (stack->sp_max - 64), 0, + 64 * sizeof (*(stack->stack_data))); + } +// if(battle_config.etc_log) +// printf("push (%d,%d)-> %d\n",type,val,stack->sp); + stack->stack_data[stack->sp].type = type; + stack->stack_data[stack->sp].u.num = val; + stack->sp++; } /*========================================== * スタックへ文字列をプッシュ *------------------------------------------ */ -void push_str(struct script_stack *stack,int type,unsigned char *str) +void push_str (struct script_stack *stack, int type, unsigned char *str) { - if(stack->sp>=stack->sp_max){ - stack->sp_max += 64; - stack->stack_data = (struct script_data *)aRealloc(stack->stack_data, - sizeof(stack->stack_data[0]) * stack->sp_max); - memset(stack->stack_data + (stack->sp_max - 64), '\0', - 64 * sizeof(*(stack->stack_data))); - } -// if(battle_config.etc_log) -// printf("push (%d,%x)-> %d\n",type,str,stack->sp); - stack->stack_data[stack->sp].type=type; - stack->stack_data[stack->sp].u.str=str; - stack->sp++; + if (stack->sp >= stack->sp_max) + { + stack->sp_max += 64; + stack->stack_data = + (struct script_data *) aRealloc (stack->stack_data, + sizeof (stack->stack_data[0]) * + stack->sp_max); + memset (stack->stack_data + (stack->sp_max - 64), '\0', + 64 * sizeof (*(stack->stack_data))); + } +// if(battle_config.etc_log) +// printf("push (%d,%x)-> %d\n",type,str,stack->sp); + stack->stack_data[stack->sp].type = type; + stack->stack_data[stack->sp].u.str = str; + stack->sp++; } /*========================================== * スタックへ複製をプッシュ *------------------------------------------ */ -void push_copy(struct script_stack *stack,int pos) +void push_copy (struct script_stack *stack, int pos) { - switch(stack->stack_data[pos].type){ - case C_CONSTSTR: - push_str(stack,C_CONSTSTR,stack->stack_data[pos].u.str); - break; - case C_STR: - push_str(stack,C_STR,strdup(stack->stack_data[pos].u.str)); - break; - default: - push_val(stack,stack->stack_data[pos].type,stack->stack_data[pos].u.num); - break; - } + switch (stack->stack_data[pos].type) + { + case C_CONSTSTR: + push_str (stack, C_CONSTSTR, stack->stack_data[pos].u.str); + break; + case C_STR: + push_str (stack, C_STR, strdup (stack->stack_data[pos].u.str)); + break; + default: + push_val (stack, stack->stack_data[pos].type, + stack->stack_data[pos].u.num); + break; + } } /*========================================== * スタックからポップ *------------------------------------------ */ -void pop_stack(struct script_stack* stack,int start,int end) +void pop_stack (struct script_stack *stack, int start, int end) { - int i; - for(i=start;i<end;i++){ - if(stack->stack_data[i].type==C_STR){ - free(stack->stack_data[i].u.str); - } - } - if(stack->sp>end){ - memmove(&stack->stack_data[start],&stack->stack_data[end],sizeof(stack->stack_data[0])*(stack->sp-end)); - } - stack->sp-=end-start; + int i; + for (i = start; i < end; i++) + { + if (stack->stack_data[i].type == C_STR) + { + free (stack->stack_data[i].u.str); + } + } + if (stack->sp > end) + { + memmove (&stack->stack_data[start], &stack->stack_data[end], + sizeof (stack->stack_data[0]) * (stack->sp - end)); + } + stack->sp -= end - start; } // @@ -1496,1749 +1891,1940 @@ void pop_stack(struct script_stack* stack,int start,int end) * *------------------------------------------ */ -int buildin_mes(struct script_state *st) +int buildin_mes (struct script_state *st) { - conv_str(st,& (st->stack->stack_data[st->start+2])); - clif_scriptmes(script_rid2sd(st),st->oid,st->stack->stack_data[st->start+2].u.str); - return 0; + conv_str (st, &(st->stack->stack_data[st->start + 2])); + clif_scriptmes (script_rid2sd (st), st->oid, + st->stack->stack_data[st->start + 2].u.str); + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_goto(struct script_state *st) +int buildin_goto (struct script_state *st) { - int pos; + int pos; - if( st->stack->stack_data[st->start+2].type!=C_POS ){ - printf("script: goto: not label !\n"); - st->state=END; - return 0; - } + if (st->stack->stack_data[st->start + 2].type != C_POS) + { + printf ("script: goto: not label !\n"); + st->state = END; + return 0; + } - pos=conv_num(st,& (st->stack->stack_data[st->start+2])); - st->pos=pos; - st->state=GOTO; - return 0; + pos = conv_num (st, &(st->stack->stack_data[st->start + 2])); + st->pos = pos; + st->state = GOTO; + return 0; } /*========================================== * ユーザー定義関数の呼び出し *------------------------------------------ */ -int buildin_callfunc(struct script_state *st) +int buildin_callfunc (struct script_state *st) { - char *scr; - char *str=conv_str(st,& (st->stack->stack_data[st->start+2])); + char *scr; + char *str = conv_str (st, &(st->stack->stack_data[st->start + 2])); - if( (scr=strdb_search(script_get_userfunc_db(),str)) ){ - int i,j; - for(i=st->start+3,j=0;i<st->end;i++,j++) - push_copy(st->stack,i); + if ((scr = strdb_search (script_get_userfunc_db (), str))) + { + int i, j; + for (i = st->start + 3, j = 0; i < st->end; i++, j++) + push_copy (st->stack, i); - push_val(st->stack,C_INT,j); // 引数の数をプッシュ - push_val(st->stack,C_INT,st->defsp); // 現在の基準スタックポインタをプッシュ - push_val(st->stack,C_INT,(int)st->script); // 現在のスクリプトをプッシュ - push_val(st->stack,C_RETINFO,st->pos); // 現在のスクリプト位置をプッシュ + push_val (st->stack, C_INT, j); // 引数の数をプッシュ + push_val (st->stack, C_INT, st->defsp); // 現在の基準スタックポインタをプッシュ + push_val (st->stack, C_INT, (int) st->script); // 現在のスクリプトをプッシュ + push_val (st->stack, C_RETINFO, st->pos); // 現在のスクリプト位置をプッシュ - st->pos=0; - st->script=scr; - st->defsp=st->start+4+j; - st->state=GOTO; - }else{ - printf("script:callfunc: function not found! [%s]\n",str); - st->state=END; - } - return 0; + st->pos = 0; + st->script = scr; + st->defsp = st->start + 4 + j; + st->state = GOTO; + } + else + { + printf ("script:callfunc: function not found! [%s]\n", str); + st->state = END; + } + return 0; } + /*========================================== * サブルーティンの呼び出し *------------------------------------------ */ -int buildin_callsub(struct script_state *st) +int buildin_callsub (struct script_state *st) { - int pos=conv_num(st,& (st->stack->stack_data[st->start+2])); - int i,j; - for(i=st->start+3,j=0;i<st->end;i++,j++) - push_copy(st->stack,i); + int pos = conv_num (st, &(st->stack->stack_data[st->start + 2])); + int i, j; + for (i = st->start + 3, j = 0; i < st->end; i++, j++) + push_copy (st->stack, i); - push_val(st->stack,C_INT,j); // 引数の数をプッシュ - push_val(st->stack,C_INT,st->defsp); // 現在の基準スタックポインタをプッシュ - push_val(st->stack,C_INT,(int)st->script); // 現在のスクリプトをプッシュ - push_val(st->stack,C_RETINFO,st->pos); // 現在のスクリプト位置をプッシュ + push_val (st->stack, C_INT, j); // 引数の数をプッシュ + push_val (st->stack, C_INT, st->defsp); // 現在の基準スタックポインタをプッシュ + push_val (st->stack, C_INT, (int) st->script); // 現在のスクリプトをプッシュ + push_val (st->stack, C_RETINFO, st->pos); // 現在のスクリプト位置をプッシュ - st->pos=pos; - st->defsp=st->start+4+j; - st->state=GOTO; - return 0; + st->pos = pos; + st->defsp = st->start + 4 + j; + st->state = GOTO; + return 0; } /*========================================== * 引数の所得 *------------------------------------------ */ -int buildin_getarg(struct script_state *st) +int buildin_getarg (struct script_state *st) { - int num=conv_num(st,& (st->stack->stack_data[st->start+2])); - int max,stsp; - if( st->defsp<4 || st->stack->stack_data[st->defsp-1].type!=C_RETINFO ){ - printf("script:getarg without callfunc or callsub!\n"); - st->state=END; - return 0; - } - max=conv_num(st,& (st->stack->stack_data[st->defsp-4])); - stsp=st->defsp - max -4; - if( num >= max ){ - printf("script:getarg arg1(%d) out of range(%d) !\n",num,max); - st->state=END; - return 0; - } - push_copy(st->stack,stsp+num); - return 0; + int num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + int max, stsp; + if (st->defsp < 4 + || st->stack->stack_data[st->defsp - 1].type != C_RETINFO) + { + printf ("script:getarg without callfunc or callsub!\n"); + st->state = END; + return 0; + } + max = conv_num (st, &(st->stack->stack_data[st->defsp - 4])); + stsp = st->defsp - max - 4; + if (num >= max) + { + printf ("script:getarg arg1(%d) out of range(%d) !\n", num, max); + st->state = END; + return 0; + } + push_copy (st->stack, stsp + num); + return 0; } /*========================================== * サブルーチン/ユーザー定義関数の終了 *------------------------------------------ */ -int buildin_return(struct script_state *st) +int buildin_return (struct script_state *st) { - if(st->end>st->start+2){ // 戻り値有り - push_copy(st->stack,st->start+2); - } - st->state=RETFUNC; - return 0; + if (st->end > st->start + 2) + { // 戻り値有り + push_copy (st->stack, st->start + 2); + } + st->state = RETFUNC; + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_next(struct script_state *st) +int buildin_next (struct script_state *st) { - st->state=STOP; - clif_scriptnext(script_rid2sd(st),st->oid); - return 0; + st->state = STOP; + clif_scriptnext (script_rid2sd (st), st->oid); + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_close(struct script_state *st) +int buildin_close (struct script_state *st) { - st->state=END; - clif_scriptclose(script_rid2sd(st),st->oid); - return 0; + st->state = END; + clif_scriptclose (script_rid2sd (st), st->oid); + return 0; } -int buildin_close2(struct script_state *st) + +int buildin_close2 (struct script_state *st) { - st->state=STOP; - clif_scriptclose(script_rid2sd(st),st->oid); - return 0; + st->state = STOP; + clif_scriptclose (script_rid2sd (st), st->oid); + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_menu(struct script_state *st) +int buildin_menu (struct script_state *st) { - char *buf; - int i, len = 0; // [fate] len is the total # of bytes we need to transmit the string choices - int menu_choices = 0; - int finished_menu_items = 0; // [fate] set to 1 after we hit the first empty string + char *buf; + int i, len = 0; // [fate] len is the total # of bytes we need to transmit the string choices + int menu_choices = 0; + int finished_menu_items = 0; // [fate] set to 1 after we hit the first empty string - struct map_session_data *sd; - - sd=script_rid2sd(st); + struct map_session_data *sd; - // We don't need to do this iteration if the player cancels, strictly speaking. - for (i = st->start+2; i < st->end; i += 2) { - int choice_len; - conv_str(st,& (st->stack->stack_data[i])); - choice_len = strlen(st->stack->stack_data[i].u.str); - len += choice_len + 1; // count # of bytes we'll need for packet. Only used if menu_or_input = 0. + sd = script_rid2sd (st); - if (choice_len && !finished_menu_items) - ++menu_choices; - else - finished_menu_items = 1; - } + // We don't need to do this iteration if the player cancels, strictly speaking. + for (i = st->start + 2; i < st->end; i += 2) + { + int choice_len; + conv_str (st, &(st->stack->stack_data[i])); + choice_len = strlen (st->stack->stack_data[i].u.str); + len += choice_len + 1; // count # of bytes we'll need for packet. Only used if menu_or_input = 0. - if(sd->state.menu_or_input==0){ - st->state=RERUNLINE; - sd->state.menu_or_input=1; + if (choice_len && !finished_menu_items) + ++menu_choices; + else + finished_menu_items = 1; + } - buf=(char *)aCalloc(len + 1, sizeof(char)); - buf[0]=0; - for(i=st->start+2; menu_choices > 0; i+=2, --menu_choices){ - strcat(buf,st->stack->stack_data[i].u.str); - strcat(buf,":"); - } - clif_scriptmenu(script_rid2sd(st),st->oid,buf); - free(buf); - } else if(sd->npc_menu==0xff){ // cansel - sd->state.menu_or_input=0; - st->state=END; - } else { // goto動作 - // ragemu互換のため - pc_setreg(sd,add_str("l15"),sd->npc_menu); - pc_setreg(sd,add_str("@menu"),sd->npc_menu); - sd->state.menu_or_input=0; - if(sd->npc_menu > 0 && sd->npc_menu <= menu_choices){ - int pos; - if( st->stack->stack_data[st->start+sd->npc_menu*2+1].type!=C_POS ){ - st->state=END; - return 0; - } - pos=conv_num(st,& (st->stack->stack_data[st->start+sd->npc_menu*2+1])); - st->pos=pos; - st->state=GOTO; - } - } - return 0; + if (sd->state.menu_or_input == 0) + { + st->state = RERUNLINE; + sd->state.menu_or_input = 1; + + buf = (char *) aCalloc (len + 1, sizeof (char)); + buf[0] = 0; + for (i = st->start + 2; menu_choices > 0; i += 2, --menu_choices) + { + strcat (buf, st->stack->stack_data[i].u.str); + strcat (buf, ":"); + } + clif_scriptmenu (script_rid2sd (st), st->oid, buf); + free (buf); + } + else if (sd->npc_menu == 0xff) + { // cansel + sd->state.menu_or_input = 0; + st->state = END; + } + else + { // goto動作 + // ragemu互換のため + pc_setreg (sd, add_str ("l15"), sd->npc_menu); + pc_setreg (sd, add_str ("@menu"), sd->npc_menu); + sd->state.menu_or_input = 0; + if (sd->npc_menu > 0 && sd->npc_menu <= menu_choices) + { + int pos; + if (st->stack-> + stack_data[st->start + sd->npc_menu * 2 + 1].type != C_POS) + { + st->state = END; + return 0; + } + pos = + conv_num (st, + &(st-> + stack->stack_data[st->start + sd->npc_menu * 2 + + 1])); + st->pos = pos; + st->state = GOTO; + } + } + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_rand(struct script_state *st) +int buildin_rand (struct script_state *st) { - int range,min,max; + int range, min, max; - if(st->end>st->start+3){ - min=conv_num(st,& (st->stack->stack_data[st->start+2])); - max=conv_num(st,& (st->stack->stack_data[st->start+3])); - if(max<min){ - int tmp; - tmp=min; - min=max; - max=tmp; - } - range=max-min+1; - push_val(st->stack,C_INT,(range <= 0 ? 0 : MRAND(range)) + min); - } else { - range=conv_num(st,& (st->stack->stack_data[st->start+2])); - push_val(st->stack,C_INT,range <= 0 ? 0 : MRAND(range)); - } - return 0; + if (st->end > st->start + 3) + { + min = conv_num (st, &(st->stack->stack_data[st->start + 2])); + max = conv_num (st, &(st->stack->stack_data[st->start + 3])); + if (max < min) + { + int tmp; + tmp = min; + min = max; + max = tmp; + } + range = max - min + 1; + push_val (st->stack, C_INT, (range <= 0 ? 0 : MRAND (range)) + min); + } + else + { + range = conv_num (st, &(st->stack->stack_data[st->start + 2])); + push_val (st->stack, C_INT, range <= 0 ? 0 : MRAND (range)); + } + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_pow(struct script_state *st) +int buildin_pow (struct script_state *st) { - int a, b; + int a, b; - a = conv_num(st,& (st->stack->stack_data[st->start+2])); - b = conv_num(st,& (st->stack->stack_data[st->start+3])); + a = conv_num (st, &(st->stack->stack_data[st->start + 2])); + b = conv_num (st, &(st->stack->stack_data[st->start + 3])); - push_val(st->stack, C_INT, (int) pow(a * 0.001, b)); + push_val (st->stack, C_INT, (int) pow (a * 0.001, b)); - return 0; + return 0; } /*========================================== * Check whether the PC is at the specified location *------------------------------------------ */ -int buildin_isat(struct script_state *st) +int buildin_isat (struct script_state *st) { - int x,y; - char *str; - struct map_session_data *sd=script_rid2sd(st); + int x, y; + char *str; + struct map_session_data *sd = script_rid2sd (st); - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - x=conv_num(st,& (st->stack->stack_data[st->start+3])); - y=conv_num(st,& (st->stack->stack_data[st->start+4])); + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y = conv_num (st, &(st->stack->stack_data[st->start + 4])); - if (!sd) - return 1; + if (!sd) + return 1; - push_val(st->stack, C_INT, - (x == sd->bl.x) - && (y == sd->bl.y) - && (!strcmp(str, map[sd->bl.m].name))); + push_val (st->stack, C_INT, + (x == sd->bl.x) + && (y == sd->bl.y) && (!strcmp (str, map[sd->bl.m].name))); - return 0; + return 0; } + /*========================================== * *------------------------------------------ */ -int buildin_warp(struct script_state *st) +int buildin_warp (struct script_state *st) { - int x,y; - char *str; - struct map_session_data *sd=script_rid2sd(st); + int x, y; + char *str; + struct map_session_data *sd = script_rid2sd (st); - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - x=conv_num(st,& (st->stack->stack_data[st->start+3])); - y=conv_num(st,& (st->stack->stack_data[st->start+4])); - if(strcmp(str,"Random")==0) - pc_randomwarp(sd,3); - else if(strcmp(str,"SavePoint")==0){ - if(map[sd->bl.m].flag.noreturn) // 蝶禁止 - return 0; + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y = conv_num (st, &(st->stack->stack_data[st->start + 4])); + if (strcmp (str, "Random") == 0) + pc_randomwarp (sd, 3); + else if (strcmp (str, "SavePoint") == 0) + { + if (map[sd->bl.m].flag.noreturn) // 蝶禁止 + return 0; - pc_setpos(sd,sd->status.save_point.map, - sd->status.save_point.x,sd->status.save_point.y,3); - }else if(strcmp(str,"Save")==0){ - if(map[sd->bl.m].flag.noreturn) // 蝶禁止 - return 0; + pc_setpos (sd, sd->status.save_point.map, + sd->status.save_point.x, sd->status.save_point.y, 3); + } + else if (strcmp (str, "Save") == 0) + { + if (map[sd->bl.m].flag.noreturn) // 蝶禁止 + return 0; - pc_setpos(sd,sd->status.save_point.map, - sd->status.save_point.x,sd->status.save_point.y,3); - }else - pc_setpos(sd,str,x,y,0); - return 0; + pc_setpos (sd, sd->status.save_point.map, + sd->status.save_point.x, sd->status.save_point.y, 3); + } + else + pc_setpos (sd, str, x, y, 0); + return 0; } + /*========================================== * エリア指定ワープ *------------------------------------------ */ -int buildin_areawarp_sub(struct block_list *bl,va_list ap) +int buildin_areawarp_sub (struct block_list *bl, va_list ap) { - int x,y; - char *map; - map=va_arg(ap, char *); - x=va_arg(ap,int); - y=va_arg(ap,int); - if(strcmp(map,"Random")==0) - pc_randomwarp((struct map_session_data *)bl,3); - else - pc_setpos((struct map_session_data *)bl,map,x,y,0); - return 0; + int x, y; + char *map; + map = va_arg (ap, char *); + x = va_arg (ap, int); + y = va_arg (ap, int); + if (strcmp (map, "Random") == 0) + pc_randomwarp ((struct map_session_data *) bl, 3); + else + pc_setpos ((struct map_session_data *) bl, map, x, y, 0); + return 0; } -int buildin_areawarp(struct script_state *st) + +int buildin_areawarp (struct script_state *st) { - int x,y,m; - char *str; - char *mapname; - int x0,y0,x1,y1; + int x, y, m; + char *str; + char *mapname; + int x0, y0, x1, y1; - mapname=conv_str(st,& (st->stack->stack_data[st->start+2])); - x0=conv_num(st,& (st->stack->stack_data[st->start+3])); - y0=conv_num(st,& (st->stack->stack_data[st->start+4])); - x1=conv_num(st,& (st->stack->stack_data[st->start+5])); - y1=conv_num(st,& (st->stack->stack_data[st->start+6])); - str=conv_str(st,& (st->stack->stack_data[st->start+7])); - x=conv_num(st,& (st->stack->stack_data[st->start+8])); - y=conv_num(st,& (st->stack->stack_data[st->start+9])); + mapname = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x0 = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y0 = conv_num (st, &(st->stack->stack_data[st->start + 4])); + x1 = conv_num (st, &(st->stack->stack_data[st->start + 5])); + y1 = conv_num (st, &(st->stack->stack_data[st->start + 6])); + str = conv_str (st, &(st->stack->stack_data[st->start + 7])); + x = conv_num (st, &(st->stack->stack_data[st->start + 8])); + y = conv_num (st, &(st->stack->stack_data[st->start + 9])); - if( (m=map_mapname2mapid(mapname))< 0) - return 0; + if ((m = map_mapname2mapid (mapname)) < 0) + return 0; - map_foreachinarea(buildin_areawarp_sub, - m,x0,y0,x1,y1,BL_PC, str,x,y ); - return 0; + map_foreachinarea (buildin_areawarp_sub, + m, x0, y0, x1, y1, BL_PC, str, x, y); + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_heal(struct script_state *st) +int buildin_heal (struct script_state *st) { - int hp,sp; + int hp, sp; - hp=conv_num(st,& (st->stack->stack_data[st->start+2])); - sp=conv_num(st,& (st->stack->stack_data[st->start+3])); - pc_heal(script_rid2sd(st),hp,sp); - return 0; + hp = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sp = conv_num (st, &(st->stack->stack_data[st->start + 3])); + pc_heal (script_rid2sd (st), hp, sp); + return 0; } + /*========================================== * *------------------------------------------ */ -int buildin_itemheal(struct script_state *st) +int buildin_itemheal (struct script_state *st) { - int hp,sp; + int hp, sp; - hp=conv_num(st,& (st->stack->stack_data[st->start+2])); - sp=conv_num(st,& (st->stack->stack_data[st->start+3])); - pc_itemheal(script_rid2sd(st),hp,sp); - return 0; + hp = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sp = conv_num (st, &(st->stack->stack_data[st->start + 3])); + pc_itemheal (script_rid2sd (st), hp, sp); + return 0; } + /*========================================== * *------------------------------------------ */ -int buildin_percentheal(struct script_state *st) +int buildin_percentheal (struct script_state *st) { - int hp,sp; + int hp, sp; - hp=conv_num(st,& (st->stack->stack_data[st->start+2])); - sp=conv_num(st,& (st->stack->stack_data[st->start+3])); - pc_percentheal(script_rid2sd(st),hp,sp); - return 0; + hp = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sp = conv_num (st, &(st->stack->stack_data[st->start + 3])); + pc_percentheal (script_rid2sd (st), hp, sp); + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_jobchange(struct script_state *st) +int buildin_jobchange (struct script_state *st) { - int job, upper=-1; + int job, upper = -1; - job=conv_num(st,& (st->stack->stack_data[st->start+2])); - if( st->end>st->start+3 ) - upper=conv_num(st,& (st->stack->stack_data[st->start+3])); + job = conv_num (st, &(st->stack->stack_data[st->start + 2])); + if (st->end > st->start + 3) + upper = conv_num (st, &(st->stack->stack_data[st->start + 3])); - if ((job >= 0 && job < MAX_PC_CLASS)) - pc_jobchange(script_rid2sd(st),job, upper); + if ((job >= 0 && job < MAX_PC_CLASS)) + pc_jobchange (script_rid2sd (st), job, upper); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_input(struct script_state *st) -{ - struct map_session_data *sd=NULL; - int num=(st->end>st->start+2)?st->stack->stack_data[st->start+2].u.num:0; - char *name=(st->end>st->start+2)?str_buf+str_data[num&0x00ffffff].str:""; -// char prefix=*name; - char postfix=name[strlen(name)-1]; - - sd=script_rid2sd(st); - if(sd->state.menu_or_input){ - sd->state.menu_or_input=0; - if( postfix=='$' ){ - // 文字列 - if(st->end>st->start+2){ // 引数1個 - set_reg(sd,num,name,(void*)sd->npc_str); - }else{ - printf("buildin_input: string discarded !!\n"); - } - }else{ - - //commented by Lupus (check Value Number Input fix in clif.c) - //** Fix by fritz :X keeps people from abusing old input bugs - if(sd->npc_amount < 0) //** If input amount is less then 0 - { - clif_tradecancelled(sd); // added "Deal has been cancelled" message by Valaris - buildin_close(st); //** close - } - - // 数値 - if(st->end>st->start+2){ // 引数1個 - set_reg(sd,num,name,(void*)sd->npc_amount); - } else { - // ragemu互換のため - pc_setreg(sd,add_str("l14"),sd->npc_amount); - } - } - } else { - st->state=RERUNLINE; - if(postfix=='$')clif_scriptinputstr(sd,st->oid); - else clif_scriptinput(sd,st->oid); - sd->state.menu_or_input=1; - } - return 0; +int buildin_input (struct script_state *st) +{ + struct map_session_data *sd = NULL; + int num = + (st->end > + st->start + 2) ? st->stack->stack_data[st->start + 2].u.num : 0; + char *name = + (st->end > + st->start + 2) ? str_buf + str_data[num & 0x00ffffff].str : ""; +// char prefix=*name; + char postfix = name[strlen (name) - 1]; + + sd = script_rid2sd (st); + if (sd->state.menu_or_input) + { + sd->state.menu_or_input = 0; + if (postfix == '$') + { + // 文字列 + if (st->end > st->start + 2) + { // 引数1個 + set_reg (sd, num, name, (void *) sd->npc_str); + } + else + { + printf ("buildin_input: string discarded !!\n"); + } + } + else + { + + //commented by Lupus (check Value Number Input fix in clif.c) + //** Fix by fritz :X keeps people from abusing old input bugs + if (sd->npc_amount < 0) //** If input amount is less then 0 + { + clif_tradecancelled (sd); // added "Deal has been cancelled" message by Valaris + buildin_close (st); //** close + } + + // 数値 + if (st->end > st->start + 2) + { // 引数1個 + set_reg (sd, num, name, (void *) sd->npc_amount); + } + else + { + // ragemu互換のため + pc_setreg (sd, add_str ("l14"), sd->npc_amount); + } + } + } + else + { + st->state = RERUNLINE; + if (postfix == '$') + clif_scriptinputstr (sd, st->oid); + else + clif_scriptinput (sd, st->oid); + sd->state.menu_or_input = 1; + } + return 0; } - /*========================================== * *------------------------------------------ */ -int buildin_if(struct script_state *st) +int buildin_if (struct script_state *st) { - int sel,i; + int sel, i; - sel=conv_num(st,& (st->stack->stack_data[st->start+2])); - if(!sel) - return 0; + sel = conv_num (st, &(st->stack->stack_data[st->start + 2])); + if (!sel) + return 0; - // 関数名をコピー - push_copy(st->stack,st->start+3); - // 間に引数マーカを入れて - push_val(st->stack,C_ARG,0); - // 残りの引数をコピー - for(i=st->start+4;i<st->end;i++){ - push_copy(st->stack,i); - } - run_func(st); + // 関数名をコピー + push_copy (st->stack, st->start + 3); + // 間に引数マーカを入れて + push_val (st->stack, C_ARG, 0); + // 残りの引数をコピー + for (i = st->start + 4; i < st->end; i++) + { + push_copy (st->stack, i); + } + run_func (st); - return 0; + return 0; } - /*========================================== * 変数設定 *------------------------------------------ */ -int buildin_set(struct script_state *st) +int buildin_set (struct script_state *st) { - struct map_session_data *sd=NULL; - int num=st->stack->stack_data[st->start+2].u.num; - char *name=str_buf+str_data[num&0x00ffffff].str; - char prefix=*name; - char postfix=name[strlen(name)-1]; - - if( st->stack->stack_data[st->start+2].type!=C_NAME ){ - printf("script: buildin_set: not name\n"); - return 0; - } + struct map_session_data *sd = NULL; + int num = st->stack->stack_data[st->start + 2].u.num; + char *name = str_buf + str_data[num & 0x00ffffff].str; + char prefix = *name; + char postfix = name[strlen (name) - 1]; - if( prefix!='$' ) - sd=script_rid2sd(st); + if (st->stack->stack_data[st->start + 2].type != C_NAME) + { + printf ("script: buildin_set: not name\n"); + return 0; + } + if (prefix != '$') + sd = script_rid2sd (st); - if( postfix=='$' ){ - // 文字列 - char *str = conv_str(st,& (st->stack->stack_data[st->start+3])); - set_reg(sd,num,name,(void*)str); - }else{ - // 数値 - int val = conv_num(st,& (st->stack->stack_data[st->start+3])); - set_reg(sd,num,name,(void*)val); - } + if (postfix == '$') + { + // 文字列 + char *str = conv_str (st, &(st->stack->stack_data[st->start + 3])); + set_reg (sd, num, name, (void *) str); + } + else + { + // 数値 + int val = conv_num (st, &(st->stack->stack_data[st->start + 3])); + set_reg (sd, num, name, (void *) val); + } - return 0; + return 0; } + /*========================================== * 配列変数設定 *------------------------------------------ */ -int buildin_setarray(struct script_state *st) +int buildin_setarray (struct script_state *st) { - struct map_session_data *sd=NULL; - int num=st->stack->stack_data[st->start+2].u.num; - char *name=str_buf+str_data[num&0x00ffffff].str; - char prefix=*name; - char postfix=name[strlen(name)-1]; - int i,j; - - if( prefix!='$' && prefix!='@' ){ - printf("buildin_setarray: illegal scope !\n"); - return 0; - } - if( prefix!='$' ) - sd=script_rid2sd(st); - - for(j=0,i=st->start+3; i<st->end && j<128;i++,j++){ - void *v; - if( postfix=='$' ) - v=(void*)conv_str(st,& (st->stack->stack_data[i])); - else - v=(void*)conv_num(st,& (st->stack->stack_data[i])); - set_reg( sd, num+(j<<24), name, v); - } - return 0; + struct map_session_data *sd = NULL; + int num = st->stack->stack_data[st->start + 2].u.num; + char *name = str_buf + str_data[num & 0x00ffffff].str; + char prefix = *name; + char postfix = name[strlen (name) - 1]; + int i, j; + + if (prefix != '$' && prefix != '@') + { + printf ("buildin_setarray: illegal scope !\n"); + return 0; + } + if (prefix != '$') + sd = script_rid2sd (st); + + for (j = 0, i = st->start + 3; i < st->end && j < 128; i++, j++) + { + void *v; + if (postfix == '$') + v = (void *) conv_str (st, &(st->stack->stack_data[i])); + else + v = (void *) conv_num (st, &(st->stack->stack_data[i])); + set_reg (sd, num + (j << 24), name, v); + } + return 0; } + /*========================================== * 配列変数クリア *------------------------------------------ */ -int buildin_cleararray(struct script_state *st) +int buildin_cleararray (struct script_state *st) { - struct map_session_data *sd=NULL; - int num=st->stack->stack_data[st->start+2].u.num; - char *name=str_buf+str_data[num&0x00ffffff].str; - char prefix=*name; - char postfix=name[strlen(name)-1]; - int sz=conv_num(st,& (st->stack->stack_data[st->start+4])); - int i; - void *v; - - if( prefix!='$' && prefix!='@' ){ - printf("buildin_cleararray: illegal scope !\n"); - return 0; - } - if( prefix!='$' ) - sd=script_rid2sd(st); + struct map_session_data *sd = NULL; + int num = st->stack->stack_data[st->start + 2].u.num; + char *name = str_buf + str_data[num & 0x00ffffff].str; + char prefix = *name; + char postfix = name[strlen (name) - 1]; + int sz = conv_num (st, &(st->stack->stack_data[st->start + 4])); + int i; + void *v; + + if (prefix != '$' && prefix != '@') + { + printf ("buildin_cleararray: illegal scope !\n"); + return 0; + } + if (prefix != '$') + sd = script_rid2sd (st); - if( postfix=='$' ) - v=(void*)conv_str(st,& (st->stack->stack_data[st->start+3])); - else - v=(void*)conv_num(st,& (st->stack->stack_data[st->start+3])); + if (postfix == '$') + v = (void *) conv_str (st, &(st->stack->stack_data[st->start + 3])); + else + v = (void *) conv_num (st, &(st->stack->stack_data[st->start + 3])); - for(i=0;i<sz;i++) - set_reg(sd,num+(i<<24),name,v); - return 0; + for (i = 0; i < sz; i++) + set_reg (sd, num + (i << 24), name, v); + return 0; } + /*========================================== * 配列変数コピー *------------------------------------------ */ -int buildin_copyarray(struct script_state *st) +int buildin_copyarray (struct script_state *st) { - struct map_session_data *sd=NULL; - int num=st->stack->stack_data[st->start+2].u.num; - char *name=str_buf+str_data[num&0x00ffffff].str; - char prefix=*name; - char postfix=name[strlen(name)-1]; - int num2=st->stack->stack_data[st->start+3].u.num; - char *name2=str_buf+str_data[num2&0x00ffffff].str; - char prefix2=*name2; - char postfix2=name2[strlen(name2)-1]; - int sz=conv_num(st,& (st->stack->stack_data[st->start+4])); - int i; - - if( prefix!='$' && prefix!='@' && prefix2!='$' && prefix2!='@' ){ - printf("buildin_copyarray: illegal scope !\n"); - return 0; - } - if( (postfix=='$' || postfix2=='$') && postfix!=postfix2 ){ - printf("buildin_copyarray: type mismatch !\n"); - return 0; - } - if( prefix!='$' || prefix2!='$' ) - sd=script_rid2sd(st); + struct map_session_data *sd = NULL; + int num = st->stack->stack_data[st->start + 2].u.num; + char *name = str_buf + str_data[num & 0x00ffffff].str; + char prefix = *name; + char postfix = name[strlen (name) - 1]; + int num2 = st->stack->stack_data[st->start + 3].u.num; + char *name2 = str_buf + str_data[num2 & 0x00ffffff].str; + char prefix2 = *name2; + char postfix2 = name2[strlen (name2) - 1]; + int sz = conv_num (st, &(st->stack->stack_data[st->start + 4])); + int i; + if (prefix != '$' && prefix != '@' && prefix2 != '$' && prefix2 != '@') + { + printf ("buildin_copyarray: illegal scope !\n"); + return 0; + } + if ((postfix == '$' || postfix2 == '$') && postfix != postfix2) + { + printf ("buildin_copyarray: type mismatch !\n"); + return 0; + } + if (prefix != '$' || prefix2 != '$') + sd = script_rid2sd (st); - for(i=0;i<sz;i++) - set_reg(sd,num+(i<<24),name, get_val2(st,num2+(i<<24)) ); - return 0; + for (i = 0; i < sz; i++) + set_reg (sd, num + (i << 24), name, get_val2 (st, num2 + (i << 24))); + return 0; } + /*========================================== * 配列変数のサイズ所得 *------------------------------------------ */ -static int getarraysize(struct script_state *st,int num,int postfix) +static int getarraysize (struct script_state *st, int num, int postfix) { - int i=(num>>24),c=i; - for(;i<128;i++){ - void *v=get_val2(st,num+(i<<24)); - if(postfix=='$' && *((char*)v) ) c=i; - if(postfix!='$' && (int)v )c=i; - } - return c+1; + int i = (num >> 24), c = i; + for (; i < 128; i++) + { + void *v = get_val2 (st, num + (i << 24)); + if (postfix == '$' && *((char *) v)) + c = i; + if (postfix != '$' && (int) v) + c = i; + } + return c + 1; } -int buildin_getarraysize(struct script_state *st) + +int buildin_getarraysize (struct script_state *st) { - int num=st->stack->stack_data[st->start+2].u.num; - char *name=str_buf+str_data[num&0x00ffffff].str; - char prefix=*name; - char postfix=name[strlen(name)-1]; + int num = st->stack->stack_data[st->start + 2].u.num; + char *name = str_buf + str_data[num & 0x00ffffff].str; + char prefix = *name; + char postfix = name[strlen (name) - 1]; - if( prefix!='$' && prefix!='@' ){ - printf("buildin_copyarray: illegal scope !\n"); - return 0; - } + if (prefix != '$' && prefix != '@') + { + printf ("buildin_copyarray: illegal scope !\n"); + return 0; + } - push_val(st->stack,C_INT,getarraysize(st,num,postfix) ); - return 0; + push_val (st->stack, C_INT, getarraysize (st, num, postfix)); + return 0; } + /*========================================== * 配列変数から要素削除 *------------------------------------------ */ -int buildin_deletearray(struct script_state *st) +int buildin_deletearray (struct script_state *st) { - struct map_session_data *sd=NULL; - int num=st->stack->stack_data[st->start+2].u.num; - char *name=str_buf+str_data[num&0x00ffffff].str; - char prefix=*name; - char postfix=name[strlen(name)-1]; - int count=1; - int i,sz=getarraysize(st,num,postfix)-(num>>24)-count+1; - + struct map_session_data *sd = NULL; + int num = st->stack->stack_data[st->start + 2].u.num; + char *name = str_buf + str_data[num & 0x00ffffff].str; + char prefix = *name; + char postfix = name[strlen (name) - 1]; + int count = 1; + int i, sz = getarraysize (st, num, postfix) - (num >> 24) - count + 1; - if( (st->end > st->start+3) ) - count=conv_num(st,& (st->stack->stack_data[st->start+3])); + if ((st->end > st->start + 3)) + count = conv_num (st, &(st->stack->stack_data[st->start + 3])); - if( prefix!='$' && prefix!='@' ){ - printf("buildin_deletearray: illegal scope !\n"); - return 0; - } - if( prefix!='$' ) - sd=script_rid2sd(st); - - for(i=0;i<sz;i++){ - set_reg(sd,num+(i<<24),name, get_val2(st,num+((i+count)<<24) ) ); - } - for(;i<(128-(num>>24));i++){ - if( postfix!='$' ) set_reg(sd,num+(i<<24),name, 0); - if( postfix=='$' ) set_reg(sd,num+(i<<24),name, ""); - } - return 0; + if (prefix != '$' && prefix != '@') + { + printf ("buildin_deletearray: illegal scope !\n"); + return 0; + } + if (prefix != '$') + sd = script_rid2sd (st); + + for (i = 0; i < sz; i++) + { + set_reg (sd, num + (i << 24), name, + get_val2 (st, num + ((i + count) << 24))); + } + for (; i < (128 - (num >> 24)); i++) + { + if (postfix != '$') + set_reg (sd, num + (i << 24), name, 0); + if (postfix == '$') + set_reg (sd, num + (i << 24), name, ""); + } + return 0; } /*========================================== * 指定要素を表す値(キー)を所得する *------------------------------------------ */ -int buildin_getelementofarray(struct script_state *st) +int buildin_getelementofarray (struct script_state *st) { - if( st->stack->stack_data[st->start+2].type==C_NAME ){ - int i=conv_num(st,& (st->stack->stack_data[st->start+3])); - if(i>127 || i<0){ - printf("script: getelementofarray (operator[]): param2 illegal number %d\n",i); - push_val(st->stack,C_INT,0); - }else{ - push_val(st->stack,C_NAME, - (i<<24) | st->stack->stack_data[st->start+2].u.num ); - } - }else{ - printf("script: getelementofarray (operator[]): param1 not name !\n"); - push_val(st->stack,C_INT,0); - } - return 0; + if (st->stack->stack_data[st->start + 2].type == C_NAME) + { + int i = conv_num (st, &(st->stack->stack_data[st->start + 3])); + if (i > 127 || i < 0) + { + printf + ("script: getelementofarray (operator[]): param2 illegal number %d\n", + i); + push_val (st->stack, C_INT, 0); + } + else + { + push_val (st->stack, C_NAME, + (i << 24) | st->stack->stack_data[st->start + 2].u.num); + } + } + else + { + printf + ("script: getelementofarray (operator[]): param1 not name !\n"); + push_val (st->stack, C_INT, 0); + } + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_setlook(struct script_state *st) +int buildin_setlook (struct script_state *st) { - int type,val; + int type, val; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - val=conv_num(st,& (st->stack->stack_data[st->start+3])); + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + val = conv_num (st, &(st->stack->stack_data[st->start + 3])); - pc_changelook(script_rid2sd(st),type,val); + pc_changelook (script_rid2sd (st), type, val); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_cutin(struct script_state *st) +int buildin_cutin (struct script_state *st) { - int type; + int type; - conv_str(st,& (st->stack->stack_data[st->start+2])); - type=conv_num(st,& (st->stack->stack_data[st->start+3])); + conv_str (st, &(st->stack->stack_data[st->start + 2])); + type = conv_num (st, &(st->stack->stack_data[st->start + 3])); - clif_cutin(script_rid2sd(st),st->stack->stack_data[st->start+2].u.str,type); + clif_cutin (script_rid2sd (st), + st->stack->stack_data[st->start + 2].u.str, type); - return 0; + return 0; } + /*========================================== * カードのイラストを表示する *------------------------------------------ */ -int buildin_cutincard(struct script_state *st) +int buildin_cutincard (struct script_state *st) { - int itemid; + int itemid; - itemid=conv_num(st,& (st->stack->stack_data[st->start+2])); + itemid = conv_num (st, &(st->stack->stack_data[st->start + 2])); - clif_cutin(script_rid2sd(st),itemdb_search(itemid)->cardillustname,4); + clif_cutin (script_rid2sd (st), itemdb_search (itemid)->cardillustname, + 4); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_viewpoint(struct script_state *st) +int buildin_viewpoint (struct script_state *st) { - int type,x,y,id,color; + int type, x, y, id, color; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - x=conv_num(st,& (st->stack->stack_data[st->start+3])); - y=conv_num(st,& (st->stack->stack_data[st->start+4])); - id=conv_num(st,& (st->stack->stack_data[st->start+5])); - color=conv_num(st,& (st->stack->stack_data[st->start+6])); + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + x = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y = conv_num (st, &(st->stack->stack_data[st->start + 4])); + id = conv_num (st, &(st->stack->stack_data[st->start + 5])); + color = conv_num (st, &(st->stack->stack_data[st->start + 6])); - clif_viewpoint(script_rid2sd(st),st->oid,type,x,y,id,color); + clif_viewpoint (script_rid2sd (st), st->oid, type, x, y, id, color); - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_countitem(struct script_state *st) +int buildin_countitem (struct script_state *st) { - int nameid=0,count=0,i; - struct map_session_data *sd; + int nameid = 0, count = 0, i; + struct map_session_data *sd; - struct script_data *data; + struct script_data *data; - sd = script_rid2sd(st); + sd = script_rid2sd (st); - data=&(st->stack->stack_data[st->start+2]); - get_val(st,data); - if( data->type==C_STR || data->type==C_CONSTSTR ){ - const char *name=conv_str(st,data); - struct item_data *item_data; - if( (item_data = itemdb_searchname(name)) != NULL) - nameid=item_data->nameid; - }else - nameid=conv_num(st,data); + data = &(st->stack->stack_data[st->start + 2]); + get_val (st, data); + if (data->type == C_STR || data->type == C_CONSTSTR) + { + const char *name = conv_str (st, data); + struct item_data *item_data; + if ((item_data = itemdb_searchname (name)) != NULL) + nameid = item_data->nameid; + } + else + nameid = conv_num (st, data); - if (nameid>=500) //if no such ID then skip this iteration - for(i=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].nameid==nameid) - count+=sd->status.inventory[i].amount; - } - else{ - if(battle_config.error_log) - printf("wrong item ID : countitem(%i)\n",nameid); - } - push_val(st->stack,C_INT,count); + if (nameid >= 500) //if no such ID then skip this iteration + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid == nameid) + count += sd->status.inventory[i].amount; + } + else + { + if (battle_config.error_log) + printf ("wrong item ID : countitem(%i)\n", nameid); + } + push_val (st->stack, C_INT, count); - return 0; + return 0; } /*========================================== * 重量チェック *------------------------------------------ */ -int buildin_checkweight(struct script_state *st) +int buildin_checkweight (struct script_state *st) { - int nameid=0,amount; - struct map_session_data *sd; - struct script_data *data; + int nameid = 0, amount; + struct map_session_data *sd; + struct script_data *data; - sd = script_rid2sd(st); + sd = script_rid2sd (st); - data=&(st->stack->stack_data[st->start+2]); - get_val(st,data); - if( data->type==C_STR || data->type==C_CONSTSTR ){ - const char *name=conv_str(st,data); - struct item_data *item_data = itemdb_searchname(name); - if( item_data ) - nameid=item_data->nameid; - }else - nameid=conv_num(st,data); + data = &(st->stack->stack_data[st->start + 2]); + get_val (st, data); + if (data->type == C_STR || data->type == C_CONSTSTR) + { + const char *name = conv_str (st, data); + struct item_data *item_data = itemdb_searchname (name); + if (item_data) + nameid = item_data->nameid; + } + else + nameid = conv_num (st, data); - amount=conv_num(st,& (st->stack->stack_data[st->start+3])); - if ( amount<=0 || nameid<500 ) { //if get wrong item ID or amount<=0, don't count weight of non existing items - push_val(st->stack,C_INT,0); - } + amount = conv_num (st, &(st->stack->stack_data[st->start + 3])); + if (amount <= 0 || nameid < 500) + { //if get wrong item ID or amount<=0, don't count weight of non existing items + push_val (st->stack, C_INT, 0); + } - sd=script_rid2sd(st); - if(itemdb_weight(nameid)*amount + sd->weight > sd->max_weight){ - push_val(st->stack,C_INT,0); - } else { - push_val(st->stack,C_INT,1); - } + sd = script_rid2sd (st); + if (itemdb_weight (nameid) * amount + sd->weight > sd->max_weight) + { + push_val (st->stack, C_INT, 0); + } + else + { + push_val (st->stack, C_INT, 1); + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_getitem(struct script_state *st) -{ - int nameid,amount,flag = 0; - struct item item_tmp; - struct map_session_data *sd; - struct script_data *data; - - sd = script_rid2sd(st); - - data=&(st->stack->stack_data[st->start+2]); - get_val(st,data); - if( data->type==C_STR || data->type==C_CONSTSTR ){ - const char *name=conv_str(st,data); - struct item_data *item_data = itemdb_searchname(name); - nameid=727; //Default to iten - if( item_data != NULL) - nameid=item_data->nameid; - }else - nameid=conv_num(st,data); - - if ( ( amount=conv_num(st,& (st->stack->stack_data[st->start+3])) ) <= 0) { - return 0; //return if amount <=0, skip the useles iteration - } - //Violet Box, Blue Box, etc - random item pick - if(nameid<0) { // ランダム - nameid=itemdb_searchrandomid(-nameid); - flag = 1; - } - - if(nameid > 0) { - memset(&item_tmp,0,sizeof(item_tmp)); - item_tmp.nameid=nameid; - if(!flag) - item_tmp.identify=1; - else - item_tmp.identify=!itemdb_isequip3(nameid); - if( st->end>st->start+5 ) //アイテムを指定したIDに渡す - sd=map_id2sd(conv_num(st,& (st->stack->stack_data[st->start+5]))); - if(sd == NULL) //アイテムを渡す相手がいなかったらお帰り - return 0; - if((flag = pc_additem(sd,&item_tmp,amount))) { - clif_additem(sd,0,0,flag); - map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0); - } - } +int buildin_getitem (struct script_state *st) +{ + int nameid, amount, flag = 0; + struct item item_tmp; + struct map_session_data *sd; + struct script_data *data; + + sd = script_rid2sd (st); + + data = &(st->stack->stack_data[st->start + 2]); + get_val (st, data); + if (data->type == C_STR || data->type == C_CONSTSTR) + { + const char *name = conv_str (st, data); + struct item_data *item_data = itemdb_searchname (name); + nameid = 727; //Default to iten + if (item_data != NULL) + nameid = item_data->nameid; + } + else + nameid = conv_num (st, data); + + if ((amount = + conv_num (st, &(st->stack->stack_data[st->start + 3]))) <= 0) + { + return 0; //return if amount <=0, skip the useles iteration + } + //Violet Box, Blue Box, etc - random item pick + if (nameid < 0) + { // ランダム + nameid = itemdb_searchrandomid (-nameid); + flag = 1; + } + + if (nameid > 0) + { + memset (&item_tmp, 0, sizeof (item_tmp)); + item_tmp.nameid = nameid; + if (!flag) + item_tmp.identify = 1; + else + item_tmp.identify = !itemdb_isequip3 (nameid); + if (st->end > st->start + 5) //アイテムを指定したIDに渡す + sd = map_id2sd (conv_num + (st, &(st->stack->stack_data[st->start + 5]))); + if (sd == NULL) //アイテムを渡す相手がいなかったらお帰り + return 0; + if ((flag = pc_additem (sd, &item_tmp, amount))) + { + clif_additem (sd, 0, 0, flag); + map_addflooritem (&item_tmp, amount, sd->bl.m, sd->bl.x, sd->bl.y, + NULL, NULL, NULL, 0); + } + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_getitem2(struct script_state *st) -{ - int nameid,amount,flag = 0; - int iden,ref,attr,c1,c2,c3,c4; - struct item_data *item_data; - struct item item_tmp; - struct map_session_data *sd; - struct script_data *data; - - sd = script_rid2sd(st); - - data=&(st->stack->stack_data[st->start+2]); - get_val(st,data); - if( data->type==C_STR || data->type==C_CONSTSTR ){ - const char *name=conv_str(st,data); - struct item_data *item_data = itemdb_searchname(name); - nameid=512; //Apple item ID - if( item_data ) - nameid=item_data->nameid; - }else - nameid=conv_num(st,data); - - amount=conv_num(st,& (st->stack->stack_data[st->start+3])); - iden=conv_num(st,& (st->stack->stack_data[st->start+4])); - ref=conv_num(st,& (st->stack->stack_data[st->start+5])); - attr=conv_num(st,& (st->stack->stack_data[st->start+6])); - c1=conv_num(st,& (st->stack->stack_data[st->start+7])); - c2=conv_num(st,& (st->stack->stack_data[st->start+8])); - c3=conv_num(st,& (st->stack->stack_data[st->start+9])); - c4=conv_num(st,& (st->stack->stack_data[st->start+10])); - if( st->end>st->start+11 ) //アイテムを指定したIDに渡す - sd=map_id2sd(conv_num(st,& (st->stack->stack_data[st->start+11]))); - if(sd == NULL) //アイテムを渡す相手がいなかったらお帰り - return 0; - - if(nameid<0) { // ランダム - nameid=itemdb_searchrandomid(-nameid); - flag = 1; - } +int buildin_getitem2 (struct script_state *st) +{ + int nameid, amount, flag = 0; + int iden, ref, attr, c1, c2, c3, c4; + struct item_data *item_data; + struct item item_tmp; + struct map_session_data *sd; + struct script_data *data; + + sd = script_rid2sd (st); + + data = &(st->stack->stack_data[st->start + 2]); + get_val (st, data); + if (data->type == C_STR || data->type == C_CONSTSTR) + { + const char *name = conv_str (st, data); + struct item_data *item_data = itemdb_searchname (name); + nameid = 512; //Apple item ID + if (item_data) + nameid = item_data->nameid; + } + else + nameid = conv_num (st, data); + + amount = conv_num (st, &(st->stack->stack_data[st->start + 3])); + iden = conv_num (st, &(st->stack->stack_data[st->start + 4])); + ref = conv_num (st, &(st->stack->stack_data[st->start + 5])); + attr = conv_num (st, &(st->stack->stack_data[st->start + 6])); + c1 = conv_num (st, &(st->stack->stack_data[st->start + 7])); + c2 = conv_num (st, &(st->stack->stack_data[st->start + 8])); + c3 = conv_num (st, &(st->stack->stack_data[st->start + 9])); + c4 = conv_num (st, &(st->stack->stack_data[st->start + 10])); + if (st->end > st->start + 11) //アイテムを指定したIDに渡す + sd = map_id2sd (conv_num + (st, &(st->stack->stack_data[st->start + 11]))); + if (sd == NULL) //アイテムを渡す相手がいなかったらお帰り + return 0; - if(nameid > 0) { - memset(&item_tmp,0,sizeof(item_tmp)); - item_data=itemdb_search(nameid); - if(item_data->type==4 || item_data->type==5){ - if(ref > 10) ref = 10; - } - else if(item_data->type==7) { - iden = 1; - ref = 0; - } - else { - iden = 1; - ref = attr = 0; - } + if (nameid < 0) + { // ランダム + nameid = itemdb_searchrandomid (-nameid); + flag = 1; + } + + if (nameid > 0) + { + memset (&item_tmp, 0, sizeof (item_tmp)); + item_data = itemdb_search (nameid); + if (item_data->type == 4 || item_data->type == 5) + { + if (ref > 10) + ref = 10; + } + else if (item_data->type == 7) + { + iden = 1; + ref = 0; + } + else + { + iden = 1; + ref = attr = 0; + } - item_tmp.nameid=nameid; - if(!flag) - item_tmp.identify=iden; - else if(item_data->type==4 || item_data->type==5) - item_tmp.identify=0; - item_tmp.refine=ref; - item_tmp.attribute=attr; - item_tmp.card[0]=c1; - item_tmp.card[1]=c2; - item_tmp.card[2]=c3; - item_tmp.card[3]=c4; - if((flag = pc_additem(sd,&item_tmp,amount))) { - clif_additem(sd,0,0,flag); - map_addflooritem(&item_tmp,amount,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0); - } - } + item_tmp.nameid = nameid; + if (!flag) + item_tmp.identify = iden; + else if (item_data->type == 4 || item_data->type == 5) + item_tmp.identify = 0; + item_tmp.refine = ref; + item_tmp.attribute = attr; + item_tmp.card[0] = c1; + item_tmp.card[1] = c2; + item_tmp.card[2] = c3; + item_tmp.card[3] = c4; + if ((flag = pc_additem (sd, &item_tmp, amount))) + { + clif_additem (sd, 0, 0, flag); + map_addflooritem (&item_tmp, amount, sd->bl.m, sd->bl.x, sd->bl.y, + NULL, NULL, NULL, 0); + } + } - return 0; + return 0; } + /*========================================== * *------------------------------------------ */ -int buildin_makeitem(struct script_state *st) -{ - int nameid,amount,flag = 0; - int x,y,m; - char *mapname; - struct item item_tmp; - struct map_session_data *sd; - struct script_data *data; - - sd = script_rid2sd(st); - - data=&(st->stack->stack_data[st->start+2]); - get_val(st,data); - if( data->type==C_STR || data->type==C_CONSTSTR ){ - const char *name=conv_str(st,data); - struct item_data *item_data = itemdb_searchname(name); - nameid=512; //Apple Item ID - if( item_data ) - nameid=item_data->nameid; - }else - nameid=conv_num(st,data); - - amount=conv_num(st,& (st->stack->stack_data[st->start+3])); - mapname =conv_str(st,& (st->stack->stack_data[st->start+4])); - x =conv_num(st,& (st->stack->stack_data[st->start+5])); - y =conv_num(st,& (st->stack->stack_data[st->start+6])); - - if( sd && strcmp(mapname,"this")==0) - m=sd->bl.m; - else - m=map_mapname2mapid(mapname); - - if(nameid<0) { // ランダム - nameid=itemdb_searchrandomid(-nameid); - flag = 1; - } +int buildin_makeitem (struct script_state *st) +{ + int nameid, amount, flag = 0; + int x, y, m; + char *mapname; + struct item item_tmp; + struct map_session_data *sd; + struct script_data *data; - if(nameid > 0) { - memset(&item_tmp,0,sizeof(item_tmp)); - item_tmp.nameid=nameid; - if(!flag) - item_tmp.identify=1; - else - item_tmp.identify=!itemdb_isequip3(nameid); + sd = script_rid2sd (st); -// clif_additem(sd,0,0,flag); - map_addflooritem(&item_tmp,amount,m,x,y,NULL,NULL,NULL,0); - } + data = &(st->stack->stack_data[st->start + 2]); + get_val (st, data); + if (data->type == C_STR || data->type == C_CONSTSTR) + { + const char *name = conv_str (st, data); + struct item_data *item_data = itemdb_searchname (name); + nameid = 512; //Apple Item ID + if (item_data) + nameid = item_data->nameid; + } + else + nameid = conv_num (st, data); - return 0; + amount = conv_num (st, &(st->stack->stack_data[st->start + 3])); + mapname = conv_str (st, &(st->stack->stack_data[st->start + 4])); + x = conv_num (st, &(st->stack->stack_data[st->start + 5])); + y = conv_num (st, &(st->stack->stack_data[st->start + 6])); + + if (sd && strcmp (mapname, "this") == 0) + m = sd->bl.m; + else + m = map_mapname2mapid (mapname); + + if (nameid < 0) + { // ランダム + nameid = itemdb_searchrandomid (-nameid); + flag = 1; + } + + if (nameid > 0) + { + memset (&item_tmp, 0, sizeof (item_tmp)); + item_tmp.nameid = nameid; + if (!flag) + item_tmp.identify = 1; + else + item_tmp.identify = !itemdb_isequip3 (nameid); + +// clif_additem(sd,0,0,flag); + map_addflooritem (&item_tmp, amount, m, x, y, NULL, NULL, NULL, 0); + } + + return 0; } + /*========================================== * *------------------------------------------ */ -int buildin_delitem(struct script_state *st) +int buildin_delitem (struct script_state *st) { - int nameid=0,amount,i; - struct map_session_data *sd; - struct script_data *data; - - sd = script_rid2sd(st); + int nameid = 0, amount, i; + struct map_session_data *sd; + struct script_data *data; - data=&(st->stack->stack_data[st->start+2]); - get_val(st,data); - if( data->type==C_STR || data->type==C_CONSTSTR ){ - const char *name=conv_str(st,data); - struct item_data *item_data = itemdb_searchname(name); - //nameid=512; - if( item_data ) - nameid=item_data->nameid; - }else - nameid=conv_num(st,data); + sd = script_rid2sd (st); - amount=conv_num(st,& (st->stack->stack_data[st->start+3])); + data = &(st->stack->stack_data[st->start + 2]); + get_val (st, data); + if (data->type == C_STR || data->type == C_CONSTSTR) + { + const char *name = conv_str (st, data); + struct item_data *item_data = itemdb_searchname (name); + //nameid=512; + if (item_data) + nameid = item_data->nameid; + } + else + nameid = conv_num (st, data); - if (nameid<500 || amount<=0 ) {//by Lupus. Don't run FOR if u got wrong item ID or amount<=0 - //printf("wrong item ID or amount<=0 : delitem %i,\n",nameid,amount); - return 0; - } - sd=script_rid2sd(st); + amount = conv_num (st, &(st->stack->stack_data[st->start + 3])); - for(i=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].nameid<=0 || sd->inventory_data[i] == NULL || - sd->inventory_data[i]->type!=7 || - sd->status.inventory[i].amount<=0) - continue; - } - for(i=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].nameid==nameid){ - if(sd->status.inventory[i].amount>=amount){ - pc_delitem(sd,i,amount,0); - break; - } else { - amount-=sd->status.inventory[i].amount; - if(amount==0) - amount=sd->status.inventory[i].amount; - pc_delitem(sd,i,amount,0); - break; - } - } - } + if (nameid < 500 || amount <= 0) + { //by Lupus. Don't run FOR if u got wrong item ID or amount<=0 + //printf("wrong item ID or amount<=0 : delitem %i,\n",nameid,amount); + return 0; + } + sd = script_rid2sd (st); + + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid <= 0 + || sd->inventory_data[i] == NULL + || sd->inventory_data[i]->type != 7 + || sd->status.inventory[i].amount <= 0) + continue; + } + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid == nameid) + { + if (sd->status.inventory[i].amount >= amount) + { + pc_delitem (sd, i, amount, 0); + break; + } + else + { + amount -= sd->status.inventory[i].amount; + if (amount == 0) + amount = sd->status.inventory[i].amount; + pc_delitem (sd, i, amount, 0); + break; + } + } + } - return 0; + return 0; } /*========================================== *キャラ関係のパラメータ取得 *------------------------------------------ */ -int buildin_readparam(struct script_state *st) +int buildin_readparam (struct script_state *st) { - int type; - struct map_session_data *sd; + int type; + struct map_session_data *sd; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - if( st->end>st->start+3 ) - sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+3]))); - else - sd=script_rid2sd(st); + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + if (st->end > st->start + 3) + sd = map_nick2sd (conv_str + (st, &(st->stack->stack_data[st->start + 3]))); + else + sd = script_rid2sd (st); - if(sd==NULL){ - push_val(st->stack,C_INT,-1); - return 0; - } + if (sd == NULL) + { + push_val (st->stack, C_INT, -1); + return 0; + } - push_val(st->stack,C_INT,pc_readparam(sd,type)); + push_val (st->stack, C_INT, pc_readparam (sd, type)); - return 0; + return 0; } + /*========================================== *キャラ関係のID取得 *------------------------------------------ */ -int buildin_getcharid(struct script_state *st) +int buildin_getcharid (struct script_state *st) { - int num; - struct map_session_data *sd; + int num; + struct map_session_data *sd; - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - if( st->end>st->start+3 ) - sd=map_nick2sd(conv_str(st,& (st->stack->stack_data[st->start+3]))); - else - sd=script_rid2sd(st); - if(sd==NULL){ - push_val(st->stack,C_INT,-1); - return 0; - } - if(num==0) - push_val(st->stack,C_INT,sd->status.char_id); - if(num==1) - push_val(st->stack,C_INT,sd->status.party_id); - if(num==2) - push_val(st->stack,C_INT,sd->status.guild_id); - if(num==3) - push_val(st->stack,C_INT,sd->status.account_id); - return 0; + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + if (st->end > st->start + 3) + sd = map_nick2sd (conv_str + (st, &(st->stack->stack_data[st->start + 3]))); + else + sd = script_rid2sd (st); + if (sd == NULL) + { + push_val (st->stack, C_INT, -1); + return 0; + } + if (num == 0) + push_val (st->stack, C_INT, sd->status.char_id); + if (num == 1) + push_val (st->stack, C_INT, sd->status.party_id); + if (num == 2) + push_val (st->stack, C_INT, sd->status.guild_id); + if (num == 3) + push_val (st->stack, C_INT, sd->status.account_id); + return 0; } + /*========================================== *指定IDのPT名取得 *------------------------------------------ */ -char *buildin_getpartyname_sub(int party_id) +char *buildin_getpartyname_sub (int party_id) { - struct party *p; + struct party *p; - p=NULL; - p=party_search(party_id); + p = NULL; + p = party_search (party_id); - if(p!=NULL){ - char *buf; - buf=(char *)aCalloc(24,sizeof(char)); - strcpy(buf,p->name); - return buf; - } + if (p != NULL) + { + char *buf; + buf = (char *) aCalloc (24, sizeof (char)); + strcpy (buf, p->name); + return buf; + } - return 0; + return 0; } -int buildin_getpartyname(struct script_state *st) + +int buildin_getpartyname (struct script_state *st) { - char *name; - int party_id; + char *name; + int party_id; - party_id=conv_num(st,& (st->stack->stack_data[st->start+2])); - name=buildin_getpartyname_sub(party_id); - if(name!=0) - push_str(st->stack,C_STR,name); - else - push_str(st->stack,C_CONSTSTR,"null"); + party_id = conv_num (st, &(st->stack->stack_data[st->start + 2])); + name = buildin_getpartyname_sub (party_id); + if (name != 0) + push_str (st->stack, C_STR, name); + else + push_str (st->stack, C_CONSTSTR, "null"); - return 0; + return 0; } + /*========================================== *指定IDのPT人数とメンバーID取得 *------------------------------------------ */ -int buildin_getpartymember(struct script_state *st) +int buildin_getpartymember (struct script_state *st) { - struct party *p; - int i,j=0; + struct party *p; + int i, j = 0; - p=NULL; - p=party_search(conv_num(st,& (st->stack->stack_data[st->start+2]))); + p = NULL; + p = party_search (conv_num (st, &(st->stack->stack_data[st->start + 2]))); - if(p!=NULL){ - for(i=0;i<MAX_PARTY;i++){ - if(p->member[i].account_id){ -// printf("name:%s %d\n",p->member[i].name,i); - mapreg_setregstr(add_str("$@partymembername$")+(i<<24),p->member[i].name); - j++; - } - } - } - mapreg_setreg(add_str("$@partymembercount"),j); + if (p != NULL) + { + for (i = 0; i < MAX_PARTY; i++) + { + if (p->member[i].account_id) + { +// printf("name:%s %d\n",p->member[i].name,i); + mapreg_setregstr (add_str ("$@partymembername$") + (i << 24), + p->member[i].name); + j++; + } + } + } + mapreg_setreg (add_str ("$@partymembercount"), j); - return 0; + return 0; } + /*========================================== *指定IDのギルド名取得 *------------------------------------------ */ -char *buildin_getguildname_sub(int guild_id) +char *buildin_getguildname_sub (int guild_id) { - struct guild *g=NULL; - g=guild_search(guild_id); + struct guild *g = NULL; + g = guild_search (guild_id); - if(g!=NULL){ - char *buf; - buf=(char *)aCalloc(24,sizeof(char)); - strcpy(buf,g->name); - return buf; - } - return 0; + if (g != NULL) + { + char *buf; + buf = (char *) aCalloc (24, sizeof (char)); + strcpy (buf, g->name); + return buf; + } + return 0; } -int buildin_getguildname(struct script_state *st) + +int buildin_getguildname (struct script_state *st) { - char *name; - int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2])); - name=buildin_getguildname_sub(guild_id); - if(name!=0) - push_str(st->stack,C_STR,name); - else - push_str(st->stack,C_CONSTSTR,"null"); - return 0; + char *name; + int guild_id = conv_num (st, &(st->stack->stack_data[st->start + 2])); + name = buildin_getguildname_sub (guild_id); + if (name != 0) + push_str (st->stack, C_STR, name); + else + push_str (st->stack, C_CONSTSTR, "null"); + return 0; } /*========================================== *指定IDのGuildMaster名取得 *------------------------------------------ */ -char *buildin_getguildmaster_sub(int guild_id) +char *buildin_getguildmaster_sub (int guild_id) { - struct guild *g=NULL; - g=guild_search(guild_id); + struct guild *g = NULL; + g = guild_search (guild_id); - if(g!=NULL){ - char *buf; - buf=(char *)aCalloc(24,sizeof(char)); - strncpy(buf,g->master, 23); - return buf; - } + if (g != NULL) + { + char *buf; + buf = (char *) aCalloc (24, sizeof (char)); + strncpy (buf, g->master, 23); + return buf; + } - return 0; + return 0; } -int buildin_getguildmaster(struct script_state *st) + +int buildin_getguildmaster (struct script_state *st) { - char *master; - int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2])); - master=buildin_getguildmaster_sub(guild_id); - if(master!=0) - push_str(st->stack,C_STR,master); - else - push_str(st->stack,C_CONSTSTR,"null"); - return 0; + char *master; + int guild_id = conv_num (st, &(st->stack->stack_data[st->start + 2])); + master = buildin_getguildmaster_sub (guild_id); + if (master != 0) + push_str (st->stack, C_STR, master); + else + push_str (st->stack, C_CONSTSTR, "null"); + return 0; } -int buildin_getguildmasterid(struct script_state *st) +int buildin_getguildmasterid (struct script_state *st) { - char *master; - struct map_session_data *sd=NULL; - int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2])); - master=buildin_getguildmaster_sub(guild_id); - if(master!=0){ - if((sd=map_nick2sd(master)) == NULL){ - push_val(st->stack,C_INT,0); - return 0; - } - push_val(st->stack,C_INT,sd->status.char_id); - }else{ - push_val(st->stack,C_INT,0); - } - return 0; + char *master; + struct map_session_data *sd = NULL; + int guild_id = conv_num (st, &(st->stack->stack_data[st->start + 2])); + master = buildin_getguildmaster_sub (guild_id); + if (master != 0) + { + if ((sd = map_nick2sd (master)) == NULL) + { + push_val (st->stack, C_INT, 0); + return 0; + } + push_val (st->stack, C_INT, sd->status.char_id); + } + else + { + push_val (st->stack, C_INT, 0); + } + return 0; } /*========================================== * キャラクタの名前 *------------------------------------------ */ -int buildin_strcharinfo(struct script_state *st) -{ - struct map_session_data *sd; - int num; - - sd=script_rid2sd(st); - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - if(num==0){ - char *buf; - buf=(char *)aCalloc(24,sizeof(char)); - strncpy(buf,sd->status.name, 23); - push_str(st->stack,C_STR,buf); - } - if(num==1){ - char *buf; - buf=buildin_getpartyname_sub(sd->status.party_id); - if(buf!=0) - push_str(st->stack,C_STR,buf); - else - push_str(st->stack,C_CONSTSTR,""); - } - if(num==2){ - char *buf; - buf=buildin_getguildname_sub(sd->status.guild_id); - if(buf!=0) - push_str(st->stack,C_STR,buf); - else - push_str(st->stack,C_CONSTSTR,""); - } - - return 0; -} - -unsigned int equip[10]={0x0100,0x0010,0x0020,0x0002,0x0004,0x0040,0x0008,0x0080,0x0200,0x0001}; +int buildin_strcharinfo (struct script_state *st) +{ + struct map_session_data *sd; + int num; + + sd = script_rid2sd (st); + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + if (num == 0) + { + char *buf; + buf = (char *) aCalloc (24, sizeof (char)); + strncpy (buf, sd->status.name, 23); + push_str (st->stack, C_STR, buf); + } + if (num == 1) + { + char *buf; + buf = buildin_getpartyname_sub (sd->status.party_id); + if (buf != 0) + push_str (st->stack, C_STR, buf); + else + push_str (st->stack, C_CONSTSTR, ""); + } + if (num == 2) + { + char *buf; + buf = buildin_getguildname_sub (sd->status.guild_id); + if (buf != 0) + push_str (st->stack, C_STR, buf); + else + push_str (st->stack, C_CONSTSTR, ""); + } + + return 0; +} + +unsigned int equip[10] = + { 0x0100, 0x0010, 0x0020, 0x0002, 0x0004, 0x0040, 0x0008, 0x0080, 0x0200, + 0x0001 +}; /*========================================== * GetEquipID(Pos); Pos: 1-10 *------------------------------------------ */ -int buildin_getequipid(struct script_state *st) +int buildin_getequipid (struct script_state *st) { - int i,num; - struct map_session_data *sd; - struct item_data* item; + int i, num; + struct map_session_data *sd; + struct item_data *item; - sd=script_rid2sd(st); - if(sd == NULL) - { - printf("getequipid: sd == NULL\n"); - return 0; - } - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - i=pc_checkequip(sd,equip[num-1]); - if(i >= 0){ - item=sd->inventory_data[i]; - if(item) - push_val(st->stack,C_INT,item->nameid); - else - push_val(st->stack,C_INT,0); - }else{ - push_val(st->stack,C_INT,-1); - } - return 0; + sd = script_rid2sd (st); + if (sd == NULL) + { + printf ("getequipid: sd == NULL\n"); + return 0; + } + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + i = pc_checkequip (sd, equip[num - 1]); + if (i >= 0) + { + item = sd->inventory_data[i]; + if (item) + push_val (st->stack, C_INT, item->nameid); + else + push_val (st->stack, C_INT, 0); + } + else + { + push_val (st->stack, C_INT, -1); + } + return 0; } /*========================================== * 装備名文字列(精錬メニュー用) *------------------------------------------ */ -int buildin_getequipname(struct script_state *st) +int buildin_getequipname (struct script_state *st) { - int i,num; - struct map_session_data *sd; - struct item_data* item; - char *buf; + int i, num; + struct map_session_data *sd; + struct item_data *item; + char *buf; - buf=(char *)aCalloc(64,sizeof(char)); - sd=script_rid2sd(st); - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - i=pc_checkequip(sd,equip[num-1]); - if(i >= 0){ - item=sd->inventory_data[i]; - if(item) - sprintf(buf,"%s-[%s]",pos[num-1],item->jname); - else - sprintf(buf,"%s-[%s]",pos[num-1],pos[10]); - }else{ - sprintf(buf,"%s-[%s]",pos[num-1],pos[10]); - } - push_str(st->stack,C_STR,buf); + buf = (char *) aCalloc (64, sizeof (char)); + sd = script_rid2sd (st); + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + i = pc_checkequip (sd, equip[num - 1]); + if (i >= 0) + { + item = sd->inventory_data[i]; + if (item) + sprintf (buf, "%s-[%s]", pos[num - 1], item->jname); + else + sprintf (buf, "%s-[%s]", pos[num - 1], pos[10]); + } + else + { + sprintf (buf, "%s-[%s]", pos[num - 1], pos[10]); + } + push_str (st->stack, C_STR, buf); - return 0; + return 0; } /*========================================== * getbrokenid [Valaris] *------------------------------------------ */ -int buildin_getbrokenid(struct script_state *st) +int buildin_getbrokenid (struct script_state *st) { - int i,num,id=0,brokencounter=0; - struct map_session_data *sd; - - sd=script_rid2sd(st); - - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - for(i=0; i<MAX_INVENTORY; i++) { - if(sd->status.inventory[i].broken==1){ - brokencounter++; - if(num==brokencounter){ - id=sd->status.inventory[i].nameid; - break; - } - } - } - - push_val(st->stack,C_INT,id); + int i, num, id = 0, brokencounter = 0; + struct map_session_data *sd; - return 0; + sd = script_rid2sd (st); + + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].broken == 1) + { + brokencounter++; + if (num == brokencounter) + { + id = sd->status.inventory[i].nameid; + break; + } + } + } + + push_val (st->stack, C_INT, id); + + return 0; } /*========================================== * repair [Valaris] *------------------------------------------ */ -int buildin_repair(struct script_state *st) +int buildin_repair (struct script_state *st) { - int i,num; - int repaircounter=0; - struct map_session_data *sd; + int i, num; + int repaircounter = 0; + struct map_session_data *sd; + sd = script_rid2sd (st); - sd=script_rid2sd(st); - - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - for(i=0; i<MAX_INVENTORY; i++) { - if(sd->status.inventory[i].broken==1){ - repaircounter++; - if(num==repaircounter){ - sd->status.inventory[i].broken=0; - clif_equiplist(sd); - clif_produceeffect(sd, 0, sd->status.inventory[i].nameid); - clif_misceffect(&sd->bl, 3); - clif_displaymessage(sd->fd,"Item has been repaired."); - break; - } - } - } + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].broken == 1) + { + repaircounter++; + if (num == repaircounter) + { + sd->status.inventory[i].broken = 0; + clif_equiplist (sd); + clif_produceeffect (sd, 0, sd->status.inventory[i].nameid); + clif_misceffect (&sd->bl, 3); + clif_displaymessage (sd->fd, "Item has been repaired."); + break; + } + } + } - return 0; + return 0; } /*========================================== * 装備チェック *------------------------------------------ */ -int buildin_getequipisequiped(struct script_state *st) +int buildin_getequipisequiped (struct script_state *st) { - int i,num; - struct map_session_data *sd; + int i, num; + struct map_session_data *sd; - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); - i=pc_checkequip(sd,equip[num-1]); - if(i >= 0){ - push_val(st->stack,C_INT,1); - }else{ - push_val(st->stack,C_INT,0); - } + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sd = script_rid2sd (st); + i = pc_checkequip (sd, equip[num - 1]); + if (i >= 0) + { + push_val (st->stack, C_INT, 1); + } + else + { + push_val (st->stack, C_INT, 0); + } - return 0; + return 0; } /*========================================== * 装備品精錬可能チェック *------------------------------------------ */ -int buildin_getequipisenableref(struct script_state *st) +int buildin_getequipisenableref (struct script_state *st) { - int i,num; - struct map_session_data *sd; + int i, num; + struct map_session_data *sd; - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); - i=pc_checkequip(sd,equip[num-1]); - if(i >= 0 && num<7 && sd->inventory_data[i] && (num!=1 || sd->inventory_data[i]->def > 1 - || (sd->inventory_data[i]->def==1 && sd->inventory_data[i]->equip_script==NULL) - || (sd->inventory_data[i]->def<=0 && sd->inventory_data[i]->equip_script!=NULL)) - ){ - push_val(st->stack,C_INT,1); - }else{ - push_val(st->stack,C_INT,0); - } + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sd = script_rid2sd (st); + i = pc_checkequip (sd, equip[num - 1]); + if (i >= 0 && num < 7 && sd->inventory_data[i] + && (num != 1 || sd->inventory_data[i]->def > 1 + || (sd->inventory_data[i]->def == 1 + && sd->inventory_data[i]->equip_script == NULL) + || (sd->inventory_data[i]->def <= 0 + && sd->inventory_data[i]->equip_script != NULL))) + { + push_val (st->stack, C_INT, 1); + } + else + { + push_val (st->stack, C_INT, 0); + } - return 0; + return 0; } /*========================================== * 装備品鑑定チェック *------------------------------------------ */ -int buildin_getequipisidentify(struct script_state *st) +int buildin_getequipisidentify (struct script_state *st) { - int i,num; - struct map_session_data *sd; + int i, num; + struct map_session_data *sd; - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); - i=pc_checkequip(sd,equip[num-1]); - if(i >= 0) - push_val(st->stack,C_INT,sd->status.inventory[i].identify); - else - push_val(st->stack,C_INT,0); + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sd = script_rid2sd (st); + i = pc_checkequip (sd, equip[num - 1]); + if (i >= 0) + push_val (st->stack, C_INT, sd->status.inventory[i].identify); + else + push_val (st->stack, C_INT, 0); - return 0; + return 0; } /*========================================== * 装備品精錬度 *------------------------------------------ */ -int buildin_getequiprefinerycnt(struct script_state *st) +int buildin_getequiprefinerycnt (struct script_state *st) { - int i,num; - struct map_session_data *sd; + int i, num; + struct map_session_data *sd; - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); - i=pc_checkequip(sd,equip[num-1]); - if(i >= 0) - push_val(st->stack,C_INT,sd->status.inventory[i].refine); - else - push_val(st->stack,C_INT,0); + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sd = script_rid2sd (st); + i = pc_checkequip (sd, equip[num - 1]); + if (i >= 0) + push_val (st->stack, C_INT, sd->status.inventory[i].refine); + else + push_val (st->stack, C_INT, 0); - return 0; + return 0; } /*========================================== * 装備品武器LV *------------------------------------------ */ -int buildin_getequipweaponlv(struct script_state *st) +int buildin_getequipweaponlv (struct script_state *st) { - int i,num; - struct map_session_data *sd; + int i, num; + struct map_session_data *sd; - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); - i=pc_checkequip(sd,equip[num-1]); - if(i >= 0 && sd->inventory_data[i]) - push_val(st->stack,C_INT,sd->inventory_data[i]->wlv); - else - push_val(st->stack,C_INT,0); + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sd = script_rid2sd (st); + i = pc_checkequip (sd, equip[num - 1]); + if (i >= 0 && sd->inventory_data[i]) + push_val (st->stack, C_INT, sd->inventory_data[i]->wlv); + else + push_val (st->stack, C_INT, 0); - return 0; + return 0; } /*========================================== * 装備品精錬成功率 *------------------------------------------ */ -int buildin_getequippercentrefinery(struct script_state *st) +int buildin_getequippercentrefinery (struct script_state *st) { - int i,num; - struct map_session_data *sd; + int i, num; + struct map_session_data *sd; - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); - i=pc_checkequip(sd,equip[num-1]); - if(i >= 0) - push_val(st->stack,C_INT,pc_percentrefinery(sd,&sd->status.inventory[i])); - else - push_val(st->stack,C_INT,0); + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sd = script_rid2sd (st); + i = pc_checkequip (sd, equip[num - 1]); + if (i >= 0) + push_val (st->stack, C_INT, + pc_percentrefinery (sd, &sd->status.inventory[i])); + else + push_val (st->stack, C_INT, 0); - return 0; + return 0; } /*========================================== * 精錬成功 *------------------------------------------ */ -int buildin_successrefitem(struct script_state *st) +int buildin_successrefitem (struct script_state *st) { - int i,num,ep; - struct map_session_data *sd; + int i, num, ep; + struct map_session_data *sd; - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); - i=pc_checkequip(sd,equip[num-1]); - if(i >= 0) { - ep=sd->status.inventory[i].equip; - - sd->status.inventory[i].refine++; - pc_unequipitem(sd,i,0); - clif_refine(sd->fd,sd,0,i,sd->status.inventory[i].refine); - clif_delitem(sd,i,1); - clif_additem(sd,i,1,0); - pc_equipitem(sd,i,ep); - clif_misceffect(&sd->bl,3); - } + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sd = script_rid2sd (st); + i = pc_checkequip (sd, equip[num - 1]); + if (i >= 0) + { + ep = sd->status.inventory[i].equip; - return 0; + sd->status.inventory[i].refine++; + pc_unequipitem (sd, i, 0); + clif_refine (sd->fd, sd, 0, i, sd->status.inventory[i].refine); + clif_delitem (sd, i, 1); + clif_additem (sd, i, 1, 0); + pc_equipitem (sd, i, ep); + clif_misceffect (&sd->bl, 3); + } + + return 0; } /*========================================== * 精錬失敗 *------------------------------------------ */ -int buildin_failedrefitem(struct script_state *st) +int buildin_failedrefitem (struct script_state *st) { - int i,num; - struct map_session_data *sd; + int i, num; + struct map_session_data *sd; - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); - i=pc_checkequip(sd,equip[num-1]); - if(i >= 0) { - sd->status.inventory[i].refine = 0; - pc_unequipitem(sd,i,0); - // 精錬失敗エフェクトのパケット - clif_refine(sd->fd,sd,1,i,sd->status.inventory[i].refine); - pc_delitem(sd,i,1,0); - // 他の人にも失敗を通知 - clif_misceffect(&sd->bl,2); - } + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sd = script_rid2sd (st); + i = pc_checkequip (sd, equip[num - 1]); + if (i >= 0) + { + sd->status.inventory[i].refine = 0; + pc_unequipitem (sd, i, 0); + // 精錬失敗エフェクトのパケット + clif_refine (sd->fd, sd, 1, i, sd->status.inventory[i].refine); + pc_delitem (sd, i, 1, 0); + // 他の人にも失敗を通知 + clif_misceffect (&sd->bl, 2); + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_statusup(struct script_state *st) +int buildin_statusup (struct script_state *st) { - int type; - struct map_session_data *sd; + int type; + struct map_session_data *sd; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); - pc_statusup(sd,type); + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sd = script_rid2sd (st); + pc_statusup (sd, type); - return 0; + return 0; } + /*========================================== * *------------------------------------------ */ -int buildin_statusup2(struct script_state *st) +int buildin_statusup2 (struct script_state *st) { - int type,val; - struct map_session_data *sd; + int type, val; + struct map_session_data *sd; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - val=conv_num(st,& (st->stack->stack_data[st->start+3])); - sd=script_rid2sd(st); - pc_statusup2(sd,type,val); + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + val = conv_num (st, &(st->stack->stack_data[st->start + 3])); + sd = script_rid2sd (st); + pc_statusup2 (sd, type, val); - return 0; + return 0; } + /*========================================== * 装備品による能力値ボーナス *------------------------------------------ */ -int buildin_bonus(struct script_state *st) +int buildin_bonus (struct script_state *st) { - int type,val; - struct map_session_data *sd; + int type, val; + struct map_session_data *sd; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - val=conv_num(st,& (st->stack->stack_data[st->start+3])); - sd=script_rid2sd(st); - pc_bonus(sd,type,val); + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + val = conv_num (st, &(st->stack->stack_data[st->start + 3])); + sd = script_rid2sd (st); + pc_bonus (sd, type, val); - return 0; + return 0; } + /*========================================== * 装備品による能力値ボーナス *------------------------------------------ */ -int buildin_bonus2(struct script_state *st) +int buildin_bonus2 (struct script_state *st) { - int type,type2,val; - struct map_session_data *sd; + int type, type2, val; + struct map_session_data *sd; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - type2=conv_num(st,& (st->stack->stack_data[st->start+3])); - val=conv_num(st,& (st->stack->stack_data[st->start+4])); - sd=script_rid2sd(st); - pc_bonus2(sd,type,type2,val); + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + type2 = conv_num (st, &(st->stack->stack_data[st->start + 3])); + val = conv_num (st, &(st->stack->stack_data[st->start + 4])); + sd = script_rid2sd (st); + pc_bonus2 (sd, type, type2, val); - return 0; + return 0; } + /*========================================== * 装備品による能力値ボーナス *------------------------------------------ */ -int buildin_bonus3(struct script_state *st) +int buildin_bonus3 (struct script_state *st) { - int type,type2,type3,val; - struct map_session_data *sd; + int type, type2, type3, val; + struct map_session_data *sd; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - type2=conv_num(st,& (st->stack->stack_data[st->start+3])); - type3=conv_num(st,& (st->stack->stack_data[st->start+4])); - val=conv_num(st,& (st->stack->stack_data[st->start+5])); - sd=script_rid2sd(st); - pc_bonus3(sd,type,type2,type3,val); + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + type2 = conv_num (st, &(st->stack->stack_data[st->start + 3])); + type3 = conv_num (st, &(st->stack->stack_data[st->start + 4])); + val = conv_num (st, &(st->stack->stack_data[st->start + 5])); + sd = script_rid2sd (st); + pc_bonus3 (sd, type, type2, type3, val); - return 0; + return 0; } + /*========================================== * スキル所得 *------------------------------------------ */ -int buildin_skill(struct script_state *st) +int buildin_skill (struct script_state *st) { - int id,level,flag=1; - struct map_session_data *sd; + int id, level, flag = 1; + struct map_session_data *sd; - id=conv_num(st,& (st->stack->stack_data[st->start+2])); - level=conv_num(st,& (st->stack->stack_data[st->start+3])); - if( st->end>st->start+4 ) - flag=conv_num(st,&(st->stack->stack_data[st->start+4]) ); - sd=script_rid2sd(st); - pc_skill(sd,id,level,flag); - clif_skillinfoblock(sd); + id = conv_num (st, &(st->stack->stack_data[st->start + 2])); + level = conv_num (st, &(st->stack->stack_data[st->start + 3])); + if (st->end > st->start + 4) + flag = conv_num (st, &(st->stack->stack_data[st->start + 4])); + sd = script_rid2sd (st); + pc_skill (sd, id, level, flag); + clif_skillinfoblock (sd); - return 0; + return 0; } /*========================================== * [Fate] Sets the skill level permanently *------------------------------------------ */ -int buildin_setskill(struct script_state *st) +int buildin_setskill (struct script_state *st) { - int id,level; - struct map_session_data *sd; + int id, level; + struct map_session_data *sd; - id=conv_num(st,& (st->stack->stack_data[st->start+2])); - level=conv_num(st,& (st->stack->stack_data[st->start+3])); - sd=script_rid2sd(st); + id = conv_num (st, &(st->stack->stack_data[st->start + 2])); + level = conv_num (st, &(st->stack->stack_data[st->start + 3])); + sd = script_rid2sd (st); - sd->status.skill[id].id = level? id : 0; - sd->status.skill[id].lv = level; - clif_skillinfoblock(sd); - return 0; + sd->status.skill[id].id = level ? id : 0; + sd->status.skill[id].lv = level; + clif_skillinfoblock (sd); + return 0; } /*========================================== * ギルドスキル取得 *------------------------------------------ */ -int buildin_guildskill(struct script_state *st) +int buildin_guildskill (struct script_state *st) { - int id,level; - struct map_session_data *sd; - int i=0; + int id, level; + struct map_session_data *sd; + int i = 0; - id=conv_num(st,& (st->stack->stack_data[st->start+2])); - level=conv_num(st,& (st->stack->stack_data[st->start+3])); -// if( st->end>st->start+4 ) -// flag=conv_num(st,&(st->stack->stack_data[st->start+4]) ); - sd=script_rid2sd(st); - for(i=0;i<level;i++) - guild_skillup(sd,id); + id = conv_num (st, &(st->stack->stack_data[st->start + 2])); + level = conv_num (st, &(st->stack->stack_data[st->start + 3])); +// if( st->end>st->start+4 ) +// flag=conv_num(st,&(st->stack->stack_data[st->start+4]) ); + sd = script_rid2sd (st); + for (i = 0; i < level; i++) + guild_skillup (sd, id); - return 0; + return 0; } + /*========================================== * スキルレベル所得 *------------------------------------------ */ -int buildin_getskilllv(struct script_state *st) +int buildin_getskilllv (struct script_state *st) { - int id=conv_num(st,& (st->stack->stack_data[st->start+2])); - push_val(st->stack,C_INT, pc_checkskill( script_rid2sd(st) ,id) ); - return 0; + int id = conv_num (st, &(st->stack->stack_data[st->start + 2])); + push_val (st->stack, C_INT, pc_checkskill (script_rid2sd (st), id)); + return 0; } + /*========================================== * getgdskilllv(Guild_ID, Skill_ID); * skill_id = 10000 : GD_APPROVAL @@ -3248,13 +3834,14 @@ int buildin_getskilllv(struct script_state *st) * 10004 : GD_EXTENSION *------------------------------------------ */ -int buildin_getgdskilllv(struct script_state *st) +int buildin_getgdskilllv (struct script_state *st) { - int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2])); - int skill_id=conv_num(st,& (st->stack->stack_data[st->start+3])); - struct guild *g=guild_search(guild_id); - push_val(st->stack,C_INT, (g==NULL)?-1:guild_checkskill(g,skill_id) ); - return 0; + int guild_id = conv_num (st, &(st->stack->stack_data[st->start + 2])); + int skill_id = conv_num (st, &(st->stack->stack_data[st->start + 3])); + struct guild *g = guild_search (guild_id); + push_val (st->stack, C_INT, + (g == NULL) ? -1 : guild_checkskill (g, skill_id)); + return 0; /* struct map_session_data *sd=NULL; struct guild *g=NULL; @@ -3271,70 +3858,75 @@ int buildin_getgdskilllv(struct script_state *st) return 0; */ } + /*========================================== * *------------------------------------------ */ -int buildin_basicskillcheck(struct script_state *st) +int buildin_basicskillcheck (struct script_state *st) { - push_val(st->stack,C_INT, battle_config.basic_skill_check); - return 0; + push_val (st->stack, C_INT, battle_config.basic_skill_check); + return 0; } + /*========================================== * *------------------------------------------ */ -int buildin_getgmlevel(struct script_state *st) +int buildin_getgmlevel (struct script_state *st) { - push_val(st->stack,C_INT, pc_isGM(script_rid2sd(st))); - return 0; + push_val (st->stack, C_INT, pc_isGM (script_rid2sd (st))); + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_end(struct script_state *st) +int buildin_end (struct script_state *st) { - st->state = END; - return 0; + st->state = END; + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_checkoption(struct script_state *st) +int buildin_checkoption (struct script_state *st) { - int type; - struct map_session_data *sd; + int type; + struct map_session_data *sd; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sd = script_rid2sd (st); - if(sd->status.option & type){ - push_val(st->stack,C_INT,1); - } else { - push_val(st->stack,C_INT,0); - } + if (sd->status.option & type) + { + push_val (st->stack, C_INT, 1); + } + else + { + push_val (st->stack, C_INT, 0); + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_setoption(struct script_state *st) +int buildin_setoption (struct script_state *st) { - int type; - struct map_session_data *sd; + int type; + struct map_session_data *sd; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); - pc_setoption(sd,type); + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sd = script_rid2sd (st); + pc_setoption (sd, type); - return 0; + return 0; } /*========================================== @@ -3342,32 +3934,35 @@ int buildin_setoption(struct script_state *st) *------------------------------------------ */ -int buildin_checkcart(struct script_state *st) +int buildin_checkcart (struct script_state *st) { - struct map_session_data *sd; + struct map_session_data *sd; - sd=script_rid2sd(st); + sd = script_rid2sd (st); - if(pc_iscarton(sd)){ - push_val(st->stack,C_INT,1); - } else { - push_val(st->stack,C_INT,0); - } - return 0; + if (pc_iscarton (sd)) + { + push_val (st->stack, C_INT, 1); + } + else + { + push_val (st->stack, C_INT, 0); + } + return 0; } /*========================================== * カートを付ける *------------------------------------------ */ -int buildin_setcart(struct script_state *st) +int buildin_setcart (struct script_state *st) { - struct map_session_data *sd; + struct map_session_data *sd; - sd=script_rid2sd(st); - pc_setcart(sd,1); + sd = script_rid2sd (st); + pc_setcart (sd, 1); - return 0; + return 0; } /*========================================== @@ -3375,34 +3970,36 @@ int buildin_setcart(struct script_state *st) *------------------------------------------ */ -int buildin_checkfalcon(struct script_state *st) +int buildin_checkfalcon (struct script_state *st) { - struct map_session_data *sd; + struct map_session_data *sd; - sd=script_rid2sd(st); + sd = script_rid2sd (st); - if(pc_isfalcon(sd)){ - push_val(st->stack,C_INT,1); - } else { - push_val(st->stack,C_INT,0); - } + if (pc_isfalcon (sd)) + { + push_val (st->stack, C_INT, 1); + } + else + { + push_val (st->stack, C_INT, 0); + } - return 0; + return 0; } - /*========================================== * 鷹を付ける *------------------------------------------ */ -int buildin_setfalcon(struct script_state *st) +int buildin_setfalcon (struct script_state *st) { - struct map_session_data *sd; + struct map_session_data *sd; - sd=script_rid2sd(st); - pc_setfalcon(sd); + sd = script_rid2sd (st); + pc_setfalcon (sd); - return 0; + return 0; } /*========================================== @@ -3410,78 +4007,82 @@ int buildin_setfalcon(struct script_state *st) *------------------------------------------ */ -int buildin_checkriding(struct script_state *st) +int buildin_checkriding (struct script_state *st) { - struct map_session_data *sd; + struct map_session_data *sd; - sd=script_rid2sd(st); + sd = script_rid2sd (st); - if(pc_isriding(sd)){ - push_val(st->stack,C_INT,1); - } else { - push_val(st->stack,C_INT,0); - } + if (pc_isriding (sd)) + { + push_val (st->stack, C_INT, 1); + } + else + { + push_val (st->stack, C_INT, 0); + } - return 0; + return 0; } - /*========================================== * ペコペコ乗り *------------------------------------------ */ -int buildin_setriding(struct script_state *st) +int buildin_setriding (struct script_state *st) { - struct map_session_data *sd; + struct map_session_data *sd; - sd=script_rid2sd(st); - pc_setriding(sd); + sd = script_rid2sd (st); + pc_setriding (sd); - return 0; + return 0; } /*========================================== * セーブポイントの保存 *------------------------------------------ */ -int buildin_savepoint(struct script_state *st) +int buildin_savepoint (struct script_state *st) { - int x,y; - char *str; + int x, y; + char *str; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - x=conv_num(st,& (st->stack->stack_data[st->start+3])); - y=conv_num(st,& (st->stack->stack_data[st->start+4])); - pc_setsavepoint(script_rid2sd(st),str,x,y); - return 0; + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y = conv_num (st, &(st->stack->stack_data[st->start + 4])); + pc_setsavepoint (script_rid2sd (st), str, x, y); + return 0; } /*========================================== * GetTimeTick(0: System Tick, 1: Time Second Tick) *------------------------------------------ */ -int buildin_gettimetick(struct script_state *st) /* Asgard Version */ +int buildin_gettimetick (struct script_state *st) /* Asgard Version */ { - int type; - time_t timer; - struct tm *t; + int type; + time_t timer; + struct tm *t; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); - switch(type){ - case 1: - //type 1:(Second Ticks: 0-86399, 00:00:00-23:59:59) - time(&timer); - t=gmtime(&timer); - push_val(st->stack,C_INT,((t->tm_hour)*3600+(t->tm_min)*60+t->tm_sec)); - break; - case 0: - default: - //type 0:(System Ticks) - push_val(st->stack,C_INT,gettick()); - break; - } - return 0; + switch (type) + { + case 1: + //type 1:(Second Ticks: 0-86399, 00:00:00-23:59:59) + time (&timer); + t = gmtime (&timer); + push_val (st->stack, C_INT, + ((t->tm_hour) * 3600 + (t->tm_min) * 60 + t->tm_sec)); + break; + case 0: + default: + //type 0:(System Ticks) + push_val (st->stack, C_INT, gettick ()); + break; + } + return 0; } /*========================================== @@ -3491,747 +4092,812 @@ int buildin_gettimetick(struct script_state *st) /* Asgard Version */ * 7: Year *------------------------------------------ */ -int buildin_gettime(struct script_state *st) /* Asgard Version */ -{ - int type; - time_t timer; - struct tm *t; - - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - - time(&timer); - t=gmtime(&timer); - - switch(type){ - case 1://Sec(0~59) - push_val(st->stack,C_INT,t->tm_sec); - break; - case 2://Min(0~59) - push_val(st->stack,C_INT,t->tm_min); - break; - case 3://Hour(0~23) - push_val(st->stack,C_INT,t->tm_hour); - break; - case 4://WeekDay(0~6) - push_val(st->stack,C_INT,t->tm_wday); - break; - case 5://MonthDay(01~31) - push_val(st->stack,C_INT,t->tm_mday); - break; - case 6://Month(01~12) - push_val(st->stack,C_INT,t->tm_mon+1); - break; - case 7://Year(20xx) - push_val(st->stack,C_INT,t->tm_year+1900); - break; - default://(format error) - push_val(st->stack,C_INT,-1); - break; - } - return 0; +int buildin_gettime (struct script_state *st) /* Asgard Version */ +{ + int type; + time_t timer; + struct tm *t; + + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + + time (&timer); + t = gmtime (&timer); + + switch (type) + { + case 1: //Sec(0~59) + push_val (st->stack, C_INT, t->tm_sec); + break; + case 2: //Min(0~59) + push_val (st->stack, C_INT, t->tm_min); + break; + case 3: //Hour(0~23) + push_val (st->stack, C_INT, t->tm_hour); + break; + case 4: //WeekDay(0~6) + push_val (st->stack, C_INT, t->tm_wday); + break; + case 5: //MonthDay(01~31) + push_val (st->stack, C_INT, t->tm_mday); + break; + case 6: //Month(01~12) + push_val (st->stack, C_INT, t->tm_mon + 1); + break; + case 7: //Year(20xx) + push_val (st->stack, C_INT, t->tm_year + 1900); + break; + default: //(format error) + push_val (st->stack, C_INT, -1); + break; + } + return 0; } /*========================================== * GetTimeStr("TimeFMT", Length); *------------------------------------------ */ -int buildin_gettimestr(struct script_state *st) +int buildin_gettimestr (struct script_state *st) { - char *tmpstr; - char *fmtstr; - int maxlen; - time_t now = time(NULL); + char *tmpstr; + char *fmtstr; + int maxlen; + time_t now = time (NULL); - fmtstr=conv_str(st,& (st->stack->stack_data[st->start+2])); - maxlen=conv_num(st,& (st->stack->stack_data[st->start+3])); + fmtstr = conv_str (st, &(st->stack->stack_data[st->start + 2])); + maxlen = conv_num (st, &(st->stack->stack_data[st->start + 3])); - tmpstr=(char *)aCalloc(maxlen+1,sizeof(char)); - strftime(tmpstr,maxlen,fmtstr,gmtime(&now)); - tmpstr[maxlen]='\0'; + tmpstr = (char *) aCalloc (maxlen + 1, sizeof (char)); + strftime (tmpstr, maxlen, fmtstr, gmtime (&now)); + tmpstr[maxlen] = '\0'; - push_str(st->stack,C_STR,tmpstr); - return 0; + push_str (st->stack, C_STR, tmpstr); + return 0; } /*========================================== * カプラ倉庫を開く *------------------------------------------ */ -int buildin_openstorage(struct script_state *st) +int buildin_openstorage (struct script_state *st) { -// int sync = 0; -// if (st->end >= 3) sync = conv_num(st,& (st->stack->stack_data[st->start+2])); - struct map_session_data *sd=script_rid2sd(st); +// int sync = 0; +// if (st->end >= 3) sync = conv_num(st,& (st->stack->stack_data[st->start+2])); + struct map_session_data *sd = script_rid2sd (st); -// if (sync) { - st->state=STOP; - sd->npc_flags.storage = 1; -// } else st->state = END; +// if (sync) { + st->state = STOP; + sd->npc_flags.storage = 1; +// } else st->state = END; - storage_storageopen(sd); - return 0; + storage_storageopen (sd); + return 0; } -int buildin_guildopenstorage(struct script_state *st) +int buildin_guildopenstorage (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); - int ret; - st->state=STOP; - ret = storage_guild_storageopen(sd); - push_val(st->stack,C_INT,ret); - return 0; + struct map_session_data *sd = script_rid2sd (st); + int ret; + st->state = STOP; + ret = storage_guild_storageopen (sd); + push_val (st->stack, C_INT, ret); + return 0; } /*========================================== * アイテムによるスキル発動 *------------------------------------------ */ -int buildin_itemskill(struct script_state *st) +int buildin_itemskill (struct script_state *st) { - int id,lv; - char *str; - struct map_session_data *sd=script_rid2sd(st); + int id, lv; + char *str; + struct map_session_data *sd = script_rid2sd (st); - id=conv_num(st,& (st->stack->stack_data[st->start+2])); - lv=conv_num(st,& (st->stack->stack_data[st->start+3])); - str=conv_str(st,& (st->stack->stack_data[st->start+4])); + id = conv_num (st, &(st->stack->stack_data[st->start + 2])); + lv = conv_num (st, &(st->stack->stack_data[st->start + 3])); + str = conv_str (st, &(st->stack->stack_data[st->start + 4])); - // 詠唱中にスキルアイテムは使用できない - if(sd->skilltimer != -1) - return 0; + // 詠唱中にスキルアイテムは使用できない + if (sd->skilltimer != -1) + return 0; - sd->skillitem=id; - sd->skillitemlv=lv; - clif_item_skill(sd,id,lv,str); - return 0; + sd->skillitem = id; + sd->skillitemlv = lv; + clif_item_skill (sd, id, lv, str); + return 0; } /*========================================== * NPCで経験値上げる *------------------------------------------ */ -int buildin_getexp(struct script_state *st) +int buildin_getexp (struct script_state *st) { - struct map_session_data *sd = script_rid2sd(st); - int base=0,job=0; + struct map_session_data *sd = script_rid2sd (st); + int base = 0, job = 0; - base=conv_num(st,& (st->stack->stack_data[st->start+2])); - job =conv_num(st,& (st->stack->stack_data[st->start+3])); - if(base<0 || job<0) - return 0; - if(sd) - pc_gainexp_reason(sd,base,job, PC_GAINEXP_REASON_SCRIPT); + base = conv_num (st, &(st->stack->stack_data[st->start + 2])); + job = conv_num (st, &(st->stack->stack_data[st->start + 3])); + if (base < 0 || job < 0) + return 0; + if (sd) + pc_gainexp_reason (sd, base, job, PC_GAINEXP_REASON_SCRIPT); - return 0; + return 0; } /*========================================== * モンスター発生 *------------------------------------------ */ -int buildin_monster(struct script_state *st) +int buildin_monster (struct script_state *st) { - int class,amount,x,y; - char *str,*map,*event=""; + int class, amount, x, y; + char *str, *map, *event = ""; - map =conv_str(st,& (st->stack->stack_data[st->start+2])); - x =conv_num(st,& (st->stack->stack_data[st->start+3])); - y =conv_num(st,& (st->stack->stack_data[st->start+4])); - str =conv_str(st,& (st->stack->stack_data[st->start+5])); - class=conv_num(st,& (st->stack->stack_data[st->start+6])); - amount=conv_num(st,& (st->stack->stack_data[st->start+7])); - if( st->end>st->start+8 ) - event=conv_str(st,& (st->stack->stack_data[st->start+8])); + map = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y = conv_num (st, &(st->stack->stack_data[st->start + 4])); + str = conv_str (st, &(st->stack->stack_data[st->start + 5])); + class = conv_num (st, &(st->stack->stack_data[st->start + 6])); + amount = conv_num (st, &(st->stack->stack_data[st->start + 7])); + if (st->end > st->start + 8) + event = conv_str (st, &(st->stack->stack_data[st->start + 8])); - mob_once_spawn(map_id2sd(st->rid),map,x,y,str,class,amount,event); - return 0; + mob_once_spawn (map_id2sd (st->rid), map, x, y, str, class, amount, + event); + return 0; } + /*========================================== * モンスター発生 *------------------------------------------ */ -int buildin_areamonster(struct script_state *st) +int buildin_areamonster (struct script_state *st) { - int class,amount,x0,y0,x1,y1; - char *str,*map,*event=""; + int class, amount, x0, y0, x1, y1; + char *str, *map, *event = ""; - map =conv_str(st,& (st->stack->stack_data[st->start+2])); - x0 =conv_num(st,& (st->stack->stack_data[st->start+3])); - y0 =conv_num(st,& (st->stack->stack_data[st->start+4])); - x1 =conv_num(st,& (st->stack->stack_data[st->start+5])); - y1 =conv_num(st,& (st->stack->stack_data[st->start+6])); - str =conv_str(st,& (st->stack->stack_data[st->start+7])); - class=conv_num(st,& (st->stack->stack_data[st->start+8])); - amount=conv_num(st,& (st->stack->stack_data[st->start+9])); - if( st->end>st->start+10 ) - event=conv_str(st,& (st->stack->stack_data[st->start+10])); + map = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x0 = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y0 = conv_num (st, &(st->stack->stack_data[st->start + 4])); + x1 = conv_num (st, &(st->stack->stack_data[st->start + 5])); + y1 = conv_num (st, &(st->stack->stack_data[st->start + 6])); + str = conv_str (st, &(st->stack->stack_data[st->start + 7])); + class = conv_num (st, &(st->stack->stack_data[st->start + 8])); + amount = conv_num (st, &(st->stack->stack_data[st->start + 9])); + if (st->end > st->start + 10) + event = conv_str (st, &(st->stack->stack_data[st->start + 10])); - mob_once_spawn_area(map_id2sd(st->rid),map,x0,y0,x1,y1,str,class,amount,event); - return 0; + mob_once_spawn_area (map_id2sd (st->rid), map, x0, y0, x1, y1, str, class, + amount, event); + return 0; } + /*========================================== * モンスター削除 *------------------------------------------ */ -int buildin_killmonster_sub(struct block_list *bl,va_list ap) +int buildin_killmonster_sub (struct block_list *bl, va_list ap) { - char *event=va_arg(ap,char *); - int allflag=va_arg(ap,int); + char *event = va_arg (ap, char *); + int allflag = va_arg (ap, int); - if(!allflag){ - if(strcmp(event,((struct mob_data *)bl)->npc_event)==0) - mob_delete((struct mob_data *)bl); - return 0; - }else if(allflag){ - if(((struct mob_data *)bl)->spawndelay1==-1 && ((struct mob_data *)bl)->spawndelay2==-1) - mob_delete((struct mob_data *)bl); - return 0; - } - return 0; + if (!allflag) + { + if (strcmp (event, ((struct mob_data *) bl)->npc_event) == 0) + mob_delete ((struct mob_data *) bl); + return 0; + } + else if (allflag) + { + if (((struct mob_data *) bl)->spawndelay1 == -1 + && ((struct mob_data *) bl)->spawndelay2 == -1) + mob_delete ((struct mob_data *) bl); + return 0; + } + return 0; } -int buildin_killmonster(struct script_state *st) + +int buildin_killmonster (struct script_state *st) { - char *mapname,*event; - int m,allflag=0; - mapname=conv_str(st,& (st->stack->stack_data[st->start+2])); - event=conv_str(st,& (st->stack->stack_data[st->start+3])); - if(strcmp(event,"All")==0) - allflag = 1; + char *mapname, *event; + int m, allflag = 0; + mapname = conv_str (st, &(st->stack->stack_data[st->start + 2])); + event = conv_str (st, &(st->stack->stack_data[st->start + 3])); + if (strcmp (event, "All") == 0) + allflag = 1; - if( (m=map_mapname2mapid(mapname))<0 ) - return 0; - map_foreachinarea(buildin_killmonster_sub, - m,0,0,map[m].xs,map[m].ys,BL_MOB, event ,allflag); - return 0; + if ((m = map_mapname2mapid (mapname)) < 0) + return 0; + map_foreachinarea (buildin_killmonster_sub, + m, 0, 0, map[m].xs, map[m].ys, BL_MOB, event, allflag); + return 0; } -int buildin_killmonsterall_sub(struct block_list *bl,va_list ap) +int buildin_killmonsterall_sub (struct block_list *bl, va_list ap) { - mob_delete((struct mob_data *)bl); - return 0; + mob_delete ((struct mob_data *) bl); + return 0; } -int buildin_killmonsterall(struct script_state *st) + +int buildin_killmonsterall (struct script_state *st) { - char *mapname; - int m; - mapname=conv_str(st,& (st->stack->stack_data[st->start+2])); + char *mapname; + int m; + mapname = conv_str (st, &(st->stack->stack_data[st->start + 2])); - if( (m=map_mapname2mapid(mapname))<0 ) - return 0; - map_foreachinarea(buildin_killmonsterall_sub, - m,0,0,map[m].xs,map[m].ys,BL_MOB); - return 0; + if ((m = map_mapname2mapid (mapname)) < 0) + return 0; + map_foreachinarea (buildin_killmonsterall_sub, + m, 0, 0, map[m].xs, map[m].ys, BL_MOB); + return 0; } /*========================================== * イベント実行 *------------------------------------------ */ -int buildin_doevent(struct script_state *st) +int buildin_doevent (struct script_state *st) { - char *event; - event=conv_str(st,& (st->stack->stack_data[st->start+2])); - npc_event(map_id2sd(st->rid),event,0); - return 0; + char *event; + event = conv_str (st, &(st->stack->stack_data[st->start + 2])); + npc_event (map_id2sd (st->rid), event, 0); + return 0; } + /*========================================== * NPC主体イベント実行 *------------------------------------------ */ -int buildin_donpcevent(struct script_state *st) +int buildin_donpcevent (struct script_state *st) { - char *event; - event=conv_str(st,& (st->stack->stack_data[st->start+2])); - npc_event_do(event); - return 0; + char *event; + event = conv_str (st, &(st->stack->stack_data[st->start + 2])); + npc_event_do (event); + return 0; } + /*========================================== * イベントタイマー追加 *------------------------------------------ */ -int buildin_addtimer(struct script_state *st) +int buildin_addtimer (struct script_state *st) { - char *event; - int tick; - tick=conv_num(st,& (st->stack->stack_data[st->start+2])); - event=conv_str(st,& (st->stack->stack_data[st->start+3])); - pc_addeventtimer(script_rid2sd(st),tick,event); - return 0; + char *event; + int tick; + tick = conv_num (st, &(st->stack->stack_data[st->start + 2])); + event = conv_str (st, &(st->stack->stack_data[st->start + 3])); + pc_addeventtimer (script_rid2sd (st), tick, event); + return 0; } + /*========================================== * イベントタイマー削除 *------------------------------------------ */ -int buildin_deltimer(struct script_state *st) +int buildin_deltimer (struct script_state *st) { - char *event; - event=conv_str(st,& (st->stack->stack_data[st->start+2])); - pc_deleventtimer(script_rid2sd(st),event); - return 0; + char *event; + event = conv_str (st, &(st->stack->stack_data[st->start + 2])); + pc_deleventtimer (script_rid2sd (st), event); + return 0; } + /*========================================== * イベントタイマーのカウント値追加 *------------------------------------------ */ -int buildin_addtimercount(struct script_state *st) +int buildin_addtimercount (struct script_state *st) { - char *event; - int tick; - event=conv_str(st,& (st->stack->stack_data[st->start+2])); - tick=conv_num(st,& (st->stack->stack_data[st->start+3])); - pc_addeventtimercount(script_rid2sd(st),event,tick); - return 0; + char *event; + int tick; + event = conv_str (st, &(st->stack->stack_data[st->start + 2])); + tick = conv_num (st, &(st->stack->stack_data[st->start + 3])); + pc_addeventtimercount (script_rid2sd (st), event, tick); + return 0; } /*========================================== * NPCタイマー初期化 *------------------------------------------ */ -int buildin_initnpctimer(struct script_state *st) +int buildin_initnpctimer (struct script_state *st) { - struct npc_data *nd; - if( st->end > st->start+2 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2]))); - else - nd=(struct npc_data *)map_id2bl(st->oid); + struct npc_data *nd; + if (st->end > st->start + 2) + nd = npc_name2id (conv_str + (st, &(st->stack->stack_data[st->start + 2]))); + else + nd = (struct npc_data *) map_id2bl (st->oid); - npc_settimerevent_tick(nd,0); - npc_timerevent_start(nd); - return 0; + npc_settimerevent_tick (nd, 0); + npc_timerevent_start (nd); + return 0; } + /*========================================== * NPCタイマー開始 *------------------------------------------ */ -int buildin_startnpctimer(struct script_state *st) +int buildin_startnpctimer (struct script_state *st) { - struct npc_data *nd; - if( st->end > st->start+2 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2]))); - else - nd=(struct npc_data *)map_id2bl(st->oid); + struct npc_data *nd; + if (st->end > st->start + 2) + nd = npc_name2id (conv_str + (st, &(st->stack->stack_data[st->start + 2]))); + else + nd = (struct npc_data *) map_id2bl (st->oid); - npc_timerevent_start(nd); - return 0; + npc_timerevent_start (nd); + return 0; } + /*========================================== * NPCタイマー停止 *------------------------------------------ */ -int buildin_stopnpctimer(struct script_state *st) +int buildin_stopnpctimer (struct script_state *st) { - struct npc_data *nd; - if( st->end > st->start+2 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2]))); - else - nd=(struct npc_data *)map_id2bl(st->oid); + struct npc_data *nd; + if (st->end > st->start + 2) + nd = npc_name2id (conv_str + (st, &(st->stack->stack_data[st->start + 2]))); + else + nd = (struct npc_data *) map_id2bl (st->oid); - npc_timerevent_stop(nd); - return 0; + npc_timerevent_stop (nd); + return 0; } + /*========================================== * NPCタイマー情報所得 *------------------------------------------ */ -int buildin_getnpctimer(struct script_state *st) +int buildin_getnpctimer (struct script_state *st) { - struct npc_data *nd; - int type=conv_num(st,& (st->stack->stack_data[st->start+2])); - int val=0; - if( st->end > st->start+3 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+3]))); - else - nd=(struct npc_data *)map_id2bl(st->oid); + struct npc_data *nd; + int type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + int val = 0; + if (st->end > st->start + 3) + nd = npc_name2id (conv_str + (st, &(st->stack->stack_data[st->start + 3]))); + else + nd = (struct npc_data *) map_id2bl (st->oid); - switch(type){ - case 0: val=npc_gettimerevent_tick(nd); break; - case 1: val= (nd->u.scr.nexttimer>=0); break; - case 2: val= nd->u.scr.timeramount; break; - } - push_val(st->stack,C_INT,val); - return 0; + switch (type) + { + case 0: + val = npc_gettimerevent_tick (nd); + break; + case 1: + val = (nd->u.scr.nexttimer >= 0); + break; + case 2: + val = nd->u.scr.timeramount; + break; + } + push_val (st->stack, C_INT, val); + return 0; } + /*========================================== * NPCタイマー値設定 *------------------------------------------ */ -int buildin_setnpctimer(struct script_state *st) +int buildin_setnpctimer (struct script_state *st) { - int tick; - struct npc_data *nd; - tick=conv_num(st,& (st->stack->stack_data[st->start+2])); - if( st->end > st->start+3 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+3]))); - else - nd=(struct npc_data *)map_id2bl(st->oid); + int tick; + struct npc_data *nd; + tick = conv_num (st, &(st->stack->stack_data[st->start + 2])); + if (st->end > st->start + 3) + nd = npc_name2id (conv_str + (st, &(st->stack->stack_data[st->start + 3]))); + else + nd = (struct npc_data *) map_id2bl (st->oid); - npc_settimerevent_tick(nd,tick); - return 0; + npc_settimerevent_tick (nd, tick); + return 0; } /*========================================== * 天の声アナウンス *------------------------------------------ */ -int buildin_announce(struct script_state *st) +int buildin_announce (struct script_state *st) { - char *str; - int flag; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - flag=conv_num(st,& (st->stack->stack_data[st->start+3])); + char *str; + int flag; + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + flag = conv_num (st, &(st->stack->stack_data[st->start + 3])); - if(flag&0x0f){ - struct block_list *bl=(flag&0x08)? map_id2bl(st->oid) : - (struct block_list *)script_rid2sd(st); - clif_GMmessage(bl,str,strlen(str)+1,flag); - }else - intif_GMmessage(str,strlen(str)+1,flag); - return 0; + if (flag & 0x0f) + { + struct block_list *bl = (flag & 0x08) ? map_id2bl (st->oid) : + (struct block_list *) script_rid2sd (st); + clif_GMmessage (bl, str, strlen (str) + 1, flag); + } + else + intif_GMmessage (str, strlen (str) + 1, flag); + return 0; } + /*========================================== * 天の声アナウンス(特定マップ) *------------------------------------------ */ -int buildin_mapannounce_sub(struct block_list *bl,va_list ap) +int buildin_mapannounce_sub (struct block_list *bl, va_list ap) { - char *str; - int len,flag; - str=va_arg(ap,char *); - len=va_arg(ap,int); - flag=va_arg(ap,int); - clif_GMmessage(bl,str,len,flag|3); - return 0; + char *str; + int len, flag; + str = va_arg (ap, char *); + len = va_arg (ap, int); + flag = va_arg (ap, int); + clif_GMmessage (bl, str, len, flag | 3); + return 0; } -int buildin_mapannounce(struct script_state *st) + +int buildin_mapannounce (struct script_state *st) { - char *mapname,*str; - int flag,m; + char *mapname, *str; + int flag, m; - mapname=conv_str(st,& (st->stack->stack_data[st->start+2])); - str=conv_str(st,& (st->stack->stack_data[st->start+3])); - flag=conv_num(st,& (st->stack->stack_data[st->start+4])); + mapname = conv_str (st, &(st->stack->stack_data[st->start + 2])); + str = conv_str (st, &(st->stack->stack_data[st->start + 3])); + flag = conv_num (st, &(st->stack->stack_data[st->start + 4])); - if( (m=map_mapname2mapid(mapname))<0 ) - return 0; - map_foreachinarea(buildin_mapannounce_sub, - m,0,0,map[m].xs,map[m].ys,BL_PC, str,strlen(str)+1,flag&0x10); - return 0; + if ((m = map_mapname2mapid (mapname)) < 0) + return 0; + map_foreachinarea (buildin_mapannounce_sub, + m, 0, 0, map[m].xs, map[m].ys, BL_PC, str, + strlen (str) + 1, flag & 0x10); + return 0; } + /*========================================== * 天の声アナウンス(特定エリア) *------------------------------------------ */ -int buildin_areaannounce(struct script_state *st) +int buildin_areaannounce (struct script_state *st) { - char *map,*str; - int flag,m; - int x0,y0,x1,y1; + char *map, *str; + int flag, m; + int x0, y0, x1, y1; - map=conv_str(st,& (st->stack->stack_data[st->start+2])); - x0=conv_num(st,& (st->stack->stack_data[st->start+3])); - y0=conv_num(st,& (st->stack->stack_data[st->start+4])); - x1=conv_num(st,& (st->stack->stack_data[st->start+5])); - y1=conv_num(st,& (st->stack->stack_data[st->start+6])); - str=conv_str(st,& (st->stack->stack_data[st->start+7])); - flag=conv_num(st,& (st->stack->stack_data[st->start+8])); + map = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x0 = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y0 = conv_num (st, &(st->stack->stack_data[st->start + 4])); + x1 = conv_num (st, &(st->stack->stack_data[st->start + 5])); + y1 = conv_num (st, &(st->stack->stack_data[st->start + 6])); + str = conv_str (st, &(st->stack->stack_data[st->start + 7])); + flag = conv_num (st, &(st->stack->stack_data[st->start + 8])); - if( (m=map_mapname2mapid(map))<0 ) - return 0; + if ((m = map_mapname2mapid (map)) < 0) + return 0; - map_foreachinarea(buildin_mapannounce_sub, - m,x0,y0,x1,y1,BL_PC, str,strlen(str)+1,flag&0x10 ); - return 0; + map_foreachinarea (buildin_mapannounce_sub, + m, x0, y0, x1, y1, BL_PC, str, strlen (str) + 1, + flag & 0x10); + return 0; } + /*========================================== * ユーザー数所得 *------------------------------------------ */ -int buildin_getusers(struct script_state *st) +int buildin_getusers (struct script_state *st) { - int flag=conv_num(st,& (st->stack->stack_data[st->start+2])); - struct block_list *bl=map_id2bl((flag&0x08)?st->oid:st->rid); - int val=0; - switch(flag&0x07){ - case 0: val=map[bl->m].users; break; - case 1: val=map_getusers(); break; - } - push_val(st->stack,C_INT,val); - return 0; + int flag = conv_num (st, &(st->stack->stack_data[st->start + 2])); + struct block_list *bl = map_id2bl ((flag & 0x08) ? st->oid : st->rid); + int val = 0; + switch (flag & 0x07) + { + case 0: + val = map[bl->m].users; + break; + case 1: + val = map_getusers (); + break; + } + push_val (st->stack, C_INT, val); + return 0; } + /*========================================== * マップ指定ユーザー数所得 *------------------------------------------ */ -int buildin_getmapusers(struct script_state *st) +int buildin_getmapusers (struct script_state *st) { - char *str; - int m; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - if( (m=map_mapname2mapid(str))< 0){ - push_val(st->stack,C_INT,-1); - return 0; - } - push_val(st->stack,C_INT,map[m].users); - return 0; + char *str; + int m; + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + if ((m = map_mapname2mapid (str)) < 0) + { + push_val (st->stack, C_INT, -1); + return 0; + } + push_val (st->stack, C_INT, map[m].users); + return 0; } + /*========================================== * エリア指定ユーザー数所得 *------------------------------------------ */ -int buildin_getareausers_sub(struct block_list *bl,va_list ap) +int buildin_getareausers_sub (struct block_list *bl, va_list ap) { - int *users=va_arg(ap,int *); - (*users)++; - return 0; + int *users = va_arg (ap, int *); + (*users)++; + return 0; } -int buildin_getareausers(struct script_state *st) + +int buildin_getareausers (struct script_state *st) { - char *str; - int m,x0,y0,x1,y1,users=0; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - x0=conv_num(st,& (st->stack->stack_data[st->start+3])); - y0=conv_num(st,& (st->stack->stack_data[st->start+4])); - x1=conv_num(st,& (st->stack->stack_data[st->start+5])); - y1=conv_num(st,& (st->stack->stack_data[st->start+6])); - if( (m=map_mapname2mapid(str))< 0){ - push_val(st->stack,C_INT,-1); - return 0; - } - map_foreachinarea(buildin_getareausers_sub, - m,x0,y0,x1,y1,BL_PC,&users); - push_val(st->stack,C_INT,users); - return 0; + char *str; + int m, x0, y0, x1, y1, users = 0; + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x0 = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y0 = conv_num (st, &(st->stack->stack_data[st->start + 4])); + x1 = conv_num (st, &(st->stack->stack_data[st->start + 5])); + y1 = conv_num (st, &(st->stack->stack_data[st->start + 6])); + if ((m = map_mapname2mapid (str)) < 0) + { + push_val (st->stack, C_INT, -1); + return 0; + } + map_foreachinarea (buildin_getareausers_sub, + m, x0, y0, x1, y1, BL_PC, &users); + push_val (st->stack, C_INT, users); + return 0; } /*========================================== * エリア指定ドロップアイテム数所得 *------------------------------------------ */ -int buildin_getareadropitem_sub(struct block_list *bl,va_list ap) +int buildin_getareadropitem_sub (struct block_list *bl, va_list ap) { - int item=va_arg(ap,int); - int *amount=va_arg(ap,int *); - struct flooritem_data *drop=(struct flooritem_data *)bl; + int item = va_arg (ap, int); + int *amount = va_arg (ap, int *); + struct flooritem_data *drop = (struct flooritem_data *) bl; - if(drop->item_data.nameid==item) - (*amount)+=drop->item_data.amount; + if (drop->item_data.nameid == item) + (*amount) += drop->item_data.amount; - return 0; + return 0; } -int buildin_getareadropitem(struct script_state *st) -{ - char *str; - int m,x0,y0,x1,y1,item,amount=0; - struct script_data *data; - - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - x0=conv_num(st,& (st->stack->stack_data[st->start+3])); - y0=conv_num(st,& (st->stack->stack_data[st->start+4])); - x1=conv_num(st,& (st->stack->stack_data[st->start+5])); - y1=conv_num(st,& (st->stack->stack_data[st->start+6])); - - data=&(st->stack->stack_data[st->start+7]); - get_val(st,data); - if( data->type==C_STR || data->type==C_CONSTSTR ){ - const char *name=conv_str(st,data); - struct item_data *item_data = itemdb_searchname(name); - item=512; - if( item_data ) - item=item_data->nameid; - }else - item=conv_num(st,data); - - if( (m=map_mapname2mapid(str))< 0){ - push_val(st->stack,C_INT,-1); - return 0; - } - map_foreachinarea(buildin_getareadropitem_sub, - m,x0,y0,x1,y1,BL_ITEM,item,&amount); - push_val(st->stack,C_INT,amount); - return 0; + +int buildin_getareadropitem (struct script_state *st) +{ + char *str; + int m, x0, y0, x1, y1, item, amount = 0; + struct script_data *data; + + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x0 = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y0 = conv_num (st, &(st->stack->stack_data[st->start + 4])); + x1 = conv_num (st, &(st->stack->stack_data[st->start + 5])); + y1 = conv_num (st, &(st->stack->stack_data[st->start + 6])); + + data = &(st->stack->stack_data[st->start + 7]); + get_val (st, data); + if (data->type == C_STR || data->type == C_CONSTSTR) + { + const char *name = conv_str (st, data); + struct item_data *item_data = itemdb_searchname (name); + item = 512; + if (item_data) + item = item_data->nameid; + } + else + item = conv_num (st, data); + + if ((m = map_mapname2mapid (str)) < 0) + { + push_val (st->stack, C_INT, -1); + return 0; + } + map_foreachinarea (buildin_getareadropitem_sub, + m, x0, y0, x1, y1, BL_ITEM, item, &amount); + push_val (st->stack, C_INT, amount); + return 0; } + /*========================================== * NPCの有効化 *------------------------------------------ */ -int buildin_enablenpc(struct script_state *st) +int buildin_enablenpc (struct script_state *st) { - char *str; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - npc_enable(str,1); - return 0; + char *str; + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + npc_enable (str, 1); + return 0; } + /*========================================== * NPCの無効化 *------------------------------------------ */ -int buildin_disablenpc(struct script_state *st) +int buildin_disablenpc (struct script_state *st) { - char *str; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - npc_enable(str,0); - return 0; + char *str; + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + npc_enable (str, 0); + return 0; } -int buildin_enablearena(struct script_state *st) // Added by RoVeRT +int buildin_enablearena (struct script_state *st) // Added by RoVeRT { - struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid); - struct chat_data *cd; + struct npc_data *nd = (struct npc_data *) map_id2bl (st->oid); + struct chat_data *cd; + if (nd == NULL + || (cd = (struct chat_data *) map_id2bl (nd->chat_id)) == NULL) + return 0; - if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL) - return 0; - - npc_enable(nd->name,1); - nd->arenaflag=1; + npc_enable (nd->name, 1); + nd->arenaflag = 1; - if(cd->users>=cd->trigger && cd->npc_event[0]) - npc_timer_event(cd->npc_event); + if (cd->users >= cd->trigger && cd->npc_event[0]) + npc_timer_event (cd->npc_event); - return 0; + return 0; } -int buildin_disablearena(struct script_state *st) // Added by RoVeRT + +int buildin_disablearena (struct script_state *st) // Added by RoVeRT { - struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid); - nd->arenaflag=0; + struct npc_data *nd = (struct npc_data *) map_id2bl (st->oid); + nd->arenaflag = 0; - return 0; + return 0; } + /*========================================== * 隠れているNPCの表示 *------------------------------------------ */ -int buildin_hideoffnpc(struct script_state *st) +int buildin_hideoffnpc (struct script_state *st) { - char *str; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - npc_enable(str,2); - return 0; + char *str; + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + npc_enable (str, 2); + return 0; } + /*========================================== * NPCをハイディング *------------------------------------------ */ -int buildin_hideonnpc(struct script_state *st) +int buildin_hideonnpc (struct script_state *st) { - char *str; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - npc_enable(str,4); - return 0; + char *str; + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + npc_enable (str, 4); + return 0; } + /*========================================== * 状態異常にかかる *------------------------------------------ */ -int buildin_sc_start(struct script_state *st) -{ - struct block_list *bl; - int type,tick,val1; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - tick=conv_num(st,& (st->stack->stack_data[st->start+3])); - val1=conv_num(st,& (st->stack->stack_data[st->start+4])); - if( st->end>st->start+5 ) //指定したキャラを状態異常にする - bl = map_id2bl(conv_num(st,& (st->stack->stack_data[st->start+5]))); - else - bl = map_id2bl(st->rid); - if(bl->type == BL_PC && ((struct map_session_data *)bl)->state.potionpitcher_flag) - bl = map_id2bl(((struct map_session_data *)bl)->skilltarget); - skill_status_change_start(bl,type,val1,0,0,0,tick,0); - return 0; +int buildin_sc_start (struct script_state *st) +{ + struct block_list *bl; + int type, tick, val1; + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + tick = conv_num (st, &(st->stack->stack_data[st->start + 3])); + val1 = conv_num (st, &(st->stack->stack_data[st->start + 4])); + if (st->end > st->start + 5) //指定したキャラを状態異常にする + bl = map_id2bl (conv_num + (st, &(st->stack->stack_data[st->start + 5]))); + else + bl = map_id2bl (st->rid); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)->state.potionpitcher_flag) + bl = map_id2bl (((struct map_session_data *) bl)->skilltarget); + skill_status_change_start (bl, type, val1, 0, 0, 0, tick, 0); + return 0; } /*========================================== * 状態異常にかかる(確率指定) *------------------------------------------ */ -int buildin_sc_start2(struct script_state *st) -{ - struct block_list *bl; - int type,tick,val1,per; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - tick=conv_num(st,& (st->stack->stack_data[st->start+3])); - val1=conv_num(st,& (st->stack->stack_data[st->start+4])); - per=conv_num(st,& (st->stack->stack_data[st->start+5])); - if( st->end>st->start+6 ) //指定したキャラを状態異常にする - bl = map_id2bl(conv_num(st,& (st->stack->stack_data[st->start+6]))); - else - bl = map_id2bl(st->rid); - if(bl->type == BL_PC && ((struct map_session_data *)bl)->state.potionpitcher_flag) - bl = map_id2bl(((struct map_session_data *)bl)->skilltarget); - if(MRAND(10000) < per) - skill_status_change_start(bl,type,val1,0,0,0,tick,0); - return 0; +int buildin_sc_start2 (struct script_state *st) +{ + struct block_list *bl; + int type, tick, val1, per; + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + tick = conv_num (st, &(st->stack->stack_data[st->start + 3])); + val1 = conv_num (st, &(st->stack->stack_data[st->start + 4])); + per = conv_num (st, &(st->stack->stack_data[st->start + 5])); + if (st->end > st->start + 6) //指定したキャラを状態異常にする + bl = map_id2bl (conv_num + (st, &(st->stack->stack_data[st->start + 6]))); + else + bl = map_id2bl (st->rid); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)->state.potionpitcher_flag) + bl = map_id2bl (((struct map_session_data *) bl)->skilltarget); + if (MRAND (10000) < per) + skill_status_change_start (bl, type, val1, 0, 0, 0, tick, 0); + return 0; } /*========================================== * 状態異常が直る *------------------------------------------ */ -int buildin_sc_end(struct script_state *st) +int buildin_sc_end (struct script_state *st) { - struct block_list *bl; - int type; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - bl = map_id2bl(st->rid); - if(bl->type == BL_PC && ((struct map_session_data *)bl)->state.potionpitcher_flag) - bl = map_id2bl(((struct map_session_data *)bl)->skilltarget); - skill_status_change_end(bl,type,-1); -// if(battle_config.etc_log) -// printf("sc_end : %d %d\n",st->rid,type); - return 0; + struct block_list *bl; + int type; + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + bl = map_id2bl (st->rid); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)->state.potionpitcher_flag) + bl = map_id2bl (((struct map_session_data *) bl)->skilltarget); + skill_status_change_end (bl, type, -1); +// if(battle_config.etc_log) +// printf("sc_end : %d %d\n",st->rid,type); + return 0; } -int buildin_sc_check(struct script_state *st) +int buildin_sc_check (struct script_state *st) { - struct block_list *bl; - int type; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - bl = map_id2bl(st->rid); - if(bl->type == BL_PC && ((struct map_session_data *)bl)->state.potionpitcher_flag) - bl = map_id2bl(((struct map_session_data *)bl)->skilltarget); + struct block_list *bl; + int type; + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + bl = map_id2bl (st->rid); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)->state.potionpitcher_flag) + bl = map_id2bl (((struct map_session_data *) bl)->skilltarget); - push_val (st->stack, C_INT, - skill_status_change_active(bl, type)); + push_val (st->stack, C_INT, skill_status_change_active (bl, type)); - return 0; + return 0; } /*========================================== * 状態異常耐性を計算した確率を返す *------------------------------------------ */ -int buildin_getscrate(struct script_state *st) +int buildin_getscrate (struct script_state *st) { - struct block_list *bl; - int sc_def=100,sc_def_mdef2,sc_def_vit2,sc_def_int2,sc_def_luk2; - int type,rate,luk; + struct block_list *bl; + int sc_def = 100, sc_def_mdef2, sc_def_vit2, sc_def_int2, sc_def_luk2; + int type, rate, luk; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - rate=conv_num(st,& (st->stack->stack_data[st->start+3])); - if( st->end>st->start+4 ) //指定したキャラの耐性を計算する - bl = map_id2bl(conv_num(st,& (st->stack->stack_data[st->start+6]))); - else - bl = map_id2bl(st->rid); + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + rate = conv_num (st, &(st->stack->stack_data[st->start + 3])); + if (st->end > st->start + 4) //指定したキャラの耐性を計算する + bl = map_id2bl (conv_num + (st, &(st->stack->stack_data[st->start + 6]))); + else + bl = map_id2bl (st->rid); - luk = battle_get_luk(bl); - sc_def_mdef2=100 - (3 + battle_get_mdef(bl) + luk/3); - sc_def_vit2=100 - (3 + battle_get_vit(bl) + luk/3); - sc_def_int2=100 - (3 + battle_get_int(bl) + luk/3); - sc_def_luk2=100 - (3 + luk); + luk = battle_get_luk (bl); + sc_def_mdef2 = 100 - (3 + battle_get_mdef (bl) + luk / 3); + sc_def_vit2 = 100 - (3 + battle_get_vit (bl) + luk / 3); + sc_def_int2 = 100 - (3 + battle_get_int (bl) + luk / 3); + sc_def_luk2 = 100 - (3 + luk); - if(type==SC_STONE || type==SC_FREEZE) - sc_def=sc_def_mdef2; - else if(type==SC_STAN || type==SC_POISON || type==SC_SILENCE) - sc_def=sc_def_vit2; - else if(type==SC_SLEEP || type==SC_CONFUSION || type==SC_BLIND) - sc_def=sc_def_int2; - else if(type==SC_CURSE) - sc_def=sc_def_luk2; + if (type == SC_STONE || type == SC_FREEZE) + sc_def = sc_def_mdef2; + else if (type == SC_STAN || type == SC_POISON || type == SC_SILENCE) + sc_def = sc_def_vit2; + else if (type == SC_SLEEP || type == SC_CONFUSION || type == SC_BLIND) + sc_def = sc_def_int2; + else if (type == SC_CURSE) + sc_def = sc_def_luk2; - rate=rate*sc_def/100; - push_val(st->stack,C_INT,rate); + rate = rate * sc_def / 100; + push_val (st->stack, C_INT, rate); - return 0; + return 0; } @@ -4239,910 +4905,1139 @@ int buildin_getscrate(struct script_state *st) * *------------------------------------------ */ -int buildin_debugmes(struct script_state *st) +int buildin_debugmes (struct script_state *st) { - conv_str(st,& (st->stack->stack_data[st->start+2])); - printf("script debug : %d %d : %s\n",st->rid,st->oid,st->stack->stack_data[st->start+2].u.str); - return 0; + conv_str (st, &(st->stack->stack_data[st->start + 2])); + printf ("script debug : %d %d : %s\n", st->rid, st->oid, + st->stack->stack_data[st->start + 2].u.str); + return 0; } /*========================================== * Added - AppleGirl For Advanced Classes, (Updated for Cleaner Script Purposes) *------------------------------------------ */ -int buildin_resetlvl(struct script_state *st) +int buildin_resetlvl (struct script_state *st) { - struct map_session_data *sd; + struct map_session_data *sd; - int type=conv_num(st,& (st->stack->stack_data[st->start+2])); + int type = conv_num (st, &(st->stack->stack_data[st->start + 2])); - sd=script_rid2sd(st); - pc_resetlvl(sd,type); - return 0; + sd = script_rid2sd (st); + pc_resetlvl (sd, type); + return 0; } + /*========================================== * ステータスリセット *------------------------------------------ */ -int buildin_resetstatus(struct script_state *st) +int buildin_resetstatus (struct script_state *st) { - struct map_session_data *sd; - sd=script_rid2sd(st); - pc_resetstate(sd); - return 0; + struct map_session_data *sd; + sd = script_rid2sd (st); + pc_resetstate (sd); + return 0; } /*========================================== * スキルリセット *------------------------------------------ */ -int buildin_resetskill(struct script_state *st) +int buildin_resetskill (struct script_state *st) { - struct map_session_data *sd; - sd=script_rid2sd(st); - pc_resetskill(sd); - return 0; + struct map_session_data *sd; + sd = script_rid2sd (st); + pc_resetskill (sd); + return 0; } /*========================================== * *------------------------------------------ */ -int buildin_changebase(struct script_state *st) +int buildin_changebase (struct script_state *st) { - struct map_session_data *sd=NULL; - int vclass; + struct map_session_data *sd = NULL; + int vclass; - if( st->end>st->start+3 ) - sd=map_id2sd(conv_num(st,& (st->stack->stack_data[st->start+3]))); - else - sd=script_rid2sd(st); + if (st->end > st->start + 3) + sd = map_id2sd (conv_num + (st, &(st->stack->stack_data[st->start + 3]))); + else + sd = script_rid2sd (st); - if(sd == NULL) - return 0; + if (sd == NULL) + return 0; - vclass = conv_num(st,& (st->stack->stack_data[st->start+2])); - if(vclass == 22 && !battle_config.wedding_modifydisplay) - return 0; + vclass = conv_num (st, &(st->stack->stack_data[st->start + 2])); + if (vclass == 22 && !battle_config.wedding_modifydisplay) + return 0; -// if(vclass==22) { -// pc_unequipitem(sd,sd->equip_index[9],0); // 装備外 -// } +// if(vclass==22) { +// pc_unequipitem(sd,sd->equip_index[9],0); // 装備外 +// } - sd->view_class = vclass; + sd->view_class = vclass; - return 0; + return 0; } /*========================================== * 性別変換 *------------------------------------------ */ -int buildin_changesex(struct script_state *st) { - struct map_session_data *sd = NULL; - sd = script_rid2sd(st); - - if (sd->status.sex == 0) { - sd->status.sex = 1; - sd->sex = 1; - if (sd->status.class == 20 || sd->status.class == 4021) - sd->status.class -= 1; - } else if (sd->status.sex == 1) { - sd->status.sex = 0; - sd->sex = 0; - if(sd->status.class == 19 || sd->status.class == 4020) - sd->status.class += 1; - } - chrif_char_ask_name(-1, sd->status.name, 5, 0, 0, 0, 0, 0, 0); // type: 5 - changesex - chrif_save(sd); - return 0; +int buildin_changesex (struct script_state *st) +{ + struct map_session_data *sd = NULL; + sd = script_rid2sd (st); + + if (sd->status.sex == 0) + { + sd->status.sex = 1; + sd->sex = 1; + if (sd->status.class == 20 || sd->status.class == 4021) + sd->status.class -= 1; + } + else if (sd->status.sex == 1) + { + sd->status.sex = 0; + sd->sex = 0; + if (sd->status.class == 19 || sd->status.class == 4020) + sd->status.class += 1; + } + chrif_char_ask_name (-1, sd->status.name, 5, 0, 0, 0, 0, 0, 0); // type: 5 - changesex + chrif_save (sd); + return 0; } /*========================================== * npcチャット作成 *------------------------------------------ */ -int buildin_waitingroom(struct script_state *st) -{ - char *name,*ev=""; - int limit, trigger = 0,pub=1; - name=conv_str(st,& (st->stack->stack_data[st->start+2])); - limit= conv_num(st,& (st->stack->stack_data[st->start+3])); - if(limit==0) - pub=3; - - if( (st->end > st->start+5) ){ - struct script_data* data=&(st->stack->stack_data[st->start+5]); - get_val(st,data); - if(data->type==C_INT){ - // 新Athena仕様(旧Athena仕様と互換性あり) - ev=conv_str(st,& (st->stack->stack_data[st->start+4])); - trigger=conv_num(st,& (st->stack->stack_data[st->start+5])); - }else{ - // eathena仕様 - trigger=conv_num(st,& (st->stack->stack_data[st->start+4])); - ev=conv_str(st,& (st->stack->stack_data[st->start+5])); - } - }else{ - // 旧Athena仕様 - if( st->end > st->start+4 ) - ev=conv_str(st,& (st->stack->stack_data[st->start+4])); - } - chat_createnpcchat( (struct npc_data *)map_id2bl(st->oid), - limit,pub,trigger,name,strlen(name)+1,ev); - return 0; +int buildin_waitingroom (struct script_state *st) +{ + char *name, *ev = ""; + int limit, trigger = 0, pub = 1; + name = conv_str (st, &(st->stack->stack_data[st->start + 2])); + limit = conv_num (st, &(st->stack->stack_data[st->start + 3])); + if (limit == 0) + pub = 3; + + if ((st->end > st->start + 5)) + { + struct script_data *data = &(st->stack->stack_data[st->start + 5]); + get_val (st, data); + if (data->type == C_INT) + { + // 新Athena仕様(旧Athena仕様と互換性あり) + ev = conv_str (st, &(st->stack->stack_data[st->start + 4])); + trigger = conv_num (st, &(st->stack->stack_data[st->start + 5])); + } + else + { + // eathena仕様 + trigger = conv_num (st, &(st->stack->stack_data[st->start + 4])); + ev = conv_str (st, &(st->stack->stack_data[st->start + 5])); + } + } + else + { + // 旧Athena仕様 + if (st->end > st->start + 4) + ev = conv_str (st, &(st->stack->stack_data[st->start + 4])); + } + chat_createnpcchat ((struct npc_data *) map_id2bl (st->oid), + limit, pub, trigger, name, strlen (name) + 1, ev); + return 0; } + /*========================================== * npcチャット削除 *------------------------------------------ */ -int buildin_delwaitingroom(struct script_state *st) +int buildin_delwaitingroom (struct script_state *st) { - struct npc_data *nd; - if( st->end > st->start+2 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2]))); - else - nd=(struct npc_data *)map_id2bl(st->oid); - chat_deletenpcchat(nd); - return 0; + struct npc_data *nd; + if (st->end > st->start + 2) + nd = npc_name2id (conv_str + (st, &(st->stack->stack_data[st->start + 2]))); + else + nd = (struct npc_data *) map_id2bl (st->oid); + chat_deletenpcchat (nd); + return 0; } + /*========================================== * npcチャット全員蹴り出す *------------------------------------------ */ -int buildin_waitingroomkickall(struct script_state *st) +int buildin_waitingroomkickall (struct script_state *st) { - struct npc_data *nd; - struct chat_data *cd; + struct npc_data *nd; + struct chat_data *cd; - if( st->end > st->start+2 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2]))); - else - nd=(struct npc_data *)map_id2bl(st->oid); + if (st->end > st->start + 2) + nd = npc_name2id (conv_str + (st, &(st->stack->stack_data[st->start + 2]))); + else + nd = (struct npc_data *) map_id2bl (st->oid); - if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL ) - return 0; - chat_npckickall(cd); - return 0; + if (nd == NULL + || (cd = (struct chat_data *) map_id2bl (nd->chat_id)) == NULL) + return 0; + chat_npckickall (cd); + return 0; } /*========================================== * npcチャットイベント有効化 *------------------------------------------ */ -int buildin_enablewaitingroomevent(struct script_state *st) +int buildin_enablewaitingroomevent (struct script_state *st) { - struct npc_data *nd; - struct chat_data *cd; + struct npc_data *nd; + struct chat_data *cd; - if( st->end > st->start+2 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2]))); - else - nd=(struct npc_data *)map_id2bl(st->oid); + if (st->end > st->start + 2) + nd = npc_name2id (conv_str + (st, &(st->stack->stack_data[st->start + 2]))); + else + nd = (struct npc_data *) map_id2bl (st->oid); - if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL ) - return 0; - chat_enableevent(cd); - return 0; + if (nd == NULL + || (cd = (struct chat_data *) map_id2bl (nd->chat_id)) == NULL) + return 0; + chat_enableevent (cd); + return 0; } /*========================================== * npcチャットイベント無効化 *------------------------------------------ */ -int buildin_disablewaitingroomevent(struct script_state *st) +int buildin_disablewaitingroomevent (struct script_state *st) { - struct npc_data *nd; - struct chat_data *cd; + struct npc_data *nd; + struct chat_data *cd; - if( st->end > st->start+2 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2]))); - else - nd=(struct npc_data *)map_id2bl(st->oid); + if (st->end > st->start + 2) + nd = npc_name2id (conv_str + (st, &(st->stack->stack_data[st->start + 2]))); + else + nd = (struct npc_data *) map_id2bl (st->oid); - if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL ) - return 0; - chat_disableevent(cd); - return 0; + if (nd == NULL + || (cd = (struct chat_data *) map_id2bl (nd->chat_id)) == NULL) + return 0; + chat_disableevent (cd); + return 0; } + /*========================================== * npcチャット状態所得 *------------------------------------------ */ -int buildin_getwaitingroomstate(struct script_state *st) +int buildin_getwaitingroomstate (struct script_state *st) { - struct npc_data *nd; - struct chat_data *cd; - int val=0,type; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - if( st->end > st->start+3 ) - nd=npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+3]))); - else - nd=(struct npc_data *)map_id2bl(st->oid); - - if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL ){ - push_val(st->stack,C_INT,-1); - return 0; - } + struct npc_data *nd; + struct chat_data *cd; + int val = 0, type; + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + if (st->end > st->start + 3) + nd = npc_name2id (conv_str + (st, &(st->stack->stack_data[st->start + 3]))); + else + nd = (struct npc_data *) map_id2bl (st->oid); - switch(type){ - case 0: val=cd->users; break; - case 1: val=cd->limit; break; - case 2: val=cd->trigger&0x7f; break; - case 3: val=((cd->trigger&0x80)>0); break; - case 32: val=(cd->users >= cd->limit); break; - case 33: val=(cd->users >= cd->trigger); break; - - case 4: - push_str(st->stack,C_CONSTSTR,cd->title); - return 0; - case 5: - push_str(st->stack,C_CONSTSTR,cd->pass); - return 0; - case 16: - push_str(st->stack,C_CONSTSTR,cd->npc_event); - return 0; - } - push_val(st->stack,C_INT,val); - return 0; + if (nd == NULL + || (cd = (struct chat_data *) map_id2bl (nd->chat_id)) == NULL) + { + push_val (st->stack, C_INT, -1); + return 0; + } + + switch (type) + { + case 0: + val = cd->users; + break; + case 1: + val = cd->limit; + break; + case 2: + val = cd->trigger & 0x7f; + break; + case 3: + val = ((cd->trigger & 0x80) > 0); + break; + case 32: + val = (cd->users >= cd->limit); + break; + case 33: + val = (cd->users >= cd->trigger); + break; + + case 4: + push_str (st->stack, C_CONSTSTR, cd->title); + return 0; + case 5: + push_str (st->stack, C_CONSTSTR, cd->pass); + return 0; + case 16: + push_str (st->stack, C_CONSTSTR, cd->npc_event); + return 0; + } + push_val (st->stack, C_INT, val); + return 0; } /*========================================== * チャットメンバー(規定人数)ワープ *------------------------------------------ */ -int buildin_warpwaitingpc(struct script_state *st) +int buildin_warpwaitingpc (struct script_state *st) { - int x,y,i,n; - char *str; - struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid); - struct chat_data *cd; + int x, y, i, n; + char *str; + struct npc_data *nd = (struct npc_data *) map_id2bl (st->oid); + struct chat_data *cd; - if(nd==NULL || (cd=(struct chat_data *)map_id2bl(nd->chat_id))==NULL ) - return 0; + if (nd == NULL + || (cd = (struct chat_data *) map_id2bl (nd->chat_id)) == NULL) + return 0; - n=cd->trigger&0x7f; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - x=conv_num(st,& (st->stack->stack_data[st->start+3])); - y=conv_num(st,& (st->stack->stack_data[st->start+4])); + n = cd->trigger & 0x7f; + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y = conv_num (st, &(st->stack->stack_data[st->start + 4])); - if( st->end > st->start+5 ) - n=conv_num(st,& (st->stack->stack_data[st->start+5])); + if (st->end > st->start + 5) + n = conv_num (st, &(st->stack->stack_data[st->start + 5])); - for(i=0;i<n;i++){ - struct map_session_data *sd=cd->usersd[0]; // リスト先頭のPCを次々に。 + for (i = 0; i < n; i++) + { + struct map_session_data *sd = cd->usersd[0]; // リスト先頭のPCを次々に。 - mapreg_setreg(add_str("$@warpwaitingpc")+(i<<24),sd->bl.id); + mapreg_setreg (add_str ("$@warpwaitingpc") + (i << 24), sd->bl.id); - if(strcmp(str,"Random")==0) - pc_randomwarp(sd,3); - else if(strcmp(str,"SavePoint")==0){ - if(map[sd->bl.m].flag.noteleport) // テレポ禁止 - return 0; + if (strcmp (str, "Random") == 0) + pc_randomwarp (sd, 3); + else if (strcmp (str, "SavePoint") == 0) + { + if (map[sd->bl.m].flag.noteleport) // テレポ禁止 + return 0; - pc_setpos(sd,sd->status.save_point.map, - sd->status.save_point.x,sd->status.save_point.y,3); - }else - pc_setpos(sd,str,x,y,0); - } - mapreg_setreg(add_str("$@warpwaitingpcnum"),n); - return 0; + pc_setpos (sd, sd->status.save_point.map, + sd->status.save_point.x, sd->status.save_point.y, 3); + } + else + pc_setpos (sd, str, x, y, 0); + } + mapreg_setreg (add_str ("$@warpwaitingpcnum"), n); + return 0; } + /*========================================== * RIDのアタッチ *------------------------------------------ */ -int buildin_attachrid(struct script_state *st) +int buildin_attachrid (struct script_state *st) { - st->rid=conv_num(st,& (st->stack->stack_data[st->start+2])); - push_val(st->stack,C_INT, (map_id2sd(st->rid)!=NULL)); - return 0; + st->rid = conv_num (st, &(st->stack->stack_data[st->start + 2])); + push_val (st->stack, C_INT, (map_id2sd (st->rid) != NULL)); + return 0; } + /*========================================== * RIDのデタッチ *------------------------------------------ */ -int buildin_detachrid(struct script_state *st) +int buildin_detachrid (struct script_state *st) { - st->rid=0; - return 0; + st->rid = 0; + return 0; } + /*========================================== * 存在チェック *------------------------------------------ */ -int buildin_isloggedin(struct script_state *st) +int buildin_isloggedin (struct script_state *st) { - push_val(st->stack,C_INT, map_id2sd( - conv_num(st,& (st->stack->stack_data[st->start+2])) )!=NULL ); - return 0; + push_val (st->stack, C_INT, + map_id2sd (conv_num + (st, + &(st->stack->stack_data[st->start + 2]))) != NULL); + return 0; } - /*========================================== * *------------------------------------------ */ -enum { MF_NOMEMO,MF_NOTELEPORT,MF_NOSAVE,MF_NOBRANCH,MF_NOPENALTY,MF_NOZENYPENALTY,MF_PVP,MF_PVP_NOPARTY,MF_PVP_NOGUILD,MF_GVG,MF_GVG_NOPARTY,MF_NOTRADE,MF_NOSKILL, MF_NOWARP,MF_NOPVP,MF_NOICEWALL, - MF_SNOW, MF_FOG, MF_SAKURA, MF_LEAVES, MF_RAIN }; - -int buildin_setmapflagnosave(struct script_state *st) -{ - int m,x,y; - char *str,*str2; +enum +{ MF_NOMEMO, MF_NOTELEPORT, MF_NOSAVE, MF_NOBRANCH, MF_NOPENALTY, + MF_NOZENYPENALTY, MF_PVP, MF_PVP_NOPARTY, MF_PVP_NOGUILD, MF_GVG, + MF_GVG_NOPARTY, MF_NOTRADE, MF_NOSKILL, MF_NOWARP, MF_NOPVP, + MF_NOICEWALL, + MF_SNOW, MF_FOG, MF_SAKURA, MF_LEAVES, MF_RAIN +}; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - str2=conv_str(st,& (st->stack->stack_data[st->start+3])); - x=conv_num(st,& (st->stack->stack_data[st->start+4])); - y=conv_num(st,& (st->stack->stack_data[st->start+5])); - m = map_mapname2mapid(str); - if(m >= 0) { - map[m].flag.nosave=1; - memcpy(map[m].save.map,str2,16); - map[m].save.x=x; - map[m].save.y=y; - } +int buildin_setmapflagnosave (struct script_state *st) +{ + int m, x, y; + char *str, *str2; + + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + str2 = conv_str (st, &(st->stack->stack_data[st->start + 3])); + x = conv_num (st, &(st->stack->stack_data[st->start + 4])); + y = conv_num (st, &(st->stack->stack_data[st->start + 5])); + m = map_mapname2mapid (str); + if (m >= 0) + { + map[m].flag.nosave = 1; + memcpy (map[m].save.map, str2, 16); + map[m].save.x = x; + map[m].save.y = y; + } + + return 0; +} + +int buildin_setmapflag (struct script_state *st) +{ + int m, i; + char *str; + + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + i = conv_num (st, &(st->stack->stack_data[st->start + 3])); + m = map_mapname2mapid (str); + if (m >= 0) + { + switch (i) + { + case MF_NOMEMO: + map[m].flag.nomemo = 1; + break; + case MF_NOTELEPORT: + map[m].flag.noteleport = 1; + break; + case MF_NOBRANCH: + map[m].flag.nobranch = 1; + break; + case MF_NOPENALTY: + map[m].flag.nopenalty = 1; + break; + case MF_PVP_NOPARTY: + map[m].flag.pvp_noparty = 1; + break; + case MF_PVP_NOGUILD: + map[m].flag.pvp_noguild = 1; + break; + case MF_GVG_NOPARTY: + map[m].flag.gvg_noparty = 1; + break; + case MF_NOZENYPENALTY: + map[m].flag.nozenypenalty = 1; + break; + case MF_NOTRADE: + map[m].flag.notrade = 1; + break; + case MF_NOSKILL: + map[m].flag.noskill = 1; + break; + case MF_NOWARP: + map[m].flag.nowarp = 1; + break; + case MF_NOPVP: + map[m].flag.nopvp = 1; + break; + case MF_NOICEWALL: // [Valaris] + map[m].flag.noicewall = 1; + break; + case MF_SNOW: // [Valaris] + map[m].flag.snow = 1; + break; + case MF_FOG: // [Valaris] + map[m].flag.fog = 1; + break; + case MF_SAKURA: // [Valaris] + map[m].flag.sakura = 1; + break; + case MF_LEAVES: // [Valaris] + map[m].flag.leaves = 1; + break; + case MF_RAIN: // [Valaris] + map[m].flag.rain = 1; + break; + } + } - return 0; + return 0; } -int buildin_setmapflag(struct script_state *st) -{ - int m,i; - char *str; - - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - i=conv_num(st,& (st->stack->stack_data[st->start+3])); - m = map_mapname2mapid(str); - if(m >= 0) { - switch(i) { - case MF_NOMEMO: - map[m].flag.nomemo=1; - break; - case MF_NOTELEPORT: - map[m].flag.noteleport=1; - break; - case MF_NOBRANCH: - map[m].flag.nobranch=1; - break; - case MF_NOPENALTY: - map[m].flag.nopenalty=1; - break; - case MF_PVP_NOPARTY: - map[m].flag.pvp_noparty=1; - break; - case MF_PVP_NOGUILD: - map[m].flag.pvp_noguild=1; - break; - case MF_GVG_NOPARTY: - map[m].flag.gvg_noparty=1; - break; - case MF_NOZENYPENALTY: - map[m].flag.nozenypenalty=1; - break; - case MF_NOTRADE: - map[m].flag.notrade=1; - break; - case MF_NOSKILL: - map[m].flag.noskill=1; - break; - case MF_NOWARP: - map[m].flag.nowarp=1; - break; - case MF_NOPVP: - map[m].flag.nopvp=1; - break; - case MF_NOICEWALL: // [Valaris] - map[m].flag.noicewall=1; - break; - case MF_SNOW: // [Valaris] - map[m].flag.snow=1; - break; - case MF_FOG: // [Valaris] - map[m].flag.fog=1; - break; - case MF_SAKURA: // [Valaris] - map[m].flag.sakura=1; - break; - case MF_LEAVES: // [Valaris] - map[m].flag.leaves=1; - break; - case MF_RAIN: // [Valaris] - map[m].flag.rain=1; - break; - } - } - - return 0; -} +int buildin_removemapflag (struct script_state *st) +{ + int m, i; + char *str; -int buildin_removemapflag(struct script_state *st) -{ - int m,i; - char *str; - - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - i=conv_num(st,& (st->stack->stack_data[st->start+3])); - m = map_mapname2mapid(str); - if(m >= 0) { - switch(i) { - case MF_NOMEMO: - map[m].flag.nomemo=0; - break; - case MF_NOTELEPORT: - map[m].flag.noteleport=0; - break; - case MF_NOSAVE: - map[m].flag.nosave=0; - break; - case MF_NOBRANCH: - map[m].flag.nobranch=0; - break; - case MF_NOPENALTY: - map[m].flag.nopenalty=0; - break; - case MF_PVP_NOPARTY: - map[m].flag.pvp_noparty=0; - break; - case MF_PVP_NOGUILD: - map[m].flag.pvp_noguild=0; - break; - case MF_GVG_NOPARTY: - map[m].flag.gvg_noparty=0; - break; - case MF_NOZENYPENALTY: - map[m].flag.nozenypenalty=0; - break; - case MF_NOSKILL: - map[m].flag.noskill=0; - break; - case MF_NOWARP: - map[m].flag.nowarp=0; - break; - case MF_NOPVP: - map[m].flag.nopvp=0; - break; - case MF_NOICEWALL: // [Valaris] - map[m].flag.noicewall=0; - break; - case MF_SNOW: // [Valaris] - map[m].flag.snow=0; - break; - case MF_FOG: // [Valaris] - map[m].flag.fog=0; - break; - case MF_SAKURA: // [Valaris] - map[m].flag.sakura=0; - break; - case MF_LEAVES: // [Valaris] - map[m].flag.leaves=0; - break; - case MF_RAIN: // [Valaris] - map[m].flag.rain=0; - break; + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + i = conv_num (st, &(st->stack->stack_data[st->start + 3])); + m = map_mapname2mapid (str); + if (m >= 0) + { + switch (i) + { + case MF_NOMEMO: + map[m].flag.nomemo = 0; + break; + case MF_NOTELEPORT: + map[m].flag.noteleport = 0; + break; + case MF_NOSAVE: + map[m].flag.nosave = 0; + break; + case MF_NOBRANCH: + map[m].flag.nobranch = 0; + break; + case MF_NOPENALTY: + map[m].flag.nopenalty = 0; + break; + case MF_PVP_NOPARTY: + map[m].flag.pvp_noparty = 0; + break; + case MF_PVP_NOGUILD: + map[m].flag.pvp_noguild = 0; + break; + case MF_GVG_NOPARTY: + map[m].flag.gvg_noparty = 0; + break; + case MF_NOZENYPENALTY: + map[m].flag.nozenypenalty = 0; + break; + case MF_NOSKILL: + map[m].flag.noskill = 0; + break; + case MF_NOWARP: + map[m].flag.nowarp = 0; + break; + case MF_NOPVP: + map[m].flag.nopvp = 0; + break; + case MF_NOICEWALL: // [Valaris] + map[m].flag.noicewall = 0; + break; + case MF_SNOW: // [Valaris] + map[m].flag.snow = 0; + break; + case MF_FOG: // [Valaris] + map[m].flag.fog = 0; + break; + case MF_SAKURA: // [Valaris] + map[m].flag.sakura = 0; + break; + case MF_LEAVES: // [Valaris] + map[m].flag.leaves = 0; + break; + case MF_RAIN: // [Valaris] + map[m].flag.rain = 0; + break; - } - } + } + } - return 0; + return 0; } -int buildin_pvpon(struct script_state *st) +int buildin_pvpon (struct script_state *st) { - int m,i; - char *str; - struct map_session_data *pl_sd=NULL; + int m, i; + char *str; + struct map_session_data *pl_sd = NULL; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - m = map_mapname2mapid(str); - if(m >= 0 && !map[m].flag.pvp && !map[m].flag.nopvp) { - map[m].flag.pvp = 1; - clif_send0199(m,1); + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + m = map_mapname2mapid (str); + if (m >= 0 && !map[m].flag.pvp && !map[m].flag.nopvp) + { + map[m].flag.pvp = 1; + clif_send0199 (m, 1); - if(battle_config.pk_mode) // disable ranking functions if pk_mode is on [Valaris] - return 0; + if (battle_config.pk_mode) // disable ranking functions if pk_mode is on [Valaris] + return 0; - for(i=0;i<fd_max;i++){ //人数分ループ - if(session[i] && (pl_sd=session[i]->session_data) && pl_sd->state.auth){ - if(m == pl_sd->bl.m && pl_sd->pvp_timer == -1) { - pl_sd->pvp_timer=add_timer(gettick()+200,pc_calc_pvprank_timer,pl_sd->bl.id,0); - pl_sd->pvp_rank=0; - pl_sd->pvp_lastusers=0; - pl_sd->pvp_point=5; - } - } - } - } + for (i = 0; i < fd_max; i++) + { //人数分ループ + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + if (m == pl_sd->bl.m && pl_sd->pvp_timer == -1) + { + pl_sd->pvp_timer = + add_timer (gettick () + 200, pc_calc_pvprank_timer, + pl_sd->bl.id, 0); + pl_sd->pvp_rank = 0; + pl_sd->pvp_lastusers = 0; + pl_sd->pvp_point = 5; + } + } + } + } - return 0; + return 0; } -int buildin_pvpoff(struct script_state *st) +int buildin_pvpoff (struct script_state *st) { - int m,i; - char *str; - struct map_session_data *pl_sd=NULL; + int m, i; + char *str; + struct map_session_data *pl_sd = NULL; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - m = map_mapname2mapid(str); - if(m >= 0 && map[m].flag.pvp && map[m].flag.nopvp) { - map[m].flag.pvp = 0; - clif_send0199(m,0); + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + m = map_mapname2mapid (str); + if (m >= 0 && map[m].flag.pvp && map[m].flag.nopvp) + { + map[m].flag.pvp = 0; + clif_send0199 (m, 0); - if(battle_config.pk_mode) // disable ranking options if pk_mode is on [Valaris] - return 0; + if (battle_config.pk_mode) // disable ranking options if pk_mode is on [Valaris] + return 0; - for(i=0;i<fd_max;i++){ //人数分ループ - if(session[i] && (pl_sd=session[i]->session_data) && pl_sd->state.auth){ - if(m == pl_sd->bl.m) { - clif_pvpset(pl_sd,0,0,2); - if(pl_sd->pvp_timer != -1) { - delete_timer(pl_sd->pvp_timer,pc_calc_pvprank_timer); - pl_sd->pvp_timer = -1; - } - } - } - } - } + for (i = 0; i < fd_max; i++) + { //人数分ループ + if (session[i] && (pl_sd = session[i]->session_data) + && pl_sd->state.auth) + { + if (m == pl_sd->bl.m) + { + clif_pvpset (pl_sd, 0, 0, 2); + if (pl_sd->pvp_timer != -1) + { + delete_timer (pl_sd->pvp_timer, + pc_calc_pvprank_timer); + pl_sd->pvp_timer = -1; + } + } + } + } + } - return 0; + return 0; } -int buildin_gvgon(struct script_state *st) +int buildin_gvgon (struct script_state *st) { - int m; - char *str; + int m; + char *str; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - m = map_mapname2mapid(str); - if(m >= 0 && !map[m].flag.gvg) { - map[m].flag.gvg = 1; - clif_send0199(m,3); - } + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + m = map_mapname2mapid (str); + if (m >= 0 && !map[m].flag.gvg) + { + map[m].flag.gvg = 1; + clif_send0199 (m, 3); + } - return 0; + return 0; } -int buildin_gvgoff(struct script_state *st) + +int buildin_gvgoff (struct script_state *st) { - int m; - char *str; + int m; + char *str; - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - m = map_mapname2mapid(str); - if(m >= 0 && map[m].flag.gvg) { - map[m].flag.gvg = 0; - clif_send0199(m,0); - } + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + m = map_mapname2mapid (str); + if (m >= 0 && map[m].flag.gvg) + { + map[m].flag.gvg = 0; + clif_send0199 (m, 0); + } - return 0; + return 0; } + /*========================================== * NPCエモーション *------------------------------------------ */ -int buildin_emotion(struct script_state *st) +int buildin_emotion (struct script_state *st) { - int type; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - if(type < 0 || type > 100) - return 0; - clif_emotion(map_id2bl(st->oid),type); - return 0; + int type; + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + if (type < 0 || type > 100) + return 0; + clif_emotion (map_id2bl (st->oid), type); + return 0; } -int buildin_maprespawnguildid_sub(struct block_list *bl,va_list ap) +int buildin_maprespawnguildid_sub (struct block_list *bl, va_list ap) { - int g_id=va_arg(ap,int); - int flag=va_arg(ap,int); - struct map_session_data *sd=NULL; - struct mob_data *md=NULL; - - if(bl->type == BL_PC) - sd=(struct map_session_data*)bl; - if(bl->type == BL_MOB) - md=(struct mob_data *)bl; - - if(sd){ - if((sd->status.guild_id == g_id) && (flag&1)) - pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3); - else if((sd->status.guild_id != g_id) && (flag&2)) - pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3); - else if (sd->status.guild_id == 0) // Warp out players not in guild [Valaris] - pc_setpos(sd,sd->status.save_point.map,sd->status.save_point.x,sd->status.save_point.y,3); // end addition [Valaris] - } - if(md && flag&4){ - if(md->class < 1285 || md->class > 1288) - mob_delete(md); - } - return 0; + int g_id = va_arg (ap, int); + int flag = va_arg (ap, int); + struct map_session_data *sd = NULL; + struct mob_data *md = NULL; + + if (bl->type == BL_PC) + sd = (struct map_session_data *) bl; + if (bl->type == BL_MOB) + md = (struct mob_data *) bl; + + if (sd) + { + if ((sd->status.guild_id == g_id) && (flag & 1)) + pc_setpos (sd, sd->status.save_point.map, sd->status.save_point.x, + sd->status.save_point.y, 3); + else if ((sd->status.guild_id != g_id) && (flag & 2)) + pc_setpos (sd, sd->status.save_point.map, sd->status.save_point.x, + sd->status.save_point.y, 3); + else if (sd->status.guild_id == 0) // Warp out players not in guild [Valaris] + pc_setpos (sd, sd->status.save_point.map, sd->status.save_point.x, sd->status.save_point.y, 3); // end addition [Valaris] + } + if (md && flag & 4) + { + if (md->class < 1285 || md->class > 1288) + mob_delete (md); + } + return 0; } -int buildin_maprespawnguildid(struct script_state *st) + +int buildin_maprespawnguildid (struct script_state *st) { - char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2])); - int g_id=conv_num(st,& (st->stack->stack_data[st->start+3])); - int flag=conv_num(st,& (st->stack->stack_data[st->start+4])); + char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2])); + int g_id = conv_num (st, &(st->stack->stack_data[st->start + 3])); + int flag = conv_num (st, &(st->stack->stack_data[st->start + 4])); - int m=map_mapname2mapid(mapname); + int m = map_mapname2mapid (mapname); - if(m) map_foreachinarea(buildin_maprespawnguildid_sub,m,0,0,map[m].xs-1,map[m].ys-1,BL_NUL,g_id,flag); - return 0; + if (m) + map_foreachinarea (buildin_maprespawnguildid_sub, m, 0, 0, + map[m].xs - 1, map[m].ys - 1, BL_NUL, g_id, flag); + return 0; } -int buildin_agitstart(struct script_state *st) +int buildin_agitstart (struct script_state *st) { - if(agit_flag==1) return 1; // Agit already Start. - agit_flag=1; - guild_agit_start(); - return 0; + if (agit_flag == 1) + return 1; // Agit already Start. + agit_flag = 1; + guild_agit_start (); + return 0; } -int buildin_agitend(struct script_state *st) +int buildin_agitend (struct script_state *st) { - if(agit_flag==0) return 1; // Agit already End. - agit_flag=0; - guild_agit_end(); - return 0; + if (agit_flag == 0) + return 1; // Agit already End. + agit_flag = 0; + guild_agit_end (); + return 0; } + /*========================================== * agitcheck 1; // choice script * if(@agit_flag == 1) goto agit; * if(agitcheck(0) == 1) goto agit; *------------------------------------------ */ -int buildin_agitcheck(struct script_state *st) +int buildin_agitcheck (struct script_state *st) { - struct map_session_data *sd; - int cond; + struct map_session_data *sd; + int cond; - sd=script_rid2sd(st); - cond=conv_num(st,& (st->stack->stack_data[st->start+2])); + sd = script_rid2sd (st); + cond = conv_num (st, &(st->stack->stack_data[st->start + 2])); - if(cond == 0) { - if (agit_flag==1) push_val(st->stack,C_INT,1); - if (agit_flag==0) push_val(st->stack,C_INT,0); - } else { - if (agit_flag==1) pc_setreg(sd,add_str("@agit_flag"),1); - if (agit_flag==0) pc_setreg(sd,add_str("@agit_flag"),0); - } - return 0; -} -int buildin_flagemblem(struct script_state *st) -{ - int g_id=conv_num(st,& (st->stack->stack_data[st->start+2])); - - if(g_id < 0) return 0; - -// printf("Script.c: [FlagEmblem] GuildID=%d, Emblem=%d.\n", g->guild_id, g->emblem_id); - ((struct npc_data *)map_id2bl(st->oid))->u.scr.guild_id = g_id; - return 1; -} - -int buildin_getcastlename(struct script_state *st) -{ - char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2])); - struct guild_castle *gc; - int i; - char *buf=NULL; - for(i=0;i<MAX_GUILDCASTLE;i++){ - if( (gc=guild_castle_search(i)) != NULL ){ - if(strcmp(mapname,gc->map_name)==0){ - buf=(char *)aCalloc(24,sizeof(char)); - strncpy(buf,gc->castle_name,24); - break; - } - } - } - if(buf) - push_str(st->stack,C_STR,buf); - else - push_str(st->stack,C_CONSTSTR,""); - return 0; + if (cond == 0) + { + if (agit_flag == 1) + push_val (st->stack, C_INT, 1); + if (agit_flag == 0) + push_val (st->stack, C_INT, 0); + } + else + { + if (agit_flag == 1) + pc_setreg (sd, add_str ("@agit_flag"), 1); + if (agit_flag == 0) + pc_setreg (sd, add_str ("@agit_flag"), 0); + } + return 0; } -int buildin_getcastledata(struct script_state *st) +int buildin_flagemblem (struct script_state *st) { - char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2])); - int index=conv_num(st,& (st->stack->stack_data[st->start+3])); - char *event=NULL; - struct guild_castle *gc; - int i,j; + int g_id = conv_num (st, &(st->stack->stack_data[st->start + 2])); - if( st->end>st->start+4 && index==0){ - for(i=0,j=-1;i<MAX_GUILDCASTLE;i++) - if( (gc=guild_castle_search(i)) != NULL && - strcmp(mapname,gc->map_name)==0 ) - j=i; - if(j>=0){ - event=conv_str(st,& (st->stack->stack_data[st->start+4])); - guild_addcastleinfoevent(j,17,event); - } - } - - for(i=0;i<MAX_GUILDCASTLE;i++){ - if( (gc=guild_castle_search(i)) != NULL ){ - if(strcmp(mapname,gc->map_name)==0){ - switch(index){ - case 0: for(j=1;j<26;j++) guild_castledataload(gc->castle_id,j); break; // Initialize[AgitInit] - case 1: push_val(st->stack,C_INT,gc->guild_id); break; - case 2: push_val(st->stack,C_INT,gc->economy); break; - case 3: push_val(st->stack,C_INT,gc->defense); break; - case 4: push_val(st->stack,C_INT,gc->triggerE); break; - case 5: push_val(st->stack,C_INT,gc->triggerD); break; - case 6: push_val(st->stack,C_INT,gc->nextTime); break; - case 7: push_val(st->stack,C_INT,gc->payTime); break; - case 8: push_val(st->stack,C_INT,gc->createTime); break; - case 9: push_val(st->stack,C_INT,gc->visibleC); break; - case 10: push_val(st->stack,C_INT,gc->visibleG0); break; - case 11: push_val(st->stack,C_INT,gc->visibleG1); break; - case 12: push_val(st->stack,C_INT,gc->visibleG2); break; - case 13: push_val(st->stack,C_INT,gc->visibleG3); break; - case 14: push_val(st->stack,C_INT,gc->visibleG4); break; - case 15: push_val(st->stack,C_INT,gc->visibleG5); break; - case 16: push_val(st->stack,C_INT,gc->visibleG6); break; - case 17: push_val(st->stack,C_INT,gc->visibleG7); break; - case 18: push_val(st->stack,C_INT,gc->Ghp0); break; - case 19: push_val(st->stack,C_INT,gc->Ghp1); break; - case 20: push_val(st->stack,C_INT,gc->Ghp2); break; - case 21: push_val(st->stack,C_INT,gc->Ghp3); break; - case 22: push_val(st->stack,C_INT,gc->Ghp4); break; - case 23: push_val(st->stack,C_INT,gc->Ghp5); break; - case 24: push_val(st->stack,C_INT,gc->Ghp6); break; - case 25: push_val(st->stack,C_INT,gc->Ghp7); break; - default: - push_val(st->stack,C_INT,0); break; - } - return 0; - } - } - } - push_val(st->stack,C_INT,0); - return 0; -} + if (g_id < 0) + return 0; -int buildin_setcastledata(struct script_state *st) -{ - char *mapname=conv_str(st,& (st->stack->stack_data[st->start+2])); - int index=conv_num(st,& (st->stack->stack_data[st->start+3])); - int value=conv_num(st,& (st->stack->stack_data[st->start+4])); - struct guild_castle *gc; - int i; - - for(i=0;i<MAX_GUILDCASTLE;i++){ - if( (gc=guild_castle_search(i)) != NULL ){ - if(strcmp(mapname,gc->map_name)==0){ - // Save Data byself First - switch(index){ - case 1: gc->guild_id = value; break; - case 2: gc->economy = value; break; - case 3: gc->defense = value; break; - case 4: gc->triggerE = value; break; - case 5: gc->triggerD = value; break; - case 6: gc->nextTime = value; break; - case 7: gc->payTime = value; break; - case 8: gc->createTime = value; break; - case 9: gc->visibleC = value; break; - case 10: gc->visibleG0 = value; break; - case 11: gc->visibleG1 = value; break; - case 12: gc->visibleG2 = value; break; - case 13: gc->visibleG3 = value; break; - case 14: gc->visibleG4 = value; break; - case 15: gc->visibleG5 = value; break; - case 16: gc->visibleG6 = value; break; - case 17: gc->visibleG7 = value; break; - case 18: gc->Ghp0 = value; break; - case 19: gc->Ghp1 = value; break; - case 20: gc->Ghp2 = value; break; - case 21: gc->Ghp3 = value; break; - case 22: gc->Ghp4 = value; break; - case 23: gc->Ghp5 = value; break; - case 24: gc->Ghp6 = value; break; - case 25: gc->Ghp7 = value; break; - default: return 0; - } - guild_castledatasave(gc->castle_id,index,value); - return 0; - } - } - } - return 0; +// printf("Script.c: [FlagEmblem] GuildID=%d, Emblem=%d.\n", g->guild_id, g->emblem_id); + ((struct npc_data *) map_id2bl (st->oid))->u.scr.guild_id = g_id; + return 1; +} + +int buildin_getcastlename (struct script_state *st) +{ + char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2])); + struct guild_castle *gc; + int i; + char *buf = NULL; + for (i = 0; i < MAX_GUILDCASTLE; i++) + { + if ((gc = guild_castle_search (i)) != NULL) + { + if (strcmp (mapname, gc->map_name) == 0) + { + buf = (char *) aCalloc (24, sizeof (char)); + strncpy (buf, gc->castle_name, 24); + break; + } + } + } + if (buf) + push_str (st->stack, C_STR, buf); + else + push_str (st->stack, C_CONSTSTR, ""); + return 0; +} + +int buildin_getcastledata (struct script_state *st) +{ + char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2])); + int index = conv_num (st, &(st->stack->stack_data[st->start + 3])); + char *event = NULL; + struct guild_castle *gc; + int i, j; + + if (st->end > st->start + 4 && index == 0) + { + for (i = 0, j = -1; i < MAX_GUILDCASTLE; i++) + if ((gc = guild_castle_search (i)) != NULL && + strcmp (mapname, gc->map_name) == 0) + j = i; + if (j >= 0) + { + event = conv_str (st, &(st->stack->stack_data[st->start + 4])); + guild_addcastleinfoevent (j, 17, event); + } + } + + for (i = 0; i < MAX_GUILDCASTLE; i++) + { + if ((gc = guild_castle_search (i)) != NULL) + { + if (strcmp (mapname, gc->map_name) == 0) + { + switch (index) + { + case 0: + for (j = 1; j < 26; j++) + guild_castledataload (gc->castle_id, j); + break; // Initialize[AgitInit] + case 1: + push_val (st->stack, C_INT, gc->guild_id); + break; + case 2: + push_val (st->stack, C_INT, gc->economy); + break; + case 3: + push_val (st->stack, C_INT, gc->defense); + break; + case 4: + push_val (st->stack, C_INT, gc->triggerE); + break; + case 5: + push_val (st->stack, C_INT, gc->triggerD); + break; + case 6: + push_val (st->stack, C_INT, gc->nextTime); + break; + case 7: + push_val (st->stack, C_INT, gc->payTime); + break; + case 8: + push_val (st->stack, C_INT, gc->createTime); + break; + case 9: + push_val (st->stack, C_INT, gc->visibleC); + break; + case 10: + push_val (st->stack, C_INT, gc->visibleG0); + break; + case 11: + push_val (st->stack, C_INT, gc->visibleG1); + break; + case 12: + push_val (st->stack, C_INT, gc->visibleG2); + break; + case 13: + push_val (st->stack, C_INT, gc->visibleG3); + break; + case 14: + push_val (st->stack, C_INT, gc->visibleG4); + break; + case 15: + push_val (st->stack, C_INT, gc->visibleG5); + break; + case 16: + push_val (st->stack, C_INT, gc->visibleG6); + break; + case 17: + push_val (st->stack, C_INT, gc->visibleG7); + break; + case 18: + push_val (st->stack, C_INT, gc->Ghp0); + break; + case 19: + push_val (st->stack, C_INT, gc->Ghp1); + break; + case 20: + push_val (st->stack, C_INT, gc->Ghp2); + break; + case 21: + push_val (st->stack, C_INT, gc->Ghp3); + break; + case 22: + push_val (st->stack, C_INT, gc->Ghp4); + break; + case 23: + push_val (st->stack, C_INT, gc->Ghp5); + break; + case 24: + push_val (st->stack, C_INT, gc->Ghp6); + break; + case 25: + push_val (st->stack, C_INT, gc->Ghp7); + break; + default: + push_val (st->stack, C_INT, 0); + break; + } + return 0; + } + } + } + push_val (st->stack, C_INT, 0); + return 0; +} + +int buildin_setcastledata (struct script_state *st) +{ + char *mapname = conv_str (st, &(st->stack->stack_data[st->start + 2])); + int index = conv_num (st, &(st->stack->stack_data[st->start + 3])); + int value = conv_num (st, &(st->stack->stack_data[st->start + 4])); + struct guild_castle *gc; + int i; + + for (i = 0; i < MAX_GUILDCASTLE; i++) + { + if ((gc = guild_castle_search (i)) != NULL) + { + if (strcmp (mapname, gc->map_name) == 0) + { + // Save Data byself First + switch (index) + { + case 1: + gc->guild_id = value; + break; + case 2: + gc->economy = value; + break; + case 3: + gc->defense = value; + break; + case 4: + gc->triggerE = value; + break; + case 5: + gc->triggerD = value; + break; + case 6: + gc->nextTime = value; + break; + case 7: + gc->payTime = value; + break; + case 8: + gc->createTime = value; + break; + case 9: + gc->visibleC = value; + break; + case 10: + gc->visibleG0 = value; + break; + case 11: + gc->visibleG1 = value; + break; + case 12: + gc->visibleG2 = value; + break; + case 13: + gc->visibleG3 = value; + break; + case 14: + gc->visibleG4 = value; + break; + case 15: + gc->visibleG5 = value; + break; + case 16: + gc->visibleG6 = value; + break; + case 17: + gc->visibleG7 = value; + break; + case 18: + gc->Ghp0 = value; + break; + case 19: + gc->Ghp1 = value; + break; + case 20: + gc->Ghp2 = value; + break; + case 21: + gc->Ghp3 = value; + break; + case 22: + gc->Ghp4 = value; + break; + case 23: + gc->Ghp5 = value; + break; + case 24: + gc->Ghp6 = value; + break; + case 25: + gc->Ghp7 = value; + break; + default: + return 0; + } + guild_castledatasave (gc->castle_id, index, value); + return 0; + } + } + } + return 0; } /* ===================================================================== * ギルド情報を要求する * --------------------------------------------------------------------- */ -int buildin_requestguildinfo(struct script_state *st) +int buildin_requestguildinfo (struct script_state *st) { - int guild_id=conv_num(st,& (st->stack->stack_data[st->start+2])); - char *event=NULL; + int guild_id = conv_num (st, &(st->stack->stack_data[st->start + 2])); + char *event = NULL; - if( st->end>st->start+3 ) - event=conv_str(st,& (st->stack->stack_data[st->start+3])); + if (st->end > st->start + 3) + event = conv_str (st, &(st->stack->stack_data[st->start + 3])); - if(guild_id>0) - guild_npc_request_info(guild_id,event); - return 0; + if (guild_id > 0) + guild_npc_request_info (guild_id, event); + return 0; } /* ===================================================================== * カードの数を得る * --------------------------------------------------------------------- */ -int buildin_getequipcardcnt(struct script_state *st) +int buildin_getequipcardcnt (struct script_state *st) { - int i,num; - struct map_session_data *sd; - int c=4; - - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); - i=pc_checkequip(sd,equip[num-1]); - if(sd->status.inventory[i].card[0] == 0x00ff){ // 製造武器はカードなし - push_val(st->stack,C_INT,0); - return 0; - } - do{ - if( (sd->status.inventory[i].card[c-1] > 4000) && - (sd->status.inventory[i].card[c-1] < 5000)){ + int i, num; + struct map_session_data *sd; + int c = 4; - push_val(st->stack,C_INT,(c)); - return 0; - } - }while(c--); - push_val(st->stack,C_INT,0); - return 0; + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sd = script_rid2sd (st); + i = pc_checkequip (sd, equip[num - 1]); + if (sd->status.inventory[i].card[0] == 0x00ff) + { // 製造武器はカードなし + push_val (st->stack, C_INT, 0); + return 0; + } + do + { + if ((sd->status.inventory[i].card[c - 1] > 4000) && + (sd->status.inventory[i].card[c - 1] < 5000)) + { + + push_val (st->stack, C_INT, (c)); + return 0; + } + } + while (c--); + push_val (st->stack, C_INT, 0); + return 0; } /* ================================================================ * カード取り外し成功 * ---------------------------------------------------------------- */ -int buildin_successremovecards(struct script_state *st) +int buildin_successremovecards (struct script_state *st) { - int i,num,cardflag=0,flag; - struct map_session_data *sd; - struct item item_tmp; - int c=4; + int i, num, cardflag = 0, flag; + struct map_session_data *sd; + struct item item_tmp; + int c = 4; - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - sd=script_rid2sd(st); - i=pc_checkequip(sd,equip[num-1]); - if(sd->status.inventory[i].card[0]==0x00ff){ // 製造武器は処理しない - return 0; - } - do{ - if( (sd->status.inventory[i].card[c-1] > 4000) && - (sd->status.inventory[i].card[c-1] < 5000)){ - - cardflag = 1; - item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].card[c-1]; - item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=0; - item_tmp.attribute=0; - item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0; - - if((flag=pc_additem(sd,&item_tmp,1))){ // 持てないならドロップ - clif_additem(sd,0,0,flag); - map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0); - } - } - }while(c--); - - if(cardflag == 1){ // カードを取り除いたアイテム所得 - flag=0; - item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].nameid; - item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=sd->status.inventory[i].refine; - item_tmp.attribute=sd->status.inventory[i].attribute; - item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0; - pc_delitem(sd,i,1,0); - if((flag=pc_additem(sd,&item_tmp,1))){ // もてないならドロップ - clif_additem(sd,0,0,flag); - map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0); - } - clif_misceffect(&sd->bl,3); - return 0; - } - return 0; + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + sd = script_rid2sd (st); + i = pc_checkequip (sd, equip[num - 1]); + if (sd->status.inventory[i].card[0] == 0x00ff) + { // 製造武器は処理しない + return 0; + } + do + { + if ((sd->status.inventory[i].card[c - 1] > 4000) && + (sd->status.inventory[i].card[c - 1] < 5000)) + { + + cardflag = 1; + item_tmp.id = 0, item_tmp.nameid = + sd->status.inventory[i].card[c - 1]; + item_tmp.equip = 0, item_tmp.identify = 1, item_tmp.refine = 0; + item_tmp.attribute = 0; + item_tmp.card[0] = 0, item_tmp.card[1] = 0, item_tmp.card[2] = + 0, item_tmp.card[3] = 0; + + if ((flag = pc_additem (sd, &item_tmp, 1))) + { // 持てないならドロップ + clif_additem (sd, 0, 0, flag); + map_addflooritem (&item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y, + NULL, NULL, NULL, 0); + } + } + } + while (c--); + + if (cardflag == 1) + { // カードを取り除いたアイテム所得 + flag = 0; + item_tmp.id = 0, item_tmp.nameid = sd->status.inventory[i].nameid; + item_tmp.equip = 0, item_tmp.identify = 1, item_tmp.refine = + sd->status.inventory[i].refine; + item_tmp.attribute = sd->status.inventory[i].attribute; + item_tmp.card[0] = 0, item_tmp.card[1] = 0, item_tmp.card[2] = + 0, item_tmp.card[3] = 0; + pc_delitem (sd, i, 1, 0); + if ((flag = pc_additem (sd, &item_tmp, 1))) + { // もてないならドロップ + clif_additem (sd, 0, 0, flag); + map_addflooritem (&item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y, + NULL, NULL, NULL, 0); + } + clif_misceffect (&sd->bl, 3); + return 0; + } + return 0; } /* ================================================================ @@ -5150,492 +6045,554 @@ int buildin_successremovecards(struct script_state *st) * type=0: 両方損失、1:カード損失、2:武具損失、3:損失無し * ---------------------------------------------------------------- */ -int buildin_failedremovecards(struct script_state *st) +int buildin_failedremovecards (struct script_state *st) { - int i,num,cardflag=0,flag,typefail; - struct map_session_data *sd; - struct item item_tmp; - int c=4; + int i, num, cardflag = 0, flag, typefail; + struct map_session_data *sd; + struct item item_tmp; + int c = 4; - num=conv_num(st,& (st->stack->stack_data[st->start+2])); - typefail=conv_num(st,& (st->stack->stack_data[st->start+3])); - sd=script_rid2sd(st); - i=pc_checkequip(sd,equip[num-1]); - if(sd->status.inventory[i].card[0]==0x00ff){ // 製造武器は処理しない - return 0; - } - do{ - if(( sd->status.inventory[i].card[c-1] > 4000) && - (sd->status.inventory[i].card[c-1] < 5000)){ - - cardflag = 1; - - if(typefail == 2){ // 武具のみ損失なら、カードは受け取らせる - item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].card[c-1]; - item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=0; - item_tmp.attribute=0; - item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0; - if((flag=pc_additem(sd,&item_tmp,1))){ - clif_additem(sd,0,0,flag); - map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0); - } - } - } - }while(c--); + num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + typefail = conv_num (st, &(st->stack->stack_data[st->start + 3])); + sd = script_rid2sd (st); + i = pc_checkequip (sd, equip[num - 1]); + if (sd->status.inventory[i].card[0] == 0x00ff) + { // 製造武器は処理しない + return 0; + } + do + { + if ((sd->status.inventory[i].card[c - 1] > 4000) && + (sd->status.inventory[i].card[c - 1] < 5000)) + { + + cardflag = 1; + + if (typefail == 2) + { // 武具のみ損失なら、カードは受け取らせる + item_tmp.id = 0, item_tmp.nameid = + sd->status.inventory[i].card[c - 1]; + item_tmp.equip = 0, item_tmp.identify = 1, item_tmp.refine = + 0; + item_tmp.attribute = 0; + item_tmp.card[0] = 0, item_tmp.card[1] = 0, item_tmp.card[2] = + 0, item_tmp.card[3] = 0; + if ((flag = pc_additem (sd, &item_tmp, 1))) + { + clif_additem (sd, 0, 0, flag); + map_addflooritem (&item_tmp, 1, sd->bl.m, sd->bl.x, + sd->bl.y, NULL, NULL, NULL, 0); + } + } + } + } + while (c--); - if(cardflag == 1){ + if (cardflag == 1) + { - if(typefail == 0 || typefail == 2){ // 武具損失 - pc_delitem(sd,i,1,0); - clif_misceffect(&sd->bl,2); - return 0; - } - if(typefail == 1){ // カードのみ損失(武具を返す) - flag=0; - item_tmp.id=0,item_tmp.nameid=sd->status.inventory[i].nameid; - item_tmp.equip=0,item_tmp.identify=1,item_tmp.refine=sd->status.inventory[i].refine; - item_tmp.attribute=sd->status.inventory[i].attribute; - item_tmp.card[0]=0,item_tmp.card[1]=0,item_tmp.card[2]=0,item_tmp.card[3]=0; - pc_delitem(sd,i,1,0); - if((flag=pc_additem(sd,&item_tmp,1))){ - clif_additem(sd,0,0,flag); - map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0); - } - } - clif_misceffect(&sd->bl,2); - return 0; - } - return 0; + if (typefail == 0 || typefail == 2) + { // 武具損失 + pc_delitem (sd, i, 1, 0); + clif_misceffect (&sd->bl, 2); + return 0; + } + if (typefail == 1) + { // カードのみ損失(武具を返す) + flag = 0; + item_tmp.id = 0, item_tmp.nameid = sd->status.inventory[i].nameid; + item_tmp.equip = 0, item_tmp.identify = 1, item_tmp.refine = + sd->status.inventory[i].refine; + item_tmp.attribute = sd->status.inventory[i].attribute; + item_tmp.card[0] = 0, item_tmp.card[1] = 0, item_tmp.card[2] = + 0, item_tmp.card[3] = 0; + pc_delitem (sd, i, 1, 0); + if ((flag = pc_additem (sd, &item_tmp, 1))) + { + clif_additem (sd, 0, 0, flag); + map_addflooritem (&item_tmp, 1, sd->bl.m, sd->bl.x, sd->bl.y, + NULL, NULL, NULL, 0); + } + } + clif_misceffect (&sd->bl, 2); + return 0; + } + return 0; } -int buildin_mapwarp(struct script_state *st) // Added by RoVeRT +int buildin_mapwarp (struct script_state *st) // Added by RoVeRT { - int x,y,m; - char *str; - char *mapname; - int x0,y0,x1,y1; + int x, y, m; + char *str; + char *mapname; + int x0, y0, x1, y1; - mapname=conv_str(st,& (st->stack->stack_data[st->start+2])); - x0=0; - y0=0; - x1=map[map_mapname2mapid(mapname)].xs; - y1=map[map_mapname2mapid(mapname)].ys; - str=conv_str(st,& (st->stack->stack_data[st->start+3])); - x=conv_num(st,& (st->stack->stack_data[st->start+4])); - y=conv_num(st,& (st->stack->stack_data[st->start+5])); + mapname = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x0 = 0; + y0 = 0; + x1 = map[map_mapname2mapid (mapname)].xs; + y1 = map[map_mapname2mapid (mapname)].ys; + str = conv_str (st, &(st->stack->stack_data[st->start + 3])); + x = conv_num (st, &(st->stack->stack_data[st->start + 4])); + y = conv_num (st, &(st->stack->stack_data[st->start + 5])); - if( (m=map_mapname2mapid(mapname))< 0) - return 0; + if ((m = map_mapname2mapid (mapname)) < 0) + return 0; - map_foreachinarea(buildin_areawarp_sub, - m,x0,y0,x1,y1,BL_PC, str,x,y ); - return 0; + map_foreachinarea (buildin_areawarp_sub, + m, x0, y0, x1, y1, BL_PC, str, x, y); + return 0; } -int buildin_cmdothernpc(struct script_state *st) // Added by RoVeRT +int buildin_cmdothernpc (struct script_state *st) // Added by RoVeRT { - char *npc,*command; + char *npc, *command; - npc=conv_str(st,& (st->stack->stack_data[st->start+2])); - command=conv_str(st,& (st->stack->stack_data[st->start+3])); + npc = conv_str (st, &(st->stack->stack_data[st->start + 2])); + command = conv_str (st, &(st->stack->stack_data[st->start + 3])); - npc_command(map_id2sd(st->rid),npc,command); - return 0; + npc_command (map_id2sd (st->rid), npc, command); + return 0; } -int buildin_inittimer(struct script_state *st) // Added by RoVeRT +int buildin_inittimer (struct script_state *st) // Added by RoVeRT { -// struct npc_data *nd=(struct npc_data*)map_id2bl(st->oid); +// struct npc_data *nd=(struct npc_data*)map_id2bl(st->oid); -// nd->lastaction=nd->timer=gettick(); - npc_do_ontimer(st->oid, map_id2sd(st->rid), 1); +// nd->lastaction=nd->timer=gettick(); + npc_do_ontimer (st->oid, map_id2sd (st->rid), 1); - return 0; + return 0; } -int buildin_stoptimer(struct script_state *st) // Added by RoVeRT +int buildin_stoptimer (struct script_state *st) // Added by RoVeRT { -// struct npc_data *nd=(struct npc_data*)map_id2bl(st->oid); +// struct npc_data *nd=(struct npc_data*)map_id2bl(st->oid); -// nd->lastaction=nd->timer=-1; - npc_do_ontimer(st->oid, map_id2sd(st->rid), 0); +// nd->lastaction=nd->timer=-1; + npc_do_ontimer (st->oid, map_id2sd (st->rid), 0); - return 0; + return 0; } -int buildin_mobcount_sub(struct block_list *bl,va_list ap) // Added by RoVeRT +int buildin_mobcount_sub (struct block_list *bl, va_list ap) // Added by RoVeRT { - char *event=va_arg(ap,char *); - int *c=va_arg(ap,int *); + char *event = va_arg (ap, char *); + int *c = va_arg (ap, int *); - if(strcmp(event,((struct mob_data *)bl)->npc_event)==0) - (*c)++; - return 0; + if (strcmp (event, ((struct mob_data *) bl)->npc_event) == 0) + (*c)++; + return 0; } -int buildin_mobcount(struct script_state *st) // Added by RoVeRT +int buildin_mobcount (struct script_state *st) // Added by RoVeRT { - char *mapname,*event; - int m,c=0; - mapname=conv_str(st,& (st->stack->stack_data[st->start+2])); - event=conv_str(st,& (st->stack->stack_data[st->start+3])); + char *mapname, *event; + int m, c = 0; + mapname = conv_str (st, &(st->stack->stack_data[st->start + 2])); + event = conv_str (st, &(st->stack->stack_data[st->start + 3])); - if( (m=map_mapname2mapid(mapname))<0 ) { - push_val(st->stack,C_INT,-1); - return 0; - } - map_foreachinarea(buildin_mobcount_sub, - m,0,0,map[m].xs,map[m].ys,BL_MOB, event,&c ); + if ((m = map_mapname2mapid (mapname)) < 0) + { + push_val (st->stack, C_INT, -1); + return 0; + } + map_foreachinarea (buildin_mobcount_sub, + m, 0, 0, map[m].xs, map[m].ys, BL_MOB, event, &c); - push_val(st->stack,C_INT, (c - 1)); + push_val (st->stack, C_INT, (c - 1)); - return 0; + return 0; } -int buildin_marriage(struct script_state *st) + +int buildin_marriage (struct script_state *st) { - char *partner=conv_str(st,& (st->stack->stack_data[st->start+2])); - struct map_session_data *sd=script_rid2sd(st); - struct map_session_data *p_sd=map_nick2sd(partner); + char *partner = conv_str (st, &(st->stack->stack_data[st->start + 2])); + struct map_session_data *sd = script_rid2sd (st); + struct map_session_data *p_sd = map_nick2sd (partner); - if(sd==NULL || p_sd==NULL || pc_marriage(sd,p_sd) < 0){ - push_val(st->stack,C_INT,0); - return 0; - } - push_val(st->stack,C_INT,1); - return 0; + if (sd == NULL || p_sd == NULL || pc_marriage (sd, p_sd) < 0) + { + push_val (st->stack, C_INT, 0); + return 0; + } + push_val (st->stack, C_INT, 1); + return 0; } -int buildin_wedding_effect(struct script_state *st) + +int buildin_wedding_effect (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); + struct map_session_data *sd = script_rid2sd (st); - if(sd==NULL) - return 0; - clif_wedding_effect(&sd->bl); - return 0; + if (sd == NULL) + return 0; + clif_wedding_effect (&sd->bl); + return 0; } -int buildin_divorce(struct script_state *st) + +int buildin_divorce (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); + struct map_session_data *sd = script_rid2sd (st); - st->state=STOP; // rely on pc_divorce to restart + st->state = STOP; // rely on pc_divorce to restart - sd->npc_flags.divorce = 1; + sd->npc_flags.divorce = 1; - if(sd==NULL || pc_divorce(sd) < 0){ - push_val(st->stack,C_INT,0); - return 0; - } + if (sd == NULL || pc_divorce (sd) < 0) + { + push_val (st->stack, C_INT, 0); + return 0; + } - push_val(st->stack,C_INT,1); - return 0; + push_val (st->stack, C_INT, 1); + return 0; } /*================================================ * Script for Displaying MOB Information [Valaris] *------------------------------------------------ */ -int buildin_strmobinfo(struct script_state *st) +int buildin_strmobinfo (struct script_state *st) { - int num=conv_num(st,& (st->stack->stack_data[st->start+2])); - int class=conv_num(st,& (st->stack->stack_data[st->start+3])); + int num = conv_num (st, &(st->stack->stack_data[st->start + 2])); + int class = conv_num (st, &(st->stack->stack_data[st->start + 3])); - if(num<=0 || num>=8 || (class>=0 && class<=1000) || class >2000) - return 0; + if (num <= 0 || num >= 8 || (class >= 0 && class <= 1000) || class > 2000) + return 0; - if(num==1) { - char *buf; - buf=calloc(24, 1); - buf=mob_db[class].name; - push_str(st->stack,C_STR,buf); - return 0; - } - else if(num==2) { - char *buf; - buf=calloc(24, 1); - buf=mob_db[class].jname; - push_str(st->stack,C_STR,buf); - return 0; - } - else if(num==3) - push_val(st->stack,C_INT,mob_db[class].lv); - else if(num==4) - push_val(st->stack,C_INT,mob_db[class].max_hp); - else if(num==5) - push_val(st->stack,C_INT,mob_db[class].max_sp); - else if(num==6) - push_val(st->stack,C_INT,mob_db[class].base_exp); - else if(num==7) - push_val(st->stack,C_INT,mob_db[class].job_exp); - return 0; + if (num == 1) + { + char *buf; + buf = calloc (24, 1); + buf = mob_db[class].name; + push_str (st->stack, C_STR, buf); + return 0; + } + else if (num == 2) + { + char *buf; + buf = calloc (24, 1); + buf = mob_db[class].jname; + push_str (st->stack, C_STR, buf); + return 0; + } + else if (num == 3) + push_val (st->stack, C_INT, mob_db[class].lv); + else if (num == 4) + push_val (st->stack, C_INT, mob_db[class].max_hp); + else if (num == 5) + push_val (st->stack, C_INT, mob_db[class].max_sp); + else if (num == 6) + push_val (st->stack, C_INT, mob_db[class].base_exp); + else if (num == 7) + push_val (st->stack, C_INT, mob_db[class].job_exp); + return 0; } /*========================================== * Summon guardians [Valaris] *------------------------------------------ */ -int buildin_guardian(struct script_state *st) +int buildin_guardian (struct script_state *st) { - int class=0,amount=1,x=0,y=0,guardian=0; - char *str,*map,*event=""; + int class = 0, amount = 1, x = 0, y = 0, guardian = 0; + char *str, *map, *event = ""; - map =conv_str(st,& (st->stack->stack_data[st->start+2])); - x =conv_num(st,& (st->stack->stack_data[st->start+3])); - y =conv_num(st,& (st->stack->stack_data[st->start+4])); - str =conv_str(st,& (st->stack->stack_data[st->start+5])); - class=conv_num(st,& (st->stack->stack_data[st->start+6])); - amount=conv_num(st,& (st->stack->stack_data[st->start+7])); - event=conv_str(st,& (st->stack->stack_data[st->start+8])); - if( st->end>st->start+9 ) - guardian=conv_num(st,& (st->stack->stack_data[st->start+9])); + map = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y = conv_num (st, &(st->stack->stack_data[st->start + 4])); + str = conv_str (st, &(st->stack->stack_data[st->start + 5])); + class = conv_num (st, &(st->stack->stack_data[st->start + 6])); + amount = conv_num (st, &(st->stack->stack_data[st->start + 7])); + event = conv_str (st, &(st->stack->stack_data[st->start + 8])); + if (st->end > st->start + 9) + guardian = conv_num (st, &(st->stack->stack_data[st->start + 9])); - mob_spawn_guardian(map_id2sd(st->rid),map,x,y,str,class,amount,event,guardian); + mob_spawn_guardian (map_id2sd (st->rid), map, x, y, str, class, amount, + event, guardian); - return 0; + return 0; } /*================================================ * Script for Displaying Guardian Info [Valaris] *------------------------------------------------ */ -int buildin_guardianinfo(struct script_state *st) +int buildin_guardianinfo (struct script_state *st) { - int guardian=conv_num(st,& (st->stack->stack_data[st->start+2])); - struct map_session_data *sd=script_rid2sd(st); - struct guild_castle *gc=guild_mapname2gc(map[sd->bl.m].name); + int guardian = conv_num (st, &(st->stack->stack_data[st->start + 2])); + struct map_session_data *sd = script_rid2sd (st); + struct guild_castle *gc = guild_mapname2gc (map[sd->bl.m].name); - if(guardian==0 && gc->visibleG0 == 1) push_val(st->stack,C_INT,gc->Ghp0); - if(guardian==1 && gc->visibleG1 == 1) push_val(st->stack,C_INT,gc->Ghp1); - if(guardian==2 && gc->visibleG2 == 1) push_val(st->stack,C_INT,gc->Ghp2); - if(guardian==3 && gc->visibleG3 == 1) push_val(st->stack,C_INT,gc->Ghp3); - if(guardian==4 && gc->visibleG4 == 1) push_val(st->stack,C_INT,gc->Ghp4); - if(guardian==5 && gc->visibleG5 == 1) push_val(st->stack,C_INT,gc->Ghp5); - if(guardian==6 && gc->visibleG6 == 1) push_val(st->stack,C_INT,gc->Ghp6); - if(guardian==7 && gc->visibleG7 == 1) push_val(st->stack,C_INT,gc->Ghp7); - else push_val(st->stack,C_INT,-1); + if (guardian == 0 && gc->visibleG0 == 1) + push_val (st->stack, C_INT, gc->Ghp0); + if (guardian == 1 && gc->visibleG1 == 1) + push_val (st->stack, C_INT, gc->Ghp1); + if (guardian == 2 && gc->visibleG2 == 1) + push_val (st->stack, C_INT, gc->Ghp2); + if (guardian == 3 && gc->visibleG3 == 1) + push_val (st->stack, C_INT, gc->Ghp3); + if (guardian == 4 && gc->visibleG4 == 1) + push_val (st->stack, C_INT, gc->Ghp4); + if (guardian == 5 && gc->visibleG5 == 1) + push_val (st->stack, C_INT, gc->Ghp5); + if (guardian == 6 && gc->visibleG6 == 1) + push_val (st->stack, C_INT, gc->Ghp6); + if (guardian == 7 && gc->visibleG7 == 1) + push_val (st->stack, C_INT, gc->Ghp7); + else + push_val (st->stack, C_INT, -1); - return 0; + return 0; } + /*========================================== * IDからItem名 *------------------------------------------ */ -int buildin_getitemname(struct script_state *st) +int buildin_getitemname (struct script_state *st) { - struct item_data *i_data; - char *item_name; - struct script_data *data; + struct item_data *i_data; + char *item_name; + struct script_data *data; - data=&(st->stack->stack_data[st->start+2]); - get_val(st,data); - if( data->type==C_STR || data->type==C_CONSTSTR ){ - const char *name=conv_str(st,data); - i_data = itemdb_searchname(name); - } else { - int item_id = conv_num(st,data); - i_data = itemdb_search(item_id); - } + data = &(st->stack->stack_data[st->start + 2]); + get_val (st, data); + if (data->type == C_STR || data->type == C_CONSTSTR) + { + const char *name = conv_str (st, data); + i_data = itemdb_searchname (name); + } + else + { + int item_id = conv_num (st, data); + i_data = itemdb_search (item_id); + } - item_name=(char *)aCalloc(24,sizeof(char)); - if (i_data) - strncpy(item_name,i_data->jname,23); - else - strncpy(item_name,"Unknown Item",23); + item_name = (char *) aCalloc (24, sizeof (char)); + if (i_data) + strncpy (item_name, i_data->jname, 23); + else + strncpy (item_name, "Unknown Item", 23); - push_str(st->stack,C_STR,item_name); - - return 0; -} + push_str (st->stack, C_STR, item_name); + return 0; +} -int buildin_getspellinvocation(struct script_state *st) +int buildin_getspellinvocation (struct script_state *st) { - char *name; - char *invocation; + char *name; + char *invocation; - name = conv_str(st,& (st->stack->stack_data[st->start+2])); + name = conv_str (st, &(st->stack->stack_data[st->start + 2])); - invocation = magic_find_invocation(name); - if (!invocation) - invocation = "..."; + invocation = magic_find_invocation (name); + if (!invocation) + invocation = "..."; - push_str(st->stack, C_STR, strdup(invocation)); - return 0; + push_str (st->stack, C_STR, strdup (invocation)); + return 0; } -int buildin_getanchorinvocation(struct script_state *st) +int buildin_getanchorinvocation (struct script_state *st) { - char *name; - char *invocation; + char *name; + char *invocation; - name = conv_str(st,& (st->stack->stack_data[st->start+2])); + name = conv_str (st, &(st->stack->stack_data[st->start + 2])); - invocation = magic_find_anchor_invocation(name); - if (!invocation) - invocation = "..."; + invocation = magic_find_anchor_invocation (name); + if (!invocation) + invocation = "..."; - push_str(st->stack, C_STR, strdup(invocation)); - return 0; + push_str (st->stack, C_STR, strdup (invocation)); + return 0; } -int buildin_getpartnerid(struct script_state *st) +int buildin_getpartnerid (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); + struct map_session_data *sd = script_rid2sd (st); - push_val(st->stack, C_INT, sd->status.partner_id); - return 0; + push_val (st->stack, C_INT, sd->status.partner_id); + return 0; } /*========================================== * PCの所持品情報読み取り *------------------------------------------ */ -int buildin_getinventorylist(struct script_state *st) -{ - struct map_session_data *sd=script_rid2sd(st); - int i,j=0; - if(!sd) return 0; - for(i=0;i<MAX_INVENTORY;i++){ - if(sd->status.inventory[i].nameid > 0 && sd->status.inventory[i].amount > 0){ - pc_setreg(sd,add_str("@inventorylist_id")+(j<<24),sd->status.inventory[i].nameid); - pc_setreg(sd,add_str("@inventorylist_amount")+(j<<24),sd->status.inventory[i].amount); - pc_setreg(sd,add_str("@inventorylist_equip")+(j<<24),sd->status.inventory[i].equip); - pc_setreg(sd,add_str("@inventorylist_refine")+(j<<24),sd->status.inventory[i].refine); - pc_setreg(sd,add_str("@inventorylist_identify")+(j<<24),sd->status.inventory[i].identify); - pc_setreg(sd,add_str("@inventorylist_attribute")+(j<<24),sd->status.inventory[i].attribute); - pc_setreg(sd,add_str("@inventorylist_card1")+(j<<24),sd->status.inventory[i].card[0]); - pc_setreg(sd,add_str("@inventorylist_card2")+(j<<24),sd->status.inventory[i].card[1]); - pc_setreg(sd,add_str("@inventorylist_card3")+(j<<24),sd->status.inventory[i].card[2]); - pc_setreg(sd,add_str("@inventorylist_card4")+(j<<24),sd->status.inventory[i].card[3]); - j++; - } - } - pc_setreg(sd,add_str("@inventorylist_count"),j); - return 0; +int buildin_getinventorylist (struct script_state *st) +{ + struct map_session_data *sd = script_rid2sd (st); + int i, j = 0; + if (!sd) + return 0; + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].nameid > 0 + && sd->status.inventory[i].amount > 0) + { + pc_setreg (sd, add_str ("@inventorylist_id") + (j << 24), + sd->status.inventory[i].nameid); + pc_setreg (sd, add_str ("@inventorylist_amount") + (j << 24), + sd->status.inventory[i].amount); + pc_setreg (sd, add_str ("@inventorylist_equip") + (j << 24), + sd->status.inventory[i].equip); + pc_setreg (sd, add_str ("@inventorylist_refine") + (j << 24), + sd->status.inventory[i].refine); + pc_setreg (sd, add_str ("@inventorylist_identify") + (j << 24), + sd->status.inventory[i].identify); + pc_setreg (sd, add_str ("@inventorylist_attribute") + (j << 24), + sd->status.inventory[i].attribute); + pc_setreg (sd, add_str ("@inventorylist_card1") + (j << 24), + sd->status.inventory[i].card[0]); + pc_setreg (sd, add_str ("@inventorylist_card2") + (j << 24), + sd->status.inventory[i].card[1]); + pc_setreg (sd, add_str ("@inventorylist_card3") + (j << 24), + sd->status.inventory[i].card[2]); + pc_setreg (sd, add_str ("@inventorylist_card4") + (j << 24), + sd->status.inventory[i].card[3]); + j++; + } + } + pc_setreg (sd, add_str ("@inventorylist_count"), j); + return 0; } -int buildin_getskilllist(struct script_state *st) +int buildin_getskilllist (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); - int i,j=0; - if(!sd) return 0; - for(i=0;i<MAX_SKILL;i++){ - if(sd->status.skill[i].id > 0 && sd->status.skill[i].lv > 0){ - pc_setreg(sd,add_str("@skilllist_id")+(j<<24),sd->status.skill[i].id); - pc_setreg(sd,add_str("@skilllist_lv")+(j<<24),sd->status.skill[i].lv); - pc_setreg(sd,add_str("@skilllist_flag")+(j<<24),sd->status.skill[i].flags); - j++; - } - } - pc_setreg(sd,add_str("@skilllist_count"),j); - return 0; + struct map_session_data *sd = script_rid2sd (st); + int i, j = 0; + if (!sd) + return 0; + for (i = 0; i < MAX_SKILL; i++) + { + if (sd->status.skill[i].id > 0 && sd->status.skill[i].lv > 0) + { + pc_setreg (sd, add_str ("@skilllist_id") + (j << 24), + sd->status.skill[i].id); + pc_setreg (sd, add_str ("@skilllist_lv") + (j << 24), + sd->status.skill[i].lv); + pc_setreg (sd, add_str ("@skilllist_flag") + (j << 24), + sd->status.skill[i].flags); + j++; + } + } + pc_setreg (sd, add_str ("@skilllist_count"), j); + return 0; } - - -int -buildin_get_activated_pool_skills(struct script_state *st) +int buildin_get_activated_pool_skills (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); - int pool_skills[MAX_SKILL_POOL]; - int skill_pool_size = skill_pool(sd, pool_skills); - int i, count = 0; - - if (!sd) - return 0; + struct map_session_data *sd = script_rid2sd (st); + int pool_skills[MAX_SKILL_POOL]; + int skill_pool_size = skill_pool (sd, pool_skills); + int i, count = 0; - for (i = 0; i < skill_pool_size; i++) { - int skill_id = pool_skills[i]; + if (!sd) + return 0; - if (sd->status.skill[skill_id].id == skill_id) { - pc_setreg(sd,add_str("@skilllist_id")+(count<<24),sd->status.skill[skill_id].id); - pc_setreg(sd,add_str("@skilllist_lv")+(count<<24),sd->status.skill[skill_id].lv); - pc_setreg(sd,add_str("@skilllist_flag")+(count<<24),sd->status.skill[skill_id].flags); - pc_setregstr(sd, add_str("@skilllist_name$")+(count<<24), skill_name(skill_id)); - ++count; - } - } - pc_setreg(sd,add_str("@skilllist_count"),count); + for (i = 0; i < skill_pool_size; i++) + { + int skill_id = pool_skills[i]; + + if (sd->status.skill[skill_id].id == skill_id) + { + pc_setreg (sd, add_str ("@skilllist_id") + (count << 24), + sd->status.skill[skill_id].id); + pc_setreg (sd, add_str ("@skilllist_lv") + (count << 24), + sd->status.skill[skill_id].lv); + pc_setreg (sd, add_str ("@skilllist_flag") + (count << 24), + sd->status.skill[skill_id].flags); + pc_setregstr (sd, add_str ("@skilllist_name$") + (count << 24), + skill_name (skill_id)); + ++count; + } + } + pc_setreg (sd, add_str ("@skilllist_count"), count); - return 0; + return 0; } extern int skill_pool_skills[]; extern int skill_pool_skills_size; -int -buildin_get_pool_skills(struct script_state *st) +int buildin_get_pool_skills (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); - int i, count = 0; - - if (!sd) - return 0; + struct map_session_data *sd = script_rid2sd (st); + int i, count = 0; - for (i = 0; i < skill_pool_skills_size; i++) { - int skill_id = skill_pool_skills[i]; + if (!sd) + return 0; - if (sd->status.skill[skill_id].id == skill_id) { - pc_setreg(sd,add_str("@skilllist_id")+(count<<24),sd->status.skill[skill_id].id); - pc_setreg(sd,add_str("@skilllist_lv")+(count<<24),sd->status.skill[skill_id].lv); - pc_setreg(sd,add_str("@skilllist_flag")+(count<<24),sd->status.skill[skill_id].flags); - pc_setregstr(sd, add_str("@skilllist_name$")+(count<<24), skill_name(skill_id)); - ++count; - } - } - pc_setreg(sd,add_str("@skilllist_count"),count); + for (i = 0; i < skill_pool_skills_size; i++) + { + int skill_id = skill_pool_skills[i]; + + if (sd->status.skill[skill_id].id == skill_id) + { + pc_setreg (sd, add_str ("@skilllist_id") + (count << 24), + sd->status.skill[skill_id].id); + pc_setreg (sd, add_str ("@skilllist_lv") + (count << 24), + sd->status.skill[skill_id].lv); + pc_setreg (sd, add_str ("@skilllist_flag") + (count << 24), + sd->status.skill[skill_id].flags); + pc_setregstr (sd, add_str ("@skilllist_name$") + (count << 24), + skill_name (skill_id)); + ++count; + } + } + pc_setreg (sd, add_str ("@skilllist_count"), count); - return 0; + return 0; } -int -buildin_activate_pool_skill(struct script_state *st) +int buildin_activate_pool_skill (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); - int skill_id = conv_num(st,& (st->stack->stack_data[st->start+2])); + struct map_session_data *sd = script_rid2sd (st); + int skill_id = conv_num (st, &(st->stack->stack_data[st->start + 2])); - skill_pool_activate(sd, skill_id); - clif_skillinfoblock(sd); + skill_pool_activate (sd, skill_id); + clif_skillinfoblock (sd); - return 0; + return 0; } - -int -buildin_deactivate_pool_skill(struct script_state *st) +int buildin_deactivate_pool_skill (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); - int skill_id = conv_num(st,& (st->stack->stack_data[st->start+2])); + struct map_session_data *sd = script_rid2sd (st); + int skill_id = conv_num (st, &(st->stack->stack_data[st->start + 2])); - skill_pool_deactivate(sd, skill_id); - clif_skillinfoblock(sd); + skill_pool_deactivate (sd, skill_id); + clif_skillinfoblock (sd); - return 0; + return 0; } - -int -buildin_check_pool_skill(struct script_state *st) +int buildin_check_pool_skill (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); - int skill_id = conv_num(st,& (st->stack->stack_data[st->start+2])); + struct map_session_data *sd = script_rid2sd (st); + int skill_id = conv_num (st, &(st->stack->stack_data[st->start + 2])); - push_val(st->stack, C_INT, skill_pool_is_activated(sd, skill_id)); + push_val (st->stack, C_INT, skill_pool_is_activated (sd, skill_id)); - return 0; + return 0; } - -int buildin_clearitem(struct script_state *st) +int buildin_clearitem (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); - int i; - if(sd==NULL) return 0; - for (i=0; i<MAX_INVENTORY; i++) { - if (sd->status.inventory[i].amount) - pc_delitem(sd, i, sd->status.inventory[i].amount, 0); - } - return 0; + struct map_session_data *sd = script_rid2sd (st); + int i; + if (sd == NULL) + return 0; + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].amount) + pc_delitem (sd, i, sd->status.inventory[i].amount, 0); + } + return 0; } /*========================================== @@ -5644,113 +6601,123 @@ int buildin_clearitem(struct script_state *st) * typeは通常0なのかな? *------------------------------------------ */ -int buildin_classchange(struct script_state *st) +int buildin_classchange (struct script_state *st) { - int class,type; - struct block_list *bl=map_id2bl(st->oid); - - if(bl==NULL) return 0; + int class, type; + struct block_list *bl = map_id2bl (st->oid); - class=conv_num(st,& (st->stack->stack_data[st->start+2])); - type=conv_num(st,& (st->stack->stack_data[st->start+3])); - clif_class_change(bl,class,type); - return 0; + if (bl == NULL) + return 0; + + class = conv_num (st, &(st->stack->stack_data[st->start + 2])); + type = conv_num (st, &(st->stack->stack_data[st->start + 3])); + clif_class_change (bl, class, type); + return 0; } /*========================================== * NPCから発生するエフェクト *------------------------------------------ */ -int buildin_misceffect(struct script_state *st) +int buildin_misceffect (struct script_state *st) { - int type; - char *name = NULL; + int type; + char *name = NULL; - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - if( st->end>st->start+3 ) - name=conv_str(st,& (st->stack->stack_data[st->start+3])); - if (name) - { - struct map_session_data *sd = map_nick2sd(name); - if(sd) - clif_misceffect(&sd->bl,type); - } - else if(st->oid) - clif_misceffect(map_id2bl(st->oid),type); - else{ - struct map_session_data *sd=script_rid2sd(st); - if(sd) - clif_misceffect(&sd->bl,type); - } - return 0; + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + if (st->end > st->start + 3) + name = conv_str (st, &(st->stack->stack_data[st->start + 3])); + if (name) + { + struct map_session_data *sd = map_nick2sd (name); + if (sd) + clif_misceffect (&sd->bl, type); + } + else if (st->oid) + clif_misceffect (map_id2bl (st->oid), type); + else + { + struct map_session_data *sd = script_rid2sd (st); + if (sd) + clif_misceffect (&sd->bl, type); + } + return 0; } + /*========================================== * サウンドエフェクト *------------------------------------------ */ -int buildin_soundeffect(struct script_state *st) +int buildin_soundeffect (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); - char *name; - int type=0; + struct map_session_data *sd = script_rid2sd (st); + char *name; + int type = 0; - - name=conv_str(st,& (st->stack->stack_data[st->start+2])); - type=conv_num(st,& (st->stack->stack_data[st->start+3])); - if(sd){ - if(st->oid) - clif_soundeffect(sd,map_id2bl(st->oid),name,type); - else{ - clif_soundeffect(sd,&sd->bl,name,type); - } - } - return 0; + name = conv_str (st, &(st->stack->stack_data[st->start + 2])); + type = conv_num (st, &(st->stack->stack_data[st->start + 3])); + if (sd) + { + if (st->oid) + clif_soundeffect (sd, map_id2bl (st->oid), name, type); + else + { + clif_soundeffect (sd, &sd->bl, name, type); + } + } + return 0; } /*========================================== * NPC skill effects [Valaris] *------------------------------------------ */ -int buildin_npcskilleffect(struct script_state *st) +int buildin_npcskilleffect (struct script_state *st) { - struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid); - - int skillid=conv_num(st,& (st->stack->stack_data[st->start+2])); - int skilllv=conv_num(st,& (st->stack->stack_data[st->start+3])); - int x=conv_num(st,& (st->stack->stack_data[st->start+4])); - int y=conv_num(st,& (st->stack->stack_data[st->start+5])); + struct npc_data *nd = (struct npc_data *) map_id2bl (st->oid); - clif_skill_poseffect(&nd->bl,skillid,skilllv,x,y,gettick()); + int skillid = conv_num (st, &(st->stack->stack_data[st->start + 2])); + int skilllv = conv_num (st, &(st->stack->stack_data[st->start + 3])); + int x = conv_num (st, &(st->stack->stack_data[st->start + 4])); + int y = conv_num (st, &(st->stack->stack_data[st->start + 5])); - return 0; + clif_skill_poseffect (&nd->bl, skillid, skilllv, x, y, gettick ()); + + return 0; } /*========================================== * Special effects [Valaris] *------------------------------------------ */ -int buildin_specialeffect(struct script_state *st) +int buildin_specialeffect (struct script_state *st) { - struct block_list *bl=map_id2bl(st->oid); + struct block_list *bl = map_id2bl (st->oid); - if(bl==NULL) - return 0; + if (bl == NULL) + return 0; - clif_specialeffect(bl,conv_num(st,& (st->stack->stack_data[st->start+2])), 0); + clif_specialeffect (bl, + conv_num (st, + &(st->stack->stack_data[st->start + 2])), + 0); - return 0; + return 0; } -int buildin_specialeffect2(struct script_state *st) +int buildin_specialeffect2 (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); + struct map_session_data *sd = script_rid2sd (st); - if(sd==NULL) - return 0; + if (sd == NULL) + return 0; - clif_specialeffect(&sd->bl,conv_num(st,& (st->stack->stack_data[st->start+2])), 0); + clif_specialeffect (&sd->bl, + conv_num (st, + &(st->stack->stack_data[st->start + 2])), + 0); - return 0; + return 0; } /*========================================== @@ -5758,20 +6725,20 @@ int buildin_specialeffect2(struct script_state *st) *------------------------------------------ */ -int buildin_nude(struct script_state *st) +int buildin_nude (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); - int i; + struct map_session_data *sd = script_rid2sd (st); + int i; + + if (sd == NULL) + return 0; - if(sd==NULL) - return 0; - - for(i=0;i<11;i++) - if(sd->equip_index[i] >= 0) - pc_unequipitem(sd,sd->equip_index[i], i); - pc_calcstatus(sd, 0); + for (i = 0; i < 11; i++) + if (sd->equip_index[i] >= 0) + pc_unequipitem (sd, sd->equip_index[i], i); + pc_calcstatus (sd, 0); - return 0; + return 0; } /*========================================== @@ -5779,20 +6746,20 @@ int buildin_nude(struct script_state *st) *------------------------------------------ */ -int buildin_unequip_by_id(struct script_state *st) +int buildin_unequip_by_id (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); - if(sd==NULL) - return 0; + struct map_session_data *sd = script_rid2sd (st); + if (sd == NULL) + return 0; - int slot_id = conv_num(st,& (st->stack->stack_data[st->start+2])); + int slot_id = conv_num (st, &(st->stack->stack_data[st->start + 2])); - if(slot_id>=0 && slot_id<11 && sd->equip_index[slot_id] >= 0) - pc_unequipitem(sd,sd->equip_index[slot_id], slot_id); + if (slot_id >= 0 && slot_id < 11 && sd->equip_index[slot_id] >= 0) + pc_unequipitem (sd, sd->equip_index[slot_id], slot_id); - pc_calcstatus(sd, 0); + pc_calcstatus (sd, 0); - return 0; + return 0; } /*========================================== @@ -5802,17 +6769,17 @@ int buildin_unequip_by_id(struct script_state *st) *------------------------------------------ */ -int buildin_gmcommand(struct script_state *st) +int buildin_gmcommand (struct script_state *st) { - struct map_session_data *sd; - char *cmd; + struct map_session_data *sd; + char *cmd; - sd = script_rid2sd(st); - cmd = conv_str(st,& (st->stack->stack_data[st->start+2])); + sd = script_rid2sd (st); + cmd = conv_str (st, &(st->stack->stack_data[st->start + 2])); - is_atcommand(sd->fd, sd, cmd, 99); + is_atcommand (sd->fd, sd, cmd, 99); - return 0; + return 0; } /*========================================== @@ -5820,20 +6787,20 @@ int buildin_gmcommand(struct script_state *st) *------------------------------------------ */ -int buildin_movenpc(struct script_state *st) +int buildin_movenpc (struct script_state *st) { - struct map_session_data *sd; - char *map,*npc; - int x,y; + struct map_session_data *sd; + char *map, *npc; + int x, y; - sd = script_rid2sd(st); + sd = script_rid2sd (st); - map = conv_str(st,& (st->stack->stack_data[st->start+2])); - x = conv_num(st,& (st->stack->stack_data[st->start+3])); - y = conv_num(st,& (st->stack->stack_data[st->start+4])); - npc = conv_str(st,& (st->stack->stack_data[st->start+5])); + map = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y = conv_num (st, &(st->stack->stack_data[st->start + 4])); + npc = conv_str (st, &(st->stack->stack_data[st->start + 5])); - return 0; + return 0; } /*========================================== @@ -5841,22 +6808,22 @@ int buildin_movenpc(struct script_state *st) *------------------------------------------ */ -int buildin_message(struct script_state *st) +int buildin_message (struct script_state *st) { - struct map_session_data *sd; - char *msg,*player; - struct map_session_data *pl_sd = NULL; + struct map_session_data *sd; + char *msg, *player; + struct map_session_data *pl_sd = NULL; - sd = script_rid2sd(st); + sd = script_rid2sd (st); - player = conv_str(st,& (st->stack->stack_data[st->start+2])); - msg = conv_str(st,& (st->stack->stack_data[st->start+3])); + player = conv_str (st, &(st->stack->stack_data[st->start + 2])); + msg = conv_str (st, &(st->stack->stack_data[st->start + 3])); - if((pl_sd=map_nick2sd((char *) player)) == NULL) - return 1; - clif_displaymessage(pl_sd->fd, msg); + if ((pl_sd = map_nick2sd ((char *) player)) == NULL) + return 1; + clif_displaymessage (pl_sd->fd, msg); - return 0; + return 0; } /*========================================== @@ -5864,23 +6831,24 @@ int buildin_message(struct script_state *st) * area) [Valaris] *------------------------------------------ */ - -int buildin_npctalk(struct script_state *st) + +int buildin_npctalk (struct script_state *st) { - char *str; - char message[255]; + char *str; + char message[255]; - struct npc_data *nd=(struct npc_data *)map_id2bl(st->oid); - str=conv_str(st,& (st->stack->stack_data[st->start+2])); + struct npc_data *nd = (struct npc_data *) map_id2bl (st->oid); + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); - if(nd) { - memcpy(message,nd->name,24); - strcat(message," : "); - strcat(message,str); - clif_message(&(nd->bl), message); - } + if (nd) + { + memcpy (message, nd->name, 24); + strcat (message, " : "); + strcat (message, str); + clif_message (&(nd->bl), message); + } - return 0; + return 0; } /*========================================== @@ -5890,218 +6858,224 @@ int buildin_npctalk(struct script_state *st) *------------------------------------------ */ -int buildin_hasitems(struct script_state *st) +int buildin_hasitems (struct script_state *st) { - int i; - struct map_session_data *sd; - - sd=script_rid2sd(st); - - for(i=0; i<MAX_INVENTORY; i++) { - if(sd->status.inventory[i].amount) { - push_val(st->stack,C_INT,1); - return 0; - } - } - - push_val(st->stack,C_INT,0); + int i; + struct map_session_data *sd; - return 0; + sd = script_rid2sd (st); + + for (i = 0; i < MAX_INVENTORY; i++) + { + if (sd->status.inventory[i].amount) + { + push_val (st->stack, C_INT, 1); + return 0; + } + } + + push_val (st->stack, C_INT, 0); + + return 0; } /*========================================== * getlook char info. getlook(arg) *------------------------------------------ */ -int buildin_getlook(struct script_state *st){ - int type,val; - struct map_session_data *sd; - sd=script_rid2sd(st); - - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - val=-1; - switch(type){ - case LOOK_HAIR: //1 - val=sd->status.hair; - break; - case LOOK_WEAPON: //2 - val=sd->status.weapon; - break; +int buildin_getlook (struct script_state *st) +{ + int type, val; + struct map_session_data *sd; + sd = script_rid2sd (st); + + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + val = -1; + switch (type) + { + case LOOK_HAIR: //1 + val = sd->status.hair; + break; + case LOOK_WEAPON: //2 + val = sd->status.weapon; + break; case LOOK_HEAD_BOTTOM: //3 - val=sd->status.head_bottom; - break; - case LOOK_HEAD_TOP: //4 - val=sd->status.head_top; - break; - case LOOK_HEAD_MID: //5 - val=sd->status.head_mid; - break; - case LOOK_HAIR_COLOR: //6 - val=sd->status.hair_color; - break; - case LOOK_CLOTHES_COLOR: //7 - val=sd->status.clothes_color; - break; - case LOOK_SHIELD: //8 - val=sd->status.shield; - break; - case LOOK_SHOES: //9 - break; - } - - push_val(st->stack,C_INT,val); - return 0; + val = sd->status.head_bottom; + break; + case LOOK_HEAD_TOP: //4 + val = sd->status.head_top; + break; + case LOOK_HEAD_MID: //5 + val = sd->status.head_mid; + break; + case LOOK_HAIR_COLOR: //6 + val = sd->status.hair_color; + break; + case LOOK_CLOTHES_COLOR: //7 + val = sd->status.clothes_color; + break; + case LOOK_SHIELD: //8 + val = sd->status.shield; + break; + case LOOK_SHOES: //9 + break; + } + + push_val (st->stack, C_INT, val); + return 0; } /*========================================== * get char save point. argument: 0- map name, 1- x, 2- y *------------------------------------------ */ -int buildin_getsavepoint(struct script_state *st) +int buildin_getsavepoint (struct script_state *st) { - int x,y,type; - char *mapname; - struct map_session_data *sd; + int x, y, type; + char *mapname; + struct map_session_data *sd; - sd=script_rid2sd(st); + sd = script_rid2sd (st); - type=conv_num(st,& (st->stack->stack_data[st->start+2])); - mapname=calloc(24, 1); + type = conv_num (st, &(st->stack->stack_data[st->start + 2])); + mapname = calloc (24, 1); - x=sd->status.save_point.x; - y=sd->status.save_point.y; - strncpy(mapname,sd->status.save_point.map,24); - switch(type){ - case 0: - push_str(st->stack,C_STR,mapname); - break; - case 1: - push_val(st->stack,C_INT,x); - break; - case 2: - push_val(st->stack,C_INT,y); - break; - } - return 0; + x = sd->status.save_point.x; + y = sd->status.save_point.y; + strncpy (mapname, sd->status.save_point.map, 24); + switch (type) + { + case 0: + push_str (st->stack, C_STR, mapname); + break; + case 1: + push_val (st->stack, C_INT, x); + break; + case 2: + push_val (st->stack, C_INT, y); + break; + } + return 0; } /*========================================== * areatimer *------------------------------------------ */ -int buildin_areatimer_sub(struct block_list *bl,va_list ap) +int buildin_areatimer_sub (struct block_list *bl, va_list ap) { - int tick; - char *event; - tick=va_arg(ap,int); - event=va_arg(ap, char *); - pc_addeventtimer((struct map_session_data *) bl,tick,event); - return 0; + int tick; + char *event; + tick = va_arg (ap, int); + event = va_arg (ap, char *); + pc_addeventtimer ((struct map_session_data *) bl, tick, event); + return 0; } -int buildin_areatimer(struct script_state *st) + +int buildin_areatimer (struct script_state *st) { - int tick,m; - char *event; - char *mapname; - int x0,y0,x1,y1; + int tick, m; + char *event; + char *mapname; + int x0, y0, x1, y1; - mapname=conv_str(st,& (st->stack->stack_data[st->start+2])); - x0=conv_num(st,& (st->stack->stack_data[st->start+3])); - y0=conv_num(st,& (st->stack->stack_data[st->start+4])); - x1=conv_num(st,& (st->stack->stack_data[st->start+5])); - y1=conv_num(st,& (st->stack->stack_data[st->start+6])); - tick=conv_num(st,& (st->stack->stack_data[st->start+7])); - event=conv_str(st,& (st->stack->stack_data[st->start+8])); + mapname = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x0 = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y0 = conv_num (st, &(st->stack->stack_data[st->start + 4])); + x1 = conv_num (st, &(st->stack->stack_data[st->start + 5])); + y1 = conv_num (st, &(st->stack->stack_data[st->start + 6])); + tick = conv_num (st, &(st->stack->stack_data[st->start + 7])); + event = conv_str (st, &(st->stack->stack_data[st->start + 8])); - if( (m=map_mapname2mapid(mapname))< 0) - return 0; + if ((m = map_mapname2mapid (mapname)) < 0) + return 0; - map_foreachinarea(buildin_areatimer_sub, - m,x0,y0,x1,y1,BL_PC, tick,event ); - return 0; + map_foreachinarea (buildin_areatimer_sub, + m, x0, y0, x1, y1, BL_PC, tick, event); + return 0; } /*========================================== * Check whether the PC is in the specified rectangle *------------------------------------------ */ -int buildin_isin(struct script_state *st) +int buildin_isin (struct script_state *st) { - int x1,y1,x2,y2; - char *str; - struct map_session_data *sd=script_rid2sd(st); + int x1, y1, x2, y2; + char *str; + struct map_session_data *sd = script_rid2sd (st); - str=conv_str(st,& (st->stack->stack_data[st->start+2])); - x1=conv_num(st,& (st->stack->stack_data[st->start+3])); - y1=conv_num(st,& (st->stack->stack_data[st->start+4])); - x2=conv_num(st,& (st->stack->stack_data[st->start+5])); - y2=conv_num(st,& (st->stack->stack_data[st->start+6])); + str = conv_str (st, &(st->stack->stack_data[st->start + 2])); + x1 = conv_num (st, &(st->stack->stack_data[st->start + 3])); + y1 = conv_num (st, &(st->stack->stack_data[st->start + 4])); + x2 = conv_num (st, &(st->stack->stack_data[st->start + 5])); + y2 = conv_num (st, &(st->stack->stack_data[st->start + 6])); - if (!sd) - return 1; + if (!sd) + return 1; - push_val(st->stack, C_INT, - (sd->bl.x >= x1 && sd->bl.x <= x2) - && (sd->bl.y >= y1 && sd->bl.y <= y2) - && (!strcmp(str, map[sd->bl.m].name))); + push_val (st->stack, C_INT, + (sd->bl.x >= x1 && sd->bl.x <= x2) + && (sd->bl.y >= y1 && sd->bl.y <= y2) + && (!strcmp (str, map[sd->bl.m].name))); - return 0; + return 0; } // Trigger the shop on a (hopefully) nearby shop NPC -int buildin_shop(struct script_state *st) +int buildin_shop (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); - struct npc_data *nd; + struct map_session_data *sd = script_rid2sd (st); + struct npc_data *nd; - if (!sd) - return 1; + if (!sd) + return 1; - nd = npc_name2id(conv_str(st,& (st->stack->stack_data[st->start+2]))); - if (!nd) - return 1; + nd = npc_name2id (conv_str (st, &(st->stack->stack_data[st->start + 2]))); + if (!nd) + return 1; - buildin_close(st); - clif_npcbuysell(sd,nd->bl.id); - return 0; + buildin_close (st); + clif_npcbuysell (sd, nd->bl.id); + return 0; } /*========================================== * Check whether the PC is dead *------------------------------------------ */ -int buildin_isdead(struct script_state *st) +int buildin_isdead (struct script_state *st) { - struct map_session_data *sd=script_rid2sd(st); + struct map_session_data *sd = script_rid2sd (st); - push_val(st->stack, C_INT, pc_isdead(sd)); - return 0; + push_val (st->stack, C_INT, pc_isdead (sd)); + return 0; } /*======================================== * Changes a NPC name, and sprite *---------------------------------------- */ -int buildin_fakenpcname(struct script_state *st) +int buildin_fakenpcname (struct script_state *st) { - char *name, *newname; - int newsprite; - struct npc_data *nd; + char *name, *newname; + int newsprite; + struct npc_data *nd; - name = conv_str(st,& (st->stack->stack_data[st->start+2])); - newname = conv_str(st,& (st->stack->stack_data[st->start+3])); - newsprite = conv_num(st,& (st->stack->stack_data[st->start+4])); - nd = npc_name2id(name); - if (!nd) - return 1; - strncpy(nd->name, newname, 24); - nd->class = newsprite; + name = conv_str (st, &(st->stack->stack_data[st->start + 2])); + newname = conv_str (st, &(st->stack->stack_data[st->start + 3])); + newsprite = conv_num (st, &(st->stack->stack_data[st->start + 4])); + nd = npc_name2id (name); + if (!nd) + return 1; + strncpy (nd->name, newname, 24); + nd->class = newsprite; - // Refresh this npc - npc_enable(name,0); - npc_enable(name,1); + // Refresh this npc + npc_enable (name, 0); + npc_enable (name, 1); - return 0; + return 0; } // @@ -6111,67 +7085,74 @@ int buildin_fakenpcname(struct script_state *st) * コマンドの読み取り *------------------------------------------ */ -static int unget_com_data=-1; -int get_com(unsigned char *script,int *pos) +static int unget_com_data = -1; +int get_com (unsigned char *script, int *pos) { - int i,j; - if(unget_com_data>=0){ - i=unget_com_data; - unget_com_data=-1; - return i; - } - if(script[*pos]>=0x80){ - return C_INT; - } - i=0; j=0; - while(script[*pos]>=0x40){ - i=script[(*pos)++]<<j; - j+=6; - } - return i+(script[(*pos)++]<<j); + int i, j; + if (unget_com_data >= 0) + { + i = unget_com_data; + unget_com_data = -1; + return i; + } + if (script[*pos] >= 0x80) + { + return C_INT; + } + i = 0; + j = 0; + while (script[*pos] >= 0x40) + { + i = script[(*pos)++] << j; + j += 6; + } + return i + (script[(*pos)++] << j); } /*========================================== * コマンドのプッシュバック *------------------------------------------ */ -void unget_com(int c) +void unget_com (int c) { - if(unget_com_data!=-1){ - if(battle_config.error_log) - printf("unget_com can back only 1 data\n"); - } - unget_com_data=c; + if (unget_com_data != -1) + { + if (battle_config.error_log) + printf ("unget_com can back only 1 data\n"); + } + unget_com_data = c; } /*========================================== * 数値の所得 *------------------------------------------ */ -int get_num(unsigned char *script,int *pos) +int get_num (unsigned char *script, int *pos) { - int i,j; - i=0; j=0; - while(script[*pos]>=0xc0){ - i+=(script[(*pos)++]&0x7f)<<j; - j+=6; - } - return i+((script[(*pos)++]&0x7f)<<j); + int i, j; + i = 0; + j = 0; + while (script[*pos] >= 0xc0) + { + i += (script[(*pos)++] & 0x7f) << j; + j += 6; + } + return i + ((script[(*pos)++] & 0x7f) << j); } /*========================================== * スタックから値を取り出す *------------------------------------------ */ -int pop_val(struct script_state* st) +int pop_val (struct script_state *st) { - if(st->stack->sp<=0) - return 0; - st->stack->sp--; - get_val(st,&(st->stack->stack_data[st->stack->sp])); - if(st->stack->stack_data[st->stack->sp].type==C_INT) - return st->stack->stack_data[st->stack->sp].u.num; - return 0; + if (st->stack->sp <= 0) + return 0; + st->stack->sp--; + get_val (st, &(st->stack->stack_data[st->stack->sp])); + if (st->stack->stack_data[st->stack->sp].type == C_INT) + return st->stack->stack_data[st->stack->sp].u.num; + return 0; } #define isstr(c) ((c).type==C_STR || (c).type==C_CONSTSTR) @@ -6180,705 +7161,796 @@ int pop_val(struct script_state* st) * 加算演算子 *------------------------------------------ */ -void op_add(struct script_state* st) -{ - st->stack->sp--; - get_val(st,&(st->stack->stack_data[st->stack->sp])); - get_val(st,&(st->stack->stack_data[st->stack->sp-1])); - - if(isstr(st->stack->stack_data[st->stack->sp]) || isstr(st->stack->stack_data[st->stack->sp-1])){ - conv_str(st,&(st->stack->stack_data[st->stack->sp])); - conv_str(st,&(st->stack->stack_data[st->stack->sp-1])); - } - if(st->stack->stack_data[st->stack->sp].type==C_INT){ // ii - st->stack->stack_data[st->stack->sp-1].u.num += st->stack->stack_data[st->stack->sp].u.num; - } else { // ssの予定 - char *buf; - buf=(char *)aCalloc(strlen(st->stack->stack_data[st->stack->sp-1].u.str)+ - strlen(st->stack->stack_data[st->stack->sp].u.str)+1,sizeof(char)); - strcpy(buf,st->stack->stack_data[st->stack->sp-1].u.str); - strcat(buf,st->stack->stack_data[st->stack->sp].u.str); - if(st->stack->stack_data[st->stack->sp-1].type==C_STR) - free(st->stack->stack_data[st->stack->sp-1].u.str); - if(st->stack->stack_data[st->stack->sp].type==C_STR) - free(st->stack->stack_data[st->stack->sp].u.str); - st->stack->stack_data[st->stack->sp-1].type=C_STR; - st->stack->stack_data[st->stack->sp-1].u.str=buf; - } +void op_add (struct script_state *st) +{ + st->stack->sp--; + get_val (st, &(st->stack->stack_data[st->stack->sp])); + get_val (st, &(st->stack->stack_data[st->stack->sp - 1])); + + if (isstr (st->stack->stack_data[st->stack->sp]) + || isstr (st->stack->stack_data[st->stack->sp - 1])) + { + conv_str (st, &(st->stack->stack_data[st->stack->sp])); + conv_str (st, &(st->stack->stack_data[st->stack->sp - 1])); + } + if (st->stack->stack_data[st->stack->sp].type == C_INT) + { // ii + st->stack->stack_data[st->stack->sp - 1].u.num += + st->stack->stack_data[st->stack->sp].u.num; + } + else + { // ssの予定 + char *buf; + buf = + (char *) + aCalloc (strlen (st->stack->stack_data[st->stack->sp - 1].u.str) + + strlen (st->stack->stack_data[st->stack->sp].u.str) + 1, + sizeof (char)); + strcpy (buf, st->stack->stack_data[st->stack->sp - 1].u.str); + strcat (buf, st->stack->stack_data[st->stack->sp].u.str); + if (st->stack->stack_data[st->stack->sp - 1].type == C_STR) + free (st->stack->stack_data[st->stack->sp - 1].u.str); + if (st->stack->stack_data[st->stack->sp].type == C_STR) + free (st->stack->stack_data[st->stack->sp].u.str); + st->stack->stack_data[st->stack->sp - 1].type = C_STR; + st->stack->stack_data[st->stack->sp - 1].u.str = buf; + } } /*========================================== * 二項演算子(文字列) *------------------------------------------ */ -void op_2str(struct script_state *st,int op,int sp1,int sp2) -{ - char *s1=st->stack->stack_data[sp1].u.str, - *s2=st->stack->stack_data[sp2].u.str; - int a=0; - - switch(op){ - case C_EQ: - a= (strcmp(s1,s2)==0); - break; - case C_NE: - a= (strcmp(s1,s2)!=0); - break; - case C_GT: - a= (strcmp(s1,s2)> 0); - break; - case C_GE: - a= (strcmp(s1,s2)>=0); - break; - case C_LT: - a= (strcmp(s1,s2)< 0); - break; - case C_LE: - a= (strcmp(s1,s2)<=0); - break; - default: - printf("illegal string operater\n"); - break; - } - - push_val(st->stack,C_INT,a); - - if(st->stack->stack_data[sp1].type==C_STR) free(s1); - if(st->stack->stack_data[sp2].type==C_STR) free(s2); +void op_2str (struct script_state *st, int op, int sp1, int sp2) +{ + char *s1 = st->stack->stack_data[sp1].u.str, + *s2 = st->stack->stack_data[sp2].u.str; + int a = 0; + + switch (op) + { + case C_EQ: + a = (strcmp (s1, s2) == 0); + break; + case C_NE: + a = (strcmp (s1, s2) != 0); + break; + case C_GT: + a = (strcmp (s1, s2) > 0); + break; + case C_GE: + a = (strcmp (s1, s2) >= 0); + break; + case C_LT: + a = (strcmp (s1, s2) < 0); + break; + case C_LE: + a = (strcmp (s1, s2) <= 0); + break; + default: + printf ("illegal string operater\n"); + break; + } + + push_val (st->stack, C_INT, a); + + if (st->stack->stack_data[sp1].type == C_STR) + free (s1); + if (st->stack->stack_data[sp2].type == C_STR) + free (s2); } + /*========================================== * 二項演算子(数値) *------------------------------------------ */ -void op_2num(struct script_state *st,int op,int i1,int i2) -{ - switch(op){ - case C_SUB: - i1-=i2; - break; - case C_MUL: - i1*=i2; - break; - case C_DIV: - i1/=i2; - break; - case C_MOD: - i1%=i2; - break; - case C_AND: - i1&=i2; - break; - case C_OR: - i1|=i2; - break; - case C_XOR: - i1^=i2; - break; - case C_LAND: - i1=i1&&i2; - break; - case C_LOR: - i1=i1||i2; - break; - case C_EQ: - i1=i1==i2; - break; - case C_NE: - i1=i1!=i2; - break; - case C_GT: - i1=i1>i2; - break; - case C_GE: - i1=i1>=i2; - break; - case C_LT: - i1=i1<i2; - break; - case C_LE: - i1=i1<=i2; - break; - case C_R_SHIFT: - i1=i1>>i2; - break; - case C_L_SHIFT: - i1=i1<<i2; - break; - } - push_val(st->stack,C_INT,i1); +void op_2num (struct script_state *st, int op, int i1, int i2) +{ + switch (op) + { + case C_SUB: + i1 -= i2; + break; + case C_MUL: + i1 *= i2; + break; + case C_DIV: + i1 /= i2; + break; + case C_MOD: + i1 %= i2; + break; + case C_AND: + i1 &= i2; + break; + case C_OR: + i1 |= i2; + break; + case C_XOR: + i1 ^= i2; + break; + case C_LAND: + i1 = i1 && i2; + break; + case C_LOR: + i1 = i1 || i2; + break; + case C_EQ: + i1 = i1 == i2; + break; + case C_NE: + i1 = i1 != i2; + break; + case C_GT: + i1 = i1 > i2; + break; + case C_GE: + i1 = i1 >= i2; + break; + case C_LT: + i1 = i1 < i2; + break; + case C_LE: + i1 = i1 <= i2; + break; + case C_R_SHIFT: + i1 = i1 >> i2; + break; + case C_L_SHIFT: + i1 = i1 << i2; + break; + } + push_val (st->stack, C_INT, i1); } + /*========================================== * 二項演算子 *------------------------------------------ */ -void op_2(struct script_state *st,int op) +void op_2 (struct script_state *st, int op) { - int i1,i2; - char *s1=NULL,*s2=NULL; + int i1, i2; + char *s1 = NULL, *s2 = NULL; - i2=pop_val(st); - if( isstr(st->stack->stack_data[st->stack->sp]) ) - s2=st->stack->stack_data[st->stack->sp].u.str; + i2 = pop_val (st); + if (isstr (st->stack->stack_data[st->stack->sp])) + s2 = st->stack->stack_data[st->stack->sp].u.str; - i1=pop_val(st); - if( isstr(st->stack->stack_data[st->stack->sp]) ) - s1=st->stack->stack_data[st->stack->sp].u.str; + i1 = pop_val (st); + if (isstr (st->stack->stack_data[st->stack->sp])) + s1 = st->stack->stack_data[st->stack->sp].u.str; - if( s1!=NULL && s2!=NULL ){ - // ss => op_2str - op_2str(st,op,st->stack->sp,st->stack->sp+1); - }else if( s1==NULL && s2==NULL ){ - // ii => op_2num - op_2num(st,op,i1,i2); - }else{ - // si,is => error - printf("script: op_2: int&str, str&int not allow."); - push_val(st->stack,C_INT,0); - } + if (s1 != NULL && s2 != NULL) + { + // ss => op_2str + op_2str (st, op, st->stack->sp, st->stack->sp + 1); + } + else if (s1 == NULL && s2 == NULL) + { + // ii => op_2num + op_2num (st, op, i1, i2); + } + else + { + // si,is => error + printf ("script: op_2: int&str, str&int not allow."); + push_val (st->stack, C_INT, 0); + } } /*========================================== * 単項演算子 *------------------------------------------ */ -void op_1num(struct script_state *st,int op) -{ - int i1; - i1=pop_val(st); - switch(op){ - case C_NEG: - i1=-i1; - break; - case C_NOT: - i1=~i1; - break; - case C_LNOT: - i1=!i1; - break; - } - push_val(st->stack,C_INT,i1); +void op_1num (struct script_state *st, int op) +{ + int i1; + i1 = pop_val (st); + switch (op) + { + case C_NEG: + i1 = -i1; + break; + case C_NOT: + i1 = ~i1; + break; + case C_LNOT: + i1 = !i1; + break; + } + push_val (st->stack, C_INT, i1); } - /*========================================== * 関数の実行 *------------------------------------------ */ -int run_func(struct script_state *st) +int run_func (struct script_state *st) { - int i,start_sp,end_sp,func; + int i, start_sp, end_sp, func; - end_sp=st->stack->sp; - for(i=end_sp-1;i>=0 && st->stack->stack_data[i].type!=C_ARG;i--); - if(i==0){ - if(battle_config.error_log) - printf("function not found\n"); -// st->stack->sp=0; - st->state=END; - return 0; - } - start_sp=i-1; - st->start=i-1; - st->end=end_sp; - - func=st->stack->stack_data[st->start].u.num; - if( st->stack->stack_data[st->start].type!=C_NAME || str_data[func].type!=C_FUNC ){ - printf("run_func: not function and command! \n"); -// st->stack->sp=0; - st->state=END; - return 0; - } + end_sp = st->stack->sp; + for (i = end_sp - 1; i >= 0 && st->stack->stack_data[i].type != C_ARG; + i--); + if (i == 0) + { + if (battle_config.error_log) + printf ("function not found\n"); +// st->stack->sp=0; + st->state = END; + return 0; + } + start_sp = i - 1; + st->start = i - 1; + st->end = end_sp; + + func = st->stack->stack_data[st->start].u.num; + if (st->stack->stack_data[st->start].type != C_NAME + || str_data[func].type != C_FUNC) + { + printf ("run_func: not function and command! \n"); +// st->stack->sp=0; + st->state = END; + return 0; + } #ifdef DEBUG_RUN - if(battle_config.etc_log) { - printf("run_func : %s? (%d(%d))\n",str_buf+str_data[func].str,func,str_data[func].type); - printf("stack dump :"); - for(i=0;i<end_sp;i++){ - switch(st->stack->stack_data[i].type){ - case C_INT: - printf(" int(%d)",st->stack->stack_data[i].u.num); - break; - case C_NAME: - printf(" name(%s)",str_buf+str_data[st->stack->stack_data[i].u.num].str); - break; - case C_ARG: - printf(" arg"); - break; - case C_POS: - printf(" pos(%d)",st->stack->stack_data[i].u.num); - break; - default: - printf(" %d,%d",st->stack->stack_data[i].type,st->stack->stack_data[i].u.num); - } - } - printf("\n"); - } + if (battle_config.etc_log) + { + printf ("run_func : %s? (%d(%d))\n", str_buf + str_data[func].str, + func, str_data[func].type); + printf ("stack dump :"); + for (i = 0; i < end_sp; i++) + { + switch (st->stack->stack_data[i].type) + { + case C_INT: + printf (" int(%d)", st->stack->stack_data[i].u.num); + break; + case C_NAME: + printf (" name(%s)", + str_buf + + str_data[st->stack->stack_data[i].u.num].str); + break; + case C_ARG: + printf (" arg"); + break; + case C_POS: + printf (" pos(%d)", st->stack->stack_data[i].u.num); + break; + default: + printf (" %d,%d", st->stack->stack_data[i].type, + st->stack->stack_data[i].u.num); + } + } + printf ("\n"); + } #endif - if(str_data[func].func){ - str_data[func].func(st); - } else { - if(battle_config.error_log) - printf("run_func : %s? (%d(%d))\n",str_buf+str_data[func].str,func,str_data[func].type); - push_val(st->stack,C_INT,0); - } - - pop_stack(st->stack,start_sp,end_sp); - - if(st->state==RETFUNC){ - // ユーザー定義関数からの復帰 - int olddefsp=st->defsp; - int i; - - pop_stack(st->stack,st->defsp,start_sp); // 復帰に邪魔なスタック削除 - if(st->defsp<4 || st->stack->stack_data[st->defsp-1].type!=C_RETINFO){ - printf("script:run_func(return) return without callfunc or callsub!\n"); - st->state=END; - return 0; - } - i = conv_num(st,& (st->stack->stack_data[st->defsp-4])); // 引数の数所得 - st->pos=conv_num(st,& (st->stack->stack_data[st->defsp-1])); // スクリプト位置の復元 - st->script=(char*)conv_num(st,& (st->stack->stack_data[st->defsp-2])); // スクリプトを復元 - st->defsp=conv_num(st,& (st->stack->stack_data[st->defsp-3])); // 基準スタックポインタを復元 + if (str_data[func].func) + { + str_data[func].func (st); + } + else + { + if (battle_config.error_log) + printf ("run_func : %s? (%d(%d))\n", str_buf + str_data[func].str, + func, str_data[func].type); + push_val (st->stack, C_INT, 0); + } + + pop_stack (st->stack, start_sp, end_sp); + + if (st->state == RETFUNC) + { + // ユーザー定義関数からの復帰 + int olddefsp = st->defsp; + int i; + + pop_stack (st->stack, st->defsp, start_sp); // 復帰に邪魔なスタック削除 + if (st->defsp < 4 + || st->stack->stack_data[st->defsp - 1].type != C_RETINFO) + { + printf + ("script:run_func(return) return without callfunc or callsub!\n"); + st->state = END; + return 0; + } + i = conv_num (st, &(st->stack->stack_data[st->defsp - 4])); // 引数の数所得 + st->pos = conv_num (st, &(st->stack->stack_data[st->defsp - 1])); // スクリプト位置の復元 + st->script = (char *) conv_num (st, &(st->stack->stack_data[st->defsp - 2])); // スクリプトを復元 + st->defsp = conv_num (st, &(st->stack->stack_data[st->defsp - 3])); // 基準スタックポインタを復元 - pop_stack(st->stack,olddefsp-4-i,olddefsp); // 要らなくなったスタック(引数と復帰用データ)削除 + pop_stack (st->stack, olddefsp - 4 - i, olddefsp); // 要らなくなったスタック(引数と復帰用データ)削除 - st->state=GOTO; - } + st->state = GOTO; + } - return 0; + return 0; } /*========================================== * スクリプトの実行メイン部分 *------------------------------------------ */ -int run_script_main(unsigned char *script,int pos,int rid,int oid,struct script_state *st,unsigned char *rootscript) -{ - int c,rerun_pos; - int cmdcount=script_config.check_cmdcount; - int gotocount=script_config.check_gotocount; - struct script_stack *stack=st->stack; - - st->defsp=stack->sp; - st->script=script; - - rerun_pos=st->pos; - for(st->state=0;st->state==0;){ - switch(c=get_com(script,&st->pos)){ - case C_EOL: - if(stack->sp!=st->defsp){ - if(battle_config.error_log) - printf("stack.sp(%d) != default(%d)\n",stack->sp,st->defsp); - stack->sp=st->defsp; - } - rerun_pos=st->pos; - break; - case C_INT: - push_val(stack,C_INT,get_num(script,&st->pos)); - break; - case C_POS: - case C_NAME: - push_val(stack,c,(*(int*)(script+st->pos))&0xffffff); - st->pos+=3; - break; - case C_ARG: - push_val(stack,c,0); - break; - case C_STR: - push_str(stack,C_CONSTSTR,script+st->pos); - while(script[st->pos++]); - break; - case C_FUNC: - run_func(st); - if(st->state==GOTO){ - rerun_pos=st->pos; - script=st->script; - st->state=0; - if( gotocount>0 && (--gotocount)<=0 ){ - printf("run_script: infinity loop !\n"); - st->state=END; - } - } - break; - - case C_ADD: - op_add(st); - break; - - case C_SUB: - case C_MUL: - case C_DIV: - case C_MOD: - case C_EQ: - case C_NE: - case C_GT: - case C_GE: - case C_LT: - case C_LE: - case C_AND: - case C_OR: - case C_XOR: - case C_LAND: - case C_LOR: - case C_R_SHIFT: - case C_L_SHIFT: - op_2(st,c); - break; - - case C_NEG: - case C_NOT: - case C_LNOT: - op_1num(st,c); - break; - - case C_NOP: - st->state=END; - break; - - default: - if(battle_config.error_log) - printf("unknown command : %d @ %d\n",c,pos); - st->state=END; - break; - } - if( cmdcount>0 && (--cmdcount)<=0 ){ - printf("run_script: infinity loop !\n"); - st->state=END; - } - } - switch(st->state){ - case STOP: - break; - case END: - { - struct map_session_data *sd=map_id2sd(st->rid); - st->pos=-1; - if(sd && sd->npc_id==st->oid) - npc_event_dequeue(sd); - } - break; - case RERUNLINE: - { - st->pos=rerun_pos; - } - break; - } +int run_script_main (unsigned char *script, int pos, int rid, int oid, + struct script_state *st, unsigned char *rootscript) +{ + int c, rerun_pos; + int cmdcount = script_config.check_cmdcount; + int gotocount = script_config.check_gotocount; + struct script_stack *stack = st->stack; + + st->defsp = stack->sp; + st->script = script; + + rerun_pos = st->pos; + for (st->state = 0; st->state == 0;) + { + switch (c = get_com (script, &st->pos)) + { + case C_EOL: + if (stack->sp != st->defsp) + { + if (battle_config.error_log) + printf ("stack.sp(%d) != default(%d)\n", stack->sp, + st->defsp); + stack->sp = st->defsp; + } + rerun_pos = st->pos; + break; + case C_INT: + push_val (stack, C_INT, get_num (script, &st->pos)); + break; + case C_POS: + case C_NAME: + push_val (stack, c, (*(int *) (script + st->pos)) & 0xffffff); + st->pos += 3; + break; + case C_ARG: + push_val (stack, c, 0); + break; + case C_STR: + push_str (stack, C_CONSTSTR, script + st->pos); + while (script[st->pos++]); + break; + case C_FUNC: + run_func (st); + if (st->state == GOTO) + { + rerun_pos = st->pos; + script = st->script; + st->state = 0; + if (gotocount > 0 && (--gotocount) <= 0) + { + printf ("run_script: infinity loop !\n"); + st->state = END; + } + } + break; - if( st->state!=END){ - // 再開するためにスタック情報を保存 - struct map_session_data *sd=map_id2sd(st->rid); - if(sd/* && sd->npc_stackbuf==NULL*/){ - if( sd->npc_stackbuf ) - free( sd->npc_stackbuf ); - sd->npc_stackbuf = (char *)aCalloc(sizeof(stack->stack_data[0])*stack->sp_max,sizeof(char)); - memcpy(sd->npc_stackbuf, stack->stack_data, sizeof(stack->stack_data[0]) * stack->sp_max); - sd->npc_stack = stack->sp; - sd->npc_stackmax = stack->sp_max; - sd->npc_script=script; - sd->npc_scriptroot=rootscript; - } - } + case C_ADD: + op_add (st); + break; - return 0; -} + case C_SUB: + case C_MUL: + case C_DIV: + case C_MOD: + case C_EQ: + case C_NE: + case C_GT: + case C_GE: + case C_LT: + case C_LE: + case C_AND: + case C_OR: + case C_XOR: + case C_LAND: + case C_LOR: + case C_R_SHIFT: + case C_L_SHIFT: + op_2 (st, c); + break; -/*========================================== - * スクリプトの実行 - *------------------------------------------ - */ -int run_script(unsigned char *script,int pos,int rid,int oid) -{ - return run_script_l(script, pos, rid, oid, 0, NULL); -} + case C_NEG: + case C_NOT: + case C_LNOT: + op_1num (st, c); + break; -int run_script_l(unsigned char *script,int pos,int rid,int oid, int args_nr, argrec_t *args) -{ - struct script_stack stack; - struct script_state st; - struct map_session_data *sd=map_id2sd(rid); - unsigned char *rootscript=script; - int i; - if(script==NULL || pos<0) - return -1; + case C_NOP: + st->state = END; + break; - if(sd && sd->npc_stackbuf && sd->npc_scriptroot==(char*)rootscript){ - // 前回のスタックを復帰 - script=sd->npc_script; - stack.sp=sd->npc_stack; - stack.sp_max=sd->npc_stackmax; - stack.stack_data=(struct script_data *)aCalloc(stack.sp_max,sizeof(stack.stack_data[0])); - memcpy(stack.stack_data,sd->npc_stackbuf,sizeof(stack.stack_data[0])*stack.sp_max); - free(sd->npc_stackbuf); - sd->npc_stackbuf=NULL; - }else{ - // スタック初期化 - stack.sp=0; - stack.sp_max=64; - stack.stack_data=(struct script_data *)aCalloc(stack.sp_max,sizeof(stack.stack_data[0])); - } - st.stack=&stack; - st.pos=pos; - st.rid=rid; - st.oid=oid; - for (i = 0; i < args_nr; i++) { - if (args[i].name[strlen(args[i].name) - 1] == '$') - pc_setregstr(sd, add_str(args[i].name), args[i].v.s); - else - pc_setreg(sd, add_str(args[i].name), args[i].v.i); + default: + if (battle_config.error_log) + printf ("unknown command : %d @ %d\n", c, pos); + st->state = END; + break; + } + if (cmdcount > 0 && (--cmdcount) <= 0) + { + printf ("run_script: infinity loop !\n"); + st->state = END; } - run_script_main(script,pos,rid,oid,&st,rootscript); + } + switch (st->state) + { + case STOP: + break; + case END: + { + struct map_session_data *sd = map_id2sd (st->rid); + st->pos = -1; + if (sd && sd->npc_id == st->oid) + npc_event_dequeue (sd); + } + break; + case RERUNLINE: + { + st->pos = rerun_pos; + } + break; + } + + if (st->state != END) + { + // 再開するためにスタック情報を保存 + struct map_session_data *sd = map_id2sd (st->rid); + if (sd /* && sd->npc_stackbuf==NULL */ ) + { + if (sd->npc_stackbuf) + free (sd->npc_stackbuf); + sd->npc_stackbuf = + (char *) aCalloc (sizeof (stack->stack_data[0]) * + stack->sp_max, sizeof (char)); + memcpy (sd->npc_stackbuf, stack->stack_data, + sizeof (stack->stack_data[0]) * stack->sp_max); + sd->npc_stack = stack->sp; + sd->npc_stackmax = stack->sp_max; + sd->npc_script = script; + sd->npc_scriptroot = rootscript; + } + } - free(stack.stack_data); - stack.stack_data=NULL; - return st.pos; + return 0; } +/*========================================== + * スクリプトの実行 + *------------------------------------------ + */ +int run_script (unsigned char *script, int pos, int rid, int oid) +{ + return run_script_l (script, pos, rid, oid, 0, NULL); +} + +int run_script_l (unsigned char *script, int pos, int rid, int oid, + int args_nr, argrec_t * args) +{ + struct script_stack stack; + struct script_state st; + struct map_session_data *sd = map_id2sd (rid); + unsigned char *rootscript = script; + int i; + if (script == NULL || pos < 0) + return -1; + + if (sd && sd->npc_stackbuf && sd->npc_scriptroot == (char *) rootscript) + { + // 前回のスタックを復帰 + script = sd->npc_script; + stack.sp = sd->npc_stack; + stack.sp_max = sd->npc_stackmax; + stack.stack_data = + (struct script_data *) aCalloc (stack.sp_max, + sizeof (stack.stack_data[0])); + memcpy (stack.stack_data, sd->npc_stackbuf, + sizeof (stack.stack_data[0]) * stack.sp_max); + free (sd->npc_stackbuf); + sd->npc_stackbuf = NULL; + } + else + { + // スタック初期化 + stack.sp = 0; + stack.sp_max = 64; + stack.stack_data = + (struct script_data *) aCalloc (stack.sp_max, + sizeof (stack.stack_data[0])); + } + st.stack = &stack; + st.pos = pos; + st.rid = rid; + st.oid = oid; + for (i = 0; i < args_nr; i++) + { + if (args[i].name[strlen (args[i].name) - 1] == '$') + pc_setregstr (sd, add_str (args[i].name), args[i].v.s); + else + pc_setreg (sd, add_str (args[i].name), args[i].v.i); + } + run_script_main (script, pos, rid, oid, &st, rootscript); + + free (stack.stack_data); + stack.stack_data = NULL; + return st.pos; +} /*========================================== * マップ変数の変更 *------------------------------------------ */ -int mapreg_setreg(int num,int val) +int mapreg_setreg (int num, int val) { - if(val!=0) - numdb_insert(mapreg_db,num,val); - else - numdb_erase(mapreg_db,num); + if (val != 0) + numdb_insert (mapreg_db, num, val); + else + numdb_erase (mapreg_db, num); - mapreg_dirty=1; - return 0; + mapreg_dirty = 1; + return 0; } + /*========================================== * 文字列型マップ変数の変更 *------------------------------------------ */ -int mapreg_setregstr(int num,const char *str) +int mapreg_setregstr (int num, const char *str) { - char *p; + char *p; - if( (p=numdb_search(mapregstr_db,num))!=NULL ) - free(p); + if ((p = numdb_search (mapregstr_db, num)) != NULL) + free (p); - if( str==NULL || *str==0 ){ - numdb_erase(mapregstr_db,num); - mapreg_dirty=1; - return 0; - } - p=(char *)aCalloc(strlen(str)+1, sizeof(char)); - strcpy(p,str); - numdb_insert(mapregstr_db,num,p); - mapreg_dirty=1; - return 0; + if (str == NULL || *str == 0) + { + numdb_erase (mapregstr_db, num); + mapreg_dirty = 1; + return 0; + } + p = (char *) aCalloc (strlen (str) + 1, sizeof (char)); + strcpy (p, str); + numdb_insert (mapregstr_db, num, p); + mapreg_dirty = 1; + return 0; } /*========================================== * 永続的マップ変数の読み込み *------------------------------------------ */ -static int script_load_mapreg() -{ - FILE *fp; - char line[1024]; - - if( (fp=fopen_(mapreg_txt,"rt"))==NULL ) - return -1; - - while(fgets(line,sizeof(line),fp)){ - char buf1[256],buf2[1024],*p; - int n,v,s,i; - if( sscanf(line,"%255[^,],%d\t%n",buf1,&i,&n)!=2 && - (i=0,sscanf(line,"%[^\t]\t%n",buf1,&n)!=1) ) - continue; - if( buf1[strlen(buf1)-1]=='$' ){ - if( sscanf(line+n,"%[^\n\r]",buf2)!=1 ){ - printf("%s: %s broken data !\n",mapreg_txt,buf1); - continue; - } - p=(char *)aCalloc(strlen(buf2) + 1,sizeof(char)); - strcpy(p,buf2); - s=add_str(buf1); - numdb_insert(mapregstr_db,(i<<24)|s,p); - }else{ - if( sscanf(line+n,"%d",&v)!=1 ){ - printf("%s: %s broken data !\n",mapreg_txt,buf1); - continue; - } - s=add_str(buf1); - numdb_insert(mapreg_db,(i<<24)|s,v); - } - } - fclose_(fp); - mapreg_dirty=0; - return 0; +static int script_load_mapreg () +{ + FILE *fp; + char line[1024]; + + if ((fp = fopen_ (mapreg_txt, "rt")) == NULL) + return -1; + + while (fgets (line, sizeof (line), fp)) + { + char buf1[256], buf2[1024], *p; + int n, v, s, i; + if (sscanf (line, "%255[^,],%d\t%n", buf1, &i, &n) != 2 && + (i = 0, sscanf (line, "%[^\t]\t%n", buf1, &n) != 1)) + continue; + if (buf1[strlen (buf1) - 1] == '$') + { + if (sscanf (line + n, "%[^\n\r]", buf2) != 1) + { + printf ("%s: %s broken data !\n", mapreg_txt, buf1); + continue; + } + p = (char *) aCalloc (strlen (buf2) + 1, sizeof (char)); + strcpy (p, buf2); + s = add_str (buf1); + numdb_insert (mapregstr_db, (i << 24) | s, p); + } + else + { + if (sscanf (line + n, "%d", &v) != 1) + { + printf ("%s: %s broken data !\n", mapreg_txt, buf1); + continue; + } + s = add_str (buf1); + numdb_insert (mapreg_db, (i << 24) | s, v); + } + } + fclose_ (fp); + mapreg_dirty = 0; + return 0; } + /*========================================== * 永続的マップ変数の書き込み *------------------------------------------ */ -static int script_save_mapreg_intsub(void *key,void *data,va_list ap) +static int script_save_mapreg_intsub (void *key, void *data, va_list ap) { - FILE *fp=va_arg(ap,FILE*); - int num=((int)key)&0x00ffffff, i=((int)key)>>24; - char *name=str_buf+str_data[num].str; - if( name[1]!='@' ){ - if(i==0) - fprintf(fp,"%s\t%d\n", name, (int)data); - else - fprintf(fp,"%s,%d\t%d\n", name, i, (int)data); - } - return 0; + FILE *fp = va_arg (ap, FILE *); + int num = ((int) key) & 0x00ffffff, i = ((int) key) >> 24; + char *name = str_buf + str_data[num].str; + if (name[1] != '@') + { + if (i == 0) + fprintf (fp, "%s\t%d\n", name, (int) data); + else + fprintf (fp, "%s,%d\t%d\n", name, i, (int) data); + } + return 0; } -static int script_save_mapreg_strsub(void *key,void *data,va_list ap) + +static int script_save_mapreg_strsub (void *key, void *data, va_list ap) { - FILE *fp=va_arg(ap,FILE*); - int num=((int)key)&0x00ffffff, i=((int)key)>>24; - char *name=str_buf+str_data[num].str; - if( name[1]!='@' ){ - if(i==0) - fprintf(fp,"%s\t%s\n", name, (char *)data); - else - fprintf(fp,"%s,%d\t%s\n", name, i, (char *)data); - } - return 0; + FILE *fp = va_arg (ap, FILE *); + int num = ((int) key) & 0x00ffffff, i = ((int) key) >> 24; + char *name = str_buf + str_data[num].str; + if (name[1] != '@') + { + if (i == 0) + fprintf (fp, "%s\t%s\n", name, (char *) data); + else + fprintf (fp, "%s,%d\t%s\n", name, i, (char *) data); + } + return 0; } -static int script_save_mapreg() + +static int script_save_mapreg () { - FILE *fp; - int lock; + FILE *fp; + int lock; - if( (fp=lock_fopen(mapreg_txt,&lock))==NULL ) - return -1; - numdb_foreach(mapreg_db,script_save_mapreg_intsub,fp); - numdb_foreach(mapregstr_db,script_save_mapreg_strsub,fp); - lock_fclose(fp,mapreg_txt,&lock); - mapreg_dirty=0; - return 0; + if ((fp = lock_fopen (mapreg_txt, &lock)) == NULL) + return -1; + numdb_foreach (mapreg_db, script_save_mapreg_intsub, fp); + numdb_foreach (mapregstr_db, script_save_mapreg_strsub, fp); + lock_fclose (fp, mapreg_txt, &lock); + mapreg_dirty = 0; + return 0; } -static int script_autosave_mapreg(int tid,unsigned int tick,int id,int data) + +static int script_autosave_mapreg (int tid, unsigned int tick, int id, + int data) { - if(mapreg_dirty) - script_save_mapreg(); - return 0; + if (mapreg_dirty) + script_save_mapreg (); + return 0; } /*========================================== * *------------------------------------------ */ -static int set_posword(char *p) -{ - char* np,* str[15]; - int i=0; - for(i=0;i<11;i++) { - if((np=strchr(p,','))!=NULL) { - str[i]=p; - *np=0; - p=np+1; - } else { - str[i]=p; - p+=strlen(p); - } - if(str[i]) - strcpy(pos[i],str[i]); - } - return 0; -} - -int script_config_read(char *cfgName) +static int set_posword (char *p) { - int i; - char line[1024],w1[1024],w2[1024]; - FILE *fp; - - script_config.warn_func_no_comma=1; - script_config.warn_cmd_no_comma=1; - script_config.warn_func_mismatch_paramnum=1; - script_config.warn_cmd_mismatch_paramnum=1; - script_config.check_cmdcount=8192; - script_config.check_gotocount=512; - - fp=fopen_(cfgName,"r"); - if(fp==NULL){ - printf("file not found: %s\n",cfgName); - return 1; - } - while(fgets(line,1020,fp)){ - if(line[0] == '/' && line[1] == '/') - continue; - i=sscanf(line,"%[^:]: %[^\r\n]",w1,w2); - if(i!=2) - continue; - if(strcmpi(w1,"refine_posword")==0) { - set_posword(w2); - } - if(strcmpi(w1,"import")==0){ - script_config_read(w2); - } - } - fclose_(fp); + char *np, *str[15]; + int i = 0; + for (i = 0; i < 11; i++) + { + if ((np = strchr (p, ',')) != NULL) + { + str[i] = p; + *np = 0; + p = np + 1; + } + else + { + str[i] = p; + p += strlen (p); + } + if (str[i]) + strcpy (pos[i], str[i]); + } + return 0; +} + +int script_config_read (char *cfgName) +{ + int i; + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + script_config.warn_func_no_comma = 1; + script_config.warn_cmd_no_comma = 1; + script_config.warn_func_mismatch_paramnum = 1; + script_config.warn_cmd_mismatch_paramnum = 1; + script_config.check_cmdcount = 8192; + script_config.check_gotocount = 512; + + fp = fopen_ (cfgName, "r"); + if (fp == NULL) + { + printf ("file not found: %s\n", cfgName); + return 1; + } + while (fgets (line, 1020, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + i = sscanf (line, "%[^:]: %[^\r\n]", w1, w2); + if (i != 2) + continue; + if (strcmpi (w1, "refine_posword") == 0) + { + set_posword (w2); + } + if (strcmpi (w1, "import") == 0) + { + script_config_read (w2); + } + } + fclose_ (fp); - return 0; + return 0; } /*========================================== * 終了 *------------------------------------------ */ -static int mapreg_db_final(void *key,void *data,va_list ap) +static int mapreg_db_final (void *key, void *data, va_list ap) { - return 0; + return 0; } -static int mapregstr_db_final(void *key,void *data,va_list ap) + +static int mapregstr_db_final (void *key, void *data, va_list ap) { - free(data); - return 0; + free (data); + return 0; } -static int scriptlabel_db_final(void *key,void *data,va_list ap) + +static int scriptlabel_db_final (void *key, void *data, va_list ap) { - return 0; + return 0; } -static int userfunc_db_final(void *key,void *data,va_list ap) + +static int userfunc_db_final (void *key, void *data, va_list ap) { - free(key); - free(data); - return 0; + free (key); + free (data); + return 0; } -int do_final_script() + +int do_final_script () { - if(mapreg_dirty>=0) - script_save_mapreg(); - if(script_buf) - free(script_buf); + if (mapreg_dirty >= 0) + script_save_mapreg (); + if (script_buf) + free (script_buf); - if(mapreg_db) - numdb_final(mapreg_db,mapreg_db_final); - if(mapregstr_db) - strdb_final(mapregstr_db,mapregstr_db_final); - if(scriptlabel_db) - strdb_final(scriptlabel_db,scriptlabel_db_final); - if(userfunc_db) - strdb_final(userfunc_db,userfunc_db_final); + if (mapreg_db) + numdb_final (mapreg_db, mapreg_db_final); + if (mapregstr_db) + strdb_final (mapregstr_db, mapregstr_db_final); + if (scriptlabel_db) + strdb_final (scriptlabel_db, scriptlabel_db_final); + if (userfunc_db) + strdb_final (userfunc_db, userfunc_db_final); - if (str_data) - free(str_data); - if (str_buf) - free(str_buf); + if (str_data) + free (str_data); + if (str_buf) + free (str_buf); - return 0; + return 0; } + /*========================================== * 初期化 *------------------------------------------ */ -int do_init_script() +int do_init_script () { - mapreg_db=numdb_init(); - mapregstr_db=numdb_init(); - script_load_mapreg(); + mapreg_db = numdb_init (); + mapregstr_db = numdb_init (); + script_load_mapreg (); - add_timer_func_list(script_autosave_mapreg,"script_autosave_mapreg"); - add_timer_interval(gettick()+MAPREG_AUTOSAVE_INTERVAL, - script_autosave_mapreg,0,0,MAPREG_AUTOSAVE_INTERVAL); + add_timer_func_list (script_autosave_mapreg, "script_autosave_mapreg"); + add_timer_interval (gettick () + MAPREG_AUTOSAVE_INTERVAL, + script_autosave_mapreg, 0, 0, + MAPREG_AUTOSAVE_INTERVAL); - scriptlabel_db=strdb_init(50); - return 0; + scriptlabel_db = strdb_init (50); + return 0; } diff --git a/src/map/script.h b/src/map/script.h index c5ff909..b70aba3 100644 --- a/src/map/script.h +++ b/src/map/script.h @@ -2,46 +2,51 @@ #ifndef _SCRIPT_H_ #define _SCRIPT_H_ -struct script_data { - int type; - union { - int num; - char *str; - } u; +struct script_data +{ + int type; + union + { + int num; + char *str; + } u; }; -struct script_stack { - int sp,sp_max; - struct script_data *stack_data; +struct script_stack +{ + int sp, sp_max; + struct script_data *stack_data; }; -struct script_state { - struct script_stack *stack; - int start,end; - int pos,state; - int rid,oid; - char *script,*new_script; - int defsp,new_pos,new_defsp; +struct script_state +{ + struct script_stack *stack; + int start, end; + int pos, state; + int rid, oid; + char *script, *new_script; + int defsp, new_pos, new_defsp; }; -unsigned char * parse_script(unsigned char *,int); -typedef struct argrec { - char *name; - union { - int i; - char * s; - } v; +unsigned char *parse_script (unsigned char *, int); +typedef struct argrec +{ + char *name; + union + { + int i; + char *s; + } v; } argrec_t; -int run_script_l(unsigned char *,int,int,int,int,argrec_t *args); -int run_script(unsigned char *,int,int,int); +int run_script_l (unsigned char *, int, int, int, int, argrec_t * args); +int run_script (unsigned char *, int, int, int); -struct dbt* script_get_label_db(); -struct dbt* script_get_userfunc_db(); +struct dbt *script_get_label_db (); +struct dbt *script_get_userfunc_db (); -int script_config_read(char *cfgName); -int do_init_script(); -int do_final_script(); +int script_config_read (char *cfgName); +int do_init_script (); +int do_final_script (); extern char mapreg_txt[]; #endif - diff --git a/src/map/skill-pools.c b/src/map/skill-pools.c index 177a6a2..d533ae3 100644 --- a/src/map/skill-pools.c +++ b/src/map/skill-pools.c @@ -24,142 +24,135 @@ #include "memwatch.h" #endif -int skill_pool_skills[MAX_POOL_SKILLS]; -int skill_pool_skills_size = 0; +int skill_pool_skills[MAX_POOL_SKILLS]; +int skill_pool_skills_size = 0; -extern void -skill_pool_register(int id) +extern void skill_pool_register (int id) { - if (skill_pool_skills_size + 1 >= MAX_POOL_SKILLS) { - fprintf(stderr, "Too many pool skills! Increase MAX_POOL_SKILLS and recompile."); - return; - } - - skill_pool_skills[skill_pool_skills_size++] = id; + if (skill_pool_skills_size + 1 >= MAX_POOL_SKILLS) + { + fprintf (stderr, + "Too many pool skills! Increase MAX_POOL_SKILLS and recompile."); + return; + } + + skill_pool_skills[skill_pool_skills_size++] = id; } - -char * -skill_name(int skill) +char *skill_name (int skill) { - if (skill > 0 && skill < MAX_SKILL_DB) - return skill_names[skill].desc; - else - return NULL; + if (skill > 0 && skill < MAX_SKILL_DB) + return skill_names[skill].desc; + else + return NULL; } -int -skill_pool(struct map_session_data *sd, int *skills) +int skill_pool (struct map_session_data *sd, int *skills) { - int i, count = 0; - - for (i = 0; count < MAX_SKILL_POOL && i < skill_pool_skills_size; i++) { - int skill_id = skill_pool_skills[i]; - if (sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED) { - if (skills) - skills[count] = skill_id; - ++count; - } + int i, count = 0; + + for (i = 0; count < MAX_SKILL_POOL && i < skill_pool_skills_size; i++) + { + int skill_id = skill_pool_skills[i]; + if (sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED) + { + if (skills) + skills[count] = skill_id; + ++count; } + } - return count; + return count; } -void -skill_pool_empty(struct map_session_data *sd) +void skill_pool_empty (struct map_session_data *sd) { - int i; + int i; - for (i = 0; i < skill_pool_skills_size; i++) { - int skill_id = skill_pool_skills[i]; - sd->status.skill[skill_id].flags = 0; - } + for (i = 0; i < skill_pool_skills_size; i++) + { + int skill_id = skill_pool_skills[i]; + sd->status.skill[skill_id].flags = 0; + } } -int skill_pool_size(struct map_session_data *sd) +int skill_pool_size (struct map_session_data *sd) { - return skill_pool(sd, NULL); + return skill_pool (sd, NULL); } -int -skill_pool_max(struct map_session_data *sd) +int skill_pool_max (struct map_session_data *sd) { - return sd->status.skill[TMW_SKILLPOOL].lv; + return sd->status.skill[TMW_SKILLPOOL].lv; } - -int -skill_pool_activate(struct map_session_data *sd, int skill_id) +int skill_pool_activate (struct map_session_data *sd, int skill_id) { - if (sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED) - return 0; // Already there - else if (sd->status.skill[skill_id].id == skill_id // knows the skill - && (skill_pool_size(sd) < skill_pool_max(sd))) { - sd->status.skill[skill_id].flags |= SKILL_POOL_ACTIVATED; - pc_calcstatus(sd, 0); - MAP_LOG_PC(sd, "SKILL-ACTIVATE %d %d %d", skill_id, sd->status.skill[skill_id].lv, skill_power(sd, skill_id)); - return 0; - } - - return 1; // failed + if (sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED) + return 0; // Already there + else if (sd->status.skill[skill_id].id == skill_id // knows the skill + && (skill_pool_size (sd) < skill_pool_max (sd))) + { + sd->status.skill[skill_id].flags |= SKILL_POOL_ACTIVATED; + pc_calcstatus (sd, 0); + MAP_LOG_PC (sd, "SKILL-ACTIVATE %d %d %d", skill_id, + sd->status.skill[skill_id].lv, skill_power (sd, + skill_id)); + return 0; + } + + return 1; // failed } -int -skill_pool_is_activated(struct map_session_data *sd, int skill_id) +int skill_pool_is_activated (struct map_session_data *sd, int skill_id) { - return sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED; + return sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED; } -int -skill_pool_deactivate(struct map_session_data *sd, int skill_id) +int skill_pool_deactivate (struct map_session_data *sd, int skill_id) { - if (sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED) { - sd->status.skill[skill_id].flags &= ~SKILL_POOL_ACTIVATED; - MAP_LOG_PC(sd, "SKILL-DEACTIVATE %d", skill_id); - pc_calcstatus(sd, 0); - return 0; - } - - return 1; + if (sd->status.skill[skill_id].flags & SKILL_POOL_ACTIVATED) + { + sd->status.skill[skill_id].flags &= ~SKILL_POOL_ACTIVATED; + MAP_LOG_PC (sd, "SKILL-DEACTIVATE %d", skill_id); + pc_calcstatus (sd, 0); + return 0; + } + + return 1; } - -int -skill_stat(int skill_id) +int skill_stat (int skill_id) { - return skill_db[skill_id].stat; + return skill_db[skill_id].stat; } -int -skill_power(struct map_session_data *sd, int skill_id) +int skill_power (struct map_session_data *sd, int skill_id) { - int stat = skill_stat(skill_id); - int stat_value, skill_value; - int result; + int stat = skill_stat (skill_id); + int stat_value, skill_value; + int result; - if (stat == 0 - || !skill_pool_is_activated(sd, skill_id)) - return 0; + if (stat == 0 || !skill_pool_is_activated (sd, skill_id)) + return 0; - stat_value = battle_get_stat(stat, &(sd->bl)); - skill_value = sd->status.skill[skill_id].lv; + stat_value = battle_get_stat (stat, &(sd->bl)); + skill_value = sd->status.skill[skill_id].lv; - if ((skill_value * 10) - 1 > stat_value) - skill_value += (stat_value / 10); - else - skill_value *= 2; + if ((skill_value * 10) - 1 > stat_value) + skill_value += (stat_value / 10); + else + skill_value *= 2; - result = (skill_value * stat_value) / 10; + result = (skill_value * stat_value) / 10; - return result; + return result; } - -int -skill_power_bl(struct block_list *bl, int skill) +int skill_power_bl (struct block_list *bl, int skill) { - if (bl->type == BL_PC) - return skill_power((struct map_session_data *) bl, skill); - else - return 0; + if (bl->type == BL_PC) + return skill_power ((struct map_session_data *) bl, skill); + else + return 0; } diff --git a/src/map/skill.c b/src/map/skill.c index 5f0092a..5745374 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -32,1279 +32,1606 @@ #define STATE_BLIND 0x10 /* スキル番号=>ステータス異常番号変換テーブル */ -int SkillStatusChangeTable[]={ /* skill.hのenumのSC_***とあわせること */ +int SkillStatusChangeTable[] = { /* skill.hのenumのSC_***とあわせること */ /* 0- */ - -1,-1,-1,-1,-1,-1, - SC_PROVOKE, /* プロボック */ - -1, 1,-1, + -1, -1, -1, -1, -1, -1, + SC_PROVOKE, /* プロボック */ + -1, 1, -1, /* 10- */ - SC_SIGHT, /* サイト */ - -1,-1,-1,-1, - SC_FREEZE, /* フロストダイバー */ - SC_STONE, /* ストーンカース */ - -1,-1,-1, + SC_SIGHT, /* サイト */ + -1, -1, -1, -1, + SC_FREEZE, /* フロストダイバー */ + SC_STONE, /* ストーンカース */ + -1, -1, -1, /* 20- */ - -1,-1,-1,-1, - SC_RUWACH, /* ルアフ */ - -1,-1,-1,-1, - SC_INCREASEAGI, /* 速度増加 */ + -1, -1, -1, -1, + SC_RUWACH, /* ルアフ */ + -1, -1, -1, -1, + SC_INCREASEAGI, /* 速度増加 */ /* 30- */ - SC_DECREASEAGI, /* 速度減少 */ - -1, - SC_SIGNUMCRUCIS, /* シグナムクルシス */ - SC_ANGELUS, /* エンジェラス */ - SC_BLESSING, /* ブレッシング */ - -1,-1,-1,-1,-1, + SC_DECREASEAGI, /* 速度減少 */ + -1, + SC_SIGNUMCRUCIS, /* シグナムクルシス */ + SC_ANGELUS, /* エンジェラス */ + SC_BLESSING, /* ブレッシング */ + -1, -1, -1, -1, -1, /* 40- */ - -1,-1,-1,-1,-1, - SC_CONCENTRATE, /* 集中力向上 */ - -1,-1,-1,-1, + -1, -1, -1, -1, -1, + SC_CONCENTRATE, /* 集中力向上 */ + -1, -1, -1, -1, /* 50- */ - -1, - SC_HIDING, /* ハイディング */ - -1,-1,-1,-1,-1,-1,-1,-1, + -1, + SC_HIDING, /* ハイディング */ + -1, -1, -1, -1, -1, -1, -1, -1, /* 60- */ - SC_TWOHANDQUICKEN, /* 2HQ */ - SC_AUTOCOUNTER, - -1,-1,-1,-1, - SC_IMPOSITIO, /* インポシティオマヌス */ - SC_SUFFRAGIUM, /* サフラギウム */ - SC_ASPERSIO, /* アスペルシオ */ - SC_BENEDICTIO, /* 聖体降福 */ + SC_TWOHANDQUICKEN, /* 2HQ */ + SC_AUTOCOUNTER, + -1, -1, -1, -1, + SC_IMPOSITIO, /* インポシティオマヌス */ + SC_SUFFRAGIUM, /* サフラギウム */ + SC_ASPERSIO, /* アスペルシオ */ + SC_BENEDICTIO, /* 聖体降福 */ /* 70- */ - -1, - SC_SLOWPOISON, - -1, - SC_KYRIE, /* キリエエレイソン */ - SC_MAGNIFICAT, /* マグニフィカート */ - SC_GLORIA, /* グロリア */ - SC_DIVINA, /* レックスディビーナ */ - -1, - SC_AETERNA, /* レックスエーテルナ */ - -1, + -1, + SC_SLOWPOISON, + -1, + SC_KYRIE, /* キリエエレイソン */ + SC_MAGNIFICAT, /* マグニフィカート */ + SC_GLORIA, /* グロリア */ + SC_DIVINA, /* レックスディビーナ */ + -1, + SC_AETERNA, /* レックスエーテルナ */ + -1, /* 80- */ - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 90- */ - -1,-1, - SC_QUAGMIRE, /* クァグマイア */ - -1,-1,-1,-1,-1,-1,-1, + -1, -1, + SC_QUAGMIRE, /* クァグマイア */ + -1, -1, -1, -1, -1, -1, -1, /* 100- */ - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 110- */ - -1, - SC_ADRENALINE, /* アドレナリンラッシュ */ - SC_WEAPONPERFECTION,/* ウェポンパーフェクション */ - SC_OVERTHRUST, /* オーバートラスト */ - SC_MAXIMIZEPOWER, /* マキシマイズパワー */ - -1,-1,-1,-1,-1, + -1, + SC_ADRENALINE, /* アドレナリンラッシュ */ + SC_WEAPONPERFECTION, /* ウェポンパーフェクション */ + SC_OVERTHRUST, /* オーバートラスト */ + SC_MAXIMIZEPOWER, /* マキシマイズパワー */ + -1, -1, -1, -1, -1, /* 120- */ - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 130- */ - -1,-1,-1,-1,-1, - SC_CLOAKING, /* クローキング */ - SC_STAN, /* ソニックブロー */ - -1, - SC_ENCPOISON, /* エンチャントポイズン */ - SC_POISONREACT, /* ポイズンリアクト */ + -1, -1, -1, -1, -1, + SC_CLOAKING, /* クローキング */ + SC_STAN, /* ソニックブロー */ + -1, + SC_ENCPOISON, /* エンチャントポイズン */ + SC_POISONREACT, /* ポイズンリアクト */ /* 140- */ - SC_POISON, /* ベノムダスト */ - SC_SPLASHER, /* ベナムスプラッシャー */ - -1, - SC_TRICKDEAD, /* 死んだふり */ - -1,-1,-1,-1,-1,-1, + SC_POISON, /* ベノムダスト */ + SC_SPLASHER, /* ベナムスプラッシャー */ + -1, + SC_TRICKDEAD, /* 死んだふり */ + -1, -1, -1, -1, -1, -1, /* 150- */ - -1,-1,-1,-1,-1, - SC_LOUD, /* ラウドボイス */ - -1, - SC_ENERGYCOAT, /* エナジーコート */ - -1,-1, + -1, -1, -1, -1, -1, + SC_LOUD, /* ラウドボイス */ + -1, + SC_ENERGYCOAT, /* エナジーコート */ + -1, -1, /* 160- */ - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1, - SC_SELFDESTRUCTION, - -1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, - -1, - SC_KEEPING, - -1,-1, - SC_BARRIER, - -1,-1, - SC_HALLUCINATION, - -1,-1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, + SC_SELFDESTRUCTION, + -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, + SC_KEEPING, + -1, -1, + SC_BARRIER, + -1, -1, + SC_HALLUCINATION, + -1, -1, /* 210- */ - -1,-1,-1,-1,-1, - SC_STRIPWEAPON, - SC_STRIPSHIELD, - SC_STRIPARMOR, - SC_STRIPHELM, - -1, + -1, -1, -1, -1, -1, + SC_STRIPWEAPON, + SC_STRIPSHIELD, + SC_STRIPARMOR, + SC_STRIPHELM, + -1, /* 220- */ - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 230- */ - -1,-1,-1,-1, - SC_CP_WEAPON, - SC_CP_SHIELD, - SC_CP_ARMOR, - SC_CP_HELM, - -1,-1, + -1, -1, -1, -1, + SC_CP_WEAPON, + SC_CP_SHIELD, + SC_CP_ARMOR, + SC_CP_HELM, + -1, -1, /* 240- */ - -1,-1,-1,-1,-1,-1,-1,-1,-1, - SC_AUTOGUARD, + -1, -1, -1, -1, -1, -1, -1, -1, -1, + SC_AUTOGUARD, /* 250- */ - -1,-1, - SC_REFLECTSHIELD, - -1,-1, - SC_DEVOTION, - SC_PROVIDENCE, - SC_DEFENDER, - SC_SPEARSQUICKEN, - -1, + -1, -1, + SC_REFLECTSHIELD, + -1, -1, + SC_DEVOTION, + SC_PROVIDENCE, + SC_DEFENDER, + SC_SPEARSQUICKEN, + -1, /* 260- */ - -1,-1,-1,-1,-1,-1,-1,-1, - SC_STEELBODY, - SC_BLADESTOP_WAIT, + -1, -1, -1, -1, -1, -1, -1, -1, + SC_STEELBODY, + SC_BLADESTOP_WAIT, /* 270- */ - SC_EXPLOSIONSPIRITS, - SC_EXTREMITYFIST, - -1,-1,-1,-1, - SC_MAGICROD, - -1,-1,-1, + SC_EXPLOSIONSPIRITS, + SC_EXTREMITYFIST, + -1, -1, -1, -1, + SC_MAGICROD, + -1, -1, -1, /* 280- */ - SC_FLAMELAUNCHER, - SC_FROSTWEAPON, - SC_LIGHTNINGLOADER, - SC_SEISMICWEAPON, - -1, - SC_VOLCANO, - SC_DELUGE, - SC_VIOLENTGALE, - SC_LANDPROTECTOR, - -1, + SC_FLAMELAUNCHER, + SC_FROSTWEAPON, + SC_LIGHTNINGLOADER, + SC_SEISMICWEAPON, + -1, + SC_VOLCANO, + SC_DELUGE, + SC_VIOLENTGALE, + SC_LANDPROTECTOR, + -1, /* 290- */ - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 300- */ - -1,-1,-1,-1,-1,-1, - SC_LULLABY, - SC_RICHMANKIM, - SC_ETERNALCHAOS, - SC_DRUMBATTLE, + -1, -1, -1, -1, -1, -1, + SC_LULLABY, + SC_RICHMANKIM, + SC_ETERNALCHAOS, + SC_DRUMBATTLE, /* 310- */ - SC_NIBELUNGEN, - SC_ROKISWEIL, - SC_INTOABYSS, - SC_SIEGFRIED, - -1,-1,-1, - SC_DISSONANCE, - -1, - SC_WHISTLE, + SC_NIBELUNGEN, + SC_ROKISWEIL, + SC_INTOABYSS, + SC_SIEGFRIED, + -1, -1, -1, + SC_DISSONANCE, + -1, + SC_WHISTLE, /* 320- */ - SC_ASSNCROS, - SC_POEMBRAGI, - SC_APPLEIDUN, - -1,-1, - SC_UGLYDANCE, - -1, - SC_HUMMING, - SC_DONTFORGETME, - SC_FORTUNE, + SC_ASSNCROS, + SC_POEMBRAGI, + SC_APPLEIDUN, + -1, -1, + SC_UGLYDANCE, + -1, + SC_HUMMING, + SC_DONTFORGETME, + SC_FORTUNE, /* 330- */ - SC_SERVICE4U, - SC_SELFDESTRUCTION, - -1,-1,-1,-1,-1,-1,-1,-1, + SC_SERVICE4U, + SC_SELFDESTRUCTION, + -1, -1, -1, -1, -1, -1, -1, -1, /* 340- */ - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 350- */ - -1,-1,-1,-1,-1, - SC_AURABLADE, - SC_PARRYING, - SC_CONCENTRATION, - SC_TENSIONRELAX, - SC_BERSERK, + -1, -1, -1, -1, -1, + SC_AURABLADE, + SC_PARRYING, + SC_CONCENTRATION, + SC_TENSIONRELAX, + SC_BERSERK, /* 360- */ - SC_BERSERK, - SC_ASSUMPTIO, - SC_BASILICA, - -1,-1,-1, - SC_MAGICPOWER, - -1,-1, - SC_GOSPEL, + SC_BERSERK, + SC_ASSUMPTIO, + SC_BASILICA, + -1, -1, -1, + SC_MAGICPOWER, + -1, -1, + SC_GOSPEL, /* 370- */ - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 380- */ - SC_TRUESIGHT, - -1,-1, - SC_WINDWALK, - SC_MELTDOWN, - -1,-1, - SC_CARTBOOST, - -1, - SC_CHASEWALK, + SC_TRUESIGHT, + -1, -1, + SC_WINDWALK, + SC_MELTDOWN, + -1, -1, + SC_CARTBOOST, + -1, + SC_CHASEWALK, /* 390- */ - SC_REJECTSWORD, - -1,-1,-1,-1,-1, - SC_MARIONETTE, - -1, - SC_HEADCRUSH, - SC_JOINTBEAT, + SC_REJECTSWORD, + -1, -1, -1, -1, -1, + SC_MARIONETTE, + -1, + SC_HEADCRUSH, + SC_JOINTBEAT, /* 400 */ - -1,-1, - SC_MINDBREAKER, - SC_MEMORIZE, - SC_FOGWALL, - SC_SPIDERWEB, - -1,-1,-1,-1, + -1, -1, + SC_MINDBREAKER, + SC_MEMORIZE, + SC_FOGWALL, + SC_SPIDERWEB, + -1, -1, -1, -1, /* 410- */ - -1,-1,-1,-1,-1,-1,-1,-1,-1,-1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }; struct skill_name_db skill_names[] = { - { AC_CHARGEARROW, "CHARGEARROW", "Charge_Arrow" } , - { AC_CONCENTRATION, "CONCENTRATION", "Improve_Concentration" } , - { AC_DOUBLE, "DOUBLE", "Double_Strafe" } , - { AC_MAKINGARROW, "MAKINGARROW", "Arrow_Creation" } , - { AC_OWL, "OWL", "Owl's_Eye" } , - { AC_SHOWER, "SHOWER", "Arrow_Shower" } , - { AC_VULTURE, "VULTURE", "Vulture's_Eye" } , - { ALL_RESURRECTION, "RESURRECTION", "Resurrection" } , - { AL_ANGELUS, "ANGELUS", "Angelus" } , - { AL_BLESSING, "BLESSING", "Blessing" } , - { AL_CRUCIS, "CRUCIS", "Signum_Crusis" } , - { AL_CURE, "CURE", "Cure" } , - { AL_DECAGI, "DECAGI", "Decrease_AGI" } , - { AL_DEMONBANE, "DEMONBANE", "Demon_Bane" } , - { AL_DP, "DP", "Divine_Protection" } , - { AL_HEAL, "HEAL", "Heal" } , - { AL_HOLYLIGHT, "HOLYLIGHT", "Holy_Light" } , - { AL_HOLYWATER, "HOLYWATER", "Aqua_Benedicta" } , - { AL_INCAGI, "INCAGI", "Increase_AGI" } , - { AL_PNEUMA, "PNEUMA", "Pneuma" } , - { AL_RUWACH, "RUWACH", "Ruwach" } , - { AL_TELEPORT, "TELEPORT", "Teleport" } , - { AL_WARP, "WARP", "Warp_Portal" } , - { AM_ACIDTERROR, "ACIDTERROR", "Acid_Terror" } , - { AM_AXEMASTERY, "AXEMASTERY", "Axe_Mastery" } , - { AM_BERSERKPITCHER, "BERSERKPITCHER", "Berserk Pitcher" } , - { AM_BIOETHICS, "BIOETHICS", "Bioethics" } , - { AM_BIOTECHNOLOGY, "BIOTECHNOLOGY", "Biotechnology" } , - { AM_CALLHOMUN, "CALLHOMUN", "Call_Homunculus" } , - { AM_CANNIBALIZE, "CANNIBALIZE", "Bio_Cannibalize" } , - { AM_CP_ARMOR, "ARMOR", "Chemical_Protection_Armor" } , - { AM_CP_HELM, "HELM", "Chemical_Protection_Helm" } , - { AM_CP_SHIELD, "SHIELD", "Chemical_Protection_Shield" } , - { AM_CP_WEAPON, "WEAPON", "Chemical_Protection_Weapon" } , - { AM_CREATECREATURE, "CREATECREATURE", "Life_Creation" } , - { AM_CULTIVATION, "CULTIVATION", "Cultivation" } , - { AM_DEMONSTRATION, "DEMONSTRATION", "Demonstration" } , - { AM_DRILLMASTER, "DRILLMASTER", "Drillmaster" } , - { AM_FLAMECONTROL, "FLAMECONTROL", "Flame_Control" } , - { AM_HEALHOMUN, "HEALHOMUN", "Heal_Homunculus" } , - { AM_LEARNINGPOTION, "LEARNINGPOTION", "AM_LEARNINGPOTION" } , - { AM_PHARMACY, "PHARMACY", "Pharmacy" } , - { AM_POTIONPITCHER, "POTIONPITCHER", "Potion_Pitcher" } , - { AM_REST, "REST", "Sabbath" } , - { AM_RESURRECTHOMUN, "RESURRECTHOMUN", "Ressurect_Homunculus" } , - { AM_SPHEREMINE, "SPHEREMINE", "Sphere_Mine" } , - { ASC_BREAKER, "BREAKER", "Breaker" } , - { ASC_CDP, "CDP", "Create_Deadly_Poison" } , - { ASC_EDP, "EDP", "Deadly_Poison_Enchantment" } , - { ASC_HALLUCINATION, "HALLUCINATION", "Hallucination_Walk" } , - { ASC_KATAR, "KATAR", "Advanced_Katar_Mastery" } , - { ASC_METEORASSAULT, "METEORASSAULT", "Meteor_Assault" } , - { AS_CLOAKING, "CLOAKING", "Cloaking" } , - { AS_ENCHANTPOISON, "ENCHANTPOISON", "Enchant_Poison" } , - { AS_GRIMTOOTH, "GRIMTOOTH", "Grimtooth" } , - { AS_KATAR, "KATAR", "Katar_Mastery" } , - { AS_LEFT, "LEFT", "Lefthand_Mastery" } , - { AS_POISONREACT, "POISONREACT", "Poison_React" } , - { AS_RIGHT, "RIGHT", "Righthand_Mastery" } , - { AS_SONICBLOW, "SONICBLOW", "Sonic_Blow" } , - { AS_SPLASHER, "SPLASHER", "Venom_Splasher" } , - { AS_VENOMDUST, "VENOMDUST", "Venom_Dust" } , - { BA_APPLEIDUN, "APPLEIDUN", "Apple_of_Idun" } , - { BA_ASSASSINCROSS, "ASSASSINCROSS", "Assassin_Cross" } , - { BA_DISSONANCE, "DISSONANCE", "Dissonance" } , - { BA_FROSTJOKE, "FROSTJOKE", "Dumb_Joke" } , - { BA_MUSICALLESSON, "MUSICALLESSON", "Musical_Lesson" } , - { BA_MUSICALSTRIKE, "MUSICALSTRIKE", "Musical_Strike" } , - { BA_POEMBRAGI, "POEMBRAGI", "Poem_of_Bragi" } , - { BA_WHISTLE, "WHISTLE", "Whistle" } , - { BD_ADAPTATION, "ADAPTATION", "Adaption" } , - { BD_DRUMBATTLEFIELD, "DRUMBATTLEFIELD", "Drumb_BattleField" } , - { BD_ENCORE, "ENCORE", "Encore" } , - { BD_ETERNALCHAOS, "ETERNALCHAOS", "Eternal_Chaos" } , - { BD_INTOABYSS, "INTOABYSS", "Into_the_Abyss" } , - { BD_LULLABY, "LULLABY", "Lullaby" } , - { BD_RAGNAROK, "RAGNAROK", "Ragnarok" } , - { BD_RICHMANKIM, "RICHMANKIM", "Rich_Mankim" } , - { BD_RINGNIBELUNGEN, "RINGNIBELUNGEN", "Ring_of_Nibelugen" } , - { BD_ROKISWEIL, "ROKISWEIL", "Loki's_Wail" } , - { BD_SIEGFRIED, "SIEGFRIED", "Invulnerable_Siegfried" } , - { BS_ADRENALINE, "ADRENALINE", "Adrenaline_Rush" } , - { BS_ADRENALINE2, "ADRENALINE2", "Adrenaline Rush 2" } , - { BS_AXE, "AXE", "Smith_Axe" } , - { BS_DAGGER, "DAGGER", "Smith_Dagger" } , - { BS_ENCHANTEDSTONE, "ENCHANTEDSTONE", "Enchantedstone_Craft" } , - { BS_FINDINGORE, "FINDINGORE", "Ore_Discovery" } , - { BS_HAMMERFALL, "HAMMERFALL", "Hammer_Fall" } , - { BS_HILTBINDING, "HILTBINDING", "Hilt_Binding" } , - { BS_IRON, "IRON", "Iron_Tempering" } , - { BS_KNUCKLE, "KNUCKLE", "Smith_Knucklebrace" } , - { BS_MACE, "MACE", "Smith_Mace" } , - { BS_MAXIMIZE, "MAXIMIZE", "Power_Maximize" } , - { BS_ORIDEOCON, "ORIDEOCON", "Orideocon_Research" } , - { BS_OVERTHRUST, "OVERTHRUST", "Power-Thrust" } , - { BS_REPAIRWEAPON, "REPAIRWEAPON", "Weapon_Repair" } , - { BS_SKINTEMPER, "SKINTEMPER", "Skin_Tempering" } , - { BS_SPEAR, "SPEAR", "Smith_Spear" } , - { BS_STEEL, "STEEL", "Steel_Tempering" } , - { BS_SWORD, "SWORD", "Smith_Sword" } , - { BS_TWOHANDSWORD, "TWOHANDSWORD", "Smith_Two-handed_Sword" } , - { BS_WEAPONPERFECT, "WEAPONPERFECT", "Weapon_Perfection" } , - { BS_WEAPONRESEARCH, "WEAPONRESEARCH", "Weaponry_Research" } , - { CG_ARROWVULCAN, "ARROWVULCAN", "Vulcan_Arrow" } , - { CG_MARIONETTE, "MARIONETTE", "Marionette_Control" } , - { CG_MOONLIT, "MOONLIT", "Moonlight_Petals" } , - { CH_CHAINCRUSH, "CHAINCRUSH", "Chain_Crush_Combo" } , - { CH_PALMSTRIKE, "PALMSTRIKE", "Palm_Push_Strike" } , - { CH_SOULCOLLECT, "SOULCOLLECT", "Collect_Soul" } , - { CH_TIGERFIST, "TIGERFIST", "Tiger_Knuckle_Fist" } , - { CR_ALCHEMY, "ALCHEMY", "Alchemy" } , - { CR_AUTOGUARD, "AUTOGUARD", "Guard" } , - { CR_DEFENDER, "DEFENDER", "Defender" } , - { CR_DEVOTION, "DEVOTION", "Sacrifice" } , - { CR_GRANDCROSS, "GRANDCROSS", "Grand_Cross" } , - { CR_HOLYCROSS, "HOLYCROSS", "Holy_Cross" } , - { CR_PROVIDENCE, "PROVIDENCE", "Providence" } , - { CR_REFLECTSHIELD, "REFLECTSHIELD", "Shield_Reflect" } , - { CR_SHIELDBOOMERANG, "SHIELDBOOMERANG", "Shield_Boomerang" } , - { CR_SHIELDCHARGE, "SHIELDCHARGE", "Shield_Charge" } , - { CR_SPEARQUICKEN, "SPEARQUICKEN", "Spear_Quicken" } , - { CR_SYNTHESISPOTION, "SYNTHESISPOTION", "Potion_Synthesis" } , - { CR_TRUST, "TRUST", "Faith" } , - { DC_DANCINGLESSON, "DANCINGLESSON", "Dancing_Lesson" } , - { DC_DONTFORGETME, "DONTFORGETME", "Don't_Forget_Me" } , - { DC_FORTUNEKISS, "FORTUNEKISS", "Fortune_Kiss" } , - { DC_HUMMING, "HUMMING", "Humming" } , - { DC_SCREAM, "SCREAM", "Scream" } , - { DC_SERVICEFORYOU, "SERVICEFORYOU", "Prostitute" } , - { DC_THROWARROW, "THROWARROW", "Throw_Arrow" } , - { DC_UGLYDANCE, "UGLYDANCE", "Ugly_Dance" } , - { HP_ASSUMPTIO, "ASSUMPTIO", "Assumptio" } , - { HP_BASILICA, "BASILICA", "Basilica" } , - { HP_MEDITATIO, "MEDITATIO", "Meditation" } , - { HT_ANKLESNARE, "ANKLESNARE", "Ankle_Snare" } , - { HT_BEASTBANE, "BEASTBANE", "Beast_Bane" } , - { HT_BLASTMINE, "BLASTMINE", "Blast_Mine" } , - { HT_BLITZBEAT, "BLITZBEAT", "Blitz_Beat" } , - { HT_CLAYMORETRAP, "CLAYMORETRAP", "Claymore_Trap" } , - { HT_DETECTING, "DETECTING", "Detect" } , - { HT_FALCON, "FALCON", "Falconry_Mastery" } , - { HT_FLASHER, "FLASHER", "Flasher" } , - { HT_FREEZINGTRAP, "FREEZINGTRAP", "Freezing_Trap" } , - { HT_LANDMINE, "LANDMINE", "Land_Mine" } , - { HT_REMOVETRAP, "REMOVETRAP", "Remove_Trap" } , - { HT_SANDMAN, "SANDMAN", "Sandman" } , - { HT_SHOCKWAVE, "SHOCKWAVE", "Shockwave_Trap" } , - { HT_SKIDTRAP, "SKIDTRAP", "Skid_Trap" } , - { HT_SPRINGTRAP, "SPRINGTRAP", "Spring_Trap" } , - { HT_STEELCROW, "STEELCROW", "Steel_Crow" } , - { HT_TALKIEBOX, "TALKIEBOX", "Talkie_Box" } , - { HW_MAGICCRASHER, "MAGICCRASHER", "Magic_Crasher" } , - { HW_MAGICPOWER, "MAGICPOWER", "Magic_Power" } , - { HW_NAPALMVULCAN, "NAPALMVULCAN", "Napalm_Vulcan" } , - { HW_SOULDRAIN, "SOULDRAIN", "Soul_Drain" } , - { KN_AUTOCOUNTER, "AUTOCOUNTER", "Counter_Attack" } , - { KN_BOWLINGBASH, "BOWLINGBASH", "Bowling_Bash" } , - { KN_BRANDISHSPEAR, "BRANDISHSPEAR", "Brandish_Spear" } , - { KN_CAVALIERMASTERY, "CAVALIERMASTERY", "Cavalier_Mastery" } , - { KN_PIERCE, "PIERCE", "Pierce" } , - { KN_RIDING, "RIDING", "Peco_Peco_Ride" } , - { KN_SPEARBOOMERANG, "SPEARBOOMERANG", "Spear_Boomerang" } , - { KN_SPEARMASTERY, "SPEARMASTERY", "Spear_Mastery" } , - { KN_SPEARSTAB, "SPEARSTAB", "Spear_Stab" } , - { KN_TWOHANDQUICKEN, "TWOHANDQUICKEN", "Twohand_Quicken" } , - { LK_AURABLADE, "AURABLADE", "Aura_Blade" } , - { LK_BERSERK, "BERSERK", "Berserk" } , - { LK_CONCENTRATION, "CONCENTRATION", "Concentration" } , - { LK_FURY, "FURY", "LK_FURY" } , - { LK_HEADCRUSH, "HEADCRUSH", "Head_Crusher" } , - { LK_JOINTBEAT, "JOINTBEAT", "Joint_Beat" } , - { LK_PARRYING, "PARRYING", "Parrying" } , - { LK_SPIRALPIERCE, "SPIRALPIERCE", "Spiral_Pierce" } , - { LK_TENSIONRELAX, "TENSIONRELAX", "Tension_Relax" } , - { MC_CARTREVOLUTION, "CARTREVOLUTION", "Cart_Revolution" } , - { MC_CHANGECART, "CHANGECART", "Change_Cart" } , - { MC_DISCOUNT, "DISCOUNT", "Discount" } , - { MC_IDENTIFY, "IDENTIFY", "Item_Appraisal" } , - { MC_INCCARRY, "INCCARRY", "Enlarge_Weight_Limit" } , - { MC_LOUD, "LOUD", "Lord_Exclamation" } , - { MC_MAMMONITE, "MAMMONITE", "Mammonite" } , - { MC_OVERCHARGE, "OVERCHARGE", "Overcharge" } , - { MC_PUSHCART, "PUSHCART", "Pushcart" } , - { MG_COLDBOLT, "COLDBOLT", "Cold_Bolt" } , - { MG_ENERGYCOAT, "ENERGYCOAT", "Energy_Coat" } , - { MG_FIREBALL, "FIREBALL", "Fire_Ball" } , - { MG_FIREBOLT, "FIREBOLT", "Fire_Bolt" } , - { MG_FIREWALL, "FIREWALL", "Fire_Wall" } , - { MG_FROSTDIVER, "FROSTDIVER", "Frost_Diver" } , - { MG_LIGHTNINGBOLT, "LIGHTNINGBOLT", "Lightening_Bolt" } , - { MG_NAPALMBEAT, "NAPALMBEAT", "Napalm_Beat" } , - { MG_SAFETYWALL, "SAFETYWALL", "Safety_Wall" } , - { MG_SIGHT, "SIGHT", "Sight" } , - { MG_SOULSTRIKE, "SOULSTRIKE", "Soul_Strike" } , - { MG_SRECOVERY, "SRECOVERY", "Increase_SP_Recovery" } , - { MG_STONECURSE, "STONECURSE", "Stone_Curse" } , - { MG_THUNDERSTORM, "THUNDERSTORM", "Thunderstorm" } , - { MO_ABSORBSPIRITS, "ABSORBSPIRITS", "Absorb_Spirits" } , - { MO_BLADESTOP, "BLADESTOP", "Blade_Stop" } , - { MO_BODYRELOCATION, "BODYRELOCATION", "Body_Relocation" } , - { MO_CALLSPIRITS, "CALLSPIRITS", "Call_Spirits" } , - { MO_CHAINCOMBO, "CHAINCOMBO", "Chain_Combo" } , - { MO_COMBOFINISH, "COMBOFINISH", "Combo_Finish" } , - { MO_DODGE, "DODGE", "Dodge" } , - { MO_EXPLOSIONSPIRITS, "EXPLOSIONSPIRITS", "Explosion_Spirits" } , - { MO_EXTREMITYFIST, "EXTREMITYFIST", "Extremity_Fist" } , - { MO_FINGEROFFENSIVE, "FINGEROFFENSIVE", "Finger_Offensive" } , - { MO_INVESTIGATE, "INVESTIGATE", "Investigate" } , - { MO_IRONHAND, "IRONHAND", "Iron_Hand" } , - { MO_SPIRITSRECOVERY, "SPIRITSRECOVERY", "Spirit_Recovery" } , - { MO_STEELBODY, "STEELBODY", "Steel_Body" } , - { MO_TRIPLEATTACK, "TRIPLEATTACK", "Triple_Blows" } , - { NPC_ATTRICHANGE, "ATTRICHANGE", "NPC_ATTRICHANGE" } , - { NPC_BARRIER, "BARRIER", "NPC_BARRIER" } , - { NPC_BLINDATTACK, "BLINDATTACK", "NPC_BLINDATTACK" } , - { NPC_BLOODDRAIN, "BLOODDRAIN", "NPC_BLOODDRAIN" } , - { NPC_CHANGEDARKNESS, "CHANGEDARKNESS", "NPC_CHANGEDARKNESS" } , - { NPC_CHANGEFIRE, "CHANGEFIRE", "NPC_CHANGEFIRE" } , - { NPC_CHANGEGROUND, "CHANGEGROUND", "NPC_CHANGEGROUND" } , - { NPC_CHANGEHOLY, "CHANGEHOLY", "NPC_CHANGEHOLY" } , - { NPC_CHANGEPOISON, "CHANGEPOISON", "NPC_CHANGEPOISON" } , - { NPC_CHANGETELEKINESIS, "CHANGETELEKINESIS", "NPC_CHANGETELEKINESIS" } , - { NPC_CHANGEWATER, "CHANGEWATER", "NPC_CHANGEWATER" } , - { NPC_CHANGEWIND, "CHANGEWIND", "NPC_CHANGEWIND" } , - { NPC_COMBOATTACK, "COMBOATTACK", "NPC_COMBOATTACK" } , - { NPC_CRITICALSLASH, "CRITICALSLASH", "NPC_CRITICALSLASH" } , - { NPC_CURSEATTACK, "CURSEATTACK", "NPC_CURSEATTACK" } , - { NPC_DARKBLESSING, "DARKBLESSING", "NPC_DARKBLESSING" } , - { NPC_DARKBREATH, "DARKBREATH", "NPC_DARKBREATH" } , - { NPC_DARKCROSS, "DARKCROSS", "NPC_DARKCROSS" } , - { NPC_DARKNESSATTACK, "DARKNESSATTACK", "NPC_DARKNESSATTACK" } , - { NPC_DEFENDER, "DEFENDER", "NPC_DEFENDER" } , - { NPC_EMOTION, "EMOTION", "NPC_EMOTION" } , - { NPC_ENERGYDRAIN, "ENERGYDRAIN", "NPC_ENERGYDRAIN" } , - { NPC_FIREATTACK, "FIREATTACK", "NPC_FIREATTACK" } , - { NPC_GROUNDATTACK, "GROUNDATTACK", "NPC_GROUNDATTACK" } , - { NPC_GUIDEDATTACK, "GUIDEDATTACK", "NPC_GUIDEDATTACK" } , - { NPC_HALLUCINATION, "HALLUCINATION", "NPC_HALLUCINATION" } , - { NPC_HOLYATTACK, "HOLYATTACK", "NPC_HOLYATTACK" } , - { NPC_KEEPING, "KEEPING", "NPC_KEEPING" } , - { NPC_LICK, "LICK", "NPC_LICK" } , - { NPC_MAGICALATTACK, "MAGICALATTACK", "NPC_MAGICALATTACK" } , - { NPC_MENTALBREAKER, "MENTALBREAKER", "NPC_MENTALBREAKER" } , - { NPC_METAMORPHOSIS, "METAMORPHOSIS", "NPC_METAMORPHOSIS" } , - { NPC_PETRIFYATTACK, "PETRIFYATTACK", "NPC_PETRIFYATTACK" } , - { NPC_PIERCINGATT, "PIERCINGATT", "NPC_PIERCINGATT" } , - { NPC_POISON, "POISON", "NPC_POISON" } , - { NPC_POISONATTACK, "POISONATTACK", "NPC_POISONATTACK" } , - { NPC_RANDOMATTACK, "RANDOMATTACK", "NPC_RANDOMATTACK" } , - { NPC_RANGEATTACK, "RANGEATTACK", "NPC_RANGEATTACK" } , - { NPC_REBIRTH, "REBIRTH", "NPC_REBIRTH" } , - { NPC_SELFDESTRUCTION, "SELFDESTRUCTION", "Kabooooom!" } , - { NPC_SELFDESTRUCTION2, "SELFDESTRUCTION2", "NPC_SELFDESTRUCTION2" } , - { NPC_SILENCEATTACK, "SILENCEATTACK", "NPC_SILENCEATTACK" } , - { NPC_SLEEPATTACK, "SLEEPATTACK", "NPC_SLEEPATTACK" } , - { NPC_SMOKING, "SMOKING", "NPC_SMOKING" } , - { NPC_SPLASHATTACK, "SPLASHATTACK", "NPC_SPLASHATTACK" } , - { NPC_STUNATTACK, "STUNATTACK", "NPC_STUNATTACK" } , - { NPC_SUICIDE, "SUICIDE", "NPC_SUICIDE" } , - { NPC_SUMMONMONSTER, "SUMMONMONSTER", "NPC_SUMMONMONSTER" } , - { NPC_SUMMONSLAVE, "SUMMONSLAVE", "NPC_SUMMONSLAVE" } , - { NPC_TELEKINESISATTACK, "TELEKINESISATTACK", "NPC_TELEKINESISATTACK" } , - { NPC_TRANSFORMATION, "TRANSFORMATION", "NPC_TRANSFORMATION" } , - { NPC_WATERATTACK, "WATERATTACK", "NPC_WATERATTACK" } , - { NPC_WINDATTACK, "WINDATTACK", "NPC_WINDATTACK" } , - { NV_EMOTE, "EMOTE", "Emote_Skill" } , - { NV_TRADE, "TRADE", "Trade_Skill" } , - { NV_PARTY, "PARTY", "Party_Skill" } , - { NV_FIRSTAID, "FIRSTAID", "First Aid" } , - { NV_TRICKDEAD, "TRICKDEAD", "Play_Dead" } , - { PA_GOSPEL, "GOSPEL", "Gospel" } , - { PA_PRESSURE, "PRESSURE", "Pressure" } , - { PA_SACRIFICE, "SACRIFICE", "Sacrificial_Ritual" } , - { PF_FOGWALL, "FOGWALL", "Wall_of_Fog" } , - { PF_HPCONVERSION, "HPCONVERSION", "Health_Conversion" } , - { PF_MEMORIZE, "MEMORIZE", "Memorize" } , - { PF_MINDBREAKER, "MINDBREAKER", "Mind_Breaker" } , - { PF_SOULBURN, "SOULBURN", "Soul_Burn" } , - { PF_SOULCHANGE, "SOULCHANGE", "Soul_Change" } , - { PF_SPIDERWEB, "SPIDERWEB", "Spider_Web" } , - { PR_ASPERSIO, "ASPERSIO", "Aspersio" } , - { PR_BENEDICTIO, "BENEDICTIO", "B.S_Sacramenti" } , - { PR_GLORIA, "GLORIA", "Gloria" } , - { PR_IMPOSITIO, "IMPOSITIO", "Impositio_Manus" } , - { PR_KYRIE, "KYRIE", "Kyrie_Eleison" } , - { PR_LEXAETERNA, "LEXAETERNA", "Lex_Aeterna" } , - { PR_LEXDIVINA, "LEXDIVINA", "Lex_Divina" } , - { PR_MACEMASTERY, "MACEMASTERY", "Mace_Mastery" } , - { PR_MAGNIFICAT, "MAGNIFICAT", "Magnificat" } , - { PR_MAGNUS, "MAGNUS", "Magnus_Exorcismus" } , - { PR_SANCTUARY, "SANCTUARY", "Santuary" } , - { PR_SLOWPOISON, "SLOWPOISON", "Slow_Poison" } , - { PR_STRECOVERY, "STRECOVERY", "Status_Recovery" } , - { PR_SUFFRAGIUM, "SUFFRAGIUM", "Suffragium" } , - { PR_TURNUNDEAD, "TURNUNDEAD", "Turn_Undead" } , - { RG_BACKSTAP, "BACKSTAP", "Back_Stab" } , - { RG_CLEANER, "CLEANER", "Remover" } , - { RG_COMPULSION, "COMPULSION", "Compulsion_Discount" } , - { RG_FLAGGRAFFITI, "FLAGGRAFFITI", "Flag_Graffity" } , - { RG_GANGSTER, "GANGSTER", "Gangster's_Paradise" } , - { RG_GRAFFITI, "GRAFFITI", "Graffiti" } , - { RG_INTIMIDATE, "INTIMIDATE", "Intimidate" } , - { RG_PLAGIARISM, "PLAGIARISM", "Plagiarism" } , - { RG_RAID, "RAID", "Raid" } , - { RG_SNATCHER, "SNATCHER", "Snatcher" } , - { RG_STEALCOIN, "STEALCOIN", "Steal_Coin" } , - { RG_STRIPARMOR, "STRIPARMOR", "Strip_Armor" } , - { RG_STRIPHELM, "STRIPHELM", "Strip_Helm" } , - { RG_STRIPSHIELD, "STRIPSHIELD", "Strip_Shield" } , - { RG_STRIPWEAPON, "STRIPWEAPON", "Strip_Weapon" } , - { RG_TUNNELDRIVE, "TUNNELDRIVE", "Tunnel_Drive" } , - { SA_ABRACADABRA, "ABRACADABRA", "Hocus-pocus" } , - { SA_ADVANCEDBOOK, "ADVANCEDBOOK", "Advanced_Book" } , - { SA_AUTOSPELL, "AUTOSPELL", "Auto_Cast" } , - { SA_CASTCANCEL, "CASTCANCEL", "Cast_Cancel" } , - { SA_CLASSCHANGE, "CLASSCHANGE", "Class_Change" } , - { SA_COMA, "COMA", "Coma" } , - { SA_DEATH, "DEATH", "Death" } , - { SA_DELUGE, "DELUGE", "Deluge" } , - { SA_DISPELL, "DISPELL", "Dispel" } , - { SA_DRAGONOLOGY, "DRAGONOLOGY", "Dragonology" } , - { SA_FLAMELAUNCHER, "FLAMELAUNCHER", "Flame_Launcher" } , - { SA_FORTUNE, "FORTUNE", "Fortune" } , - { SA_FREECAST, "FREECAST", "Cast_Freedom" } , - { SA_FROSTWEAPON, "FROSTWEAPON", "Frost_Weapon" } , - { SA_FULLRECOVERY, "FULLRECOVERY", "Full_Recovery" } , - { SA_GRAVITY, "GRAVITY", "Gravity" } , - { SA_INSTANTDEATH, "INSTANTDEATH", "Instant_Death" } , - { SA_LANDPROTECTOR, "LANDPROTECTOR", "Land_Protector" } , - { SA_LEVELUP, "LEVELUP", "Level_Up" } , - { SA_LIGHTNINGLOADER, "LIGHTNINGLOADER", "Lightning_Loader" } , - { SA_MAGICROD, "MAGICROD", "Magic_Rod" } , - { SA_MONOCELL, "MONOCELL", "Monocell" } , - { SA_QUESTION, "QUESTION", "Question?" } , - { SA_REVERSEORCISH, "REVERSEORCISH", "Reverse_Orcish" } , - { SA_SEISMICWEAPON, "SEISMICWEAPON", "Seismic_Weapon" } , - { SA_SPELLBREAKER, "SPELLBREAKER", "Break_Spell" } , - { SA_SUMMONMONSTER, "SUMMONMONSTER", "Summon_Monster" } , - { SA_VIOLENTGALE, "VIOLENTGALE", "Violent_Gale" } , - { SA_VOLCANO, "VOLCANO", "Volcano" } , - { SG_DEVIL, "DEVIL", "Devil" } , - { SG_FEEL, "FEEL", "Feel" } , - { SG_FRIEND, "FRIEND", "Friend" } , - { SG_FUSION, "FUSION", "Fusion" } , - { SG_HATE, "HATE", "Hate" } , - { SG_KNOWLEDGE, "KNOWLEDGE", "Knowledge" } , - { SG_MOON_ANGER, "ANGER", "Moon Anger" } , - { SG_MOON_BLESS, "BLESS", "Moon Bless" } , - { SG_MOON_COMFORT, "COMFORT", "Moon Comfort" } , - { SG_MOON_WARM, "WARM", "Moon Warm" } , - { SG_STAR_ANGER, "ANGER", "Star Anger" } , - { SG_STAR_BLESS, "BLESS", "Star Bless" } , - { SG_STAR_COMFORT, "COMFORT", "Star Comfort" } , - { SG_STAR_WARM, "WARM", "Star Warm" } , - { SG_SUN_ANGER, "ANGER", "Sun Anger" } , - { SG_SUN_BLESS, "BLESS", "Sun Bless" } , - { SG_SUN_COMFORT, "COMFORT", "Sun Comfort" } , - { SG_SUN_WARM, "WARM", "Sun Warm" } , - { SL_ALCHEMIST, "ALCHEMIST", "Alchemist" } , - { SL_ASSASIN, "ASSASIN", "Assasin" } , - { SL_BARDDANCER, "BARDDANCER", "Bard Dancer" } , - { SL_BLACKSMITH, "BLACKSMITH", "Black Smith" } , - { SL_CRUSADER, "CRUSADER", "Crusader" } , - { SL_HUNTER, "HUNTER", "Hunter" } , - { SL_KAAHI, "KAAHI", "Kaahi" } , - { SL_KAINA, "KAINA", "Kaina" } , - { SL_KAITE, "KAITE", "Kaite" } , - { SL_KAIZEL, "KAIZEL", "Kaizel" } , - { SL_KAUPE, "KAUPE", "Kaupe" } , - { SL_KNIGHT, "KNIGHT", "Knight" } , - { SL_MONK, "MONK", "Monk" } , - { SL_PRIEST, "PRIEST", "Priest" } , - { SL_ROGUE, "ROGUE", "Rogue" } , - { SL_SAGE, "SAGE", "Sage" } , - { SL_SKA, "SKA", "SKA" } , - { SL_SKE, "SKE", "SKE" } , - { SL_SMA, "SMA", "SMA" } , - { SL_SOULLINKER, "SOULLINKER", "Soul Linker" } , - { SL_STAR, "STAR", "Star" } , - { SL_STIN, "STIN", "Stin" } , - { SL_STUN, "STUN", "Stun" } , - { SL_SUPERNOVICE, "SUPERNOVICE", "Super Novice" } , - { SL_SWOO, "SWOO", "Swoo" } , - { SL_WIZARD, "WIZARD", "Wizard" } , - { SM_AUTOBERSERK, "AUTOBERSERK", "Auto_Berserk" } , - { SM_BASH, "BASH", "Bash" } , - { SM_ENDURE, "ENDURE", "Endure" } , - { SM_FATALBLOW, "FATALBLOW", "Attack_Weak_Point" } , - { SM_MAGNUM, "MAGNUM", "Magnum_Break" } , - { SM_MOVINGRECOVERY, "MOVINGRECOVERY", "Moving_HP_Recovery" } , - { SM_PROVOKE, "PROVOKE", "Provoke" } , - { SM_RECOVERY, "RECOVERY", "Increase_HP_Recovery" } , - { SM_SWORD, "SWORD", "Sword_Mastery" } , - { SM_TWOHAND, "TWOHAND", "Two-Handed_Sword_Mastery" } , - { SN_FALCONASSAULT, "FALCONASSAULT", "Falcon_Assault" } , - { SN_SHARPSHOOTING, "SHARPSHOOTING", "Sharpshooting" } , - { SN_SIGHT, "SIGHT", "True_Sight" } , - { SN_WINDWALK, "WINDWALK", "Wind_Walk" } , - { ST_CHASEWALK, "CHASEWALK", "Chase_Walk" } , - { ST_REJECTSWORD, "REJECTSWORD", "Reject_Sword" } , - { ST_STEALBACKPACK, "STEALBACKPACK", "Steal_Backpack" } , - { TF_BACKSLIDING, "BACKSLIDING", "Back_Sliding" } , - { TF_DETOXIFY, "DETOXIFY", "Detoxify" } , - { TF_DOUBLE, "DOUBLE", "Double_Attack" } , - { TF_HIDING, "HIDING", "Hiding" } , - { TF_MISS, "MISS", "Improve_Dodge" } , - { TF_PICKSTONE, "PICKSTONE", "Take_Stone" } , - { TF_POISON, "POISON", "Envenom" } , - { TF_SPRINKLESAND, "SPRINKLESAND", "Throw_Sand" } , - { TF_STEAL, "STEAL", "Steal" } , - { TF_THROWSTONE, "THROWSTONE", "Throw_Stone" } , - { TK_COUNTER, "COUNTER", "Counter" } , - { TK_DODGE, "DODGE", "Dodge" } , - { TK_DOWNKICK, "DOWNKICK", "Down Kick" } , - { TK_HIGHJUMP, "HIGHJUMP", "High Jump" } , - { TK_HPTIME, "HPTIME", "HP Time" } , - { TK_JUMPKICK, "JUMPKICK", "Jump Kick" } , - { TK_POWER, "POWER", "Power" } , - { TK_READYCOUNTER, "READYCOUNTER", "Ready Counter" } , - { TK_READYDOWN, "READYDOWN", "Ready Down" } , - { TK_READYSTORM, "READYSTORM", "Ready Storm" } , - { TK_READYTURN, "READYTURN", "Ready Turn" } , - { TK_RUN, "RUN", "TK_RUN" } , - { TK_SEVENWIND, "SEVENWIND", "Seven Wind" } , - { TK_SPTIME, "SPTIME", "SP Time" } , - { TK_STORMKICK, "STORMKICK", "Storm Kick" } , - { TK_TURNKICK, "TURNKICK", "Turn Kick" } , - { WE_BABY, "BABY", "Adopt_Baby" } , - { WE_CALLBABY, "CALLBABY", "Call_Baby" } , - { WE_CALLPARENT, "CALLPARENT", "Call_Parent" } , - { WE_CALLPARTNER, "CALLPARTNER", "I Want to See You" } , - { WE_FEMALE, "FEMALE", "I Only Look Up to You" } , - { WE_MALE, "MALE", "I Will Protect You" } , - { WS_CARTBOOST, "CARTBOOST", "Cart_Boost" } , - { WS_CREATECOIN, "CREATECOIN", "Create_Coins" } , - { WS_CREATENUGGET, "CREATENUGGET", "Create_Nuggets" } , - { WS_MELTDOWN, "MELTDOWN", "Meltdown" } , - { WS_SYSTEMCREATE, "SYSTEMCREATE", "Create_System_tower" } , - { WZ_EARTHSPIKE, "EARTHSPIKE", "Earth_Spike" } , - { WZ_ESTIMATION, "ESTIMATION", "Sense" } , - { WZ_FIREIVY, "FIREIVY", "Fire_Ivy" } , - { WZ_FIREPILLAR, "FIREPILLAR", "Fire_Pillar" } , - { WZ_FROSTNOVA, "FROSTNOVA", "Frost_Nova" } , - { WZ_HEAVENDRIVE, "HEAVENDRIVE", "Heaven's_Drive" } , - { WZ_ICEWALL, "ICEWALL", "Ice_Wall" } , - { WZ_JUPITEL, "JUPITEL", "Jupitel_Thunder" } , - { WZ_METEOR, "METEOR", "Meteor_Storm" } , - { WZ_QUAGMIRE, "QUAGMIRE", "Quagmire" } , - { WZ_SIGHTRASHER, "SIGHTRASHER", "Sightrasher" } , - { WZ_STORMGUST, "STORMGUST", "Storm_Gust" } , - { WZ_VERMILION, "VERMILION", "Lord_of_Vermilion" } , - { WZ_WATERBALL, "WATERBALL", "Water_Ball" } , - { 0, 0, 0 } + {AC_CHARGEARROW, "CHARGEARROW", "Charge_Arrow"}, + {AC_CONCENTRATION, "CONCENTRATION", "Improve_Concentration"}, + {AC_DOUBLE, "DOUBLE", "Double_Strafe"}, + {AC_MAKINGARROW, "MAKINGARROW", "Arrow_Creation"}, + {AC_OWL, "OWL", "Owl's_Eye"}, + {AC_SHOWER, "SHOWER", "Arrow_Shower"}, + {AC_VULTURE, "VULTURE", "Vulture's_Eye"}, + {ALL_RESURRECTION, "RESURRECTION", "Resurrection"}, + {AL_ANGELUS, "ANGELUS", "Angelus"}, + {AL_BLESSING, "BLESSING", "Blessing"}, + {AL_CRUCIS, "CRUCIS", "Signum_Crusis"}, + {AL_CURE, "CURE", "Cure"}, + {AL_DECAGI, "DECAGI", "Decrease_AGI"}, + {AL_DEMONBANE, "DEMONBANE", "Demon_Bane"}, + {AL_DP, "DP", "Divine_Protection"}, + {AL_HEAL, "HEAL", "Heal"}, + {AL_HOLYLIGHT, "HOLYLIGHT", "Holy_Light"}, + {AL_HOLYWATER, "HOLYWATER", "Aqua_Benedicta"}, + {AL_INCAGI, "INCAGI", "Increase_AGI"}, + {AL_PNEUMA, "PNEUMA", "Pneuma"}, + {AL_RUWACH, "RUWACH", "Ruwach"}, + {AL_TELEPORT, "TELEPORT", "Teleport"}, + {AL_WARP, "WARP", "Warp_Portal"}, + {AM_ACIDTERROR, "ACIDTERROR", "Acid_Terror"}, + {AM_AXEMASTERY, "AXEMASTERY", "Axe_Mastery"}, + {AM_BERSERKPITCHER, "BERSERKPITCHER", "Berserk Pitcher"}, + {AM_BIOETHICS, "BIOETHICS", "Bioethics"}, + {AM_BIOTECHNOLOGY, "BIOTECHNOLOGY", "Biotechnology"}, + {AM_CALLHOMUN, "CALLHOMUN", "Call_Homunculus"}, + {AM_CANNIBALIZE, "CANNIBALIZE", "Bio_Cannibalize"}, + {AM_CP_ARMOR, "ARMOR", "Chemical_Protection_Armor"}, + {AM_CP_HELM, "HELM", "Chemical_Protection_Helm"}, + {AM_CP_SHIELD, "SHIELD", "Chemical_Protection_Shield"}, + {AM_CP_WEAPON, "WEAPON", "Chemical_Protection_Weapon"}, + {AM_CREATECREATURE, "CREATECREATURE", "Life_Creation"}, + {AM_CULTIVATION, "CULTIVATION", "Cultivation"}, + {AM_DEMONSTRATION, "DEMONSTRATION", "Demonstration"}, + {AM_DRILLMASTER, "DRILLMASTER", "Drillmaster"}, + {AM_FLAMECONTROL, "FLAMECONTROL", "Flame_Control"}, + {AM_HEALHOMUN, "HEALHOMUN", "Heal_Homunculus"}, + {AM_LEARNINGPOTION, "LEARNINGPOTION", "AM_LEARNINGPOTION"}, + {AM_PHARMACY, "PHARMACY", "Pharmacy"}, + {AM_POTIONPITCHER, "POTIONPITCHER", "Potion_Pitcher"}, + {AM_REST, "REST", "Sabbath"}, + {AM_RESURRECTHOMUN, "RESURRECTHOMUN", "Ressurect_Homunculus"}, + {AM_SPHEREMINE, "SPHEREMINE", "Sphere_Mine"}, + {ASC_BREAKER, "BREAKER", "Breaker"}, + {ASC_CDP, "CDP", "Create_Deadly_Poison"}, + {ASC_EDP, "EDP", "Deadly_Poison_Enchantment"}, + {ASC_HALLUCINATION, "HALLUCINATION", "Hallucination_Walk"}, + {ASC_KATAR, "KATAR", "Advanced_Katar_Mastery"}, + {ASC_METEORASSAULT, "METEORASSAULT", "Meteor_Assault"}, + {AS_CLOAKING, "CLOAKING", "Cloaking"}, + {AS_ENCHANTPOISON, "ENCHANTPOISON", "Enchant_Poison"}, + {AS_GRIMTOOTH, "GRIMTOOTH", "Grimtooth"}, + {AS_KATAR, "KATAR", "Katar_Mastery"}, + {AS_LEFT, "LEFT", "Lefthand_Mastery"}, + {AS_POISONREACT, "POISONREACT", "Poison_React"}, + {AS_RIGHT, "RIGHT", "Righthand_Mastery"}, + {AS_SONICBLOW, "SONICBLOW", "Sonic_Blow"}, + {AS_SPLASHER, "SPLASHER", "Venom_Splasher"}, + {AS_VENOMDUST, "VENOMDUST", "Venom_Dust"}, + {BA_APPLEIDUN, "APPLEIDUN", "Apple_of_Idun"}, + {BA_ASSASSINCROSS, "ASSASSINCROSS", "Assassin_Cross"}, + {BA_DISSONANCE, "DISSONANCE", "Dissonance"}, + {BA_FROSTJOKE, "FROSTJOKE", "Dumb_Joke"}, + {BA_MUSICALLESSON, "MUSICALLESSON", "Musical_Lesson"}, + {BA_MUSICALSTRIKE, "MUSICALSTRIKE", "Musical_Strike"}, + {BA_POEMBRAGI, "POEMBRAGI", "Poem_of_Bragi"}, + {BA_WHISTLE, "WHISTLE", "Whistle"}, + {BD_ADAPTATION, "ADAPTATION", "Adaption"}, + {BD_DRUMBATTLEFIELD, "DRUMBATTLEFIELD", "Drumb_BattleField"}, + {BD_ENCORE, "ENCORE", "Encore"}, + {BD_ETERNALCHAOS, "ETERNALCHAOS", "Eternal_Chaos"}, + {BD_INTOABYSS, "INTOABYSS", "Into_the_Abyss"}, + {BD_LULLABY, "LULLABY", "Lullaby"}, + {BD_RAGNAROK, "RAGNAROK", "Ragnarok"}, + {BD_RICHMANKIM, "RICHMANKIM", "Rich_Mankim"}, + {BD_RINGNIBELUNGEN, "RINGNIBELUNGEN", "Ring_of_Nibelugen"}, + {BD_ROKISWEIL, "ROKISWEIL", "Loki's_Wail"}, + {BD_SIEGFRIED, "SIEGFRIED", "Invulnerable_Siegfried"}, + {BS_ADRENALINE, "ADRENALINE", "Adrenaline_Rush"}, + {BS_ADRENALINE2, "ADRENALINE2", "Adrenaline Rush 2"}, + {BS_AXE, "AXE", "Smith_Axe"}, + {BS_DAGGER, "DAGGER", "Smith_Dagger"}, + {BS_ENCHANTEDSTONE, "ENCHANTEDSTONE", "Enchantedstone_Craft"}, + {BS_FINDINGORE, "FINDINGORE", "Ore_Discovery"}, + {BS_HAMMERFALL, "HAMMERFALL", "Hammer_Fall"}, + {BS_HILTBINDING, "HILTBINDING", "Hilt_Binding"}, + {BS_IRON, "IRON", "Iron_Tempering"}, + {BS_KNUCKLE, "KNUCKLE", "Smith_Knucklebrace"}, + {BS_MACE, "MACE", "Smith_Mace"}, + {BS_MAXIMIZE, "MAXIMIZE", "Power_Maximize"}, + {BS_ORIDEOCON, "ORIDEOCON", "Orideocon_Research"}, + {BS_OVERTHRUST, "OVERTHRUST", "Power-Thrust"}, + {BS_REPAIRWEAPON, "REPAIRWEAPON", "Weapon_Repair"}, + {BS_SKINTEMPER, "SKINTEMPER", "Skin_Tempering"}, + {BS_SPEAR, "SPEAR", "Smith_Spear"}, + {BS_STEEL, "STEEL", "Steel_Tempering"}, + {BS_SWORD, "SWORD", "Smith_Sword"}, + {BS_TWOHANDSWORD, "TWOHANDSWORD", "Smith_Two-handed_Sword"}, + {BS_WEAPONPERFECT, "WEAPONPERFECT", "Weapon_Perfection"}, + {BS_WEAPONRESEARCH, "WEAPONRESEARCH", "Weaponry_Research"}, + {CG_ARROWVULCAN, "ARROWVULCAN", "Vulcan_Arrow"}, + {CG_MARIONETTE, "MARIONETTE", "Marionette_Control"}, + {CG_MOONLIT, "MOONLIT", "Moonlight_Petals"}, + {CH_CHAINCRUSH, "CHAINCRUSH", "Chain_Crush_Combo"}, + {CH_PALMSTRIKE, "PALMSTRIKE", "Palm_Push_Strike"}, + {CH_SOULCOLLECT, "SOULCOLLECT", "Collect_Soul"}, + {CH_TIGERFIST, "TIGERFIST", "Tiger_Knuckle_Fist"}, + {CR_ALCHEMY, "ALCHEMY", "Alchemy"}, + {CR_AUTOGUARD, "AUTOGUARD", "Guard"}, + {CR_DEFENDER, "DEFENDER", "Defender"}, + {CR_DEVOTION, "DEVOTION", "Sacrifice"}, + {CR_GRANDCROSS, "GRANDCROSS", "Grand_Cross"}, + {CR_HOLYCROSS, "HOLYCROSS", "Holy_Cross"}, + {CR_PROVIDENCE, "PROVIDENCE", "Providence"}, + {CR_REFLECTSHIELD, "REFLECTSHIELD", "Shield_Reflect"}, + {CR_SHIELDBOOMERANG, "SHIELDBOOMERANG", "Shield_Boomerang"}, + {CR_SHIELDCHARGE, "SHIELDCHARGE", "Shield_Charge"}, + {CR_SPEARQUICKEN, "SPEARQUICKEN", "Spear_Quicken"}, + {CR_SYNTHESISPOTION, "SYNTHESISPOTION", "Potion_Synthesis"}, + {CR_TRUST, "TRUST", "Faith"}, + {DC_DANCINGLESSON, "DANCINGLESSON", "Dancing_Lesson"}, + {DC_DONTFORGETME, "DONTFORGETME", "Don't_Forget_Me"}, + {DC_FORTUNEKISS, "FORTUNEKISS", "Fortune_Kiss"}, + {DC_HUMMING, "HUMMING", "Humming"}, + {DC_SCREAM, "SCREAM", "Scream"}, + {DC_SERVICEFORYOU, "SERVICEFORYOU", "Prostitute"}, + {DC_THROWARROW, "THROWARROW", "Throw_Arrow"}, + {DC_UGLYDANCE, "UGLYDANCE", "Ugly_Dance"}, + {HP_ASSUMPTIO, "ASSUMPTIO", "Assumptio"}, + {HP_BASILICA, "BASILICA", "Basilica"}, + {HP_MEDITATIO, "MEDITATIO", "Meditation"}, + {HT_ANKLESNARE, "ANKLESNARE", "Ankle_Snare"}, + {HT_BEASTBANE, "BEASTBANE", "Beast_Bane"}, + {HT_BLASTMINE, "BLASTMINE", "Blast_Mine"}, + {HT_BLITZBEAT, "BLITZBEAT", "Blitz_Beat"}, + {HT_CLAYMORETRAP, "CLAYMORETRAP", "Claymore_Trap"}, + {HT_DETECTING, "DETECTING", "Detect"}, + {HT_FALCON, "FALCON", "Falconry_Mastery"}, + {HT_FLASHER, "FLASHER", "Flasher"}, + {HT_FREEZINGTRAP, "FREEZINGTRAP", "Freezing_Trap"}, + {HT_LANDMINE, "LANDMINE", "Land_Mine"}, + {HT_REMOVETRAP, "REMOVETRAP", "Remove_Trap"}, + {HT_SANDMAN, "SANDMAN", "Sandman"}, + {HT_SHOCKWAVE, "SHOCKWAVE", "Shockwave_Trap"}, + {HT_SKIDTRAP, "SKIDTRAP", "Skid_Trap"}, + {HT_SPRINGTRAP, "SPRINGTRAP", "Spring_Trap"}, + {HT_STEELCROW, "STEELCROW", "Steel_Crow"}, + {HT_TALKIEBOX, "TALKIEBOX", "Talkie_Box"}, + {HW_MAGICCRASHER, "MAGICCRASHER", "Magic_Crasher"}, + {HW_MAGICPOWER, "MAGICPOWER", "Magic_Power"}, + {HW_NAPALMVULCAN, "NAPALMVULCAN", "Napalm_Vulcan"}, + {HW_SOULDRAIN, "SOULDRAIN", "Soul_Drain"}, + {KN_AUTOCOUNTER, "AUTOCOUNTER", "Counter_Attack"}, + {KN_BOWLINGBASH, "BOWLINGBASH", "Bowling_Bash"}, + {KN_BRANDISHSPEAR, "BRANDISHSPEAR", "Brandish_Spear"}, + {KN_CAVALIERMASTERY, "CAVALIERMASTERY", "Cavalier_Mastery"}, + {KN_PIERCE, "PIERCE", "Pierce"}, + {KN_RIDING, "RIDING", "Peco_Peco_Ride"}, + {KN_SPEARBOOMERANG, "SPEARBOOMERANG", "Spear_Boomerang"}, + {KN_SPEARMASTERY, "SPEARMASTERY", "Spear_Mastery"}, + {KN_SPEARSTAB, "SPEARSTAB", "Spear_Stab"}, + {KN_TWOHANDQUICKEN, "TWOHANDQUICKEN", "Twohand_Quicken"}, + {LK_AURABLADE, "AURABLADE", "Aura_Blade"}, + {LK_BERSERK, "BERSERK", "Berserk"}, + {LK_CONCENTRATION, "CONCENTRATION", "Concentration"}, + {LK_FURY, "FURY", "LK_FURY"}, + {LK_HEADCRUSH, "HEADCRUSH", "Head_Crusher"}, + {LK_JOINTBEAT, "JOINTBEAT", "Joint_Beat"}, + {LK_PARRYING, "PARRYING", "Parrying"}, + {LK_SPIRALPIERCE, "SPIRALPIERCE", "Spiral_Pierce"}, + {LK_TENSIONRELAX, "TENSIONRELAX", "Tension_Relax"}, + {MC_CARTREVOLUTION, "CARTREVOLUTION", "Cart_Revolution"}, + {MC_CHANGECART, "CHANGECART", "Change_Cart"}, + {MC_DISCOUNT, "DISCOUNT", "Discount"}, + {MC_IDENTIFY, "IDENTIFY", "Item_Appraisal"}, + {MC_INCCARRY, "INCCARRY", "Enlarge_Weight_Limit"}, + {MC_LOUD, "LOUD", "Lord_Exclamation"}, + {MC_MAMMONITE, "MAMMONITE", "Mammonite"}, + {MC_OVERCHARGE, "OVERCHARGE", "Overcharge"}, + {MC_PUSHCART, "PUSHCART", "Pushcart"}, + {MG_COLDBOLT, "COLDBOLT", "Cold_Bolt"}, + {MG_ENERGYCOAT, "ENERGYCOAT", "Energy_Coat"}, + {MG_FIREBALL, "FIREBALL", "Fire_Ball"}, + {MG_FIREBOLT, "FIREBOLT", "Fire_Bolt"}, + {MG_FIREWALL, "FIREWALL", "Fire_Wall"}, + {MG_FROSTDIVER, "FROSTDIVER", "Frost_Diver"}, + {MG_LIGHTNINGBOLT, "LIGHTNINGBOLT", "Lightening_Bolt"}, + {MG_NAPALMBEAT, "NAPALMBEAT", "Napalm_Beat"}, + {MG_SAFETYWALL, "SAFETYWALL", "Safety_Wall"}, + {MG_SIGHT, "SIGHT", "Sight"}, + {MG_SOULSTRIKE, "SOULSTRIKE", "Soul_Strike"}, + {MG_SRECOVERY, "SRECOVERY", "Increase_SP_Recovery"}, + {MG_STONECURSE, "STONECURSE", "Stone_Curse"}, + {MG_THUNDERSTORM, "THUNDERSTORM", "Thunderstorm"}, + {MO_ABSORBSPIRITS, "ABSORBSPIRITS", "Absorb_Spirits"}, + {MO_BLADESTOP, "BLADESTOP", "Blade_Stop"}, + {MO_BODYRELOCATION, "BODYRELOCATION", "Body_Relocation"}, + {MO_CALLSPIRITS, "CALLSPIRITS", "Call_Spirits"}, + {MO_CHAINCOMBO, "CHAINCOMBO", "Chain_Combo"}, + {MO_COMBOFINISH, "COMBOFINISH", "Combo_Finish"}, + {MO_DODGE, "DODGE", "Dodge"}, + {MO_EXPLOSIONSPIRITS, "EXPLOSIONSPIRITS", "Explosion_Spirits"}, + {MO_EXTREMITYFIST, "EXTREMITYFIST", "Extremity_Fist"}, + {MO_FINGEROFFENSIVE, "FINGEROFFENSIVE", "Finger_Offensive"}, + {MO_INVESTIGATE, "INVESTIGATE", "Investigate"}, + {MO_IRONHAND, "IRONHAND", "Iron_Hand"}, + {MO_SPIRITSRECOVERY, "SPIRITSRECOVERY", "Spirit_Recovery"}, + {MO_STEELBODY, "STEELBODY", "Steel_Body"}, + {MO_TRIPLEATTACK, "TRIPLEATTACK", "Triple_Blows"}, + {NPC_ATTRICHANGE, "ATTRICHANGE", "NPC_ATTRICHANGE"}, + {NPC_BARRIER, "BARRIER", "NPC_BARRIER"}, + {NPC_BLINDATTACK, "BLINDATTACK", "NPC_BLINDATTACK"}, + {NPC_BLOODDRAIN, "BLOODDRAIN", "NPC_BLOODDRAIN"}, + {NPC_CHANGEDARKNESS, "CHANGEDARKNESS", "NPC_CHANGEDARKNESS"}, + {NPC_CHANGEFIRE, "CHANGEFIRE", "NPC_CHANGEFIRE"}, + {NPC_CHANGEGROUND, "CHANGEGROUND", "NPC_CHANGEGROUND"}, + {NPC_CHANGEHOLY, "CHANGEHOLY", "NPC_CHANGEHOLY"}, + {NPC_CHANGEPOISON, "CHANGEPOISON", "NPC_CHANGEPOISON"}, + {NPC_CHANGETELEKINESIS, "CHANGETELEKINESIS", "NPC_CHANGETELEKINESIS"}, + {NPC_CHANGEWATER, "CHANGEWATER", "NPC_CHANGEWATER"}, + {NPC_CHANGEWIND, "CHANGEWIND", "NPC_CHANGEWIND"}, + {NPC_COMBOATTACK, "COMBOATTACK", "NPC_COMBOATTACK"}, + {NPC_CRITICALSLASH, "CRITICALSLASH", "NPC_CRITICALSLASH"}, + {NPC_CURSEATTACK, "CURSEATTACK", "NPC_CURSEATTACK"}, + {NPC_DARKBLESSING, "DARKBLESSING", "NPC_DARKBLESSING"}, + {NPC_DARKBREATH, "DARKBREATH", "NPC_DARKBREATH"}, + {NPC_DARKCROSS, "DARKCROSS", "NPC_DARKCROSS"}, + {NPC_DARKNESSATTACK, "DARKNESSATTACK", "NPC_DARKNESSATTACK"}, + {NPC_DEFENDER, "DEFENDER", "NPC_DEFENDER"}, + {NPC_EMOTION, "EMOTION", "NPC_EMOTION"}, + {NPC_ENERGYDRAIN, "ENERGYDRAIN", "NPC_ENERGYDRAIN"}, + {NPC_FIREATTACK, "FIREATTACK", "NPC_FIREATTACK"}, + {NPC_GROUNDATTACK, "GROUNDATTACK", "NPC_GROUNDATTACK"}, + {NPC_GUIDEDATTACK, "GUIDEDATTACK", "NPC_GUIDEDATTACK"}, + {NPC_HALLUCINATION, "HALLUCINATION", "NPC_HALLUCINATION"}, + {NPC_HOLYATTACK, "HOLYATTACK", "NPC_HOLYATTACK"}, + {NPC_KEEPING, "KEEPING", "NPC_KEEPING"}, + {NPC_LICK, "LICK", "NPC_LICK"}, + {NPC_MAGICALATTACK, "MAGICALATTACK", "NPC_MAGICALATTACK"}, + {NPC_MENTALBREAKER, "MENTALBREAKER", "NPC_MENTALBREAKER"}, + {NPC_METAMORPHOSIS, "METAMORPHOSIS", "NPC_METAMORPHOSIS"}, + {NPC_PETRIFYATTACK, "PETRIFYATTACK", "NPC_PETRIFYATTACK"}, + {NPC_PIERCINGATT, "PIERCINGATT", "NPC_PIERCINGATT"}, + {NPC_POISON, "POISON", "NPC_POISON"}, + {NPC_POISONATTACK, "POISONATTACK", "NPC_POISONATTACK"}, + {NPC_RANDOMATTACK, "RANDOMATTACK", "NPC_RANDOMATTACK"}, + {NPC_RANGEATTACK, "RANGEATTACK", "NPC_RANGEATTACK"}, + {NPC_REBIRTH, "REBIRTH", "NPC_REBIRTH"}, + {NPC_SELFDESTRUCTION, "SELFDESTRUCTION", "Kabooooom!"}, + {NPC_SELFDESTRUCTION2, "SELFDESTRUCTION2", "NPC_SELFDESTRUCTION2"}, + {NPC_SILENCEATTACK, "SILENCEATTACK", "NPC_SILENCEATTACK"}, + {NPC_SLEEPATTACK, "SLEEPATTACK", "NPC_SLEEPATTACK"}, + {NPC_SMOKING, "SMOKING", "NPC_SMOKING"}, + {NPC_SPLASHATTACK, "SPLASHATTACK", "NPC_SPLASHATTACK"}, + {NPC_STUNATTACK, "STUNATTACK", "NPC_STUNATTACK"}, + {NPC_SUICIDE, "SUICIDE", "NPC_SUICIDE"}, + {NPC_SUMMONMONSTER, "SUMMONMONSTER", "NPC_SUMMONMONSTER"}, + {NPC_SUMMONSLAVE, "SUMMONSLAVE", "NPC_SUMMONSLAVE"}, + {NPC_TELEKINESISATTACK, "TELEKINESISATTACK", "NPC_TELEKINESISATTACK"}, + {NPC_TRANSFORMATION, "TRANSFORMATION", "NPC_TRANSFORMATION"}, + {NPC_WATERATTACK, "WATERATTACK", "NPC_WATERATTACK"}, + {NPC_WINDATTACK, "WINDATTACK", "NPC_WINDATTACK"}, + {NV_EMOTE, "EMOTE", "Emote_Skill"}, + {NV_TRADE, "TRADE", "Trade_Skill"}, + {NV_PARTY, "PARTY", "Party_Skill"}, + {NV_FIRSTAID, "FIRSTAID", "First Aid"}, + {NV_TRICKDEAD, "TRICKDEAD", "Play_Dead"}, + {PA_GOSPEL, "GOSPEL", "Gospel"}, + {PA_PRESSURE, "PRESSURE", "Pressure"}, + {PA_SACRIFICE, "SACRIFICE", "Sacrificial_Ritual"}, + {PF_FOGWALL, "FOGWALL", "Wall_of_Fog"}, + {PF_HPCONVERSION, "HPCONVERSION", "Health_Conversion"}, + {PF_MEMORIZE, "MEMORIZE", "Memorize"}, + {PF_MINDBREAKER, "MINDBREAKER", "Mind_Breaker"}, + {PF_SOULBURN, "SOULBURN", "Soul_Burn"}, + {PF_SOULCHANGE, "SOULCHANGE", "Soul_Change"}, + {PF_SPIDERWEB, "SPIDERWEB", "Spider_Web"}, + {PR_ASPERSIO, "ASPERSIO", "Aspersio"}, + {PR_BENEDICTIO, "BENEDICTIO", "B.S_Sacramenti"}, + {PR_GLORIA, "GLORIA", "Gloria"}, + {PR_IMPOSITIO, "IMPOSITIO", "Impositio_Manus"}, + {PR_KYRIE, "KYRIE", "Kyrie_Eleison"}, + {PR_LEXAETERNA, "LEXAETERNA", "Lex_Aeterna"}, + {PR_LEXDIVINA, "LEXDIVINA", "Lex_Divina"}, + {PR_MACEMASTERY, "MACEMASTERY", "Mace_Mastery"}, + {PR_MAGNIFICAT, "MAGNIFICAT", "Magnificat"}, + {PR_MAGNUS, "MAGNUS", "Magnus_Exorcismus"}, + {PR_SANCTUARY, "SANCTUARY", "Santuary"}, + {PR_SLOWPOISON, "SLOWPOISON", "Slow_Poison"}, + {PR_STRECOVERY, "STRECOVERY", "Status_Recovery"}, + {PR_SUFFRAGIUM, "SUFFRAGIUM", "Suffragium"}, + {PR_TURNUNDEAD, "TURNUNDEAD", "Turn_Undead"}, + {RG_BACKSTAP, "BACKSTAP", "Back_Stab"}, + {RG_CLEANER, "CLEANER", "Remover"}, + {RG_COMPULSION, "COMPULSION", "Compulsion_Discount"}, + {RG_FLAGGRAFFITI, "FLAGGRAFFITI", "Flag_Graffity"}, + {RG_GANGSTER, "GANGSTER", "Gangster's_Paradise"}, + {RG_GRAFFITI, "GRAFFITI", "Graffiti"}, + {RG_INTIMIDATE, "INTIMIDATE", "Intimidate"}, + {RG_PLAGIARISM, "PLAGIARISM", "Plagiarism"}, + {RG_RAID, "RAID", "Raid"}, + {RG_SNATCHER, "SNATCHER", "Snatcher"}, + {RG_STEALCOIN, "STEALCOIN", "Steal_Coin"}, + {RG_STRIPARMOR, "STRIPARMOR", "Strip_Armor"}, + {RG_STRIPHELM, "STRIPHELM", "Strip_Helm"}, + {RG_STRIPSHIELD, "STRIPSHIELD", "Strip_Shield"}, + {RG_STRIPWEAPON, "STRIPWEAPON", "Strip_Weapon"}, + {RG_TUNNELDRIVE, "TUNNELDRIVE", "Tunnel_Drive"}, + {SA_ABRACADABRA, "ABRACADABRA", "Hocus-pocus"}, + {SA_ADVANCEDBOOK, "ADVANCEDBOOK", "Advanced_Book"}, + {SA_AUTOSPELL, "AUTOSPELL", "Auto_Cast"}, + {SA_CASTCANCEL, "CASTCANCEL", "Cast_Cancel"}, + {SA_CLASSCHANGE, "CLASSCHANGE", "Class_Change"}, + {SA_COMA, "COMA", "Coma"}, + {SA_DEATH, "DEATH", "Death"}, + {SA_DELUGE, "DELUGE", "Deluge"}, + {SA_DISPELL, "DISPELL", "Dispel"}, + {SA_DRAGONOLOGY, "DRAGONOLOGY", "Dragonology"}, + {SA_FLAMELAUNCHER, "FLAMELAUNCHER", "Flame_Launcher"}, + {SA_FORTUNE, "FORTUNE", "Fortune"}, + {SA_FREECAST, "FREECAST", "Cast_Freedom"}, + {SA_FROSTWEAPON, "FROSTWEAPON", "Frost_Weapon"}, + {SA_FULLRECOVERY, "FULLRECOVERY", "Full_Recovery"}, + {SA_GRAVITY, "GRAVITY", "Gravity"}, + {SA_INSTANTDEATH, "INSTANTDEATH", "Instant_Death"}, + {SA_LANDPROTECTOR, "LANDPROTECTOR", "Land_Protector"}, + {SA_LEVELUP, "LEVELUP", "Level_Up"}, + {SA_LIGHTNINGLOADER, "LIGHTNINGLOADER", "Lightning_Loader"}, + {SA_MAGICROD, "MAGICROD", "Magic_Rod"}, + {SA_MONOCELL, "MONOCELL", "Monocell"}, + {SA_QUESTION, "QUESTION", "Question?"}, + {SA_REVERSEORCISH, "REVERSEORCISH", "Reverse_Orcish"}, + {SA_SEISMICWEAPON, "SEISMICWEAPON", "Seismic_Weapon"}, + {SA_SPELLBREAKER, "SPELLBREAKER", "Break_Spell"}, + {SA_SUMMONMONSTER, "SUMMONMONSTER", "Summon_Monster"}, + {SA_VIOLENTGALE, "VIOLENTGALE", "Violent_Gale"}, + {SA_VOLCANO, "VOLCANO", "Volcano"}, + {SG_DEVIL, "DEVIL", "Devil"}, + {SG_FEEL, "FEEL", "Feel"}, + {SG_FRIEND, "FRIEND", "Friend"}, + {SG_FUSION, "FUSION", "Fusion"}, + {SG_HATE, "HATE", "Hate"}, + {SG_KNOWLEDGE, "KNOWLEDGE", "Knowledge"}, + {SG_MOON_ANGER, "ANGER", "Moon Anger"}, + {SG_MOON_BLESS, "BLESS", "Moon Bless"}, + {SG_MOON_COMFORT, "COMFORT", "Moon Comfort"}, + {SG_MOON_WARM, "WARM", "Moon Warm"}, + {SG_STAR_ANGER, "ANGER", "Star Anger"}, + {SG_STAR_BLESS, "BLESS", "Star Bless"}, + {SG_STAR_COMFORT, "COMFORT", "Star Comfort"}, + {SG_STAR_WARM, "WARM", "Star Warm"}, + {SG_SUN_ANGER, "ANGER", "Sun Anger"}, + {SG_SUN_BLESS, "BLESS", "Sun Bless"}, + {SG_SUN_COMFORT, "COMFORT", "Sun Comfort"}, + {SG_SUN_WARM, "WARM", "Sun Warm"}, + {SL_ALCHEMIST, "ALCHEMIST", "Alchemist"}, + {SL_ASSASIN, "ASSASIN", "Assasin"}, + {SL_BARDDANCER, "BARDDANCER", "Bard Dancer"}, + {SL_BLACKSMITH, "BLACKSMITH", "Black Smith"}, + {SL_CRUSADER, "CRUSADER", "Crusader"}, + {SL_HUNTER, "HUNTER", "Hunter"}, + {SL_KAAHI, "KAAHI", "Kaahi"}, + {SL_KAINA, "KAINA", "Kaina"}, + {SL_KAITE, "KAITE", "Kaite"}, + {SL_KAIZEL, "KAIZEL", "Kaizel"}, + {SL_KAUPE, "KAUPE", "Kaupe"}, + {SL_KNIGHT, "KNIGHT", "Knight"}, + {SL_MONK, "MONK", "Monk"}, + {SL_PRIEST, "PRIEST", "Priest"}, + {SL_ROGUE, "ROGUE", "Rogue"}, + {SL_SAGE, "SAGE", "Sage"}, + {SL_SKA, "SKA", "SKA"}, + {SL_SKE, "SKE", "SKE"}, + {SL_SMA, "SMA", "SMA"}, + {SL_SOULLINKER, "SOULLINKER", "Soul Linker"}, + {SL_STAR, "STAR", "Star"}, + {SL_STIN, "STIN", "Stin"}, + {SL_STUN, "STUN", "Stun"}, + {SL_SUPERNOVICE, "SUPERNOVICE", "Super Novice"}, + {SL_SWOO, "SWOO", "Swoo"}, + {SL_WIZARD, "WIZARD", "Wizard"}, + {SM_AUTOBERSERK, "AUTOBERSERK", "Auto_Berserk"}, + {SM_BASH, "BASH", "Bash"}, + {SM_ENDURE, "ENDURE", "Endure"}, + {SM_FATALBLOW, "FATALBLOW", "Attack_Weak_Point"}, + {SM_MAGNUM, "MAGNUM", "Magnum_Break"}, + {SM_MOVINGRECOVERY, "MOVINGRECOVERY", "Moving_HP_Recovery"}, + {SM_PROVOKE, "PROVOKE", "Provoke"}, + {SM_RECOVERY, "RECOVERY", "Increase_HP_Recovery"}, + {SM_SWORD, "SWORD", "Sword_Mastery"}, + {SM_TWOHAND, "TWOHAND", "Two-Handed_Sword_Mastery"}, + {SN_FALCONASSAULT, "FALCONASSAULT", "Falcon_Assault"}, + {SN_SHARPSHOOTING, "SHARPSHOOTING", "Sharpshooting"}, + {SN_SIGHT, "SIGHT", "True_Sight"}, + {SN_WINDWALK, "WINDWALK", "Wind_Walk"}, + {ST_CHASEWALK, "CHASEWALK", "Chase_Walk"}, + {ST_REJECTSWORD, "REJECTSWORD", "Reject_Sword"}, + {ST_STEALBACKPACK, "STEALBACKPACK", "Steal_Backpack"}, + {TF_BACKSLIDING, "BACKSLIDING", "Back_Sliding"}, + {TF_DETOXIFY, "DETOXIFY", "Detoxify"}, + {TF_DOUBLE, "DOUBLE", "Double_Attack"}, + {TF_HIDING, "HIDING", "Hiding"}, + {TF_MISS, "MISS", "Improve_Dodge"}, + {TF_PICKSTONE, "PICKSTONE", "Take_Stone"}, + {TF_POISON, "POISON", "Envenom"}, + {TF_SPRINKLESAND, "SPRINKLESAND", "Throw_Sand"}, + {TF_STEAL, "STEAL", "Steal"}, + {TF_THROWSTONE, "THROWSTONE", "Throw_Stone"}, + {TK_COUNTER, "COUNTER", "Counter"}, + {TK_DODGE, "DODGE", "Dodge"}, + {TK_DOWNKICK, "DOWNKICK", "Down Kick"}, + {TK_HIGHJUMP, "HIGHJUMP", "High Jump"}, + {TK_HPTIME, "HPTIME", "HP Time"}, + {TK_JUMPKICK, "JUMPKICK", "Jump Kick"}, + {TK_POWER, "POWER", "Power"}, + {TK_READYCOUNTER, "READYCOUNTER", "Ready Counter"}, + {TK_READYDOWN, "READYDOWN", "Ready Down"}, + {TK_READYSTORM, "READYSTORM", "Ready Storm"}, + {TK_READYTURN, "READYTURN", "Ready Turn"}, + {TK_RUN, "RUN", "TK_RUN"}, + {TK_SEVENWIND, "SEVENWIND", "Seven Wind"}, + {TK_SPTIME, "SPTIME", "SP Time"}, + {TK_STORMKICK, "STORMKICK", "Storm Kick"}, + {TK_TURNKICK, "TURNKICK", "Turn Kick"}, + {WE_BABY, "BABY", "Adopt_Baby"}, + {WE_CALLBABY, "CALLBABY", "Call_Baby"}, + {WE_CALLPARENT, "CALLPARENT", "Call_Parent"}, + {WE_CALLPARTNER, "CALLPARTNER", "I Want to See You"}, + {WE_FEMALE, "FEMALE", "I Only Look Up to You"}, + {WE_MALE, "MALE", "I Will Protect You"}, + {WS_CARTBOOST, "CARTBOOST", "Cart_Boost"}, + {WS_CREATECOIN, "CREATECOIN", "Create_Coins"}, + {WS_CREATENUGGET, "CREATENUGGET", "Create_Nuggets"}, + {WS_MELTDOWN, "MELTDOWN", "Meltdown"}, + {WS_SYSTEMCREATE, "SYSTEMCREATE", "Create_System_tower"}, + {WZ_EARTHSPIKE, "EARTHSPIKE", "Earth_Spike"}, + {WZ_ESTIMATION, "ESTIMATION", "Sense"}, + {WZ_FIREIVY, "FIREIVY", "Fire_Ivy"}, + {WZ_FIREPILLAR, "FIREPILLAR", "Fire_Pillar"}, + {WZ_FROSTNOVA, "FROSTNOVA", "Frost_Nova"}, + {WZ_HEAVENDRIVE, "HEAVENDRIVE", "Heaven's_Drive"}, + {WZ_ICEWALL, "ICEWALL", "Ice_Wall"}, + {WZ_JUPITEL, "JUPITEL", "Jupitel_Thunder"}, + {WZ_METEOR, "METEOR", "Meteor_Storm"}, + {WZ_QUAGMIRE, "QUAGMIRE", "Quagmire"}, + {WZ_SIGHTRASHER, "SIGHTRASHER", "Sightrasher"}, + {WZ_STORMGUST, "STORMGUST", "Storm_Gust"}, + {WZ_VERMILION, "VERMILION", "Lord_of_Vermilion"}, + {WZ_WATERBALL, "WATERBALL", "Water_Ball"}, + {0, 0, 0} }; -static const int dirx[8]={0,-1,-1,-1,0,1,1,1}; -static const int diry[8]={1,1,0,-1,-1,-1,0,1}; +static const int dirx[8] = { 0, -1, -1, -1, 0, 1, 1, 1 }; +static const int diry[8] = { 1, 1, 0, -1, -1, -1, 0, 1 }; static int rdamage; /* スキルデータベース */ struct skill_db skill_db[MAX_SKILL_DB]; -#define UNARMED_PLAYER_DAMAGE_MIN(bl) (skill_power_bl((bl), TMW_BRAWLING) >> 4) // +50 for 200 -#define UNARMED_PLAYER_DAMAGE_MAX(bl) (skill_power_bl((bl), TMW_BRAWLING)) // +200 for 200 - - -int skill_get_hit( int id ){ return skill_db[id].hit; } -int skill_get_inf( int id ){ return skill_db[id].inf; } -int skill_get_pl( int id ){ return skill_db[id].pl; } -int skill_get_nk( int id ){ return skill_db[id].nk; } -int skill_get_max( int id ){ return skill_db[id].max; } -int skill_get_max_raise( int id ){ return skill_db[id].max_raise; } -int skill_get_range( int id , int lv ){ return (lv <= 0) ? 0:skill_db[id].range[lv-1]; } -int skill_get_hp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].hp[lv-1]; } -int skill_get_sp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].sp[lv-1]; } -int skill_get_zeny( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].zeny[lv-1]; } -int skill_get_num( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].num[lv-1]; } -int skill_get_cast( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].cast[lv-1]; } -int skill_get_delay( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].delay[lv-1]; } -int skill_get_time( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].upkeep_time[lv-1]; } -int skill_get_time2( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].upkeep_time2[lv-1]; } -int skill_get_castdef( int id ){ return skill_db[id].cast_def_rate; } -int skill_get_weapontype( int id ){ return skill_db[id].weapon; } -int skill_get_inf2( int id ){ return skill_db[id].inf2; } -int skill_get_maxcount( int id ){ return skill_db[id].maxcount; } -int skill_get_blewcount( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].blewcount[lv-1]; } -int skill_get_mhp( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].mhp[lv-1]; } -int skill_get_castnodex( int id ,int lv ){ return (lv <= 0) ? 0:skill_db[id].castnodex[lv-1]; } +#define UNARMED_PLAYER_DAMAGE_MIN(bl) (skill_power_bl((bl), TMW_BRAWLING) >> 4) // +50 for 200 +#define UNARMED_PLAYER_DAMAGE_MAX(bl) (skill_power_bl((bl), TMW_BRAWLING)) // +200 for 200 + +int skill_get_hit (int id) +{ + return skill_db[id].hit; +} + +int skill_get_inf (int id) +{ + return skill_db[id].inf; +} + +int skill_get_pl (int id) +{ + return skill_db[id].pl; +} + +int skill_get_nk (int id) +{ + return skill_db[id].nk; +} + +int skill_get_max (int id) +{ + return skill_db[id].max; +} + +int skill_get_max_raise (int id) +{ + return skill_db[id].max_raise; +} + +int skill_get_range (int id, int lv) +{ + return (lv <= 0) ? 0 : skill_db[id].range[lv - 1]; +} + +int skill_get_hp (int id, int lv) +{ + return (lv <= 0) ? 0 : skill_db[id].hp[lv - 1]; +} + +int skill_get_sp (int id, int lv) +{ + return (lv <= 0) ? 0 : skill_db[id].sp[lv - 1]; +} + +int skill_get_zeny (int id, int lv) +{ + return (lv <= 0) ? 0 : skill_db[id].zeny[lv - 1]; +} + +int skill_get_num (int id, int lv) +{ + return (lv <= 0) ? 0 : skill_db[id].num[lv - 1]; +} + +int skill_get_cast (int id, int lv) +{ + return (lv <= 0) ? 0 : skill_db[id].cast[lv - 1]; +} + +int skill_get_delay (int id, int lv) +{ + return (lv <= 0) ? 0 : skill_db[id].delay[lv - 1]; +} + +int skill_get_time (int id, int lv) +{ + return (lv <= 0) ? 0 : skill_db[id].upkeep_time[lv - 1]; +} + +int skill_get_time2 (int id, int lv) +{ + return (lv <= 0) ? 0 : skill_db[id].upkeep_time2[lv - 1]; +} + +int skill_get_castdef (int id) +{ + return skill_db[id].cast_def_rate; +} + +int skill_get_weapontype (int id) +{ + return skill_db[id].weapon; +} + +int skill_get_inf2 (int id) +{ + return skill_db[id].inf2; +} + +int skill_get_maxcount (int id) +{ + return skill_db[id].maxcount; +} + +int skill_get_blewcount (int id, int lv) +{ + return (lv <= 0) ? 0 : skill_db[id].blewcount[lv - 1]; +} + +int skill_get_mhp (int id, int lv) +{ + return (lv <= 0) ? 0 : skill_db[id].mhp[lv - 1]; +} + +int skill_get_castnodex (int id, int lv) +{ + return (lv <= 0) ? 0 : skill_db[id].castnodex[lv - 1]; +} /* プロトタイプ */ -struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag); -int skill_check_condition( struct map_session_data *sd,int type); -int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag ); -int skill_frostjoke_scream(struct block_list *bl,va_list ap); -int skill_status_change_timer_sub(struct block_list *bl, va_list ap ); -int skill_attack_area(struct block_list *bl,va_list ap); -int skill_clear_element_field(struct block_list *bl); -int skill_landprotector(struct block_list *bl, va_list ap ); -int skill_trap_splash(struct block_list *bl, va_list ap ); -int skill_count_target(struct block_list *bl, va_list ap ); +struct skill_unit_group *skill_unitsetting (struct block_list *src, + int skillid, int skilllv, int x, + int y, int flag); +int skill_check_condition (struct map_session_data *sd, int type); +int skill_castend_damage_id (struct block_list *src, struct block_list *bl, + int skillid, int skilllv, unsigned int tick, + int flag); +int skill_frostjoke_scream (struct block_list *bl, va_list ap); +int skill_status_change_timer_sub (struct block_list *bl, va_list ap); +int skill_attack_area (struct block_list *bl, va_list ap); +int skill_clear_element_field (struct block_list *bl); +int skill_landprotector (struct block_list *bl, va_list ap); +int skill_trap_splash (struct block_list *bl, va_list ap); +int skill_count_target (struct block_list *bl, va_list ap); // [MouseJstr] - skill ok to cast? and when? -static int skillnotok(int skillid, struct map_session_data *sd) { - if (sd == 0) - return 0; - if (pc_isGM(sd) >= 20) - return 0; // gm's can do anything damn thing they want - switch (skillid) { - case AL_WARP: - case AL_TELEPORT: - case MC_IDENTIFY: - return 0; // always allowed - default: - return(map[sd->bl.m].flag.noskill); - } +static int skillnotok (int skillid, struct map_session_data *sd) +{ + if (sd == 0) + return 0; + if (pc_isGM (sd) >= 20) + return 0; // gm's can do anything damn thing they want + switch (skillid) + { + case AL_WARP: + case AL_TELEPORT: + case MC_IDENTIFY: + return 0; // always allowed + default: + return (map[sd->bl.m].flag.noskill); + } } - -static int distance(int x0,int y0,int x1,int y1) +static int distance (int x0, int y0, int x1, int y1) { - int dx,dy; + int dx, dy; - dx=abs(x0-x1); - dy=abs(y0-y1); - return dx>dy ? dx : dy; + dx = abs (x0 - x1); + dy = abs (y0 - y1); + return dx > dy ? dx : dy; } /* スキルユニットIDを返す(これもデータベースに入れたいな) */ -int skill_get_unit_id(int id,int flag) +int skill_get_unit_id (int id, int flag) { - switch(id){ - case MG_SAFETYWALL: return 0x7e; /* セイフティウォール */ - case MG_FIREWALL: return 0x7f; /* ファイアーウォール */ - case AL_WARP: return (flag==0)?0x81:0x80; /* ワープポータル */ - case PR_BENEDICTIO: return 0x82; /* 聖体降福 */ - case PR_SANCTUARY: return 0x83; /* サンクチュアリ */ - case PR_MAGNUS: return 0x84; /* マグヌスエクソシズム */ - case AL_PNEUMA: return 0x85; /* ニューマ */ - case MG_THUNDERSTORM: return 0x86; /* サンダーストーム */ - case WZ_HEAVENDRIVE: return 0x86; /* ヘヴンズドライブ */ - case WZ_SIGHTRASHER: return 0x86; /* サイトラッシャー */ - case WZ_METEOR: return 0x86; /* メテオストーム */ - case WZ_VERMILION: return 0x86; /* ロードオブヴァーミリオン */ - case WZ_FROSTNOVA: return 0x86; /* フロストノヴァ */ - case WZ_STORMGUST: return 0x86; /* ストームガスト(とりあえずLoVと同じで処理) */ - case CR_GRANDCROSS: return 0x86; /* グランドクロス */ - case WZ_FIREPILLAR: return (flag==0)?0x87:0x88; /* ファイアーピラー */ - case HT_TALKIEBOX: return 0x99; /* トーキーボックス */ - case WZ_ICEWALL: return 0x8d; /* アイスウォール */ - case WZ_QUAGMIRE: return 0x8e; /* クァグマイア */ - case HT_BLASTMINE: return 0x8f; /* ブラストマイン */ - case HT_SKIDTRAP: return 0x90; /* スキッドトラップ */ - case HT_ANKLESNARE: return 0x91; /* アンクルスネア */ - case AS_VENOMDUST: return 0x92; /* ベノムダスト */ - case HT_LANDMINE: return 0x93; /* ランドマイン */ - case HT_SHOCKWAVE: return 0x94; /* ショックウェーブトラップ */ - case HT_SANDMAN: return 0x95; /* サンドマン */ - case HT_FLASHER: return 0x96; /* フラッシャー */ - case HT_FREEZINGTRAP: return 0x97; /* フリージングトラップ */ - case HT_CLAYMORETRAP: return 0x98; /* クレイモアートラップ */ - case SA_VOLCANO: return 0x9a; /* ボルケーノ */ - case SA_DELUGE: return 0x9b; /* デリュージ */ - case SA_VIOLENTGALE: return 0x9c; /* バイオレントゲイル */ - case SA_LANDPROTECTOR: return 0x9d; /* ランドプロテクター */ - case BD_LULLABY: return 0x9e; /* 子守歌 */ - case BD_RICHMANKIM: return 0x9f; /* ニヨルドの宴 */ - case BD_ETERNALCHAOS: return 0xa0; /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD:return 0xa1; /* 戦太鼓の響き */ - case BD_RINGNIBELUNGEN: return 0xa2; /* ニーベルングの指輪 */ - case BD_ROKISWEIL: return 0xa3; /* ロキの叫び */ - case BD_INTOABYSS: return 0xa4; /* 深淵の中に */ - case BD_SIEGFRIED: return 0xa5; /* 不死身のジークフリード */ - case BA_DISSONANCE: return 0xa6; /* 不協和音 */ - case BA_WHISTLE: return 0xa7; /* 口笛 */ - case BA_ASSASSINCROSS: return 0xa8; /* 夕陽のアサシンクロス */ - case BA_POEMBRAGI: return 0xa9; /* ブラギの詩 */ - case BA_APPLEIDUN: return 0xaa; /* イドゥンの林檎 */ - case DC_UGLYDANCE: return 0xab; /* 自分勝手なダンス */ - case DC_HUMMING: return 0xac; /* ハミング */ - case DC_DONTFORGETME: return 0xad; /* 私を忘れないで… */ - case DC_FORTUNEKISS: return 0xae; /* 幸運のキス */ - case DC_SERVICEFORYOU: return 0xaf; /* サービスフォーユー */ - case RG_GRAFFITI: return 0xb0; /* グラフィティ */ - case AM_DEMONSTRATION: return 0xb1; /* デモンストレーション */ - case WE_CALLPARTNER: return 0xb2; /* あなたに逢いたい */ - case PA_GOSPEL: return 0xb3; /* ゴスペル */ - case HP_BASILICA: return 0xb4; /* バジリカ */ - case PF_FOGWALL: return 0xb6; /* フォグウォール */ - case PF_SPIDERWEB: return 0xb7; /* スパイダーウェッブ */ - } - return 0; - /* - 0x89,0x8a,0x8b 表示無し - 0x9a 炎属性の詠唱みたいなエフェクト - 0x9b 水属性の詠唱みたいなエフェクト - 0x9c 風属性の詠唱みたいなエフェクト - 0x9d 白い小さなエフェクト - 0xb1 Alchemist Demonstration - 0xb2 = Pink Warp Portal - 0xb3 = Gospel For Paladin - 0xb4 = Basilica - 0xb5 = Empty - 0xb6 = Fog Wall for Professor - 0xb7 = Spider Web for Professor - 0xb8 = Empty - 0xb9 = - */ + switch (id) + { + case MG_SAFETYWALL: + return 0x7e; /* セイフティウォール */ + case MG_FIREWALL: + return 0x7f; /* ファイアーウォール */ + case AL_WARP: + return (flag == 0) ? 0x81 : 0x80; /* ワープポータル */ + case PR_BENEDICTIO: + return 0x82; /* 聖体降福 */ + case PR_SANCTUARY: + return 0x83; /* サンクチュアリ */ + case PR_MAGNUS: + return 0x84; /* マグヌスエクソシズム */ + case AL_PNEUMA: + return 0x85; /* ニューマ */ + case MG_THUNDERSTORM: + return 0x86; /* サンダーストーム */ + case WZ_HEAVENDRIVE: + return 0x86; /* ヘヴンズドライブ */ + case WZ_SIGHTRASHER: + return 0x86; /* サイトラッシャー */ + case WZ_METEOR: + return 0x86; /* メテオストーム */ + case WZ_VERMILION: + return 0x86; /* ロードオブヴァーミリオン */ + case WZ_FROSTNOVA: + return 0x86; /* フロストノヴァ */ + case WZ_STORMGUST: + return 0x86; /* ストームガスト(とりあえずLoVと同じで処理) */ + case CR_GRANDCROSS: + return 0x86; /* グランドクロス */ + case WZ_FIREPILLAR: + return (flag == 0) ? 0x87 : 0x88; /* ファイアーピラー */ + case HT_TALKIEBOX: + return 0x99; /* トーキーボックス */ + case WZ_ICEWALL: + return 0x8d; /* アイスウォール */ + case WZ_QUAGMIRE: + return 0x8e; /* クァグマイア */ + case HT_BLASTMINE: + return 0x8f; /* ブラストマイン */ + case HT_SKIDTRAP: + return 0x90; /* スキッドトラップ */ + case HT_ANKLESNARE: + return 0x91; /* アンクルスネア */ + case AS_VENOMDUST: + return 0x92; /* ベノムダスト */ + case HT_LANDMINE: + return 0x93; /* ランドマイン */ + case HT_SHOCKWAVE: + return 0x94; /* ショックウェーブトラップ */ + case HT_SANDMAN: + return 0x95; /* サンドマン */ + case HT_FLASHER: + return 0x96; /* フラッシャー */ + case HT_FREEZINGTRAP: + return 0x97; /* フリージングトラップ */ + case HT_CLAYMORETRAP: + return 0x98; /* クレイモアートラップ */ + case SA_VOLCANO: + return 0x9a; /* ボルケーノ */ + case SA_DELUGE: + return 0x9b; /* デリュージ */ + case SA_VIOLENTGALE: + return 0x9c; /* バイオレントゲイル */ + case SA_LANDPROTECTOR: + return 0x9d; /* ランドプロテクター */ + case BD_LULLABY: + return 0x9e; /* 子守歌 */ + case BD_RICHMANKIM: + return 0x9f; /* ニヨルドの宴 */ + case BD_ETERNALCHAOS: + return 0xa0; /* 永遠の混沌 */ + case BD_DRUMBATTLEFIELD: + return 0xa1; /* 戦太鼓の響き */ + case BD_RINGNIBELUNGEN: + return 0xa2; /* ニーベルングの指輪 */ + case BD_ROKISWEIL: + return 0xa3; /* ロキの叫び */ + case BD_INTOABYSS: + return 0xa4; /* 深淵の中に */ + case BD_SIEGFRIED: + return 0xa5; /* 不死身のジークフリード */ + case BA_DISSONANCE: + return 0xa6; /* 不協和音 */ + case BA_WHISTLE: + return 0xa7; /* 口笛 */ + case BA_ASSASSINCROSS: + return 0xa8; /* 夕陽のアサシンクロス */ + case BA_POEMBRAGI: + return 0xa9; /* ブラギの詩 */ + case BA_APPLEIDUN: + return 0xaa; /* イドゥンの林檎 */ + case DC_UGLYDANCE: + return 0xab; /* 自分勝手なダンス */ + case DC_HUMMING: + return 0xac; /* ハミング */ + case DC_DONTFORGETME: + return 0xad; /* 私を忘れないで… */ + case DC_FORTUNEKISS: + return 0xae; /* 幸運のキス */ + case DC_SERVICEFORYOU: + return 0xaf; /* サービスフォーユー */ + case RG_GRAFFITI: + return 0xb0; /* グラフィティ */ + case AM_DEMONSTRATION: + return 0xb1; /* デモンストレーション */ + case WE_CALLPARTNER: + return 0xb2; /* あなたに逢いたい */ + case PA_GOSPEL: + return 0xb3; /* ゴスペル */ + case HP_BASILICA: + return 0xb4; /* バジリカ */ + case PF_FOGWALL: + return 0xb6; /* フォグウォール */ + case PF_SPIDERWEB: + return 0xb7; /* スパイダーウェッブ */ + } + return 0; + /* + * 0x89,0x8a,0x8b 表示無し + * 0x9a 炎属性の詠唱みたいなエフェクト + * 0x9b 水属性の詠唱みたいなエフェクト + * 0x9c 風属性の詠唱みたいなエフェクト + * 0x9d 白い小さなエフェクト + * 0xb1 Alchemist Demonstration + * 0xb2 = Pink Warp Portal + * 0xb3 = Gospel For Paladin + * 0xb4 = Basilica + * 0xb5 = Empty + * 0xb6 = Fog Wall for Professor + * 0xb7 = Spider Web for Professor + * 0xb8 = Empty + * 0xb9 = + */ } /*========================================== * スキル追加効果 *------------------------------------------ */ -int skill_additional_effect( struct block_list* src, struct block_list *bl,int skillid,int skilllv,int attack_type,unsigned int tick) +int skill_additional_effect (struct block_list *src, struct block_list *bl, + int skillid, int skilllv, int attack_type, + unsigned int tick) { - /* MOB追加効果スキル用 */ - const int sc[]={ - SC_POISON, SC_BLIND, SC_SILENCE, SC_STAN, - SC_STONE, SC_CURSE, SC_SLEEP - }; - const int sc2[]={ - MG_STONECURSE,MG_FROSTDIVER,NPC_STUNATTACK, - NPC_SLEEPATTACK,TF_POISON,NPC_CURSEATTACK, - NPC_SILENCEATTACK,0,NPC_BLINDATTACK - }; - - struct map_session_data *sd=NULL; - struct map_session_data *dstsd=NULL; - struct mob_data *md=NULL; - struct mob_data *dstmd=NULL; - - int skill,skill2; - int rate,luk; - - int sc_def_mdef,sc_def_vit,sc_def_int,sc_def_luk; - int sc_def_mdef2,sc_def_vit2,sc_def_int2,sc_def_luk2; - int sc_def_phys_shield_spell; - - nullpo_retr(0, src); - nullpo_retr(0, bl); - - if(skilllv < 0) return 0; - - if(src->type==BL_PC){ - nullpo_retr(0, sd=(struct map_session_data *)src); - }else if(src->type==BL_MOB){ - nullpo_retr(0, md=(struct mob_data *)src); //未使用? - } + /* MOB追加効果スキル用 */ + const int sc[] = { + SC_POISON, SC_BLIND, SC_SILENCE, SC_STAN, + SC_STONE, SC_CURSE, SC_SLEEP + }; + const int sc2[] = { + MG_STONECURSE, MG_FROSTDIVER, NPC_STUNATTACK, + NPC_SLEEPATTACK, TF_POISON, NPC_CURSEATTACK, + NPC_SILENCEATTACK, 0, NPC_BLINDATTACK + }; + + struct map_session_data *sd = NULL; + struct map_session_data *dstsd = NULL; + struct mob_data *md = NULL; + struct mob_data *dstmd = NULL; + + int skill, skill2; + int rate, luk; + + int sc_def_mdef, sc_def_vit, sc_def_int, sc_def_luk; + int sc_def_mdef2, sc_def_vit2, sc_def_int2, sc_def_luk2; + int sc_def_phys_shield_spell; + + nullpo_retr (0, src); + nullpo_retr (0, bl); + + if (skilllv < 0) + return 0; - sc_def_phys_shield_spell = 0; - if (battle_get_sc_data(bl)[SC_PHYS_SHIELD].timer != -1) - sc_def_phys_shield_spell = battle_get_sc_data(bl)[SC_PHYS_SHIELD].val1; - - //対象の耐性 - luk = battle_get_luk(bl); - sc_def_mdef=100 - (3 + battle_get_mdef(bl) + luk/3); - sc_def_vit=100 - (3 + battle_get_vit(bl) + luk/3); - sc_def_int=100 - (3 + battle_get_int(bl) + luk/3); - sc_def_luk=100 - (3 + luk); - //自分の耐性 - luk = battle_get_luk(src); - sc_def_mdef2=100 - (3 + battle_get_mdef(src) + luk/3); - sc_def_vit2=100 - (3 + battle_get_vit(src) + luk/3); - sc_def_int2=100 - (3 + battle_get_int(src) + luk/3); - sc_def_luk2=100 - (3 + luk); - if(bl->type==BL_PC) - dstsd=(struct map_session_data *)bl; - else if(bl->type==BL_MOB){ - dstmd=(struct mob_data *)bl; //未使用? - if(sc_def_mdef>50) - sc_def_mdef=50; - if(sc_def_vit>50) - sc_def_vit=50; - if(sc_def_int>50) - sc_def_int=50; - if(sc_def_luk>50) - sc_def_luk=50; - } - if(sc_def_mdef<0) - sc_def_mdef=0; - if(sc_def_vit<0) - sc_def_vit=0; - if(sc_def_int<0) - sc_def_int=0; - - switch(skillid){ - case 0: /* 通常攻撃 */ - /* 自動鷹 */ - if( sd && pc_isfalcon(sd) && sd->status.weapon == 11 && (skill=pc_checkskill(sd,HT_BLITZBEAT))>0 && - MRAND(1000) <= sd->paramc[5]*10/3+1 ) { - int lv=(sd->status.job_level+9)/10; - skill_castend_damage_id(src,bl,HT_BLITZBEAT,(skill<lv)?skill:lv,tick,0xf00000); - } - // スナッチャー - if(sd && sd->status.weapon != 11 && (skill=pc_checkskill(sd,RG_SNATCHER)) > 0) - if((skill*15 + 55) + (skill2 = pc_checkskill(sd,TF_STEAL))*10 > MRAND(1000)) { - if(pc_steal_item(sd,bl)) - clif_skill_nodamage(src,bl,TF_STEAL,skill2,1); - else - clif_skill_fail(sd,skillid,0,0); - } - break; + if (src->type == BL_PC) + { + nullpo_retr (0, sd = (struct map_session_data *) src); + } + else if (src->type == BL_MOB) + { + nullpo_retr (0, md = (struct mob_data *) src); //未使用? + } + + sc_def_phys_shield_spell = 0; + if (battle_get_sc_data (bl)[SC_PHYS_SHIELD].timer != -1) + sc_def_phys_shield_spell = + battle_get_sc_data (bl)[SC_PHYS_SHIELD].val1; + + //対象の耐性 + luk = battle_get_luk (bl); + sc_def_mdef = 100 - (3 + battle_get_mdef (bl) + luk / 3); + sc_def_vit = 100 - (3 + battle_get_vit (bl) + luk / 3); + sc_def_int = 100 - (3 + battle_get_int (bl) + luk / 3); + sc_def_luk = 100 - (3 + luk); + //自分の耐性 + luk = battle_get_luk (src); + sc_def_mdef2 = 100 - (3 + battle_get_mdef (src) + luk / 3); + sc_def_vit2 = 100 - (3 + battle_get_vit (src) + luk / 3); + sc_def_int2 = 100 - (3 + battle_get_int (src) + luk / 3); + sc_def_luk2 = 100 - (3 + luk); + if (bl->type == BL_PC) + dstsd = (struct map_session_data *) bl; + else if (bl->type == BL_MOB) + { + dstmd = (struct mob_data *) bl; //未使用? + if (sc_def_mdef > 50) + sc_def_mdef = 50; + if (sc_def_vit > 50) + sc_def_vit = 50; + if (sc_def_int > 50) + sc_def_int = 50; + if (sc_def_luk > 50) + sc_def_luk = 50; + } + if (sc_def_mdef < 0) + sc_def_mdef = 0; + if (sc_def_vit < 0) + sc_def_vit = 0; + if (sc_def_int < 0) + sc_def_int = 0; + + switch (skillid) + { + case 0: /* 通常攻撃 */ + /* 自動鷹 */ + if (sd && pc_isfalcon (sd) && sd->status.weapon == 11 + && (skill = pc_checkskill (sd, HT_BLITZBEAT)) > 0 + && MRAND (1000) <= sd->paramc[5] * 10 / 3 + 1) + { + int lv = (sd->status.job_level + 9) / 10; + skill_castend_damage_id (src, bl, HT_BLITZBEAT, + (skill < lv) ? skill : lv, tick, + 0xf00000); + } + // スナッチャー + if (sd && sd->status.weapon != 11 + && (skill = pc_checkskill (sd, RG_SNATCHER)) > 0) + if ((skill * 15 + 55) + + (skill2 = + pc_checkskill (sd, TF_STEAL)) * 10 > MRAND (1000)) + { + if (pc_steal_item (sd, bl)) + clif_skill_nodamage (src, bl, TF_STEAL, skill2, 1); + else + clif_skill_fail (sd, skillid, 0, 0); + } + break; - case SM_BASH: /* バッシュ(急所攻撃) */ - if( sd && (skill=pc_checkskill(sd,SM_FATALBLOW))>0 ){ - if(MRAND(100) < 6*(skilllv-5)*sc_def_vit/100 ) - skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(SM_FATALBLOW,skilllv),0); - } - break; - - case TF_POISON: /* インベナム */ - case AS_SPLASHER: /* ベナムスプラッシャー */ - if(MRAND(100) < (2*skilllv+10)*sc_def_vit/100 ) - skill_status_change_start(bl,SC_POISON,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - else{ - if(sd && skillid==TF_POISON) - clif_skill_fail(sd,skillid,0,0); - } - break; - - case AS_SONICBLOW: /* ソニックブロー */ - if(MRAND(100) < (2*skilllv+10)*sc_def_vit/100 ) - skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - - - case HT_FREEZINGTRAP: /* フリージングトラップ */ - rate=skilllv*3+35; - if(MRAND(100) < rate*sc_def_mdef/100) - skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - - case MG_FROSTDIVER: /* フロストダイバー */ - case WZ_FROSTNOVA: /* フロストノヴァ */ - rate=(skilllv*3+35)*sc_def_mdef/100-(battle_get_int(bl)+battle_get_luk(bl))/15; - rate=rate<=5?5:rate; - if(MRAND(100) < rate) - skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - else if(sd) - clif_skill_fail(sd,skillid,0,0); - break; - - case WZ_STORMGUST: /* ストームガスト */ - { - struct status_change *sc_data = battle_get_sc_data(bl); - if(sc_data) { - sc_data[SC_FREEZE].val3++; - if(sc_data[SC_FREEZE].val3 >= 3) - skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - } - } - break; + case SM_BASH: /* バッシュ(急所攻撃) */ + if (sd && (skill = pc_checkskill (sd, SM_FATALBLOW)) > 0) + { + if (MRAND (100) < 6 * (skilllv - 5) * sc_def_vit / 100) + skill_status_change_start (bl, SC_STAN, skilllv, 0, 0, 0, + skill_get_time2 (SM_FATALBLOW, + skilllv), 0); + } + break; - case HT_LANDMINE: /* ランドマイン */ - if( MRAND(100) < (5*skilllv+30)*sc_def_vit/100 ) - skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; + case TF_POISON: /* インベナム */ + case AS_SPLASHER: /* ベナムスプラッシャー */ + if (MRAND (100) < (2 * skilllv + 10) * sc_def_vit / 100) + skill_status_change_start (bl, SC_POISON, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + else + { + if (sd && skillid == TF_POISON) + clif_skill_fail (sd, skillid, 0, 0); + } + break; - case HT_SHOCKWAVE: /* ショックウェーブトラップ */ - if(map[bl->m].flag.pvp && dstsd){ - dstsd->status.sp -= dstsd->status.sp*(5+15*skilllv)/100; - pc_calcstatus(dstsd,0); - } - break; - case HT_SANDMAN: /* サンドマン */ - if( MRAND(100) < (5*skilllv+30)*sc_def_int/100 ) - skill_status_change_start(bl,SC_SLEEP,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - case TF_SPRINKLESAND: /* 砂まき */ - if( MRAND(100) < 15*sc_def_int/100 ) - skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - - case TF_THROWSTONE: /* 石投げ */ - if( MRAND(100) < 5*sc_def_vit/100 ) - skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - - case CR_HOLYCROSS: /* ホーリークロス */ - if( MRAND(100) < 3*skilllv*sc_def_int/100 ) - skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - - case CR_GRANDCROSS: /* グランドクロス */ - { - int race = battle_get_race(bl); - if( (battle_check_undead(race,battle_get_elem_type(bl)) || race == 6) && MRAND(100) < 100000*sc_def_int/100) //強制付与だが完全耐性には無効 - skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - } - break; - - case CR_SHIELDCHARGE: /* シールドチャージ */ - if( MRAND(100) < (15 + skilllv*5)*sc_def_vit/100 ) - skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - - case RG_RAID: /* サプライズアタック */ - if( MRAND(100) < (10+3*skilllv)*sc_def_vit/100 ) - skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - if( MRAND(100) < (10+3*skilllv)*sc_def_int/100 ) - skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - case BA_FROSTJOKE: - if(MRAND(100) < (15+5*skilllv)*sc_def_mdef/100) - skill_status_change_start(bl,SC_FREEZE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - - case DC_SCREAM: - if( MRAND(100) < (25+5*skilllv)*sc_def_vit/100 ) - skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - - case BD_LULLABY: /* 子守唄 */ - if( MRAND(100) < 15*sc_def_int/100 ) - skill_status_change_start(bl,SC_SLEEP,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - - /* MOBの追加効果付きスキル */ - - case NPC_PETRIFYATTACK: - if(MRAND(100) < sc_def_mdef) - skill_status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - case NPC_POISON: - case NPC_SILENCEATTACK: - case NPC_STUNATTACK: - if (MRAND(100) < 50 - (sc_def_vit >> 2) - (sc_def_phys_shield_spell) + (skilllv >> 2)) - skill_status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skilllv,0); - break; - case NPC_CURSEATTACK: - if(MRAND(100) < sc_def_luk) - skill_status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - case NPC_SLEEPATTACK: - case NPC_BLINDATTACK: - if(MRAND(100) < sc_def_int) - skill_status_change_start(bl,sc[skillid-NPC_POISON],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - case NPC_MENTALBREAKER: - if(dstsd) { - int sp = dstsd->status.max_sp*(10+skilllv)/100; - if(sp < 1) sp = 1; - pc_heal(dstsd,0,-sp); - } - break; + case AS_SONICBLOW: /* ソニックブロー */ + if (MRAND (100) < (2 * skilllv + 10) * sc_def_vit / 100) + skill_status_change_start (bl, SC_STAN, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + + case HT_FREEZINGTRAP: /* フリージングトラップ */ + rate = skilllv * 3 + 35; + if (MRAND (100) < rate * sc_def_mdef / 100) + skill_status_change_start (bl, SC_FREEZE, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + + case MG_FROSTDIVER: /* フロストダイバー */ + case WZ_FROSTNOVA: /* フロストノヴァ */ + rate = + (skilllv * 3 + 35) * sc_def_mdef / 100 - + (battle_get_int (bl) + battle_get_luk (bl)) / 15; + rate = rate <= 5 ? 5 : rate; + if (MRAND (100) < rate) + skill_status_change_start (bl, SC_FREEZE, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + else if (sd) + clif_skill_fail (sd, skillid, 0, 0); + break; + + case WZ_STORMGUST: /* ストームガスト */ + { + struct status_change *sc_data = battle_get_sc_data (bl); + if (sc_data) + { + sc_data[SC_FREEZE].val3++; + if (sc_data[SC_FREEZE].val3 >= 3) + skill_status_change_start (bl, SC_FREEZE, skilllv, 0, 0, + 0, skill_get_time2 (skillid, + skilllv), + 0); + } + } + break; + + case HT_LANDMINE: /* ランドマイン */ + if (MRAND (100) < (5 * skilllv + 30) * sc_def_vit / 100) + skill_status_change_start (bl, SC_STAN, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + + case HT_SHOCKWAVE: /* ショックウェーブトラップ */ + if (map[bl->m].flag.pvp && dstsd) + { + dstsd->status.sp -= + dstsd->status.sp * (5 + 15 * skilllv) / 100; + pc_calcstatus (dstsd, 0); + } + break; + case HT_SANDMAN: /* サンドマン */ + if (MRAND (100) < (5 * skilllv + 30) * sc_def_int / 100) + skill_status_change_start (bl, SC_SLEEP, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + case TF_SPRINKLESAND: /* 砂まき */ + if (MRAND (100) < 15 * sc_def_int / 100) + skill_status_change_start (bl, SC_BLIND, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + + case TF_THROWSTONE: /* 石投げ */ + if (MRAND (100) < 5 * sc_def_vit / 100) + skill_status_change_start (bl, SC_STAN, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + + case CR_HOLYCROSS: /* ホーリークロス */ + if (MRAND (100) < 3 * skilllv * sc_def_int / 100) + skill_status_change_start (bl, SC_BLIND, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + + case CR_GRANDCROSS: /* グランドクロス */ + { + int race = battle_get_race (bl); + if ((battle_check_undead (race, battle_get_elem_type (bl)) || race == 6) && MRAND (100) < 100000 * sc_def_int / 100) //強制付与だが完全耐性には無効 + skill_status_change_start (bl, SC_BLIND, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + } + break; + + case CR_SHIELDCHARGE: /* シールドチャージ */ + if (MRAND (100) < (15 + skilllv * 5) * sc_def_vit / 100) + skill_status_change_start (bl, SC_STAN, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + + case RG_RAID: /* サプライズアタック */ + if (MRAND (100) < (10 + 3 * skilllv) * sc_def_vit / 100) + skill_status_change_start (bl, SC_STAN, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + if (MRAND (100) < (10 + 3 * skilllv) * sc_def_int / 100) + skill_status_change_start (bl, SC_BLIND, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + case BA_FROSTJOKE: + if (MRAND (100) < (15 + 5 * skilllv) * sc_def_mdef / 100) + skill_status_change_start (bl, SC_FREEZE, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + + case DC_SCREAM: + if (MRAND (100) < (25 + 5 * skilllv) * sc_def_vit / 100) + skill_status_change_start (bl, SC_STAN, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + + case BD_LULLABY: /* 子守唄 */ + if (MRAND (100) < 15 * sc_def_int / 100) + skill_status_change_start (bl, SC_SLEEP, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + + /* MOBの追加効果付きスキル */ + + case NPC_PETRIFYATTACK: + if (MRAND (100) < sc_def_mdef) + skill_status_change_start (bl, sc[skillid - NPC_POISON], + skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + case NPC_POISON: + case NPC_SILENCEATTACK: + case NPC_STUNATTACK: + if (MRAND (100) < + 50 - (sc_def_vit >> 2) - (sc_def_phys_shield_spell) + + (skilllv >> 2)) + skill_status_change_start (bl, sc[skillid - NPC_POISON], + skilllv, 0, 0, 0, skilllv, 0); + break; + case NPC_CURSEATTACK: + if (MRAND (100) < sc_def_luk) + skill_status_change_start (bl, sc[skillid - NPC_POISON], + skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + case NPC_SLEEPATTACK: + case NPC_BLINDATTACK: + if (MRAND (100) < sc_def_int) + skill_status_change_start (bl, sc[skillid - NPC_POISON], + skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + case NPC_MENTALBREAKER: + if (dstsd) + { + int sp = dstsd->status.max_sp * (10 + skilllv) / 100; + if (sp < 1) + sp = 1; + pc_heal (dstsd, 0, -sp); + } + break; // -- moonsoul (adding status effect chance given to wizard aoe skills meteor and vermillion) // - case WZ_METEOR: - if(MRAND(100) < sc_def_vit) - skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - case WZ_VERMILION: - if(MRAND(100) < sc_def_int) - skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; + case WZ_METEOR: + if (MRAND (100) < sc_def_vit) + skill_status_change_start (bl, SC_STAN, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + case WZ_VERMILION: + if (MRAND (100) < sc_def_int) + skill_status_change_start (bl, SC_BLIND, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; // -- moonsoul (stun ability of new champion skill tigerfist) // - case CH_TIGERFIST: - if( MRAND(100) < (5 + skilllv*5)*sc_def_vit/100 ) - skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - - case LK_SPIRALPIERCE: - if( MRAND(100) < (15 + skilllv*5)*sc_def_vit/100 ) - skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - case ST_REJECTSWORD: /* フリージングトラップ */ - if( MRAND(100) < (10 + skilllv*5) ) - skill_status_change_start(bl,SC_AUTOCOUNTER,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - case PF_FOGWALL: /* ホーリークロス */ - if( MRAND(100) < 3*skilllv*sc_def_int/100 ) - skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - case LK_HEADCRUSH: /* ヘッドクラッシュ */ - {//条件が良く分からないので適当に - int race=battle_get_race(bl); - if( !(battle_check_undead(race,battle_get_elem_type(bl)) || race == 6) && MRAND(100) < (2*skilllv+10)*sc_def_vit/100 ) - skill_status_change_start(bl,SC_HEADCRUSH,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - } - break; - case LK_JOINTBEAT: /* ジョイントビート */ - //条件が良く分からないので適当に - if( MRAND(100) < (2*skilllv+10)*sc_def_vit/100 ) - skill_status_change_start(bl,SC_JOINTBEAT,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - case PF_SPIDERWEB: /* スパイダーウェッブ */ - { - int sec=skill_get_time2(skillid,skilllv); - if(map[src->m].flag.pvp) //PvPでは拘束時間半減? - sec = sec/2; - battle_stopwalking(bl,1); - skill_status_change_start(bl,SC_SPIDERWEB,skilllv,0,0,0,sec,0); - } - break; - case ASC_METEORASSAULT: /* メテオアサルト */ - if( MRAND(100) < (15 + skilllv*5)*sc_def_vit/100 ) //状態異常は詳細が分からないので適当に - skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - if( MRAND(100) < (10+3*skilllv)*sc_def_int/100 ) - skill_status_change_start(bl,SC_BLIND,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - case MO_EXTREMITYFIST: /* 阿修羅覇凰拳 */ - //阿修羅を使うと5分間自然回復しないようになる - skill_status_change_start(src,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time2(skillid,skilllv),0 ); - break; - } + case CH_TIGERFIST: + if (MRAND (100) < (5 + skilllv * 5) * sc_def_vit / 100) + skill_status_change_start (bl, SC_STAN, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; - if(sd && skillid != MC_CARTREVOLUTION && attack_type&BF_WEAPON){ /* カードによる追加効果 */ - int i; - int sc_def_card=100; - - for(i=SC_STONE;i<=SC_BLIND;i++){ - //対象に状態異常 - if(i==SC_STONE || i==SC_FREEZE) - sc_def_card=sc_def_mdef; - else if(i==SC_STAN || i==SC_POISON || i==SC_SILENCE) - sc_def_card=sc_def_vit; - else if(i==SC_SLEEP || i==SC_CONFUSION || i==SC_BLIND) - sc_def_card=sc_def_int; - else if(i==SC_CURSE) - sc_def_card=sc_def_luk; - - if(!sd->state.arrow_atk) { - if(MRAND(10000) < (sd->addeff[i-SC_STONE])*sc_def_card/100 ){ - if(battle_config.battle_log) - printf("PC %d skill_addeff: cardによる異常発動 %d %d\n",sd->bl.id,i,sd->addeff[i-SC_STONE]); - skill_status_change_start(bl,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[i-SC_STONE],7),0); - } - } - else { - if(MRAND(10000) < (sd->addeff[i-SC_STONE]+sd->arrow_addeff[i-SC_STONE])*sc_def_card/100 ){ - if(battle_config.battle_log) - printf("PC %d skill_addeff: cardによる異常発動 %d %d\n",sd->bl.id,i,sd->addeff[i-SC_STONE]); - skill_status_change_start(bl,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[i-SC_STONE],7),0); - } - } - //自分に状態異常 - if(i==SC_STONE || i==SC_FREEZE) - sc_def_card=sc_def_mdef2; - else if(i==SC_STAN || i==SC_POISON || i==SC_SILENCE) - sc_def_card=sc_def_vit2; - else if(i==SC_SLEEP || i==SC_CONFUSION || i==SC_BLIND) - sc_def_card=sc_def_int2; - else if(i==SC_CURSE) - sc_def_card=sc_def_luk2; - - if(!sd->state.arrow_atk) { - if(MRAND(10000) < (sd->addeff2[i-SC_STONE])*sc_def_card/100 ){ - if(battle_config.battle_log) - printf("PC %d skill_addeff: cardによる異常発動 %d %d\n",src->id,i,sd->addeff2[i-SC_STONE]); - skill_status_change_start(src,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[i-SC_STONE],7),0); - } - } - else { - if(MRAND(10000) < (sd->addeff2[i-SC_STONE]+sd->arrow_addeff2[i-SC_STONE])*sc_def_card/100 ){ - if(battle_config.battle_log) - printf("PC %d skill_addeff: cardによる異常発動 %d %d\n",src->id,i,sd->addeff2[i-SC_STONE]); - skill_status_change_start(src,i,7,0,0,0,(i==SC_CONFUSION)? 10000+7000:skill_get_time2(sc2[i-SC_STONE],7),0); - } - } - } - } - return 0; + case LK_SPIRALPIERCE: + if (MRAND (100) < (15 + skilllv * 5) * sc_def_vit / 100) + skill_status_change_start (bl, SC_STAN, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + case ST_REJECTSWORD: /* フリージングトラップ */ + if (MRAND (100) < (10 + skilllv * 5)) + skill_status_change_start (bl, SC_AUTOCOUNTER, skilllv, 0, 0, + 0, skill_get_time2 (skillid, + skilllv), 0); + break; + case PF_FOGWALL: /* ホーリークロス */ + if (MRAND (100) < 3 * skilllv * sc_def_int / 100) + skill_status_change_start (bl, SC_BLIND, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + case LK_HEADCRUSH: /* ヘッドクラッシュ */ + { //条件が良く分からないので適当に + int race = battle_get_race (bl); + if (! + (battle_check_undead (race, battle_get_elem_type (bl)) + || race == 6) + && MRAND (100) < (2 * skilllv + 10) * sc_def_vit / 100) + skill_status_change_start (bl, SC_HEADCRUSH, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + } + break; + case LK_JOINTBEAT: /* ジョイントビート */ + //条件が良く分からないので適当に + if (MRAND (100) < (2 * skilllv + 10) * sc_def_vit / 100) + skill_status_change_start (bl, SC_JOINTBEAT, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + case PF_SPIDERWEB: /* スパイダーウェッブ */ + { + int sec = skill_get_time2 (skillid, skilllv); + if (map[src->m].flag.pvp) //PvPでは拘束時間半減? + sec = sec / 2; + battle_stopwalking (bl, 1); + skill_status_change_start (bl, SC_SPIDERWEB, skilllv, 0, 0, 0, + sec, 0); + } + break; + case ASC_METEORASSAULT: /* メテオアサルト */ + if (MRAND (100) < (15 + skilllv * 5) * sc_def_vit / 100) //状態異常は詳細が分からないので適当に + skill_status_change_start (bl, SC_STAN, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + if (MRAND (100) < (10 + 3 * skilllv) * sc_def_int / 100) + skill_status_change_start (bl, SC_BLIND, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + case MO_EXTREMITYFIST: /* 阿修羅覇凰拳 */ + //阿修羅を使うと5分間自然回復しないようになる + skill_status_change_start (src, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), 0); + break; + } + + if (sd && skillid != MC_CARTREVOLUTION && attack_type & BF_WEAPON) + { /* カードによる追加効果 */ + int i; + int sc_def_card = 100; + + for (i = SC_STONE; i <= SC_BLIND; i++) + { + //対象に状態異常 + if (i == SC_STONE || i == SC_FREEZE) + sc_def_card = sc_def_mdef; + else if (i == SC_STAN || i == SC_POISON || i == SC_SILENCE) + sc_def_card = sc_def_vit; + else if (i == SC_SLEEP || i == SC_CONFUSION || i == SC_BLIND) + sc_def_card = sc_def_int; + else if (i == SC_CURSE) + sc_def_card = sc_def_luk; + + if (!sd->state.arrow_atk) + { + if (MRAND (10000) < + (sd->addeff[i - SC_STONE]) * sc_def_card / 100) + { + if (battle_config.battle_log) + printf + ("PC %d skill_addeff: cardによる異常発動 %d %d\n", + sd->bl.id, i, sd->addeff[i - SC_STONE]); + skill_status_change_start (bl, i, 7, 0, 0, 0, + (i == + SC_CONFUSION) ? 10000 + + 7000 : + skill_get_time2 (sc2 + [i - + SC_STONE], + 7), 0); + } + } + else + { + if (MRAND (10000) < + (sd->addeff[i - SC_STONE] + + sd->arrow_addeff[i - SC_STONE]) * sc_def_card / 100) + { + if (battle_config.battle_log) + printf + ("PC %d skill_addeff: cardによる異常発動 %d %d\n", + sd->bl.id, i, sd->addeff[i - SC_STONE]); + skill_status_change_start (bl, i, 7, 0, 0, 0, + (i == + SC_CONFUSION) ? 10000 + + 7000 : + skill_get_time2 (sc2 + [i - + SC_STONE], + 7), 0); + } + } + //自分に状態異常 + if (i == SC_STONE || i == SC_FREEZE) + sc_def_card = sc_def_mdef2; + else if (i == SC_STAN || i == SC_POISON || i == SC_SILENCE) + sc_def_card = sc_def_vit2; + else if (i == SC_SLEEP || i == SC_CONFUSION || i == SC_BLIND) + sc_def_card = sc_def_int2; + else if (i == SC_CURSE) + sc_def_card = sc_def_luk2; + + if (!sd->state.arrow_atk) + { + if (MRAND (10000) < + (sd->addeff2[i - SC_STONE]) * sc_def_card / 100) + { + if (battle_config.battle_log) + printf + ("PC %d skill_addeff: cardによる異常発動 %d %d\n", + src->id, i, sd->addeff2[i - SC_STONE]); + skill_status_change_start (src, i, 7, 0, 0, 0, + (i == + SC_CONFUSION) ? 10000 + + 7000 : + skill_get_time2 (sc2 + [i - + SC_STONE], + 7), 0); + } + } + else + { + if (MRAND (10000) < + (sd->addeff2[i - SC_STONE] + + sd->arrow_addeff2[i - SC_STONE]) * sc_def_card / 100) + { + if (battle_config.battle_log) + printf + ("PC %d skill_addeff: cardによる異常発動 %d %d\n", + src->id, i, sd->addeff2[i - SC_STONE]); + skill_status_change_start (src, i, 7, 0, 0, 0, + (i == + SC_CONFUSION) ? 10000 + + 7000 : + skill_get_time2 (sc2 + [i - + SC_STONE], + 7), 0); + } + } + } + } + return 0; } /*========================================================================= スキル攻撃吹き飛ばし処理 -------------------------------------------------------------------------*/ -int skill_blown( struct block_list *src, struct block_list *target,int count) +int skill_blown (struct block_list *src, struct block_list *target, int count) { - int dx=0,dy=0,nx,ny; - int x=target->x,y=target->y; - int ret,prev_state=MS_IDLE; - int moveblock; - struct map_session_data *sd=NULL; - struct mob_data *md=NULL; - struct skill_unit *su=NULL; - - nullpo_retr(0, src); - nullpo_retr(0, target); - - if(target->type==BL_PC){ - nullpo_retr(0, sd=(struct map_session_data *)target); - }else if(target->type==BL_MOB){ - nullpo_retr(0, md=(struct mob_data *)target); - }else if(target->type==BL_SKILL){ - nullpo_retr(0, su=(struct skill_unit *)target); - }else return 0; - - if(!(count&0x10000 && (sd||md||su))){ /* 指定なしなら位置関係から方向を求める */ - dx=target->x-src->x; dx=(dx>0)?1:((dx<0)?-1: 0); - dy=target->y-src->y; dy=(dy>0)?1:((dy<0)?-1: 0); - } - if(dx==0 && dy==0){ - int dir=battle_get_dir(target); - if(dir>=0 && dir<8){ - dx=-dirx[dir]; - dy=-diry[dir]; - } - } + int dx = 0, dy = 0, nx, ny; + int x = target->x, y = target->y; + int ret, prev_state = MS_IDLE; + int moveblock; + struct map_session_data *sd = NULL; + struct mob_data *md = NULL; + struct skill_unit *su = NULL; + + nullpo_retr (0, src); + nullpo_retr (0, target); + + if (target->type == BL_PC) + { + nullpo_retr (0, sd = (struct map_session_data *) target); + } + else if (target->type == BL_MOB) + { + nullpo_retr (0, md = (struct mob_data *) target); + } + else if (target->type == BL_SKILL) + { + nullpo_retr (0, su = (struct skill_unit *) target); + } + else + return 0; - ret=path_blownpos(target->m,x,y,dx,dy,count&0xffff); - nx=ret>>16; - ny=ret&0xffff; - moveblock=( x/BLOCK_SIZE != nx/BLOCK_SIZE || y/BLOCK_SIZE != ny/BLOCK_SIZE); - - if(count&0x20000) { - battle_stopwalking(target,1); - if(sd){ - sd->to_x=nx; - sd->to_y=ny; - sd->walktimer = 1; - clif_walkok(sd); - clif_movechar(sd); - } - else if(md) { - md->to_x=nx; - md->to_y=ny; - prev_state = md->state.state; - md->state.state = MS_WALK; - clif_fixmobpos(md); - } - } - else - battle_stopwalking(target,2); - - dx = nx - x; - dy = ny - y; - - if(sd) /* 画面外に出たので消去 */ - map_foreachinmovearea(clif_pcoutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,0,sd); - else if(md) - map_foreachinmovearea(clif_moboutsight,target->m,x-AREA_SIZE,y-AREA_SIZE,x+AREA_SIZE,y+AREA_SIZE,dx,dy,BL_PC,md); - - if(su){ - skill_unit_move_unit_group(su->group,target->m,dx,dy); - }else{ -// struct status_change *sc_data=battle_get_sc_data(target); - if(moveblock) map_delblock(target); - target->x=nx; - target->y=ny; - if(moveblock) map_addblock(target); + if (!(count & 0x10000 && (sd || md || su))) + { /* 指定なしなら位置関係から方向を求める */ + dx = target->x - src->x; + dx = (dx > 0) ? 1 : ((dx < 0) ? -1 : 0); + dy = target->y - src->y; + dy = (dy > 0) ? 1 : ((dy < 0) ? -1 : 0); + } + if (dx == 0 && dy == 0) + { + int dir = battle_get_dir (target); + if (dir >= 0 && dir < 8) + { + dx = -dirx[dir]; + dy = -diry[dir]; + } + } + + ret = path_blownpos (target->m, x, y, dx, dy, count & 0xffff); + nx = ret >> 16; + ny = ret & 0xffff; + moveblock = (x / BLOCK_SIZE != nx / BLOCK_SIZE + || y / BLOCK_SIZE != ny / BLOCK_SIZE); + + if (count & 0x20000) + { + battle_stopwalking (target, 1); + if (sd) + { + sd->to_x = nx; + sd->to_y = ny; + sd->walktimer = 1; + clif_walkok (sd); + clif_movechar (sd); + } + else if (md) + { + md->to_x = nx; + md->to_y = ny; + prev_state = md->state.state; + md->state.state = MS_WALK; + clif_fixmobpos (md); + } + } + else + battle_stopwalking (target, 2); + + dx = nx - x; + dy = ny - y; + + if (sd) /* 画面外に出たので消去 */ + map_foreachinmovearea (clif_pcoutsight, target->m, x - AREA_SIZE, + y - AREA_SIZE, x + AREA_SIZE, y + AREA_SIZE, + dx, dy, 0, sd); + else if (md) + map_foreachinmovearea (clif_moboutsight, target->m, x - AREA_SIZE, + y - AREA_SIZE, x + AREA_SIZE, y + AREA_SIZE, + dx, dy, BL_PC, md); + + if (su) + { + skill_unit_move_unit_group (su->group, target->m, dx, dy); + } + else + { +// struct status_change *sc_data=battle_get_sc_data(target); + if (moveblock) + map_delblock (target); + target->x = nx; + target->y = ny; + if (moveblock) + map_addblock (target); /*ダンス中にエフェクトは移動しないらしい if(sc_data && sc_data[SC_DANCING].timer!=-1){ //対象がダンス中なのでエフェクトも移動 struct skill_unit_group *sg=(struct skill_unit_group *)sc_data[SC_DANCING].val2; @@ -1312,25 +1639,30 @@ int skill_blown( struct block_list *src, struct block_list *target,int count) skill_unit_move_unit_group(sg,target->m,dx,dy); } */ - } - - if(sd) { /* 画面内に入ってきたので表示 */ - map_foreachinmovearea(clif_pcinsight,target->m,nx-AREA_SIZE,ny-AREA_SIZE,nx+AREA_SIZE,ny+AREA_SIZE,-dx,-dy,0,sd); - if(count&0x20000) - sd->walktimer = -1; - } - else if(md) { - map_foreachinmovearea(clif_mobinsight,target->m,nx-AREA_SIZE,ny-AREA_SIZE,nx+AREA_SIZE,ny+AREA_SIZE,-dx,-dy,BL_PC,md); - if(count&0x20000) - md->state.state = prev_state; - } - - skill_unit_move(target,gettick(),(count&0xffff)+7); /* スキルユニットの判定 */ - - return 0; + } + + if (sd) + { /* 画面内に入ってきたので表示 */ + map_foreachinmovearea (clif_pcinsight, target->m, nx - AREA_SIZE, + ny - AREA_SIZE, nx + AREA_SIZE, ny + AREA_SIZE, + -dx, -dy, 0, sd); + if (count & 0x20000) + sd->walktimer = -1; + } + else if (md) + { + map_foreachinmovearea (clif_mobinsight, target->m, nx - AREA_SIZE, + ny - AREA_SIZE, nx + AREA_SIZE, ny + AREA_SIZE, + -dx, -dy, BL_PC, md); + if (count & 0x20000) + md->state.state = prev_state; + } + + skill_unit_move (target, gettick (), (count & 0xffff) + 7); /* スキルユニットの判定 */ + + return 0; } - /* * ========================================================================= * スキル攻撃効果処理まとめ @@ -1343,237 +1675,295 @@ int skill_blown( struct block_list *src, struct block_list *target,int count) *------------------------------------------------------------------------- */ -int skill_attack( int attack_type, struct block_list* src, struct block_list *dsrc, - struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag ) +int skill_attack (int attack_type, struct block_list *src, + struct block_list *dsrc, struct block_list *bl, int skillid, + int skilllv, unsigned int tick, int flag) { - struct Damage dmg; - struct status_change *sc_data; - int type,lv,damage; + struct Damage dmg; + struct status_change *sc_data; + int type, lv, damage; - rdamage = 0; - nullpo_retr(0, src); - nullpo_retr(0, dsrc); - nullpo_retr(0, bl); + rdamage = 0; + nullpo_retr (0, src); + nullpo_retr (0, dsrc); + nullpo_retr (0, bl); - sc_data = battle_get_sc_data(bl); + sc_data = battle_get_sc_data (bl); //何もしない判定ここから - if(dsrc->m != bl->m) //対象が同じマップにいなければ何もしない - return 0; - if(src->prev == NULL || dsrc->prev == NULL || bl->prev == NULL) //prevよくわからない※ - return 0; - if(src->type == BL_PC && pc_isdead((struct map_session_data *)src)) //術者?がPCですでに死んでいたら何もしない - return 0; - if(dsrc->type == BL_PC && pc_isdead((struct map_session_data *)dsrc)) //術者?がPCですでに死んでいたら何もしない - return 0; - if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) //対象がPCですでに死んでいたら何もしない - return 0; - if(skillnotok(skillid, (struct map_session_data *) bl)) - return 0; // [MouseJstr] - if(sc_data && sc_data[SC_HIDING].timer != -1) { //ハイディング状態で - if(skill_get_pl(skillid) != 2) //スキルの属性が地属性でなければ何もしない - return 0; - } - if(sc_data && sc_data[SC_TRICKDEAD].timer != -1) //死んだふり中は何もしない - return 0; - if(skillid == WZ_STORMGUST) { //使用スキルがストームガストで - if(sc_data && sc_data[SC_FREEZE].timer != -1) //凍結状態なら何もしない - return 0; - } - if(skillid == WZ_FROSTNOVA && dsrc->x == bl->x && dsrc->y == bl->y) //使用スキルがフロストノヴァで、dsrcとblが同じ場所なら何もしない - return 0; - if(src->type == BL_PC && ((struct map_session_data *)src)->chatID) //術者がPCでチャット中なら何もしない - return 0; - if(dsrc->type == BL_PC && ((struct map_session_data *)dsrc)->chatID) //術者がPCでチャット中なら何もしない - return 0; - if(src->type == BL_PC && bl && mob_gvmobcheck(((struct map_session_data *)src),bl)==0) - return 0; + if (dsrc->m != bl->m) //対象が同じマップにいなければ何もしない + return 0; + if (src->prev == NULL || dsrc->prev == NULL || bl->prev == NULL) //prevよくわからない※ + return 0; + if (src->type == BL_PC && pc_isdead ((struct map_session_data *) src)) //術者?がPCですでに死んでいたら何もしない + return 0; + if (dsrc->type == BL_PC && pc_isdead ((struct map_session_data *) dsrc)) //術者?がPCですでに死んでいたら何もしない + return 0; + if (bl->type == BL_PC && pc_isdead ((struct map_session_data *) bl)) //対象がPCですでに死んでいたら何もしない + return 0; + if (skillnotok (skillid, (struct map_session_data *) bl)) + return 0; // [MouseJstr] + if (sc_data && sc_data[SC_HIDING].timer != -1) + { //ハイディング状態で + if (skill_get_pl (skillid) != 2) //スキルの属性が地属性でなければ何もしない + return 0; + } + if (sc_data && sc_data[SC_TRICKDEAD].timer != -1) //死んだふり中は何もしない + return 0; + if (skillid == WZ_STORMGUST) + { //使用スキルがストームガストで + if (sc_data && sc_data[SC_FREEZE].timer != -1) //凍結状態なら何もしない + return 0; + } + if (skillid == WZ_FROSTNOVA && dsrc->x == bl->x && dsrc->y == bl->y) //使用スキルがフロストノヴァで、dsrcとblが同じ場所なら何もしない + return 0; + if (src->type == BL_PC && ((struct map_session_data *) src)->chatID) //術者がPCでチャット中なら何もしない + return 0; + if (dsrc->type == BL_PC && ((struct map_session_data *) dsrc)->chatID) //術者がPCでチャット中なら何もしない + return 0; + if (src->type == BL_PC && bl + && mob_gvmobcheck (((struct map_session_data *) src), bl) == 0) + return 0; //何もしない判定ここまで - type=-1; - lv=(flag>>20)&0xf; - dmg=battle_calc_attack(attack_type,src,bl,skillid,skilllv,flag&0xff ); //ダメージ計算 + type = -1; + lv = (flag >> 20) & 0xf; + dmg = battle_calc_attack (attack_type, src, bl, skillid, skilllv, flag & 0xff); //ダメージ計算 //マジックロッド処理ここから - if(attack_type&BF_MAGIC && sc_data && sc_data[SC_MAGICROD].timer != -1 && src == dsrc) { //魔法攻撃でマジックロッド状態でsrc=dsrcなら - dmg.damage = dmg.damage2 = 0; //ダメージ0 - if(bl->type == BL_PC) { //対象がPCの場合 - int sp = skill_get_sp(skillid,skilllv); //使用されたスキルのSPを吸収 - sp = sp * sc_data[SC_MAGICROD].val2 / 100; //吸収率計算 - if(skillid == WZ_WATERBALL && skilllv > 1) //ウォーターボールLv1以上 - sp = sp/((skilllv|1)*(skilllv|1)); //さらに計算? - if(sp > 0x7fff) sp = 0x7fff; //SP多すぎの場合は理論最大値 - else if(sp < 1) sp = 1; //1以下の場合は1 - if(((struct map_session_data *)bl)->status.sp + sp > ((struct map_session_data *)bl)->status.max_sp) { //回復SP+現在のSPがMSPより大きい場合 - sp = ((struct map_session_data *)bl)->status.max_sp - ((struct map_session_data *)bl)->status.sp; //SPをMSP-現在SPにする - ((struct map_session_data *)bl)->status.sp = ((struct map_session_data *)bl)->status.max_sp; //現在のSPにMSPを代入 - } - else //回復SP+現在のSPがMSPより小さい場合は回復SPを加算 - ((struct map_session_data *)bl)->status.sp += sp; - clif_heal(((struct map_session_data *)bl)->fd,SP_SP,sp); //SP回復エフェクトの表示 - ((struct map_session_data *)bl)->canact_tick = tick + skill_delayfix(bl, skill_get_delay(SA_MAGICROD,sc_data[SC_MAGICROD].val1)); // - } - clif_skill_nodamage(bl,bl,SA_MAGICROD,sc_data[SC_MAGICROD].val1,1); //マジックロッドエフェクトを表示 - } + if (attack_type & BF_MAGIC && sc_data && sc_data[SC_MAGICROD].timer != -1 + && src == dsrc) + { //魔法攻撃でマジックロッド状態でsrc=dsrcなら + dmg.damage = dmg.damage2 = 0; //ダメージ0 + if (bl->type == BL_PC) + { //対象がPCの場合 + int sp = skill_get_sp (skillid, skilllv); //使用されたスキルのSPを吸収 + sp = sp * sc_data[SC_MAGICROD].val2 / 100; //吸収率計算 + if (skillid == WZ_WATERBALL && skilllv > 1) //ウォーターボールLv1以上 + sp = sp / ((skilllv | 1) * (skilllv | 1)); //さらに計算? + if (sp > 0x7fff) + sp = 0x7fff; //SP多すぎの場合は理論最大値 + else if (sp < 1) + sp = 1; //1以下の場合は1 + if (((struct map_session_data *) bl)->status.sp + sp > + ((struct map_session_data *) bl)->status.max_sp) + { //回復SP+現在のSPがMSPより大きい場合 + sp = ((struct map_session_data *) bl)->status.max_sp - ((struct map_session_data *) bl)->status.sp; //SPをMSP-現在SPにする + ((struct map_session_data *) bl)->status.sp = ((struct map_session_data *) bl)->status.max_sp; //現在のSPにMSPを代入 + } + else //回復SP+現在のSPがMSPより小さい場合は回復SPを加算 + ((struct map_session_data *) bl)->status.sp += sp; + clif_heal (((struct map_session_data *) bl)->fd, SP_SP, sp); //SP回復エフェクトの表示 + ((struct map_session_data *) bl)->canact_tick = tick + skill_delayfix (bl, skill_get_delay (SA_MAGICROD, sc_data[SC_MAGICROD].val1)); // + } + clif_skill_nodamage (bl, bl, SA_MAGICROD, sc_data[SC_MAGICROD].val1, 1); //マジックロッドエフェクトを表示 + } //マジックロッド処理ここまで - damage = dmg.damage + dmg.damage2; + damage = dmg.damage + dmg.damage2; - if(lv==15) - lv=-1; + if (lv == 15) + lv = -1; - if( flag&0xff00 ) - type=(flag&0xff00)>>8; + if (flag & 0xff00) + type = (flag & 0xff00) >> 8; - if(damage <= 0 || damage < dmg.div_) //吹き飛ばし判定?※ - dmg.blewcount = 0; + if (damage <= 0 || damage < dmg.div_) //吹き飛ばし判定?※ + dmg.blewcount = 0; - if(skillid == CR_GRANDCROSS) {//グランドクロス - if(battle_config.gx_disptype) dsrc = src; // 敵ダメージ白文字表示 - if( src == bl) type = 4; // 反動はダメージモーションなし - } + if (skillid == CR_GRANDCROSS) + { //グランドクロス + if (battle_config.gx_disptype) + dsrc = src; // 敵ダメージ白文字表示 + if (src == bl) + type = 4; // 反動はダメージモーションなし + } //使用者がPCの場合の処理ここから - if(src->type == BL_PC) { - struct map_session_data *sd = (struct map_session_data *)src; - nullpo_retr(0, sd); + if (src->type == BL_PC) + { + struct map_session_data *sd = (struct map_session_data *) src; + nullpo_retr (0, sd); //連打掌(MO_CHAINCOMBO)ここから - if(skillid == MO_CHAINCOMBO) { - int delay = 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src); //基本ディレイの計算 - if(damage < battle_get_hp(bl)) { //ダメージが対象のHPより小さい場合 - if(pc_checkskill(sd, MO_COMBOFINISH) > 0 && sd->spiritball > 0) //猛龍拳(MO_COMBOFINISH)取得&気球保持時は+300ms - delay += 300 * battle_config.combo_delay_rate /100; //追加ディレイをconfにより調整 - - skill_status_change_start(src,SC_COMBO,MO_CHAINCOMBO,skilllv,0,0,delay,0); //コンボ状態に - } - sd->attackabletime = sd->canmove_tick = tick + delay; - clif_combo_delay(src,delay); //コンボディレイパケットの送信 - } + if (skillid == MO_CHAINCOMBO) + { + int delay = 1000 - 4 * battle_get_agi (src) - 2 * battle_get_dex (src); //基本ディレイの計算 + if (damage < battle_get_hp (bl)) + { //ダメージが対象のHPより小さい場合 + if (pc_checkskill (sd, MO_COMBOFINISH) > 0 && sd->spiritball > 0) //猛龍拳(MO_COMBOFINISH)取得&気球保持時は+300ms + delay += 300 * battle_config.combo_delay_rate / 100; //追加ディレイをconfにより調整 + + skill_status_change_start (src, SC_COMBO, MO_CHAINCOMBO, skilllv, 0, 0, delay, 0); //コンボ状態に + } + sd->attackabletime = sd->canmove_tick = tick + delay; + clif_combo_delay (src, delay); //コンボディレイパケットの送信 + } //連打掌(MO_CHAINCOMBO)ここまで //猛龍拳(MO_COMBOFINISH)ここから - else if(skillid == MO_COMBOFINISH) { - int delay = 700 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src); - if(damage < battle_get_hp(bl)) { - //阿修羅覇凰拳(MO_EXTREMITYFIST)取得&気球4個保持&爆裂波動(MO_EXPLOSIONSPIRITS)状態時は+300ms - //伏虎拳(CH_TIGERFIST)取得時も+300ms - if((pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball >= 4 && sd->sc_data[SC_EXPLOSIONSPIRITS].timer != -1) || - (pc_checkskill(sd, CH_TIGERFIST) > 0 && sd->spiritball > 0) || - (pc_checkskill(sd, CH_CHAINCRUSH) > 0 && sd->spiritball > 1)) - delay += 300 * battle_config.combo_delay_rate /100; //追加ディレイをconfにより調整 - - skill_status_change_start(src,SC_COMBO,MO_COMBOFINISH,skilllv,0,0,delay,0); //コンボ状態に - } - sd->attackabletime = sd->canmove_tick = tick + delay; - clif_combo_delay(src,delay); //コンボディレイパケットの送信 - } + else if (skillid == MO_COMBOFINISH) + { + int delay = + 700 - 4 * battle_get_agi (src) - 2 * battle_get_dex (src); + if (damage < battle_get_hp (bl)) + { + //阿修羅覇凰拳(MO_EXTREMITYFIST)取得&気球4個保持&爆裂波動(MO_EXPLOSIONSPIRITS)状態時は+300ms + //伏虎拳(CH_TIGERFIST)取得時も+300ms + if ((pc_checkskill (sd, MO_EXTREMITYFIST) > 0 + && sd->spiritball >= 4 + && sd->sc_data[SC_EXPLOSIONSPIRITS].timer != -1) + || (pc_checkskill (sd, CH_TIGERFIST) > 0 + && sd->spiritball > 0) + || (pc_checkskill (sd, CH_CHAINCRUSH) > 0 + && sd->spiritball > 1)) + delay += 300 * battle_config.combo_delay_rate / 100; //追加ディレイをconfにより調整 + + skill_status_change_start (src, SC_COMBO, MO_COMBOFINISH, skilllv, 0, 0, delay, 0); //コンボ状態に + } + sd->attackabletime = sd->canmove_tick = tick + delay; + clif_combo_delay (src, delay); //コンボディレイパケットの送信 + } //猛龍拳(MO_COMBOFINISH)ここまで //伏虎拳(CH_TIGERFIST)ここから - else if(skillid == CH_TIGERFIST) { - int delay = 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src); - if(damage < battle_get_hp(bl)) { - if(pc_checkskill(sd, CH_CHAINCRUSH) > 0) //連柱崩撃(CH_CHAINCRUSH)取得時は+300ms - delay += 300 * battle_config.combo_delay_rate /100; //追加ディレイをconfにより調整 - - skill_status_change_start(src,SC_COMBO,CH_TIGERFIST,skilllv,0,0,delay,0); //コンボ状態に - } - sd->attackabletime = sd->canmove_tick = tick + delay; - clif_combo_delay(src,delay); //コンボディレイパケットの送信 - } + else if (skillid == CH_TIGERFIST) + { + int delay = + 1000 - 4 * battle_get_agi (src) - 2 * battle_get_dex (src); + if (damage < battle_get_hp (bl)) + { + if (pc_checkskill (sd, CH_CHAINCRUSH) > 0) //連柱崩撃(CH_CHAINCRUSH)取得時は+300ms + delay += 300 * battle_config.combo_delay_rate / 100; //追加ディレイをconfにより調整 + + skill_status_change_start (src, SC_COMBO, CH_TIGERFIST, skilllv, 0, 0, delay, 0); //コンボ状態に + } + sd->attackabletime = sd->canmove_tick = tick + delay; + clif_combo_delay (src, delay); //コンボディレイパケットの送信 + } //伏虎拳(CH_TIGERFIST)ここまで //連柱崩撃(CH_CHAINCRUSH)ここから - else if(skillid == CH_CHAINCRUSH) { - int delay = 1000 - 4 * battle_get_agi(src) - 2 * battle_get_dex(src); - if(damage < battle_get_hp(bl)) { - //阿修羅覇凰拳(MO_EXTREMITYFIST)取得&気球4個保持&爆裂波動(MO_EXPLOSIONSPIRITS)状態時は+300ms - if(pc_checkskill(sd, MO_EXTREMITYFIST) > 0 && sd->spiritball >= 4 && sd->sc_data[SC_EXPLOSIONSPIRITS].timer != -1) - delay += 300 * battle_config.combo_delay_rate /100; //追加ディレイをconfにより調整 - - skill_status_change_start(src,SC_COMBO,CH_CHAINCRUSH,skilllv,0,0,delay,0); //コンボ状態に - } - sd->attackabletime = sd->canmove_tick = tick + delay; - clif_combo_delay(src,delay); //コンボディレイパケットの送信 - } + else if (skillid == CH_CHAINCRUSH) + { + int delay = + 1000 - 4 * battle_get_agi (src) - 2 * battle_get_dex (src); + if (damage < battle_get_hp (bl)) + { + //阿修羅覇凰拳(MO_EXTREMITYFIST)取得&気球4個保持&爆裂波動(MO_EXPLOSIONSPIRITS)状態時は+300ms + if (pc_checkskill (sd, MO_EXTREMITYFIST) > 0 + && sd->spiritball >= 4 + && sd->sc_data[SC_EXPLOSIONSPIRITS].timer != -1) + delay += 300 * battle_config.combo_delay_rate / 100; //追加ディレイをconfにより調整 + + skill_status_change_start (src, SC_COMBO, CH_CHAINCRUSH, skilllv, 0, 0, delay, 0); //コンボ状態に + } + sd->attackabletime = sd->canmove_tick = tick + delay; + clif_combo_delay (src, delay); //コンボディレイパケットの送信 + } //連柱崩撃(CH_CHAINCRUSH)ここまで - } + } //使用者がPCの場合の処理ここまで //武器スキル?ここから - //AppleGirl Was Here - if(attack_type&BF_MAGIC && damage > 0 && src != bl && src == dsrc) { //Blah Blah - if(bl->type == BL_PC) { //Blah Blah - struct map_session_data *tsd = (struct map_session_data *)bl; - if(tsd->magic_damage_return > 0) { //More Blah - rdamage += damage * tsd->magic_damage_return / 100; - if(rdamage < 1) rdamage = 1; - } - } - } - //Stop Here - if(attack_type&BF_WEAPON && damage > 0 && src != bl && src == dsrc) { //武器スキル&ダメージあり&使用者と対象者が違う&src=dsrc - if(dmg.flag&BF_SHORT) { //近距離攻撃時?※ - if(bl->type == BL_PC) { //対象がPCの時 - struct map_session_data *tsd = (struct map_session_data *)bl; - nullpo_retr(0, tsd); - if(tsd->short_weapon_damage_return > 0) { //近距離攻撃跳ね返し?※ - rdamage += damage * tsd->short_weapon_damage_return / 100; - if(rdamage < 1) rdamage = 1; - } - } - if(sc_data && sc_data[SC_REFLECTSHIELD].timer != -1) { //リフレクトシールド時 - rdamage += damage * sc_data[SC_REFLECTSHIELD].val2 / 100; //跳ね返し計算 - if(rdamage < 1) rdamage = 1; - } - } - else if(dmg.flag&BF_LONG) { //遠距離攻撃時?※ - if(bl->type == BL_PC) { //対象がPCの時 - struct map_session_data *tsd = (struct map_session_data *)bl; - nullpo_retr(0, tsd); - if(tsd->long_weapon_damage_return > 0) { //遠距離攻撃跳ね返し?※ - rdamage += damage * tsd->long_weapon_damage_return / 100; - if(rdamage < 1) rdamage = 1; - } - } - } - if(rdamage > 0) - clif_damage(src,src,tick, dmg.amotion,0,rdamage,1,4,0); - } + //AppleGirl Was Here + if (attack_type & BF_MAGIC && damage > 0 && src != bl && src == dsrc) + { //Blah Blah + if (bl->type == BL_PC) + { //Blah Blah + struct map_session_data *tsd = (struct map_session_data *) bl; + if (tsd->magic_damage_return > 0) + { //More Blah + rdamage += damage * tsd->magic_damage_return / 100; + if (rdamage < 1) + rdamage = 1; + } + } + } + //Stop Here + if (attack_type & BF_WEAPON && damage > 0 && src != bl && src == dsrc) + { //武器スキル&ダメージあり&使用者と対象者が違う&src=dsrc + if (dmg.flag & BF_SHORT) + { //近距離攻撃時?※ + if (bl->type == BL_PC) + { //対象がPCの時 + struct map_session_data *tsd = (struct map_session_data *) bl; + nullpo_retr (0, tsd); + if (tsd->short_weapon_damage_return > 0) + { //近距離攻撃跳ね返し?※ + rdamage += damage * tsd->short_weapon_damage_return / 100; + if (rdamage < 1) + rdamage = 1; + } + } + if (sc_data && sc_data[SC_REFLECTSHIELD].timer != -1) + { //リフレクトシールド時 + rdamage += damage * sc_data[SC_REFLECTSHIELD].val2 / 100; //跳ね返し計算 + if (rdamage < 1) + rdamage = 1; + } + } + else if (dmg.flag & BF_LONG) + { //遠距離攻撃時?※ + if (bl->type == BL_PC) + { //対象がPCの時 + struct map_session_data *tsd = (struct map_session_data *) bl; + nullpo_retr (0, tsd); + if (tsd->long_weapon_damage_return > 0) + { //遠距離攻撃跳ね返し?※ + rdamage += damage * tsd->long_weapon_damage_return / 100; + if (rdamage < 1) + rdamage = 1; + } + } + } + if (rdamage > 0) + clif_damage (src, src, tick, dmg.amotion, 0, rdamage, 1, 4, 0); + } //武器スキル?ここまで - switch(skillid){ - case WZ_SIGHTRASHER: - clif_skill_damage(src,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, (lv!=0)?lv:skilllv, 5); - break; - case AS_SPLASHER: - clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, -1, 5); - break; - case NPC_SELFDESTRUCTION: - case NPC_SELFDESTRUCTION2: - break; - default: - clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, (lv!=0)?lv:skilllv, (skillid==0)? 5:type ); - } - if(dmg.blewcount > 0 && !map[src->m].flag.gvg) { /* 吹き飛ばし処理とそのパケット */ - if(skillid == WZ_SIGHTRASHER) - skill_blown(src,bl,dmg.blewcount); - else - skill_blown(dsrc,bl,dmg.blewcount); - if(bl->type == BL_MOB) - clif_fixmobpos((struct mob_data *)bl); - else - clif_fixpos(bl); - } - - map_freeblock_lock(); - /* 実際にダメージ処理を行う */ - if(skillid != KN_BOWLINGBASH || flag) - battle_damage(src,bl,damage,0); - if(skillid == RG_INTIMIDATE && damage > 0 && !(battle_get_mode(bl)&0x20) && !map[src->m].flag.gvg ) { - int s_lv = battle_get_lv(src),t_lv = battle_get_lv(bl); - int rate = 50 + skilllv * 5; - rate = rate + (s_lv - t_lv); - if(MRAND(100) < rate) - skill_addtimerskill(src,tick + 800,bl->id,0,0,skillid,skilllv,0,flag); - } + switch (skillid) + { + case WZ_SIGHTRASHER: + clif_skill_damage (src, bl, tick, dmg.amotion, dmg.dmotion, + damage, dmg.div_, skillid, + (lv != 0) ? lv : skilllv, 5); + break; + case AS_SPLASHER: + clif_skill_damage (dsrc, bl, tick, dmg.amotion, dmg.dmotion, + damage, dmg.div_, skillid, -1, 5); + break; + case NPC_SELFDESTRUCTION: + case NPC_SELFDESTRUCTION2: + break; + default: + clif_skill_damage (dsrc, bl, tick, dmg.amotion, dmg.dmotion, + damage, dmg.div_, skillid, + (lv != 0) ? lv : skilllv, + (skillid == 0) ? 5 : type); + } + if (dmg.blewcount > 0 && !map[src->m].flag.gvg) + { /* 吹き飛ばし処理とそのパケット */ + if (skillid == WZ_SIGHTRASHER) + skill_blown (src, bl, dmg.blewcount); + else + skill_blown (dsrc, bl, dmg.blewcount); + if (bl->type == BL_MOB) + clif_fixmobpos ((struct mob_data *) bl); + else + clif_fixpos (bl); + } + + map_freeblock_lock (); + /* 実際にダメージ処理を行う */ + if (skillid != KN_BOWLINGBASH || flag) + battle_damage (src, bl, damage, 0); + if (skillid == RG_INTIMIDATE && damage > 0 + && !(battle_get_mode (bl) & 0x20) && !map[src->m].flag.gvg) + { + int s_lv = battle_get_lv (src), t_lv = battle_get_lv (bl); + int rate = 50 + skilllv * 5; + rate = rate + (s_lv - t_lv); + if (MRAND (100) < rate) + skill_addtimerskill (src, tick + 800, bl->id, 0, 0, skillid, + skilllv, 0, flag); + } /* if(damage > 0 && dmg.flag&BF_SKILL && bl->type==BL_PC && pc_checkskill((struct map_session_data *)bl,RG_PLAGIARISM)){ struct map_session_data *tsd = (struct map_session_data *)bl; @@ -1596,71 +1986,97 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds } } */ - /* ダメージがあるなら追加効果判定 */ - if(bl->prev != NULL){ - struct map_session_data *sd = (struct map_session_data *)bl; - nullpo_retr(0, sd); - if( bl->type != BL_PC || (sd && !pc_isdead(sd)) ) { - if(damage > 0) - skill_additional_effect(src,bl,skillid,skilllv,attack_type,tick); - if(bl->type==BL_MOB && src!=bl) /* スキル使用条件のMOBスキル */ - { - struct mob_data *md=(struct mob_data *)bl; - nullpo_retr(0, md); - if(battle_config.mob_changetarget_byskill == 1) - { - int target; - target=md->target_id; - if(src->type == BL_PC) - md->target_id=src->id; - mobskill_use(md,tick,MSC_SKILLUSED|(skillid<<16)); - md->target_id=target; - } - else - mobskill_use(md,tick,MSC_SKILLUSED|(skillid<<16)); - } - } - } - - if(src->type == BL_PC && dmg.flag&BF_WEAPON && src != bl && src == dsrc && damage > 0) { - struct map_session_data *sd = (struct map_session_data *)src; - int hp = 0,sp = 0; - nullpo_retr(0, sd); - if(sd->hp_drain_rate && sd->hp_drain_per > 0 && dmg.damage > 0 && MRAND(100) < sd->hp_drain_rate) { - hp += (dmg.damage * sd->hp_drain_per)/100; - if(sd->hp_drain_rate > 0 && hp < 1) hp = 1; - else if(sd->hp_drain_rate < 0 && hp > -1) hp = -1; - } - if(sd->hp_drain_rate_ && sd->hp_drain_per_ > 0 && dmg.damage2 > 0 && MRAND(100) < sd->hp_drain_rate_) { - hp += (dmg.damage2 * sd->hp_drain_per_)/100; - if(sd->hp_drain_rate_ > 0 && hp < 1) hp = 1; - else if(sd->hp_drain_rate_ < 0 && hp > -1) hp = -1; - } - if(sd->sp_drain_rate > 0 && sd->sp_drain_per > 0 && dmg.damage > 0 && MRAND(100) < sd->sp_drain_rate) { - sp += (dmg.damage * sd->sp_drain_per)/100; - if(sd->sp_drain_rate > 0 && sp < 1) sp = 1; - else if(sd->sp_drain_rate < 0 && sp > -1) sp = -1; - } - if(sd->sp_drain_rate_ > 0 && sd->sp_drain_per_ > 0 && dmg.damage2 > 0 && MRAND(100) < sd->sp_drain_rate_) { - sp += (dmg.damage2 * sd->sp_drain_per_)/100; - if(sd->sp_drain_rate_ > 0 && sp < 1) sp = 1; - else if(sd->sp_drain_rate_ < 0 && sp > -1) sp = -1; - } - if(hp || sp) pc_heal(sd,hp,sp); - } - - if((skillid != KN_BOWLINGBASH || flag) && rdamage > 0) - battle_damage(bl,src,rdamage,0); - - if(attack_type&BF_WEAPON && sc_data && sc_data[SC_AUTOCOUNTER].timer != -1 && sc_data[SC_AUTOCOUNTER].val4 > 0) { - if(sc_data[SC_AUTOCOUNTER].val3 == dsrc->id) - battle_weapon_attack(bl,dsrc,tick,0x8000|sc_data[SC_AUTOCOUNTER].val1); - skill_status_change_end(bl,SC_AUTOCOUNTER,-1); - } - - map_freeblock_unlock(); + /* ダメージがあるなら追加効果判定 */ + if (bl->prev != NULL) + { + struct map_session_data *sd = (struct map_session_data *) bl; + nullpo_retr (0, sd); + if (bl->type != BL_PC || (sd && !pc_isdead (sd))) + { + if (damage > 0) + skill_additional_effect (src, bl, skillid, skilllv, + attack_type, tick); + if (bl->type == BL_MOB && src != bl) /* スキル使用条件のMOBスキル */ + { + struct mob_data *md = (struct mob_data *) bl; + nullpo_retr (0, md); + if (battle_config.mob_changetarget_byskill == 1) + { + int target; + target = md->target_id; + if (src->type == BL_PC) + md->target_id = src->id; + mobskill_use (md, tick, MSC_SKILLUSED | (skillid << 16)); + md->target_id = target; + } + else + mobskill_use (md, tick, MSC_SKILLUSED | (skillid << 16)); + } + } + } - return (dmg.damage+dmg.damage2); /* 与ダメを返す */ + if (src->type == BL_PC && dmg.flag & BF_WEAPON && src != bl && src == dsrc + && damage > 0) + { + struct map_session_data *sd = (struct map_session_data *) src; + int hp = 0, sp = 0; + nullpo_retr (0, sd); + if (sd->hp_drain_rate && sd->hp_drain_per > 0 && dmg.damage > 0 + && MRAND (100) < sd->hp_drain_rate) + { + hp += (dmg.damage * sd->hp_drain_per) / 100; + if (sd->hp_drain_rate > 0 && hp < 1) + hp = 1; + else if (sd->hp_drain_rate < 0 && hp > -1) + hp = -1; + } + if (sd->hp_drain_rate_ && sd->hp_drain_per_ > 0 && dmg.damage2 > 0 + && MRAND (100) < sd->hp_drain_rate_) + { + hp += (dmg.damage2 * sd->hp_drain_per_) / 100; + if (sd->hp_drain_rate_ > 0 && hp < 1) + hp = 1; + else if (sd->hp_drain_rate_ < 0 && hp > -1) + hp = -1; + } + if (sd->sp_drain_rate > 0 && sd->sp_drain_per > 0 && dmg.damage > 0 + && MRAND (100) < sd->sp_drain_rate) + { + sp += (dmg.damage * sd->sp_drain_per) / 100; + if (sd->sp_drain_rate > 0 && sp < 1) + sp = 1; + else if (sd->sp_drain_rate < 0 && sp > -1) + sp = -1; + } + if (sd->sp_drain_rate_ > 0 && sd->sp_drain_per_ > 0 && dmg.damage2 > 0 + && MRAND (100) < sd->sp_drain_rate_) + { + sp += (dmg.damage2 * sd->sp_drain_per_) / 100; + if (sd->sp_drain_rate_ > 0 && sp < 1) + sp = 1; + else if (sd->sp_drain_rate_ < 0 && sp > -1) + sp = -1; + } + if (hp || sp) + pc_heal (sd, hp, sp); + } + + if ((skillid != KN_BOWLINGBASH || flag) && rdamage > 0) + battle_damage (bl, src, rdamage, 0); + + if (attack_type & BF_WEAPON && sc_data + && sc_data[SC_AUTOCOUNTER].timer != -1 + && sc_data[SC_AUTOCOUNTER].val4 > 0) + { + if (sc_data[SC_AUTOCOUNTER].val3 == dsrc->id) + battle_weapon_attack (bl, dsrc, tick, + 0x8000 | sc_data[SC_AUTOCOUNTER].val1); + skill_status_change_end (bl, SC_AUTOCOUNTER, -1); + } + + map_freeblock_unlock (); + + return (dmg.damage + dmg.damage2); /* 与ダメを返す */ } /*========================================== @@ -1672,366 +2088,436 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds * 0 =予約。0に固定 *------------------------------------------ */ -static int skill_area_temp[8]; /* 一時変数。必要なら使う。 */ -typedef int (*SkillFunc)(struct block_list *,struct block_list *,int,int,unsigned int,int); -int skill_area_sub( struct block_list *bl,va_list ap ) +static int skill_area_temp[8]; /* 一時変数。必要なら使う。 */ +typedef int (*SkillFunc) (struct block_list *, struct block_list *, int, int, + unsigned int, int); +int skill_area_sub (struct block_list *bl, va_list ap) { - struct block_list *src; - int skill_id,skill_lv,flag; - unsigned int tick; - SkillFunc func; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - - if(bl->type!=BL_PC && bl->type!=BL_MOB && bl->type!=BL_SKILL) - return 0; - - src=va_arg(ap,struct block_list *); //ここではsrcの値を参照していないのでNULLチェックはしない - skill_id=va_arg(ap,int); - skill_lv=va_arg(ap,int); - tick=va_arg(ap,unsigned int); - flag=va_arg(ap,int); - func=va_arg(ap,SkillFunc); - - if(battle_check_target(src,bl,flag) > 0) - func(src,bl,skill_id,skill_lv,tick,flag); - return 0; + struct block_list *src; + int skill_id, skill_lv, flag; + unsigned int tick; + SkillFunc func; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + + if (bl->type != BL_PC && bl->type != BL_MOB && bl->type != BL_SKILL) + return 0; + + src = va_arg (ap, struct block_list *); //ここではsrcの値を参照していないのでNULLチェックはしない + skill_id = va_arg (ap, int); + skill_lv = va_arg (ap, int); + tick = va_arg (ap, unsigned int); + flag = va_arg (ap, int); + func = va_arg (ap, SkillFunc); + + if (battle_check_target (src, bl, flag) > 0) + func (src, bl, skill_id, skill_lv, tick, flag); + return 0; } -static int skill_check_unit_range_sub( struct block_list *bl,va_list ap ) +static int skill_check_unit_range_sub (struct block_list *bl, va_list ap) { - struct skill_unit *unit; - int *c,x,y,range,sx[4],sy[4]; - int t_range,tx[4],ty[4]; - int i,r_flag,skillid; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, unit = (struct skill_unit *)bl); - nullpo_retr(0, c = va_arg(ap,int *)); - - if(bl->prev == NULL || bl->type != BL_SKILL) - return 0; - - if(!unit->alive) - return 0; - - x = va_arg(ap,int); - y = va_arg(ap,int); - range = va_arg(ap,int); - skillid = va_arg(ap,int); - - if(skillid == MG_SAFETYWALL || skillid == AL_PNEUMA) { - if(unit->group->unit_id != 0x7e && unit->group->unit_id != 0x85) - return 0; - } - else if(skillid == AL_WARP) { - if((unit->group->unit_id < 0x8f || unit->group->unit_id > 0x99) && unit->group->unit_id != 0x92) - return 0; - } - else if((skillid >= HT_SKIDTRAP && skillid <= HT_CLAYMORETRAP) || skillid == HT_TALKIEBOX) { - if((unit->group->unit_id < 0x8f || unit->group->unit_id > 0x99) && unit->group->unit_id != 0x92) - return 0; - } - else if(skillid == WZ_FIREPILLAR) { - if(unit->group->unit_id != 0x87) - return 0; - } - else return 0; - t_range=(unit->range!=0)? unit->range:unit->group->range; - tx[0] = tx[3] = unit->bl.x - t_range; - tx[1] = tx[2] = unit->bl.x + t_range; - ty[0] = ty[1] = unit->bl.y - t_range; - ty[2] = ty[3] = unit->bl.y + t_range; - sx[0] = sx[3] = x - range; - sx[1] = sx[2] = x + range; - sy[0] = sy[1] = y - range; - sy[2] = sy[3] = y + range; - for(i=r_flag=0;i<4;i++) { - if(sx[i] >= tx[0] && sx[i] <= tx[1] && sy[i] >= ty[0] && sy[i] <= ty[2]) { - r_flag = 1; - break; - } - if(tx[i] >= sx[0] && tx[i] <= sx[1] && ty[i] >= sy[0] && ty[i] <= sy[2]) { - r_flag = 1; - break; - } - } - if(r_flag) (*c)++; + struct skill_unit *unit; + int *c, x, y, range, sx[4], sy[4]; + int t_range, tx[4], ty[4]; + int i, r_flag, skillid; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, unit = (struct skill_unit *) bl); + nullpo_retr (0, c = va_arg (ap, int *)); + + if (bl->prev == NULL || bl->type != BL_SKILL) + return 0; + + if (!unit->alive) + return 0; + + x = va_arg (ap, int); + y = va_arg (ap, int); + range = va_arg (ap, int); + skillid = va_arg (ap, int); + + if (skillid == MG_SAFETYWALL || skillid == AL_PNEUMA) + { + if (unit->group->unit_id != 0x7e && unit->group->unit_id != 0x85) + return 0; + } + else if (skillid == AL_WARP) + { + if ((unit->group->unit_id < 0x8f || unit->group->unit_id > 0x99) + && unit->group->unit_id != 0x92) + return 0; + } + else if ((skillid >= HT_SKIDTRAP && skillid <= HT_CLAYMORETRAP) + || skillid == HT_TALKIEBOX) + { + if ((unit->group->unit_id < 0x8f || unit->group->unit_id > 0x99) + && unit->group->unit_id != 0x92) + return 0; + } + else if (skillid == WZ_FIREPILLAR) + { + if (unit->group->unit_id != 0x87) + return 0; + } + else + return 0; + t_range = (unit->range != 0) ? unit->range : unit->group->range; + tx[0] = tx[3] = unit->bl.x - t_range; + tx[1] = tx[2] = unit->bl.x + t_range; + ty[0] = ty[1] = unit->bl.y - t_range; + ty[2] = ty[3] = unit->bl.y + t_range; + sx[0] = sx[3] = x - range; + sx[1] = sx[2] = x + range; + sy[0] = sy[1] = y - range; + sy[2] = sy[3] = y + range; + for (i = r_flag = 0; i < 4; i++) + { + if (sx[i] >= tx[0] && sx[i] <= tx[1] && sy[i] >= ty[0] + && sy[i] <= ty[2]) + { + r_flag = 1; + break; + } + if (tx[i] >= sx[0] && tx[i] <= sx[1] && ty[i] >= sy[0] + && ty[i] <= sy[2]) + { + r_flag = 1; + break; + } + } + if (r_flag) + (*c)++; - return 0; + return 0; } -int skill_check_unit_range(int m,int x,int y,int range,int skillid) +int skill_check_unit_range (int m, int x, int y, int range, int skillid) { - int c = 0; + int c = 0; - map_foreachinarea(skill_check_unit_range_sub,m,x-10,y-10,x+10,y+10,BL_SKILL,&c,x,y,range,skillid); + map_foreachinarea (skill_check_unit_range_sub, m, x - 10, y - 10, x + 10, + y + 10, BL_SKILL, &c, x, y, range, skillid); - return c; + return c; } -static int skill_check_unit_range2_sub( struct block_list *bl,va_list ap ) +static int skill_check_unit_range2_sub (struct block_list *bl, va_list ap) { - int *c; + int *c; - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, c = va_arg(ap,int *)); + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, c = va_arg (ap, int *)); - if(bl->prev == NULL || (bl->type != BL_PC && bl->type != BL_MOB)) - return 0; + if (bl->prev == NULL || (bl->type != BL_PC && bl->type != BL_MOB)) + return 0; - if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) - return 0; + if (bl->type == BL_PC && pc_isdead ((struct map_session_data *) bl)) + return 0; - (*c)++; + (*c)++; - return 0; + return 0; } -int skill_check_unit_range2(int m,int x,int y,int range) +int skill_check_unit_range2 (int m, int x, int y, int range) { - int c = 0; + int c = 0; - map_foreachinarea(skill_check_unit_range2_sub,m,x-range,y-range,x+range,y+range,0,&c); + map_foreachinarea (skill_check_unit_range2_sub, m, x - range, y - range, + x + range, y + range, 0, &c); - return c; + return c; } /*========================================================================= * 範囲スキル使用処理小分けここから */ /* 対象の数をカウントする。(skill_area_temp[0]を初期化しておくこと) */ -int skill_area_sub_count(struct block_list *src,struct block_list *target,int skillid,int skilllv,unsigned int tick,int flag) +int skill_area_sub_count (struct block_list *src, struct block_list *target, + int skillid, int skilllv, unsigned int tick, + int flag) { - if(skill_area_temp[0] < 0xffff) - skill_area_temp[0]++; - return 0; + if (skill_area_temp[0] < 0xffff) + skill_area_temp[0]++; + return 0; } /*========================================== * *------------------------------------------ */ -static int skill_timerskill(int tid, unsigned int tick, int id,int data ) +static int skill_timerskill (int tid, unsigned int tick, int id, int data) { - struct map_session_data *sd = NULL; - struct mob_data *md = NULL; - struct block_list *src = map_id2bl(id),*target; - struct skill_timerskill *skl = NULL; - int range; - - nullpo_retr(0, src); - - if(src->prev == NULL) - return 0; + struct map_session_data *sd = NULL; + struct mob_data *md = NULL; + struct block_list *src = map_id2bl (id), *target; + struct skill_timerskill *skl = NULL; + int range; - if(src->type == BL_PC) { - nullpo_retr(0, sd = (struct map_session_data *)src); - skl = &sd->skilltimerskill[data]; - } - else if(src->type == BL_MOB) { - nullpo_retr(0, md = (struct mob_data *)src); - skl = &md->skilltimerskill[data]; - } + nullpo_retr (0, src); - else - return 0; - - nullpo_retr(0, skl); - - skl->timer = -1; - if(skl->target_id) { - struct block_list tbl; - target = map_id2bl(skl->target_id); - if(skl->skill_id == RG_INTIMIDATE) { - if(target == NULL) { - target = &tbl; //初期化してないのにアドレス突っ込んでいいのかな? - target->type = BL_NUL; - target->m = src->m; - target->prev = target->next = NULL; - } - } - if(target == NULL) - return 0; - if(target->prev == NULL && skl->skill_id != RG_INTIMIDATE) - return 0; - if(src->m != target->m) - return 0; - if(sd && pc_isdead(sd)) - return 0; - if(target->type == BL_PC && pc_isdead((struct map_session_data *)target) && skl->skill_id != RG_INTIMIDATE) - return 0; - - switch(skl->skill_id) { - case TF_BACKSLIDING: - clif_skill_nodamage(src,src,skl->skill_id,skl->skill_lv,1); - break; - case RG_INTIMIDATE: - if(sd && !map[src->m].flag.noteleport) { - int x,y,i,j,c; - pc_randomwarp(sd,3); - for(i=0;i<16;i++) { - j = MRAND(8); - x = sd->bl.x + dirx[j]; - y = sd->bl.y + diry[j]; - if((c=map_getcell(sd->bl.m,x,y)) != 1 && c != 5) - break; - } - if(i >= 16) { - x = sd->bl.x; - y = sd->bl.y; - } - if(target->prev != NULL) { - if(target->type == BL_PC && !pc_isdead((struct map_session_data *)target)) - pc_setpos((struct map_session_data *)target,map[sd->bl.m].name,x,y,3); - else if(target->type == BL_MOB) - mob_warp((struct mob_data *)target,-1,x,y,3); - } - } - else if(md && !map[src->m].flag.monster_noteleport) { - int x,y,i,j,c; - mob_warp(md,-1,-1,-1,3); - for(i=0;i<16;i++) { - j = MRAND(8); - x = md->bl.x + dirx[j]; - y = md->bl.y + diry[j]; - if((c=map_getcell(md->bl.m,x,y)) != 1 && c != 5) - break; - } - if(i >= 16) { - x = md->bl.x; - y = md->bl.y; - } - if(target->prev != NULL) { - if(target->type == BL_PC && !pc_isdead((struct map_session_data *)target)) - pc_setpos((struct map_session_data *)target,map[md->bl.m].name,x,y,3); - else if(target->type == BL_MOB) - mob_warp((struct mob_data *)target,-1,x,y,3); - } - } - break; + if (src->prev == NULL) + return 0; - case BA_FROSTJOKE: /* 寒いジョーク */ - case DC_SCREAM: /* スクリーム */ - range=15; //視界全体 - map_foreachinarea(skill_frostjoke_scream,src->m,src->x-range,src->y-range, - src->x+range,src->y+range,0,src,skl->skill_id,skl->skill_lv,tick); - break; + if (src->type == BL_PC) + { + nullpo_retr (0, sd = (struct map_session_data *) src); + skl = &sd->skilltimerskill[data]; + } + else if (src->type == BL_MOB) + { + nullpo_retr (0, md = (struct mob_data *) src); + skl = &md->skilltimerskill[data]; + } + + else + return 0; - default: - skill_attack(skl->type,src,src,target,skl->skill_id,skl->skill_lv,tick,skl->flag); - break; - } - } - else { - if(src->m != skl->map) - return 0; - switch(skl->skill_id) { - case WZ_METEOR: - if(skl->type >= 0) { - skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->type>>16,skl->type&0xFFFF,0); - clif_skill_poseffect(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,tick); - } - else - skill_unitsetting(src,skl->skill_id,skl->skill_lv,skl->x,skl->y,0); - break; - } - } + nullpo_retr (0, skl); + + skl->timer = -1; + if (skl->target_id) + { + struct block_list tbl; + target = map_id2bl (skl->target_id); + if (skl->skill_id == RG_INTIMIDATE) + { + if (target == NULL) + { + target = &tbl; //初期化してないのにアドレス突っ込んでいいのかな? + target->type = BL_NUL; + target->m = src->m; + target->prev = target->next = NULL; + } + } + if (target == NULL) + return 0; + if (target->prev == NULL && skl->skill_id != RG_INTIMIDATE) + return 0; + if (src->m != target->m) + return 0; + if (sd && pc_isdead (sd)) + return 0; + if (target->type == BL_PC + && pc_isdead ((struct map_session_data *) target) + && skl->skill_id != RG_INTIMIDATE) + return 0; + + switch (skl->skill_id) + { + case TF_BACKSLIDING: + clif_skill_nodamage (src, src, skl->skill_id, skl->skill_lv, + 1); + break; + case RG_INTIMIDATE: + if (sd && !map[src->m].flag.noteleport) + { + int x, y, i, j, c; + pc_randomwarp (sd, 3); + for (i = 0; i < 16; i++) + { + j = MRAND (8); + x = sd->bl.x + dirx[j]; + y = sd->bl.y + diry[j]; + if ((c = map_getcell (sd->bl.m, x, y)) != 1 && c != 5) + break; + } + if (i >= 16) + { + x = sd->bl.x; + y = sd->bl.y; + } + if (target->prev != NULL) + { + if (target->type == BL_PC + && !pc_isdead ((struct map_session_data *) + target)) + pc_setpos ((struct map_session_data *) target, + map[sd->bl.m].name, x, y, 3); + else if (target->type == BL_MOB) + mob_warp ((struct mob_data *) target, -1, x, y, + 3); + } + } + else if (md && !map[src->m].flag.monster_noteleport) + { + int x, y, i, j, c; + mob_warp (md, -1, -1, -1, 3); + for (i = 0; i < 16; i++) + { + j = MRAND (8); + x = md->bl.x + dirx[j]; + y = md->bl.y + diry[j]; + if ((c = map_getcell (md->bl.m, x, y)) != 1 && c != 5) + break; + } + if (i >= 16) + { + x = md->bl.x; + y = md->bl.y; + } + if (target->prev != NULL) + { + if (target->type == BL_PC + && !pc_isdead ((struct map_session_data *) + target)) + pc_setpos ((struct map_session_data *) target, + map[md->bl.m].name, x, y, 3); + else if (target->type == BL_MOB) + mob_warp ((struct mob_data *) target, -1, x, y, + 3); + } + } + break; + + case BA_FROSTJOKE: /* 寒いジョーク */ + case DC_SCREAM: /* スクリーム */ + range = 15; //視界全体 + map_foreachinarea (skill_frostjoke_scream, src->m, + src->x - range, src->y - range, + src->x + range, src->y + range, 0, src, + skl->skill_id, skl->skill_lv, tick); + break; + + default: + skill_attack (skl->type, src, src, target, skl->skill_id, + skl->skill_lv, tick, skl->flag); + break; + } + } + else + { + if (src->m != skl->map) + return 0; + switch (skl->skill_id) + { + case WZ_METEOR: + if (skl->type >= 0) + { + skill_unitsetting (src, skl->skill_id, skl->skill_lv, + skl->type >> 16, skl->type & 0xFFFF, + 0); + clif_skill_poseffect (src, skl->skill_id, skl->skill_lv, + skl->x, skl->y, tick); + } + else + skill_unitsetting (src, skl->skill_id, skl->skill_lv, + skl->x, skl->y, 0); + break; + } + } - return 0; + return 0; } /*========================================== * *------------------------------------------ */ -int skill_addtimerskill(struct block_list *src,unsigned int tick,int target,int x,int y,int skill_id,int skill_lv,int type,int flag) +int skill_addtimerskill (struct block_list *src, unsigned int tick, + int target, int x, int y, int skill_id, int skill_lv, + int type, int flag) { - int i; - - nullpo_retr(1, src); - - if(src->type == BL_PC) { - struct map_session_data *sd = (struct map_session_data *)src; - nullpo_retr(1, sd); - for(i=0;i<MAX_SKILLTIMERSKILL;i++) { - if(sd->skilltimerskill[i].timer == -1) { - sd->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i); - sd->skilltimerskill[i].src_id = src->id; - sd->skilltimerskill[i].target_id = target; - sd->skilltimerskill[i].skill_id = skill_id; - sd->skilltimerskill[i].skill_lv = skill_lv; - sd->skilltimerskill[i].map = src->m; - sd->skilltimerskill[i].x = x; - sd->skilltimerskill[i].y = y; - sd->skilltimerskill[i].type = type; - sd->skilltimerskill[i].flag = flag; - - return 0; - } - } - return 1; - } - else if(src->type == BL_MOB) { - struct mob_data *md = (struct mob_data *)src; - nullpo_retr(1, md); - for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) { - if(md->skilltimerskill[i].timer == -1) { - md->skilltimerskill[i].timer = add_timer(tick, skill_timerskill, src->id, i); - md->skilltimerskill[i].src_id = src->id; - md->skilltimerskill[i].target_id = target; - md->skilltimerskill[i].skill_id = skill_id; - md->skilltimerskill[i].skill_lv = skill_lv; - md->skilltimerskill[i].map = src->m; - md->skilltimerskill[i].x = x; - md->skilltimerskill[i].y = y; - md->skilltimerskill[i].type = type; - md->skilltimerskill[i].flag = flag; - - return 0; - } - } - return 1; - } + int i; + + nullpo_retr (1, src); + + if (src->type == BL_PC) + { + struct map_session_data *sd = (struct map_session_data *) src; + nullpo_retr (1, sd); + for (i = 0; i < MAX_SKILLTIMERSKILL; i++) + { + if (sd->skilltimerskill[i].timer == -1) + { + sd->skilltimerskill[i].timer = + add_timer (tick, skill_timerskill, src->id, i); + sd->skilltimerskill[i].src_id = src->id; + sd->skilltimerskill[i].target_id = target; + sd->skilltimerskill[i].skill_id = skill_id; + sd->skilltimerskill[i].skill_lv = skill_lv; + sd->skilltimerskill[i].map = src->m; + sd->skilltimerskill[i].x = x; + sd->skilltimerskill[i].y = y; + sd->skilltimerskill[i].type = type; + sd->skilltimerskill[i].flag = flag; + + return 0; + } + } + return 1; + } + else if (src->type == BL_MOB) + { + struct mob_data *md = (struct mob_data *) src; + nullpo_retr (1, md); + for (i = 0; i < MAX_MOBSKILLTIMERSKILL; i++) + { + if (md->skilltimerskill[i].timer == -1) + { + md->skilltimerskill[i].timer = + add_timer (tick, skill_timerskill, src->id, i); + md->skilltimerskill[i].src_id = src->id; + md->skilltimerskill[i].target_id = target; + md->skilltimerskill[i].skill_id = skill_id; + md->skilltimerskill[i].skill_lv = skill_lv; + md->skilltimerskill[i].map = src->m; + md->skilltimerskill[i].x = x; + md->skilltimerskill[i].y = y; + md->skilltimerskill[i].type = type; + md->skilltimerskill[i].flag = flag; + + return 0; + } + } + return 1; + } - return 1; + return 1; } /*========================================== * *------------------------------------------ */ -int skill_cleartimerskill(struct block_list *src) +int skill_cleartimerskill (struct block_list *src) { - int i; + int i; - nullpo_retr(0, src); + nullpo_retr (0, src); - if(src->type == BL_PC) { - struct map_session_data *sd = (struct map_session_data *)src; - nullpo_retr(0, sd); - for(i=0;i<MAX_SKILLTIMERSKILL;i++) { - if(sd->skilltimerskill[i].timer != -1) { - delete_timer(sd->skilltimerskill[i].timer, skill_timerskill); - sd->skilltimerskill[i].timer = -1; - } - } - } - else if(src->type == BL_MOB) { - struct mob_data *md = (struct mob_data *)src; - nullpo_retr(0, md); - for(i=0;i<MAX_MOBSKILLTIMERSKILL;i++) { - if(md->skilltimerskill[i].timer != -1) { - delete_timer(md->skilltimerskill[i].timer, skill_timerskill); - md->skilltimerskill[i].timer = -1; - } - } - } + if (src->type == BL_PC) + { + struct map_session_data *sd = (struct map_session_data *) src; + nullpo_retr (0, sd); + for (i = 0; i < MAX_SKILLTIMERSKILL; i++) + { + if (sd->skilltimerskill[i].timer != -1) + { + delete_timer (sd->skilltimerskill[i].timer, skill_timerskill); + sd->skilltimerskill[i].timer = -1; + } + } + } + else if (src->type == BL_MOB) + { + struct mob_data *md = (struct mob_data *) src; + nullpo_retr (0, md); + for (i = 0; i < MAX_MOBSKILLTIMERSKILL; i++) + { + if (md->skilltimerskill[i].timer != -1) + { + delete_timer (md->skilltimerskill[i].timer, skill_timerskill); + md->skilltimerskill[i].timer = -1; + } + } + } - return 0; + return 0; } /* 範囲スキル使用処理小分けここまで @@ -2043,3629 +2529,4471 @@ int skill_cleartimerskill(struct block_list *src) * (スパゲッティに向けて1歩前進!(ダメポ)) *------------------------------------------ */ -int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag ) +int skill_castend_damage_id (struct block_list *src, struct block_list *bl, + int skillid, int skilllv, unsigned int tick, + int flag) { - struct map_session_data *sd=NULL; - int i; - - nullpo_retr(1, src); - nullpo_retr(1, bl); - - if(src->type==BL_PC) - sd=(struct map_session_data *)src; - if(sd && pc_isdead(sd)) - return 1; - - if((skillid == WZ_SIGHTRASHER || skillid == CR_GRANDCROSS) && src != bl) - bl = src; - if(bl->prev == NULL) - return 1; - if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) - return 1; - map_freeblock_lock(); - switch(skillid) - { - /* 武器攻撃系スキル */ - case SM_BASH: /* バッシュ */ - case MC_MAMMONITE: /* メマーナイト */ - case AC_DOUBLE: /* ダブルストレイフィング */ - case AS_SONICBLOW: /* ソニックブロー */ - case KN_PIERCE: /* ピアース */ - case KN_SPEARBOOMERANG: /* スピアブーメラン */ - case TF_POISON: /* インベナム */ - case TF_SPRINKLESAND: /* 砂まき */ - case AC_CHARGEARROW: /* チャージアロー */ - case KN_SPEARSTAB: /* スピアスタブ */ - case RG_RAID: /* サプライズアタック */ - case RG_INTIMIDATE: /* インティミデイト */ - case BA_MUSICALSTRIKE: /* ミュージカルストライク */ - case DC_THROWARROW: /* 矢撃ち */ - case BA_DISSONANCE: /* 不協和音 */ - case CR_HOLYCROSS: /* ホーリークロス */ - case CR_SHIELDCHARGE: - case CR_SHIELDBOOMERANG: - - /* 以下MOB専用 */ - /* 単体攻撃、SP減少攻撃、遠距離攻撃、防御無視攻撃、多段攻撃 */ - case NPC_PIERCINGATT: - case NPC_MENTALBREAKER: - case NPC_RANGEATTACK: - case NPC_CRITICALSLASH: - case NPC_COMBOATTACK: - /* 必中攻撃、毒攻撃、暗黒攻撃、沈黙攻撃、スタン攻撃 */ - case NPC_GUIDEDATTACK: - case NPC_POISON: - case NPC_BLINDATTACK: - case NPC_SILENCEATTACK: - case NPC_STUNATTACK: - /* 石化攻撃、呪い攻撃、睡眠攻撃、ランダムATK攻撃 */ - case NPC_PETRIFYATTACK: - case NPC_CURSEATTACK: - case NPC_SLEEPATTACK: - case NPC_RANDOMATTACK: - /* 水属性攻撃、地属性攻撃、火属性攻撃、風属性攻撃 */ - case NPC_WATERATTACK: - case NPC_GROUNDATTACK: - case NPC_FIREATTACK: - case NPC_WINDATTACK: - /* 毒属性攻撃、聖属性攻撃、闇属性攻撃、念属性攻撃、SP減少攻撃 */ - case NPC_POISONATTACK: - case NPC_HOLYATTACK: - case NPC_DARKNESSATTACK: - case NPC_TELEKINESISATTACK: - case LK_AURABLADE: /* オーラブレード */ - case LK_SPIRALPIERCE: /* スパイラルピアース */ - case LK_HEADCRUSH: /* ヘッドクラッシュ */ - case LK_JOINTBEAT: /* ジョイントビート */ - case PA_PRESSURE: /* プレッシャー */ - case PA_SACRIFICE: /* サクリファイス */ - case SN_SHARPSHOOTING: /* シャープシューティング */ - case CG_ARROWVULCAN: /* アローバルカン */ - case ASC_BREAKER: /* ソウルブレーカー */ - case HW_MAGICCRASHER: /* マジッククラッシャー */ - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); - break; - case NPC_DARKBREATH: - clif_emotion(src,7); - skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag); - break; - case MO_INVESTIGATE: /* 発勁 */ - { - struct status_change *sc_data = battle_get_sc_data(src); - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); - if(sc_data[SC_BLADESTOP].timer != -1) - skill_status_change_end(src,SC_BLADESTOP,-1); - } - break; - case SN_FALCONASSAULT: /* ファルコンアサルト */ - skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,flag); - break; - case KN_BRANDISHSPEAR: /* ブランディッシュスピア */ - { - struct mob_data *md = (struct mob_data *)bl; - nullpo_retr(1, md); - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); - if(md->hp > 0){ - skill_blown(src,bl,skill_get_blewcount(skillid,skilllv)); - if(bl->type == BL_MOB) - clif_fixmobpos((struct mob_data *)bl); - else - clif_fixpos(bl); - } - } - break; - case RG_BACKSTAP: /* バックスタブ */ - { - int dir = map_calc_dir(src,bl->x,bl->y),t_dir = battle_get_dir(bl); - int dist = distance(src->x,src->y,bl->x,bl->y); - if((dist > 0 && !map_check_dir(dir,t_dir)) || bl->type == BL_SKILL) { - struct status_change *sc_data = battle_get_sc_data(src); - if(sc_data && sc_data[SC_HIDING].timer != -1) - skill_status_change_end(src, SC_HIDING, -1); // ハイディング解除 - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); - skill_blown(src,bl,skill_get_blewcount(skillid,skilllv)); - } - else if(src->type == BL_PC) - clif_skill_fail(sd,sd->skillid,0,0); - } - break; - - case AM_ACIDTERROR: /* アシッドテラー */ - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); - if(bl->type == BL_PC && MRAND(100) < skill_get_time(skillid,skilllv) && battle_config.equipment_breaking) - pc_breakarmor((struct map_session_data *)bl); - break; - case MO_FINGEROFFENSIVE: /* 指弾 */ - { - struct status_change *sc_data = battle_get_sc_data(src); - - if(!battle_config.finger_offensive_type) - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); - else { - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); - if(sd) { - for(i=1;i<sd->spiritball_old;i++) - skill_addtimerskill(src,tick+i*200,bl->id,0,0,skillid,skilllv,BF_WEAPON,flag); - sd->canmove_tick = tick + (sd->spiritball_old-1)*200; - } - } - if(sc_data && sc_data[SC_BLADESTOP].timer != -1) - skill_status_change_end(src,SC_BLADESTOP,-1); - } - break; - case MO_CHAINCOMBO: /* 連打掌 */ - { - struct status_change *sc_data = battle_get_sc_data(src); - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); - if(sc_data && sc_data[SC_BLADESTOP].timer != -1) - skill_status_change_end(src,SC_BLADESTOP,-1); - } - break; - case MO_COMBOFINISH: /* 猛龍拳 */ - case CH_TIGERFIST: /* 伏虎拳 */ - case CH_CHAINCRUSH: /* 連柱崩撃 */ - case CH_PALMSTRIKE: /* 猛虎硬派山 */ - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); - break; - case MO_EXTREMITYFIST: /* 阿修羅覇鳳拳 */ - { - struct status_change *sc_data = battle_get_sc_data(src); - - if(sd) { - struct walkpath_data wpd; - int dx,dy; - - dx = bl->x - sd->bl.x; - dy = bl->y - sd->bl.y; - if(dx > 0) dx++; - else if(dx < 0) dx--; - if(dy > 0) dy++; - else if(dy < 0) dy--; - if(dx == 0 && dy == 0) dx++; - if(path_search(&wpd,src->m,sd->bl.x,sd->bl.y,sd->bl.x+dx,sd->bl.y+dy,1) == -1) { - dx = bl->x - sd->bl.x; - dy = bl->y - sd->bl.y; - if(path_search(&wpd,src->m,sd->bl.x,sd->bl.y,sd->bl.x+dx,sd->bl.y+dy,1) == -1) { - clif_skill_fail(sd,sd->skillid,0,0); - break; - } - } - sd->to_x = sd->bl.x + dx; - sd->to_y = sd->bl.y + dy; - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); - clif_walkok(sd); - clif_movechar(sd); - if(dx < 0) dx = -dx; - if(dy < 0) dy = -dy; - sd->attackabletime = sd->canmove_tick = tick + 100 + sd->speed * ((dx > dy)? dx:dy); - if(sd->canact_tick < sd->canmove_tick) - sd->canact_tick = sd->canmove_tick; - pc_movepos(sd,sd->to_x,sd->to_y); - skill_status_change_end(&sd->bl,SC_COMBO,-1); - } - else - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag); - skill_status_change_end(src, SC_EXPLOSIONSPIRITS, -1); - if(sc_data && sc_data[SC_BLADESTOP].timer != -1) - skill_status_change_end(src,SC_BLADESTOP,-1); - } - break; - /* 武器系範囲攻撃スキル */ - case AC_SHOWER: /* アローシャワー */ - case SM_MAGNUM: /* マグナムブレイク */ - case AS_GRIMTOOTH: /* グリムトゥース */ - case MC_CARTREVOLUTION: /* カートレヴォリューション */ - case NPC_SPLASHATTACK: /* スプラッシュアタック */ - case ASC_METEORASSAULT: /* メテオアサルト */ - case AS_SPLASHER: /* [Valaris] */ - if(flag&1){ - /* 個別にダメージを与える */ - if(bl->id!=skill_area_temp[1]){ - int dist=0; - if(skillid==SM_MAGNUM){ /* マグナムブレイクなら中心からの距離を計算 */ - int dx=abs( bl->x - skill_area_temp[2] ); - int dy=abs( bl->y - skill_area_temp[3] ); - dist=((dx>dy)?dx:dy); - } - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick, - 0x0500|dist ); - } - }else{ - int ar=1; - int x=bl->x,y=bl->y; - if( skillid==SM_MAGNUM){ - x=src->x; - y=src->y; - }else if(skillid==AC_SHOWER || skillid==ASC_METEORASSAULT) /* アローシャワー、メテオアサルト範囲5*5 */ - ar=2; - else if(skillid==AS_SPLASHER) /* ベナムスプラッシャー範囲3*3 */ - ar=1; - else if(skillid==NPC_SPLASHATTACK) /* スプラッシュアタックは範囲7*7 */ - ar=3; - skill_area_temp[1]=bl->id; - skill_area_temp[2]=x; - skill_area_temp[3]=y; - /* まずターゲットに攻撃を加える */ - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0); - /* その後ターゲット以外の範囲内の敵全体に処理を行う */ - map_foreachinarea(skill_area_sub, - bl->m,x-ar,y-ar,x+ar,y+ar,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY|1, - skill_castend_damage_id); - } - break; + struct map_session_data *sd = NULL; + int i; + + nullpo_retr (1, src); + nullpo_retr (1, bl); + + if (src->type == BL_PC) + sd = (struct map_session_data *) src; + if (sd && pc_isdead (sd)) + return 1; + + if ((skillid == WZ_SIGHTRASHER || skillid == CR_GRANDCROSS) && src != bl) + bl = src; + if (bl->prev == NULL) + return 1; + if (bl->type == BL_PC && pc_isdead ((struct map_session_data *) bl)) + return 1; + map_freeblock_lock (); + switch (skillid) + { + /* 武器攻撃系スキル */ + case SM_BASH: /* バッシュ */ + case MC_MAMMONITE: /* メマーナイト */ + case AC_DOUBLE: /* ダブルストレイフィング */ + case AS_SONICBLOW: /* ソニックブロー */ + case KN_PIERCE: /* ピアース */ + case KN_SPEARBOOMERANG: /* スピアブーメラン */ + case TF_POISON: /* インベナム */ + case TF_SPRINKLESAND: /* 砂まき */ + case AC_CHARGEARROW: /* チャージアロー */ + case KN_SPEARSTAB: /* スピアスタブ */ + case RG_RAID: /* サプライズアタック */ + case RG_INTIMIDATE: /* インティミデイト */ + case BA_MUSICALSTRIKE: /* ミュージカルストライク */ + case DC_THROWARROW: /* 矢撃ち */ + case BA_DISSONANCE: /* 不協和音 */ + case CR_HOLYCROSS: /* ホーリークロス */ + case CR_SHIELDCHARGE: + case CR_SHIELDBOOMERANG: + + /* 以下MOB専用 */ + /* 単体攻撃、SP減少攻撃、遠距離攻撃、防御無視攻撃、多段攻撃 */ + case NPC_PIERCINGATT: + case NPC_MENTALBREAKER: + case NPC_RANGEATTACK: + case NPC_CRITICALSLASH: + case NPC_COMBOATTACK: + /* 必中攻撃、毒攻撃、暗黒攻撃、沈黙攻撃、スタン攻撃 */ + case NPC_GUIDEDATTACK: + case NPC_POISON: + case NPC_BLINDATTACK: + case NPC_SILENCEATTACK: + case NPC_STUNATTACK: + /* 石化攻撃、呪い攻撃、睡眠攻撃、ランダムATK攻撃 */ + case NPC_PETRIFYATTACK: + case NPC_CURSEATTACK: + case NPC_SLEEPATTACK: + case NPC_RANDOMATTACK: + /* 水属性攻撃、地属性攻撃、火属性攻撃、風属性攻撃 */ + case NPC_WATERATTACK: + case NPC_GROUNDATTACK: + case NPC_FIREATTACK: + case NPC_WINDATTACK: + /* 毒属性攻撃、聖属性攻撃、闇属性攻撃、念属性攻撃、SP減少攻撃 */ + case NPC_POISONATTACK: + case NPC_HOLYATTACK: + case NPC_DARKNESSATTACK: + case NPC_TELEKINESISATTACK: + case LK_AURABLADE: /* オーラブレード */ + case LK_SPIRALPIERCE: /* スパイラルピアース */ + case LK_HEADCRUSH: /* ヘッドクラッシュ */ + case LK_JOINTBEAT: /* ジョイントビート */ + case PA_PRESSURE: /* プレッシャー */ + case PA_SACRIFICE: /* サクリファイス */ + case SN_SHARPSHOOTING: /* シャープシューティング */ + case CG_ARROWVULCAN: /* アローバルカン */ + case ASC_BREAKER: /* ソウルブレーカー */ + case HW_MAGICCRASHER: /* マジッククラッシャー */ + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, tick, + flag); + break; + case NPC_DARKBREATH: + clif_emotion (src, 7); + skill_attack (BF_MISC, src, src, bl, skillid, skilllv, tick, + flag); + break; + case MO_INVESTIGATE: /* 発勁 */ + { + struct status_change *sc_data = battle_get_sc_data (src); + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, tick, + flag); + if (sc_data[SC_BLADESTOP].timer != -1) + skill_status_change_end (src, SC_BLADESTOP, -1); + } + break; + case SN_FALCONASSAULT: /* ファルコンアサルト */ + skill_attack (BF_MISC, src, src, bl, skillid, skilllv, tick, + flag); + break; + case KN_BRANDISHSPEAR: /* ブランディッシュスピア */ + { + struct mob_data *md = (struct mob_data *) bl; + nullpo_retr (1, md); + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, tick, + flag); + if (md->hp > 0) + { + skill_blown (src, bl, skill_get_blewcount (skillid, skilllv)); + if (bl->type == BL_MOB) + clif_fixmobpos ((struct mob_data *) bl); + else + clif_fixpos (bl); + } + } + break; + case RG_BACKSTAP: /* バックスタブ */ + { + int dir = map_calc_dir (src, bl->x, bl->y), t_dir = + battle_get_dir (bl); + int dist = distance (src->x, src->y, bl->x, bl->y); + if ((dist > 0 && !map_check_dir (dir, t_dir)) + || bl->type == BL_SKILL) + { + struct status_change *sc_data = battle_get_sc_data (src); + if (sc_data && sc_data[SC_HIDING].timer != -1) + skill_status_change_end (src, SC_HIDING, -1); // ハイディング解除 + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, tick, + flag); + skill_blown (src, bl, skill_get_blewcount (skillid, skilllv)); + } + else if (src->type == BL_PC) + clif_skill_fail (sd, sd->skillid, 0, 0); + } + break; - case KN_BOWLINGBASH: /* ボウリングバッシュ */ - if(flag&1){ - /* 個別にダメージを与える */ - if(bl->id!=skill_area_temp[1]) - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500); - } - else { - int damage; - map_freeblock_lock(); - damage = skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0); - if(damage > 0) { - int i,c; /* 他人から聞いた動きなので間違ってる可能性大&効率が悪いっす>< */ - c = skill_get_blewcount(skillid,skilllv); - if(map[bl->m].flag.gvg) c = 0; - for(i=0;i<c;i++){ - skill_blown(src,bl,1); - if(bl->type == BL_MOB) - clif_fixmobpos((struct mob_data *)bl); - else - clif_fixpos(bl); - skill_area_temp[0]=0; - map_foreachinarea(skill_area_sub, - bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY , - skill_area_sub_count); - if(skill_area_temp[0]>1) break; - } - skill_area_temp[1]=bl->id; - skill_area_temp[2]=bl->x; - skill_area_temp[3]=bl->y; - /* その後ターゲット以外の範囲内の敵全体に処理を行う */ - map_foreachinarea(skill_area_sub, - bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY|1, - skill_castend_damage_id); - battle_damage(src,bl,damage,1); - if(rdamage > 0) - battle_damage(bl,src,rdamage,0); - } - map_freeblock_unlock(); - } - break; - - case ALL_RESURRECTION: /* リザレクション */ - case PR_TURNUNDEAD: /* ターンアンデッド */ - if(bl->type != BL_PC && battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))) - skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); - else { - map_freeblock_unlock(); - return 1; - } - break; - - /* 魔法系スキル */ - case MG_SOULSTRIKE: /* ソウルストライク */ - case MG_COLDBOLT: /* コールドボルト */ - case MG_FIREBOLT: /* ファイアーボルト */ - case MG_LIGHTNINGBOLT: /* ライトニングボルト */ - case WZ_EARTHSPIKE: /* アーススパイク */ - case AL_HEAL: /* ヒール */ - case AL_HOLYLIGHT: /* ホーリーライト */ - case MG_FROSTDIVER: /* フロストダイバー */ - case WZ_JUPITEL: /* ユピテルサンダー */ - case NPC_MAGICALATTACK: /* MOB:魔法打撃攻撃 */ - case PR_ASPERSIO: /* アスペルシオ */ - skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); - break; - - case WZ_WATERBALL: /* ウォーターボール */ - skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); - if(skilllv>1) - skill_status_change_start(src,SC_WATERBALL,skilllv,bl->id,0,0,0,0); - break; - - case PR_BENEDICTIO: /* 聖体降福 */ - if(battle_get_race(bl)==1 || battle_get_race(bl)==6) - skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); - break; - - /* 魔法系範囲攻撃スキル */ - case MG_NAPALMBEAT: /* ナパームビート */ - case MG_FIREBALL: /* ファイヤーボール */ - if(flag&1){ - /* 個別にダメージを与える */ - if(bl->id!=skill_area_temp[1]){ - if(skillid==MG_FIREBALL){ /* ファイヤーボールなら中心からの距離を計算 */ - int dx=abs( bl->x - skill_area_temp[2] ); - int dy=abs( bl->y - skill_area_temp[3] ); - skill_area_temp[0]=((dx>dy)?dx:dy); - } - skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick, - skill_area_temp[0]| 0x0500); - } - }else{ - int ar=(skillid==MG_NAPALMBEAT)?1:2; - skill_area_temp[1]=bl->id; - if(skillid==MG_NAPALMBEAT){ /* ナパームでは先に数える */ - skill_area_temp[0]=0; - map_foreachinarea(skill_area_sub, - bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY , - skill_area_sub_count); - }else{ - skill_area_temp[0]=0; - skill_area_temp[2]=bl->x; - skill_area_temp[3]=bl->y; - } - /* まずターゲットに攻撃を加える */ - skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick, - skill_area_temp[0] ); - /* その後ターゲット以外の範囲内の敵全体に処理を行う */ - map_foreachinarea(skill_area_sub, - bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY|1, - skill_castend_damage_id); - } - break; - - case HW_NAPALMVULCAN: // Fixed By SteelViruZ - if(flag&1){ - if(bl->id!=skill_area_temp[1]){ - skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick, - skill_area_temp[0]); - } - }else{ - int ar=(skillid==HW_NAPALMVULCAN)?1:2; - skill_area_temp[1]=bl->id; - if(skillid==HW_NAPALMVULCAN){ - skill_area_temp[0]=0; - map_foreachinarea(skill_area_sub, - bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY , - skill_area_sub_count); - }else{ - skill_area_temp[0]=0; - skill_area_temp[2]=bl->x; - skill_area_temp[3]=bl->y; - } - skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick, - skill_area_temp[0] ); - map_foreachinarea(skill_area_sub, - bl->m,bl->x-ar,bl->y-ar,bl->x+ar,bl->y+ar,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY|1, - skill_castend_damage_id); - } - break; + case AM_ACIDTERROR: /* アシッドテラー */ + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, tick, + flag); + if (bl->type == BL_PC + && MRAND (100) < skill_get_time (skillid, skilllv) + && battle_config.equipment_breaking) + pc_breakarmor ((struct map_session_data *) bl); + break; + case MO_FINGEROFFENSIVE: /* 指弾 */ + { + struct status_change *sc_data = battle_get_sc_data (src); + + if (!battle_config.finger_offensive_type) + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, tick, + flag); + else + { + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, tick, + flag); + if (sd) + { + for (i = 1; i < sd->spiritball_old; i++) + skill_addtimerskill (src, tick + i * 200, bl->id, 0, + 0, skillid, skilllv, BF_WEAPON, + flag); + sd->canmove_tick = tick + (sd->spiritball_old - 1) * 200; + } + } + if (sc_data && sc_data[SC_BLADESTOP].timer != -1) + skill_status_change_end (src, SC_BLADESTOP, -1); + } + break; + case MO_CHAINCOMBO: /* 連打掌 */ + { + struct status_change *sc_data = battle_get_sc_data (src); + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, tick, + flag); + if (sc_data && sc_data[SC_BLADESTOP].timer != -1) + skill_status_change_end (src, SC_BLADESTOP, -1); + } + break; + case MO_COMBOFINISH: /* 猛龍拳 */ + case CH_TIGERFIST: /* 伏虎拳 */ + case CH_CHAINCRUSH: /* 連柱崩撃 */ + case CH_PALMSTRIKE: /* 猛虎硬派山 */ + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, tick, + flag); + break; + case MO_EXTREMITYFIST: /* 阿修羅覇鳳拳 */ + { + struct status_change *sc_data = battle_get_sc_data (src); + + if (sd) + { + struct walkpath_data wpd; + int dx, dy; + + dx = bl->x - sd->bl.x; + dy = bl->y - sd->bl.y; + if (dx > 0) + dx++; + else if (dx < 0) + dx--; + if (dy > 0) + dy++; + else if (dy < 0) + dy--; + if (dx == 0 && dy == 0) + dx++; + if (path_search + (&wpd, src->m, sd->bl.x, sd->bl.y, sd->bl.x + dx, + sd->bl.y + dy, 1) == -1) + { + dx = bl->x - sd->bl.x; + dy = bl->y - sd->bl.y; + if (path_search + (&wpd, src->m, sd->bl.x, sd->bl.y, sd->bl.x + dx, + sd->bl.y + dy, 1) == -1) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + break; + } + } + sd->to_x = sd->bl.x + dx; + sd->to_y = sd->bl.y + dy; + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, tick, + flag); + clif_walkok (sd); + clif_movechar (sd); + if (dx < 0) + dx = -dx; + if (dy < 0) + dy = -dy; + sd->attackabletime = sd->canmove_tick = + tick + 100 + sd->speed * ((dx > dy) ? dx : dy); + if (sd->canact_tick < sd->canmove_tick) + sd->canact_tick = sd->canmove_tick; + pc_movepos (sd, sd->to_x, sd->to_y); + skill_status_change_end (&sd->bl, SC_COMBO, -1); + } + else + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, tick, + flag); + skill_status_change_end (src, SC_EXPLOSIONSPIRITS, -1); + if (sc_data && sc_data[SC_BLADESTOP].timer != -1) + skill_status_change_end (src, SC_BLADESTOP, -1); + } + break; + /* 武器系範囲攻撃スキル */ + case AC_SHOWER: /* アローシャワー */ + case SM_MAGNUM: /* マグナムブレイク */ + case AS_GRIMTOOTH: /* グリムトゥース */ + case MC_CARTREVOLUTION: /* カートレヴォリューション */ + case NPC_SPLASHATTACK: /* スプラッシュアタック */ + case ASC_METEORASSAULT: /* メテオアサルト */ + case AS_SPLASHER: /* [Valaris] */ + if (flag & 1) + { + /* 個別にダメージを与える */ + if (bl->id != skill_area_temp[1]) + { + int dist = 0; + if (skillid == SM_MAGNUM) + { /* マグナムブレイクなら中心からの距離を計算 */ + int dx = abs (bl->x - skill_area_temp[2]); + int dy = abs (bl->y - skill_area_temp[3]); + dist = ((dx > dy) ? dx : dy); + } + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, + tick, 0x0500 | dist); + } + } + else + { + int ar = 1; + int x = bl->x, y = bl->y; + if (skillid == SM_MAGNUM) + { + x = src->x; + y = src->y; + } + else if (skillid == AC_SHOWER || skillid == ASC_METEORASSAULT) /* アローシャワー、メテオアサルト範囲5*5 */ + ar = 2; + else if (skillid == AS_SPLASHER) /* ベナムスプラッシャー範囲3*3 */ + ar = 1; + else if (skillid == NPC_SPLASHATTACK) /* スプラッシュアタックは範囲7*7 */ + ar = 3; + skill_area_temp[1] = bl->id; + skill_area_temp[2] = x; + skill_area_temp[3] = y; + /* まずターゲットに攻撃を加える */ + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, tick, + 0); + /* その後ターゲット以外の範囲内の敵全体に処理を行う */ + map_foreachinarea (skill_area_sub, + bl->m, x - ar, y - ar, x + ar, y + ar, 0, + src, skillid, skilllv, tick, + flag | BCT_ENEMY | 1, + skill_castend_damage_id); + } + break; - case WZ_FROSTNOVA: /* フロストノヴァ */ - skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0); - skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); - break; - - case WZ_SIGHTRASHER: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0); - skill_status_change_end(src,SC_SIGHT,-1); - break; - - /* その他 */ - case HT_BLITZBEAT: /* ブリッツビート */ - if(flag&1){ - /* 個別にダメージを与える */ - if(bl->id!=skill_area_temp[1]) - skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,skill_area_temp[0]|(flag&0xf00000)); - }else{ - skill_area_temp[0]=0; - skill_area_temp[1]=bl->id; - if(flag&0xf00000) - map_foreachinarea(skill_area_sub,bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY ,skill_area_sub_count); - /* まずターゲットに攻撃を加える */ - skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,skill_area_temp[0]|(flag&0xf00000)); - /* その後ターゲット以外の範囲内の敵全体に処理を行う */ - map_foreachinarea(skill_area_sub, - bl->m,bl->x-1,bl->y-1,bl->x+1,bl->y+1,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY|1, - skill_castend_damage_id); - } - break; - - case CR_GRANDCROSS: /* グランドクロス */ - /* スキルユニット配置 */ - skill_castend_pos2(src,bl->x,bl->y,skillid,skilllv,tick,0); - if(sd) - sd->canmove_tick = tick + 1000; - else if(src->type == BL_MOB) - mob_changestate((struct mob_data *)src,MS_DELAY,1000); - break; - - case TF_THROWSTONE: /* 石投げ */ - case NPC_SMOKING: /* スモーキング */ - skill_attack(BF_MISC,src,src,bl,skillid,skilllv,tick,0 ); - break; - - case NPC_SELFDESTRUCTION: /* 自爆 */ - case NPC_SELFDESTRUCTION2: /* 自爆2 */ - if(flag&1){ - /* 個別にダメージを与える */ - if(src->type==BL_MOB){ - struct mob_data* mb = (struct mob_data*)src; - nullpo_retr(1, mb); - mb->hp=skill_area_temp[2]; - if(bl->id!=skill_area_temp[1]) - skill_attack(BF_MISC,src,src,bl,NPC_SELFDESTRUCTION,skilllv,tick,flag ); - mb->hp=1; - } - }else{ - struct mob_data *md; - if((md=(struct mob_data *)src)){ - skill_area_temp[1]=bl->id; - skill_area_temp[2]=battle_get_hp(src); - clif_skill_nodamage(src,src,NPC_SELFDESTRUCTION,-1,1); - map_foreachinarea(skill_area_sub, - bl->m,bl->x-5,bl->y-5,bl->x+5,bl->y+5,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY|1, - skill_castend_damage_id); - battle_damage(src,src,md->hp,0); - } - } - break; - - /* HP吸収/HP吸収魔法 */ - case NPC_BLOODDRAIN: - case NPC_ENERGYDRAIN: - { - int heal; - heal = skill_attack((skillid==NPC_BLOODDRAIN)?BF_WEAPON:BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag); - if( heal > 0 ){ - struct block_list tbl; - tbl.id = 0; - tbl.m = src->m; - tbl.x = src->x; - tbl.y = src->y; - clif_skill_nodamage(&tbl,src,AL_HEAL,heal,1); - battle_heal(NULL,src,heal,0,0); - } - } - break; - case 0: - if(sd) { - if(flag&3){ - if(bl->id!=skill_area_temp[1]) - skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,0x0500); - } - else{ - int ar=sd->splash_range; - skill_area_temp[1]=bl->id; - map_foreachinarea(skill_area_sub, - bl->m, bl->x - ar, bl->y - ar, bl->x + ar, bl->y + ar, 0, - src, skillid, skilllv, tick, flag | BCT_ENEMY | 1, - skill_castend_damage_id); - } - } - break; + case KN_BOWLINGBASH: /* ボウリングバッシュ */ + if (flag & 1) + { + /* 個別にダメージを与える */ + if (bl->id != skill_area_temp[1]) + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, + tick, 0x0500); + } + else + { + int damage; + map_freeblock_lock (); + damage = + skill_attack (BF_WEAPON, src, src, bl, skillid, skilllv, + tick, 0); + if (damage > 0) + { + int i, c; /* 他人から聞いた動きなので間違ってる可能性大&効率が悪いっす>< */ + c = skill_get_blewcount (skillid, skilllv); + if (map[bl->m].flag.gvg) + c = 0; + for (i = 0; i < c; i++) + { + skill_blown (src, bl, 1); + if (bl->type == BL_MOB) + clif_fixmobpos ((struct mob_data *) bl); + else + clif_fixpos (bl); + skill_area_temp[0] = 0; + map_foreachinarea (skill_area_sub, + bl->m, bl->x - 1, bl->y - 1, + bl->x + 1, bl->y + 1, 0, src, + skillid, skilllv, tick, + flag | BCT_ENEMY, + skill_area_sub_count); + if (skill_area_temp[0] > 1) + break; + } + skill_area_temp[1] = bl->id; + skill_area_temp[2] = bl->x; + skill_area_temp[3] = bl->y; + /* その後ターゲット以外の範囲内の敵全体に処理を行う */ + map_foreachinarea (skill_area_sub, + bl->m, bl->x - 1, bl->y - 1, bl->x + 1, + bl->y + 1, 0, src, skillid, skilllv, + tick, flag | BCT_ENEMY | 1, + skill_castend_damage_id); + battle_damage (src, bl, damage, 1); + if (rdamage > 0) + battle_damage (bl, src, rdamage, 0); + } + map_freeblock_unlock (); + } + break; - default: - map_freeblock_unlock(); - return 1; - } - map_freeblock_unlock(); + case ALL_RESURRECTION: /* リザレクション */ + case PR_TURNUNDEAD: /* ターンアンデッド */ + if (bl->type != BL_PC + && battle_check_undead (battle_get_race (bl), + battle_get_elem_type (bl))) + skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, tick, + flag); + else + { + map_freeblock_unlock (); + return 1; + } + break; + + /* 魔法系スキル */ + case MG_SOULSTRIKE: /* ソウルストライク */ + case MG_COLDBOLT: /* コールドボルト */ + case MG_FIREBOLT: /* ファイアーボルト */ + case MG_LIGHTNINGBOLT: /* ライトニングボルト */ + case WZ_EARTHSPIKE: /* アーススパイク */ + case AL_HEAL: /* ヒール */ + case AL_HOLYLIGHT: /* ホーリーライト */ + case MG_FROSTDIVER: /* フロストダイバー */ + case WZ_JUPITEL: /* ユピテルサンダー */ + case NPC_MAGICALATTACK: /* MOB:魔法打撃攻撃 */ + case PR_ASPERSIO: /* アスペルシオ */ + skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, tick, + flag); + break; + + case WZ_WATERBALL: /* ウォーターボール */ + skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, tick, + flag); + if (skilllv > 1) + skill_status_change_start (src, SC_WATERBALL, skilllv, bl->id, + 0, 0, 0, 0); + break; + + case PR_BENEDICTIO: /* 聖体降福 */ + if (battle_get_race (bl) == 1 || battle_get_race (bl) == 6) + skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, tick, + flag); + break; + + /* 魔法系範囲攻撃スキル */ + case MG_NAPALMBEAT: /* ナパームビート */ + case MG_FIREBALL: /* ファイヤーボール */ + if (flag & 1) + { + /* 個別にダメージを与える */ + if (bl->id != skill_area_temp[1]) + { + if (skillid == MG_FIREBALL) + { /* ファイヤーボールなら中心からの距離を計算 */ + int dx = abs (bl->x - skill_area_temp[2]); + int dy = abs (bl->y - skill_area_temp[3]); + skill_area_temp[0] = ((dx > dy) ? dx : dy); + } + skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, + tick, skill_area_temp[0] | 0x0500); + } + } + else + { + int ar = (skillid == MG_NAPALMBEAT) ? 1 : 2; + skill_area_temp[1] = bl->id; + if (skillid == MG_NAPALMBEAT) + { /* ナパームでは先に数える */ + skill_area_temp[0] = 0; + map_foreachinarea (skill_area_sub, + bl->m, bl->x - 1, bl->y - 1, bl->x + 1, + bl->y + 1, 0, src, skillid, skilllv, + tick, flag | BCT_ENEMY, + skill_area_sub_count); + } + else + { + skill_area_temp[0] = 0; + skill_area_temp[2] = bl->x; + skill_area_temp[3] = bl->y; + } + /* まずターゲットに攻撃を加える */ + skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, tick, + skill_area_temp[0]); + /* その後ターゲット以外の範囲内の敵全体に処理を行う */ + map_foreachinarea (skill_area_sub, + bl->m, bl->x - ar, bl->y - ar, bl->x + ar, + bl->y + ar, 0, src, skillid, skilllv, tick, + flag | BCT_ENEMY | 1, + skill_castend_damage_id); + } + break; + + case HW_NAPALMVULCAN: // Fixed By SteelViruZ + if (flag & 1) + { + if (bl->id != skill_area_temp[1]) + { + skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, + tick, skill_area_temp[0]); + } + } + else + { + int ar = (skillid == HW_NAPALMVULCAN) ? 1 : 2; + skill_area_temp[1] = bl->id; + if (skillid == HW_NAPALMVULCAN) + { + skill_area_temp[0] = 0; + map_foreachinarea (skill_area_sub, + bl->m, bl->x - 1, bl->y - 1, bl->x + 1, + bl->y + 1, 0, src, skillid, skilllv, + tick, flag | BCT_ENEMY, + skill_area_sub_count); + } + else + { + skill_area_temp[0] = 0; + skill_area_temp[2] = bl->x; + skill_area_temp[3] = bl->y; + } + skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, tick, + skill_area_temp[0]); + map_foreachinarea (skill_area_sub, + bl->m, bl->x - ar, bl->y - ar, bl->x + ar, + bl->y + ar, 0, src, skillid, skilllv, tick, + flag | BCT_ENEMY | 1, + skill_castend_damage_id); + } + break; - return 0; + case WZ_FROSTNOVA: /* フロストノヴァ */ + skill_castend_pos2 (src, bl->x, bl->y, skillid, skilllv, tick, 0); + skill_attack (BF_MAGIC, src, src, bl, skillid, skilllv, tick, + flag); + break; + + case WZ_SIGHTRASHER: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_castend_pos2 (src, bl->x, bl->y, skillid, skilllv, tick, 0); + skill_status_change_end (src, SC_SIGHT, -1); + break; + + /* その他 */ + case HT_BLITZBEAT: /* ブリッツビート */ + if (flag & 1) + { + /* 個別にダメージを与える */ + if (bl->id != skill_area_temp[1]) + skill_attack (BF_MISC, src, src, bl, skillid, skilllv, + tick, + skill_area_temp[0] | (flag & 0xf00000)); + } + else + { + skill_area_temp[0] = 0; + skill_area_temp[1] = bl->id; + if (flag & 0xf00000) + map_foreachinarea (skill_area_sub, bl->m, bl->x - 1, + bl->y - 1, bl->x + 1, bl->y + 1, 0, + src, skillid, skilllv, tick, + flag | BCT_ENEMY, + skill_area_sub_count); + /* まずターゲットに攻撃を加える */ + skill_attack (BF_MISC, src, src, bl, skillid, skilllv, tick, + skill_area_temp[0] | (flag & 0xf00000)); + /* その後ターゲット以外の範囲内の敵全体に処理を行う */ + map_foreachinarea (skill_area_sub, + bl->m, bl->x - 1, bl->y - 1, bl->x + 1, + bl->y + 1, 0, src, skillid, skilllv, tick, + flag | BCT_ENEMY | 1, + skill_castend_damage_id); + } + break; + + case CR_GRANDCROSS: /* グランドクロス */ + /* スキルユニット配置 */ + skill_castend_pos2 (src, bl->x, bl->y, skillid, skilllv, tick, 0); + if (sd) + sd->canmove_tick = tick + 1000; + else if (src->type == BL_MOB) + mob_changestate ((struct mob_data *) src, MS_DELAY, 1000); + break; + + case TF_THROWSTONE: /* 石投げ */ + case NPC_SMOKING: /* スモーキング */ + skill_attack (BF_MISC, src, src, bl, skillid, skilllv, tick, 0); + break; + + case NPC_SELFDESTRUCTION: /* 自爆 */ + case NPC_SELFDESTRUCTION2: /* 自爆2 */ + if (flag & 1) + { + /* 個別にダメージを与える */ + if (src->type == BL_MOB) + { + struct mob_data *mb = (struct mob_data *) src; + nullpo_retr (1, mb); + mb->hp = skill_area_temp[2]; + if (bl->id != skill_area_temp[1]) + skill_attack (BF_MISC, src, src, bl, + NPC_SELFDESTRUCTION, skilllv, tick, + flag); + mb->hp = 1; + } + } + else + { + struct mob_data *md; + if ((md = (struct mob_data *) src)) + { + skill_area_temp[1] = bl->id; + skill_area_temp[2] = battle_get_hp (src); + clif_skill_nodamage (src, src, NPC_SELFDESTRUCTION, -1, + 1); + map_foreachinarea (skill_area_sub, bl->m, bl->x - 5, + bl->y - 5, bl->x + 5, bl->y + 5, 0, + src, skillid, skilllv, tick, + flag | BCT_ENEMY | 1, + skill_castend_damage_id); + battle_damage (src, src, md->hp, 0); + } + } + break; + + /* HP吸収/HP吸収魔法 */ + case NPC_BLOODDRAIN: + case NPC_ENERGYDRAIN: + { + int heal; + heal = + skill_attack ((skillid == + NPC_BLOODDRAIN) ? BF_WEAPON : BF_MAGIC, src, + src, bl, skillid, skilllv, tick, flag); + if (heal > 0) + { + struct block_list tbl; + tbl.id = 0; + tbl.m = src->m; + tbl.x = src->x; + tbl.y = src->y; + clif_skill_nodamage (&tbl, src, AL_HEAL, heal, 1); + battle_heal (NULL, src, heal, 0, 0); + } + } + break; + case 0: + if (sd) + { + if (flag & 3) + { + if (bl->id != skill_area_temp[1]) + skill_attack (BF_WEAPON, src, src, bl, skillid, + skilllv, tick, 0x0500); + } + else + { + int ar = sd->splash_range; + skill_area_temp[1] = bl->id; + map_foreachinarea (skill_area_sub, + bl->m, bl->x - ar, bl->y - ar, + bl->x + ar, bl->y + ar, 0, src, + skillid, skilllv, tick, + flag | BCT_ENEMY | 1, + skill_castend_damage_id); + } + } + break; + + default: + map_freeblock_unlock (); + return 1; + } + map_freeblock_unlock (); + + return 0; } /*========================================== * スキル使用(詠唱完了、ID指定支援系) *------------------------------------------ */ -int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag ) +int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, + int skillid, int skilllv, unsigned int tick, + int flag) { - struct map_session_data *sd=NULL; - struct map_session_data *dstsd=NULL; - struct mob_data *md=NULL; - struct mob_data *dstmd=NULL; - int i; - int sc_def_vit,sc_def_mdef,strip_fix,strip_time,strip_per; - int sc_dex,sc_luk; - //クラスチェンジ用ボスモンスターID - int changeclass[]={1038,1039,1046,1059,1086,1087,1112,1115 - ,1157,1159,1190,1272,1312,1373,1492}; - int poringclass[]={1002}; - - nullpo_retr(1, src); - nullpo_retr(1, bl); - - if(src->type==BL_PC) - sd=(struct map_session_data *)src; - else if(src->type==BL_MOB) - md=(struct mob_data *)src; - - sc_dex=battle_get_mdef(bl); - sc_luk=battle_get_luk(bl); - sc_def_vit = 100 - (3 + battle_get_vit(bl) + battle_get_luk(bl)/3); - sc_def_vit = 100 - (3 + battle_get_vit(bl) + battle_get_luk(bl)/3); - sc_def_mdef = 100 - (3 + battle_get_mdef(bl) + battle_get_luk(bl)/3); - strip_fix = battle_get_dex(src) - battle_get_dex(bl); - - if(bl->type==BL_PC){ - nullpo_retr(1, dstsd=(struct map_session_data *)bl); - }else if(bl->type==BL_MOB){ - nullpo_retr(1, dstmd=(struct mob_data *)bl); - if(sc_def_vit>50) - sc_def_vit=50; - if(sc_def_mdef>50) - sc_def_mdef=50; - } - if(sc_def_vit < 0) - sc_def_vit=0; - if(sc_def_mdef < 0) - sc_def_mdef=0; - if(strip_fix < 0) - strip_fix=0; - - if(bl == NULL || bl->prev == NULL) - return 1; - if(sd && pc_isdead(sd)) - return 1; - if(dstsd && pc_isdead(dstsd) && skillid != ALL_RESURRECTION) - return 1; - if(battle_get_class(bl) == 1288) - return 1; - if (skillnotok(skillid, (struct map_session_data *)bl)) // [MouseJstr] - return 0; + struct map_session_data *sd = NULL; + struct map_session_data *dstsd = NULL; + struct mob_data *md = NULL; + struct mob_data *dstmd = NULL; + int i; + int sc_def_vit, sc_def_mdef, strip_fix, strip_time, strip_per; + int sc_dex, sc_luk; + //クラスチェンジ用ボスモンスターID + int changeclass[] = + { 1038, 1039, 1046, 1059, 1086, 1087, 1112, 1115, 1157, 1159, 1190, + 1272, 1312, 1373, 1492 + }; + int poringclass[] = { 1002 }; + + nullpo_retr (1, src); + nullpo_retr (1, bl); + + if (src->type == BL_PC) + sd = (struct map_session_data *) src; + else if (src->type == BL_MOB) + md = (struct mob_data *) src; + + sc_dex = battle_get_mdef (bl); + sc_luk = battle_get_luk (bl); + sc_def_vit = 100 - (3 + battle_get_vit (bl) + battle_get_luk (bl) / 3); + sc_def_vit = 100 - (3 + battle_get_vit (bl) + battle_get_luk (bl) / 3); + sc_def_mdef = 100 - (3 + battle_get_mdef (bl) + battle_get_luk (bl) / 3); + strip_fix = battle_get_dex (src) - battle_get_dex (bl); + + if (bl->type == BL_PC) + { + nullpo_retr (1, dstsd = (struct map_session_data *) bl); + } + else if (bl->type == BL_MOB) + { + nullpo_retr (1, dstmd = (struct mob_data *) bl); + if (sc_def_vit > 50) + sc_def_vit = 50; + if (sc_def_mdef > 50) + sc_def_mdef = 50; + } + if (sc_def_vit < 0) + sc_def_vit = 0; + if (sc_def_mdef < 0) + sc_def_mdef = 0; + if (strip_fix < 0) + strip_fix = 0; + + if (bl == NULL || bl->prev == NULL) + return 1; + if (sd && pc_isdead (sd)) + return 1; + if (dstsd && pc_isdead (dstsd) && skillid != ALL_RESURRECTION) + return 1; + if (battle_get_class (bl) == 1288) + return 1; + if (skillnotok (skillid, (struct map_session_data *) bl)) // [MouseJstr] + return 0; - map_freeblock_lock(); - switch(skillid) - { - case AL_HEAL: /* ヒール */ - { - int heal=skill_calc_heal( src, skilllv ); - int heal_get_jobexp; - int skill; - struct pc_base_job s_class; - - if( dstsd && dstsd->special_state.no_magic_damage ) - heal=0; /* 黄金蟲カード(ヒール量0) */ - if (sd){ - s_class = pc_calc_base_job(sd->status.class); - if((skill=pc_checkskill(sd,HP_MEDITATIO))>0) // メディテイティオ - heal += heal*(skill*2/100); - if(sd && dstsd && sd->status.partner_id == dstsd->status.char_id && s_class.job == 23 && sd->status.sex == 0) //自分も対象もPC、対象が自分のパートナー、自分がスパノビ、自分が♀なら - heal = heal*2; //スパノビの嫁が旦那にヒールすると2倍になる - } - + map_freeblock_lock (); + switch (skillid) + { + case AL_HEAL: /* ヒール */ + { + int heal = skill_calc_heal (src, skilllv); + int heal_get_jobexp; + int skill; + struct pc_base_job s_class; + + if (dstsd && dstsd->special_state.no_magic_damage) + heal = 0; /* 黄金蟲カード(ヒール量0) */ + if (sd) + { + s_class = pc_calc_base_job (sd->status.class); + if ((skill = pc_checkskill (sd, HP_MEDITATIO)) > 0) // メディテイティオ + heal += heal * (skill * 2 / 100); + if (sd && dstsd && sd->status.partner_id == dstsd->status.char_id && s_class.job == 23 && sd->status.sex == 0) //自分も対象もPC、対象が自分のパートナー、自分がスパノビ、自分が♀なら + heal = heal * 2; //スパノビの嫁が旦那にヒールすると2倍になる + } + + clif_skill_nodamage (src, bl, skillid, heal, 1); + heal_get_jobexp = battle_heal (NULL, bl, heal, 0, 0); + + // JOB経験値獲得 + if (src->type == BL_PC && bl->type == BL_PC && heal > 0 + && src != bl && battle_config.heal_exp > 0) + { + heal_get_jobexp = + heal_get_jobexp * battle_config.heal_exp / 100; + if (heal_get_jobexp <= 0) + heal_get_jobexp = 1; + pc_gainexp ((struct map_session_data *) src, 0, + heal_get_jobexp); + } + } + break; - clif_skill_nodamage(src,bl,skillid,heal,1); - heal_get_jobexp = battle_heal(NULL,bl,heal,0,0); + case ALL_RESURRECTION: /* リザレクション */ + if (bl->type == BL_PC) + { + int per = 0; + struct map_session_data *tsd = (struct map_session_data *) bl; + nullpo_retr (1, tsd); + if ((map[bl->m].flag.pvp) && tsd->pvp_point < 0) + break; /* PVPで復活不可能状態 */ + + if (pc_isdead (tsd)) + { /* 死亡判定 */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + switch (skilllv) + { + case 1: + per = 10; + break; + case 2: + per = 30; + break; + case 3: + per = 50; + break; + case 4: + per = 80; + break; + } + tsd->status.hp = tsd->status.max_hp * per / 100; + if (tsd->status.hp <= 0) + tsd->status.hp = 1; + if (tsd->special_state.restart_full_recover) + { /* オシリスカード */ + tsd->status.hp = tsd->status.max_hp; + tsd->status.sp = tsd->status.max_sp; + } + pc_setstand (tsd); + if (battle_config.pc_invincible_time > 0) + pc_setinvincibletimer (tsd, + battle_config.pc_invincible_time); + clif_updatestatus (tsd, SP_HP); + clif_resurrection (&tsd->bl, 1); + if (src != bl && sd && battle_config.resurrection_exp > 0) + { + int exp = 0, jexp = 0; + int lv = + tsd->status.base_level - sd->status.base_level, + jlv = + tsd->status.job_level - sd->status.job_level; + if (lv > 0) + { + exp = + (int) ((double) tsd->status.base_exp * + (double) lv * + (double) battle_config.resurrection_exp + / 1000000.); + if (exp < 1) + exp = 1; + } + if (jlv > 0) + { + jexp = + (int) ((double) tsd->status.job_exp * + (double) lv * + (double) battle_config.resurrection_exp + / 1000000.); + if (jexp < 1) + jexp = 1; + } + if (exp > 0 || jexp > 0) + pc_gainexp (sd, exp, jexp); + } + } + } + break; - // JOB経験値獲得 - if(src->type == BL_PC && bl->type==BL_PC && heal > 0 && src != bl && battle_config.heal_exp > 0){ - heal_get_jobexp = heal_get_jobexp * battle_config.heal_exp / 100; - if(heal_get_jobexp <= 0) - heal_get_jobexp = 1; - pc_gainexp((struct map_session_data *)src,0,heal_get_jobexp); - } - } - break; - - case ALL_RESURRECTION: /* リザレクション */ - if(bl->type==BL_PC){ - int per=0; - struct map_session_data *tsd = (struct map_session_data*)bl; - nullpo_retr(1, tsd); - if( (map[bl->m].flag.pvp) && tsd->pvp_point<0 ) - break; /* PVPで復活不可能状態 */ - - if(pc_isdead(tsd)){ /* 死亡判定 */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - switch(skilllv){ - case 1: per=10; break; - case 2: per=30; break; - case 3: per=50; break; - case 4: per=80; break; - } - tsd->status.hp=tsd->status.max_hp*per/100; - if(tsd->status.hp<=0) tsd->status.hp=1; - if(tsd->special_state.restart_full_recover ){ /* オシリスカード */ - tsd->status.hp=tsd->status.max_hp; - tsd->status.sp=tsd->status.max_sp; - } - pc_setstand(tsd); - if(battle_config.pc_invincible_time > 0) - pc_setinvincibletimer(tsd,battle_config.pc_invincible_time); - clif_updatestatus(tsd,SP_HP); - clif_resurrection(&tsd->bl,1); - if(src != bl && sd && battle_config.resurrection_exp > 0) { - int exp = 0,jexp = 0; - int lv = tsd->status.base_level - sd->status.base_level, jlv = tsd->status.job_level - sd->status.job_level; - if(lv > 0) { - exp = (int)((double)tsd->status.base_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.); - if(exp < 1) exp = 1; - } - if(jlv > 0) { - jexp = (int)((double)tsd->status.job_exp * (double)lv * (double)battle_config.resurrection_exp / 1000000.); - if(jexp < 1) jexp = 1; - } - if(exp > 0 || jexp > 0) - pc_gainexp(sd,exp,jexp); - } - } - } - break; + case AL_DECAGI: /* 速度減少 */ + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + if (MRAND (100) < + (50 + skilllv * 3 + + (battle_get_lv (src) + battle_get_int (src) / 5) - + sc_def_mdef)) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_status_change_start (bl, + SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), + 0); + } + break; - case AL_DECAGI: /* 速度減少 */ - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - if( MRAND(100) < (50+skilllv*3+(battle_get_lv(src)+battle_get_int(src)/5)-sc_def_mdef) ) { - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0); - } - break; - - case AL_CRUCIS: - if(flag&1) { - int race = battle_get_race(bl),ele = battle_get_elem_type(bl); - if(battle_check_target(src,bl,BCT_ENEMY) && (race == 6 || battle_check_undead(race,ele))) { - int slv=battle_get_lv(src),tlv=battle_get_lv(bl),rate; - rate = 25 + skilllv*2 + slv - tlv; - if(MRAND(100) < rate) - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,0,0); - } - } - else { - int range = 15; - clif_skill_nodamage(src,bl,skillid,skilllv,1); - map_foreachinarea(skill_area_sub, - src->m,src->x-range,src->y-range,src->x+range,src->y+range,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY|1, - skill_castend_nodamage_id); - } - break; + case AL_CRUCIS: + if (flag & 1) + { + int race = battle_get_race (bl), ele = + battle_get_elem_type (bl); + if (battle_check_target (src, bl, BCT_ENEMY) + && (race == 6 || battle_check_undead (race, ele))) + { + int slv = battle_get_lv (src), tlv = + battle_get_lv (bl), rate; + rate = 25 + skilllv * 2 + slv - tlv; + if (MRAND (100) < rate) + skill_status_change_start (bl, + SkillStatusChangeTable + [skillid], skilllv, 0, 0, + 0, 0, 0); + } + } + else + { + int range = 15; + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + map_foreachinarea (skill_area_sub, + src->m, src->x - range, src->y - range, + src->x + range, src->y + range, 0, src, + skillid, skilllv, tick, + flag | BCT_ENEMY | 1, + skill_castend_nodamage_id); + } + break; - case PR_LEXDIVINA: /* レックスディビーナ */ - { - struct status_change *sc_data = battle_get_sc_data(bl); - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - if(sc_data && sc_data[SC_DIVINA].timer != -1) - skill_status_change_end(bl,SC_DIVINA,-1); - else if( MRAND(100) < sc_def_vit ) { - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0); - } - } - break; - case SA_ABRACADABRA: - break; - case SA_COMA: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - if(dstsd){ - dstsd->status.hp=1; - dstsd->status.sp=1; - clif_updatestatus(dstsd,SP_HP); - clif_updatestatus(dstsd,SP_SP); - } - if(dstmd) dstmd->hp=1; - break; - case SA_FULLRECOVERY: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - if(dstsd) pc_heal(dstsd,dstsd->status.max_hp,dstsd->status.max_sp); - if(dstmd) dstmd->hp=battle_get_max_hp(&dstmd->bl); - break; - case SA_SUMMONMONSTER: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if (sd) mob_once_spawn(sd,map[sd->bl.m].name,sd->bl.x,sd->bl.y,"--ja--",-1,1,""); - break; - case SA_LEVELUP: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if (sd && pc_nextbaseexp(sd)) pc_gainexp(sd,pc_nextbaseexp(sd)*10/100,0); - break; - - case SA_INSTANTDEATH: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if (sd) pc_damage(NULL,sd,sd->status.max_hp); - break; - - case SA_QUESTION: - case SA_GRAVITY: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - break; - case SA_CLASSCHANGE: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if(dstmd) mob_class_change(dstmd,changeclass); - break; - case SA_MONOCELL: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if(dstmd) mob_class_change(dstmd,poringclass); - break; - case SA_DEATH: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if (dstsd) pc_damage(NULL,dstsd,dstsd->status.max_hp); - if (dstmd) mob_damage(NULL,dstmd,dstmd->hp,1); - break; - case SA_REVERSEORCISH: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if (dstsd) pc_setoption(dstsd,dstsd->status.option|0x0800); - break; - case SA_FORTUNE: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if(sd) pc_getzeny(sd,battle_get_lv(bl)*100); - break; - case AL_INCAGI: /* 速度増加 */ - case AL_BLESSING: /* ブレッシング */ - case PR_SLOWPOISON: - case PR_IMPOSITIO: /* イムポシティオマヌス */ - case PR_LEXAETERNA: /* レックスエーテルナ */ - case PR_SUFFRAGIUM: /* サフラギウム */ - case PR_BENEDICTIO: /* 聖体降福 */ - case CR_PROVIDENCE: /* プロヴィデンス */ - case CG_MARIONETTE: /* マリオネットコントロール */ - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ){ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - }else{ - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - clif_skill_nodamage(src,bl,skillid,skilllv,1); - } - break; - - case SA_FLAMELAUNCHER: // added failure chance and chance to break weapon if turned on [Valaris] - case SA_FROSTWEAPON: - case SA_LIGHTNINGLOADER: - case SA_SEISMICWEAPON: - if(bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ){ - clif_skill_nodamage(src,bl,skillid,skilllv,0); - break; - } - if(bl->type==BL_PC) { - struct map_session_data *sd2=(struct map_session_data *)bl; - if(sd2->status.weapon==0 || sd2->sc_data[SC_FLAMELAUNCHER].timer!=-1 || sd2->sc_data[SC_FROSTWEAPON].timer!=-1 || - sd2->sc_data[SC_LIGHTNINGLOADER].timer!=-1 || sd2->sc_data[SC_SEISMICWEAPON].timer!=-1 || - sd2->sc_data[SC_ENCPOISON].timer!=-1) { - clif_skill_fail(sd,skillid,0,0); - clif_skill_nodamage(src,bl,skillid,skilllv,0); - break; - } - } - if(MRAND(100) > (75+skilllv*1) && (skilllv != 5)) { - clif_skill_fail(sd,skillid,0,0); - clif_skill_nodamage(src,bl,skillid,skilllv,0); - if(bl->type==BL_PC && battle_config.equipment_breaking) { - struct map_session_data *sd2=(struct map_session_data *)bl; - if(sd!=sd2) clif_displaymessage(sd->fd,"You broke target's weapon"); - pc_breakweapon(sd2); - } - break; - } - else { - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - clif_skill_nodamage(src,bl,skillid,skilllv,1); - } - break; + case PR_LEXDIVINA: /* レックスディビーナ */ + { + struct status_change *sc_data = battle_get_sc_data (bl); + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + if (sc_data && sc_data[SC_DIVINA].timer != -1) + skill_status_change_end (bl, SC_DIVINA, -1); + else if (MRAND (100) < sc_def_vit) + { + skill_status_change_start (bl, + SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), + 0); + } + } + break; + case SA_ABRACADABRA: + break; + case SA_COMA: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + if (dstsd) + { + dstsd->status.hp = 1; + dstsd->status.sp = 1; + clif_updatestatus (dstsd, SP_HP); + clif_updatestatus (dstsd, SP_SP); + } + if (dstmd) + dstmd->hp = 1; + break; + case SA_FULLRECOVERY: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + if (dstsd) + pc_heal (dstsd, dstsd->status.max_hp, dstsd->status.max_sp); + if (dstmd) + dstmd->hp = battle_get_max_hp (&dstmd->bl); + break; + case SA_SUMMONMONSTER: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (sd) + mob_once_spawn (sd, map[sd->bl.m].name, sd->bl.x, sd->bl.y, + "--ja--", -1, 1, ""); + break; + case SA_LEVELUP: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (sd && pc_nextbaseexp (sd)) + pc_gainexp (sd, pc_nextbaseexp (sd) * 10 / 100, 0); + break; - case PR_ASPERSIO: /* アスペルシオ */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - if(bl->type==BL_MOB) - break; - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - break; - case PR_KYRIE: /* キリエエレイソン */ - clif_skill_nodamage(bl,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - break; - case KN_AUTOCOUNTER: /* オートカウンター */ - case KN_TWOHANDQUICKEN: /* ツーハンドクイッケン */ - case CR_SPEARQUICKEN: /* スピアクイッケン */ - case CR_REFLECTSHIELD: - case AS_POISONREACT: /* ポイズンリアクト */ - case MC_LOUD: /* ラウドボイス */ - case MG_ENERGYCOAT: /* エナジーコート */ - case SM_ENDURE: /* インデュア */ - case MG_SIGHT: /* サイト */ - case AL_RUWACH: /* ルアフ */ - case MO_EXPLOSIONSPIRITS: // 爆裂波動 - case MO_STEELBODY: // 金剛 - case LK_AURABLADE: /* オーラブレード */ - case LK_PARRYING: /* パリイング */ - case LK_CONCENTRATION: /* コンセントレーション */ - case LK_BERSERK: /* バーサーク */ - case HP_ASSUMPTIO: /* */ - case WS_CARTBOOST: /* カートブースト */ - case SN_SIGHT: /* トゥルーサイト */ - case WS_MELTDOWN: /* メルトダウン */ - case ST_REJECTSWORD: /* リジェクトソード */ - case HW_MAGICPOWER: /* 魔法力増幅 */ - case PF_MEMORIZE: /* メモライズ */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - break; - case AS_ENCHANTPOISON: // Prevent spamming [Valaris] - if(bl->type==BL_PC) { - struct map_session_data *sd2=(struct map_session_data *)bl; - if(sd2->sc_data[SC_FLAMELAUNCHER].timer!=-1 || sd2->sc_data[SC_FROSTWEAPON].timer!=-1 || - sd2->sc_data[SC_LIGHTNINGLOADER].timer!=-1 || sd2->sc_data[SC_SEISMICWEAPON].timer!=-1 || - sd2->sc_data[SC_ENCPOISON].timer!=-1) { - clif_skill_nodamage(src,bl,skillid,skilllv,0); - clif_skill_fail(sd,skillid,0,0); - break; - } - } - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - break; - case LK_TENSIONRELAX: /* テンションリラックス */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - pc_setsit(sd); - clif_sitting(sd->fd,sd); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - break; - case MC_CHANGECART: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - break; - case AC_CONCENTRATION: /* 集中力向上 */ - { - int range = 1; - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - map_foreachinarea( skill_status_change_timer_sub, - src->m, src->x-range, src->y-range, src->x+range,src->y+range,0, - src,SkillStatusChangeTable[skillid],tick); - } - break; - case SM_PROVOKE: /* プロボック */ - { - struct status_change *sc_data = battle_get_sc_data(bl); - - /* MVPmobと不死には効かない */ - if((bl->type==BL_MOB && battle_get_mode(bl)&0x20) || battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))) //不死には効かない - { - map_freeblock_unlock(); - return 1; - } + case SA_INSTANTDEATH: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (sd) + pc_damage (NULL, sd, sd->status.max_hp); + break; - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - - if(dstmd && dstmd->skilltimer!=-1 && dstmd->state.skillcastcancel) // 詠唱妨害 - skill_castcancel(bl,0); - if(dstsd && dstsd->skilltimer!=-1 && (!dstsd->special_state.no_castcancel || map[bl->m].flag.gvg) - && dstsd->state.skillcastcancel && !dstsd->special_state.no_castcancel2) - skill_castcancel(bl,0); - - if(sc_data){ - if(sc_data[SC_FREEZE].timer!=-1) - skill_status_change_end(bl,SC_FREEZE,-1); - if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0) - skill_status_change_end(bl,SC_STONE,-1); - if(sc_data[SC_SLEEP].timer!=-1) - skill_status_change_end(bl,SC_SLEEP,-1); - } + case SA_QUESTION: + case SA_GRAVITY: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + break; + case SA_CLASSCHANGE: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (dstmd) + mob_class_change (dstmd, changeclass); + break; + case SA_MONOCELL: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (dstmd) + mob_class_change (dstmd, poringclass); + break; + case SA_DEATH: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (dstsd) + pc_damage (NULL, dstsd, dstsd->status.max_hp); + if (dstmd) + mob_damage (NULL, dstmd, dstmd->hp, 1); + break; + case SA_REVERSEORCISH: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (dstsd) + pc_setoption (dstsd, dstsd->status.option | 0x0800); + break; + case SA_FORTUNE: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (sd) + pc_getzeny (sd, battle_get_lv (bl) * 100); + break; + case AL_INCAGI: /* 速度増加 */ + case AL_BLESSING: /* ブレッシング */ + case PR_SLOWPOISON: + case PR_IMPOSITIO: /* イムポシティオマヌス */ + case PR_LEXAETERNA: /* レックスエーテルナ */ + case PR_SUFFRAGIUM: /* サフラギウム */ + case PR_BENEDICTIO: /* 聖体降福 */ + case CR_PROVIDENCE: /* プロヴィデンス */ + case CG_MARIONETTE: /* マリオネットコントロール */ + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + } + else + { + skill_status_change_start (bl, + SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), + 0); + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + } + break; - if(bl->type==BL_MOB) { - int range = skill_get_range(skillid,skilllv); - if(range < 0) - range = battle_get_range(src) - (range + 1); - mob_target((struct mob_data *)bl,src,range); - } - } - break; - - case CR_DEVOTION: /* ディボーション */ - if(sd && dstsd){ - //転生や養子の場合の元の職業を算出する - - int lv = sd->status.base_level-dstsd->status.base_level; - lv = (lv<0)?-lv:lv; - if((dstsd->bl.type!=BL_PC) // 相手はPCじゃないとだめ - ||(sd->bl.id == dstsd->bl.id) // 相手が自分はだめ - ||(lv > 10) // レベル差±10まで - ||(!sd->status.party_id && !sd->status.guild_id) // PTにもギルドにも所属無しはだめ - ||((sd->status.party_id != dstsd->status.party_id) // 同じパーティーか、 - ||(sd->status.guild_id != dstsd->status.guild_id)) // 同じギルドじゃないとだめ - ||(dstsd->status.class==14||dstsd->status.class==21 - ||dstsd->status.class==4015||dstsd->status.class==4022)){ // クルセだめ - clif_skill_fail(sd,skillid,0,0); - map_freeblock_unlock(); - return 1; - } - for(i=0;i<skilllv;i++){ - if(!sd->dev.val1[i]){ // 空きがあったら入れる - sd->dev.val1[i] = bl->id; - sd->dev.val2[i] = bl->id; - break; - }else if(i==skilllv-1){ // 空きがなかった - clif_skill_fail(sd,skillid,0,0); - map_freeblock_unlock(); - return 1; - } - } - clif_skill_nodamage(src,bl,skillid,skilllv,1); - clif_devotion(sd,bl->id); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],src->id,1,0,0,1000*(15+15*skilllv),0 ); - } - else clif_skill_fail(sd,skillid,0,0); - break; - case MO_CALLSPIRITS: // 気功 - if(sd) { - clif_skill_nodamage(src,bl,skillid,skilllv,1); - pc_addspiritball(sd,skill_get_time(skillid,skilllv),skilllv); - } - break; - case CH_SOULCOLLECT: // 狂気功 - if(sd) { - clif_skill_nodamage(src,bl,skillid,skilllv,1); - for(i=0;i<5;i++) - pc_addspiritball(sd,skill_get_time(skillid,skilllv),5); - } - break; - case MO_BLADESTOP: // 白刃取り - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_status_change_start(src,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - break; - case MO_ABSORBSPIRITS: // 気奪 - i=0; - if(sd && dstsd) { - if(sd == dstsd || map[sd->bl.m].flag.pvp || map[sd->bl.m].flag.gvg) { - if(dstsd->spiritball > 0) { - clif_skill_nodamage(src,bl,skillid,skilllv,1); - i = dstsd->spiritball * 7; - pc_delspiritball(dstsd,dstsd->spiritball,0); - if(i > 0x7FFF) - i = 0x7FFF; - if(sd->status.sp + i > sd->status.max_sp) - i = sd->status.max_sp - sd->status.sp; - } - } - }else if(sd && dstmd){ //対象がモンスターの場合 - //20%の確率で対象のLv*2のSPを回復する。成功したときはターゲット(σ゚Д゚)σゲッツ!! - if(MRAND(100)<20){ - i=2*mob_db[dstmd->class].lv; - mob_target(dstmd,src,0); - } - } - if(i){ - sd->status.sp += i; - clif_heal(sd->fd,SP_SP,i); - } - else - clif_skill_nodamage(src,bl,skillid,skilllv,0); - break; - - case AC_MAKINGARROW: /* 矢作成 */ + case SA_FLAMELAUNCHER: // added failure chance and chance to break weapon if turned on [Valaris] + case SA_FROSTWEAPON: + case SA_LIGHTNINGLOADER: + case SA_SEISMICWEAPON: + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 0); + break; + } + if (bl->type == BL_PC) + { + struct map_session_data *sd2 = (struct map_session_data *) bl; + if (sd2->status.weapon == 0 + || sd2->sc_data[SC_FLAMELAUNCHER].timer != -1 + || sd2->sc_data[SC_FROSTWEAPON].timer != -1 + || sd2->sc_data[SC_LIGHTNINGLOADER].timer != -1 + || sd2->sc_data[SC_SEISMICWEAPON].timer != -1 + || sd2->sc_data[SC_ENCPOISON].timer != -1) + { + clif_skill_fail (sd, skillid, 0, 0); + clif_skill_nodamage (src, bl, skillid, skilllv, 0); + break; + } + } + if (MRAND (100) > (75 + skilllv * 1) && (skilllv != 5)) + { + clif_skill_fail (sd, skillid, 0, 0); + clif_skill_nodamage (src, bl, skillid, skilllv, 0); + if (bl->type == BL_PC && battle_config.equipment_breaking) + { + struct map_session_data *sd2 = + (struct map_session_data *) bl; + if (sd != sd2) + clif_displaymessage (sd->fd, + "You broke target's weapon"); + pc_breakweapon (sd2); + } + break; + } + else + { + skill_status_change_start (bl, + SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), + 0); + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + } + break; + + case PR_ASPERSIO: /* アスペルシオ */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + if (bl->type == BL_MOB) + break; + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + break; + case PR_KYRIE: /* キリエエレイソン */ + clif_skill_nodamage (bl, bl, skillid, skilllv, 1); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + break; + case KN_AUTOCOUNTER: /* オートカウンター */ + case KN_TWOHANDQUICKEN: /* ツーハンドクイッケン */ + case CR_SPEARQUICKEN: /* スピアクイッケン */ + case CR_REFLECTSHIELD: + case AS_POISONREACT: /* ポイズンリアクト */ + case MC_LOUD: /* ラウドボイス */ + case MG_ENERGYCOAT: /* エナジーコート */ + case SM_ENDURE: /* インデュア */ + case MG_SIGHT: /* サイト */ + case AL_RUWACH: /* ルアフ */ + case MO_EXPLOSIONSPIRITS: // 爆裂波動 + case MO_STEELBODY: // 金剛 + case LK_AURABLADE: /* オーラブレード */ + case LK_PARRYING: /* パリイング */ + case LK_CONCENTRATION: /* コンセントレーション */ + case LK_BERSERK: /* バーサーク */ + case HP_ASSUMPTIO: /* */ + case WS_CARTBOOST: /* カートブースト */ + case SN_SIGHT: /* トゥルーサイト */ + case WS_MELTDOWN: /* メルトダウン */ + case ST_REJECTSWORD: /* リジェクトソード */ + case HW_MAGICPOWER: /* 魔法力増幅 */ + case PF_MEMORIZE: /* メモライズ */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + break; + case AS_ENCHANTPOISON: // Prevent spamming [Valaris] + if (bl->type == BL_PC) + { + struct map_session_data *sd2 = (struct map_session_data *) bl; + if (sd2->sc_data[SC_FLAMELAUNCHER].timer != -1 + || sd2->sc_data[SC_FROSTWEAPON].timer != -1 + || sd2->sc_data[SC_LIGHTNINGLOADER].timer != -1 + || sd2->sc_data[SC_SEISMICWEAPON].timer != -1 + || sd2->sc_data[SC_ENCPOISON].timer != -1) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 0); + clif_skill_fail (sd, skillid, 0, 0); + break; + } + } + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + break; + case LK_TENSIONRELAX: /* テンションリラックス */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + pc_setsit (sd); + clif_sitting (sd->fd, sd); + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + break; + case MC_CHANGECART: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + break; + case AC_CONCENTRATION: /* 集中力向上 */ + { + int range = 1; + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + map_foreachinarea (skill_status_change_timer_sub, src->m, + src->x - range, src->y - range, src->x + range, + src->y + range, 0, src, + SkillStatusChangeTable[skillid], tick); + } + break; + case SM_PROVOKE: /* プロボック */ + { + struct status_change *sc_data = battle_get_sc_data (bl); + + /* MVPmobと不死には効かない */ + if ((bl->type == BL_MOB && battle_get_mode (bl) & 0x20) || battle_check_undead (battle_get_race (bl), battle_get_elem_type (bl))) //不死には効かない + { + map_freeblock_unlock (); + return 1; + } + + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + + if (dstmd && dstmd->skilltimer != -1 && dstmd->state.skillcastcancel) // 詠唱妨害 + skill_castcancel (bl, 0); + if (dstsd && dstsd->skilltimer != -1 + && (!dstsd->special_state.no_castcancel + || map[bl->m].flag.gvg) && dstsd->state.skillcastcancel + && !dstsd->special_state.no_castcancel2) + skill_castcancel (bl, 0); + + if (sc_data) + { + if (sc_data[SC_FREEZE].timer != -1) + skill_status_change_end (bl, SC_FREEZE, -1); + if (sc_data[SC_STONE].timer != -1 + && sc_data[SC_STONE].val2 == 0) + skill_status_change_end (bl, SC_STONE, -1); + if (sc_data[SC_SLEEP].timer != -1) + skill_status_change_end (bl, SC_SLEEP, -1); + } + + if (bl->type == BL_MOB) + { + int range = skill_get_range (skillid, skilllv); + if (range < 0) + range = battle_get_range (src) - (range + 1); + mob_target ((struct mob_data *) bl, src, range); + } + } + break; + + case CR_DEVOTION: /* ディボーション */ + if (sd && dstsd) + { + //転生や養子の場合の元の職業を算出する + + int lv = sd->status.base_level - dstsd->status.base_level; + lv = (lv < 0) ? -lv : lv; + if ((dstsd->bl.type != BL_PC) // 相手はPCじゃないとだめ + || (sd->bl.id == dstsd->bl.id) // 相手が自分はだめ + || (lv > 10) // レベル差±10まで + || (!sd->status.party_id && !sd->status.guild_id) // PTにもギルドにも所属無しはだめ + || ((sd->status.party_id != dstsd->status.party_id) // 同じパーティーか、 + || (sd->status.guild_id != dstsd->status.guild_id)) // 同じギルドじゃないとだめ + || (dstsd->status.class == 14 || dstsd->status.class == 21 + || dstsd->status.class == 4015 + || dstsd->status.class == 4022)) + { // クルセだめ + clif_skill_fail (sd, skillid, 0, 0); + map_freeblock_unlock (); + return 1; + } + for (i = 0; i < skilllv; i++) + { + if (!sd->dev.val1[i]) + { // 空きがあったら入れる + sd->dev.val1[i] = bl->id; + sd->dev.val2[i] = bl->id; + break; + } + else if (i == skilllv - 1) + { // 空きがなかった + clif_skill_fail (sd, skillid, 0, 0); + map_freeblock_unlock (); + return 1; + } + } + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + clif_devotion (sd, bl->id); + skill_status_change_start (bl, + SkillStatusChangeTable[skillid], + src->id, 1, 0, 0, + 1000 * (15 + 15 * skilllv), 0); + } + else + clif_skill_fail (sd, skillid, 0, 0); + break; + case MO_CALLSPIRITS: // 気功 + if (sd) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + pc_addspiritball (sd, skill_get_time (skillid, skilllv), + skilllv); + } + break; + case CH_SOULCOLLECT: // 狂気功 + if (sd) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + for (i = 0; i < 5; i++) + pc_addspiritball (sd, skill_get_time (skillid, skilllv), + 5); + } + break; + case MO_BLADESTOP: // 白刃取り + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_status_change_start (src, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + break; + case MO_ABSORBSPIRITS: // 気奪 + i = 0; + if (sd && dstsd) + { + if (sd == dstsd || map[sd->bl.m].flag.pvp + || map[sd->bl.m].flag.gvg) + { + if (dstsd->spiritball > 0) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + i = dstsd->spiritball * 7; + pc_delspiritball (dstsd, dstsd->spiritball, 0); + if (i > 0x7FFF) + i = 0x7FFF; + if (sd->status.sp + i > sd->status.max_sp) + i = sd->status.max_sp - sd->status.sp; + } + } + } + else if (sd && dstmd) + { //対象がモンスターの場合 + //20%の確率で対象のLv*2のSPを回復する。成功したときはターゲット(σ゚Д゚)σゲッツ!! + if (MRAND (100) < 20) + { + i = 2 * mob_db[dstmd->class].lv; + mob_target (dstmd, src, 0); + } + } + if (i) + { + sd->status.sp += i; + clif_heal (sd->fd, SP_SP, i); + } + else + clif_skill_nodamage (src, bl, skillid, skilllv, 0); + break; + + case AC_MAKINGARROW: /* 矢作成 */ /* if(sd) { clif_arrow_create_list(sd); clif_skill_nodamage(src,bl,skillid,skilllv,1); }*/ - break; + break; - case AM_PHARMACY: /* ポーション作成 */ + case AM_PHARMACY: /* ポーション作成 */ /* if(sd) { clif_skill_produce_mix_list(sd,32); clif_skill_nodamage(src,bl,skillid,skilllv,1); }*/ - break; - case WS_CREATECOIN: /* クリエイトコイン */ + break; + case WS_CREATECOIN: /* クリエイトコイン */ /* if(sd) { clif_skill_produce_mix_list(sd,64); clif_skill_nodamage(src,bl,skillid,skilllv,1); }*/ - break; - case WS_CREATENUGGET: /* 塊製造 */ + break; + case WS_CREATENUGGET: /* 塊製造 */ /* if(sd) { clif_skill_produce_mix_list(sd,128); clif_skill_nodamage(src,bl,skillid,skilllv,1); }*/ - break; - case BS_HAMMERFALL: /* ハンマーフォール */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_weapon_damage ) - break; - if( MRAND(100) < (20+ 10*skilllv)*sc_def_vit/100 ) { - skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - } - break; - - case RG_RAID: /* サプライズアタック */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - { - int x=bl->x,y=bl->y; - skill_area_temp[1]=bl->id; - skill_area_temp[2]=x; - skill_area_temp[3]=y; - map_foreachinarea(skill_area_sub, - bl->m,x-1,y-1,x+1,y+1,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY|1, - skill_castend_damage_id); - } - skill_status_change_end(src, SC_HIDING, -1); // ハイディング解除 - break; - - case KN_BRANDISHSPEAR: /*ブランディッシュスピア*/ - { - int c,n=4,ar; - int dir = map_calc_dir(src,bl->x,bl->y); - struct square tc; - int x=bl->x,y=bl->y; - ar=skilllv/3; - skill_brandishspear_first(&tc,dir,x,y); - skill_brandishspear_dir(&tc,dir,4); - /* 範囲C */ - if(skilllv == 10){ - for(c=1;c<4;c++){ - map_foreachinarea(skill_area_sub, - bl->m,tc.val1[c],tc.val2[c],tc.val1[c],tc.val2[c],0, - src,skillid,skilllv,tick, flag|BCT_ENEMY|n, - skill_castend_damage_id); - } - } - /* 範囲BA */ - if(skilllv > 6){ - skill_brandishspear_dir(&tc,dir,-1); - n--; - }else{ - skill_brandishspear_dir(&tc,dir,-2); - n-=2; - } + break; + case BS_HAMMERFALL: /* ハンマーフォール */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_weapon_damage) + break; + if (MRAND (100) < (20 + 10 * skilllv) * sc_def_vit / 100) + { + skill_status_change_start (bl, SC_STAN, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + } + break; - if(skilllv > 3){ - for(c=0;c<5;c++){ - map_foreachinarea(skill_area_sub, - bl->m,tc.val1[c],tc.val2[c],tc.val1[c],tc.val2[c],0, - src,skillid,skilllv,tick, flag|BCT_ENEMY|n, - skill_castend_damage_id); - if(skilllv > 6 && n==3 && c==4){ - skill_brandishspear_dir(&tc,dir,-1); - n--;c=-1; - } - } - } - /* 範囲@ */ - for(c=0;c<10;c++){ - if(c==0||c==5) skill_brandishspear_dir(&tc,dir,-1); - map_foreachinarea(skill_area_sub, - bl->m,tc.val1[c%5],tc.val2[c%5],tc.val1[c%5],tc.val2[c%5],0, - src,skillid,skilllv,tick, flag|BCT_ENEMY|1, - skill_castend_damage_id); - } - } - break; - - /* パーティスキル */ - case AL_ANGELUS: /* エンジェラス */ - case PR_MAGNIFICAT: /* マグニフィカート */ - case PR_GLORIA: /* グロリア */ - case SN_WINDWALK: /* ウインドウォーク */ - if(sd == NULL || sd->status.party_id==0 || (flag&1) ){ - /* 個別の処理 */ - clif_skill_nodamage(bl,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0); - } - else{ - /* パーティ全体への処理 */ - party_foreachsamemap(skill_area_sub, - sd,1, - src,skillid,skilllv,tick, flag|BCT_PARTY|1, - skill_castend_nodamage_id); - } - break; - case BS_ADRENALINE: /* アドレナリンラッシュ */ - case BS_WEAPONPERFECT: /* ウェポンパーフェクション */ - case BS_OVERTHRUST: /* オーバートラスト */ - if(sd == NULL || sd->status.party_id==0 || (flag&1) ){ - /* 個別の処理 */ - clif_skill_nodamage(bl,bl,skillid,skilllv,1); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,(src == bl)? 1:0,0,0,skill_get_time(skillid,skilllv),0); - } - else{ - /* パーティ全体への処理 */ - party_foreachsamemap(skill_area_sub, - sd,1, - src,skillid,skilllv,tick, flag|BCT_PARTY|1, - skill_castend_nodamage_id); - } - break; - - /*(付加と解除が必要) */ - case BS_MAXIMIZE: /* マキシマイズパワー */ - case NV_TRICKDEAD: /* 死んだふり */ - case CR_DEFENDER: /* ディフェンダー */ - case CR_AUTOGUARD: /* オートガード */ - { - struct status_change *tsc_data = battle_get_sc_data(bl); - int sc=SkillStatusChangeTable[skillid]; - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( tsc_data ){ - if( tsc_data[sc].timer==-1 ) - /* 付加する */ - skill_status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0); - else - /* 解除する */ - skill_status_change_end(bl, sc, -1); - } - } - break; - - case TF_HIDING: /* ハイディング */ - { - struct status_change *tsc_data = battle_get_sc_data(bl); - int sc=SkillStatusChangeTable[skillid]; - clif_skill_nodamage(src,bl,skillid,-1,1); - if( tsc_data ){ - if( tsc_data[sc].timer==-1 ) - /* 付加する */ - skill_status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0); - else - /* 解除する */ - skill_status_change_end(bl, sc, -1); - } - } - break; - - case AS_CLOAKING: /* クローキング */ - { - struct status_change *tsc_data = battle_get_sc_data(bl); - int sc=SkillStatusChangeTable[skillid]; - clif_skill_nodamage(src,bl,skillid,-1,1); - if( tsc_data ){ - if( tsc_data[sc].timer==-1 ) - /* 付加する */ - skill_status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0); - else - /* 解除する */ - skill_status_change_end(bl, sc, -1); - } + case RG_RAID: /* サプライズアタック */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + { + int x = bl->x, y = bl->y; + skill_area_temp[1] = bl->id; + skill_area_temp[2] = x; + skill_area_temp[3] = y; + map_foreachinarea (skill_area_sub, + bl->m, x - 1, y - 1, x + 1, y + 1, 0, + src, skillid, skilllv, tick, + flag | BCT_ENEMY | 1, + skill_castend_damage_id); + } + skill_status_change_end (src, SC_HIDING, -1); // ハイディング解除 + break; - skill_check_cloaking(bl); - } - break; - - case ST_CHASEWALK: /* ハイディング */ - { - struct status_change *tsc_data = battle_get_sc_data(bl); - int sc=SkillStatusChangeTable[skillid]; - clif_skill_nodamage(src,bl,skillid,-1,1); - if( tsc_data ){ - if( tsc_data[sc].timer==-1 ) - /* 付加する */ - skill_status_change_start(bl,sc,skilllv,0,0,0,skill_get_time(skillid,skilllv),0); - else - /* 解除する */ - skill_status_change_end(bl, sc, -1); - } - } - break; - - /* 対地スキル */ - case BD_LULLABY: /* 子守唄 */ - case BD_RICHMANKIM: /* ニヨルドの宴 */ - case BD_ETERNALCHAOS: /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ - case BD_ROKISWEIL: /* ロキの叫び */ - case BD_INTOABYSS: /* 深淵の中に */ - case BD_SIEGFRIED: /* 不死身のジークフリード */ - case BA_DISSONANCE: /* 不協和音 */ - case BA_POEMBRAGI: /* ブラギの詩 */ - case BA_WHISTLE: /* 口笛 */ - case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */ - case BA_APPLEIDUN: /* イドゥンの林檎 */ - case DC_UGLYDANCE: /* 自分勝手なダンス */ - case DC_HUMMING: /* ハミング */ - case DC_DONTFORGETME: /* 私を忘れないで… */ - case DC_FORTUNEKISS: /* 幸運のキス */ - case DC_SERVICEFORYOU: /* サービスフォーユー */ - case CG_MOONLIT: /* 月明りの泉に落ちる花びら */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_unitsetting(src,skillid,skilllv,src->x,src->y,0); - break; - - case HP_BASILICA: /* バジリカ */ - case PA_GOSPEL: /* ゴスペル */ - skill_clear_unitgroup(src); - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_unitsetting(src,skillid,skilllv,src->x,src->y,0); - break; - - case BD_ADAPTATION: /* アドリブ */ - { - struct status_change *sc_data = battle_get_sc_data(src); - if(sc_data && sc_data[SC_DANCING].timer!=-1){ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_stop_dancing(src,0); - } - } - break; - - case BA_FROSTJOKE: /* 寒いジョーク */ - case DC_SCREAM: /* スクリーム */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_addtimerskill(src,tick+3000,bl->id,0,0,skillid,skilllv,0,flag); - break; - - case TF_STEAL: // スティール - if(sd) { - if(pc_steal_item(sd,bl)) - clif_skill_nodamage(src,bl,skillid,skilllv,1); - else - clif_skill_nodamage(src,bl,skillid,skilllv,0); - } - break; - - case RG_STEALCOIN: // スティールコイン - if(sd) { - if(pc_steal_coin(sd,bl)) { - int range = skill_get_range(skillid,skilllv); - if(range < 0) - range = battle_get_range(src) - (range + 1); - clif_skill_nodamage(src,bl,skillid,skilllv,1); - mob_target((struct mob_data *)bl,src,range); - } - else - clif_skill_nodamage(src,bl,skillid,skilllv,0); - } - break; + case KN_BRANDISHSPEAR: /*ブランディッシュスピア */ + { + int c, n = 4, ar; + int dir = map_calc_dir (src, bl->x, bl->y); + struct square tc; + int x = bl->x, y = bl->y; + ar = skilllv / 3; + skill_brandishspear_first (&tc, dir, x, y); + skill_brandishspear_dir (&tc, dir, 4); + /* 範囲C */ + if (skilllv == 10) + { + for (c = 1; c < 4; c++) + { + map_foreachinarea (skill_area_sub, + bl->m, tc.val1[c], tc.val2[c], + tc.val1[c], tc.val2[c], 0, src, + skillid, skilllv, tick, + flag | BCT_ENEMY | n, + skill_castend_damage_id); + } + } + /* 範囲BA */ + if (skilllv > 6) + { + skill_brandishspear_dir (&tc, dir, -1); + n--; + } + else + { + skill_brandishspear_dir (&tc, dir, -2); + n -= 2; + } + + if (skilllv > 3) + { + for (c = 0; c < 5; c++) + { + map_foreachinarea (skill_area_sub, + bl->m, tc.val1[c], tc.val2[c], + tc.val1[c], tc.val2[c], 0, src, + skillid, skilllv, tick, + flag | BCT_ENEMY | n, + skill_castend_damage_id); + if (skilllv > 6 && n == 3 && c == 4) + { + skill_brandishspear_dir (&tc, dir, -1); + n--; + c = -1; + } + } + } + /* 範囲@ */ + for (c = 0; c < 10; c++) + { + if (c == 0 || c == 5) + skill_brandishspear_dir (&tc, dir, -1); + map_foreachinarea (skill_area_sub, + bl->m, tc.val1[c % 5], tc.val2[c % 5], + tc.val1[c % 5], tc.val2[c % 5], 0, src, + skillid, skilllv, tick, + flag | BCT_ENEMY | 1, + skill_castend_damage_id); + } + } + break; - case MG_STONECURSE: /* ストーンカース */ - if (bl->type==BL_MOB && battle_get_mode(bl)&0x20) { - clif_skill_fail(sd,sd->skillid,0,0); - break; - } - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - if( MRAND(100) < skilllv*4+20 && !battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))) - skill_status_change_start(bl,SC_STONE,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - else if(sd) - clif_skill_fail(sd,skillid,0,0); - break; - - case NV_FIRSTAID: /* 応急手当 */ - clif_skill_nodamage(src,bl,skillid,5,1); - battle_heal(NULL,bl,5,0,0); - break; - - case AL_CURE: /* キュアー */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - skill_status_change_end(bl, SC_SILENCE , -1 ); - skill_status_change_end(bl, SC_BLIND , -1 ); - skill_status_change_end(bl, SC_CONFUSION, -1 ); - if( battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)) ){//アンデッドなら暗闇効果 - skill_status_change_start(bl, SC_CONFUSION,1,0,0,0,6000,0); - } - break; + /* パーティスキル */ + case AL_ANGELUS: /* エンジェラス */ + case PR_MAGNIFICAT: /* マグニフィカート */ + case PR_GLORIA: /* グロリア */ + case SN_WINDWALK: /* ウインドウォーク */ + if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) + { + /* 個別の処理 */ + clif_skill_nodamage (bl, bl, skillid, skilllv, 1); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + skill_status_change_start (bl, + SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), + 0); + } + else + { + /* パーティ全体への処理 */ + party_foreachsamemap (skill_area_sub, + sd, 1, + src, skillid, skilllv, tick, + flag | BCT_PARTY | 1, + skill_castend_nodamage_id); + } + break; + case BS_ADRENALINE: /* アドレナリンラッシュ */ + case BS_WEAPONPERFECT: /* ウェポンパーフェクション */ + case BS_OVERTHRUST: /* オーバートラスト */ + if (sd == NULL || sd->status.party_id == 0 || (flag & 1)) + { + /* 個別の処理 */ + clif_skill_nodamage (bl, bl, skillid, skilllv, 1); + skill_status_change_start (bl, + SkillStatusChangeTable[skillid], + skilllv, (src == bl) ? 1 : 0, 0, 0, + skill_get_time (skillid, skilllv), + 0); + } + else + { + /* パーティ全体への処理 */ + party_foreachsamemap (skill_area_sub, + sd, 1, + src, skillid, skilllv, tick, + flag | BCT_PARTY | 1, + skill_castend_nodamage_id); + } + break; - case TF_DETOXIFY: /* 解毒 */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_status_change_end(bl, SC_POISON , -1 ); - break; + /*(付加と解除が必要) */ + case BS_MAXIMIZE: /* マキシマイズパワー */ + case NV_TRICKDEAD: /* 死んだふり */ + case CR_DEFENDER: /* ディフェンダー */ + case CR_AUTOGUARD: /* オートガード */ + { + struct status_change *tsc_data = battle_get_sc_data (bl); + int sc = SkillStatusChangeTable[skillid]; + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (tsc_data) + { + if (tsc_data[sc].timer == -1) + /* 付加する */ + skill_status_change_start (bl, sc, skilllv, 0, 0, 0, + skill_get_time (skillid, + skilllv), 0); + else + /* 解除する */ + skill_status_change_end (bl, sc, -1); + } + } + break; - case PR_STRECOVERY: /* リカバリー */ - { - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - skill_status_change_end(bl, SC_FREEZE , -1 ); - skill_status_change_end(bl, SC_STONE , -1 ); - skill_status_change_end(bl, SC_SLEEP , -1 ); - skill_status_change_end(bl, SC_STAN , -1 ); - if( battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl)) ){//アンデッドなら暗闇効果 - int blind_time; - //blind_time=30-battle_get_vit(bl)/10-battle_get_int/15; - blind_time=30*(100-(battle_get_int(bl)+battle_get_vit(bl))/2)/100; - if(MRAND(100) < (100-(battle_get_int(bl)/2+battle_get_vit(bl)/3+battle_get_luk(bl)/10))) - skill_status_change_start(bl, SC_BLIND,1,0,0,0,blind_time,0); - } - if(dstmd){ - dstmd->attacked_id=0; - dstmd->target_id=0; - dstmd->state.targettype = NONE_ATTACKABLE; - dstmd->state.skillstate=MSS_IDLE; - dstmd->next_walktime=tick+MRAND(3000)+3000; - } - } - break; + case TF_HIDING: /* ハイディング */ + { + struct status_change *tsc_data = battle_get_sc_data (bl); + int sc = SkillStatusChangeTable[skillid]; + clif_skill_nodamage (src, bl, skillid, -1, 1); + if (tsc_data) + { + if (tsc_data[sc].timer == -1) + /* 付加する */ + skill_status_change_start (bl, sc, skilllv, 0, 0, 0, + skill_get_time (skillid, + skilllv), 0); + else + /* 解除する */ + skill_status_change_end (bl, sc, -1); + } + } + break; - case WZ_ESTIMATION: /* モンスター情報 */ - if(src->type==BL_PC){ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - clif_skill_estimation((struct map_session_data *)src,bl); - } - break; + case AS_CLOAKING: /* クローキング */ + { + struct status_change *tsc_data = battle_get_sc_data (bl); + int sc = SkillStatusChangeTable[skillid]; + clif_skill_nodamage (src, bl, skillid, -1, 1); + if (tsc_data) + { + if (tsc_data[sc].timer == -1) + /* 付加する */ + skill_status_change_start (bl, sc, skilllv, 0, 0, 0, + skill_get_time (skillid, + skilllv), 0); + else + /* 解除する */ + skill_status_change_end (bl, sc, -1); + } + + skill_check_cloaking (bl); + } + break; + + case ST_CHASEWALK: /* ハイディング */ + { + struct status_change *tsc_data = battle_get_sc_data (bl); + int sc = SkillStatusChangeTable[skillid]; + clif_skill_nodamage (src, bl, skillid, -1, 1); + if (tsc_data) + { + if (tsc_data[sc].timer == -1) + /* 付加する */ + skill_status_change_start (bl, sc, skilllv, 0, 0, 0, + skill_get_time (skillid, + skilllv), 0); + else + /* 解除する */ + skill_status_change_end (bl, sc, -1); + } + } + break; + + /* 対地スキル */ + case BD_LULLABY: /* 子守唄 */ + case BD_RICHMANKIM: /* ニヨルドの宴 */ + case BD_ETERNALCHAOS: /* 永遠の混沌 */ + case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ + case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ + case BD_ROKISWEIL: /* ロキの叫び */ + case BD_INTOABYSS: /* 深淵の中に */ + case BD_SIEGFRIED: /* 不死身のジークフリード */ + case BA_DISSONANCE: /* 不協和音 */ + case BA_POEMBRAGI: /* ブラギの詩 */ + case BA_WHISTLE: /* 口笛 */ + case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */ + case BA_APPLEIDUN: /* イドゥンの林檎 */ + case DC_UGLYDANCE: /* 自分勝手なダンス */ + case DC_HUMMING: /* ハミング */ + case DC_DONTFORGETME: /* 私を忘れないで… */ + case DC_FORTUNEKISS: /* 幸運のキス */ + case DC_SERVICEFORYOU: /* サービスフォーユー */ + case CG_MOONLIT: /* 月明りの泉に落ちる花びら */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_unitsetting (src, skillid, skilllv, src->x, src->y, 0); + break; + + case HP_BASILICA: /* バジリカ */ + case PA_GOSPEL: /* ゴスペル */ + skill_clear_unitgroup (src); + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_unitsetting (src, skillid, skilllv, src->x, src->y, 0); + break; + + case BD_ADAPTATION: /* アドリブ */ + { + struct status_change *sc_data = battle_get_sc_data (src); + if (sc_data && sc_data[SC_DANCING].timer != -1) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_stop_dancing (src, 0); + } + } + break; + + case BA_FROSTJOKE: /* 寒いジョーク */ + case DC_SCREAM: /* スクリーム */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_addtimerskill (src, tick + 3000, bl->id, 0, 0, skillid, + skilllv, 0, flag); + break; + + case TF_STEAL: // スティール + if (sd) + { + if (pc_steal_item (sd, bl)) + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + else + clif_skill_nodamage (src, bl, skillid, skilllv, 0); + } + break; + + case RG_STEALCOIN: // スティールコイン + if (sd) + { + if (pc_steal_coin (sd, bl)) + { + int range = skill_get_range (skillid, skilllv); + if (range < 0) + range = battle_get_range (src) - (range + 1); + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + mob_target ((struct mob_data *) bl, src, range); + } + else + clif_skill_nodamage (src, bl, skillid, skilllv, 0); + } + break; - case MC_IDENTIFY: /* アイテム鑑定 */ - if(sd) - clif_item_identify_list(sd); - break; + case MG_STONECURSE: /* ストーンカース */ + if (bl->type == BL_MOB && battle_get_mode (bl) & 0x20) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + break; + } + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + if (MRAND (100) < skilllv * 4 + 20 + && !battle_check_undead (battle_get_race (bl), + battle_get_elem_type (bl))) + skill_status_change_start (bl, SC_STONE, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + else if (sd) + clif_skill_fail (sd, skillid, 0, 0); + break; - case BS_REPAIRWEAPON: /* 武器修理 */ - if(sd) + case NV_FIRSTAID: /* 応急手当 */ + clif_skill_nodamage (src, bl, skillid, 5, 1); + battle_heal (NULL, bl, 5, 0, 0); + break; + + case AL_CURE: /* キュアー */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + skill_status_change_end (bl, SC_SILENCE, -1); + skill_status_change_end (bl, SC_BLIND, -1); + skill_status_change_end (bl, SC_CONFUSION, -1); + if (battle_check_undead + (battle_get_race (bl), battle_get_elem_type (bl))) + { //アンデッドなら暗闇効果 + skill_status_change_start (bl, SC_CONFUSION, 1, 0, 0, 0, 6000, + 0); + } + break; + + case TF_DETOXIFY: /* 解毒 */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_status_change_end (bl, SC_POISON, -1); + break; + + case PR_STRECOVERY: /* リカバリー */ + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + skill_status_change_end (bl, SC_FREEZE, -1); + skill_status_change_end (bl, SC_STONE, -1); + skill_status_change_end (bl, SC_SLEEP, -1); + skill_status_change_end (bl, SC_STAN, -1); + if (battle_check_undead + (battle_get_race (bl), battle_get_elem_type (bl))) + { //アンデッドなら暗闇効果 + int blind_time; + //blind_time=30-battle_get_vit(bl)/10-battle_get_int/15; + blind_time = + 30 * (100 - + (battle_get_int (bl) + + battle_get_vit (bl)) / 2) / 100; + if (MRAND (100) < + (100 - + (battle_get_int (bl) / 2 + battle_get_vit (bl) / 3 + + battle_get_luk (bl) / 10))) + skill_status_change_start (bl, SC_BLIND, 1, 0, 0, 0, + blind_time, 0); + } + if (dstmd) + { + dstmd->attacked_id = 0; + dstmd->target_id = 0; + dstmd->state.targettype = NONE_ATTACKABLE; + dstmd->state.skillstate = MSS_IDLE; + dstmd->next_walktime = tick + MRAND (3000) + 3000; + } + } + break; + + case WZ_ESTIMATION: /* モンスター情報 */ + if (src->type == BL_PC) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + clif_skill_estimation ((struct map_session_data *) src, bl); + } + break; + + case MC_IDENTIFY: /* アイテム鑑定 */ + if (sd) + clif_item_identify_list (sd); + break; + + case BS_REPAIRWEAPON: /* 武器修理 */ + if (sd) //動作しないのでとりあえずコメントアウト -// clif_item_repair_list(sd); - break; +// clif_item_repair_list(sd); + break; + + case AL_TELEPORT: /* テレポート */ + if (sd) + { + if (map[sd->bl.m].flag.noteleport) + { /* テレポ禁止 */ + clif_skill_teleportmessage (sd, 0); + break; + } + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (sd->skilllv == 1) + clif_skill_warppoint (sd, sd->skillid, "Random", "", "", + ""); + else + { + clif_skill_warppoint (sd, sd->skillid, "Random", + sd->status.save_point.map, "", ""); + } + } + else if (bl->type == BL_MOB) + mob_warp ((struct mob_data *) bl, -1, -1, -1, 3); + break; - case AL_TELEPORT: /* テレポート */ - if( sd ){ - if(map[sd->bl.m].flag.noteleport){ /* テレポ禁止 */ - clif_skill_teleportmessage(sd,0); - break; - } - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( sd->skilllv==1 ) - clif_skill_warppoint(sd,sd->skillid,"Random","","",""); - else{ - clif_skill_warppoint(sd,sd->skillid,"Random", - sd->status.save_point.map,"",""); - } - }else if( bl->type==BL_MOB ) - mob_warp((struct mob_data *)bl,-1,-1,-1,3); - break; - - case AL_HOLYWATER: /* アクアベネディクタ */ - if(sd) { - int eflag; - struct item item_tmp; - clif_skill_nodamage(src,bl,skillid,skilllv,1); - memset(&item_tmp,0,sizeof(item_tmp)); - item_tmp.nameid = 523; - item_tmp.identify = 1; - if(battle_config.holywater_name_input) { - item_tmp.card[0] = 0xfe; - item_tmp.card[1] = 0; - *((unsigned long *)(&item_tmp.card[2]))=sd->char_id; /* キャラID */ - } - eflag = pc_additem(sd,&item_tmp,1); - if(eflag) { - clif_additem(sd,0,0,eflag); - map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0); - } - } - break; - case TF_PICKSTONE: - if(sd) { - int eflag; - struct item item_tmp; - struct block_list tbl; - clif_skill_nodamage(src,bl,skillid,skilllv,1); - memset(&item_tmp,0,sizeof(item_tmp)); - memset(&tbl,0,sizeof(tbl)); // [MouseJstr] - item_tmp.nameid = 7049; - item_tmp.identify = 1; - tbl.id = 0; - clif_takeitem(&sd->bl,&tbl); - eflag = pc_additem(sd,&item_tmp,1); - if(eflag) { - clif_additem(sd,0,0,eflag); - map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0); - } - } - break; + case AL_HOLYWATER: /* アクアベネディクタ */ + if (sd) + { + int eflag; + struct item item_tmp; + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + memset (&item_tmp, 0, sizeof (item_tmp)); + item_tmp.nameid = 523; + item_tmp.identify = 1; + if (battle_config.holywater_name_input) + { + item_tmp.card[0] = 0xfe; + item_tmp.card[1] = 0; + *((unsigned long *) (&item_tmp.card[2])) = sd->char_id; /* キャラID */ + } + eflag = pc_additem (sd, &item_tmp, 1); + if (eflag) + { + clif_additem (sd, 0, 0, eflag); + map_addflooritem (&item_tmp, 1, sd->bl.m, sd->bl.x, + sd->bl.y, NULL, NULL, NULL, 0); + } + } + break; + case TF_PICKSTONE: + if (sd) + { + int eflag; + struct item item_tmp; + struct block_list tbl; + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + memset (&item_tmp, 0, sizeof (item_tmp)); + memset (&tbl, 0, sizeof (tbl)); // [MouseJstr] + item_tmp.nameid = 7049; + item_tmp.identify = 1; + tbl.id = 0; + clif_takeitem (&sd->bl, &tbl); + eflag = pc_additem (sd, &item_tmp, 1); + if (eflag) + { + clif_additem (sd, 0, 0, eflag); + map_addflooritem (&item_tmp, 1, sd->bl.m, sd->bl.x, + sd->bl.y, NULL, NULL, NULL, 0); + } + } + break; - case RG_STRIPWEAPON: /* ストリップウェポン */ - { - struct status_change *tsc_data = battle_get_sc_data(bl); - - if(tsc_data && tsc_data[SC_CP_WEAPON].timer != -1 ) - break; - strip_per = 5+2*skilllv+strip_fix/5; - strip_time = skill_get_time(skillid,skilllv)+strip_fix/2; - if(MRAND(100) < strip_per){ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 ); - if(dstsd){ - for(i=0;i<MAX_INVENTORY;i++){ - if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0002){ - pc_unequipitem(dstsd,i,0); - break; - } - } - } - } - } - break; + case RG_STRIPWEAPON: /* ストリップウェポン */ + { + struct status_change *tsc_data = battle_get_sc_data (bl); + + if (tsc_data && tsc_data[SC_CP_WEAPON].timer != -1) + break; + strip_per = 5 + 2 * skilllv + strip_fix / 5; + strip_time = skill_get_time (skillid, skilllv) + strip_fix / 2; + if (MRAND (100) < strip_per) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_status_change_start (bl, + SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, strip_time, 0); + if (dstsd) + { + for (i = 0; i < MAX_INVENTORY; i++) + { + if (dstsd->status.inventory[i].equip + && dstsd->status.inventory[i].equip & 0x0002) + { + pc_unequipitem (dstsd, i, 0); + break; + } + } + } + } + } + break; - case RG_STRIPSHIELD: /* ストリップシールド */ - { - struct status_change *tsc_data = battle_get_sc_data(bl); - - if(tsc_data && tsc_data[SC_CP_SHIELD].timer != -1 ) - break; - strip_per = 5+2*skilllv+strip_fix/5; - strip_time = skill_get_time(skillid,skilllv)+strip_fix/2; - if(MRAND(100) < strip_per){ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 ); - if(dstsd){ - for(i=0;i<MAX_INVENTORY;i++){ - if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0020){ - pc_unequipitem(dstsd,i,0); - break; - } - } - } - } - } - break; + case RG_STRIPSHIELD: /* ストリップシールド */ + { + struct status_change *tsc_data = battle_get_sc_data (bl); + + if (tsc_data && tsc_data[SC_CP_SHIELD].timer != -1) + break; + strip_per = 5 + 2 * skilllv + strip_fix / 5; + strip_time = skill_get_time (skillid, skilllv) + strip_fix / 2; + if (MRAND (100) < strip_per) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_status_change_start (bl, + SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, strip_time, 0); + if (dstsd) + { + for (i = 0; i < MAX_INVENTORY; i++) + { + if (dstsd->status.inventory[i].equip + && dstsd->status.inventory[i].equip & 0x0020) + { + pc_unequipitem (dstsd, i, 0); + break; + } + } + } + } + } + break; - case RG_STRIPARMOR: /* ストリップアーマー */ - { - struct status_change *tsc_data = battle_get_sc_data(bl); - - if(tsc_data && tsc_data[SC_CP_ARMOR].timer != -1 ) - break; - strip_per = 5+2*skilllv+strip_fix/5; - strip_time = skill_get_time(skillid,skilllv)+strip_fix/2; - if(MRAND(100) < strip_per){ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 ); - if(dstsd){ - for(i=0;i<MAX_INVENTORY;i++){ - if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0010){ - pc_unequipitem(dstsd,i,0); - break; - } - } - } - } - } - break; - case RG_STRIPHELM: /* ストリップヘルム */ - { - struct status_change *tsc_data = battle_get_sc_data(bl); - - if(tsc_data && tsc_data[SC_CP_HELM].timer != -1 ) - break; - strip_per = 5+2*skilllv+strip_fix/5; - strip_time = skill_get_time(skillid,skilllv)+strip_fix/2; - if(MRAND(100) < strip_per){ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 ); - if(dstsd){ - for(i=0;i<MAX_INVENTORY;i++){ - if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0100){ - pc_unequipitem(dstsd,i,0); - break; - } - } - } - } - } - break; - /* PotionPitcher */ - case AM_POTIONPITCHER: /* ポーションピッチャー */ - { - struct block_list tbl; - int i,x,hp = 0,sp = 0; - if(sd) { - if(sd==dstsd) { // cancel use on oneself - map_freeblock_unlock(); - return 1; - } - x = skilllv%11 - 1; - i = pc_search_inventory(sd,skill_db[skillid].itemid[x]); - if(i < 0 || skill_db[skillid].itemid[x] <= 0) { - clif_skill_fail(sd,skillid,0,0); - map_freeblock_unlock(); - return 1; - } - if(sd->inventory_data[i] == NULL || sd->status.inventory[i].amount < skill_db[skillid].amount[x]) { - clif_skill_fail(sd,skillid,0,0); - map_freeblock_unlock(); - return 1; - } - sd->state.potionpitcher_flag = 1; - sd->potion_hp = sd->potion_sp = sd->potion_per_hp = sd->potion_per_sp = 0; - sd->skilltarget = bl->id; - run_script(sd->inventory_data[i]->use_script,0,sd->bl.id,0); - pc_delitem(sd,i,skill_db[skillid].amount[x],0); - sd->state.potionpitcher_flag = 0; - if(sd->potion_per_hp > 0 || sd->potion_per_sp > 0) { - hp = battle_get_max_hp(bl) * sd->potion_per_hp / 100; - hp = hp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100; - if(dstsd) { - sp = dstsd->status.max_sp * sd->potion_per_sp / 100; - sp = sp * (100 + pc_checkskill(sd,AM_POTIONPITCHER) + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100; - } - } - else { - if(sd->potion_hp > 0) { - hp = sd->potion_hp * (100 + pc_checkskill(sd,AM_POTIONPITCHER)*10 + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100; - hp = hp * (100 + (battle_get_vit(bl)<<1)) / 100; - if(dstsd) - hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10) / 100; - } - if(sd->potion_sp > 0) { - sp = sd->potion_sp * (100 + pc_checkskill(sd,AM_POTIONPITCHER) + pc_checkskill(sd,AM_LEARNINGPOTION)*5)/100; - sp = sp * (100 + (battle_get_int(bl)<<1)) / 100; - if(dstsd) - sp = sp * (100 + pc_checkskill(dstsd,MG_SRECOVERY)*10) / 100; - } - } - } - else { - hp = (1 + MRAND(400)) * (100 + skilllv*10) / 100; - hp = hp * (100 + (battle_get_vit(bl)<<1)) / 100; - if(dstsd) - hp = hp * (100 + pc_checkskill(dstsd,SM_RECOVERY)*10) / 100; - } - tbl.id = 0; - tbl.m = src->m; - tbl.x = src->x; - tbl.y = src->y; - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if(hp > 0 || (hp <= 0 && sp <= 0)) - clif_skill_nodamage(&tbl,bl,AL_HEAL,hp,1); - if(sp > 0) - clif_skill_nodamage(&tbl,bl,MG_SRECOVERY,sp,1); - battle_heal(src,bl,hp,sp,0); - } - break; - case AM_CP_WEAPON: - { - struct status_change *tsc_data = battle_get_sc_data(bl); - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if(tsc_data && tsc_data[SC_STRIPWEAPON].timer != -1) - skill_status_change_end(bl, SC_STRIPWEAPON, -1 ); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - } - break; - case AM_CP_SHIELD: - { - struct status_change *tsc_data = battle_get_sc_data(bl); - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if(tsc_data && tsc_data[SC_STRIPSHIELD].timer != -1) - skill_status_change_end(bl, SC_STRIPSHIELD, -1 ); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - } - break; - case AM_CP_ARMOR: - { - struct status_change *tsc_data = battle_get_sc_data(bl); - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if(tsc_data && tsc_data[SC_STRIPARMOR].timer != -1) - skill_status_change_end(bl, SC_STRIPARMOR, -1 ); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - } - break; - case AM_CP_HELM: - { - struct status_change *tsc_data = battle_get_sc_data(bl); - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if(tsc_data && tsc_data[SC_STRIPHELM].timer != -1) - skill_status_change_end(bl, SC_STRIPHELM, -1 ); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - } - break; - case SA_DISPELL: /* ディスペル */ - { - int i; - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - for(i=0;i<136;i++){ - if(i==SC_RIDING || i== SC_FALCON || i==SC_HALLUCINATION || i==SC_WEIGHT50 - || i==SC_WEIGHT90 || i==SC_STRIPWEAPON || i==SC_STRIPSHIELD || i==SC_STRIPARMOR - || i==SC_STRIPHELM || i==SC_CP_WEAPON || i==SC_CP_SHIELD || i==SC_CP_ARMOR - || i==SC_CP_HELM || i==SC_COMBO) - continue; - skill_status_change_end(bl,i,-1); - } - } - break; - - case TF_BACKSLIDING: /* バックステップ */ - battle_stopwalking(src,1); - skill_blown(src,bl,skill_get_blewcount(skillid,skilllv)|0x10000); - if(src->type == BL_MOB) - clif_fixmobpos((struct mob_data *)src); - else if(src->type == BL_PC) - clif_fixpos(src); - skill_addtimerskill(src,tick + 200,src->id,0,0,skillid,skilllv,0,flag); - break; - - case SA_CASTCANCEL: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_castcancel(src,1); - if(sd) { - int sp = skill_get_sp(sd->skillid_old,sd->skilllv_old); - sp = sp * (90 - (skilllv-1)*20) / 100; - if(sp < 0) sp = 0; - pc_heal(sd,0,-sp); - } - break; - case SA_SPELLBREAKER: // スペルブレイカー - { - struct status_change *sc_data = battle_get_sc_data(bl); - int sp; - if(sc_data && sc_data[SC_MAGICROD].timer != -1) { - if(dstsd) { - sp = skill_get_sp(skillid,skilllv); - sp = sp * sc_data[SC_MAGICROD].val2 / 100; - if(sp > 0x7fff) sp = 0x7fff; - else if(sp < 1) sp = 1; - if(dstsd->status.sp + sp > dstsd->status.max_sp) { - sp = dstsd->status.max_sp - dstsd->status.sp; - dstsd->status.sp = dstsd->status.max_sp; - } - else - dstsd->status.sp += sp; - clif_heal(dstsd->fd,SP_SP,sp); - } - clif_skill_nodamage(bl,bl,SA_MAGICROD,sc_data[SC_MAGICROD].val1,1); - if(sd) { - sp = sd->status.max_sp/5; - if(sp < 1) sp = 1; - pc_heal(sd,0,-sp); - } - } - else { - int bl_skillid=0,bl_skilllv=0; - if(bl->type == BL_PC) { - if(dstsd && dstsd->skilltimer != -1) { - bl_skillid = dstsd->skillid; - bl_skilllv = dstsd->skilllv; - } - } - else if(bl->type == BL_MOB) { - if(dstmd && dstmd->skilltimer != -1) { - bl_skillid = dstmd->skillid; - bl_skilllv = dstmd->skilllv; - } - } - if(bl_skillid > 0 && skill_db[bl_skillid].skill_type == BF_MAGIC) { - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_castcancel(bl,0); - sp = skill_get_sp(bl_skillid,bl_skilllv); - if(dstsd) - pc_heal(dstsd,0,-sp); - if(sd) { - sp = sp*(25*(skilllv-1))/100; - if(skilllv > 1 && sp < 1) sp = 1; - if(sp > 0x7fff) sp = 0x7fff; - else if(sp < 1) sp = 1; - if(sd->status.sp + sp > sd->status.max_sp) { - sp = sd->status.max_sp - sd->status.sp; - sd->status.sp = sd->status.max_sp; - } - else - sd->status.sp += sp; - clif_heal(sd->fd,SP_SP,sp); - } - } - else if(sd) - clif_skill_fail(sd,skillid,0,0); - } - } - break; - case SA_MAGICROD: - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - break; - case SA_AUTOSPELL: /* オートスペル */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if(sd) - clif_autospell(sd,skilllv); - else { - int maxlv=1,spellid=0; - static const int spellarray[3] = { MG_COLDBOLT,MG_FIREBOLT,MG_LIGHTNINGBOLT }; - if(skilllv >= 10) { - spellid = MG_FROSTDIVER; - maxlv = skilllv - 9; - } - else if(skilllv >=8) { - spellid = MG_FIREBALL; - maxlv = skilllv - 7; - } - else if(skilllv >=5) { - spellid = MG_SOULSTRIKE; - maxlv = skilllv - 4; - } - else if(skilllv >=2) { - int i = MRAND(3); - spellid = spellarray[i]; - maxlv = skilllv - 1; - } - else if(skilllv > 0) { - spellid = MG_NAPALMBEAT; - maxlv = 3; - } - if(spellid > 0) - skill_status_change_start(src,SC_AUTOSPELL,skilllv,spellid,maxlv,0, - skill_get_time(SA_AUTOSPELL,skilllv),0); - } - break; - - /* ランダム属性変化、水属性変化、地、火、風 */ - case NPC_ATTRICHANGE: - case NPC_CHANGEWATER: - case NPC_CHANGEGROUND: - case NPC_CHANGEFIRE: - case NPC_CHANGEWIND: - /* 毒、聖、念、闇 */ - case NPC_CHANGEPOISON: - case NPC_CHANGEHOLY: - case NPC_CHANGEDARKNESS: - case NPC_CHANGETELEKINESIS: - if(md){ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - md->def_ele=skill_get_pl(skillid); - if(md->def_ele==0) /* ランダム変化、ただし、*/ - md->def_ele=MRAND(10); /* 不死属性は除く */ - md->def_ele+=(1+MRAND(4))*20; /* 属性レベルはランダム */ - } - break; + case RG_STRIPARMOR: /* ストリップアーマー */ + { + struct status_change *tsc_data = battle_get_sc_data (bl); + + if (tsc_data && tsc_data[SC_CP_ARMOR].timer != -1) + break; + strip_per = 5 + 2 * skilllv + strip_fix / 5; + strip_time = skill_get_time (skillid, skilllv) + strip_fix / 2; + if (MRAND (100) < strip_per) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_status_change_start (bl, + SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, strip_time, 0); + if (dstsd) + { + for (i = 0; i < MAX_INVENTORY; i++) + { + if (dstsd->status.inventory[i].equip + && dstsd->status.inventory[i].equip & 0x0010) + { + pc_unequipitem (dstsd, i, 0); + break; + } + } + } + } + } + break; + case RG_STRIPHELM: /* ストリップヘルム */ + { + struct status_change *tsc_data = battle_get_sc_data (bl); + + if (tsc_data && tsc_data[SC_CP_HELM].timer != -1) + break; + strip_per = 5 + 2 * skilllv + strip_fix / 5; + strip_time = skill_get_time (skillid, skilllv) + strip_fix / 2; + if (MRAND (100) < strip_per) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_status_change_start (bl, + SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, strip_time, 0); + if (dstsd) + { + for (i = 0; i < MAX_INVENTORY; i++) + { + if (dstsd->status.inventory[i].equip + && dstsd->status.inventory[i].equip & 0x0100) + { + pc_unequipitem (dstsd, i, 0); + break; + } + } + } + } + } + break; + /* PotionPitcher */ + case AM_POTIONPITCHER: /* ポーションピッチャー */ + { + struct block_list tbl; + int i, x, hp = 0, sp = 0; + if (sd) + { + if (sd == dstsd) + { // cancel use on oneself + map_freeblock_unlock (); + return 1; + } + x = skilllv % 11 - 1; + i = pc_search_inventory (sd, skill_db[skillid].itemid[x]); + if (i < 0 || skill_db[skillid].itemid[x] <= 0) + { + clif_skill_fail (sd, skillid, 0, 0); + map_freeblock_unlock (); + return 1; + } + if (sd->inventory_data[i] == NULL + || sd->status.inventory[i].amount < + skill_db[skillid].amount[x]) + { + clif_skill_fail (sd, skillid, 0, 0); + map_freeblock_unlock (); + return 1; + } + sd->state.potionpitcher_flag = 1; + sd->potion_hp = sd->potion_sp = sd->potion_per_hp = + sd->potion_per_sp = 0; + sd->skilltarget = bl->id; + run_script (sd->inventory_data[i]->use_script, 0, sd->bl.id, + 0); + pc_delitem (sd, i, skill_db[skillid].amount[x], 0); + sd->state.potionpitcher_flag = 0; + if (sd->potion_per_hp > 0 || sd->potion_per_sp > 0) + { + hp = battle_get_max_hp (bl) * sd->potion_per_hp / 100; + hp = hp * (100 + + pc_checkskill (sd, + AM_POTIONPITCHER) * 10 + + pc_checkskill (sd, + AM_LEARNINGPOTION) * 5) / 100; + if (dstsd) + { + sp = dstsd->status.max_sp * sd->potion_per_sp / 100; + sp = sp * (100 + + pc_checkskill (sd, + AM_POTIONPITCHER) + + pc_checkskill (sd, + AM_LEARNINGPOTION) * 5) / + 100; + } + } + else + { + if (sd->potion_hp > 0) + { + hp = sd->potion_hp * (100 + + pc_checkskill (sd, + AM_POTIONPITCHER) + * 10 + pc_checkskill (sd, + AM_LEARNINGPOTION) + * 5) / 100; + hp = hp * (100 + (battle_get_vit (bl) << 1)) / 100; + if (dstsd) + hp = hp * (100 + + pc_checkskill (dstsd, + SM_RECOVERY) * 10) / + 100; + } + if (sd->potion_sp > 0) + { + sp = sd->potion_sp * (100 + + pc_checkskill (sd, + AM_POTIONPITCHER) + + pc_checkskill (sd, + AM_LEARNINGPOTION) + * 5) / 100; + sp = sp * (100 + (battle_get_int (bl) << 1)) / 100; + if (dstsd) + sp = sp * (100 + + pc_checkskill (dstsd, + MG_SRECOVERY) * 10) / + 100; + } + } + } + else + { + hp = (1 + MRAND (400)) * (100 + skilllv * 10) / 100; + hp = hp * (100 + (battle_get_vit (bl) << 1)) / 100; + if (dstsd) + hp = hp * (100 + + pc_checkskill (dstsd, SM_RECOVERY) * 10) / 100; + } + tbl.id = 0; + tbl.m = src->m; + tbl.x = src->x; + tbl.y = src->y; + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (hp > 0 || (hp <= 0 && sp <= 0)) + clif_skill_nodamage (&tbl, bl, AL_HEAL, hp, 1); + if (sp > 0) + clif_skill_nodamage (&tbl, bl, MG_SRECOVERY, sp, 1); + battle_heal (src, bl, hp, sp, 0); + } + break; + case AM_CP_WEAPON: + { + struct status_change *tsc_data = battle_get_sc_data (bl); + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (tsc_data && tsc_data[SC_STRIPWEAPON].timer != -1) + skill_status_change_end (bl, SC_STRIPWEAPON, -1); + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + } + break; + case AM_CP_SHIELD: + { + struct status_change *tsc_data = battle_get_sc_data (bl); + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (tsc_data && tsc_data[SC_STRIPSHIELD].timer != -1) + skill_status_change_end (bl, SC_STRIPSHIELD, -1); + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + } + break; + case AM_CP_ARMOR: + { + struct status_change *tsc_data = battle_get_sc_data (bl); + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (tsc_data && tsc_data[SC_STRIPARMOR].timer != -1) + skill_status_change_end (bl, SC_STRIPARMOR, -1); + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + } + break; + case AM_CP_HELM: + { + struct status_change *tsc_data = battle_get_sc_data (bl); + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (tsc_data && tsc_data[SC_STRIPHELM].timer != -1) + skill_status_change_end (bl, SC_STRIPHELM, -1); + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + } + break; + case SA_DISPELL: /* ディスペル */ + { + int i; + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + for (i = 0; i < 136; i++) + { + if (i == SC_RIDING || i == SC_FALCON || i == SC_HALLUCINATION + || i == SC_WEIGHT50 || i == SC_WEIGHT90 + || i == SC_STRIPWEAPON || i == SC_STRIPSHIELD + || i == SC_STRIPARMOR || i == SC_STRIPHELM + || i == SC_CP_WEAPON || i == SC_CP_SHIELD + || i == SC_CP_ARMOR || i == SC_CP_HELM || i == SC_COMBO) + continue; + skill_status_change_end (bl, i, -1); + } + } + break; - case NPC_HALLUCINATION: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - break; + case TF_BACKSLIDING: /* バックステップ */ + battle_stopwalking (src, 1); + skill_blown (src, bl, + skill_get_blewcount (skillid, skilllv) | 0x10000); + if (src->type == BL_MOB) + clif_fixmobpos ((struct mob_data *) src); + else if (src->type == BL_PC) + clif_fixpos (src); + skill_addtimerskill (src, tick + 200, src->id, 0, 0, skillid, + skilllv, 0, flag); + break; - case NPC_KEEPING: - case NPC_BARRIER: - { - int skill_time = skill_get_time(skillid,skilllv); - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_time,0 ); - mob_changestate((struct mob_data *)src,MS_DELAY,skill_time); - } - break; + case SA_CASTCANCEL: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_castcancel (src, 1); + if (sd) + { + int sp = skill_get_sp (sd->skillid_old, sd->skilllv_old); + sp = sp * (90 - (skilllv - 1) * 20) / 100; + if (sp < 0) + sp = 0; + pc_heal (sd, 0, -sp); + } + break; + case SA_SPELLBREAKER: // スペルブレイカー + { + struct status_change *sc_data = battle_get_sc_data (bl); + int sp; + if (sc_data && sc_data[SC_MAGICROD].timer != -1) + { + if (dstsd) + { + sp = skill_get_sp (skillid, skilllv); + sp = sp * sc_data[SC_MAGICROD].val2 / 100; + if (sp > 0x7fff) + sp = 0x7fff; + else if (sp < 1) + sp = 1; + if (dstsd->status.sp + sp > dstsd->status.max_sp) + { + sp = dstsd->status.max_sp - dstsd->status.sp; + dstsd->status.sp = dstsd->status.max_sp; + } + else + dstsd->status.sp += sp; + clif_heal (dstsd->fd, SP_SP, sp); + } + clif_skill_nodamage (bl, bl, SA_MAGICROD, + sc_data[SC_MAGICROD].val1, 1); + if (sd) + { + sp = sd->status.max_sp / 5; + if (sp < 1) + sp = 1; + pc_heal (sd, 0, -sp); + } + } + else + { + int bl_skillid = 0, bl_skilllv = 0; + if (bl->type == BL_PC) + { + if (dstsd && dstsd->skilltimer != -1) + { + bl_skillid = dstsd->skillid; + bl_skilllv = dstsd->skilllv; + } + } + else if (bl->type == BL_MOB) + { + if (dstmd && dstmd->skilltimer != -1) + { + bl_skillid = dstmd->skillid; + bl_skilllv = dstmd->skilllv; + } + } + if (bl_skillid > 0 + && skill_db[bl_skillid].skill_type == BF_MAGIC) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_castcancel (bl, 0); + sp = skill_get_sp (bl_skillid, bl_skilllv); + if (dstsd) + pc_heal (dstsd, 0, -sp); + if (sd) + { + sp = sp * (25 * (skilllv - 1)) / 100; + if (skilllv > 1 && sp < 1) + sp = 1; + if (sp > 0x7fff) + sp = 0x7fff; + else if (sp < 1) + sp = 1; + if (sd->status.sp + sp > sd->status.max_sp) + { + sp = sd->status.max_sp - sd->status.sp; + sd->status.sp = sd->status.max_sp; + } + else + sd->status.sp += sp; + clif_heal (sd->fd, SP_SP, sp); + } + } + else if (sd) + clif_skill_fail (sd, skillid, 0, 0); + } + } + break; + case SA_MAGICROD: + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + break; + case SA_AUTOSPELL: /* オートスペル */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (sd) + clif_autospell (sd, skilllv); + else + { + int maxlv = 1, spellid = 0; + static const int spellarray[3] = + { MG_COLDBOLT, MG_FIREBOLT, MG_LIGHTNINGBOLT }; + if (skilllv >= 10) + { + spellid = MG_FROSTDIVER; + maxlv = skilllv - 9; + } + else if (skilllv >= 8) + { + spellid = MG_FIREBALL; + maxlv = skilllv - 7; + } + else if (skilllv >= 5) + { + spellid = MG_SOULSTRIKE; + maxlv = skilllv - 4; + } + else if (skilllv >= 2) + { + int i = MRAND (3); + spellid = spellarray[i]; + maxlv = skilllv - 1; + } + else if (skilllv > 0) + { + spellid = MG_NAPALMBEAT; + maxlv = 3; + } + if (spellid > 0) + skill_status_change_start (src, SC_AUTOSPELL, skilllv, + spellid, maxlv, 0, + skill_get_time (SA_AUTOSPELL, + skilllv), 0); + } + break; - case NPC_DARKBLESSING: - { - int sc_def = 100 - battle_get_mdef(bl); - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - if(battle_get_elem_type(bl) == 7 || battle_get_race(bl) == 6) - break; - if(MRAND(100) < sc_def*(50+skilllv*5)/100) { - if(dstsd) { - int hp = battle_get_hp(bl)-1; - pc_heal(dstsd,-hp,0); - } - else if(dstmd) - dstmd->hp = 1; - } - } - break; - - case NPC_SELFDESTRUCTION: /* 自爆 */ - case NPC_SELFDESTRUCTION2: /* 自爆2 */ - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,skillid,0,0,skill_get_time(skillid,skilllv),0); - break; - case NPC_LICK: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_weapon_damage ) - break; - if(dstsd) - pc_heal(dstsd,0,-100); - if(MRAND(100) < (skilllv*5)*sc_def_vit/100) - skill_status_change_start(bl,SC_STAN,skilllv,0,0,0,skill_get_time2(skillid,skilllv),0); - break; - - case NPC_SUICIDE: /* 自決 */ - if(src && bl && md){ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - mob_damage(NULL,md,md->hp,0); - } - break; + /* ランダム属性変化、水属性変化、地、火、風 */ + case NPC_ATTRICHANGE: + case NPC_CHANGEWATER: + case NPC_CHANGEGROUND: + case NPC_CHANGEFIRE: + case NPC_CHANGEWIND: + /* 毒、聖、念、闇 */ + case NPC_CHANGEPOISON: + case NPC_CHANGEHOLY: + case NPC_CHANGEDARKNESS: + case NPC_CHANGETELEKINESIS: + if (md) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + md->def_ele = skill_get_pl (skillid); + if (md->def_ele == 0) /* ランダム変化、ただし、 */ + md->def_ele = MRAND (10); /* 不死属性は除く */ + md->def_ele += (1 + MRAND (4)) * 20; /* 属性レベルはランダム */ + } + break; - case NPC_SUMMONSLAVE: /* 手下召喚 */ - case NPC_SUMMONMONSTER: /* MOB召喚 */ - if(md && !md->master_id){ - mob_summonslave(md,mob_db[md->class].skill[md->skillidx].val,skilllv,(skillid==NPC_SUMMONSLAVE)?1:0); - } - break; - - case NPC_TRANSFORMATION: - case NPC_METAMORPHOSIS: - if(md) - mob_class_change(md,mob_db[md->class].skill[md->skillidx].val); - break; - - case NPC_EMOTION: /* エモーション */ - if(md) - clif_emotion(&md->bl,mob_db[md->class].skill[md->skillidx].val[0]); - break; - - case NPC_DEFENDER: - clif_skill_nodamage(src,bl,skillid,skilllv,1); - break; - - case WE_MALE: /* 君だけは護るよ */ - if(sd && dstsd){ - int hp_rate=(skilllv <= 0)? 0:skill_db[skillid].hp_rate[skilllv-1]; - int gain_hp=sd->status.max_hp*abs(hp_rate)/100;// 15% - clif_skill_nodamage(src,bl,skillid,gain_hp,1); - battle_heal(NULL,bl,gain_hp,0,0); - } - break; - case WE_FEMALE: /* あなたの為に犠牲になります */ - if(sd && dstsd){ - int sp_rate=(skilllv <= 0)? 0:skill_db[skillid].sp_rate[skilllv-1]; - int gain_sp=sd->status.max_sp*abs(sp_rate)/100;// 15% - clif_skill_nodamage(src,bl,skillid,gain_sp,1); - battle_heal(NULL,bl,0,gain_sp,0); - } - break; + case NPC_HALLUCINATION: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + break; - case WE_CALLPARTNER: /* あなたに会いたい */ - if(sd && dstsd){ - if(map[sd->bl.m].flag.nomemo){ - clif_skill_teleportmessage(sd,1); - return 0; - } - if((dstsd = pc_get_partner(sd)) == NULL){ - clif_skill_fail(sd,skillid,0,0); - return 0; - } - skill_unitsetting(src,skillid,skilllv,sd->bl.x,sd->bl.y,0); - } - break; - - case PF_HPCONVERSION: /* ライフ置き換え */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if(sd){ - int conv_hp=0,conv_sp=0; - conv_hp=sd->status.hp/10; //基本はHPの10% - sd->status.hp -= conv_hp; //HPを減らす - conv_sp=conv_hp*20*skilllv/100; - conv_sp=(sd->status.sp+conv_sp>sd->status.max_sp)?sd->status.max_sp-sd->status.sp:conv_sp; - sd->status.sp += conv_sp; //SPを増やす - pc_heal(sd,-conv_hp,conv_sp); - clif_heal(sd->fd,SP_SP,conv_sp); - } - break; - case HT_REMOVETRAP: /* リムーブトラップ */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - { - struct skill_unit *su=NULL; - struct item item_tmp; - int flag; - if((bl->type==BL_SKILL) && - (su=(struct skill_unit *)bl) && - (su->group->src_id == src->id || map[bl->m].flag.pvp || map[bl->m].flag.gvg) && - (su->group->unit_id >= 0x8f && su->group->unit_id <= 0x99) && - (su->group->unit_id != 0x92)){ //罠を取り返す - if(sd){ - if(battle_config.skill_removetrap_type == 1){ - for(i=0;i<10;i++) { - if(skill_db[su->group->skill_id].itemid[i] > 0){ - memset(&item_tmp,0,sizeof(item_tmp)); - item_tmp.nameid = skill_db[su->group->skill_id].itemid[i]; - item_tmp.identify = 1; - if(item_tmp.nameid && (flag=pc_additem(sd,&item_tmp,skill_db[su->group->skill_id].amount[i]))){ - clif_additem(sd,0,0,flag); - map_addflooritem(&item_tmp,skill_db[su->group->skill_id].amount[i],sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0); - } - } - } - }else{ - memset(&item_tmp,0,sizeof(item_tmp)); - item_tmp.nameid = 1065; - item_tmp.identify = 1; - if(item_tmp.nameid && (flag=pc_additem(sd,&item_tmp,1))){ - clif_additem(sd,0,0,flag); - map_addflooritem(&item_tmp,1,sd->bl.m,sd->bl.x,sd->bl.y,NULL,NULL,NULL,0); - } - } - - } - if(su->group->unit_id == 0x91 && su->group->val2){ - struct block_list *target=map_id2bl(su->group->val2); - if(target && (target->type == BL_PC || target->type == BL_MOB)) - skill_status_change_end(target,SC_ANKLE,-1); - } - skill_delunit(su); - } - } - break; - case HT_SPRINGTRAP: /* スプリングトラップ */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - { - struct skill_unit *su=NULL; - if((bl->type==BL_SKILL) && (su=(struct skill_unit *)bl) && (su->group) ){ - switch(su->group->unit_id){ - case 0x8f: /* ブラストマイン */ - case 0x90: /* スキッドトラップ */ - case 0x93: /* ランドマイン */ - case 0x94: /* ショックウェーブトラップ */ - case 0x95: /* サンドマン */ - case 0x96: /* フラッシャー */ - case 0x97: /* フリージングトラップ */ - case 0x98: /* クレイモアートラップ */ - case 0x99: /* トーキーボックス */ - su->group->unit_id = 0x8c; - clif_changelook(bl,LOOK_BASE,su->group->unit_id); - su->group->limit=DIFF_TICK(tick+1500,su->group->tick); - su->limit=DIFF_TICK(tick+1500,su->group->tick); - } - } - } - break; - case BD_ENCORE: /* アンコール */ - clif_skill_nodamage(src,bl,skillid,skilllv,1); - if(sd) - skill_use_id(sd,src->id,sd->skillid_dance,sd->skilllv_dance); - break; - case AS_SPLASHER: /* ベナムスプラッシャー */ - if((double)battle_get_max_hp(bl)*2/3 < battle_get_hp(bl)) //HPが2/3以上残っていたら失敗 - return 1; - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,skillid,src->id,0,skill_get_time(skillid,skilllv),0 ); - break; - case PF_MINDBREAKER: /* プロボック */ - { - struct status_change *sc_data = battle_get_sc_data(bl); - - /* MVPmobと不死には効かない */ - if((bl->type==BL_MOB && battle_get_mode(bl)&0x20) || battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))) //不死には効かない - { - map_freeblock_unlock(); - return 1; - } + case NPC_KEEPING: + case NPC_BARRIER: + { + int skill_time = skill_get_time (skillid, skilllv); + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, skill_time, 0); + mob_changestate ((struct mob_data *) src, MS_DELAY, skill_time); + } + break; - clif_skill_nodamage(src,bl,skillid,skilllv,1); - skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); - - if(dstmd && dstmd->skilltimer!=-1 && dstmd->state.skillcastcancel) // 詠唱妨害 - skill_castcancel(bl,0); - if(dstsd && dstsd->skilltimer!=-1 && (!dstsd->special_state.no_castcancel || map[bl->m].flag.gvg) - && dstsd->state.skillcastcancel && !dstsd->special_state.no_castcancel2) - skill_castcancel(bl,0); - - if(sc_data){ - if(sc_data[SC_FREEZE].timer!=-1) - skill_status_change_end(bl,SC_FREEZE,-1); - if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2==0) - skill_status_change_end(bl,SC_STONE,-1); - if(sc_data[SC_SLEEP].timer!=-1) - skill_status_change_end(bl,SC_SLEEP,-1); - } + case NPC_DARKBLESSING: + { + int sc_def = 100 - battle_get_mdef (bl); + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + if (battle_get_elem_type (bl) == 7 || battle_get_race (bl) == 6) + break; + if (MRAND (100) < sc_def * (50 + skilllv * 5) / 100) + { + if (dstsd) + { + int hp = battle_get_hp (bl) - 1; + pc_heal (dstsd, -hp, 0); + } + else if (dstmd) + dstmd->hp = 1; + } + } + break; - if(bl->type==BL_MOB) { - int range = skill_get_range(skillid,skilllv); - if(range < 0) - range = battle_get_range(src) - (range + 1); - mob_target((struct mob_data *)bl,src,range); - } - } - break; + case NPC_SELFDESTRUCTION: /* 自爆 */ + case NPC_SELFDESTRUCTION2: /* 自爆2 */ + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, skillid, 0, 0, + skill_get_time (skillid, skilllv), 0); + break; + case NPC_LICK: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_weapon_damage) + break; + if (dstsd) + pc_heal (dstsd, 0, -100); + if (MRAND (100) < (skilllv * 5) * sc_def_vit / 100) + skill_status_change_start (bl, SC_STAN, skilllv, 0, 0, 0, + skill_get_time2 (skillid, skilllv), + 0); + break; + case NPC_SUICIDE: /* 自決 */ + if (src && bl && md) + { + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + mob_damage (NULL, md, md->hp, 0); + } + break; + case NPC_SUMMONSLAVE: /* 手下召喚 */ + case NPC_SUMMONMONSTER: /* MOB召喚 */ + if (md && !md->master_id) + { + mob_summonslave (md, + mob_db[md->class].skill[md->skillidx].val, + skilllv, + (skillid == NPC_SUMMONSLAVE) ? 1 : 0); + } + break; + case NPC_TRANSFORMATION: + case NPC_METAMORPHOSIS: + if (md) + mob_class_change (md, + mob_db[md->class].skill[md->skillidx].val); + break; + case NPC_EMOTION: /* エモーション */ + if (md) + clif_emotion (&md->bl, + mob_db[md->class].skill[md->skillidx].val[0]); + break; + case NPC_DEFENDER: + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + break; - case RG_CLEANER: //AppleGirl - clif_skill_nodamage(src,bl,skillid,skilllv,1); - { - struct skill_unit *su=NULL; - if((bl->type==BL_SKILL) && - (su=(struct skill_unit *)bl) && - (su->group->src_id == src->id || map[bl->m].flag.pvp || map[bl->m].flag.gvg) && - (su->group->unit_id == 0xb0)){ //罠を取り返す - if(sd) - skill_delunit(su); - } - } - break; - default: - printf("Unknown skill used:%d\n",skillid); - map_freeblock_unlock(); - return 1; - } + case WE_MALE: /* 君だけは護るよ */ + if (sd && dstsd) + { + int hp_rate = + (skilllv <= + 0) ? 0 : skill_db[skillid].hp_rate[skilllv - 1]; + int gain_hp = sd->status.max_hp * abs (hp_rate) / 100; // 15% + clif_skill_nodamage (src, bl, skillid, gain_hp, 1); + battle_heal (NULL, bl, gain_hp, 0, 0); + } + break; + case WE_FEMALE: /* あなたの為に犠牲になります */ + if (sd && dstsd) + { + int sp_rate = + (skilllv <= + 0) ? 0 : skill_db[skillid].sp_rate[skilllv - 1]; + int gain_sp = sd->status.max_sp * abs (sp_rate) / 100; // 15% + clif_skill_nodamage (src, bl, skillid, gain_sp, 1); + battle_heal (NULL, bl, 0, gain_sp, 0); + } + break; - map_freeblock_unlock(); - return 0; + case WE_CALLPARTNER: /* あなたに会いたい */ + if (sd && dstsd) + { + if (map[sd->bl.m].flag.nomemo) + { + clif_skill_teleportmessage (sd, 1); + return 0; + } + if ((dstsd = pc_get_partner (sd)) == NULL) + { + clif_skill_fail (sd, skillid, 0, 0); + return 0; + } + skill_unitsetting (src, skillid, skilllv, sd->bl.x, sd->bl.y, + 0); + } + break; + + case PF_HPCONVERSION: /* ライフ置き換え */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (sd) + { + int conv_hp = 0, conv_sp = 0; + conv_hp = sd->status.hp / 10; //基本はHPの10% + sd->status.hp -= conv_hp; //HPを減らす + conv_sp = conv_hp * 20 * skilllv / 100; + conv_sp = + (sd->status.sp + conv_sp > + sd->status.max_sp) ? sd->status.max_sp - + sd->status.sp : conv_sp; + sd->status.sp += conv_sp; //SPを増やす + pc_heal (sd, -conv_hp, conv_sp); + clif_heal (sd->fd, SP_SP, conv_sp); + } + break; + case HT_REMOVETRAP: /* リムーブトラップ */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + { + struct skill_unit *su = NULL; + struct item item_tmp; + int flag; + if ((bl->type == BL_SKILL) && + (su = (struct skill_unit *) bl) && + (su->group->src_id == src->id || map[bl->m].flag.pvp + || map[bl->m].flag.gvg) && (su->group->unit_id >= 0x8f + && su->group->unit_id <= + 0x99) + && (su->group->unit_id != 0x92)) + { //罠を取り返す + if (sd) + { + if (battle_config.skill_removetrap_type == 1) + { + for (i = 0; i < 10; i++) + { + if (skill_db[su->group->skill_id].itemid[i] > + 0) + { + memset (&item_tmp, 0, sizeof (item_tmp)); + item_tmp.nameid = + skill_db[su->group-> + skill_id].itemid[i]; + item_tmp.identify = 1; + if (item_tmp.nameid + && (flag = + pc_additem (sd, &item_tmp, + skill_db[su-> + group->skill_id].amount + [i]))) + { + clif_additem (sd, 0, 0, flag); + map_addflooritem (&item_tmp, + skill_db[su-> + group->skill_id].amount + [i], sd->bl.m, + sd->bl.x, sd->bl.y, + NULL, NULL, NULL, + 0); + } + } + } + } + else + { + memset (&item_tmp, 0, sizeof (item_tmp)); + item_tmp.nameid = 1065; + item_tmp.identify = 1; + if (item_tmp.nameid + && (flag = pc_additem (sd, &item_tmp, 1))) + { + clif_additem (sd, 0, 0, flag); + map_addflooritem (&item_tmp, 1, sd->bl.m, + sd->bl.x, sd->bl.y, NULL, + NULL, NULL, 0); + } + } + + } + if (su->group->unit_id == 0x91 && su->group->val2) + { + struct block_list *target = + map_id2bl (su->group->val2); + if (target + && (target->type == BL_PC + || target->type == BL_MOB)) + skill_status_change_end (target, SC_ANKLE, -1); + } + skill_delunit (su); + } + } + break; + case HT_SPRINGTRAP: /* スプリングトラップ */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + { + struct skill_unit *su = NULL; + if ((bl->type == BL_SKILL) && (su = (struct skill_unit *) bl) + && (su->group)) + { + switch (su->group->unit_id) + { + case 0x8f: /* ブラストマイン */ + case 0x90: /* スキッドトラップ */ + case 0x93: /* ランドマイン */ + case 0x94: /* ショックウェーブトラップ */ + case 0x95: /* サンドマン */ + case 0x96: /* フラッシャー */ + case 0x97: /* フリージングトラップ */ + case 0x98: /* クレイモアートラップ */ + case 0x99: /* トーキーボックス */ + su->group->unit_id = 0x8c; + clif_changelook (bl, LOOK_BASE, + su->group->unit_id); + su->group->limit = + DIFF_TICK (tick + 1500, su->group->tick); + su->limit = + DIFF_TICK (tick + 1500, su->group->tick); + } + } + } + break; + case BD_ENCORE: /* アンコール */ + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + if (sd) + skill_use_id (sd, src->id, sd->skillid_dance, + sd->skilllv_dance); + break; + case AS_SPLASHER: /* ベナムスプラッシャー */ + if ((double) battle_get_max_hp (bl) * 2 / 3 < battle_get_hp (bl)) //HPが2/3以上残っていたら失敗 + return 1; + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, skillid, src->id, 0, + skill_get_time (skillid, skilllv), 0); + break; + case PF_MINDBREAKER: /* プロボック */ + { + struct status_change *sc_data = battle_get_sc_data (bl); + + /* MVPmobと不死には効かない */ + if ((bl->type == BL_MOB && battle_get_mode (bl) & 0x20) || battle_check_undead (battle_get_race (bl), battle_get_elem_type (bl))) //不死には効かない + { + map_freeblock_unlock (); + return 1; + } + + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + skill_status_change_start (bl, SkillStatusChangeTable[skillid], + skilllv, 0, 0, 0, + skill_get_time (skillid, skilllv), 0); + + if (dstmd && dstmd->skilltimer != -1 && dstmd->state.skillcastcancel) // 詠唱妨害 + skill_castcancel (bl, 0); + if (dstsd && dstsd->skilltimer != -1 + && (!dstsd->special_state.no_castcancel + || map[bl->m].flag.gvg) && dstsd->state.skillcastcancel + && !dstsd->special_state.no_castcancel2) + skill_castcancel (bl, 0); + + if (sc_data) + { + if (sc_data[SC_FREEZE].timer != -1) + skill_status_change_end (bl, SC_FREEZE, -1); + if (sc_data[SC_STONE].timer != -1 + && sc_data[SC_STONE].val2 == 0) + skill_status_change_end (bl, SC_STONE, -1); + if (sc_data[SC_SLEEP].timer != -1) + skill_status_change_end (bl, SC_SLEEP, -1); + } + + if (bl->type == BL_MOB) + { + int range = skill_get_range (skillid, skilllv); + if (range < 0) + range = battle_get_range (src) - (range + 1); + mob_target ((struct mob_data *) bl, src, range); + } + } + break; + + case RG_CLEANER: //AppleGirl + clif_skill_nodamage (src, bl, skillid, skilllv, 1); + { + struct skill_unit *su = NULL; + if ((bl->type == BL_SKILL) && + (su = (struct skill_unit *) bl) && + (su->group->src_id == src->id || map[bl->m].flag.pvp + || map[bl->m].flag.gvg) && (su->group->unit_id == 0xb0)) + { //罠を取り返す + if (sd) + skill_delunit (su); + } + } + break; + default: + printf ("Unknown skill used:%d\n", skillid); + map_freeblock_unlock (); + return 1; + } + + map_freeblock_unlock (); + return 0; } /*========================================== * スキル使用(詠唱完了、ID指定) *------------------------------------------ */ -int skill_castend_id( int tid, unsigned int tick, int id,int data ) +int skill_castend_id (int tid, unsigned int tick, int id, int data) { - struct map_session_data* sd = map_id2sd(id)/*,*target_sd=NULL*/; - struct block_list *bl; - int range,inf2; - - nullpo_retr(0, sd); + struct map_session_data *sd = map_id2sd (id) /*,*target_sd=NULL */ ; + struct block_list *bl; + int range, inf2; - if( sd->bl.prev == NULL ) //prevが無いのはありなの? - return 0; + nullpo_retr (0, sd); - if(sd->skillid != SA_CASTCANCEL && sd->skilltimer != tid ) /* タイマIDの確認 */ - return 0; - if(sd->skillid != SA_CASTCANCEL && sd->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0) { - sd->speed = sd->prev_speed; - clif_updatestatus(sd,SP_SPEED); - } - if(sd->skillid != SA_CASTCANCEL) - sd->skilltimer=-1; - - if((bl=map_id2bl(sd->skilltarget))==NULL || bl->prev==NULL) { - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - if(sd->bl.m != bl->m || pc_isdead(sd)) { //マップが違うか自分が死んでいる - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - - if(sd->skillid == PR_LEXAETERNA) { - struct status_change *sc_data = battle_get_sc_data(bl); - if(sc_data && (sc_data[SC_FREEZE].timer != -1 || (sc_data[SC_STONE].timer != -1 && sc_data[SC_STONE].val2 == 0))) { - clif_skill_fail(sd,sd->skillid,0,0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - } - else if(sd->skillid == RG_BACKSTAP) { - int dir = map_calc_dir(&sd->bl,bl->x,bl->y),t_dir = battle_get_dir(bl); - int dist = distance(sd->bl.x,sd->bl.y,bl->x,bl->y); - if(bl->type != BL_SKILL && (dist == 0 || map_check_dir(dir,t_dir))) { - clif_skill_fail(sd,sd->skillid,0,0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - } - - inf2 = skill_get_inf2(sd->skillid); - if( ( (skill_get_inf(sd->skillid)&1) || inf2&4 ) && // 彼我敵対関係チェック - battle_check_target(&sd->bl,bl, BCT_ENEMY)<=0 ) { - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - if(inf2 & 0xC00 && sd->bl.id != bl->id) { - int fail_flag = 1; - if(inf2 & 0x400 && battle_check_target(&sd->bl,bl, BCT_PARTY) > 0) - fail_flag = 0; - if(inf2 & 0x800 && sd->status.guild_id > 0 && sd->status.guild_id == battle_get_guild_id(bl)) - fail_flag = 0; - if(fail_flag) { - clif_skill_fail(sd,sd->skillid,0,0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - } - - range = skill_get_range(sd->skillid,sd->skilllv); - if(range < 0) - range = battle_get_range(&sd->bl) - (range + 1); - range += battle_config.pc_skill_add_range; - if((sd->skillid == MO_EXTREMITYFIST && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) || - (sd->skillid == CH_TIGERFIST && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) || - (sd->skillid == CH_CHAINCRUSH && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) || - (sd->skillid == CH_CHAINCRUSH && sd->sc_data[SC_COMBO].timer != -1 && sd->sc_data[SC_COMBO].val1 == CH_TIGERFIST)) - range += skill_get_blewcount(MO_COMBOFINISH,sd->sc_data[SC_COMBO].val2); - if(battle_config.skill_out_range_consume) { // changed to allow casting when target walks out of range [Valaris] - if(range < distance(sd->bl.x,sd->bl.y,bl->x,bl->y)) { - clif_skill_fail(sd,sd->skillid,0,0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - } - if(!skill_check_condition(sd,1)) { /* 使用条件チェック */ - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - sd->skillitem = sd->skillitemlv = -1; - if(battle_config.skill_out_range_consume) { - if(range < distance(sd->bl.x,sd->bl.y,bl->x,bl->y)) { - clif_skill_fail(sd,sd->skillid,0,0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - return 0; - } - } + if (sd->bl.prev == NULL) //prevが無いのはありなの? + return 0; - if(battle_config.pc_skill_log) - printf("PC %d skill castend skill=%d\n",sd->bl.id,sd->skillid); - pc_stop_walking(sd,0); - - switch( skill_get_nk(sd->skillid) ) - { - /* 攻撃系/吹き飛ばし系 */ - case 0: case 2: - skill_castend_damage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0); - break; - case 1:/* 支援系 */ - if( (sd->skillid==AL_HEAL || (sd->skillid==ALL_RESURRECTION && bl->type != BL_PC) || sd->skillid==PR_ASPERSIO) && battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))) - skill_castend_damage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0); - else - skill_castend_nodamage_id(&sd->bl,bl,sd->skillid,sd->skilllv,tick,0); - break; - } + if (sd->skillid != SA_CASTCANCEL && sd->skilltimer != tid) /* タイマIDの確認 */ + return 0; + if (sd->skillid != SA_CASTCANCEL && sd->skilltimer != -1 + && pc_checkskill (sd, SA_FREECAST) > 0) + { + sd->speed = sd->prev_speed; + clif_updatestatus (sd, SP_SPEED); + } + if (sd->skillid != SA_CASTCANCEL) + sd->skilltimer = -1; + + if ((bl = map_id2bl (sd->skilltarget)) == NULL || bl->prev == NULL) + { + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + if (sd->bl.m != bl->m || pc_isdead (sd)) + { //マップが違うか自分が死んでいる + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + + if (sd->skillid == PR_LEXAETERNA) + { + struct status_change *sc_data = battle_get_sc_data (bl); + if (sc_data + && (sc_data[SC_FREEZE].timer != -1 + || (sc_data[SC_STONE].timer != -1 + && sc_data[SC_STONE].val2 == 0))) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + } + else if (sd->skillid == RG_BACKSTAP) + { + int dir = map_calc_dir (&sd->bl, bl->x, bl->y), t_dir = + battle_get_dir (bl); + int dist = distance (sd->bl.x, sd->bl.y, bl->x, bl->y); + if (bl->type != BL_SKILL && (dist == 0 || map_check_dir (dir, t_dir))) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + } + + inf2 = skill_get_inf2 (sd->skillid); + if (((skill_get_inf (sd->skillid) & 1) || inf2 & 4) && // 彼我敵対関係チェック + battle_check_target (&sd->bl, bl, BCT_ENEMY) <= 0) + { + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + if (inf2 & 0xC00 && sd->bl.id != bl->id) + { + int fail_flag = 1; + if (inf2 & 0x400 && battle_check_target (&sd->bl, bl, BCT_PARTY) > 0) + fail_flag = 0; + if (inf2 & 0x800 && sd->status.guild_id > 0 + && sd->status.guild_id == battle_get_guild_id (bl)) + fail_flag = 0; + if (fail_flag) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + } + + range = skill_get_range (sd->skillid, sd->skilllv); + if (range < 0) + range = battle_get_range (&sd->bl) - (range + 1); + range += battle_config.pc_skill_add_range; + if ((sd->skillid == MO_EXTREMITYFIST && sd->sc_data[SC_COMBO].timer != -1 + && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) + || (sd->skillid == CH_TIGERFIST && sd->sc_data[SC_COMBO].timer != -1 + && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) + || (sd->skillid == CH_CHAINCRUSH && sd->sc_data[SC_COMBO].timer != -1 + && sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH) + || (sd->skillid == CH_CHAINCRUSH && sd->sc_data[SC_COMBO].timer != -1 + && sd->sc_data[SC_COMBO].val1 == CH_TIGERFIST)) + range += + skill_get_blewcount (MO_COMBOFINISH, sd->sc_data[SC_COMBO].val2); + if (battle_config.skill_out_range_consume) + { // changed to allow casting when target walks out of range [Valaris] + if (range < distance (sd->bl.x, sd->bl.y, bl->x, bl->y)) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + } + if (!skill_check_condition (sd, 1)) + { /* 使用条件チェック */ + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + sd->skillitem = sd->skillitemlv = -1; + if (battle_config.skill_out_range_consume) + { + if (range < distance (sd->bl.x, sd->bl.y, bl->x, bl->y)) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + sd->canact_tick = tick; + sd->canmove_tick = tick; + return 0; + } + } + + if (battle_config.pc_skill_log) + printf ("PC %d skill castend skill=%d\n", sd->bl.id, sd->skillid); + pc_stop_walking (sd, 0); + + switch (skill_get_nk (sd->skillid)) + { + /* 攻撃系/吹き飛ばし系 */ + case 0: + case 2: + skill_castend_damage_id (&sd->bl, bl, sd->skillid, sd->skilllv, + tick, 0); + break; + case 1: /* 支援系 */ + if ((sd->skillid == AL_HEAL + || (sd->skillid == ALL_RESURRECTION && bl->type != BL_PC) + || sd->skillid == PR_ASPERSIO) + && battle_check_undead (battle_get_race (bl), + battle_get_elem_type (bl))) + skill_castend_damage_id (&sd->bl, bl, sd->skillid, + sd->skilllv, tick, 0); + else + skill_castend_nodamage_id (&sd->bl, bl, sd->skillid, + sd->skilllv, tick, 0); + break; + } - return 0; + return 0; } /*========================================== * スキル使用(詠唱完了、場所指定の実際の処理) *------------------------------------------ */ -int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skilllv,unsigned int tick,int flag) +int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid, + int skilllv, unsigned int tick, int flag) { - struct map_session_data *sd=NULL; - int i,tmpx = 0,tmpy = 0, x1 = 0, y1 = 0; + struct map_session_data *sd = NULL; + int i, tmpx = 0, tmpy = 0, x1 = 0, y1 = 0; - nullpo_retr(0, src); + nullpo_retr (0, src); - if(src->type==BL_PC){ - nullpo_retr(0, sd=(struct map_session_data *)src); - } - if( skillid != WZ_METEOR && - skillid != WZ_SIGHTRASHER && - skillid != AM_CANNIBALIZE && - skillid != AM_SPHEREMINE) - clif_skill_poseffect(src,skillid,skilllv,x,y,tick); - - if (skillnotok(skillid, sd)) // [MouseJstr] - return 0; - - switch(skillid) - { - case PR_BENEDICTIO: /* 聖体降福 */ - skill_area_temp[1]=src->id; - map_foreachinarea(skill_area_sub, - src->m,x-1,y-1,x+1,y+1,0, - src,skillid,skilllv,tick, flag|BCT_NOENEMY|1, - skill_castend_nodamage_id); - map_foreachinarea(skill_area_sub, - src->m,x-1,y-1,x+1,y+1,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY|1, - skill_castend_damage_id); - break; - - case BS_HAMMERFALL: /* ハンマーフォール */ - skill_area_temp[1]=src->id; - skill_area_temp[2]=x; - skill_area_temp[3]=y; - map_foreachinarea(skill_area_sub, - src->m,x-2,y-2,x+2,y+2,0, - src,skillid,skilllv,tick, flag|BCT_ENEMY|2, - skill_castend_nodamage_id); - break; - - case HT_DETECTING: /* ディテクティング */ - { - const int range=7; - map_foreachinarea( skill_status_change_timer_sub, - src->m, src->x-range, src->y-range, src->x+range,src->y+range,0, - src,SC_SIGHT,tick); - } - break; - - case MG_SAFETYWALL: /* セイフティウォール */ - case MG_FIREWALL: /* ファイヤーウォール */ - case MG_THUNDERSTORM: /* サンダーストーム */ - case AL_PNEUMA: /* ニューマ */ - case WZ_ICEWALL: /* アイスウォール */ - case WZ_FIREPILLAR: /* ファイアピラー */ - case WZ_SIGHTRASHER: - case WZ_QUAGMIRE: /* クァグマイア */ - case WZ_VERMILION: /* ロードオブヴァーミリオン */ - case WZ_FROSTNOVA: /* フロストノヴァ */ - case WZ_STORMGUST: /* ストームガスト */ - case WZ_HEAVENDRIVE: /* ヘヴンズドライブ */ - case PR_SANCTUARY: /* サンクチュアリ */ - case PR_MAGNUS: /* マグヌスエクソシズム */ - case CR_GRANDCROSS: /* グランドクロス */ - case HT_SKIDTRAP: /* スキッドトラップ */ - case HT_LANDMINE: /* ランドマイン */ - case HT_ANKLESNARE: /* アンクルスネア */ - case HT_SHOCKWAVE: /* ショックウェーブトラップ */ - case HT_SANDMAN: /* サンドマン */ - case HT_FLASHER: /* フラッシャー */ - case HT_FREEZINGTRAP: /* フリージングトラップ */ - case HT_BLASTMINE: /* ブラストマイン */ - case HT_CLAYMORETRAP: /* クレイモアートラップ */ - case AS_VENOMDUST: /* ベノムダスト */ - case AM_DEMONSTRATION: /* デモンストレーション */ - case PF_SPIDERWEB: /* スパイダーウェッブ */ - case PF_FOGWALL: /* フォグウォール */ - case HT_TALKIEBOX: /* トーキーボックス */ - skill_unitsetting(src,skillid,skilllv,x,y,0); - break; - - case RG_GRAFFITI: /* Graffiti [Valaris] */ - skill_clear_unitgroup(src); - skill_unitsetting(src,skillid,skilllv,x,y,0); - break; + if (src->type == BL_PC) + { + nullpo_retr (0, sd = (struct map_session_data *) src); + } + if (skillid != WZ_METEOR && + skillid != WZ_SIGHTRASHER && + skillid != AM_CANNIBALIZE && skillid != AM_SPHEREMINE) + clif_skill_poseffect (src, skillid, skilllv, x, y, tick); - case SA_VOLCANO: /* ボルケーノ */ - case SA_DELUGE: /* デリュージ */ - case SA_VIOLENTGALE: /* バイオレントゲイル */ - case SA_LANDPROTECTOR: /* ランドプロテクター */ - skill_clear_element_field(src);//既に自分が発動している属性場をクリア - skill_unitsetting(src,skillid,skilllv,x,y,0); - break; - - case WZ_METEOR: //メテオストーム - { - int flag=0; - for(i=0;i<2+(skilllv>>1);i++) { - int j=0, c; - do { - tmpx = x + (MRAND(7) - 3); - tmpy = y + (MRAND(7) - 3); - if(tmpx < 0) - tmpx = 0; - else if(tmpx >= map[src->m].xs) - tmpx = map[src->m].xs - 1; - if(tmpy < 0) - tmpy = 0; - else if(tmpy >= map[src->m].ys) - tmpy = map[src->m].ys - 1; - j++; - } while(((c=map_getcell(src->m,tmpx,tmpy))==1 || c==5) && j<100); - if(j >= 100) - continue; - if(flag==0){ - clif_skill_poseffect(src,skillid,skilllv,tmpx,tmpy,tick); - flag=1; - } - if(i > 0) - skill_addtimerskill(src,tick+i*1000,0,tmpx,tmpy,skillid,skilllv,(x1<<16)|y1,flag); - x1 = tmpx; - y1 = tmpy; - } - skill_addtimerskill(src,tick+i*1000,0,tmpx,tmpy,skillid,skilllv,-1,flag); - } - break; + if (skillnotok (skillid, sd)) // [MouseJstr] + return 0; - case AL_WARP: /* ワープポータル */ - if(sd) { - if(map[sd->bl.m].flag.noteleport) /* テレポ禁止 */ - break; - clif_skill_warppoint(sd,sd->skillid,sd->status.save_point.map, - (sd->skilllv>1)?sd->status.memo_point[0].map:"", - (sd->skilllv>2)?sd->status.memo_point[1].map:"", - (sd->skilllv>3)?sd->status.memo_point[2].map:""); - } - break; - case MO_BODYRELOCATION: - if(sd){ - pc_movepos(sd,x,y); - }else if( src->type==BL_MOB ) - mob_warp((struct mob_data *)src,-1,x,y,0); - break; - case AM_CANNIBALIZE: // バイオプラント - if(sd){ - int mx,my,id=0; - struct mob_data *md; - - mx = x;// + (rand()%10 - 5); - my = y;// + (rand()%10 - 5); - id=mob_once_spawn(sd,"this",mx,my,"--ja--",1118,1,""); - if( (md=(struct mob_data *)map_id2bl(id)) !=NULL ){ - md->master_id=sd->bl.id; - md->hp=2210+skilllv*200; - md->state.special_mob_ai=1; - md->deletetimer=add_timer(gettick()+skill_get_time(skillid,skilllv),mob_timer_delete,id,0); - } - clif_skill_poseffect(src,skillid,skilllv,x,y,tick); - } - break; - case AM_SPHEREMINE: // スフィアーマイン - if(sd){ - int mx,my,id=0; - struct mob_data *md; - - mx = x;// + (rand()%10 - 5); - my = y;// + (rand()%10 - 5); - id=mob_once_spawn(sd,"this",mx,my,"--ja--",1142,1,""); - if( (md=(struct mob_data *)map_id2bl(id)) !=NULL ){ - md->master_id=sd->bl.id; - md->hp=1000+skilllv*200; - md->state.special_mob_ai=2; - md->deletetimer=add_timer(gettick()+skill_get_time(skillid,skilllv),mob_timer_delete,id,0); - } - clif_skill_poseffect(src,skillid,skilllv,x,y,tick); - } - break; - } + switch (skillid) + { + case PR_BENEDICTIO: /* 聖体降福 */ + skill_area_temp[1] = src->id; + map_foreachinarea (skill_area_sub, + src->m, x - 1, y - 1, x + 1, y + 1, 0, + src, skillid, skilllv, tick, + flag | BCT_NOENEMY | 1, + skill_castend_nodamage_id); + map_foreachinarea (skill_area_sub, src->m, x - 1, y - 1, x + 1, + y + 1, 0, src, skillid, skilllv, tick, + flag | BCT_ENEMY | 1, skill_castend_damage_id); + break; + + case BS_HAMMERFALL: /* ハンマーフォール */ + skill_area_temp[1] = src->id; + skill_area_temp[2] = x; + skill_area_temp[3] = y; + map_foreachinarea (skill_area_sub, + src->m, x - 2, y - 2, x + 2, y + 2, 0, + src, skillid, skilllv, tick, + flag | BCT_ENEMY | 2, + skill_castend_nodamage_id); + break; + + case HT_DETECTING: /* ディテクティング */ + { + const int range = 7; + map_foreachinarea (skill_status_change_timer_sub, + src->m, src->x - range, src->y - range, + src->x + range, src->y + range, 0, src, + SC_SIGHT, tick); + } + break; + + case MG_SAFETYWALL: /* セイフティウォール */ + case MG_FIREWALL: /* ファイヤーウォール */ + case MG_THUNDERSTORM: /* サンダーストーム */ + case AL_PNEUMA: /* ニューマ */ + case WZ_ICEWALL: /* アイスウォール */ + case WZ_FIREPILLAR: /* ファイアピラー */ + case WZ_SIGHTRASHER: + case WZ_QUAGMIRE: /* クァグマイア */ + case WZ_VERMILION: /* ロードオブヴァーミリオン */ + case WZ_FROSTNOVA: /* フロストノヴァ */ + case WZ_STORMGUST: /* ストームガスト */ + case WZ_HEAVENDRIVE: /* ヘヴンズドライブ */ + case PR_SANCTUARY: /* サンクチュアリ */ + case PR_MAGNUS: /* マグヌスエクソシズム */ + case CR_GRANDCROSS: /* グランドクロス */ + case HT_SKIDTRAP: /* スキッドトラップ */ + case HT_LANDMINE: /* ランドマイン */ + case HT_ANKLESNARE: /* アンクルスネア */ + case HT_SHOCKWAVE: /* ショックウェーブトラップ */ + case HT_SANDMAN: /* サンドマン */ + case HT_FLASHER: /* フラッシャー */ + case HT_FREEZINGTRAP: /* フリージングトラップ */ + case HT_BLASTMINE: /* ブラストマイン */ + case HT_CLAYMORETRAP: /* クレイモアートラップ */ + case AS_VENOMDUST: /* ベノムダスト */ + case AM_DEMONSTRATION: /* デモンストレーション */ + case PF_SPIDERWEB: /* スパイダーウェッブ */ + case PF_FOGWALL: /* フォグウォール */ + case HT_TALKIEBOX: /* トーキーボックス */ + skill_unitsetting (src, skillid, skilllv, x, y, 0); + break; + + case RG_GRAFFITI: /* Graffiti [Valaris] */ + skill_clear_unitgroup (src); + skill_unitsetting (src, skillid, skilllv, x, y, 0); + break; + + case SA_VOLCANO: /* ボルケーノ */ + case SA_DELUGE: /* デリュージ */ + case SA_VIOLENTGALE: /* バイオレントゲイル */ + case SA_LANDPROTECTOR: /* ランドプロテクター */ + skill_clear_element_field (src); //既に自分が発動している属性場をクリア + skill_unitsetting (src, skillid, skilllv, x, y, 0); + break; + + case WZ_METEOR: //メテオストーム + { + int flag = 0; + for (i = 0; i < 2 + (skilllv >> 1); i++) + { + int j = 0, c; + do + { + tmpx = x + (MRAND (7) - 3); + tmpy = y + (MRAND (7) - 3); + if (tmpx < 0) + tmpx = 0; + else if (tmpx >= map[src->m].xs) + tmpx = map[src->m].xs - 1; + if (tmpy < 0) + tmpy = 0; + else if (tmpy >= map[src->m].ys) + tmpy = map[src->m].ys - 1; + j++; + } + while (((c = map_getcell (src->m, tmpx, tmpy)) == 1 || c == 5) + && j < 100); + if (j >= 100) + continue; + if (flag == 0) + { + clif_skill_poseffect (src, skillid, skilllv, tmpx, tmpy, + tick); + flag = 1; + } + if (i > 0) + skill_addtimerskill (src, tick + i * 1000, 0, tmpx, tmpy, + skillid, skilllv, (x1 << 16) | y1, + flag); + x1 = tmpx; + y1 = tmpy; + } + skill_addtimerskill (src, tick + i * 1000, 0, tmpx, tmpy, skillid, + skilllv, -1, flag); + } + break; - return 0; + case AL_WARP: /* ワープポータル */ + if (sd) + { + if (map[sd->bl.m].flag.noteleport) /* テレポ禁止 */ + break; + clif_skill_warppoint (sd, sd->skillid, + sd->status.save_point.map, + (sd->skilllv > + 1) ? sd->status.memo_point[0].map : "", + (sd->skilllv > + 2) ? sd->status.memo_point[1].map : "", + (sd->skilllv > + 3) ? sd->status. + memo_point[2].map : ""); + } + break; + case MO_BODYRELOCATION: + if (sd) + { + pc_movepos (sd, x, y); + } + else if (src->type == BL_MOB) + mob_warp ((struct mob_data *) src, -1, x, y, 0); + break; + case AM_CANNIBALIZE: // バイオプラント + if (sd) + { + int mx, my, id = 0; + struct mob_data *md; + + mx = x; // + (rand()%10 - 5); + my = y; // + (rand()%10 - 5); + id = mob_once_spawn (sd, "this", mx, my, "--ja--", 1118, 1, + ""); + if ((md = (struct mob_data *) map_id2bl (id)) != NULL) + { + md->master_id = sd->bl.id; + md->hp = 2210 + skilllv * 200; + md->state.special_mob_ai = 1; + md->deletetimer = + add_timer (gettick () + + skill_get_time (skillid, skilllv), + mob_timer_delete, id, 0); + } + clif_skill_poseffect (src, skillid, skilllv, x, y, tick); + } + break; + case AM_SPHEREMINE: // スフィアーマイン + if (sd) + { + int mx, my, id = 0; + struct mob_data *md; + + mx = x; // + (rand()%10 - 5); + my = y; // + (rand()%10 - 5); + id = mob_once_spawn (sd, "this", mx, my, "--ja--", 1142, 1, + ""); + if ((md = (struct mob_data *) map_id2bl (id)) != NULL) + { + md->master_id = sd->bl.id; + md->hp = 1000 + skilllv * 200; + md->state.special_mob_ai = 2; + md->deletetimer = + add_timer (gettick () + + skill_get_time (skillid, skilllv), + mob_timer_delete, id, 0); + } + clif_skill_poseffect (src, skillid, skilllv, x, y, tick); + } + break; + } + + return 0; } /*========================================== * スキル使用(詠唱完了、map指定) *------------------------------------------ */ -int skill_castend_map( struct map_session_data *sd,int skill_num, const char *map) +int skill_castend_map (struct map_session_data *sd, int skill_num, + const char *map) { - int x=0,y=0; - - nullpo_retr(0, sd); - if( sd->bl.prev == NULL || pc_isdead(sd) ) - return 0; - - if( sd->opt1>0 || sd->status.option&2 ) - return 0; - //スキルが使えない状態異常中 - if(sd->sc_data){ - if( sd->sc_data[SC_DIVINA].timer!=-1 || - sd->sc_data[SC_ROKISWEIL].timer!=-1 || - sd->sc_data[SC_AUTOCOUNTER].timer != -1 || - sd->sc_data[SC_STEELBODY].timer != -1 || - sd->sc_data[SC_DANCING].timer!=-1 || - sd->sc_data[SC_BERSERK].timer != -1 ) - return 0; - } + int x = 0, y = 0; - if( skill_num != sd->skillid) /* 不正パケットらしい */ - return 0; - - pc_stopattack(sd); - - if(battle_config.pc_skill_log) - printf("PC %d skill castend skill =%d map=%s\n",sd->bl.id,skill_num,map); - pc_stop_walking(sd,0); - - if(strcmp(map,"cancel")==0) - return 0; - - switch(skill_num){ - case AL_TELEPORT: /* テレポート */ - if(strcmp(map,"Random")==0) - pc_randomwarp(sd,3); - else - pc_setpos(sd,sd->status.save_point.map, - sd->status.save_point.x,sd->status.save_point.y,3); - break; - - case AL_WARP: /* ワープポータル */ - { - const struct point *p[]={ - &sd->status.save_point,&sd->status.memo_point[0], - &sd->status.memo_point[1],&sd->status.memo_point[2], - }; - struct skill_unit_group *group; - int i; - int maxcount=0; - - if((maxcount = skill_get_maxcount(sd->skillid)) > 0) { - int c; - for(i=c=0;i<MAX_SKILLUNITGROUP;i++) { - if(sd->skillunit[i].alive_count > 0 && sd->skillunit[i].skill_id == sd->skillid) - c++; - } - if(c >= maxcount) { - clif_skill_fail(sd,sd->skillid,0,0); - sd->canact_tick = gettick(); - sd->canmove_tick = gettick(); - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - } + nullpo_retr (0, sd); + if (sd->bl.prev == NULL || pc_isdead (sd)) + return 0; - for(i=0;i<sd->skilllv;i++){ - if(strcmp(map,p[i]->map)==0){ - x=p[i]->x; - y=p[i]->y; - break; - } - } - if(x==0 || y==0) /* 不正パケット? */ - return 0; - - if(!skill_check_condition(sd,3)) - return 0; - if((group=skill_unitsetting(&sd->bl,sd->skillid,sd->skilllv,sd->skillx,sd->skilly,0))==NULL) - return 0; - group->valstr=(char *)aCalloc(24,sizeof(char)); - memcpy(group->valstr,map,24); - group->val2=(x<<16)|y; - } - break; - } + if (sd->opt1 > 0 || sd->status.option & 2) + return 0; + //スキルが使えない状態異常中 + if (sd->sc_data) + { + if (sd->sc_data[SC_DIVINA].timer != -1 || + sd->sc_data[SC_ROKISWEIL].timer != -1 || + sd->sc_data[SC_AUTOCOUNTER].timer != -1 || + sd->sc_data[SC_STEELBODY].timer != -1 || + sd->sc_data[SC_DANCING].timer != -1 || + sd->sc_data[SC_BERSERK].timer != -1) + return 0; + } + + if (skill_num != sd->skillid) /* 不正パケットらしい */ + return 0; + + pc_stopattack (sd); + + if (battle_config.pc_skill_log) + printf ("PC %d skill castend skill =%d map=%s\n", sd->bl.id, + skill_num, map); + pc_stop_walking (sd, 0); + + if (strcmp (map, "cancel") == 0) + return 0; + + switch (skill_num) + { + case AL_TELEPORT: /* テレポート */ + if (strcmp (map, "Random") == 0) + pc_randomwarp (sd, 3); + else + pc_setpos (sd, sd->status.save_point.map, + sd->status.save_point.x, sd->status.save_point.y, + 3); + break; + + case AL_WARP: /* ワープポータル */ + { + const struct point *p[] = { + &sd->status.save_point, &sd->status.memo_point[0], + &sd->status.memo_point[1], &sd->status.memo_point[2], + }; + struct skill_unit_group *group; + int i; + int maxcount = 0; + + if ((maxcount = skill_get_maxcount (sd->skillid)) > 0) + { + int c; + for (i = c = 0; i < MAX_SKILLUNITGROUP; i++) + { + if (sd->skillunit[i].alive_count > 0 + && sd->skillunit[i].skill_id == sd->skillid) + c++; + } + if (c >= maxcount) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + sd->canact_tick = gettick (); + sd->canmove_tick = gettick (); + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + } + + for (i = 0; i < sd->skilllv; i++) + { + if (strcmp (map, p[i]->map) == 0) + { + x = p[i]->x; + y = p[i]->y; + break; + } + } + if (x == 0 || y == 0) /* 不正パケット? */ + return 0; + + if (!skill_check_condition (sd, 3)) + return 0; + if ((group = + skill_unitsetting (&sd->bl, sd->skillid, sd->skilllv, + sd->skillx, sd->skilly, 0)) == NULL) + return 0; + group->valstr = (char *) aCalloc (24, sizeof (char)); + memcpy (group->valstr, map, 24); + group->val2 = (x << 16) | y; + } + break; + } - return 0; + return 0; } /*========================================== * スキルユニット設定処理 *------------------------------------------ */ -struct skill_unit_group *skill_unitsetting( struct block_list *src, int skillid,int skilllv,int x,int y,int flag) +struct skill_unit_group *skill_unitsetting (struct block_list *src, + int skillid, int skilllv, int x, + int y, int flag) { - struct skill_unit_group *group; - int i,count=1,limit=10000,val1=0,val2=0; - int target=BCT_ENEMY,interval=1000,range=0; - int dir=0,aoe_diameter=0; // -- aoe_diameter (moonsoul) added for sage Area Of Effect skills - - nullpo_retr(0, src); - - switch(skillid){ /* 設定 */ - - case MG_SAFETYWALL: /* セイフティウォール */ - limit=skill_get_time(skillid,skilllv); - val2=skilllv+1; - interval = -1; - target=(battle_config.defnotenemy)?BCT_NOENEMY:BCT_ALL; - break; - - case MG_FIREWALL: /* ファイヤーウォール */ - if(src->x == x && src->y == y) - dir = 2; - else - dir=map_calc_dir(src,x,y); - if(dir&1) count=5; - else count=3; - limit=skill_get_time(skillid,skilllv); - val2=4+skilllv; - interval=1; - break; - - case AL_PNEUMA: /* ニューマ */ - limit=skill_get_time(skillid,skilllv); - interval = -1; - target=(battle_config.defnotenemy)?BCT_NOENEMY:BCT_ALL; - count = 9; - break; - - case AL_WARP: /* ワープポータル */ - target=BCT_ALL; - val1=skilllv+6; - if(flag==0) - limit=2000; - else - limit=skill_get_time(skillid,skilllv); - break; - - case PR_SANCTUARY: /* サンクチュアリ */ - count=21; - limit=skill_get_time(skillid,skilllv); - val1=skilllv+3; - val2=(skilllv>6)?777:skilllv*100; - target=BCT_ALL; - range=1; - break; - - case PR_MAGNUS: /* マグヌスエクソシズム */ - count=33; - limit=skill_get_time(skillid,skilllv); - interval=3000; - break; - - case WZ_FIREPILLAR: /* ファイアーピラー */ - if(flag==0) - limit=skill_get_time(skillid,skilllv); - else - limit=1000; - interval=2000; - val1=skilllv+2; - range=1; - break; - - case MG_THUNDERSTORM: /* サンダーストーム */ - limit=500; - range=1; - break; - - case WZ_FROSTNOVA: /* フロストノヴァ */ - limit=500; - range=5; - break; - case WZ_HEAVENDRIVE: /* ヘヴンズドライブ */ - limit=500; - range=2; - break; - - case WZ_METEOR: /* メテオストーム */ - limit=500; - range=3; - break; - - case WZ_SIGHTRASHER: - limit=500; - count=41; - break; - - case WZ_VERMILION: /* ロードオブヴァーミリオン */ - limit=4100; - interval=1000; - range=6; - break; - - case WZ_ICEWALL: /* アイスウォール */ - limit=skill_get_time(skillid,skilllv); - count=5; - break; - - case WZ_STORMGUST: /* ストームガスト */ - limit=4600; - interval=450; - range=5; - break; - - case WZ_QUAGMIRE: /* クァグマイア */ - limit=skill_get_time(skillid,skilllv); - interval=200; - count=25; - break; - - case HT_SKIDTRAP: /* スキッドトラップ */ - case HT_LANDMINE: /* ランドマイン */ - case HT_ANKLESNARE: /* アンクルスネア */ - case HT_SANDMAN: /* サンドマン */ - case PF_SPIDERWEB: /* スパイダーウェッブ */ - case HT_FLASHER: /* フラッシャー */ - case HT_FREEZINGTRAP: /* フリージングトラップ */ - case HT_BLASTMINE: /* ブラストマイン */ - case HT_CLAYMORETRAP: /* クレイモアートラップ */ - limit=skill_get_time(skillid,skilllv); - range=1; - break; - - case HT_TALKIEBOX: /* トーキーボックス */ - limit=skill_get_time(skillid,skilllv); - range=1; - target=BCT_ALL; - break; - - case HT_SHOCKWAVE: /* ショックウェーブトラップ */ - limit=skill_get_time(skillid,skilllv); - range=1; - val1=skilllv*15+10; - break; - - case AS_VENOMDUST: /* ベノムダスト */ - limit=skill_get_time(skillid,skilllv); - interval=1000; - count=5; - break; - - case CR_GRANDCROSS: /* グランドクロス */ - count=29; - limit=1000; - interval=300; - break; - - case SA_VOLCANO: /* ボルケーノ */ - case SA_DELUGE: /* デリュージ */ - case SA_VIOLENTGALE: /* バイオレントゲイル */ - limit=skill_get_time(skillid,skilllv); - count=skilllv<=2?25:(skilllv<=4?49:81); - target=BCT_ALL; - break; - - case SA_LANDPROTECTOR: /* グランドクロス */ - limit=skill_get_time(skillid,skilllv); // changed to get duration from cast_db (moonsoul) - val1=skilllv*15+10; - aoe_diameter=skilllv+skilllv%2+5; - target=BCT_ALL; - count=aoe_diameter*aoe_diameter; // -- this will not function if changed to ^2 (moonsoul) - break; - - case BD_LULLABY: /* 子守唄 */ - case BD_ETERNALCHAOS: /* エターナルカオス */ - case BD_ROKISWEIL: /* ロキの叫び */ - count=81; - limit=skill_get_time(skillid,skilllv); - range=5; - target=BCT_ALL; - break; - case BD_RICHMANKIM: - case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ - case BD_INTOABYSS: /* 深淵の中に */ - case BD_SIEGFRIED: /* 不死身のジークフリード */ - count=81; - limit=skill_get_time(skillid,skilllv); - range=5; - target=BCT_PARTY; - break; - - case BA_WHISTLE: /* 口笛 */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=5; - target=BCT_NOENEMY; - if(src->type == BL_PC) - val1 = (pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON)+1)>>1; - val2 = ((battle_get_agi(src)/10)&0xffff)<<16; - val2 |= (battle_get_luk(src)/10)&0xffff; - break; - case DC_HUMMING: /* ハミング */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=5; - target=BCT_NOENEMY; - if(src->type == BL_PC) - val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1; - val2 = battle_get_dex(src)/10; - break; - - case BA_DISSONANCE: /* 不協和音 */ - case DC_UGLYDANCE: /* 自分勝手なダンス */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=5; - target=BCT_ENEMY; - break; - - case DC_DONTFORGETME: /* 私を忘れないで… */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=5; - target=BCT_ENEMY; - if(src->type == BL_PC) - val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1; - val2 = ((battle_get_str(src)/20)&0xffff)<<16; - val2 |= (battle_get_agi(src)/10)&0xffff; - break; - case BA_POEMBRAGI: /* ブラギの詩 */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=5; - target=BCT_NOENEMY; - if(src->type == BL_PC) - val1 = pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON); - val2 = ((battle_get_dex(src)/10)&0xffff)<<16; - val2 |= (battle_get_int(src)/5)&0xffff; - break; - case BA_APPLEIDUN: /* イドゥンの林檎 */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=5; - target=BCT_NOENEMY; - if(src->type == BL_PC) - val1 = ((pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON))&0xffff)<<16; - else - val1 = 0; - val1 |= (battle_get_vit(src))&0xffff; - val2 = 0;//回復用タイムカウンタ(6秒毎に1増加) - break; - case DC_SERVICEFORYOU: /* サービスフォーユー */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=5; - target=BCT_PARTY; - if(src->type == BL_PC) - val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1; - val2 = battle_get_int(src)/10; - break; - case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=5; - target=BCT_NOENEMY; - if(src->type == BL_PC) - val1 = (pc_checkskill((struct map_session_data *)src,BA_MUSICALLESSON)+1)>>1; - val2 = battle_get_agi(src)/20; - break; - case DC_FORTUNEKISS: /* 幸運のキス */ - count=49; - limit=skill_get_time(skillid,skilllv); - range=5; - target=BCT_NOENEMY; - if(src->type == BL_PC) - val1 = (pc_checkskill((struct map_session_data *)src,DC_DANCINGLESSON)+1)>>1; - val2 = battle_get_luk(src)/10; - break; - case AM_DEMONSTRATION: /* デモンストレーション */ - limit=skill_get_time(skillid,skilllv); - interval=1000; - range=1; - target=BCT_ENEMY; - break; - case WE_CALLPARTNER: /* あなたに逢いたい */ - limit=skill_get_time(skillid,skilllv); - range=-1; - break; - - case HP_BASILICA: /* バジリカ */ - limit=skill_get_time(skillid,skilllv); - target=BCT_ALL; - range=3; - //Fix to prevent the priest from walking while Basilica is up. - battle_stopwalking(src,1); - skill_status_change_start(src,SC_ANKLE,skilllv,0,0,0,limit,0); - break; - case PA_GOSPEL: /* ゴスペル */ - count=49; - target=BCT_PARTY; - limit=skill_get_time(skillid,skilllv); - break; - case PF_FOGWALL: /* フォグウォール */ - count=15; - limit=skill_get_time(skillid,skilllv); - break; - case RG_GRAFFITI: /* Graffiti */ - count=1; // Leave this at 1 [Valaris] - limit=600000; // Time length [Valaris] - break; - }; - - nullpo_retr(NULL, group=skill_initunitgroup(src,count,skillid,skilllv,skill_get_unit_id(skillid,flag&1))); - group->limit=limit; - group->val1=val1; - group->val2=val2; - group->target_flag=target; - group->interval=interval; - group->range=range; - if(skillid==HT_TALKIEBOX || - skillid==RG_GRAFFITI){ - group->valstr=calloc(80, 1); - if(group->valstr==NULL){ - printf("skill_castend_map: out of memory !\n"); - exit(1); - } - memcpy(group->valstr,talkie_mes,80); - } - for(i=0;i<count;i++){ - struct skill_unit *unit; - int ux=x,uy=y,val1=skilllv,val2=0,limit=group->limit,alive=1; - int range=group->range; - switch(skillid){ /* 設定 */ - case AL_PNEUMA: /* ニューマ */ - { - static const int dx[9]={-1, 0, 1,-1, 0, 1,-1, 0, 1}; - static const int dy[9]={-1,-1,-1, 0, 0, 0, 1, 1, 1}; - ux+=dx[i]; - uy+=dy[i]; - } - break; - case MG_FIREWALL: /* ファイヤーウォール */ - { - if(dir&1){ /* 斜め配置 */ - static const int dx[][5]={ - { 1,1,0,0,-1 }, { -1,-1,0,0,1 }, - },dy[][5]={ - { 1,0,0,-1,-1 }, { 1,0,0,-1,-1 }, - }; - ux+=dx[(dir>>1)&1][i]; - uy+=dy[(dir>>1)&1][i]; - }else{ /* 上下配置 */ - if(dir%4==0) /* 上下 */ - ux+=i-1; - else /* 左右 */ - uy+=i-1; - } - val2=group->val2; - } - break; + struct skill_unit_group *group; + int i, count = 1, limit = 10000, val1 = 0, val2 = 0; + int target = BCT_ENEMY, interval = 1000, range = 0; + int dir = 0, aoe_diameter = 0; // -- aoe_diameter (moonsoul) added for sage Area Of Effect skills - case PR_SANCTUARY: /* サンクチュアリ */ - { - static const int dx[]={ - -1,0,1, -2,-1,0,1,2, -2,-1,0,1,2, -2,-1,0,1,2, -1,0,1 }; - static const int dy[]={ - -2,-2,-2, -1,-1,-1,-1,-1, 0,0,0,0,0, 1,1,1,1,1, 2,2,2, }; - ux+=dx[i]; - uy+=dy[i]; - } - break; + nullpo_retr (0, src); - case PR_MAGNUS: /* マグヌスエクソシズム */ - { - static const int dx[]={ -1,0,1, -1,0,1, -3,-2,-1,0,1,2,3, - -3,-2,-1,0,1,2,3, -3,-2,-1,0,1,2,3, -1,0,1, -1,0,1, }; - static const int dy[]={ - -3,-3,-3, -2,-2,-2, -1,-1,-1,-1,-1,-1,-1, - 0,0,0,0,0,0,0, 1,1,1,1,1,1,1, 2,2,2, 3,3,3 }; - ux+=dx[i]; - uy+=dy[i]; - } - break; + switch (skillid) + { /* 設定 */ - case WZ_SIGHTRASHER: - { - static const int dx[]={ - -5, 0, 5, -4, 0, 4, -3, 0, 3, -2, 0, 2, -1, 0, 1, -5,-4,-3,-2,-1, 0, 1, 2, 3, 4, 5, -1, 0, 1, -2, 0, 2, -3, 0, 3, -4, 0, 4, -5, 0, 5 }; - static const int dy[]={ - -5,-5,-5, -4,-4,-4, -3,-3,-3, -2,-2,-2, -1,-1,-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5 }; - ux+=dx[i]; - uy+=dy[i]; - } - break; + case MG_SAFETYWALL: /* セイフティウォール */ + limit = skill_get_time (skillid, skilllv); + val2 = skilllv + 1; + interval = -1; + target = (battle_config.defnotenemy) ? BCT_NOENEMY : BCT_ALL; + break; - case WZ_ICEWALL: /* アイスウォール */ - { - static const int dirx[8]={0,-1,-1,-1,0,1,1,1}; - static const int diry[8]={1,1,0,-1,-1,-1,0,1}; - if(skilllv <= 1) - val1 = 500; - else - val1 = 200 + 200*skilllv; - if(src->x == x && src->y == y) - dir = 2; - else - dir=map_calc_dir(src,x,y); - ux+=(2-i)*diry[dir]; - uy+=(i-2)*dirx[dir]; - } - break; + case MG_FIREWALL: /* ファイヤーウォール */ + if (src->x == x && src->y == y) + dir = 2; + else + dir = map_calc_dir (src, x, y); + if (dir & 1) + count = 5; + else + count = 3; + limit = skill_get_time (skillid, skilllv); + val2 = 4 + skilllv; + interval = 1; + break; - case WZ_QUAGMIRE: /* クァグマイア */ - ux+=(i%5-2); - uy+=(i/5-2); - if(i==12) - range=2; - else - range=-1; + case AL_PNEUMA: /* ニューマ */ + limit = skill_get_time (skillid, skilllv); + interval = -1; + target = (battle_config.defnotenemy) ? BCT_NOENEMY : BCT_ALL; + count = 9; + break; - break; + case AL_WARP: /* ワープポータル */ + target = BCT_ALL; + val1 = skilllv + 6; + if (flag == 0) + limit = 2000; + else + limit = skill_get_time (skillid, skilllv); + break; - case AS_VENOMDUST: /* ベノムダスト */ - { - static const int dx[]={-1,0,0,0,1}; - static const int dy[]={0,-1,0,1,0}; - ux+=dx[i]; - uy+=dy[i]; - } - break; + case PR_SANCTUARY: /* サンクチュアリ */ + count = 21; + limit = skill_get_time (skillid, skilllv); + val1 = skilllv + 3; + val2 = (skilllv > 6) ? 777 : skilllv * 100; + target = BCT_ALL; + range = 1; + break; - case CR_GRANDCROSS: /* グランドクロス */ - { - static const int dx[]={ - 0, 0, -1,0,1, -2,-1,0,1,2, -4,-3,-2,-1,0,1,2,3,4, -2,-1,0,1,2, -1,0,1, 0, 0, }; - static const int dy[]={ - -4, -3, -2,-2,-2, -1,-1,-1,-1,-1, 0,0,0,0,0,0,0,0,0, 1,1,1,1,1, 2,2,2, 3, 4, }; - ux+=dx[i]; - uy+=dy[i]; - } - break; - case SA_VOLCANO: /* ボルケーノ */ - case SA_DELUGE: /* デリュージ */ - case SA_VIOLENTGALE: /* バイオレントゲイル */ - { - int u_range=0,central=0; - if(skilllv<=2){ - u_range=2; - central=12; - }else if(skilllv<=4){ - u_range=3; - central=24; - }else if(skilllv>=5){ - u_range=4; - central=40; - } - ux+=(i%(u_range*2+1)-u_range); - uy+=(i/(u_range*2+1)-u_range); - - if(i==central) - range=u_range;//中央のユニットの効果範囲は全範囲 - else - range=-1;//中央以外のユニットは飾り - } - break; - case SA_LANDPROTECTOR: /* ランドプロテクター */ - { - int u_range=0; + case PR_MAGNUS: /* マグヌスエクソシズム */ + count = 33; + limit = skill_get_time (skillid, skilllv); + interval = 3000; + break; - if(skilllv<=2) u_range=3; - else if(skilllv<=4) u_range=4; - else if(skilllv>=5) u_range=5; + case WZ_FIREPILLAR: /* ファイアーピラー */ + if (flag == 0) + limit = skill_get_time (skillid, skilllv); + else + limit = 1000; + interval = 2000; + val1 = skilllv + 2; + range = 1; + break; - ux+=(i%(u_range*2+1)-u_range); - uy+=(i/(u_range*2+1)-u_range); + case MG_THUNDERSTORM: /* サンダーストーム */ + limit = 500; + range = 1; + break; - range=0; - } - break; + case WZ_FROSTNOVA: /* フロストノヴァ */ + limit = 500; + range = 5; + break; + case WZ_HEAVENDRIVE: /* ヘヴンズドライブ */ + limit = 500; + range = 2; + break; - /* ダンスなど */ - case BD_LULLABY: /* 子守歌 */ - case BD_RICHMANKIM: /* ニヨルドの宴 */ - case BD_ETERNALCHAOS: /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD:/* 戦太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ - case BD_ROKISWEIL: /* ロキの叫び */ - case BD_INTOABYSS: /* 深淵の中に */ - case BD_SIEGFRIED: /* 不死身のジークフリード */ - ux+=(i%9-4); - uy+=(i/9-4); - if(i==40) - range=4; /* 中心の場合は範囲を4にオーバーライド */ - else - range=-1; /* 中心じゃない場合は範囲を-1にオーバーライド */ - break; - case BA_DISSONANCE: /* 不協和音 */ - case BA_WHISTLE: /* 口笛 */ - case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */ - case BA_POEMBRAGI: /* ブラギの詩 */ - case BA_APPLEIDUN: /* イドゥンの林檎 */ - case DC_UGLYDANCE: /* 自分勝手なダンス */ - case DC_HUMMING: /* ハミング */ - case DC_DONTFORGETME: /* 私を忘れないで… */ - case DC_FORTUNEKISS: /* 幸運のキス */ - case DC_SERVICEFORYOU: /* サービスフォーユー */ - ux+=(i%7-3); - uy+=(i/7-3); - if(i==40) - range=4; /* 中心の場合は範囲を4にオーバーライド */ - else - range=-1; /* 中心じゃない場合は範囲を-1にオーバーライド */ - break; - case PA_GOSPEL: /* ゴスペル */ - ux+=(i%7-3); - uy+=(i/7-3); - break; - case PF_FOGWALL: /* フォグウォール */ - ux+=(i%5-2); - uy+=(i/5-1); - break; - case RG_GRAFFITI: /* Graffiti [Valaris] */ - ux+=(i%5-2); - uy+=(i/5-2); - break; - } - //直上スキルの場合設置座標上にランドプロテクターがないかチェック - if(range<=0) - map_foreachinarea(skill_landprotector,src->m,ux,uy,ux,uy,BL_SKILL,skillid,&alive); - - if(skillid==WZ_ICEWALL && alive){ - val2=map_getcell(src->m,ux,uy); - if(val2==5 || val2==1) - alive=0; - else { - map_setcell(src->m,ux,uy,5); - clif_changemapcell(src->m,ux,uy,5,0); - } - } + case WZ_METEOR: /* メテオストーム */ + limit = 500; + range = 3; + break; - if(alive){ - nullpo_retr(NULL, unit=skill_initunit(group,i,ux,uy)); - unit->val1=val1; - unit->val2=val2; - unit->limit=limit; - unit->range=range; - } - } - return group; + case WZ_SIGHTRASHER: + limit = 500; + count = 41; + break; + + case WZ_VERMILION: /* ロードオブヴァーミリオン */ + limit = 4100; + interval = 1000; + range = 6; + break; + + case WZ_ICEWALL: /* アイスウォール */ + limit = skill_get_time (skillid, skilllv); + count = 5; + break; + + case WZ_STORMGUST: /* ストームガスト */ + limit = 4600; + interval = 450; + range = 5; + break; + + case WZ_QUAGMIRE: /* クァグマイア */ + limit = skill_get_time (skillid, skilllv); + interval = 200; + count = 25; + break; + + case HT_SKIDTRAP: /* スキッドトラップ */ + case HT_LANDMINE: /* ランドマイン */ + case HT_ANKLESNARE: /* アンクルスネア */ + case HT_SANDMAN: /* サンドマン */ + case PF_SPIDERWEB: /* スパイダーウェッブ */ + case HT_FLASHER: /* フラッシャー */ + case HT_FREEZINGTRAP: /* フリージングトラップ */ + case HT_BLASTMINE: /* ブラストマイン */ + case HT_CLAYMORETRAP: /* クレイモアートラップ */ + limit = skill_get_time (skillid, skilllv); + range = 1; + break; + + case HT_TALKIEBOX: /* トーキーボックス */ + limit = skill_get_time (skillid, skilllv); + range = 1; + target = BCT_ALL; + break; + + case HT_SHOCKWAVE: /* ショックウェーブトラップ */ + limit = skill_get_time (skillid, skilllv); + range = 1; + val1 = skilllv * 15 + 10; + break; + + case AS_VENOMDUST: /* ベノムダスト */ + limit = skill_get_time (skillid, skilllv); + interval = 1000; + count = 5; + break; + + case CR_GRANDCROSS: /* グランドクロス */ + count = 29; + limit = 1000; + interval = 300; + break; + + case SA_VOLCANO: /* ボルケーノ */ + case SA_DELUGE: /* デリュージ */ + case SA_VIOLENTGALE: /* バイオレントゲイル */ + limit = skill_get_time (skillid, skilllv); + count = skilllv <= 2 ? 25 : (skilllv <= 4 ? 49 : 81); + target = BCT_ALL; + break; + + case SA_LANDPROTECTOR: /* グランドクロス */ + limit = skill_get_time (skillid, skilllv); // changed to get duration from cast_db (moonsoul) + val1 = skilllv * 15 + 10; + aoe_diameter = skilllv + skilllv % 2 + 5; + target = BCT_ALL; + count = aoe_diameter * aoe_diameter; // -- this will not function if changed to ^2 (moonsoul) + break; + + case BD_LULLABY: /* 子守唄 */ + case BD_ETERNALCHAOS: /* エターナルカオス */ + case BD_ROKISWEIL: /* ロキの叫び */ + count = 81; + limit = skill_get_time (skillid, skilllv); + range = 5; + target = BCT_ALL; + break; + case BD_RICHMANKIM: + case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ + case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ + case BD_INTOABYSS: /* 深淵の中に */ + case BD_SIEGFRIED: /* 不死身のジークフリード */ + count = 81; + limit = skill_get_time (skillid, skilllv); + range = 5; + target = BCT_PARTY; + break; + + case BA_WHISTLE: /* 口笛 */ + count = 49; + limit = skill_get_time (skillid, skilllv); + range = 5; + target = BCT_NOENEMY; + if (src->type == BL_PC) + val1 = + (pc_checkskill + ((struct map_session_data *) src, + BA_MUSICALLESSON) + 1) >> 1; + val2 = ((battle_get_agi (src) / 10) & 0xffff) << 16; + val2 |= (battle_get_luk (src) / 10) & 0xffff; + break; + case DC_HUMMING: /* ハミング */ + count = 49; + limit = skill_get_time (skillid, skilllv); + range = 5; + target = BCT_NOENEMY; + if (src->type == BL_PC) + val1 = + (pc_checkskill + ((struct map_session_data *) src, + DC_DANCINGLESSON) + 1) >> 1; + val2 = battle_get_dex (src) / 10; + break; + + case BA_DISSONANCE: /* 不協和音 */ + case DC_UGLYDANCE: /* 自分勝手なダンス */ + count = 49; + limit = skill_get_time (skillid, skilllv); + range = 5; + target = BCT_ENEMY; + break; + + case DC_DONTFORGETME: /* 私を忘れないで… */ + count = 49; + limit = skill_get_time (skillid, skilllv); + range = 5; + target = BCT_ENEMY; + if (src->type == BL_PC) + val1 = + (pc_checkskill + ((struct map_session_data *) src, + DC_DANCINGLESSON) + 1) >> 1; + val2 = ((battle_get_str (src) / 20) & 0xffff) << 16; + val2 |= (battle_get_agi (src) / 10) & 0xffff; + break; + case BA_POEMBRAGI: /* ブラギの詩 */ + count = 49; + limit = skill_get_time (skillid, skilllv); + range = 5; + target = BCT_NOENEMY; + if (src->type == BL_PC) + val1 = + pc_checkskill ((struct map_session_data *) src, + BA_MUSICALLESSON); + val2 = ((battle_get_dex (src) / 10) & 0xffff) << 16; + val2 |= (battle_get_int (src) / 5) & 0xffff; + break; + case BA_APPLEIDUN: /* イドゥンの林檎 */ + count = 49; + limit = skill_get_time (skillid, skilllv); + range = 5; + target = BCT_NOENEMY; + if (src->type == BL_PC) + val1 = + ((pc_checkskill + ((struct map_session_data *) src, + BA_MUSICALLESSON)) & 0xffff) << 16; + else + val1 = 0; + val1 |= (battle_get_vit (src)) & 0xffff; + val2 = 0; //回復用タイムカウンタ(6秒毎に1増加) + break; + case DC_SERVICEFORYOU: /* サービスフォーユー */ + count = 49; + limit = skill_get_time (skillid, skilllv); + range = 5; + target = BCT_PARTY; + if (src->type == BL_PC) + val1 = + (pc_checkskill + ((struct map_session_data *) src, + DC_DANCINGLESSON) + 1) >> 1; + val2 = battle_get_int (src) / 10; + break; + case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */ + count = 49; + limit = skill_get_time (skillid, skilllv); + range = 5; + target = BCT_NOENEMY; + if (src->type == BL_PC) + val1 = + (pc_checkskill + ((struct map_session_data *) src, + BA_MUSICALLESSON) + 1) >> 1; + val2 = battle_get_agi (src) / 20; + break; + case DC_FORTUNEKISS: /* 幸運のキス */ + count = 49; + limit = skill_get_time (skillid, skilllv); + range = 5; + target = BCT_NOENEMY; + if (src->type == BL_PC) + val1 = + (pc_checkskill + ((struct map_session_data *) src, + DC_DANCINGLESSON) + 1) >> 1; + val2 = battle_get_luk (src) / 10; + break; + case AM_DEMONSTRATION: /* デモンストレーション */ + limit = skill_get_time (skillid, skilllv); + interval = 1000; + range = 1; + target = BCT_ENEMY; + break; + case WE_CALLPARTNER: /* あなたに逢いたい */ + limit = skill_get_time (skillid, skilllv); + range = -1; + break; + + case HP_BASILICA: /* バジリカ */ + limit = skill_get_time (skillid, skilllv); + target = BCT_ALL; + range = 3; + //Fix to prevent the priest from walking while Basilica is up. + battle_stopwalking (src, 1); + skill_status_change_start (src, SC_ANKLE, skilllv, 0, 0, 0, limit, + 0); + break; + case PA_GOSPEL: /* ゴスペル */ + count = 49; + target = BCT_PARTY; + limit = skill_get_time (skillid, skilllv); + break; + case PF_FOGWALL: /* フォグウォール */ + count = 15; + limit = skill_get_time (skillid, skilllv); + break; + case RG_GRAFFITI: /* Graffiti */ + count = 1; // Leave this at 1 [Valaris] + limit = 600000; // Time length [Valaris] + break; + }; + + nullpo_retr (NULL, group = + skill_initunitgroup (src, count, skillid, skilllv, + skill_get_unit_id (skillid, flag & 1))); + group->limit = limit; + group->val1 = val1; + group->val2 = val2; + group->target_flag = target; + group->interval = interval; + group->range = range; + if (skillid == HT_TALKIEBOX || skillid == RG_GRAFFITI) + { + group->valstr = calloc (80, 1); + if (group->valstr == NULL) + { + printf ("skill_castend_map: out of memory !\n"); + exit (1); + } + memcpy (group->valstr, talkie_mes, 80); + } + for (i = 0; i < count; i++) + { + struct skill_unit *unit; + int ux = x, uy = y, val1 = skilllv, val2 = 0, limit = + group->limit, alive = 1; + int range = group->range; + switch (skillid) + { /* 設定 */ + case AL_PNEUMA: /* ニューマ */ + { + static const int dx[9] = { -1, 0, 1, -1, 0, 1, -1, 0, 1 }; + static const int dy[9] = { -1, -1, -1, 0, 0, 0, 1, 1, 1 }; + ux += dx[i]; + uy += dy[i]; + } + break; + case MG_FIREWALL: /* ファイヤーウォール */ + { + if (dir & 1) + { /* 斜め配置 */ + static const int dx[][5] = { + {1, 1, 0, 0, -1}, {-1, -1, 0, 0, 1}, + }, dy[][5] = + { + { + 1, 0, 0, -1, -1}, + { + 1, 0, 0, -1, -1},}; + ux += dx[(dir >> 1) & 1][i]; + uy += dy[(dir >> 1) & 1][i]; + } + else + { /* 上下配置 */ + if (dir % 4 == 0) /* 上下 */ + ux += i - 1; + else /* 左右 */ + uy += i - 1; + } + val2 = group->val2; + } + break; + + case PR_SANCTUARY: /* サンクチュアリ */ + { + static const int dx[] = { + -1, 0, 1, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, + 2, -1, 0, 1 + }; + static const int dy[] = { + -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 2, 2, 2, + }; + ux += dx[i]; + uy += dy[i]; + } + break; + + case PR_MAGNUS: /* マグヌスエクソシズム */ + { + static const int dx[] = + { -1, 0, 1, -1, 0, 1, -3, -2, -1, 0, 1, 2, 3, + -3, -2, -1, 0, 1, 2, 3, -3, -2, -1, 0, 1, 2, 3, -1, 0, 1, + -1, 0, 1, + }; + static const int dy[] = { + -3, -3, -3, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3 + }; + ux += dx[i]; + uy += dy[i]; + } + break; + + case WZ_SIGHTRASHER: + { + static const int dx[] = { + -5, 0, 5, -4, 0, 4, -3, 0, 3, -2, 0, 2, -1, 0, 1, -5, -4, + -3, -2, -1, 0, 1, 2, 3, 4, 5, -1, 0, 1, -2, 0, 2, -3, + 0, 3, -4, 0, 4, -5, 0, 5 + }; + static const int dy[] = { + -5, -5, -5, -4, -4, -4, -3, -3, -3, -2, -2, -2, -1, -1, + -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2, + 3, 3, 3, 4, 4, 4, 5, 5, 5 + }; + ux += dx[i]; + uy += dy[i]; + } + break; + + case WZ_ICEWALL: /* アイスウォール */ + { + static const int dirx[8] = { 0, -1, -1, -1, 0, 1, 1, 1 }; + static const int diry[8] = { 1, 1, 0, -1, -1, -1, 0, 1 }; + if (skilllv <= 1) + val1 = 500; + else + val1 = 200 + 200 * skilllv; + if (src->x == x && src->y == y) + dir = 2; + else + dir = map_calc_dir (src, x, y); + ux += (2 - i) * diry[dir]; + uy += (i - 2) * dirx[dir]; + } + break; + + case WZ_QUAGMIRE: /* クァグマイア */ + ux += (i % 5 - 2); + uy += (i / 5 - 2); + if (i == 12) + range = 2; + else + range = -1; + + break; + + case AS_VENOMDUST: /* ベノムダスト */ + { + static const int dx[] = { -1, 0, 0, 0, 1 }; + static const int dy[] = { 0, -1, 0, 1, 0 }; + ux += dx[i]; + uy += dy[i]; + } + break; + + case CR_GRANDCROSS: /* グランドクロス */ + { + static const int dx[] = { + 0, 0, -1, 0, 1, -2, -1, 0, 1, 2, -4, -3, -2, -1, 0, 1, 2, + 3, 4, -2, -1, 0, 1, 2, -1, 0, 1, 0, 0, + }; + static const int dy[] = { + -4, -3, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 3, 4, + }; + ux += dx[i]; + uy += dy[i]; + } + break; + case SA_VOLCANO: /* ボルケーノ */ + case SA_DELUGE: /* デリュージ */ + case SA_VIOLENTGALE: /* バイオレントゲイル */ + { + int u_range = 0, central = 0; + if (skilllv <= 2) + { + u_range = 2; + central = 12; + } + else if (skilllv <= 4) + { + u_range = 3; + central = 24; + } + else if (skilllv >= 5) + { + u_range = 4; + central = 40; + } + ux += (i % (u_range * 2 + 1) - u_range); + uy += (i / (u_range * 2 + 1) - u_range); + + if (i == central) + range = u_range; //中央のユニットの効果範囲は全範囲 + else + range = -1; //中央以外のユニットは飾り + } + break; + case SA_LANDPROTECTOR: /* ランドプロテクター */ + { + int u_range = 0; + + if (skilllv <= 2) + u_range = 3; + else if (skilllv <= 4) + u_range = 4; + else if (skilllv >= 5) + u_range = 5; + + ux += (i % (u_range * 2 + 1) - u_range); + uy += (i / (u_range * 2 + 1) - u_range); + + range = 0; + } + break; + + /* ダンスなど */ + case BD_LULLABY: /* 子守歌 */ + case BD_RICHMANKIM: /* ニヨルドの宴 */ + case BD_ETERNALCHAOS: /* 永遠の混沌 */ + case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ + case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ + case BD_ROKISWEIL: /* ロキの叫び */ + case BD_INTOABYSS: /* 深淵の中に */ + case BD_SIEGFRIED: /* 不死身のジークフリード */ + ux += (i % 9 - 4); + uy += (i / 9 - 4); + if (i == 40) + range = 4; /* 中心の場合は範囲を4にオーバーライド */ + else + range = -1; /* 中心じゃない場合は範囲を-1にオーバーライド */ + break; + case BA_DISSONANCE: /* 不協和音 */ + case BA_WHISTLE: /* 口笛 */ + case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */ + case BA_POEMBRAGI: /* ブラギの詩 */ + case BA_APPLEIDUN: /* イドゥンの林檎 */ + case DC_UGLYDANCE: /* 自分勝手なダンス */ + case DC_HUMMING: /* ハミング */ + case DC_DONTFORGETME: /* 私を忘れないで… */ + case DC_FORTUNEKISS: /* 幸運のキス */ + case DC_SERVICEFORYOU: /* サービスフォーユー */ + ux += (i % 7 - 3); + uy += (i / 7 - 3); + if (i == 40) + range = 4; /* 中心の場合は範囲を4にオーバーライド */ + else + range = -1; /* 中心じゃない場合は範囲を-1にオーバーライド */ + break; + case PA_GOSPEL: /* ゴスペル */ + ux += (i % 7 - 3); + uy += (i / 7 - 3); + break; + case PF_FOGWALL: /* フォグウォール */ + ux += (i % 5 - 2); + uy += (i / 5 - 1); + break; + case RG_GRAFFITI: /* Graffiti [Valaris] */ + ux += (i % 5 - 2); + uy += (i / 5 - 2); + break; + } + //直上スキルの場合設置座標上にランドプロテクターがないかチェック + if (range <= 0) + map_foreachinarea (skill_landprotector, src->m, ux, uy, ux, uy, + BL_SKILL, skillid, &alive); + + if (skillid == WZ_ICEWALL && alive) + { + val2 = map_getcell (src->m, ux, uy); + if (val2 == 5 || val2 == 1) + alive = 0; + else + { + map_setcell (src->m, ux, uy, 5); + clif_changemapcell (src->m, ux, uy, 5, 0); + } + } + + if (alive) + { + nullpo_retr (NULL, unit = skill_initunit (group, i, ux, uy)); + unit->val1 = val1; + unit->val2 = val2; + unit->limit = limit; + unit->range = range; + } + } + return group; } /*========================================== * スキルユニットの発動イベント *------------------------------------------ */ -int skill_unit_onplace(struct skill_unit *src,struct block_list *bl,unsigned int tick) +int skill_unit_onplace (struct skill_unit *src, struct block_list *bl, + unsigned int tick) { - struct skill_unit_group *sg; - struct block_list *ss; - struct skill_unit_group_tickset *ts; - struct map_session_data *srcsd=NULL; - int diff,goflag,splash_count=0; - - nullpo_retr(0, src); - nullpo_retr(0, bl); - - if( bl->prev==NULL || !src->alive || (bl->type == BL_PC && pc_isdead((struct map_session_data *)bl) ) ) - return 0; - - nullpo_retr(0, sg=src->group); - nullpo_retr(0, ss=map_id2bl(sg->src_id)); - - if(ss->type == BL_PC) - nullpo_retr(0, srcsd=(struct map_session_data *)ss); - if(srcsd && srcsd->chatID) - return 0; - - if( bl->type!=BL_PC && bl->type!=BL_MOB ) - return 0; - nullpo_retr(0, ts=skill_unitgrouptickset_search( bl, sg->group_id)); - diff=DIFF_TICK(tick,ts->tick); - goflag=(diff>sg->interval || diff<0); - if (sg->skill_id == CR_GRANDCROSS && !battle_config.gx_allhit) // 重なっていたら3HITしない - goflag = (diff>sg->interval*map_count_oncell(bl->m,bl->x,bl->y) || diff<0); - - //対象がLP上に居る場合は無効 - map_foreachinarea(skill_landprotector,bl->m,bl->x,bl->y,bl->x,bl->y,BL_SKILL,0,&goflag); - - if(!goflag) - return 0; - ts->tick=tick; - ts->group_id=sg->group_id; - - switch(sg->unit_id){ - case 0x83: /* サンクチュアリ */ - { - int race=battle_get_race(bl); - int damage_flag = (battle_check_undead(race,battle_get_elem_type(bl)) || race == 6)? 1:0; - - if( battle_get_hp(bl)>=battle_get_max_hp(bl) && !damage_flag) - break; + struct skill_unit_group *sg; + struct block_list *ss; + struct skill_unit_group_tickset *ts; + struct map_session_data *srcsd = NULL; + int diff, goflag, splash_count = 0; - if((sg->val1--)<=0){ - skill_delunitgroup(sg); - return 0; - } - if(!damage_flag) { - int heal=sg->val2; - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage) - heal=0; /* 黄金蟲カード(ヒール量0) */ - clif_skill_nodamage(&src->bl,bl,AL_HEAL,heal,1); - battle_heal(NULL,bl,heal,0,0); - } - else - skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); - } - break; + nullpo_retr (0, src); + nullpo_retr (0, bl); - case 0x84: /* マグヌスエクソシズム */ - { - int race=battle_get_race(bl); - int damage_flag = (battle_check_undead(race,battle_get_elem_type(bl)) || race == 6)? 1:0; + if (bl->prev == NULL || !src->alive + || (bl->type == BL_PC && pc_isdead ((struct map_session_data *) bl))) + return 0; - if(!damage_flag) - return 0; - skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); - } - break; - - case 0x85: /* ニューマ */ - { - struct skill_unit *unit2; - struct status_change *sc_data=battle_get_sc_data(bl); - int type=SC_PNEUMA; - if(sc_data && sc_data[type].timer==-1) - skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0); - else if((unit2=(struct skill_unit *)sc_data[type].val2) && unit2 != src ){ - if(DIFF_TICK(sg->tick,unit2->group->tick)>0 ) - skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0); - ts->tick-=sg->interval; - } - } - break; - case 0x7e: /* セイフティウォール */ - { - struct skill_unit *unit2; - struct status_change *sc_data=battle_get_sc_data(bl); - int type=SC_SAFETYWALL; - if(sc_data && sc_data[type].timer==-1) - skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0); - else if((unit2=(struct skill_unit *)sc_data[type].val2) && unit2 != src ){ - if(sg->val1 < unit2->group->val1 ) - skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,0,0); - ts->tick-=sg->interval; - } - } - break; - - case 0x86: /* ロードオブヴァーミリオン(&ストームガスト &グランドクロス) */ - skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); - break; - - case 0x7f: /* ファイヤーウォール */ - if( (src->val2--)>0) - skill_attack(BF_MAGIC,ss,&src->bl,bl, - sg->skill_id,sg->skill_lv,tick,0); - if( src->val2<=0 ) - skill_delunit(src); - break; - - case 0x87: /* ファイアーピラー(発動前) */ - skill_delunit(src); - skill_unitsetting(ss,sg->skill_id,sg->skill_lv,src->bl.x,src->bl.y,1); - break; - - case 0x88: /* ファイアーピラー(発動後) */ - if(DIFF_TICK(tick,sg->tick) < 150) - skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); - break; - - case 0x90: /* スキッドトラップ */ - { - int i,c = skill_get_blewcount(sg->skill_id,sg->skill_lv); - if(map[bl->m].flag.gvg) c = 0; - for(i=0;i<c;i++) - skill_blown(&src->bl,bl,1|0x30000); - sg->unit_id = 0x8c; - clif_changelook(&src->bl,LOOK_BASE,sg->unit_id); - sg->limit=DIFF_TICK(tick,sg->tick)+1500; - } - break; - - case 0x93: /* ランドマイン */ - skill_attack(BF_MISC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); - sg->unit_id = 0x8c; - clif_changelook(&src->bl,LOOK_BASE,0x88); - sg->limit=DIFF_TICK(tick,sg->tick)+1500; - break; - - case 0x8f: /* ブラストマイン */ - case 0x94: /* ショックウェーブトラップ */ - case 0x95: /* サンドマン */ - case 0x96: /* フラッシャー */ - case 0x97: /* フリージングトラップ */ - case 0x98: /* クレイモアートラップ */ - map_foreachinarea(skill_count_target,src->bl.m - ,src->bl.x-src->range,src->bl.y-src->range - ,src->bl.x+src->range,src->bl.y+src->range - ,0,&src->bl,&splash_count); - map_foreachinarea(skill_trap_splash,src->bl.m - ,src->bl.x-src->range,src->bl.y-src->range - ,src->bl.x+src->range,src->bl.y+src->range - ,0,&src->bl,tick,splash_count); - sg->unit_id = 0x8c; - clif_changelook(&src->bl,LOOK_BASE,sg->unit_id); - sg->limit=DIFF_TICK(tick,sg->tick)+1500; - break; - - case 0x91: /* アンクルスネア */ - { - struct status_change *sc_data=battle_get_sc_data(bl); - if(sg->val2==0 && sc_data && sc_data[SC_ANKLE].timer==-1){ - int moveblock = ( bl->x/BLOCK_SIZE != src->bl.x/BLOCK_SIZE || bl->y/BLOCK_SIZE != src->bl.y/BLOCK_SIZE); - int sec=skill_get_time2(sg->skill_id,sg->skill_lv) - (double)battle_get_agi(bl)*0.1; - if(battle_get_mode(bl)&0x20) - sec = sec/5; - battle_stopwalking(bl,1); - skill_status_change_start(bl,SC_ANKLE,sg->skill_lv,0,0,0,sec,0); - - if(moveblock) map_delblock(bl); - bl->x = src->bl.x; - bl->y = src->bl.y; - if(moveblock) map_addblock(bl); - if(bl->type == BL_MOB) - clif_fixmobpos((struct mob_data *)bl); - else - clif_fixpos(bl); - clif_01ac(&src->bl); - sg->limit=DIFF_TICK(tick,sg->tick) + sec; - sg->val2=bl->id; - } - } - break; - - case 0x80: /* ワープポータル(発動後) */ - if(bl->type==BL_PC){ - struct map_session_data *sd = (struct map_session_data *)bl; - if(sd && src->bl.m == bl->m && src->bl.x == bl->x && src->bl.y == bl->y && src->bl.x == sd->to_x && src->bl.y == sd->to_y) { - if( battle_config.chat_warpportal || !sd->chatID ){ - if((sg->val1--)>0){ - pc_setpos(sd,sg->valstr,sg->val2>>16,sg->val2&0xffff,3); - if(sg->src_id == bl->id ||( strcmp(map[src->bl.m].name,sg->valstr) == 0 && src->bl.x == (sg->val2>>16) && src->bl.y == (sg->val2&0xffff) )) - skill_delunitgroup(sg); - }else - skill_delunitgroup(sg); - } - } - }else if(bl->type==BL_MOB && battle_config.mob_warpportal){ - int m=map_mapname2mapid(sg->valstr); - struct mob_data *md; - md=(struct mob_data *)bl; - mob_warp((struct mob_data *)bl,m,sg->val2>>16,sg->val2&0xffff,3); - } - break; + nullpo_retr (0, sg = src->group); + nullpo_retr (0, ss = map_id2bl (sg->src_id)); - case 0x8e: /* クァグマイア */ - { - int type=SkillStatusChangeTable[sg->skill_id]; - if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage ) - break; - if( battle_get_sc_data(bl)[type].timer==-1 ) - skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0); - } - break; - case 0x92: /* ベノムダスト */ - { - struct status_change *sc_data=battle_get_sc_data(bl); - int type=SkillStatusChangeTable[sg->skill_id]; - if( sc_data && sc_data[type].timer==-1 ) - skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0); - } - break; - case 0x9a: /* ボルケーノ */ - case 0x9b: /* デリュージ */ - case 0x9c: /* バイオレントゲイル */ - { - struct skill_unit *unit2; - struct status_change *sc_data=battle_get_sc_data(bl); - int type=SkillStatusChangeTable[sg->skill_id]; - if(sc_data && sc_data[type].timer==-1) - skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0); - else if((unit2=(struct skill_unit *)sc_data[type].val2) && unit2 != src ){ - if( DIFF_TICK(sg->tick,unit2->group->tick)>0 ) - skill_status_change_start(bl,type,sg->skill_lv,(int)src,0,0,skill_get_time2(sg->skill_id,sg->skill_lv),0); - ts->tick-=sg->interval; - } - } break; - - case 0x9e: /* 子守唄 */ - case 0x9f: /* ニヨルドの宴 */ - case 0xa0: /* 永遠の混沌 */ - case 0xa1: /* 戦太鼓の響き */ - case 0xa2: /* ニーベルングの指輪 */ - case 0xa3: /* ロキの叫び */ - case 0xa4: /* 深淵の中に */ - case 0xa5: /* 不死身のジークフリード */ - case 0xa6: /* 不協和音 */ - case 0xa7: /* 口笛 */ - case 0xa8: /* 夕陽のアサシンクロス */ - case 0xa9: /* ブラギの詩 */ - case 0xab: /* 自分勝手なダンス */ - case 0xac: /* ハミング */ - case 0xad: /* 私を忘れないで… */ - case 0xae: /* 幸運のキス */ - case 0xaf: /* サービスフォーユー */ - case 0xb4: - { - struct skill_unit *unit2; - struct status_change *sc_data=battle_get_sc_data(bl); - int type=SkillStatusChangeTable[sg->skill_id]; - if(sg->src_id == bl->id) - break; - if(sc_data && sc_data[type].timer==-1) - skill_status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2, - (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); - else if( (unit2=(struct skill_unit *)sc_data[type].val4) && unit2 != src ){ - if( unit2->group && DIFF_TICK(sg->tick,unit2->group->tick)>0 ) - skill_status_change_start(bl,type,sg->skill_lv,sg->val1,sg->val2, - (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); - ts->tick-=sg->interval; - } - } break; - - case 0xaa: /* イドゥンの林檎 */ - { - struct skill_unit *unit2; - struct status_change *sc_data=battle_get_sc_data(bl); - int type=SkillStatusChangeTable[sg->skill_id]; - if(sg->src_id == bl->id) - break; - if( sc_data && sc_data[type].timer==-1) - skill_status_change_start(bl,type,sg->skill_lv,(sg->val1)>>16,(sg->val1)&0xffff, - (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); - else if((unit2=(struct skill_unit *)sc_data[type].val4) && unit2 != src ){ - if( DIFF_TICK(sg->tick,unit2->group->tick)>0 ) - skill_status_change_start(bl,type,sg->skill_lv,(sg->val1)>>16,(sg->val1)&0xffff, - (int)src,skill_get_time2(sg->skill_id,sg->skill_lv),0); - ts->tick-=sg->interval; - } - } break; - - case 0xb1: /* デモンストレーション */ - skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0); - if(bl->type == BL_PC && MRAND(100) < sg->skill_lv && battle_config.equipment_breaking) - pc_breakweapon((struct map_session_data *)bl); - break; - case 0x99: /* トーキーボックス */ - if(sg->src_id == bl->id) //自分が踏んでも発動しない - break; - if(sg->val2==0){ - clif_talkiebox(&src->bl,sg->valstr); - sg->unit_id = 0x8c; - clif_changelook(&src->bl,LOOK_BASE,sg->unit_id); - sg->limit=DIFF_TICK(tick,sg->tick)+5000; - sg->val2=-1; //踏んだ - } - break; - case 0xb2: /* あなたを_会いたいです */ - case 0xb3: /* ゴスペル */ - case 0xb6: /* フォグウォール */ - //とりあえず何もしない - break; + if (ss->type == BL_PC) + nullpo_retr (0, srcsd = (struct map_session_data *) ss); + if (srcsd && srcsd->chatID) + return 0; + if (bl->type != BL_PC && bl->type != BL_MOB) + return 0; + nullpo_retr (0, ts = skill_unitgrouptickset_search (bl, sg->group_id)); + diff = DIFF_TICK (tick, ts->tick); + goflag = (diff > sg->interval || diff < 0); + if (sg->skill_id == CR_GRANDCROSS && !battle_config.gx_allhit) // 重なっていたら3HITしない + goflag = (diff > sg->interval * map_count_oncell (bl->m, bl->x, bl->y) + || diff < 0); + + //対象がLP上に居る場合は無効 + map_foreachinarea (skill_landprotector, bl->m, bl->x, bl->y, bl->x, bl->y, + BL_SKILL, 0, &goflag); + + if (!goflag) + return 0; + ts->tick = tick; + ts->group_id = sg->group_id; + + switch (sg->unit_id) + { + case 0x83: /* サンクチュアリ */ + { + int race = battle_get_race (bl); + int damage_flag = + (battle_check_undead (race, battle_get_elem_type (bl)) + || race == 6) ? 1 : 0; + + if (battle_get_hp (bl) >= battle_get_max_hp (bl) && !damage_flag) + break; + + if ((sg->val1--) <= 0) + { + skill_delunitgroup (sg); + return 0; + } + if (!damage_flag) + { + int heal = sg->val2; + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + heal = 0; /* 黄金蟲カード(ヒール量0) */ + clif_skill_nodamage (&src->bl, bl, AL_HEAL, heal, 1); + battle_heal (NULL, bl, heal, 0, 0); + } + else + skill_attack (BF_MAGIC, ss, &src->bl, bl, sg->skill_id, + sg->skill_lv, tick, 0); + } + break; + case 0x84: /* マグヌスエクソシズム */ + { + int race = battle_get_race (bl); + int damage_flag = + (battle_check_undead (race, battle_get_elem_type (bl)) + || race == 6) ? 1 : 0; + if (!damage_flag) + return 0; + skill_attack (BF_MAGIC, ss, &src->bl, bl, sg->skill_id, + sg->skill_lv, tick, 0); + } + break; + case 0x85: /* ニューマ */ + { + struct skill_unit *unit2; + struct status_change *sc_data = battle_get_sc_data (bl); + int type = SC_PNEUMA; + if (sc_data && sc_data[type].timer == -1) + skill_status_change_start (bl, type, sg->skill_lv, (int) src, + 0, 0, 0, 0); + else if ((unit2 = (struct skill_unit *) sc_data[type].val2) + && unit2 != src) + { + if (DIFF_TICK (sg->tick, unit2->group->tick) > 0) + skill_status_change_start (bl, type, sg->skill_lv, + (int) src, 0, 0, 0, 0); + ts->tick -= sg->interval; + } + } + break; + case 0x7e: /* セイフティウォール */ + { + struct skill_unit *unit2; + struct status_change *sc_data = battle_get_sc_data (bl); + int type = SC_SAFETYWALL; + if (sc_data && sc_data[type].timer == -1) + skill_status_change_start (bl, type, sg->skill_lv, (int) src, + 0, 0, 0, 0); + else if ((unit2 = (struct skill_unit *) sc_data[type].val2) + && unit2 != src) + { + if (sg->val1 < unit2->group->val1) + skill_status_change_start (bl, type, sg->skill_lv, + (int) src, 0, 0, 0, 0); + ts->tick -= sg->interval; + } + } + break; + case 0x86: /* ロードオブヴァーミリオン(&ストームガスト &グランドクロス) */ + skill_attack (BF_MAGIC, ss, &src->bl, bl, sg->skill_id, + sg->skill_lv, tick, 0); + break; - case 0xb7: /* スパイダーウェッブ */ - if(sg->val2==0){ - int moveblock = ( bl->x/BLOCK_SIZE != src->bl.x/BLOCK_SIZE || bl->y/BLOCK_SIZE != src->bl.y/BLOCK_SIZE); - skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick); - if(moveblock) map_delblock(bl); - bl->x = (&src->bl)->x; - bl->y = (&src->bl)->y; - if(moveblock) map_addblock(bl); - if(bl->type == BL_MOB) - clif_fixmobpos((struct mob_data *)bl); - else - clif_fixpos(bl); - clif_01ac(&src->bl); - sg->limit=DIFF_TICK(tick,sg->tick) + skill_get_time2(sg->skill_id,sg->skill_lv); - sg->val2=bl->id; - } - break; + case 0x7f: /* ファイヤーウォール */ + if ((src->val2--) > 0) + skill_attack (BF_MAGIC, ss, &src->bl, bl, + sg->skill_id, sg->skill_lv, tick, 0); + if (src->val2 <= 0) + skill_delunit (src); + break; + + case 0x87: /* ファイアーピラー(発動前) */ + skill_delunit (src); + skill_unitsetting (ss, sg->skill_id, sg->skill_lv, src->bl.x, + src->bl.y, 1); + break; + + case 0x88: /* ファイアーピラー(発動後) */ + if (DIFF_TICK (tick, sg->tick) < 150) + skill_attack (BF_MAGIC, ss, &src->bl, bl, sg->skill_id, + sg->skill_lv, tick, 0); + break; + + case 0x90: /* スキッドトラップ */ + { + int i, c = skill_get_blewcount (sg->skill_id, sg->skill_lv); + if (map[bl->m].flag.gvg) + c = 0; + for (i = 0; i < c; i++) + skill_blown (&src->bl, bl, 1 | 0x30000); + sg->unit_id = 0x8c; + clif_changelook (&src->bl, LOOK_BASE, sg->unit_id); + sg->limit = DIFF_TICK (tick, sg->tick) + 1500; + } + break; + + case 0x93: /* ランドマイン */ + skill_attack (BF_MISC, ss, &src->bl, bl, sg->skill_id, + sg->skill_lv, tick, 0); + sg->unit_id = 0x8c; + clif_changelook (&src->bl, LOOK_BASE, 0x88); + sg->limit = DIFF_TICK (tick, sg->tick) + 1500; + break; + + case 0x8f: /* ブラストマイン */ + case 0x94: /* ショックウェーブトラップ */ + case 0x95: /* サンドマン */ + case 0x96: /* フラッシャー */ + case 0x97: /* フリージングトラップ */ + case 0x98: /* クレイモアートラップ */ + map_foreachinarea (skill_count_target, src->bl.m, + src->bl.x - src->range, src->bl.y - src->range, + src->bl.x + src->range, src->bl.y + src->range, + 0, &src->bl, &splash_count); + map_foreachinarea (skill_trap_splash, src->bl.m, + src->bl.x - src->range, src->bl.y - src->range, + src->bl.x + src->range, src->bl.y + src->range, + 0, &src->bl, tick, splash_count); + sg->unit_id = 0x8c; + clif_changelook (&src->bl, LOOK_BASE, sg->unit_id); + sg->limit = DIFF_TICK (tick, sg->tick) + 1500; + break; + + case 0x91: /* アンクルスネア */ + { + struct status_change *sc_data = battle_get_sc_data (bl); + if (sg->val2 == 0 && sc_data && sc_data[SC_ANKLE].timer == -1) + { + int moveblock = (bl->x / BLOCK_SIZE != src->bl.x / BLOCK_SIZE + || bl->y / BLOCK_SIZE != + src->bl.y / BLOCK_SIZE); + int sec = skill_get_time2 (sg->skill_id, + sg->skill_lv) - + (double) battle_get_agi (bl) * 0.1; + if (battle_get_mode (bl) & 0x20) + sec = sec / 5; + battle_stopwalking (bl, 1); + skill_status_change_start (bl, SC_ANKLE, sg->skill_lv, 0, 0, + 0, sec, 0); + + if (moveblock) + map_delblock (bl); + bl->x = src->bl.x; + bl->y = src->bl.y; + if (moveblock) + map_addblock (bl); + if (bl->type == BL_MOB) + clif_fixmobpos ((struct mob_data *) bl); + else + clif_fixpos (bl); + clif_01ac (&src->bl); + sg->limit = DIFF_TICK (tick, sg->tick) + sec; + sg->val2 = bl->id; + } + } + break; + + case 0x80: /* ワープポータル(発動後) */ + if (bl->type == BL_PC) + { + struct map_session_data *sd = (struct map_session_data *) bl; + if (sd && src->bl.m == bl->m && src->bl.x == bl->x + && src->bl.y == bl->y && src->bl.x == sd->to_x + && src->bl.y == sd->to_y) + { + if (battle_config.chat_warpportal || !sd->chatID) + { + if ((sg->val1--) > 0) + { + pc_setpos (sd, sg->valstr, sg->val2 >> 16, + sg->val2 & 0xffff, 3); + if (sg->src_id == bl->id + || (strcmp (map[src->bl.m].name, sg->valstr) + == 0 && src->bl.x == (sg->val2 >> 16) + && src->bl.y == (sg->val2 & 0xffff))) + skill_delunitgroup (sg); + } + else + skill_delunitgroup (sg); + } + } + } + else if (bl->type == BL_MOB && battle_config.mob_warpportal) + { + int m = map_mapname2mapid (sg->valstr); + struct mob_data *md; + md = (struct mob_data *) bl; + mob_warp ((struct mob_data *) bl, m, sg->val2 >> 16, + sg->val2 & 0xffff, 3); + } + break; + + case 0x8e: /* クァグマイア */ + { + int type = SkillStatusChangeTable[sg->skill_id]; + if (bl->type == BL_PC + && ((struct map_session_data *) bl)-> + special_state.no_magic_damage) + break; + if (battle_get_sc_data (bl)[type].timer == -1) + skill_status_change_start (bl, type, sg->skill_lv, (int) src, + 0, 0, + skill_get_time2 (sg->skill_id, + sg->skill_lv), 0); + } + break; + case 0x92: /* ベノムダスト */ + { + struct status_change *sc_data = battle_get_sc_data (bl); + int type = SkillStatusChangeTable[sg->skill_id]; + if (sc_data && sc_data[type].timer == -1) + skill_status_change_start (bl, type, sg->skill_lv, (int) src, + 0, 0, + skill_get_time2 (sg->skill_id, + sg->skill_lv), 0); + } + break; + case 0x9a: /* ボルケーノ */ + case 0x9b: /* デリュージ */ + case 0x9c: /* バイオレントゲイル */ + { + struct skill_unit *unit2; + struct status_change *sc_data = battle_get_sc_data (bl); + int type = SkillStatusChangeTable[sg->skill_id]; + if (sc_data && sc_data[type].timer == -1) + skill_status_change_start (bl, type, sg->skill_lv, (int) src, + 0, 0, + skill_get_time2 (sg->skill_id, + sg->skill_lv), 0); + else if ((unit2 = (struct skill_unit *) sc_data[type].val2) + && unit2 != src) + { + if (DIFF_TICK (sg->tick, unit2->group->tick) > 0) + skill_status_change_start (bl, type, sg->skill_lv, + (int) src, 0, 0, + skill_get_time2 (sg->skill_id, + sg->skill_lv), + 0); + ts->tick -= sg->interval; + } + } break; + + case 0x9e: /* 子守唄 */ + case 0x9f: /* ニヨルドの宴 */ + case 0xa0: /* 永遠の混沌 */ + case 0xa1: /* 戦太鼓の響き */ + case 0xa2: /* ニーベルングの指輪 */ + case 0xa3: /* ロキの叫び */ + case 0xa4: /* 深淵の中に */ + case 0xa5: /* 不死身のジークフリード */ + case 0xa6: /* 不協和音 */ + case 0xa7: /* 口笛 */ + case 0xa8: /* 夕陽のアサシンクロス */ + case 0xa9: /* ブラギの詩 */ + case 0xab: /* 自分勝手なダンス */ + case 0xac: /* ハミング */ + case 0xad: /* 私を忘れないで… */ + case 0xae: /* 幸運のキス */ + case 0xaf: /* サービスフォーユー */ + case 0xb4: + { + struct skill_unit *unit2; + struct status_change *sc_data = battle_get_sc_data (bl); + int type = SkillStatusChangeTable[sg->skill_id]; + if (sg->src_id == bl->id) + break; + if (sc_data && sc_data[type].timer == -1) + skill_status_change_start (bl, type, sg->skill_lv, sg->val1, + sg->val2, (int) src, + skill_get_time2 (sg->skill_id, + sg->skill_lv), 0); + else if ((unit2 = (struct skill_unit *) sc_data[type].val4) + && unit2 != src) + { + if (unit2->group + && DIFF_TICK (sg->tick, unit2->group->tick) > 0) + skill_status_change_start (bl, type, sg->skill_lv, + sg->val1, sg->val2, (int) src, + skill_get_time2 (sg->skill_id, + sg->skill_lv), + 0); + ts->tick -= sg->interval; + } + } break; + + case 0xaa: /* イドゥンの林檎 */ + { + struct skill_unit *unit2; + struct status_change *sc_data = battle_get_sc_data (bl); + int type = SkillStatusChangeTable[sg->skill_id]; + if (sg->src_id == bl->id) + break; + if (sc_data && sc_data[type].timer == -1) + skill_status_change_start (bl, type, sg->skill_lv, + (sg->val1) >> 16, + (sg->val1) & 0xffff, (int) src, + skill_get_time2 (sg->skill_id, + sg->skill_lv), 0); + else if ((unit2 = (struct skill_unit *) sc_data[type].val4) + && unit2 != src) + { + if (DIFF_TICK (sg->tick, unit2->group->tick) > 0) + skill_status_change_start (bl, type, sg->skill_lv, + (sg->val1) >> 16, + (sg->val1) & 0xffff, (int) src, + skill_get_time2 (sg->skill_id, + sg->skill_lv), + 0); + ts->tick -= sg->interval; + } + } break; + + case 0xb1: /* デモンストレーション */ + skill_attack (BF_WEAPON, ss, &src->bl, bl, sg->skill_id, + sg->skill_lv, tick, 0); + if (bl->type == BL_PC && MRAND (100) < sg->skill_lv + && battle_config.equipment_breaking) + pc_breakweapon ((struct map_session_data *) bl); + break; + case 0x99: /* トーキーボックス */ + if (sg->src_id == bl->id) //自分が踏んでも発動しない + break; + if (sg->val2 == 0) + { + clif_talkiebox (&src->bl, sg->valstr); + sg->unit_id = 0x8c; + clif_changelook (&src->bl, LOOK_BASE, sg->unit_id); + sg->limit = DIFF_TICK (tick, sg->tick) + 5000; + sg->val2 = -1; //踏んだ + } + break; + case 0xb2: /* あなたを_会いたいです */ + case 0xb3: /* ゴスペル */ + case 0xb6: /* フォグウォール */ + //とりあえず何もしない + break; + + case 0xb7: /* スパイダーウェッブ */ + if (sg->val2 == 0) + { + int moveblock = (bl->x / BLOCK_SIZE != src->bl.x / BLOCK_SIZE + || bl->y / BLOCK_SIZE != + src->bl.y / BLOCK_SIZE); + skill_additional_effect (ss, bl, sg->skill_id, sg->skill_lv, + BF_MISC, tick); + if (moveblock) + map_delblock (bl); + bl->x = (&src->bl)->x; + bl->y = (&src->bl)->y; + if (moveblock) + map_addblock (bl); + if (bl->type == BL_MOB) + clif_fixmobpos ((struct mob_data *) bl); + else + clif_fixpos (bl); + clif_01ac (&src->bl); + sg->limit = + DIFF_TICK (tick, + sg->tick) + skill_get_time2 (sg->skill_id, + sg->skill_lv); + sg->val2 = bl->id; + } + break; /* default: if(battle_config.error_log) printf("skill_unit_onplace: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id); break;*/ - } - if(bl->type==BL_MOB && ss!=bl) /* スキル使用条件のMOBスキル */ - { - if(battle_config.mob_changetarget_byskill == 1) - { - int target=((struct mob_data *)bl)->target_id; - if(ss->type == BL_PC) - ((struct mob_data *)bl)->target_id=ss->id; - mobskill_use((struct mob_data *)bl,tick,MSC_SKILLUSED|(sg->skill_id<<16)); - ((struct mob_data *)bl)->target_id=target; - } - else - mobskill_use((struct mob_data *)bl,tick,MSC_SKILLUSED|(sg->skill_id<<16)); - } + } + if (bl->type == BL_MOB && ss != bl) /* スキル使用条件のMOBスキル */ + { + if (battle_config.mob_changetarget_byskill == 1) + { + int target = ((struct mob_data *) bl)->target_id; + if (ss->type == BL_PC) + ((struct mob_data *) bl)->target_id = ss->id; + mobskill_use ((struct mob_data *) bl, tick, + MSC_SKILLUSED | (sg->skill_id << 16)); + ((struct mob_data *) bl)->target_id = target; + } + else + mobskill_use ((struct mob_data *) bl, tick, + MSC_SKILLUSED | (sg->skill_id << 16)); + } - return 0; + return 0; } + /*========================================== * スキルユニットから離脱する(もしくはしている)場合 *------------------------------------------ */ -int skill_unit_onout(struct skill_unit *src,struct block_list *bl,unsigned int tick) +int skill_unit_onout (struct skill_unit *src, struct block_list *bl, + unsigned int tick) { - struct skill_unit_group *sg; - - nullpo_retr(0, src); - nullpo_retr(0, bl); - nullpo_retr(0, sg=src->group); - - if( bl->prev==NULL || !src->alive ) - return 0; - - if( bl->type!=BL_PC && bl->type!=BL_MOB ) - return 0; - - switch(sg->unit_id){ - case 0x7e: /* セイフティウォール */ - case 0x85: /* ニューマ */ - case 0x8e: /* クァグマイア */ - { - struct status_change *sc_data=battle_get_sc_data(bl); - int type= - (sg->unit_id==0x85)?SC_PNEUMA: - ((sg->unit_id==0x7e)?SC_SAFETYWALL: - SC_QUAGMIRE); - if((type != SC_QUAGMIRE || bl->type != BL_MOB) && - sc_data && sc_data[type].timer!=-1 && ((struct skill_unit *)sc_data[type].val2)==src){ - skill_status_change_end(bl,type,-1); - } - } break; - - case 0x91: /* アンクルスネア */ - { - struct block_list *target=map_id2bl(sg->val2); - if( target && target==bl ){ - skill_status_change_end(bl,SC_ANKLE,-1); - sg->limit=DIFF_TICK(tick,sg->tick)+1000; - } - } - break; - case 0xb5: - case 0xb8: - { - struct block_list *target=map_id2bl(sg->val2); - if( target==bl ) - skill_status_change_end(bl,SC_SPIDERWEB,-1); - sg->limit=DIFF_TICK(tick,sg->tick)+1000; - } - break; - case 0xb6: - { - struct block_list *target=map_id2bl(sg->val2); - if( target==bl ) - skill_status_change_end(bl,SC_FOGWALL,-1); - sg->limit=DIFF_TICK(tick,sg->tick)+1000; - } - break; - case 0x9a: /* ボルケーノ */ - case 0x9b: /* デリュージ */ - case 0x9c: /* バイオレントゲイル */ - { - struct status_change *sc_data=battle_get_sc_data(bl); - struct skill_unit *su; - int type=SkillStatusChangeTable[sg->skill_id]; - if( sc_data && sc_data[type].timer!=-1 && (su=((struct skill_unit *)sc_data[type].val2)) && su == src ){ - skill_status_change_end(bl,type,-1); - } - } - break; - - case 0x9e: /* 子守唄 */ - case 0x9f: /* ニヨルドの宴 */ - case 0xa0: /* 永遠の混沌 */ - case 0xa1: /* 戦太鼓の響き */ - case 0xa2: /* ニーベルングの指輪 */ - case 0xa3: /* ロキの叫び */ - case 0xa4: /* 深淵の中に */ - case 0xa5: /* 不死身のジークフリード */ - case 0xa6: /* 不協和音 */ - case 0xa7: /* 口笛 */ - case 0xa8: /* 夕陽のアサシンクロス */ - case 0xa9: /* ブラギの詩 */ - case 0xaa: /* イドゥンの林檎 */ - case 0xab: /* 自分勝手なダンス */ - case 0xac: /* ハミング */ - case 0xad: /* 私を忘れないで… */ - case 0xae: /* 幸運のキス */ - case 0xaf: /* サービスフォーユー */ - case 0xb4: - { - struct status_change *sc_data=battle_get_sc_data(bl); - struct skill_unit *su; - int type=SkillStatusChangeTable[sg->skill_id]; - if( sc_data && sc_data[type].timer!=-1 && (su=((struct skill_unit *)sc_data[type].val4)) && su == src ){ - skill_status_change_end(bl,type,-1); - } - } - break; - case 0xb7: /* スパイダーウェッブ */ - { - struct block_list *target=map_id2bl(sg->val2); - if( target && target==bl ) - skill_status_change_end(bl,SC_SPIDERWEB,-1); - sg->limit=DIFF_TICK(tick,sg->tick)+1000; - } - break; + struct skill_unit_group *sg; + + nullpo_retr (0, src); + nullpo_retr (0, bl); + nullpo_retr (0, sg = src->group); + + if (bl->prev == NULL || !src->alive) + return 0; + + if (bl->type != BL_PC && bl->type != BL_MOB) + return 0; + + switch (sg->unit_id) + { + case 0x7e: /* セイフティウォール */ + case 0x85: /* ニューマ */ + case 0x8e: /* クァグマイア */ + { + struct status_change *sc_data = battle_get_sc_data (bl); + int type = + (sg->unit_id == 0x85) ? SC_PNEUMA : + ((sg->unit_id == 0x7e) ? SC_SAFETYWALL : SC_QUAGMIRE); + if ((type != SC_QUAGMIRE || bl->type != BL_MOB) && + sc_data && sc_data[type].timer != -1 + && ((struct skill_unit *) sc_data[type].val2) == src) + { + skill_status_change_end (bl, type, -1); + } + } break; + + case 0x91: /* アンクルスネア */ + { + struct block_list *target = map_id2bl (sg->val2); + if (target && target == bl) + { + skill_status_change_end (bl, SC_ANKLE, -1); + sg->limit = DIFF_TICK (tick, sg->tick) + 1000; + } + } + break; + case 0xb5: + case 0xb8: + { + struct block_list *target = map_id2bl (sg->val2); + if (target == bl) + skill_status_change_end (bl, SC_SPIDERWEB, -1); + sg->limit = DIFF_TICK (tick, sg->tick) + 1000; + } + break; + case 0xb6: + { + struct block_list *target = map_id2bl (sg->val2); + if (target == bl) + skill_status_change_end (bl, SC_FOGWALL, -1); + sg->limit = DIFF_TICK (tick, sg->tick) + 1000; + } + break; + case 0x9a: /* ボルケーノ */ + case 0x9b: /* デリュージ */ + case 0x9c: /* バイオレントゲイル */ + { + struct status_change *sc_data = battle_get_sc_data (bl); + struct skill_unit *su; + int type = SkillStatusChangeTable[sg->skill_id]; + if (sc_data && sc_data[type].timer != -1 + && (su = ((struct skill_unit *) sc_data[type].val2)) + && su == src) + { + skill_status_change_end (bl, type, -1); + } + } + break; + + case 0x9e: /* 子守唄 */ + case 0x9f: /* ニヨルドの宴 */ + case 0xa0: /* 永遠の混沌 */ + case 0xa1: /* 戦太鼓の響き */ + case 0xa2: /* ニーベルングの指輪 */ + case 0xa3: /* ロキの叫び */ + case 0xa4: /* 深淵の中に */ + case 0xa5: /* 不死身のジークフリード */ + case 0xa6: /* 不協和音 */ + case 0xa7: /* 口笛 */ + case 0xa8: /* 夕陽のアサシンクロス */ + case 0xa9: /* ブラギの詩 */ + case 0xaa: /* イドゥンの林檎 */ + case 0xab: /* 自分勝手なダンス */ + case 0xac: /* ハミング */ + case 0xad: /* 私を忘れないで… */ + case 0xae: /* 幸運のキス */ + case 0xaf: /* サービスフォーユー */ + case 0xb4: + { + struct status_change *sc_data = battle_get_sc_data (bl); + struct skill_unit *su; + int type = SkillStatusChangeTable[sg->skill_id]; + if (sc_data && sc_data[type].timer != -1 + && (su = ((struct skill_unit *) sc_data[type].val4)) + && su == src) + { + skill_status_change_end (bl, type, -1); + } + } + break; + case 0xb7: /* スパイダーウェッブ */ + { + struct block_list *target = map_id2bl (sg->val2); + if (target && target == bl) + skill_status_change_end (bl, SC_SPIDERWEB, -1); + sg->limit = DIFF_TICK (tick, sg->tick) + 1000; + } + break; /* default: if(battle_config.error_log) printf("skill_unit_onout: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id); break;*/ - } - skill_unitgrouptickset_delete(bl,sg->group_id); - return 0; + } + skill_unitgrouptickset_delete (bl, sg->group_id); + return 0; } + /*========================================== * スキルユニットの削除イベント *------------------------------------------ */ -int skill_unit_ondelete(struct skill_unit *src,struct block_list *bl,unsigned int tick) +int skill_unit_ondelete (struct skill_unit *src, struct block_list *bl, + unsigned int tick) { - struct skill_unit_group *sg; - - nullpo_retr(0, src); - nullpo_retr(0, bl); - nullpo_retr(0, sg = src->group); - - if( bl->prev==NULL || !src->alive ) - return 0; - - if( bl->type!=BL_PC && bl->type!=BL_MOB ) - return 0; - - switch(sg->unit_id){ - case 0x85: /* ニューマ */ - case 0x7e: /* セイフティウォール */ - case 0x8e: /* クァグマイヤ */ - case 0x9a: /* ボルケーノ */ - case 0x9b: /* デリュージ */ - case 0x9c: /* バイオレントゲイル */ - case 0x9e: /* 子守唄 */ - case 0x9f: /* ニヨルドの宴 */ - case 0xa0: /* 永遠の混沌 */ - case 0xa1: /* 戦太鼓の響き */ - case 0xa2: /* ニーベルングの指輪 */ - case 0xa3: /* ロキの叫び */ - case 0xa4: /* 深淵の中に */ - case 0xa5: /* 不死身のジークフリード */ - case 0xa6: /* 不協和音 */ - case 0xa7: /* 口笛 */ - case 0xa8: /* 夕陽のアサシンクロス */ - case 0xa9: /* ブラギの詩 */ - case 0xaa: /* イドゥンの林檎 */ - case 0xab: /* 自分勝手なダンス */ - case 0xac: /* ハミング */ - case 0xad: /* 私を忘れないで… */ - case 0xae: /* 幸運のキス */ - case 0xaf: /* サービスフォーユー */ - case 0xb4: - return skill_unit_onout(src,bl,tick); + struct skill_unit_group *sg; + + nullpo_retr (0, src); + nullpo_retr (0, bl); + nullpo_retr (0, sg = src->group); + + if (bl->prev == NULL || !src->alive) + return 0; + + if (bl->type != BL_PC && bl->type != BL_MOB) + return 0; + + switch (sg->unit_id) + { + case 0x85: /* ニューマ */ + case 0x7e: /* セイフティウォール */ + case 0x8e: /* クァグマイヤ */ + case 0x9a: /* ボルケーノ */ + case 0x9b: /* デリュージ */ + case 0x9c: /* バイオレントゲイル */ + case 0x9e: /* 子守唄 */ + case 0x9f: /* ニヨルドの宴 */ + case 0xa0: /* 永遠の混沌 */ + case 0xa1: /* 戦太鼓の響き */ + case 0xa2: /* ニーベルングの指輪 */ + case 0xa3: /* ロキの叫び */ + case 0xa4: /* 深淵の中に */ + case 0xa5: /* 不死身のジークフリード */ + case 0xa6: /* 不協和音 */ + case 0xa7: /* 口笛 */ + case 0xa8: /* 夕陽のアサシンクロス */ + case 0xa9: /* ブラギの詩 */ + case 0xaa: /* イドゥンの林檎 */ + case 0xab: /* 自分勝手なダンス */ + case 0xac: /* ハミング */ + case 0xad: /* 私を忘れないで… */ + case 0xae: /* 幸運のキス */ + case 0xaf: /* サービスフォーユー */ + case 0xb4: + return skill_unit_onout (src, bl, tick); /* default: if(battle_config.error_log) printf("skill_unit_ondelete: Unknown skill unit id=%d block=%d\n",sg->unit_id,bl->id); break;*/ - } - skill_unitgrouptickset_delete(bl,sg->group_id); - return 0; + } + skill_unitgrouptickset_delete (bl, sg->group_id); + return 0; } + /*========================================== * スキルユニットの限界イベント *------------------------------------------ */ -int skill_unit_onlimit(struct skill_unit *src,unsigned int tick) +int skill_unit_onlimit (struct skill_unit *src, unsigned int tick) { - struct skill_unit_group *sg; - - nullpo_retr(0, src); - nullpo_retr(0, sg=src->group); - - switch(sg->unit_id){ - case 0x81: /* ワープポータル(発動前) */ - { - struct skill_unit_group *group= - skill_unitsetting(map_id2bl(sg->src_id),sg->skill_id,sg->skill_lv, - src->bl.x,src->bl.y,1); - if(group == NULL) - return 0; - group->valstr=calloc(24, 1); - if(group->valstr==NULL){ - printf("skill_unit_onlimit: out of memory !\n"); - exit(1); - } - memcpy(group->valstr,sg->valstr,24); - group->val2=sg->val2; - } - break; - - case 0x8d: /* アイスウォール */ - map_setcell(src->bl.m,src->bl.x,src->bl.y,src->val2); - clif_changemapcell(src->bl.m,src->bl.x,src->bl.y,src->val2,1); - break; - case 0xb2: /* あなたに会いたい */ - { - struct map_session_data *sd = NULL; - struct map_session_data *p_sd = NULL; - if((sd = (struct map_session_data *)(map_id2bl(sg->src_id))) == NULL) - return 0; - if((p_sd = pc_get_partner(sd)) == NULL) - return 0; - - pc_setpos(p_sd,map[src->bl.m].name,src->bl.x,src->bl.y,3); - } - break; - } - return 0; + struct skill_unit_group *sg; + + nullpo_retr (0, src); + nullpo_retr (0, sg = src->group); + + switch (sg->unit_id) + { + case 0x81: /* ワープポータル(発動前) */ + { + struct skill_unit_group *group = + skill_unitsetting (map_id2bl (sg->src_id), sg->skill_id, + sg->skill_lv, + src->bl.x, src->bl.y, 1); + if (group == NULL) + return 0; + group->valstr = calloc (24, 1); + if (group->valstr == NULL) + { + printf ("skill_unit_onlimit: out of memory !\n"); + exit (1); + } + memcpy (group->valstr, sg->valstr, 24); + group->val2 = sg->val2; + } + break; + + case 0x8d: /* アイスウォール */ + map_setcell (src->bl.m, src->bl.x, src->bl.y, src->val2); + clif_changemapcell (src->bl.m, src->bl.x, src->bl.y, src->val2, + 1); + break; + case 0xb2: /* あなたに会いたい */ + { + struct map_session_data *sd = NULL; + struct map_session_data *p_sd = NULL; + if ((sd = + (struct map_session_data *) (map_id2bl (sg->src_id))) == + NULL) + return 0; + if ((p_sd = pc_get_partner (sd)) == NULL) + return 0; + + pc_setpos (p_sd, map[src->bl.m].name, src->bl.x, src->bl.y, 3); + } + break; + } + return 0; } + /*========================================== * スキルユニットのダメージイベント *------------------------------------------ */ -int skill_unit_ondamaged(struct skill_unit *src,struct block_list *bl, - int damage,unsigned int tick) +int skill_unit_ondamaged (struct skill_unit *src, struct block_list *bl, + int damage, unsigned int tick) { - struct skill_unit_group *sg; - - nullpo_retr(0, src); - nullpo_retr(0, sg=src->group); - - switch(sg->unit_id){ - case 0x8d: /* アイスウォール */ - src->val1-=damage; - break; - case 0x8f: /* ブラストマイン */ - case 0x98: /* クレイモアートラップ */ - skill_blown(bl,&src->bl,2); //吹き飛ばしてみる - break; - default: - damage = 0; - break; - } - return damage; -} + struct skill_unit_group *sg; + nullpo_retr (0, src); + nullpo_retr (0, sg = src->group); + + switch (sg->unit_id) + { + case 0x8d: /* アイスウォール */ + src->val1 -= damage; + break; + case 0x8f: /* ブラストマイン */ + case 0x98: /* クレイモアートラップ */ + skill_blown (bl, &src->bl, 2); //吹き飛ばしてみる + break; + default: + damage = 0; + break; + } + return damage; +} /*---------------------------------------------------------------------------- */ @@ -5673,150 +7001,173 @@ int skill_unit_ondamaged(struct skill_unit *src,struct block_list *bl, * スキル使用(詠唱完了、場所指定) *------------------------------------------ */ -int skill_castend_pos( int tid, unsigned int tick, int id,int data ) +int skill_castend_pos (int tid, unsigned int tick, int id, int data) { - struct map_session_data* sd=map_id2sd(id)/*,*target_sd=NULL*/; - int range,maxcount; - - nullpo_retr(0, sd); - - if( sd->bl.prev == NULL ) - return 0; - if( sd->skilltimer != tid ) /* タイマIDの確認 */ - return 0; - if(sd->skilltimer != -1 && pc_checkskill(sd,SA_FREECAST) > 0) { - sd->speed = sd->prev_speed; - clif_updatestatus(sd,SP_SPEED); - } - sd->skilltimer=-1; - if(pc_isdead(sd)) { - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } + struct map_session_data *sd = map_id2sd (id) /*,*target_sd=NULL */ ; + int range, maxcount; - if(battle_config.pc_skill_reiteration == 0) { - range = -1; - switch(sd->skillid) { - case MG_SAFETYWALL: - case WZ_FIREPILLAR: - case HT_SKIDTRAP: - case HT_LANDMINE: - case HT_ANKLESNARE: - case HT_SHOCKWAVE: - case HT_SANDMAN: - case HT_FLASHER: - case HT_FREEZINGTRAP: - case HT_BLASTMINE: - case HT_CLAYMORETRAP: - case HT_TALKIEBOX: - case AL_WARP: - case PF_SPIDERWEB: /* スパイダーウェッブ */ - case RG_GRAFFITI: /* グラフィティ */ - range = 0; - break; - case AL_PNEUMA: - range = 1; - break; - } - if(range >= 0) { - if(skill_check_unit_range(sd->bl.m,sd->skillx,sd->skilly,range,sd->skillid) > 0) { - clif_skill_fail(sd,sd->skillid,0,0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - } - } - if(battle_config.pc_skill_nofootset) { - range = -1; - switch(sd->skillid) { - case WZ_FIREPILLAR: - case HT_SKIDTRAP: - case HT_LANDMINE: - case HT_ANKLESNARE: - case HT_SHOCKWAVE: - case HT_SANDMAN: - case HT_FLASHER: - case HT_FREEZINGTRAP: - case HT_BLASTMINE: - case HT_CLAYMORETRAP: - case HT_TALKIEBOX: - case PF_SPIDERWEB: /* スパイダーウェッブ */ - case WZ_ICEWALL: - range = 1; - break; - case AL_WARP: - range = 0; - break; - } - if(range >= 0) { - if(skill_check_unit_range2(sd->bl.m,sd->skillx,sd->skilly,range) > 0) { - clif_skill_fail(sd,sd->skillid,0,0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - } - } - - if(battle_config.pc_land_skill_limit) { - maxcount = skill_get_maxcount(sd->skillid); - if(maxcount > 0) { - int i,c; - for(i=c=0;i<MAX_SKILLUNITGROUP;i++) { - if(sd->skillunit[i].alive_count > 0 && sd->skillunit[i].skill_id == sd->skillid) - c++; - } - if(c >= maxcount) { - clif_skill_fail(sd,sd->skillid,0,0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - } - } + nullpo_retr (0, sd); - range = skill_get_range(sd->skillid,sd->skilllv); - if(range < 0) - range = battle_get_range(&sd->bl) - (range + 1); - range += battle_config.pc_skill_add_range; - if(battle_config.skill_out_range_consume) { // changed to allow casting when target walks out of range [Valaris] - if(range < distance(sd->bl.x,sd->bl.y,sd->skillx,sd->skilly)) { - clif_skill_fail(sd,sd->skillid,0,0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - } - if(!skill_check_condition(sd,1)) { /* 使用条件チェック */ - sd->canact_tick = tick; - sd->canmove_tick = tick; - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - sd->skillitem = sd->skillitemlv = -1; - if(battle_config.skill_out_range_consume) { - if(range < distance(sd->bl.x,sd->bl.y,sd->skillx,sd->skilly)) { - clif_skill_fail(sd,sd->skillid,0,0); - sd->canact_tick = tick; - sd->canmove_tick = tick; - return 0; - } - } + if (sd->bl.prev == NULL) + return 0; + if (sd->skilltimer != tid) /* タイマIDの確認 */ + return 0; + if (sd->skilltimer != -1 && pc_checkskill (sd, SA_FREECAST) > 0) + { + sd->speed = sd->prev_speed; + clif_updatestatus (sd, SP_SPEED); + } + sd->skilltimer = -1; + if (pc_isdead (sd)) + { + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + + if (battle_config.pc_skill_reiteration == 0) + { + range = -1; + switch (sd->skillid) + { + case MG_SAFETYWALL: + case WZ_FIREPILLAR: + case HT_SKIDTRAP: + case HT_LANDMINE: + case HT_ANKLESNARE: + case HT_SHOCKWAVE: + case HT_SANDMAN: + case HT_FLASHER: + case HT_FREEZINGTRAP: + case HT_BLASTMINE: + case HT_CLAYMORETRAP: + case HT_TALKIEBOX: + case AL_WARP: + case PF_SPIDERWEB: /* スパイダーウェッブ */ + case RG_GRAFFITI: /* グラフィティ */ + range = 0; + break; + case AL_PNEUMA: + range = 1; + break; + } + if (range >= 0) + { + if (skill_check_unit_range + (sd->bl.m, sd->skillx, sd->skilly, range, sd->skillid) > 0) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + } + } + if (battle_config.pc_skill_nofootset) + { + range = -1; + switch (sd->skillid) + { + case WZ_FIREPILLAR: + case HT_SKIDTRAP: + case HT_LANDMINE: + case HT_ANKLESNARE: + case HT_SHOCKWAVE: + case HT_SANDMAN: + case HT_FLASHER: + case HT_FREEZINGTRAP: + case HT_BLASTMINE: + case HT_CLAYMORETRAP: + case HT_TALKIEBOX: + case PF_SPIDERWEB: /* スパイダーウェッブ */ + case WZ_ICEWALL: + range = 1; + break; + case AL_WARP: + range = 0; + break; + } + if (range >= 0) + { + if (skill_check_unit_range2 + (sd->bl.m, sd->skillx, sd->skilly, range) > 0) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + } + } + + if (battle_config.pc_land_skill_limit) + { + maxcount = skill_get_maxcount (sd->skillid); + if (maxcount > 0) + { + int i, c; + for (i = c = 0; i < MAX_SKILLUNITGROUP; i++) + { + if (sd->skillunit[i].alive_count > 0 + && sd->skillunit[i].skill_id == sd->skillid) + c++; + } + if (c >= maxcount) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + } + } + + range = skill_get_range (sd->skillid, sd->skilllv); + if (range < 0) + range = battle_get_range (&sd->bl) - (range + 1); + range += battle_config.pc_skill_add_range; + if (battle_config.skill_out_range_consume) + { // changed to allow casting when target walks out of range [Valaris] + if (range < distance (sd->bl.x, sd->bl.y, sd->skillx, sd->skilly)) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + } + if (!skill_check_condition (sd, 1)) + { /* 使用条件チェック */ + sd->canact_tick = tick; + sd->canmove_tick = tick; + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + sd->skillitem = sd->skillitemlv = -1; + if (battle_config.skill_out_range_consume) + { + if (range < distance (sd->bl.x, sd->bl.y, sd->skillx, sd->skilly)) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + sd->canact_tick = tick; + sd->canmove_tick = tick; + return 0; + } + } - if(battle_config.pc_skill_log) - printf("PC %d skill castend skill=%d\n",sd->bl.id,sd->skillid); - pc_stop_walking(sd,0); + if (battle_config.pc_skill_log) + printf ("PC %d skill castend skill=%d\n", sd->bl.id, sd->skillid); + pc_stop_walking (sd, 0); - skill_castend_pos2(&sd->bl,sd->skillx,sd->skilly,sd->skillid,sd->skilllv,tick,0); + skill_castend_pos2 (&sd->bl, sd->skillx, sd->skilly, sd->skillid, + sd->skilllv, tick, 0); - return 0; + return 0; } /*========================================== @@ -5824,526 +7175,621 @@ int skill_castend_pos( int tid, unsigned int tick, int id,int data ) *------------------------------------------ */ -static int skill_check_condition_char_sub(struct block_list *bl,va_list ap) +static int skill_check_condition_char_sub (struct block_list *bl, va_list ap) { - int *c; - struct block_list *src; - struct map_session_data *sd; - struct map_session_data *ssd; - struct pc_base_job s_class; - struct pc_base_job ss_class; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, sd=(struct map_session_data*)bl); - nullpo_retr(0, src=va_arg(ap,struct block_list *)); - nullpo_retr(0, c=va_arg(ap,int *)); - nullpo_retr(0, ssd=(struct map_session_data*)src); - - s_class = pc_calc_base_job(sd->status.class); - //チェックしない設定ならcにありえない大きな数字を返して終了 - if(!battle_config.player_skill_partner_check){ //本当はforeachの前にやりたいけど設定適用箇所をまとめるためにここへ - (*c)=99; - return 0; - } - - ; - ss_class = pc_calc_base_job(ssd->status.class); - - switch(ssd->skillid){ - case PR_BENEDICTIO: /* 聖体降福 */ - if(sd != ssd && (sd->status.class == 4 || sd->status.class == 8 || sd->status.class == 15 || - sd->status.class == 4005 || sd->status.class == 4009 || sd->status.class == 4016) && - (sd->bl.x == ssd->bl.x - 1 || sd->bl.x == ssd->bl.x + 1) && sd->status.sp >= 10) - (*c)++; - break; - case BD_LULLABY: /* 子守歌 */ - case BD_RICHMANKIM: /* ニヨルドの宴 */ - case BD_ETERNALCHAOS: /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ - case BD_ROKISWEIL: /* ロキの叫び */ - case BD_INTOABYSS: /* 深淵の中に */ - case BD_SIEGFRIED: /* 不死身のジークフリード */ - case BD_RAGNAROK: /* 神々の黄昏 */ - case CG_MOONLIT: /* 月明りの泉に落ちる花びら */ - if(sd != ssd && - ((ssd->status.class==19 && sd->status.class==20) || - (ssd->status.class==20 && sd->status.class==19) || - (ssd->status.class==4020 && sd->status.class==4021) || - (ssd->status.class==4021 && sd->status.class==4020) || - (ssd->status.class==20 && sd->status.class==4020) || - (ssd->status.class==19 && sd->status.class==4021)) && - pc_checkskill(sd,ssd->skillid) > 0 && - (*c)==0 && - sd->status.party_id == ssd->status.party_id && - !pc_issit(sd) && - sd->sc_data[SC_DANCING].timer==-1 - ) - (*c)=pc_checkskill(sd,ssd->skillid); - break; - } - return 0; + int *c; + struct block_list *src; + struct map_session_data *sd; + struct map_session_data *ssd; + struct pc_base_job s_class; + struct pc_base_job ss_class; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, sd = (struct map_session_data *) bl); + nullpo_retr (0, src = va_arg (ap, struct block_list *)); + nullpo_retr (0, c = va_arg (ap, int *)); + nullpo_retr (0, ssd = (struct map_session_data *) src); + + s_class = pc_calc_base_job (sd->status.class); + //チェックしない設定ならcにありえない大きな数字を返して終了 + if (!battle_config.player_skill_partner_check) + { //本当はforeachの前にやりたいけど設定適用箇所をまとめるためにここへ + (*c) = 99; + return 0; + } + + ; + ss_class = pc_calc_base_job (ssd->status.class); + + switch (ssd->skillid) + { + case PR_BENEDICTIO: /* 聖体降福 */ + if (sd != ssd + && (sd->status.class == 4 || sd->status.class == 8 + || sd->status.class == 15 || sd->status.class == 4005 + || sd->status.class == 4009 || sd->status.class == 4016) + && (sd->bl.x == ssd->bl.x - 1 || sd->bl.x == ssd->bl.x + 1) + && sd->status.sp >= 10) + (*c)++; + break; + case BD_LULLABY: /* 子守歌 */ + case BD_RICHMANKIM: /* ニヨルドの宴 */ + case BD_ETERNALCHAOS: /* 永遠の混沌 */ + case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ + case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ + case BD_ROKISWEIL: /* ロキの叫び */ + case BD_INTOABYSS: /* 深淵の中に */ + case BD_SIEGFRIED: /* 不死身のジークフリード */ + case BD_RAGNAROK: /* 神々の黄昏 */ + case CG_MOONLIT: /* 月明りの泉に落ちる花びら */ + if (sd != ssd && + ((ssd->status.class == 19 && sd->status.class == 20) || + (ssd->status.class == 20 && sd->status.class == 19) || + (ssd->status.class == 4020 && sd->status.class == 4021) || + (ssd->status.class == 4021 && sd->status.class == 4020) || + (ssd->status.class == 20 && sd->status.class == 4020) || + (ssd->status.class == 19 && sd->status.class == 4021)) && + pc_checkskill (sd, ssd->skillid) > 0 && + (*c) == 0 && + sd->status.party_id == ssd->status.party_id && + !pc_issit (sd) && sd->sc_data[SC_DANCING].timer == -1) + (*c) = pc_checkskill (sd, ssd->skillid); + break; + } + return 0; } + /*========================================== * 範囲内キャラ存在確認判定後スキル使用処理(foreachinarea) *------------------------------------------ */ -static int skill_check_condition_use_sub(struct block_list *bl,va_list ap) +static int skill_check_condition_use_sub (struct block_list *bl, va_list ap) { - int *c; - struct block_list *src; - struct map_session_data *sd; - struct map_session_data *ssd; - struct pc_base_job s_class; - struct pc_base_job ss_class; - int skillid,skilllv; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, sd=(struct map_session_data*)bl); - nullpo_retr(0, src=va_arg(ap,struct block_list *)); - nullpo_retr(0, c=va_arg(ap,int *)); - nullpo_retr(0, ssd=(struct map_session_data*)src); - - s_class = pc_calc_base_job(sd->status.class); - - //チェックしない設定ならcにありえない大きな数字を返して終了 - if(!battle_config.player_skill_partner_check){ //本当はforeachの前にやりたいけど設定適用箇所をまとめるためにここへ - (*c)=99; - return 0; - } - - ss_class = pc_calc_base_job(ssd->status.class); - skillid=ssd->skillid; - skilllv=ssd->skilllv; - switch(skillid){ - case PR_BENEDICTIO: /* 聖体降福 */ - if(sd != ssd && (sd->status.class == 4 || sd->status.class == 8 || sd->status.class == 15 || - sd->status.class == 4005 || sd->status.class == 4009 || sd->status.class == 4016) && - (sd->bl.x == ssd->bl.x - 1 || sd->bl.x == ssd->bl.x + 1) && sd->status.sp >= 10){ - sd->status.sp -= 10; - pc_calcstatus(sd,0); - (*c)++; - } - break; - case BD_LULLABY: /* 子守歌 */ - case BD_RICHMANKIM: /* ニヨルドの宴 */ - case BD_ETERNALCHAOS: /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ - case BD_ROKISWEIL: /* ロキの叫び */ - case BD_INTOABYSS: /* 深淵の中に */ - case BD_SIEGFRIED: /* 不死身のジークフリード */ - case BD_RAGNAROK: /* 神々の黄昏 */ - case CG_MOONLIT: /* 月明りの泉に落ちる花びら */ - if(sd != ssd && //本人以外で - ((ssd->status.class==19 && sd->status.class==20) || - (ssd->status.class==20 && sd->status.class==19) || - (ssd->status.class==4020 && sd->status.class==4021) || - (ssd->status.class==4021 && sd->status.class==4020) || - (ssd->status.class==20 && sd->status.class==4020) || - (ssd->status.class==19 && sd->status.class==4021)) && //自分がダンサーならバードで - pc_checkskill(sd,skillid) > 0 && //スキルを持っていて - (*c)==0 && //最初の一人で - sd->status.party_id == ssd->status.party_id && //パーティーが同じで - !pc_issit(sd) && //座ってない - sd->sc_data[SC_DANCING].timer==-1 //ダンス中じゃない - ){ - ssd->sc_data[SC_DANCING].val4=bl->id; - clif_skill_nodamage(bl,src,skillid,skilllv,1); - skill_status_change_start(bl,SC_DANCING,skillid,ssd->sc_data[SC_DANCING].val2,0,src->id,skill_get_time(skillid,skilllv)+1000,0); - sd->skillid_dance=sd->skillid=skillid; - sd->skilllv_dance=sd->skilllv=skilllv; - (*c)++; - } - break; - } - return 0; + int *c; + struct block_list *src; + struct map_session_data *sd; + struct map_session_data *ssd; + struct pc_base_job s_class; + struct pc_base_job ss_class; + int skillid, skilllv; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, sd = (struct map_session_data *) bl); + nullpo_retr (0, src = va_arg (ap, struct block_list *)); + nullpo_retr (0, c = va_arg (ap, int *)); + nullpo_retr (0, ssd = (struct map_session_data *) src); + + s_class = pc_calc_base_job (sd->status.class); + + //チェックしない設定ならcにありえない大きな数字を返して終了 + if (!battle_config.player_skill_partner_check) + { //本当はforeachの前にやりたいけど設定適用箇所をまとめるためにここへ + (*c) = 99; + return 0; + } + + ss_class = pc_calc_base_job (ssd->status.class); + skillid = ssd->skillid; + skilllv = ssd->skilllv; + switch (skillid) + { + case PR_BENEDICTIO: /* 聖体降福 */ + if (sd != ssd + && (sd->status.class == 4 || sd->status.class == 8 + || sd->status.class == 15 || sd->status.class == 4005 + || sd->status.class == 4009 || sd->status.class == 4016) + && (sd->bl.x == ssd->bl.x - 1 || sd->bl.x == ssd->bl.x + 1) + && sd->status.sp >= 10) + { + sd->status.sp -= 10; + pc_calcstatus (sd, 0); + (*c)++; + } + break; + case BD_LULLABY: /* 子守歌 */ + case BD_RICHMANKIM: /* ニヨルドの宴 */ + case BD_ETERNALCHAOS: /* 永遠の混沌 */ + case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ + case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ + case BD_ROKISWEIL: /* ロキの叫び */ + case BD_INTOABYSS: /* 深淵の中に */ + case BD_SIEGFRIED: /* 不死身のジークフリード */ + case BD_RAGNAROK: /* 神々の黄昏 */ + case CG_MOONLIT: /* 月明りの泉に落ちる花びら */ + if (sd != ssd && //本人以外で + ((ssd->status.class == 19 && sd->status.class == 20) || (ssd->status.class == 20 && sd->status.class == 19) || (ssd->status.class == 4020 && sd->status.class == 4021) || (ssd->status.class == 4021 && sd->status.class == 4020) || (ssd->status.class == 20 && sd->status.class == 4020) || (ssd->status.class == 19 && sd->status.class == 4021)) && //自分がダンサーならバードで + pc_checkskill (sd, skillid) > 0 && //スキルを持っていて + (*c) == 0 && //最初の一人で + sd->status.party_id == ssd->status.party_id && //パーティーが同じで + !pc_issit (sd) && //座ってない + sd->sc_data[SC_DANCING].timer == -1 //ダンス中じゃない + ) + { + ssd->sc_data[SC_DANCING].val4 = bl->id; + clif_skill_nodamage (bl, src, skillid, skilllv, 1); + skill_status_change_start (bl, SC_DANCING, skillid, + ssd->sc_data[SC_DANCING].val2, 0, + src->id, skill_get_time (skillid, + skilllv) + + 1000, 0); + sd->skillid_dance = sd->skillid = skillid; + sd->skilllv_dance = sd->skilllv = skilllv; + (*c)++; + } + break; + } + return 0; } + /*========================================== * 範囲内バイオプラント、スフィアマイン用Mob存在確認判定処理(foreachinarea) *------------------------------------------ */ -static int skill_check_condition_mob_master_sub(struct block_list *bl,va_list ap) +static int skill_check_condition_mob_master_sub (struct block_list *bl, + va_list ap) { - int *c,src_id=0,mob_class=0; - struct mob_data *md; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, md=(struct mob_data*)bl); - nullpo_retr(0, src_id=va_arg(ap,int)); - nullpo_retr(0, mob_class=va_arg(ap,int)); - nullpo_retr(0, c=va_arg(ap,int *)); - - if(md->class==mob_class && md->master_id==src_id) - (*c)++; - return 0; + int *c, src_id = 0, mob_class = 0; + struct mob_data *md; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, md = (struct mob_data *) bl); + nullpo_retr (0, src_id = va_arg (ap, int)); + nullpo_retr (0, mob_class = va_arg (ap, int)); + nullpo_retr (0, c = va_arg (ap, int *)); + + if (md->class == mob_class && md->master_id == src_id) + (*c)++; + return 0; } /*========================================== * スキル使用条件(偽で使用失敗) *------------------------------------------ */ -int skill_check_condition(struct map_session_data *sd,int type) +int skill_check_condition (struct map_session_data *sd, int type) { - int i,hp,sp,hp_rate,sp_rate,zeny,weapon,state,spiritball,skill,lv,mhp; - int index[10],itemid[10],amount[10]; - - nullpo_retr(0, sd); - - if( battle_config.gm_skilluncond>0 && pc_isGM(sd)>= battle_config.gm_skilluncond ) { - sd->skillitem = sd->skillitemlv = -1; - return 1; - } - - if( sd->opt1>0) { - clif_skill_fail(sd,sd->skillid,0,0); - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - if(pc_is90overweight(sd)) { - clif_skill_fail(sd,sd->skillid,9,0); - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - - if(sd->skillid == AC_MAKINGARROW && sd->state.make_arrow_flag == 1) { - sd->skillitem = sd->skillitemlv = -1; - return 0; - } - /*if(sd->skillid == AM_PHARMACY && sd->state.produce_flag == 1) { - sd->skillitem = sd->skillitemlv = -1; - return 0; - }*/ - - if(sd->skillitem == sd->skillid) { /* アイテムの場合無条件成功 */ - if(type&1) - sd->skillitem = sd->skillitemlv = -1; - return 1; - } - if( sd->opt1>0 ){ - clif_skill_fail(sd,sd->skillid,0,0); - return 0; - } - if(sd->sc_data){ - if( sd->sc_data[SC_DIVINA].timer!=-1 || - sd->sc_data[SC_ROKISWEIL].timer!=-1 || - (sd->sc_data[SC_AUTOCOUNTER].timer != -1 && sd->skillid != KN_AUTOCOUNTER) || - sd->sc_data[SC_STEELBODY].timer != -1 || - sd->sc_data[SC_BERSERK].timer != -1 - ){ - clif_skill_fail(sd,sd->skillid,0,0); - return 0; /* 状態異常や沈黙など */ - } - } - skill = sd->skillid; - lv = sd->skilllv; - hp=skill_get_hp(skill, lv); /* 消費HP */ - sp=skill_get_sp(skill, lv); /* 消費SP */ - if((sd->skillid_old == BD_ENCORE) && skill==sd->skillid_dance) - sp=sp/2; //アンコール時はSP消費が半分 - hp_rate = (lv <= 0)? 0:skill_db[skill].hp_rate[lv-1]; - sp_rate = (lv <= 0)? 0:skill_db[skill].sp_rate[lv-1]; - zeny = skill_get_zeny(skill,lv); - weapon = skill_db[skill].weapon; - state = skill_db[skill].state; - spiritball = (lv <= 0)? 0:skill_db[skill].spiritball[lv-1]; - mhp=skill_get_mhp(skill, lv); /* 消費HP */ - for(i=0;i<10;i++) { - itemid[i] = skill_db[skill].itemid[i]; - amount[i] = skill_db[skill].amount[i]; - } - if(mhp > 0) - hp += (sd->status.max_hp * mhp)/100; - if(hp_rate > 0) - hp += (sd->status.hp * hp_rate)/100; - else - hp += (sd->status.max_hp * abs(hp_rate))/100; - if(sp_rate > 0) - sp += (sd->status.sp * sp_rate)/100; - else - sp += (sd->status.max_sp * abs(sp_rate))/100; - if(sd->dsprate!=100) - sp=sp*sd->dsprate/100; /* 消費SP修正 */ - - switch(skill) { - case SA_CASTCANCEL: - if(sd->skilltimer == -1) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case BS_MAXIMIZE: /* マキシマイズパワー */ - case NV_TRICKDEAD: /* 死んだふり */ - case TF_HIDING: /* ハイディング */ - case AS_CLOAKING: /* クローキング */ - case CR_AUTOGUARD: /* オートガード */ - case CR_DEFENDER: /* ディフェンダー */ - case ST_CHASEWALK: - if(sd->sc_data[SkillStatusChangeTable[skill]].timer!=-1) - return 1; /* 解除する場合はSP消費しない */ - break; - case AL_TELEPORT: - case AL_WARP: - if(map[sd->bl.m].flag.noteleport) { - clif_skill_teleportmessage(sd,0); - return 0; - } - break; - case MO_CALLSPIRITS: /* 気功 */ - if(sd->spiritball >= lv) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case CH_SOULCOLLECT: /* 狂気功 */ - if(sd->spiritball >= 5) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case MO_FINGEROFFENSIVE: //指弾 - if (sd->spiritball > 0 && sd->spiritball < spiritball) { - spiritball = sd->spiritball; - sd->spiritball_old = sd->spiritball; - } - else sd->spiritball_old = lv; - break; - case MO_CHAINCOMBO: //連打掌 - if(sd->sc_data[SC_BLADESTOP].timer==-1){ - if(sd->sc_data[SC_COMBO].timer == -1 || sd->sc_data[SC_COMBO].val1 != MO_TRIPLEATTACK) - return 0; - } - break; - case MO_COMBOFINISH: //猛龍拳 - if(sd->sc_data[SC_COMBO].timer == -1 || sd->sc_data[SC_COMBO].val1 != MO_CHAINCOMBO) - return 0; - break; - case CH_TIGERFIST: //伏虎拳 - if(sd->sc_data[SC_COMBO].timer == -1 || sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH) - return 0; - break; - case CH_CHAINCRUSH: //連柱崩撃 - if(sd->sc_data[SC_COMBO].timer == -1) - return 0; - if(sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH && sd->sc_data[SC_COMBO].val1 != CH_TIGERFIST) - return 0; - break; - case MO_EXTREMITYFIST: // 阿修羅覇鳳拳 - if((sd->sc_data[SC_COMBO].timer != -1 && (sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH || sd->sc_data[SC_COMBO].val1 == CH_CHAINCRUSH)) || sd->sc_data[SC_BLADESTOP].timer!=-1) - spiritball--; - break; - case BD_ADAPTATION: /* アドリブ */ - { - struct skill_unit_group *group=NULL; - if(sd->sc_data[SC_DANCING].timer==-1 || ((group=(struct skill_unit_group*)sd->sc_data[SC_DANCING].val2) && (skill_get_time(sd->sc_data[SC_DANCING].val1,group->skill_lv) - sd->sc_data[SC_DANCING].val3*1000) <= skill_get_time2(skill,lv))){ //ダンス中で使用後5秒以上のみ? - clif_skill_fail(sd,skill,0,0); - return 0; - } - } - break; - case PR_BENEDICTIO: /* 聖体降福 */ - { - int range=1; - int c=0; - if(!(type&1)){ - map_foreachinarea(skill_check_condition_char_sub,sd->bl.m, - sd->bl.x-range,sd->bl.y-range, - sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c); - if(c<2){ - clif_skill_fail(sd,skill,0,0); - return 0; - } - }else{ - map_foreachinarea(skill_check_condition_use_sub,sd->bl.m, - sd->bl.x-range,sd->bl.y-range, - sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c); - } - } - break; - case WE_CALLPARTNER: /* あなたに逢いたい */ - if(!sd->status.partner_id){ - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case AM_CANNIBALIZE: /* バイオプラント */ - case AM_SPHEREMINE: /* スフィアーマイン */ - if(type&1){ - int c=0; - int maxcount=skill_get_maxcount(skill); - int mob_class=(skill==AM_CANNIBALIZE)?1118:1142; - if(battle_config.pc_land_skill_limit && maxcount>0) { - map_foreachinarea(skill_check_condition_mob_master_sub ,sd->bl.m, 0, 0, map[sd->bl.m].xs, map[sd->bl.m].ys, BL_MOB, sd->bl.id, mob_class,&c ); - if(c >= maxcount){ - clif_skill_fail(sd,skill,0,0); - return 0; - } - } - } - break; - case MG_FIREWALL: /* ファイアーウォール */ - /* 数制限 */ - if(battle_config.pc_land_skill_limit) { - int maxcount = skill_get_maxcount(skill); - if(maxcount > 0) { - int i,c; - for(i=c=0;i<MAX_SKILLUNITGROUP;i++) { - if(sd->skillunit[i].alive_count > 0 && sd->skillunit[i].skill_id == skill) - c++; - } - if(c >= maxcount) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - } - } - break; - } - - if(!(type&2)){ - if( hp>0 && sd->status.hp < hp) { /* HPチェック */ - clif_skill_fail(sd,skill,2,0); /* HP不足:失敗通知 */ - return 0; - } - if( sp>0 && sd->status.sp < sp) { /* SPチェック */ - clif_skill_fail(sd,skill,1,0); /* SP不足:失敗通知 */ - return 0; - } - if( zeny>0 && sd->status.zeny < zeny) { - clif_skill_fail(sd,skill,5,0); - return 0; - } - if(!(weapon & (1<<sd->status.weapon) ) ) { - clif_skill_fail(sd,skill,6,0); - return 0; - } - if( spiritball > 0 && sd->spiritball < spiritball) { - clif_skill_fail(sd,skill,0,0); // 氣球不足 - return 0; - } - } - - switch(state) { - case ST_HIDING: - if(!(sd->status.option&2)) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case ST_CLOAKING: - if(!(sd->status.option&4)) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case ST_HIDDEN: - if(!pc_ishiding(sd)) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case ST_RIDING: - if(!pc_isriding(sd)) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case ST_FALCON: - if(!pc_isfalcon(sd)) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case ST_CART: - if(!pc_iscarton(sd)) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case ST_SHIELD: - if(sd->status.shield <= 0) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case ST_SIGHT: - if(sd->sc_data[SC_SIGHT].timer == -1 && type&1) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case ST_EXPLOSIONSPIRITS: - if(sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case ST_RECOV_WEIGHT_RATE: - if(battle_config.natural_heal_weight_rate <= 100 && sd->weight*100/sd->max_weight >= battle_config.natural_heal_weight_rate) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - case ST_MOVE_ENABLE: - { - struct walkpath_data wpd; - if(path_search(&wpd,sd->bl.m,sd->bl.x,sd->bl.y,sd->skillx,sd->skilly,1)==-1) { - clif_skill_fail(sd,skill,0,0); - return 0; - } - } - break; - case ST_WATER: - if(map_getcell(sd->bl.m,sd->bl.x,sd->bl.y) != 3 && (sd->sc_data[SC_DELUGE].timer==-1)){ //水場判定 - clif_skill_fail(sd,skill,0,0); - return 0; - } - break; - } - - for(i=0;i<10;i++) { - int x = lv%11 - 1; - index[i] = -1; - if(itemid[i] <= 0) - continue; - if(itemid[i] >= 715 && itemid[i] <= 717 && sd->special_state.no_gemstone) - continue; - if(((itemid[i] >= 715 && itemid[i] <= 717) || itemid[i] == 1065) && sd->sc_data[SC_INTOABYSS].timer != -1) - continue; - if(skill == AM_POTIONPITCHER && i != x) - continue; - - index[i] = pc_search_inventory(sd,itemid[i]); - if(index[i] < 0 || sd->status.inventory[index[i]].amount < amount[i]) { - if(itemid[i] == 716 || itemid[i] == 717) - clif_skill_fail(sd,skill,(7+(itemid[i]-716)),0); - else - clif_skill_fail(sd,skill,0,0); - return 0; - } - } - - if(!(type&1)) - return 1; + int i, hp, sp, hp_rate, sp_rate, zeny, weapon, state, spiritball, skill, + lv, mhp; + int index[10], itemid[10], amount[10]; + + nullpo_retr (0, sd); + + if (battle_config.gm_skilluncond > 0 + && pc_isGM (sd) >= battle_config.gm_skilluncond) + { + sd->skillitem = sd->skillitemlv = -1; + return 1; + } + + if (sd->opt1 > 0) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + if (pc_is90overweight (sd)) + { + clif_skill_fail (sd, sd->skillid, 9, 0); + sd->skillitem = sd->skillitemlv = -1; + return 0; + } - if(skill != AM_POTIONPITCHER) { - if(skill == AL_WARP && !(type&2)) - return 1; - for(i=0;i<10;i++) { - if(index[i] >= 0) - pc_delitem(sd,index[i],amount[i],0); // アイテム消費 - } - } + if (sd->skillid == AC_MAKINGARROW && sd->state.make_arrow_flag == 1) + { + sd->skillitem = sd->skillitemlv = -1; + return 0; + } + /*if(sd->skillid == AM_PHARMACY && sd->state.produce_flag == 1) { + * sd->skillitem = sd->skillitemlv = -1; + * return 0; + * } */ + + if (sd->skillitem == sd->skillid) + { /* アイテムの場合無条件成功 */ + if (type & 1) + sd->skillitem = sd->skillitemlv = -1; + return 1; + } + if (sd->opt1 > 0) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + return 0; + } + if (sd->sc_data) + { + if (sd->sc_data[SC_DIVINA].timer != -1 || + sd->sc_data[SC_ROKISWEIL].timer != -1 || + (sd->sc_data[SC_AUTOCOUNTER].timer != -1 + && sd->skillid != KN_AUTOCOUNTER) + || sd->sc_data[SC_STEELBODY].timer != -1 + || sd->sc_data[SC_BERSERK].timer != -1) + { + clif_skill_fail (sd, sd->skillid, 0, 0); + return 0; /* 状態異常や沈黙など */ + } + } + skill = sd->skillid; + lv = sd->skilllv; + hp = skill_get_hp (skill, lv); /* 消費HP */ + sp = skill_get_sp (skill, lv); /* 消費SP */ + if ((sd->skillid_old == BD_ENCORE) && skill == sd->skillid_dance) + sp = sp / 2; //アンコール時はSP消費が半分 + hp_rate = (lv <= 0) ? 0 : skill_db[skill].hp_rate[lv - 1]; + sp_rate = (lv <= 0) ? 0 : skill_db[skill].sp_rate[lv - 1]; + zeny = skill_get_zeny (skill, lv); + weapon = skill_db[skill].weapon; + state = skill_db[skill].state; + spiritball = (lv <= 0) ? 0 : skill_db[skill].spiritball[lv - 1]; + mhp = skill_get_mhp (skill, lv); /* 消費HP */ + for (i = 0; i < 10; i++) + { + itemid[i] = skill_db[skill].itemid[i]; + amount[i] = skill_db[skill].amount[i]; + } + if (mhp > 0) + hp += (sd->status.max_hp * mhp) / 100; + if (hp_rate > 0) + hp += (sd->status.hp * hp_rate) / 100; + else + hp += (sd->status.max_hp * abs (hp_rate)) / 100; + if (sp_rate > 0) + sp += (sd->status.sp * sp_rate) / 100; + else + sp += (sd->status.max_sp * abs (sp_rate)) / 100; + if (sd->dsprate != 100) + sp = sp * sd->dsprate / 100; /* 消費SP修正 */ + + switch (skill) + { + case SA_CASTCANCEL: + if (sd->skilltimer == -1) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + case BS_MAXIMIZE: /* マキシマイズパワー */ + case NV_TRICKDEAD: /* 死んだふり */ + case TF_HIDING: /* ハイディング */ + case AS_CLOAKING: /* クローキング */ + case CR_AUTOGUARD: /* オートガード */ + case CR_DEFENDER: /* ディフェンダー */ + case ST_CHASEWALK: + if (sd->sc_data[SkillStatusChangeTable[skill]].timer != -1) + return 1; /* 解除する場合はSP消費しない */ + break; + case AL_TELEPORT: + case AL_WARP: + if (map[sd->bl.m].flag.noteleport) + { + clif_skill_teleportmessage (sd, 0); + return 0; + } + break; + case MO_CALLSPIRITS: /* 気功 */ + if (sd->spiritball >= lv) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + case CH_SOULCOLLECT: /* 狂気功 */ + if (sd->spiritball >= 5) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + case MO_FINGEROFFENSIVE: //指弾 + if (sd->spiritball > 0 && sd->spiritball < spiritball) + { + spiritball = sd->spiritball; + sd->spiritball_old = sd->spiritball; + } + else + sd->spiritball_old = lv; + break; + case MO_CHAINCOMBO: //連打掌 + if (sd->sc_data[SC_BLADESTOP].timer == -1) + { + if (sd->sc_data[SC_COMBO].timer == -1 + || sd->sc_data[SC_COMBO].val1 != MO_TRIPLEATTACK) + return 0; + } + break; + case MO_COMBOFINISH: //猛龍拳 + if (sd->sc_data[SC_COMBO].timer == -1 + || sd->sc_data[SC_COMBO].val1 != MO_CHAINCOMBO) + return 0; + break; + case CH_TIGERFIST: //伏虎拳 + if (sd->sc_data[SC_COMBO].timer == -1 + || sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH) + return 0; + break; + case CH_CHAINCRUSH: //連柱崩撃 + if (sd->sc_data[SC_COMBO].timer == -1) + return 0; + if (sd->sc_data[SC_COMBO].val1 != MO_COMBOFINISH + && sd->sc_data[SC_COMBO].val1 != CH_TIGERFIST) + return 0; + break; + case MO_EXTREMITYFIST: // 阿修羅覇鳳拳 + if ((sd->sc_data[SC_COMBO].timer != -1 + && (sd->sc_data[SC_COMBO].val1 == MO_COMBOFINISH + || sd->sc_data[SC_COMBO].val1 == CH_CHAINCRUSH)) + || sd->sc_data[SC_BLADESTOP].timer != -1) + spiritball--; + break; + case BD_ADAPTATION: /* アドリブ */ + { + struct skill_unit_group *group = NULL; + if (sd->sc_data[SC_DANCING].timer == -1 + || + ((group = + (struct skill_unit_group *) sd->sc_data[SC_DANCING].val2) + && + (skill_get_time + (sd->sc_data[SC_DANCING].val1, + group->skill_lv) - sd->sc_data[SC_DANCING].val3 * 1000) <= + skill_get_time2 (skill, lv))) + { //ダンス中で使用後5秒以上のみ? + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + } + break; + case PR_BENEDICTIO: /* 聖体降福 */ + { + int range = 1; + int c = 0; + if (!(type & 1)) + { + map_foreachinarea (skill_check_condition_char_sub, sd->bl.m, + sd->bl.x - range, sd->bl.y - range, + sd->bl.x + range, sd->bl.y + range, BL_PC, + &sd->bl, &c); + if (c < 2) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + } + else + { + map_foreachinarea (skill_check_condition_use_sub, sd->bl.m, + sd->bl.x - range, sd->bl.y - range, + sd->bl.x + range, sd->bl.y + range, BL_PC, + &sd->bl, &c); + } + } + break; + case WE_CALLPARTNER: /* あなたに逢いたい */ + if (!sd->status.partner_id) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + case AM_CANNIBALIZE: /* バイオプラント */ + case AM_SPHEREMINE: /* スフィアーマイン */ + if (type & 1) + { + int c = 0; + int maxcount = skill_get_maxcount (skill); + int mob_class = (skill == AM_CANNIBALIZE) ? 1118 : 1142; + if (battle_config.pc_land_skill_limit && maxcount > 0) + { + map_foreachinarea (skill_check_condition_mob_master_sub, + sd->bl.m, 0, 0, map[sd->bl.m].xs, + map[sd->bl.m].ys, BL_MOB, sd->bl.id, + mob_class, &c); + if (c >= maxcount) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + } + } + break; + case MG_FIREWALL: /* ファイアーウォール */ + /* 数制限 */ + if (battle_config.pc_land_skill_limit) + { + int maxcount = skill_get_maxcount (skill); + if (maxcount > 0) + { + int i, c; + for (i = c = 0; i < MAX_SKILLUNITGROUP; i++) + { + if (sd->skillunit[i].alive_count > 0 + && sd->skillunit[i].skill_id == skill) + c++; + } + if (c >= maxcount) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + } + } + break; + } + + if (!(type & 2)) + { + if (hp > 0 && sd->status.hp < hp) + { /* HPチェック */ + clif_skill_fail (sd, skill, 2, 0); /* HP不足:失敗通知 */ + return 0; + } + if (sp > 0 && sd->status.sp < sp) + { /* SPチェック */ + clif_skill_fail (sd, skill, 1, 0); /* SP不足:失敗通知 */ + return 0; + } + if (zeny > 0 && sd->status.zeny < zeny) + { + clif_skill_fail (sd, skill, 5, 0); + return 0; + } + if (!(weapon & (1 << sd->status.weapon))) + { + clif_skill_fail (sd, skill, 6, 0); + return 0; + } + if (spiritball > 0 && sd->spiritball < spiritball) + { + clif_skill_fail (sd, skill, 0, 0); // 氣球不足 + return 0; + } + } + + switch (state) + { + case ST_HIDING: + if (!(sd->status.option & 2)) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + case ST_CLOAKING: + if (!(sd->status.option & 4)) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + case ST_HIDDEN: + if (!pc_ishiding (sd)) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + case ST_RIDING: + if (!pc_isriding (sd)) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + case ST_FALCON: + if (!pc_isfalcon (sd)) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + case ST_CART: + if (!pc_iscarton (sd)) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + case ST_SHIELD: + if (sd->status.shield <= 0) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + case ST_SIGHT: + if (sd->sc_data[SC_SIGHT].timer == -1 && type & 1) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + case ST_EXPLOSIONSPIRITS: + if (sd->sc_data[SC_EXPLOSIONSPIRITS].timer == -1) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + case ST_RECOV_WEIGHT_RATE: + if (battle_config.natural_heal_weight_rate <= 100 + && sd->weight * 100 / sd->max_weight >= + battle_config.natural_heal_weight_rate) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + case ST_MOVE_ENABLE: + { + struct walkpath_data wpd; + if (path_search + (&wpd, sd->bl.m, sd->bl.x, sd->bl.y, sd->skillx, sd->skilly, + 1) == -1) + { + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + } + break; + case ST_WATER: + if (map_getcell (sd->bl.m, sd->bl.x, sd->bl.y) != 3 + && (sd->sc_data[SC_DELUGE].timer == -1)) + { //水場判定 + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + break; + } + + for (i = 0; i < 10; i++) + { + int x = lv % 11 - 1; + index[i] = -1; + if (itemid[i] <= 0) + continue; + if (itemid[i] >= 715 && itemid[i] <= 717 + && sd->special_state.no_gemstone) + continue; + if (((itemid[i] >= 715 && itemid[i] <= 717) || itemid[i] == 1065) + && sd->sc_data[SC_INTOABYSS].timer != -1) + continue; + if (skill == AM_POTIONPITCHER && i != x) + continue; + + index[i] = pc_search_inventory (sd, itemid[i]); + if (index[i] < 0 || sd->status.inventory[index[i]].amount < amount[i]) + { + if (itemid[i] == 716 || itemid[i] == 717) + clif_skill_fail (sd, skill, (7 + (itemid[i] - 716)), 0); + else + clif_skill_fail (sd, skill, 0, 0); + return 0; + } + } + + if (!(type & 1)) + return 1; + + if (skill != AM_POTIONPITCHER) + { + if (skill == AL_WARP && !(type & 2)) + return 1; + for (i = 0; i < 10; i++) + { + if (index[i] >= 0) + pc_delitem (sd, index[i], amount[i], 0); // アイテム消費 + } + } - if(type&2) - return 1; + if (type & 2) + return 1; - pc_heal(sd, -sp, -hp); // [Fate] This might suppress some dupe messages + pc_heal (sd, -sp, -hp); // [Fate] This might suppress some dupe messages /* if(sp > 0) { // SP消費 */ /* sd->status.sp-=sp; */ @@ -6353,682 +7799,790 @@ int skill_check_condition(struct map_session_data *sd,int type) /* sd->status.hp-=hp; */ /* clif_updatestatus(sd,SP_HP); */ /* } */ - if(zeny > 0) // Zeny消費 - pc_payzeny(sd,zeny); - if(spiritball > 0) // 氣球消費 - pc_delspiritball(sd,spiritball,0); + if (zeny > 0) // Zeny消費 + pc_payzeny (sd, zeny); + if (spiritball > 0) // 氣球消費 + pc_delspiritball (sd, spiritball, 0); - - return 1; + return 1; } /*========================================== * 詠唱時間計算 *------------------------------------------ */ -int skill_castfix( struct block_list *bl, int time ) +int skill_castfix (struct block_list *bl, int time) { - struct map_session_data *sd; - struct mob_data *md; // [Valaris] - struct status_change *sc_data; - int dex; - int castrate=100; - int skill,lv,castnodex; - - nullpo_retr(0, bl); - - if(bl->type==BL_MOB){ // Crash fix [Valaris] - md=(struct mob_data*)bl; - skill = md->skillid; - lv = md->skilllv; - } - - else { - sd=(struct map_session_data*)bl; - skill = sd->skillid; - lv = sd->skilllv; - } - - sc_data = battle_get_sc_data(bl); - dex=battle_get_dex(bl); - - if (skill > MAX_SKILL_DB || skill < 0) - return 0; - - castnodex=skill_get_castnodex(skill, lv); - - if(time==0) - return 0; - if(castnodex > 0 && bl->type==BL_PC) - castrate=((struct map_session_data *)bl)->castrate; - else if (castnodex <= 0 && bl->type==BL_PC) { - castrate=((struct map_session_data *)bl)->castrate; - time=time*castrate*(battle_config.castrate_dex_scale - dex)/(battle_config.castrate_dex_scale * 100); - time=time*battle_config.cast_rate/100; - } + struct map_session_data *sd; + struct mob_data *md; // [Valaris] + struct status_change *sc_data; + int dex; + int castrate = 100; + int skill, lv, castnodex; + + nullpo_retr (0, bl); + + if (bl->type == BL_MOB) + { // Crash fix [Valaris] + md = (struct mob_data *) bl; + skill = md->skillid; + lv = md->skilllv; + } + + else + { + sd = (struct map_session_data *) bl; + skill = sd->skillid; + lv = sd->skilllv; + } + + sc_data = battle_get_sc_data (bl); + dex = battle_get_dex (bl); + + if (skill > MAX_SKILL_DB || skill < 0) + return 0; - /* サフラギウム */ - if(sc_data && sc_data[SC_SUFFRAGIUM].timer!=-1 ){ - time=time*(100-sc_data[SC_SUFFRAGIUM].val1*15)/100; - skill_status_change_end( bl, SC_SUFFRAGIUM, -1); - } - /* ブラギの詩 */ - if(sc_data && sc_data[SC_POEMBRAGI].timer!=-1 ) - time=time*(100-(sc_data[SC_POEMBRAGI].val1*3+sc_data[SC_POEMBRAGI].val2 - +(sc_data[SC_POEMBRAGI].val3>>16)))/100; + castnodex = skill_get_castnodex (skill, lv); - return (time>0)?time:0; + if (time == 0) + return 0; + if (castnodex > 0 && bl->type == BL_PC) + castrate = ((struct map_session_data *) bl)->castrate; + else if (castnodex <= 0 && bl->type == BL_PC) + { + castrate = ((struct map_session_data *) bl)->castrate; + time = + time * castrate * (battle_config.castrate_dex_scale - + dex) / (battle_config.castrate_dex_scale * + 100); + time = time * battle_config.cast_rate / 100; + } + + /* サフラギウム */ + if (sc_data && sc_data[SC_SUFFRAGIUM].timer != -1) + { + time = time * (100 - sc_data[SC_SUFFRAGIUM].val1 * 15) / 100; + skill_status_change_end (bl, SC_SUFFRAGIUM, -1); + } + /* ブラギの詩 */ + if (sc_data && sc_data[SC_POEMBRAGI].timer != -1) + time = + time * (100 - + (sc_data[SC_POEMBRAGI].val1 * 3 + + sc_data[SC_POEMBRAGI].val2 + + (sc_data[SC_POEMBRAGI].val3 >> 16))) / 100; + + return (time > 0) ? time : 0; } + /*========================================== * ディレイ計算 *------------------------------------------ */ -int skill_delayfix( struct block_list *bl, int time ) +int skill_delayfix (struct block_list *bl, int time) { - struct status_change *sc_data; + struct status_change *sc_data; - nullpo_retr(0, bl); + nullpo_retr (0, bl); - sc_data = battle_get_sc_data(bl); - if(time<=0) - return 0; - - if(bl->type == BL_PC) { - if( battle_config.delay_dependon_dex ) /* dexの影響を計算する */ - time=time*(battle_config.castrate_dex_scale - battle_get_dex(bl))/battle_config.castrate_dex_scale; - time=time*battle_config.delay_rate/100; - } - - /* ブラギの詩 */ - if(sc_data && sc_data[SC_POEMBRAGI].timer!=-1 ) - time=time*(100-(sc_data[SC_POEMBRAGI].val1*3+sc_data[SC_POEMBRAGI].val2 - +(sc_data[SC_POEMBRAGI].val3&0xffff)))/100; + sc_data = battle_get_sc_data (bl); + if (time <= 0) + return 0; - return (time>0)?time:0; + if (bl->type == BL_PC) + { + if (battle_config.delay_dependon_dex) /* dexの影響を計算する */ + time = + time * (battle_config.castrate_dex_scale - + battle_get_dex (bl)) / + battle_config.castrate_dex_scale; + time = time * battle_config.delay_rate / 100; + } + + /* ブラギの詩 */ + if (sc_data && sc_data[SC_POEMBRAGI].timer != -1) + time = + time * (100 - + (sc_data[SC_POEMBRAGI].val1 * 3 + + sc_data[SC_POEMBRAGI].val2 + + (sc_data[SC_POEMBRAGI].val3 & 0xffff))) / 100; + + return (time > 0) ? time : 0; } /*========================================== * スキル使用(ID指定) *------------------------------------------ */ -int skill_use_id( struct map_session_data *sd, int target_id, - int skill_num, int skill_lv) +int skill_use_id (struct map_session_data *sd, int target_id, + int skill_num, int skill_lv) { - unsigned int tick; - int casttime=0,delay=0,skill,range; - struct map_session_data* target_sd=NULL; - int forcecast=0; - struct block_list *bl; - struct status_change *sc_data; - tick=gettick(); - - nullpo_retr(0, sd); - - if( (bl=map_id2bl(target_id)) == NULL ){ + unsigned int tick; + int casttime = 0, delay = 0, skill, range; + struct map_session_data *target_sd = NULL; + int forcecast = 0; + struct block_list *bl; + struct status_change *sc_data; + tick = gettick (); + + nullpo_retr (0, sd); + + if ((bl = map_id2bl (target_id)) == NULL) + { /* if(battle_config.error_log) printf("skill target not found %d\n",target_id); */ - return 0; - } - if(sd->bl.m != bl->m || pc_isdead(sd)) - return 0; - - if(skillnotok(skill_num, sd)) // [MouseJstr] - return 0; - - if(sd->skillid==WZ_ICEWALL && map[sd->bl.m].flag.noicewall && !map[sd->bl.m].flag.pvp) { // noicewall flag [Valaris] - clif_skill_fail(sd,sd->skillid,0,0); - return 0; - } - sc_data=sd->sc_data; - - /* 沈黙や異常(ただし、グリムなどの判定をする) */ - if( sd->opt1>0 ) - return 0; - if(sd->sc_data){ - if(sc_data[SC_CHASEWALK].timer != -1) return 0; - if(sc_data[SC_VOLCANO].timer != -1){ - if(skill_num==WZ_ICEWALL) return 0; - } - if(sc_data[SC_ROKISWEIL].timer!=-1){ - if(skill_num==BD_ADAPTATION) return 0; - } - if( sd->sc_data[SC_DIVINA].timer!=-1 || - sd->sc_data[SC_ROKISWEIL].timer!=-1 || - (sd->sc_data[SC_AUTOCOUNTER].timer != -1 && sd->skillid != KN_AUTOCOUNTER) || - sd->sc_data[SC_STEELBODY].timer != -1 || - sd->sc_data[SC_BERSERK].timer != -1 ){ - return 0; /* 状態異常や沈黙など */ - } - - if(sc_data[SC_BLADESTOP].timer != -1){ - int lv = sc_data[SC_BLADESTOP].val1; - if(sc_data[SC_BLADESTOP].val2==1) return 0;//白羽された側なのでダメ - if(lv==1) return 0; - if(lv==2 && skill_num!=MO_FINGEROFFENSIVE) return 0; - if(lv==3 && skill_num!=MO_FINGEROFFENSIVE && skill_num!=MO_INVESTIGATE) return 0; - if(lv==4 && skill_num!=MO_FINGEROFFENSIVE && skill_num!=MO_INVESTIGATE && skill_num!=MO_CHAINCOMBO) return 0; - if(lv==5 && skill_num!=MO_FINGEROFFENSIVE && skill_num!=MO_INVESTIGATE && skill_num!=MO_CHAINCOMBO && skill_num!=MO_EXTREMITYFIST) return 0; - } - } - - if(sd->status.option&4 && skill_num==TF_HIDING) - return 0; - if(sd->status.option&2 && skill_num!=TF_HIDING && skill_num!=AS_GRIMTOOTH && skill_num!=RG_BACKSTAP && skill_num!=RG_RAID ) - return 0; - - if(map[sd->bl.m].flag.gvg){ //GvGで使用できないスキル - switch(skill_num){ - case SM_ENDURE: - case AL_TELEPORT: - case AL_WARP: - case WZ_ICEWALL: - case TF_BACKSLIDING: - case LK_BERSERK: - case HP_BASILICA: - case ST_CHASEWALK: - return 0; - } - } + return 0; + } + if (sd->bl.m != bl->m || pc_isdead (sd)) + return 0; - /* 演奏/ダンス中 */ - if( sc_data && sc_data[SC_DANCING].timer!=-1 ){ -// if(battle_config.pc_skill_log) -// printf("dancing! %d\n",skill_num); - if( sc_data[SC_DANCING].val4 && skill_num!=BD_ADAPTATION ) //合奏中はアドリブ以外不可 - return 0; - if(skill_num!=BD_ADAPTATION && skill_num!=BA_MUSICALSTRIKE && skill_num!=DC_THROWARROW){ - return 0; - } - } + if (skillnotok (skill_num, sd)) // [MouseJstr] + return 0; - if(skill_get_inf2(skill_num)&0x200 && sd->bl.id == target_id) - return 0; - //直前のスキルが何か覚える必要のあるスキル - switch(skill_num){ - case SA_CASTCANCEL: - if(sd->skillid != skill_num){ //キャストキャンセル自体は覚えない - sd->skillid_old = sd->skillid; - sd->skilllv_old = sd->skilllv; - break; - } - case BD_ENCORE: /* アンコール */ - if(!sd->skillid_dance){ //前回使用した踊りがないとだめ - clif_skill_fail(sd,skill_num,0,0); - return 0; - }else{ - sd->skillid_old = skill_num; - } - break; - } + if (sd->skillid == WZ_ICEWALL && map[sd->bl.m].flag.noicewall + && !map[sd->bl.m].flag.pvp) + { // noicewall flag [Valaris] + clif_skill_fail (sd, sd->skillid, 0, 0); + return 0; + } + sc_data = sd->sc_data; - sd->skillid = skill_num; - sd->skilllv = skill_lv; - - switch(skill_num){ //事前にレベルが変わったりするスキル - case BD_LULLABY: /* 子守歌 */ - case BD_RICHMANKIM: /* ニヨルドの宴 */ - case BD_ETERNALCHAOS: /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ - case BD_ROKISWEIL: /* ロキの叫び */ - case BD_INTOABYSS: /* 深淵の中に */ - case BD_SIEGFRIED: /* 不死身のジークフリード */ - case BD_RAGNAROK: /* 神々の黄昏 */ - case CG_MOONLIT: /* 月明りの泉に落ちる花びら */ - { - int range=1; - int c=0; - map_foreachinarea(skill_check_condition_char_sub,sd->bl.m, - sd->bl.x-range,sd->bl.y-range, - sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c); - if(c<1){ - clif_skill_fail(sd,skill_num,0,0); - return 0; - }else if(c==99){ //相方不要設定だった - ; - }else{ - sd->skilllv=(c + skill_lv)/2; - } - } - break; - } + /* 沈黙や異常(ただし、グリムなどの判定をする) */ + if (sd->opt1 > 0) + return 0; + if (sd->sc_data) + { + if (sc_data[SC_CHASEWALK].timer != -1) + return 0; + if (sc_data[SC_VOLCANO].timer != -1) + { + if (skill_num == WZ_ICEWALL) + return 0; + } + if (sc_data[SC_ROKISWEIL].timer != -1) + { + if (skill_num == BD_ADAPTATION) + return 0; + } + if (sd->sc_data[SC_DIVINA].timer != -1 || + sd->sc_data[SC_ROKISWEIL].timer != -1 || + (sd->sc_data[SC_AUTOCOUNTER].timer != -1 + && sd->skillid != KN_AUTOCOUNTER) + || sd->sc_data[SC_STEELBODY].timer != -1 + || sd->sc_data[SC_BERSERK].timer != -1) + { + return 0; /* 状態異常や沈黙など */ + } - if(!skill_check_condition(sd,0)) return 0; + if (sc_data[SC_BLADESTOP].timer != -1) + { + int lv = sc_data[SC_BLADESTOP].val1; + if (sc_data[SC_BLADESTOP].val2 == 1) + return 0; //白羽された側なのでダメ + if (lv == 1) + return 0; + if (lv == 2 && skill_num != MO_FINGEROFFENSIVE) + return 0; + if (lv == 3 && skill_num != MO_FINGEROFFENSIVE + && skill_num != MO_INVESTIGATE) + return 0; + if (lv == 4 && skill_num != MO_FINGEROFFENSIVE + && skill_num != MO_INVESTIGATE && skill_num != MO_CHAINCOMBO) + return 0; + if (lv == 5 && skill_num != MO_FINGEROFFENSIVE + && skill_num != MO_INVESTIGATE && skill_num != MO_CHAINCOMBO + && skill_num != MO_EXTREMITYFIST) + return 0; + } + } - /* 射程と障害物チェック */ - range = skill_get_range(skill_num,skill_lv); - if(range < 0) - range = battle_get_range(&sd->bl) - (range + 1); - if(!battle_check_range(&sd->bl,bl,range) ) - return 0; + if (sd->status.option & 4 && skill_num == TF_HIDING) + return 0; + if (sd->status.option & 2 && skill_num != TF_HIDING + && skill_num != AS_GRIMTOOTH && skill_num != RG_BACKSTAP + && skill_num != RG_RAID) + return 0; - if(bl->type==BL_PC) { - target_sd=(struct map_session_data*)bl; - if(target_sd && skill_num == ALL_RESURRECTION && !pc_isdead(target_sd)) - return 0; - } - if((skill_num != MO_CHAINCOMBO && - skill_num != MO_COMBOFINISH && - skill_num != MO_EXTREMITYFIST && - skill_num != CH_TIGERFIST && - skill_num != CH_CHAINCRUSH) || - (skill_num == MO_EXTREMITYFIST && sd->state.skill_flag) ) - pc_stopattack(sd); - - casttime=skill_castfix(&sd->bl, skill_get_cast( skill_num,skill_lv) ); - if(skill_num != SA_MAGICROD) - delay=skill_delayfix(&sd->bl, skill_get_delay( skill_num,skill_lv) ); - sd->state.skillcastcancel = skill_db[skill_num].castcancel; - - switch(skill_num){ /* 何か特殊な処理が必要 */ -// case AL_HEAL: /* ヒール */ -// if(battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))) -// forcecast=1; /* ヒールアタックなら詠唱エフェクト有り */ -// break; - case ALL_RESURRECTION: /* リザレクション */ - if(bl->type != BL_PC && battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))){ /* 敵がアンデッドなら */ - forcecast=1; /* ターンアンデットと同じ詠唱時間 */ - casttime=skill_castfix(&sd->bl, skill_get_cast(PR_TURNUNDEAD,skill_lv) ); - } - break; - case MO_FINGEROFFENSIVE: /* 指弾 */ - casttime += casttime * ((skill_lv > sd->spiritball)? sd->spiritball:skill_lv); - break; - case MO_CHAINCOMBO: /*連打掌*/ - target_id = sd->attacktarget; - if( sc_data && sc_data[SC_BLADESTOP].timer!=-1 ){ - struct block_list *tbl; - if((tbl=(struct block_list *)sc_data[SC_BLADESTOP].val4) == NULL) //ターゲットがいない? - return 0; - target_id = tbl->id; - } - break; - case MO_COMBOFINISH: /*猛龍拳*/ - case CH_TIGERFIST: /* 伏虎拳 */ - case CH_CHAINCRUSH: /* 連柱崩撃 */ - target_id = sd->attacktarget; - break; - -// -- moonsoul (altered to allow proper usage of extremity from new champion combos) -// - case MO_EXTREMITYFIST: /*阿修羅覇鳳拳*/ - if(sc_data && sc_data[SC_COMBO].timer != -1 && (sc_data[SC_COMBO].val1 == MO_COMBOFINISH || sc_data[SC_COMBO].val1 == CH_CHAINCRUSH)) { - casttime = 0; - target_id = sd->attacktarget; - } - forcecast=1; - break; - case SA_MAGICROD: - case SA_SPELLBREAKER: - forcecast=1; - break; - case WE_MALE: - case WE_FEMALE: - { - struct map_session_data *p_sd = NULL; - if((p_sd = pc_get_partner(sd)) == NULL) - return 0; - target_id = p_sd->bl.id; - //rangeをもう1回検査 - range = skill_get_range(skill_num,skill_lv); - if(range < 0) - range = battle_get_range(&sd->bl) - (range + 1); - if(!battle_check_range(&sd->bl,&p_sd->bl,range) ){ - return 0; - } - } - break; - case AS_SPLASHER: /* ベナムスプラッシャー */ - { - struct status_change *t_sc_data = battle_get_sc_data(bl); - if(t_sc_data && t_sc_data[SC_POISON].timer==-1){ - clif_skill_fail(sd,skill_num,0,10); - return 0; - } - } - break; - case PF_MEMORIZE: /* メモライズ */ - casttime = 12000; - break; + if (map[sd->bl.m].flag.gvg) + { //GvGで使用できないスキル + switch (skill_num) + { + case SM_ENDURE: + case AL_TELEPORT: + case AL_WARP: + case WZ_ICEWALL: + case TF_BACKSLIDING: + case LK_BERSERK: + case HP_BASILICA: + case ST_CHASEWALK: + return 0; + } + } + + /* 演奏/ダンス中 */ + if (sc_data && sc_data[SC_DANCING].timer != -1) + { +// if(battle_config.pc_skill_log) +// printf("dancing! %d\n",skill_num); + if (sc_data[SC_DANCING].val4 && skill_num != BD_ADAPTATION) //合奏中はアドリブ以外不可 + return 0; + if (skill_num != BD_ADAPTATION && skill_num != BA_MUSICALSTRIKE + && skill_num != DC_THROWARROW) + { + return 0; + } + } - } + if (skill_get_inf2 (skill_num) & 0x200 && sd->bl.id == target_id) + return 0; + //直前のスキルが何か覚える必要のあるスキル + switch (skill_num) + { + case SA_CASTCANCEL: + if (sd->skillid != skill_num) + { //キャストキャンセル自体は覚えない + sd->skillid_old = sd->skillid; + sd->skilllv_old = sd->skilllv; + break; + } + case BD_ENCORE: /* アンコール */ + if (!sd->skillid_dance) + { //前回使用した踊りがないとだめ + clif_skill_fail (sd, skill_num, 0, 0); + return 0; + } + else + { + sd->skillid_old = skill_num; + } + break; + } + + sd->skillid = skill_num; + sd->skilllv = skill_lv; + + switch (skill_num) + { //事前にレベルが変わったりするスキル + case BD_LULLABY: /* 子守歌 */ + case BD_RICHMANKIM: /* ニヨルドの宴 */ + case BD_ETERNALCHAOS: /* 永遠の混沌 */ + case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ + case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ + case BD_ROKISWEIL: /* ロキの叫び */ + case BD_INTOABYSS: /* 深淵の中に */ + case BD_SIEGFRIED: /* 不死身のジークフリード */ + case BD_RAGNAROK: /* 神々の黄昏 */ + case CG_MOONLIT: /* 月明りの泉に落ちる花びら */ + { + int range = 1; + int c = 0; + map_foreachinarea (skill_check_condition_char_sub, sd->bl.m, + sd->bl.x - range, sd->bl.y - range, + sd->bl.x + range, sd->bl.y + range, BL_PC, + &sd->bl, &c); + if (c < 1) + { + clif_skill_fail (sd, skill_num, 0, 0); + return 0; + } + else if (c == 99) + { //相方不要設定だった + ; + } + else + { + sd->skilllv = (c + skill_lv) / 2; + } + } + break; + } - //メモライズ状態ならキャストタイムが1/3 - if(sc_data && sc_data[SC_MEMORIZE].timer != -1 && casttime > 0){ - casttime = casttime/3; - if((--sc_data[SC_MEMORIZE].val2)<=0) - skill_status_change_end(&sd->bl, SC_MEMORIZE, -1); - } + if (!skill_check_condition (sd, 0)) + return 0; - if(battle_config.pc_skill_log) - printf("PC %d skill use target_id=%d skill=%d lv=%d cast=%d\n",sd->bl.id,target_id,skill_num,skill_lv,casttime); + /* 射程と障害物チェック */ + range = skill_get_range (skill_num, skill_lv); + if (range < 0) + range = battle_get_range (&sd->bl) - (range + 1); + if (!battle_check_range (&sd->bl, bl, range)) + return 0; -// if(sd->skillitem == skill_num) -// casttime = delay = 0; + if (bl->type == BL_PC) + { + target_sd = (struct map_session_data *) bl; + if (target_sd && skill_num == ALL_RESURRECTION + && !pc_isdead (target_sd)) + return 0; + } + if ((skill_num != MO_CHAINCOMBO && + skill_num != MO_COMBOFINISH && + skill_num != MO_EXTREMITYFIST && + skill_num != CH_TIGERFIST && + skill_num != CH_CHAINCRUSH) || + (skill_num == MO_EXTREMITYFIST && sd->state.skill_flag)) + pc_stopattack (sd); + + casttime = skill_castfix (&sd->bl, skill_get_cast (skill_num, skill_lv)); + if (skill_num != SA_MAGICROD) + delay = + skill_delayfix (&sd->bl, skill_get_delay (skill_num, skill_lv)); + sd->state.skillcastcancel = skill_db[skill_num].castcancel; + + switch (skill_num) + { /* 何か特殊な処理が必要 */ +// case AL_HEAL: /* ヒール */ +// if(battle_check_undead(battle_get_race(bl),battle_get_elem_type(bl))) +// forcecast=1; /* ヒールアタックなら詠唱エフェクト有り */ +// break; + case ALL_RESURRECTION: /* リザレクション */ + if (bl->type != BL_PC + && battle_check_undead (battle_get_race (bl), + battle_get_elem_type (bl))) + { /* 敵がアンデッドなら */ + forcecast = 1; /* ターンアンデットと同じ詠唱時間 */ + casttime = + skill_castfix (&sd->bl, + skill_get_cast (PR_TURNUNDEAD, skill_lv)); + } + break; + case MO_FINGEROFFENSIVE: /* 指弾 */ + casttime += + casttime * + ((skill_lv > sd->spiritball) ? sd->spiritball : skill_lv); + break; + case MO_CHAINCOMBO: /*連打掌 */ + target_id = sd->attacktarget; + if (sc_data && sc_data[SC_BLADESTOP].timer != -1) + { + struct block_list *tbl; + if ((tbl = (struct block_list *) sc_data[SC_BLADESTOP].val4) == NULL) //ターゲットがいない? + return 0; + target_id = tbl->id; + } + break; + case MO_COMBOFINISH: /*猛龍拳 */ + case CH_TIGERFIST: /* 伏虎拳 */ + case CH_CHAINCRUSH: /* 連柱崩撃 */ + target_id = sd->attacktarget; + break; - if( casttime>0 || forcecast ){ /* 詠唱が必要 */ - struct mob_data *md; - clif_skillcasting( &sd->bl, - sd->bl.id, target_id, 0,0, skill_num,casttime); +// -- moonsoul (altered to allow proper usage of extremity from new champion combos) +// + case MO_EXTREMITYFIST: /*阿修羅覇鳳拳 */ + if (sc_data && sc_data[SC_COMBO].timer != -1 + && (sc_data[SC_COMBO].val1 == MO_COMBOFINISH + || sc_data[SC_COMBO].val1 == CH_CHAINCRUSH)) + { + casttime = 0; + target_id = sd->attacktarget; + } + forcecast = 1; + break; + case SA_MAGICROD: + case SA_SPELLBREAKER: + forcecast = 1; + break; + case WE_MALE: + case WE_FEMALE: + { + struct map_session_data *p_sd = NULL; + if ((p_sd = pc_get_partner (sd)) == NULL) + return 0; + target_id = p_sd->bl.id; + //rangeをもう1回検査 + range = skill_get_range (skill_num, skill_lv); + if (range < 0) + range = battle_get_range (&sd->bl) - (range + 1); + if (!battle_check_range (&sd->bl, &p_sd->bl, range)) + { + return 0; + } + } + break; + case AS_SPLASHER: /* ベナムスプラッシャー */ + { + struct status_change *t_sc_data = battle_get_sc_data (bl); + if (t_sc_data && t_sc_data[SC_POISON].timer == -1) + { + clif_skill_fail (sd, skill_num, 0, 10); + return 0; + } + } + break; + case PF_MEMORIZE: /* メモライズ */ + casttime = 12000; + break; - /* 詠唱反応モンスター */ - if( bl->type==BL_MOB && (md=(struct mob_data *)bl) && mob_db[md->class].mode&0x10 && - md->state.state!=MS_ATTACK && sd->invincible_timer == -1){ - md->target_id=sd->bl.id; - md->state.targettype = ATTACKABLE; - md->min_chase=13; - } - } + } + + //メモライズ状態ならキャストタイムが1/3 + if (sc_data && sc_data[SC_MEMORIZE].timer != -1 && casttime > 0) + { + casttime = casttime / 3; + if ((--sc_data[SC_MEMORIZE].val2) <= 0) + skill_status_change_end (&sd->bl, SC_MEMORIZE, -1); + } + + if (battle_config.pc_skill_log) + printf ("PC %d skill use target_id=%d skill=%d lv=%d cast=%d\n", + sd->bl.id, target_id, skill_num, skill_lv, casttime); + +// if(sd->skillitem == skill_num) +// casttime = delay = 0; + + if (casttime > 0 || forcecast) + { /* 詠唱が必要 */ + struct mob_data *md; + clif_skillcasting (&sd->bl, + sd->bl.id, target_id, 0, 0, skill_num, casttime); + + /* 詠唱反応モンスター */ + if (bl->type == BL_MOB && (md = (struct mob_data *) bl) + && mob_db[md->class].mode & 0x10 && md->state.state != MS_ATTACK + && sd->invincible_timer == -1) + { + md->target_id = sd->bl.id; + md->state.targettype = ATTACKABLE; + md->min_chase = 13; + } + } - if( casttime<=0 ) /* 詠唱の無いものはキャンセルされない */ - sd->state.skillcastcancel=0; + if (casttime <= 0) /* 詠唱の無いものはキャンセルされない */ + sd->state.skillcastcancel = 0; - sd->skilltarget = target_id; + sd->skilltarget = target_id; /* sd->cast_target_bl = bl; */ - sd->skillx = 0; - sd->skilly = 0; - sd->canact_tick = tick + casttime + delay; - sd->canmove_tick = tick; - if(!(battle_config.pc_cloak_check_type&2) && sc_data && sc_data[SC_CLOAKING].timer != -1 && sd->skillid != AS_CLOAKING) - skill_status_change_end(&sd->bl,SC_CLOAKING,-1); - if(casttime > 0) { - sd->skilltimer = add_timer( tick+casttime, skill_castend_id, sd->bl.id, 0 ); - if((skill = pc_checkskill(sd,SA_FREECAST)) > 0) { - sd->prev_speed = sd->speed; - sd->speed = sd->speed*(175 - skill*5)/100; - clif_updatestatus(sd,SP_SPEED); - } - else - pc_stop_walking(sd,0); - } - else { - if(skill_num != SA_CASTCANCEL) - sd->skilltimer = -1; - skill_castend_id(sd->skilltimer,tick,sd->bl.id,0); - } - - //マジックパワーの効果終了 - if(sc_data && sc_data[SC_MAGICPOWER].timer != -1 && skill_num != HW_MAGICPOWER) - skill_status_change_end(&sd->bl,SC_MAGICPOWER,-1); - - return 0; + sd->skillx = 0; + sd->skilly = 0; + sd->canact_tick = tick + casttime + delay; + sd->canmove_tick = tick; + if (!(battle_config.pc_cloak_check_type & 2) && sc_data + && sc_data[SC_CLOAKING].timer != -1 && sd->skillid != AS_CLOAKING) + skill_status_change_end (&sd->bl, SC_CLOAKING, -1); + if (casttime > 0) + { + sd->skilltimer = + add_timer (tick + casttime, skill_castend_id, sd->bl.id, 0); + if ((skill = pc_checkskill (sd, SA_FREECAST)) > 0) + { + sd->prev_speed = sd->speed; + sd->speed = sd->speed * (175 - skill * 5) / 100; + clif_updatestatus (sd, SP_SPEED); + } + else + pc_stop_walking (sd, 0); + } + else + { + if (skill_num != SA_CASTCANCEL) + sd->skilltimer = -1; + skill_castend_id (sd->skilltimer, tick, sd->bl.id, 0); + } + + //マジックパワーの効果終了 + if (sc_data && sc_data[SC_MAGICPOWER].timer != -1 + && skill_num != HW_MAGICPOWER) + skill_status_change_end (&sd->bl, SC_MAGICPOWER, -1); + + return 0; } /*========================================== * スキル使用(場所指定) *------------------------------------------ */ -int skill_use_pos( struct map_session_data *sd, - int skill_x, int skill_y, int skill_num, int skill_lv) +int skill_use_pos (struct map_session_data *sd, + int skill_x, int skill_y, int skill_num, int skill_lv) { - struct block_list bl; - struct status_change *sc_data; - unsigned int tick; - int casttime=0,delay=0,skill,range; + struct block_list bl; + struct status_change *sc_data; + unsigned int tick; + int casttime = 0, delay = 0, skill, range; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - if(pc_isdead(sd)) - return 0; + if (pc_isdead (sd)) + return 0; - if (skillnotok(skill_num, sd)) // [MoueJstr] - return 0; + if (skillnotok (skill_num, sd)) // [MoueJstr] + return 0; - sc_data=sd->sc_data; - - if( sd->opt1>0 ) - return 0; - if(sc_data){ - if( sc_data[SC_DIVINA].timer!=-1 || - sc_data[SC_ROKISWEIL].timer!=-1 || - sc_data[SC_AUTOCOUNTER].timer != -1 || - sc_data[SC_STEELBODY].timer != -1 || - sc_data[SC_DANCING].timer!=-1 || - sc_data[SC_BERSERK].timer != -1 ) - return 0; /* 状態異常や沈黙など */ - } + sc_data = sd->sc_data; - if(sd->status.option&2) - return 0; - - if(map[sd->bl.m].flag.gvg && (skill_num == SM_ENDURE || skill_num == AL_TELEPORT || skill_num == AL_WARP || - skill_num == WZ_ICEWALL || skill_num == TF_BACKSLIDING)) - return 0; - - sd->skillid = skill_num; - sd->skilllv = skill_lv; - sd->skillx = skill_x; - sd->skilly = skill_y; - if(!skill_check_condition(sd,0)) return 0; - - /* 射程と障害物チェック */ - bl.type = BL_NUL; - bl.m = sd->bl.m; - bl.x = skill_x; - bl.y = skill_y; - range = skill_get_range(skill_num,skill_lv); - if(range < 0) - range = battle_get_range(&sd->bl) - (range + 1); - if(!battle_check_range(&sd->bl,&bl,range) ) - return 0; - - pc_stopattack(sd); - - casttime=skill_castfix(&sd->bl, skill_get_cast( skill_num,skill_lv) ); - delay=skill_delayfix(&sd->bl, skill_get_delay( skill_num,skill_lv) ); - sd->state.skillcastcancel = skill_db[skill_num].castcancel; - - if(battle_config.pc_skill_log) - printf("PC %d skill use target_pos=(%d,%d) skill=%d lv=%d cast=%d\n",sd->bl.id,skill_x,skill_y,skill_num,skill_lv,casttime); - -// if(sd->skillitem == skill_num) -// casttime = delay = 0; - //メモライズ状態ならキャストタイムが1/3 - if(sc_data && sc_data[SC_MEMORIZE].timer != -1 && casttime > 0){ - casttime = casttime/3; - if((--sc_data[SC_MEMORIZE].val2)<=0) - skill_status_change_end(&sd->bl, SC_MEMORIZE, -1); - } + if (sd->opt1 > 0) + return 0; + if (sc_data) + { + if (sc_data[SC_DIVINA].timer != -1 || + sc_data[SC_ROKISWEIL].timer != -1 || + sc_data[SC_AUTOCOUNTER].timer != -1 || + sc_data[SC_STEELBODY].timer != -1 || + sc_data[SC_DANCING].timer != -1 || + sc_data[SC_BERSERK].timer != -1) + return 0; /* 状態異常や沈黙など */ + } + + if (sd->status.option & 2) + return 0; - if( casttime>0 ) /* 詠唱が必要 */ - clif_skillcasting( &sd->bl, - sd->bl.id, 0, skill_x,skill_y, skill_num,casttime); + if (map[sd->bl.m].flag.gvg + && (skill_num == SM_ENDURE || skill_num == AL_TELEPORT + || skill_num == AL_WARP || skill_num == WZ_ICEWALL + || skill_num == TF_BACKSLIDING)) + return 0; - if( casttime<=0 ) /* 詠唱の無いものはキャンセルされない */ - sd->state.skillcastcancel=0; + sd->skillid = skill_num; + sd->skilllv = skill_lv; + sd->skillx = skill_x; + sd->skilly = skill_y; + if (!skill_check_condition (sd, 0)) + return 0; - sd->skilltarget = 0; -/* sd->cast_target_bl = NULL; */ - tick=gettick(); - sd->canact_tick = tick + casttime + delay; - sd->canmove_tick = tick; - if(!(battle_config.pc_cloak_check_type&2) && sc_data && sc_data[SC_CLOAKING].timer != -1) - skill_status_change_end(&sd->bl,SC_CLOAKING,-1); - if(casttime > 0) { - sd->skilltimer = add_timer( tick+casttime, skill_castend_pos, sd->bl.id, 0 ); - if((skill = pc_checkskill(sd,SA_FREECAST)) > 0) { - sd->prev_speed = sd->speed; - sd->speed = sd->speed*(175 - skill*5)/100; - clif_updatestatus(sd,SP_SPEED); - } - else - pc_stop_walking(sd,0); - } - else { - sd->skilltimer = -1; - skill_castend_pos(sd->skilltimer,tick,sd->bl.id,0); - } - //マジックパワーの効果終了 - if(sc_data && sc_data[SC_MAGICPOWER].timer != -1 && skill_num != HW_MAGICPOWER) - skill_status_change_end(&sd->bl,SC_MAGICPOWER,-1); + /* 射程と障害物チェック */ + bl.type = BL_NUL; + bl.m = sd->bl.m; + bl.x = skill_x; + bl.y = skill_y; + range = skill_get_range (skill_num, skill_lv); + if (range < 0) + range = battle_get_range (&sd->bl) - (range + 1); + if (!battle_check_range (&sd->bl, &bl, range)) + return 0; - return 0; + pc_stopattack (sd); + + casttime = skill_castfix (&sd->bl, skill_get_cast (skill_num, skill_lv)); + delay = skill_delayfix (&sd->bl, skill_get_delay (skill_num, skill_lv)); + sd->state.skillcastcancel = skill_db[skill_num].castcancel; + + if (battle_config.pc_skill_log) + printf ("PC %d skill use target_pos=(%d,%d) skill=%d lv=%d cast=%d\n", + sd->bl.id, skill_x, skill_y, skill_num, skill_lv, casttime); + +// if(sd->skillitem == skill_num) +// casttime = delay = 0; + //メモライズ状態ならキャストタイムが1/3 + if (sc_data && sc_data[SC_MEMORIZE].timer != -1 && casttime > 0) + { + casttime = casttime / 3; + if ((--sc_data[SC_MEMORIZE].val2) <= 0) + skill_status_change_end (&sd->bl, SC_MEMORIZE, -1); + } + + if (casttime > 0) /* 詠唱が必要 */ + clif_skillcasting (&sd->bl, + sd->bl.id, 0, skill_x, skill_y, skill_num, + casttime); + + if (casttime <= 0) /* 詠唱の無いものはキャンセルされない */ + sd->state.skillcastcancel = 0; + + sd->skilltarget = 0; +/* sd->cast_target_bl = NULL; */ + tick = gettick (); + sd->canact_tick = tick + casttime + delay; + sd->canmove_tick = tick; + if (!(battle_config.pc_cloak_check_type & 2) && sc_data + && sc_data[SC_CLOAKING].timer != -1) + skill_status_change_end (&sd->bl, SC_CLOAKING, -1); + if (casttime > 0) + { + sd->skilltimer = + add_timer (tick + casttime, skill_castend_pos, sd->bl.id, 0); + if ((skill = pc_checkskill (sd, SA_FREECAST)) > 0) + { + sd->prev_speed = sd->speed; + sd->speed = sd->speed * (175 - skill * 5) / 100; + clif_updatestatus (sd, SP_SPEED); + } + else + pc_stop_walking (sd, 0); + } + else + { + sd->skilltimer = -1; + skill_castend_pos (sd->skilltimer, tick, sd->bl.id, 0); + } + //マジックパワーの効果終了 + if (sc_data && sc_data[SC_MAGICPOWER].timer != -1 + && skill_num != HW_MAGICPOWER) + skill_status_change_end (&sd->bl, SC_MAGICPOWER, -1); + + return 0; } /*========================================== * スキル詠唱キャンセル *------------------------------------------ */ -int skill_castcancel(struct block_list *bl,int type) +int skill_castcancel (struct block_list *bl, int type) { - int inf; - int ret=0; - - nullpo_retr(0, bl); - - if(bl->type==BL_PC){ - struct map_session_data *sd=(struct map_session_data *)bl; - unsigned long tick=gettick(); - nullpo_retr(0, sd); - sd->canact_tick=tick; - sd->canmove_tick = tick; - if( sd->skilltimer!=-1){ - if(pc_checkskill(sd,SA_FREECAST) > 0) { - sd->speed = sd->prev_speed; - clif_updatestatus(sd,SP_SPEED); - } - if(!type) { - if((inf = skill_get_inf( sd->skillid )) == 2 || inf == 32) - ret=delete_timer( sd->skilltimer, skill_castend_pos ); - else - ret=delete_timer( sd->skilltimer, skill_castend_id ); - if(ret<0) - printf("delete timer error : skillid : %d\n",sd->skillid); - } - else { - if((inf = skill_get_inf( sd->skillid_old )) == 2 || inf == 32) - ret=delete_timer( sd->skilltimer, skill_castend_pos ); - else - ret=delete_timer( sd->skilltimer, skill_castend_id ); - if(ret<0) - printf("delete timer error : skillid : %d\n",sd->skillid_old); - } - sd->skilltimer=-1; - clif_skillcastcancel(bl); - } + int inf; + int ret = 0; - return 0; - }else if(bl->type==BL_MOB){ - struct mob_data *md=(struct mob_data *)bl; - nullpo_retr(0, md); - if( md->skilltimer!=-1 ){ - if((inf = skill_get_inf( md->skillid )) == 2 || inf == 32) - ret=delete_timer( md->skilltimer, mobskill_castend_pos ); - else - ret=delete_timer( md->skilltimer, mobskill_castend_id ); - md->skilltimer=-1; - clif_skillcastcancel(bl); - } - if(ret<0) - printf("delete timer error : skillid : %d\n",md->skillid); - return 0; - } - return 1; + nullpo_retr (0, bl); + + if (bl->type == BL_PC) + { + struct map_session_data *sd = (struct map_session_data *) bl; + unsigned long tick = gettick (); + nullpo_retr (0, sd); + sd->canact_tick = tick; + sd->canmove_tick = tick; + if (sd->skilltimer != -1) + { + if (pc_checkskill (sd, SA_FREECAST) > 0) + { + sd->speed = sd->prev_speed; + clif_updatestatus (sd, SP_SPEED); + } + if (!type) + { + if ((inf = skill_get_inf (sd->skillid)) == 2 || inf == 32) + ret = delete_timer (sd->skilltimer, skill_castend_pos); + else + ret = delete_timer (sd->skilltimer, skill_castend_id); + if (ret < 0) + printf ("delete timer error : skillid : %d\n", + sd->skillid); + } + else + { + if ((inf = skill_get_inf (sd->skillid_old)) == 2 || inf == 32) + ret = delete_timer (sd->skilltimer, skill_castend_pos); + else + ret = delete_timer (sd->skilltimer, skill_castend_id); + if (ret < 0) + printf ("delete timer error : skillid : %d\n", + sd->skillid_old); + } + sd->skilltimer = -1; + clif_skillcastcancel (bl); + } + + return 0; + } + else if (bl->type == BL_MOB) + { + struct mob_data *md = (struct mob_data *) bl; + nullpo_retr (0, md); + if (md->skilltimer != -1) + { + if ((inf = skill_get_inf (md->skillid)) == 2 || inf == 32) + ret = delete_timer (md->skilltimer, mobskill_castend_pos); + else + ret = delete_timer (md->skilltimer, mobskill_castend_id); + md->skilltimer = -1; + clif_skillcastcancel (bl); + } + if (ret < 0) + printf ("delete timer error : skillid : %d\n", md->skillid); + return 0; + } + return 1; } + /*========================================= * ブランディッシュスピア 初期範囲決定 *---------------------------------------- */ -void skill_brandishspear_first(struct square *tc,int dir,int x,int y){ - - nullpo_retv(tc); - - if(dir == 0){ - tc->val1[0]=x-2; - tc->val1[1]=x-1; - tc->val1[2]=x; - tc->val1[3]=x+1; - tc->val1[4]=x+2; - tc->val2[0]= - tc->val2[1]= - tc->val2[2]= - tc->val2[3]= - tc->val2[4]=y-1; - } - else if(dir==2){ - tc->val1[0]= - tc->val1[1]= - tc->val1[2]= - tc->val1[3]= - tc->val1[4]=x+1; - tc->val2[0]=y+2; - tc->val2[1]=y+1; - tc->val2[2]=y; - tc->val2[3]=y-1; - tc->val2[4]=y-2; - } - else if(dir==4){ - tc->val1[0]=x-2; - tc->val1[1]=x-1; - tc->val1[2]=x; - tc->val1[3]=x+1; - tc->val1[4]=x+2; - tc->val2[0]= - tc->val2[1]= - tc->val2[2]= - tc->val2[3]= - tc->val2[4]=y+1; - } - else if(dir==6){ - tc->val1[0]= - tc->val1[1]= - tc->val1[2]= - tc->val1[3]= - tc->val1[4]=x-1; - tc->val2[0]=y+2; - tc->val2[1]=y+1; - tc->val2[2]=y; - tc->val2[3]=y-1; - tc->val2[4]=y-2; - } - else if(dir==1){ - tc->val1[0]=x-1; - tc->val1[1]=x; - tc->val1[2]=x+1; - tc->val1[3]=x+2; - tc->val1[4]=x+3; - tc->val2[0]=y-4; - tc->val2[1]=y-3; - tc->val2[2]=y-1; - tc->val2[3]=y; - tc->val2[4]=y+1; - } - else if(dir==3){ - tc->val1[0]=x+3; - tc->val1[1]=x+2; - tc->val1[2]=x+1; - tc->val1[3]=x; - tc->val1[4]=x-1; - tc->val2[0]=y-1; - tc->val2[1]=y; - tc->val2[2]=y+1; - tc->val2[3]=y+2; - tc->val2[4]=y+3; - } - else if(dir==5){ - tc->val1[0]=x+1; - tc->val1[1]=x; - tc->val1[2]=x-1; - tc->val1[3]=x-2; - tc->val1[4]=x-3; - tc->val2[0]=y+3; - tc->val2[1]=y+2; - tc->val2[2]=y+1; - tc->val2[3]=y; - tc->val2[4]=y-1; - } - else if(dir==7){ - tc->val1[0]=x-3; - tc->val1[1]=x-2; - tc->val1[2]=x-1; - tc->val1[3]=x; - tc->val1[4]=x+1; - tc->val2[1]=y; - tc->val2[0]=y+1; - tc->val2[2]=y-1; - tc->val2[3]=y-2; - tc->val2[4]=y-3; - } +void skill_brandishspear_first (struct square *tc, int dir, int x, int y) +{ + + nullpo_retv (tc); + + if (dir == 0) + { + tc->val1[0] = x - 2; + tc->val1[1] = x - 1; + tc->val1[2] = x; + tc->val1[3] = x + 1; + tc->val1[4] = x + 2; + tc->val2[0] = + tc->val2[1] = tc->val2[2] = tc->val2[3] = tc->val2[4] = y - 1; + } + else if (dir == 2) + { + tc->val1[0] = + tc->val1[1] = tc->val1[2] = tc->val1[3] = tc->val1[4] = x + 1; + tc->val2[0] = y + 2; + tc->val2[1] = y + 1; + tc->val2[2] = y; + tc->val2[3] = y - 1; + tc->val2[4] = y - 2; + } + else if (dir == 4) + { + tc->val1[0] = x - 2; + tc->val1[1] = x - 1; + tc->val1[2] = x; + tc->val1[3] = x + 1; + tc->val1[4] = x + 2; + tc->val2[0] = + tc->val2[1] = tc->val2[2] = tc->val2[3] = tc->val2[4] = y + 1; + } + else if (dir == 6) + { + tc->val1[0] = + tc->val1[1] = tc->val1[2] = tc->val1[3] = tc->val1[4] = x - 1; + tc->val2[0] = y + 2; + tc->val2[1] = y + 1; + tc->val2[2] = y; + tc->val2[3] = y - 1; + tc->val2[4] = y - 2; + } + else if (dir == 1) + { + tc->val1[0] = x - 1; + tc->val1[1] = x; + tc->val1[2] = x + 1; + tc->val1[3] = x + 2; + tc->val1[4] = x + 3; + tc->val2[0] = y - 4; + tc->val2[1] = y - 3; + tc->val2[2] = y - 1; + tc->val2[3] = y; + tc->val2[4] = y + 1; + } + else if (dir == 3) + { + tc->val1[0] = x + 3; + tc->val1[1] = x + 2; + tc->val1[2] = x + 1; + tc->val1[3] = x; + tc->val1[4] = x - 1; + tc->val2[0] = y - 1; + tc->val2[1] = y; + tc->val2[2] = y + 1; + tc->val2[3] = y + 2; + tc->val2[4] = y + 3; + } + else if (dir == 5) + { + tc->val1[0] = x + 1; + tc->val1[1] = x; + tc->val1[2] = x - 1; + tc->val1[3] = x - 2; + tc->val1[4] = x - 3; + tc->val2[0] = y + 3; + tc->val2[1] = y + 2; + tc->val2[2] = y + 1; + tc->val2[3] = y; + tc->val2[4] = y - 1; + } + else if (dir == 7) + { + tc->val1[0] = x - 3; + tc->val1[1] = x - 2; + tc->val1[2] = x - 1; + tc->val1[3] = x; + tc->val1[4] = x + 1; + tc->val2[1] = y; + tc->val2[0] = y + 1; + tc->val2[2] = y - 1; + tc->val2[3] = y - 2; + tc->val2[4] = y - 3; + } } @@ -7036,139 +8590,189 @@ void skill_brandishspear_first(struct square *tc,int dir,int x,int y){ * ブランディッシュスピア 方向判定 範囲拡張 *----------------------------------------- */ -void skill_brandishspear_dir(struct square *tc,int dir,int are){ - - int c; - - nullpo_retv(tc); - - for(c=0;c<5;c++){ - if(dir==0){ - tc->val2[c]+=are; - }else if(dir==1){ - tc->val1[c]-=are; tc->val2[c]+=are; - }else if(dir==2){ - tc->val1[c]-=are; - }else if(dir==3){ - tc->val1[c]-=are; tc->val2[c]-=are; - }else if(dir==4){ - tc->val2[c]-=are; - }else if(dir==5){ - tc->val1[c]+=are; tc->val2[c]-=are; - }else if(dir==6){ - tc->val1[c]+=are; - }else if(dir==7){ - tc->val1[c]+=are; tc->val2[c]+=are; - } - } +void skill_brandishspear_dir (struct square *tc, int dir, int are) +{ + + int c; + + nullpo_retv (tc); + + for (c = 0; c < 5; c++) + { + if (dir == 0) + { + tc->val2[c] += are; + } + else if (dir == 1) + { + tc->val1[c] -= are; + tc->val2[c] += are; + } + else if (dir == 2) + { + tc->val1[c] -= are; + } + else if (dir == 3) + { + tc->val1[c] -= are; + tc->val2[c] -= are; + } + else if (dir == 4) + { + tc->val2[c] -= are; + } + else if (dir == 5) + { + tc->val1[c] += are; + tc->val2[c] -= are; + } + else if (dir == 6) + { + tc->val1[c] += are; + } + else if (dir == 7) + { + tc->val1[c] += are; + tc->val2[c] += are; + } + } } /*========================================== * ディボーション 有効確認 *------------------------------------------ */ -void skill_devotion(struct map_session_data *md,int target) +void skill_devotion (struct map_session_data *md, int target) { - // 総確認 - int n; - - nullpo_retv(md); - - for(n=0;n<5;n++){ - if(md->dev.val1[n]){ - struct map_session_data *sd = map_id2sd(md->dev.val1[n]); - // 相手が見つからない // 相手をディボしてるのが自分じゃない // 距離が離れてる - if( sd == NULL || (sd->sc_data && (md->bl.id != sd->sc_data[SC_DEVOTION].val1)) || skill_devotion3(&md->bl,md->dev.val1[n])){ - skill_devotion_end(md,sd,n); - } - } - } + // 総確認 + int n; + + nullpo_retv (md); + + for (n = 0; n < 5; n++) + { + if (md->dev.val1[n]) + { + struct map_session_data *sd = map_id2sd (md->dev.val1[n]); + // 相手が見つからない // 相手をディボしてるのが自分じゃない // 距離が離れてる + if (sd == NULL + || (sd->sc_data + && (md->bl.id != sd->sc_data[SC_DEVOTION].val1)) + || skill_devotion3 (&md->bl, md->dev.val1[n])) + { + skill_devotion_end (md, sd, n); + } + } + } } -void skill_devotion2(struct block_list *bl,int crusader) + +void skill_devotion2 (struct block_list *bl, int crusader) { - // 被ディボーションが歩いた時の距離チェック - struct map_session_data *sd = map_id2sd(crusader); + // 被ディボーションが歩いた時の距離チェック + struct map_session_data *sd = map_id2sd (crusader); - nullpo_retv(bl); + nullpo_retv (bl); - if(sd) skill_devotion3(&sd->bl,bl->id); + if (sd) + skill_devotion3 (&sd->bl, bl->id); } -int skill_devotion3(struct block_list *bl,int target) + +int skill_devotion3 (struct block_list *bl, int target) { - // クルセが歩いた時の距離チェック - struct map_session_data *md; - struct map_session_data *sd; - int n,r=0; - - nullpo_retr(1, bl); - - if( (md = (struct map_session_data *)bl) == NULL || (sd = map_id2sd(target)) == NULL ) - return 1; - else - r = distance(bl->x,bl->y,sd->bl.x,sd->bl.y); - - if(pc_checkskill(sd,CR_DEVOTION)+6 < r){ // 許容範囲を超えてた - for(n=0;n<5;n++) - if(md->dev.val1[n]==target) - md->dev.val2[n]=0; // 離れた時は、糸を切るだけ - clif_devotion(md,sd->bl.id); - return 1; - } - return 0; + // クルセが歩いた時の距離チェック + struct map_session_data *md; + struct map_session_data *sd; + int n, r = 0; + + nullpo_retr (1, bl); + + if ((md = (struct map_session_data *) bl) == NULL + || (sd = map_id2sd (target)) == NULL) + return 1; + else + r = distance (bl->x, bl->y, sd->bl.x, sd->bl.y); + + if (pc_checkskill (sd, CR_DEVOTION) + 6 < r) + { // 許容範囲を超えてた + for (n = 0; n < 5; n++) + if (md->dev.val1[n] == target) + md->dev.val2[n] = 0; // 離れた時は、糸を切るだけ + clif_devotion (md, sd->bl.id); + return 1; + } + return 0; } -void skill_devotion_end(struct map_session_data *md,struct map_session_data *sd,int target) +void skill_devotion_end (struct map_session_data *md, + struct map_session_data *sd, int target) { - // クルセと被ディボキャラのリセット - nullpo_retv(md); - nullpo_retv(sd); - - md->dev.val1[target]=md->dev.val2[target]=0; - if(sd && sd->sc_data){ - // skill_status_change_end(sd->bl,SC_DEVOTION,-1); - sd->sc_data[SC_DEVOTION].val1=0; - sd->sc_data[SC_DEVOTION].val2=0; - clif_status_change(&sd->bl,SC_DEVOTION,0); - clif_devotion(md,sd->bl.id); - } + // クルセと被ディボキャラのリセット + nullpo_retv (md); + nullpo_retv (sd); + + md->dev.val1[target] = md->dev.val2[target] = 0; + if (sd && sd->sc_data) + { + // skill_status_change_end(sd->bl,SC_DEVOTION,-1); + sd->sc_data[SC_DEVOTION].val1 = 0; + sd->sc_data[SC_DEVOTION].val2 = 0; + clif_status_change (&sd->bl, SC_DEVOTION, 0); + clif_devotion (md, sd->bl.id); + } } + /*========================================== * オートスペル *------------------------------------------ */ -int skill_autospell(struct map_session_data *sd,int skillid) +int skill_autospell (struct map_session_data *sd, int skillid) { - int skilllv; - int maxlv=1,lv; - - nullpo_retr(0, sd); - - skilllv = pc_checkskill(sd,SA_AUTOSPELL); - - if(skillid==MG_NAPALMBEAT) maxlv=3; - else if(skillid==MG_COLDBOLT || skillid==MG_FIREBOLT || skillid==MG_LIGHTNINGBOLT){ - if(skilllv==2) maxlv=1; - else if(skilllv==3) maxlv=2; - else if(skilllv>=4) maxlv=3; - } - else if(skillid==MG_SOULSTRIKE){ - if(skilllv==5) maxlv=1; - else if(skilllv==6) maxlv=2; - else if(skilllv>=7) maxlv=3; - } - else if(skillid==MG_FIREBALL){ - if(skilllv==8) maxlv=1; - else if(skilllv>=9) maxlv=2; - } - else if(skillid==MG_FROSTDIVER) maxlv=1; - else return 0; + int skilllv; + int maxlv = 1, lv; + + nullpo_retr (0, sd); + + skilllv = pc_checkskill (sd, SA_AUTOSPELL); + + if (skillid == MG_NAPALMBEAT) + maxlv = 3; + else if (skillid == MG_COLDBOLT || skillid == MG_FIREBOLT + || skillid == MG_LIGHTNINGBOLT) + { + if (skilllv == 2) + maxlv = 1; + else if (skilllv == 3) + maxlv = 2; + else if (skilllv >= 4) + maxlv = 3; + } + else if (skillid == MG_SOULSTRIKE) + { + if (skilllv == 5) + maxlv = 1; + else if (skilllv == 6) + maxlv = 2; + else if (skilllv >= 7) + maxlv = 3; + } + else if (skillid == MG_FIREBALL) + { + if (skilllv == 8) + maxlv = 1; + else if (skilllv >= 9) + maxlv = 2; + } + else if (skillid == MG_FROSTDIVER) + maxlv = 1; + else + return 0; - if(maxlv > (lv=pc_checkskill(sd,skillid))) - maxlv = lv; + if (maxlv > (lv = pc_checkskill (sd, skillid))) + maxlv = lv; - skill_status_change_start(&sd->bl,SC_AUTOSPELL,skilllv,skillid,maxlv,0, // val1:スキルID val2:使用最大Lv - skill_get_time(SA_AUTOSPELL,skilllv),0);// にしてみたけどbscriptが書き易い・・・? - return 0; + skill_status_change_start (&sd->bl, SC_AUTOSPELL, skilllv, skillid, maxlv, 0, // val1:スキルID val2:使用最大Lv + skill_get_time (SA_AUTOSPELL, skilllv), 0); // にしてみたけどbscriptが書き易い・・・? + return 0; } /*========================================== @@ -7176,291 +8780,322 @@ int skill_autospell(struct map_session_data *sd,int skillid) *------------------------------------------ */ -static int skill_gangster_count(struct block_list *bl,va_list ap) +static int skill_gangster_count (struct block_list *bl, va_list ap) { - int *c; - struct map_session_data *sd; + int *c; + struct map_session_data *sd; - nullpo_retr(0, bl); - nullpo_retr(0, ap); + nullpo_retr (0, bl); + nullpo_retr (0, ap); - sd=(struct map_session_data*)bl; - c=va_arg(ap,int *); + sd = (struct map_session_data *) bl; + c = va_arg (ap, int *); - if(sd && c && pc_issit(sd) && pc_checkskill(sd,RG_GANGSTER) > 0) - (*c)++; - return 0; + if (sd && c && pc_issit (sd) && pc_checkskill (sd, RG_GANGSTER) > 0) + (*c)++; + return 0; } -static int skill_gangster_in(struct block_list *bl,va_list ap) +static int skill_gangster_in (struct block_list *bl, va_list ap) { - struct map_session_data *sd; + struct map_session_data *sd; - nullpo_retr(0, bl); - nullpo_retr(0, ap); + nullpo_retr (0, bl); + nullpo_retr (0, ap); - sd=(struct map_session_data*)bl; - if(sd && pc_issit(sd) && pc_checkskill(sd,RG_GANGSTER) > 0) - sd->state.gangsterparadise=1; - return 0; + sd = (struct map_session_data *) bl; + if (sd && pc_issit (sd) && pc_checkskill (sd, RG_GANGSTER) > 0) + sd->state.gangsterparadise = 1; + return 0; } -static int skill_gangster_out(struct block_list *bl,va_list ap) +static int skill_gangster_out (struct block_list *bl, va_list ap) { - struct map_session_data *sd; + struct map_session_data *sd; - nullpo_retr(0, bl); - nullpo_retr(0, ap); + nullpo_retr (0, bl); + nullpo_retr (0, ap); - sd=(struct map_session_data*)bl; - if(sd && sd->state.gangsterparadise) - sd->state.gangsterparadise=0; - return 0; + sd = (struct map_session_data *) bl; + if (sd && sd->state.gangsterparadise) + sd->state.gangsterparadise = 0; + return 0; } -int skill_gangsterparadise(struct map_session_data *sd ,int type) +int skill_gangsterparadise (struct map_session_data *sd, int type) { - int range=1; - int c=0; - - nullpo_retr(0, sd); - - if(pc_checkskill(sd,RG_GANGSTER) <= 0) - return 0; - - if(type==1) {/* 座った時の処理 */ - map_foreachinarea(skill_gangster_count,sd->bl.m, - sd->bl.x-range,sd->bl.y-range, - sd->bl.x+range,sd->bl.y+range,BL_PC,&c); - if(c > 0) {/*ギャングスター成功したら自分にもギャングスター属性付与*/ - map_foreachinarea(skill_gangster_in,sd->bl.m, - sd->bl.x-range,sd->bl.y-range, - sd->bl.x+range,sd->bl.y+range,BL_PC); - sd->state.gangsterparadise = 1; - } - return 0; - } - else if(type==0) {/* 立ち上がったときの処理 */ - map_foreachinarea(skill_gangster_count,sd->bl.m, - sd->bl.x-range,sd->bl.y-range, - sd->bl.x+range,sd->bl.y+range,BL_PC,&c); - if(c < 1) - map_foreachinarea(skill_gangster_out,sd->bl.m, - sd->bl.x-range,sd->bl.y-range, - sd->bl.x+range,sd->bl.y+range,BL_PC); - sd->state.gangsterparadise = 0; - return 0; - } - return 0; + int range = 1; + int c = 0; + + nullpo_retr (0, sd); + + if (pc_checkskill (sd, RG_GANGSTER) <= 0) + return 0; + + if (type == 1) + { /* 座った時の処理 */ + map_foreachinarea (skill_gangster_count, sd->bl.m, + sd->bl.x - range, sd->bl.y - range, + sd->bl.x + range, sd->bl.y + range, BL_PC, &c); + if (c > 0) + { /*ギャングスター成功したら自分にもギャングスター属性付与 */ + map_foreachinarea (skill_gangster_in, sd->bl.m, + sd->bl.x - range, sd->bl.y - range, + sd->bl.x + range, sd->bl.y + range, BL_PC); + sd->state.gangsterparadise = 1; + } + return 0; + } + else if (type == 0) + { /* 立ち上がったときの処理 */ + map_foreachinarea (skill_gangster_count, sd->bl.m, + sd->bl.x - range, sd->bl.y - range, + sd->bl.x + range, sd->bl.y + range, BL_PC, &c); + if (c < 1) + map_foreachinarea (skill_gangster_out, sd->bl.m, + sd->bl.x - range, sd->bl.y - range, + sd->bl.x + range, sd->bl.y + range, BL_PC); + sd->state.gangsterparadise = 0; + return 0; + } + return 0; } + /*========================================== * 寒いジョーク・スクリーム判定処理(foreachinarea) *------------------------------------------ */ -int skill_frostjoke_scream(struct block_list *bl,va_list ap) +int skill_frostjoke_scream (struct block_list *bl, va_list ap) { - struct block_list *src; - int skillnum,skilllv; - unsigned int tick; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, src=va_arg(ap,struct block_list*)); - - skillnum=va_arg(ap,int); - skilllv=va_arg(ap,int); - tick=va_arg(ap,unsigned int); - - if(src == bl)//自分には効かない - return 0; - - if(battle_check_target(src,bl,BCT_ENEMY) > 0) - skill_additional_effect(src,bl,skillnum,skilllv,BF_MISC,tick); - else if(battle_check_target(src,bl,BCT_PARTY) > 0) { - if(MRAND(100) < 10)//PTメンバにも低確率でかかる(とりあえず10%) - skill_additional_effect(src,bl,skillnum,skilllv,BF_MISC,tick); - } + struct block_list *src; + int skillnum, skilllv; + unsigned int tick; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, src = va_arg (ap, struct block_list *)); + + skillnum = va_arg (ap, int); + skilllv = va_arg (ap, int); + tick = va_arg (ap, unsigned int); + + if (src == bl) //自分には効かない + return 0; - return 0; + if (battle_check_target (src, bl, BCT_ENEMY) > 0) + skill_additional_effect (src, bl, skillnum, skilllv, BF_MISC, tick); + else if (battle_check_target (src, bl, BCT_PARTY) > 0) + { + if (MRAND (100) < 10) //PTメンバにも低確率でかかる(とりあえず10%) + skill_additional_effect (src, bl, skillnum, skilllv, BF_MISC, + tick); + } + + return 0; } /*========================================== * *------------------------------------------ */ -int skill_attack_area(struct block_list *bl,va_list ap) +int skill_attack_area (struct block_list *bl, va_list ap) { - struct block_list *src,*dsrc; - int atk_type,skillid,skilllv,flag,type; - unsigned int tick; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - - atk_type = va_arg(ap,int); - if((src=va_arg(ap,struct block_list*)) == NULL) - return 0; - if((dsrc=va_arg(ap,struct block_list*)) == NULL) - return 0; - skillid=va_arg(ap,int); - skilllv=va_arg(ap,int); - tick=va_arg(ap,unsigned int); - flag=va_arg(ap,int); - type=va_arg(ap,int); - - if(battle_check_target(dsrc,bl,type) > 0) - skill_attack(atk_type,src,dsrc,bl,skillid,skilllv,tick,flag); - - return 0; + struct block_list *src, *dsrc; + int atk_type, skillid, skilllv, flag, type; + unsigned int tick; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + + atk_type = va_arg (ap, int); + if ((src = va_arg (ap, struct block_list *)) == NULL) + return 0; + if ((dsrc = va_arg (ap, struct block_list *)) == NULL) + return 0; + skillid = va_arg (ap, int); + skilllv = va_arg (ap, int); + tick = va_arg (ap, unsigned int); + flag = va_arg (ap, int); + type = va_arg (ap, int); + + if (battle_check_target (dsrc, bl, type) > 0) + skill_attack (atk_type, src, dsrc, bl, skillid, skilllv, tick, flag); + + return 0; } + /*========================================== * *------------------------------------------ */ -int skill_clear_element_field(struct block_list *bl) +int skill_clear_element_field (struct block_list *bl) { - struct mob_data *md=NULL; - struct map_session_data *sd=NULL; - int i,skillid; - - nullpo_retr(0, bl); - - if(bl->type==BL_MOB) - md=(struct mob_data *)bl; - if(bl->type==BL_PC) - sd=(struct map_session_data *)bl; - - for(i=0;i<MAX_MOBSKILLUNITGROUP;i++){ - if(sd){ - skillid=sd->skillunit[i].skill_id; - if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR) - skill_delunitgroup(&sd->skillunit[i]); - }else if(md){ - skillid=md->skillunit[i].skill_id; - if(skillid==SA_DELUGE||skillid==SA_VOLCANO||skillid==SA_VIOLENTGALE||skillid==SA_LANDPROTECTOR) - skill_delunitgroup(&md->skillunit[i]); - } - } - return 0; + struct mob_data *md = NULL; + struct map_session_data *sd = NULL; + int i, skillid; + + nullpo_retr (0, bl); + + if (bl->type == BL_MOB) + md = (struct mob_data *) bl; + if (bl->type == BL_PC) + sd = (struct map_session_data *) bl; + + for (i = 0; i < MAX_MOBSKILLUNITGROUP; i++) + { + if (sd) + { + skillid = sd->skillunit[i].skill_id; + if (skillid == SA_DELUGE || skillid == SA_VOLCANO + || skillid == SA_VIOLENTGALE || skillid == SA_LANDPROTECTOR) + skill_delunitgroup (&sd->skillunit[i]); + } + else if (md) + { + skillid = md->skillunit[i].skill_id; + if (skillid == SA_DELUGE || skillid == SA_VOLCANO + || skillid == SA_VIOLENTGALE || skillid == SA_LANDPROTECTOR) + skill_delunitgroup (&md->skillunit[i]); + } + } + return 0; } + /*========================================== * ランドプロテクターチェック(foreachinarea) *------------------------------------------ */ -int skill_landprotector(struct block_list *bl, va_list ap ) +int skill_landprotector (struct block_list *bl, va_list ap) { - int skillid; - int *alive; - struct skill_unit *unit; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - - skillid=va_arg(ap,int); - alive=va_arg(ap,int *); - if((unit=(struct skill_unit *)bl) == NULL) - return 0; - - if(skillid==SA_LANDPROTECTOR){ - skill_delunit(unit); - }else{ - if(alive && unit->group->skill_id==SA_LANDPROTECTOR) - (*alive)=0; - } - return 0; + int skillid; + int *alive; + struct skill_unit *unit; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + + skillid = va_arg (ap, int); + alive = va_arg (ap, int *); + if ((unit = (struct skill_unit *) bl) == NULL) + return 0; + + if (skillid == SA_LANDPROTECTOR) + { + skill_delunit (unit); + } + else + { + if (alive && unit->group->skill_id == SA_LANDPROTECTOR) + (*alive) = 0; + } + return 0; } + /*========================================== * イドゥンの林檎の回復処理(foreachinarea) *------------------------------------------ */ -int skill_idun_heal(struct block_list *bl, va_list ap ) +int skill_idun_heal (struct block_list *bl, va_list ap) { - struct skill_unit *unit; - struct skill_unit_group *sg; - int heal; + struct skill_unit *unit; + struct skill_unit_group *sg; + int heal; - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, unit = va_arg(ap,struct skill_unit *)); - nullpo_retr(0, sg = unit->group); + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, unit = va_arg (ap, struct skill_unit *)); + nullpo_retr (0, sg = unit->group); - heal=30+sg->skill_lv*5+((sg->val1)>>16)*5+((sg->val1)&0xfff)/2; + heal = + 30 + sg->skill_lv * 5 + ((sg->val1) >> 16) * 5 + + ((sg->val1) & 0xfff) / 2; - if(bl->type == BL_SKILL || bl->id == sg->src_id) - return 0; + if (bl->type == BL_SKILL || bl->id == sg->src_id) + return 0; - if(bl->type == BL_PC || bl->type == BL_MOB){ - clif_skill_nodamage(&unit->bl,bl,AL_HEAL,heal,1); - battle_heal(NULL,bl,heal,0,0); - } - return 0; + if (bl->type == BL_PC || bl->type == BL_MOB) + { + clif_skill_nodamage (&unit->bl, bl, AL_HEAL, heal, 1); + battle_heal (NULL, bl, heal, 0, 0); + } + return 0; } /*========================================== * 指定範囲内でsrcに対して有効なターゲットのblの数を数える(foreachinarea) *------------------------------------------ */ -int skill_count_target(struct block_list *bl, va_list ap ){ - struct block_list *src; - int *c; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - - if((src = va_arg(ap,struct block_list *)) == NULL) - return 0; - if((c = va_arg(ap,int *)) == NULL) - return 0; - if(battle_check_target(src,bl,BCT_ENEMY) > 0) - (*c)++; - return 0; +int skill_count_target (struct block_list *bl, va_list ap) +{ + struct block_list *src; + int *c; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + + if ((src = va_arg (ap, struct block_list *)) == NULL) + return 0; + if ((c = va_arg (ap, int *)) == NULL) + return 0; + if (battle_check_target (src, bl, BCT_ENEMY) > 0) + (*c)++; + return 0; } + /*========================================== * トラップ範囲処理(foreachinarea) *------------------------------------------ */ -int skill_trap_splash(struct block_list *bl, va_list ap ) +int skill_trap_splash (struct block_list *bl, va_list ap) { - struct block_list *src; - int tick; - int splash_count; - struct skill_unit *unit; - struct skill_unit_group *sg; - struct block_list *ss; - int i; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, src = va_arg(ap,struct block_list *)); - nullpo_retr(0, unit = (struct skill_unit *)src); - nullpo_retr(0, sg = unit->group); - nullpo_retr(0, ss = map_id2bl(sg->src_id)); - - tick = va_arg(ap,int); - splash_count = va_arg(ap,int); - - if(battle_check_target(src,bl,BCT_ENEMY) > 0){ - switch(sg->unit_id){ - case 0x95: /* サンドマン */ - case 0x96: /* フラッシャー */ - case 0x94: /* ショックウェーブトラップ */ - skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick); - break; - case 0x8f: /* ブラストマイン */ - case 0x98: /* クレイモアートラップ */ - for(i=0;i<splash_count;i++){ - skill_attack(BF_MISC,ss,src,bl,sg->skill_id,sg->skill_lv,tick,(sg->val2)?0x0500:0); - } - case 0x97: /* フリージングトラップ */ - skill_attack(BF_WEAPON, ss,src,bl,sg->skill_id,sg->skill_lv,tick,(sg->val2)?0x0500:0); - break; - default: - break; - } - } + struct block_list *src; + int tick; + int splash_count; + struct skill_unit *unit; + struct skill_unit_group *sg; + struct block_list *ss; + int i; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, src = va_arg (ap, struct block_list *)); + nullpo_retr (0, unit = (struct skill_unit *) src); + nullpo_retr (0, sg = unit->group); + nullpo_retr (0, ss = map_id2bl (sg->src_id)); + + tick = va_arg (ap, int); + splash_count = va_arg (ap, int); + + if (battle_check_target (src, bl, BCT_ENEMY) > 0) + { + switch (sg->unit_id) + { + case 0x95: /* サンドマン */ + case 0x96: /* フラッシャー */ + case 0x94: /* ショックウェーブトラップ */ + skill_additional_effect (ss, bl, sg->skill_id, sg->skill_lv, + BF_MISC, tick); + break; + case 0x8f: /* ブラストマイン */ + case 0x98: /* クレイモアートラップ */ + for (i = 0; i < splash_count; i++) + { + skill_attack (BF_MISC, ss, src, bl, sg->skill_id, + sg->skill_lv, tick, + (sg->val2) ? 0x0500 : 0); + } + case 0x97: /* フリージングトラップ */ + skill_attack (BF_WEAPON, ss, src, bl, sg->skill_id, + sg->skill_lv, tick, (sg->val2) ? 0x0500 : 0); + break; + default: + break; + } + } - return 0; + return 0; } + /*---------------------------------------------------------------------------- * ステータス異常 *---------------------------------------------------------------------------- @@ -7470,1361 +9105,1544 @@ int skill_trap_splash(struct block_list *bl, va_list ap ) * ステータス異常タイマー範囲処理 *------------------------------------------ */ -int skill_status_change_timer_sub(struct block_list *bl, va_list ap ) +int skill_status_change_timer_sub (struct block_list *bl, va_list ap) { - struct block_list *src; - int type; - unsigned int tick; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, src=va_arg(ap,struct block_list*)); - type=va_arg(ap,int); - tick=va_arg(ap,unsigned int); - - if(bl->type!=BL_PC && bl->type!=BL_MOB) - return 0; - - switch( type ){ - case SC_SIGHT: /* サイト */ - case SC_CONCENTRATE: - if( (*battle_get_option(bl))&6 ){ - skill_status_change_end( bl, SC_HIDING, -1); - skill_status_change_end( bl, SC_CLOAKING, -1); - } - break; - case SC_RUWACH: /* ルアフ */ - if( (*battle_get_option(bl))&6 ){ - skill_status_change_end( bl, SC_HIDING, -1); - skill_status_change_end( bl, SC_CLOAKING, -1); - if(battle_check_target( src,bl, BCT_ENEMY ) > 0) { - struct status_change *sc_data = battle_get_sc_data(bl); - skill_attack(BF_MAGIC,src,src,bl,AL_RUWACH,sc_data[type].val1,tick,0); - } - } - break; - } - return 0; + struct block_list *src; + int type; + unsigned int tick; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, src = va_arg (ap, struct block_list *)); + type = va_arg (ap, int); + tick = va_arg (ap, unsigned int); + + if (bl->type != BL_PC && bl->type != BL_MOB) + return 0; + + switch (type) + { + case SC_SIGHT: /* サイト */ + case SC_CONCENTRATE: + if ((*battle_get_option (bl)) & 6) + { + skill_status_change_end (bl, SC_HIDING, -1); + skill_status_change_end (bl, SC_CLOAKING, -1); + } + break; + case SC_RUWACH: /* ルアフ */ + if ((*battle_get_option (bl)) & 6) + { + skill_status_change_end (bl, SC_HIDING, -1); + skill_status_change_end (bl, SC_CLOAKING, -1); + if (battle_check_target (src, bl, BCT_ENEMY) > 0) + { + struct status_change *sc_data = battle_get_sc_data (bl); + skill_attack (BF_MAGIC, src, src, bl, AL_RUWACH, + sc_data[type].val1, tick, 0); + } + } + break; + } + return 0; } /*========================================== * ステータス異常終了 *------------------------------------------ */ -int skill_status_change_active(struct block_list* bl, int type) +int skill_status_change_active (struct block_list *bl, int type) { - struct status_change* sc_data; + struct status_change *sc_data; - nullpo_retr(0, bl); - if(bl->type!=BL_PC && bl->type!=BL_MOB) { - if(battle_config.error_log) - printf("skill_status_change_active: neither MOB nor PC !\n"); - return 0; - } + nullpo_retr (0, bl); + if (bl->type != BL_PC && bl->type != BL_MOB) + { + if (battle_config.error_log) + printf ("skill_status_change_active: neither MOB nor PC !\n"); + return 0; + } - nullpo_retr(0, sc_data = battle_get_sc_data(bl)); + nullpo_retr (0, sc_data = battle_get_sc_data (bl)); - return sc_data[type].timer != -1; + return sc_data[type].timer != -1; } -int skill_status_change_end(struct block_list* bl, int type, int tid) +int skill_status_change_end (struct block_list *bl, int type, int tid) { - struct status_change* sc_data; - int opt_flag=0, calc_flag = 0; - short *sc_count, *option, *opt1, *opt2, *opt3; - - nullpo_retr(0, bl); - if(bl->type!=BL_PC && bl->type!=BL_MOB) { - if(battle_config.error_log) - printf("skill_status_change_end: neither MOB nor PC !\n"); - return 0; - } - nullpo_retr(0, sc_data = battle_get_sc_data(bl)); - nullpo_retr(0, sc_count = battle_get_sc_count(bl)); - nullpo_retr(0, option = battle_get_option(bl)); - nullpo_retr(0, opt1 = battle_get_opt1(bl)); - nullpo_retr(0, opt2 = battle_get_opt2(bl)); - nullpo_retr(0, opt3 = battle_get_opt3(bl)); - - if ((*sc_count) > 0 && sc_data[type].timer != -1 && (sc_data[type].timer == tid || tid == -1)) { - - if (tid == -1) // タイマから呼ばれていないならタイマ削除をする - delete_timer(sc_data[type].timer,skill_status_change_timer); - - /* 該当の異常を正常に戻す */ - sc_data[type].timer=-1; - (*sc_count)--; - - switch(type){ /* 異常の種類ごとの処理 */ - case SC_PROVOKE: /* プロボック */ - case SC_CONCENTRATE: /* 集中力向上 */ - case SC_BLESSING: /* ブレッシング */ - case SC_ANGELUS: /* アンゼルス */ - case SC_INCREASEAGI: /* 速度上昇 */ - case SC_DECREASEAGI: /* 速度減少 */ - case SC_SIGNUMCRUCIS: /* シグナムクルシス */ - case SC_HIDING: - case SC_TWOHANDQUICKEN: /* 2HQ */ - case SC_ADRENALINE: /* アドレナリンラッシュ */ - case SC_ENCPOISON: /* エンチャントポイズン */ - case SC_IMPOSITIO: /* インポシティオマヌス */ - case SC_GLORIA: /* グロリア */ - case SC_LOUD: /* ラウドボイス */ - case SC_QUAGMIRE: /* クァグマイア */ - case SC_PROVIDENCE: /* プロヴィデンス */ - case SC_SPEARSQUICKEN: /* スピアクイッケン */ - case SC_VOLCANO: - case SC_DELUGE: - case SC_VIOLENTGALE: - case SC_ETERNALCHAOS: /* エターナルカオス */ - case SC_DRUMBATTLE: /* 戦太鼓の響き */ - case SC_NIBELUNGEN: /* ニーベルングの指輪 */ - case SC_SIEGFRIED: /* 不死身のジークフリード */ - case SC_WHISTLE: /* 口笛 */ - case SC_ASSNCROS: /* 夕陽のアサシンクロス */ - case SC_HUMMING: /* ハミング */ - case SC_DONTFORGETME: /* 私を忘れないで */ - case SC_FORTUNE: /* 幸運のキス */ - case SC_SERVICE4U: /* サービスフォーユー */ - case SC_EXPLOSIONSPIRITS: // 爆裂波動 - case SC_STEELBODY: // 金剛 - case SC_DEFENDER: - case SC_SPEEDPOTION0: /* 増速ポーション */ - case SC_SPEEDPOTION1: - case SC_SPEEDPOTION2: - case SC_APPLEIDUN: /* イドゥンの林檎 */ - case SC_RIDING: - case SC_BLADESTOP_WAIT: - case SC_AURABLADE: /* オーラブレード */ - case SC_PARRYING: /* パリイング */ - case SC_CONCENTRATION: /* コンセントレーション */ - case SC_TENSIONRELAX: /* テンションリラックス */ - case SC_ASSUMPTIO: /* アシャンプティオ */ - case SC_WINDWALK: /* ウインドウォーク */ - case SC_TRUESIGHT: /* トゥルーサイト */ - case SC_SPIDERWEB: /* スパイダーウェッブ */ - case SC_MAGICPOWER: /* 魔法力増幅 */ - case SC_CHASEWALK: - case SC_ATKPOT: /* attack potion [Valaris] */ - case SC_MATKPOT: /* magic attack potion [Valaris] */ - case SC_WEDDING: //結婚用(結婚衣裳になって歩くのが遅いとか) - case SC_MELTDOWN: /* メルトダウン */ - case SC_PHYS_SHIELD: - case SC_HASTE: - calc_flag = 1; - break; - case SC_BERSERK: /* バーサーク */ - calc_flag = 1; - clif_status_change(bl,SC_INCREASEAGI,0); /* アイコン消去 */ - break; - case SC_DEVOTION: /* ディボーション */ - { - struct map_session_data *md = map_id2sd(sc_data[type].val1); - sc_data[type].val1=sc_data[type].val2=0; - skill_devotion(md,bl->id); - calc_flag = 1; - } - break; - case SC_BLADESTOP: - { - struct status_change *t_sc_data = battle_get_sc_data((struct block_list *)sc_data[type].val4); - //片方が切れたので相手の白刃状態が切れてないのなら解除 - if(t_sc_data && t_sc_data[SC_BLADESTOP].timer!=-1) - skill_status_change_end((struct block_list *)sc_data[type].val4,SC_BLADESTOP,-1); - - if(sc_data[type].val2==2) - clif_bladestop((struct block_list *)sc_data[type].val3,(struct block_list *)sc_data[type].val4,0); - } - break; - case SC_DANCING: - { - struct map_session_data *dsd; - struct status_change *d_sc_data; - if(sc_data[type].val4 && (dsd=map_id2sd(sc_data[type].val4))){ - d_sc_data = dsd->sc_data; - //合奏で相手がいる場合相手のval4を0にする - if(d_sc_data && d_sc_data[type].timer!=-1) - d_sc_data[type].val4=0; - } - } - calc_flag = 1; - break; - case SC_GRAFFITI: - { - struct skill_unit_group *sg=(struct skill_unit_group *)sc_data[type].val4; //val4がグラフィティのgroup_id - if(sg) - skill_delunitgroup(sg); - } - break; - case SC_NOCHAT: //チャット禁止状態 - { - struct map_session_data *sd=NULL; - if(bl->type == BL_PC && (sd=(struct map_session_data *)bl)){ - sd->status.manner = 0; - clif_updatestatus(sd,SP_MANNER); - } - } - break; - case SC_SPLASHER: /* ベナムスプラッシャー */ - { - struct block_list *src=map_id2bl(sc_data[type].val3); - if(src && tid!=-1){ - //自分にダメージ&周囲3*3にダメージ - skill_castend_damage_id(src, bl,sc_data[type].val2,sc_data[type].val1,gettick(),0 ); - } - } - break; - case SC_SELFDESTRUCTION: /* 自爆 */ - { - //自分のダメージは0にして - struct mob_data *md=NULL; - if(bl->type == BL_MOB && (md=(struct mob_data*)bl)) - skill_castend_damage_id(bl, bl,sc_data[type].val2,sc_data[type].val1,gettick(),0 ); - } - break; - /* option1 */ - case SC_FREEZE: - sc_data[type].val3 = 0; - break; - - /* option2 */ - case SC_POISON: /* 毒 */ - case SC_BLIND: /* 暗黒 */ - case SC_CURSE: - calc_flag = 1; - break; - } - - if(bl->type==BL_PC && type<SC_SENDMAX) - clif_status_change(bl,type,0); /* アイコン消去 */ - - switch(type){ /* 正常に戻るときなにか処理が必要 */ - case SC_STONE: - case SC_FREEZE: - case SC_STAN: - case SC_SLEEP: - *opt1 = 0; - opt_flag = 1; - break; - - case SC_POISON: - case SC_CURSE: - case SC_SILENCE: - case SC_BLIND: - *opt2 &= ~(1<<(type-SC_POISON)); - opt_flag = 1; - break; - - case SC_SLOWPOISON: - if (sc_data[SC_POISON].timer != -1) - *opt2 |= 0x1; - *opt2 &= ~0x200; - opt_flag = 1; - break; - - case SC_SIGNUMCRUCIS: - *opt2 &= ~0x40; - opt_flag = 1; - break; - - case SC_SPEEDPOTION0: - *opt2 &= ~0x20; - opt_flag = 1; - break; - - case SC_ATKPOT: - *opt2 &= ~0x80; - opt_flag = 1; - break; - - case SC_HIDING: - case SC_CLOAKING: - *option &= ~((type == SC_HIDING) ? 2 : 4); - opt_flag = 1 ; - break; - - case SC_CHASEWALK: - *option &= ~16388; - opt_flag = 1 ; - break; + struct status_change *sc_data; + int opt_flag = 0, calc_flag = 0; + short *sc_count, *option, *opt1, *opt2, *opt3; + + nullpo_retr (0, bl); + if (bl->type != BL_PC && bl->type != BL_MOB) + { + if (battle_config.error_log) + printf ("skill_status_change_end: neither MOB nor PC !\n"); + return 0; + } + nullpo_retr (0, sc_data = battle_get_sc_data (bl)); + nullpo_retr (0, sc_count = battle_get_sc_count (bl)); + nullpo_retr (0, option = battle_get_option (bl)); + nullpo_retr (0, opt1 = battle_get_opt1 (bl)); + nullpo_retr (0, opt2 = battle_get_opt2 (bl)); + nullpo_retr (0, opt3 = battle_get_opt3 (bl)); + + if ((*sc_count) > 0 && sc_data[type].timer != -1 + && (sc_data[type].timer == tid || tid == -1)) + { + + if (tid == -1) // タイマから呼ばれていないならタイマ削除をする + delete_timer (sc_data[type].timer, skill_status_change_timer); + + /* 該当の異常を正常に戻す */ + sc_data[type].timer = -1; + (*sc_count)--; + + switch (type) + { /* 異常の種類ごとの処理 */ + case SC_PROVOKE: /* プロボック */ + case SC_CONCENTRATE: /* 集中力向上 */ + case SC_BLESSING: /* ブレッシング */ + case SC_ANGELUS: /* アンゼルス */ + case SC_INCREASEAGI: /* 速度上昇 */ + case SC_DECREASEAGI: /* 速度減少 */ + case SC_SIGNUMCRUCIS: /* シグナムクルシス */ + case SC_HIDING: + case SC_TWOHANDQUICKEN: /* 2HQ */ + case SC_ADRENALINE: /* アドレナリンラッシュ */ + case SC_ENCPOISON: /* エンチャントポイズン */ + case SC_IMPOSITIO: /* インポシティオマヌス */ + case SC_GLORIA: /* グロリア */ + case SC_LOUD: /* ラウドボイス */ + case SC_QUAGMIRE: /* クァグマイア */ + case SC_PROVIDENCE: /* プロヴィデンス */ + case SC_SPEARSQUICKEN: /* スピアクイッケン */ + case SC_VOLCANO: + case SC_DELUGE: + case SC_VIOLENTGALE: + case SC_ETERNALCHAOS: /* エターナルカオス */ + case SC_DRUMBATTLE: /* 戦太鼓の響き */ + case SC_NIBELUNGEN: /* ニーベルングの指輪 */ + case SC_SIEGFRIED: /* 不死身のジークフリード */ + case SC_WHISTLE: /* 口笛 */ + case SC_ASSNCROS: /* 夕陽のアサシンクロス */ + case SC_HUMMING: /* ハミング */ + case SC_DONTFORGETME: /* 私を忘れないで */ + case SC_FORTUNE: /* 幸運のキス */ + case SC_SERVICE4U: /* サービスフォーユー */ + case SC_EXPLOSIONSPIRITS: // 爆裂波動 + case SC_STEELBODY: // 金剛 + case SC_DEFENDER: + case SC_SPEEDPOTION0: /* 増速ポーション */ + case SC_SPEEDPOTION1: + case SC_SPEEDPOTION2: + case SC_APPLEIDUN: /* イドゥンの林檎 */ + case SC_RIDING: + case SC_BLADESTOP_WAIT: + case SC_AURABLADE: /* オーラブレード */ + case SC_PARRYING: /* パリイング */ + case SC_CONCENTRATION: /* コンセントレーション */ + case SC_TENSIONRELAX: /* テンションリラックス */ + case SC_ASSUMPTIO: /* アシャンプティオ */ + case SC_WINDWALK: /* ウインドウォーク */ + case SC_TRUESIGHT: /* トゥルーサイト */ + case SC_SPIDERWEB: /* スパイダーウェッブ */ + case SC_MAGICPOWER: /* 魔法力増幅 */ + case SC_CHASEWALK: + case SC_ATKPOT: /* attack potion [Valaris] */ + case SC_MATKPOT: /* magic attack potion [Valaris] */ + case SC_WEDDING: //結婚用(結婚衣裳になって歩くのが遅いとか) + case SC_MELTDOWN: /* メルトダウン */ + case SC_PHYS_SHIELD: + case SC_HASTE: + calc_flag = 1; + break; + case SC_BERSERK: /* バーサーク */ + calc_flag = 1; + clif_status_change (bl, SC_INCREASEAGI, 0); /* アイコン消去 */ + break; + case SC_DEVOTION: /* ディボーション */ + { + struct map_session_data *md = map_id2sd (sc_data[type].val1); + sc_data[type].val1 = sc_data[type].val2 = 0; + skill_devotion (md, bl->id); + calc_flag = 1; + } + break; + case SC_BLADESTOP: + { + struct status_change *t_sc_data = + battle_get_sc_data ((struct block_list *) + sc_data[type].val4); + //片方が切れたので相手の白刃状態が切れてないのなら解除 + if (t_sc_data && t_sc_data[SC_BLADESTOP].timer != -1) + skill_status_change_end ((struct block_list *) + sc_data[type].val4, SC_BLADESTOP, + -1); + + if (sc_data[type].val2 == 2) + clif_bladestop ((struct block_list *) sc_data[type].val3, + (struct block_list *) sc_data[type].val4, + 0); + } + break; + case SC_DANCING: + { + struct map_session_data *dsd; + struct status_change *d_sc_data; + if (sc_data[type].val4 + && (dsd = map_id2sd (sc_data[type].val4))) + { + d_sc_data = dsd->sc_data; + //合奏で相手がいる場合相手のval4を0にする + if (d_sc_data && d_sc_data[type].timer != -1) + d_sc_data[type].val4 = 0; + } + } + calc_flag = 1; + break; + case SC_GRAFFITI: + { + struct skill_unit_group *sg = (struct skill_unit_group *) sc_data[type].val4; //val4がグラフィティのgroup_id + if (sg) + skill_delunitgroup (sg); + } + break; + case SC_NOCHAT: //チャット禁止状態 + { + struct map_session_data *sd = NULL; + if (bl->type == BL_PC + && (sd = (struct map_session_data *) bl)) + { + sd->status.manner = 0; + clif_updatestatus (sd, SP_MANNER); + } + } + break; + case SC_SPLASHER: /* ベナムスプラッシャー */ + { + struct block_list *src = map_id2bl (sc_data[type].val3); + if (src && tid != -1) + { + //自分にダメージ&周囲3*3にダメージ + skill_castend_damage_id (src, bl, sc_data[type].val2, + sc_data[type].val1, gettick (), + 0); + } + } + break; + case SC_SELFDESTRUCTION: /* 自爆 */ + { + //自分のダメージは0にして + struct mob_data *md = NULL; + if (bl->type == BL_MOB && (md = (struct mob_data *) bl)) + skill_castend_damage_id (bl, bl, sc_data[type].val2, + sc_data[type].val1, gettick (), + 0); + } + break; + /* option1 */ + case SC_FREEZE: + sc_data[type].val3 = 0; + break; + + /* option2 */ + case SC_POISON: /* 毒 */ + case SC_BLIND: /* 暗黒 */ + case SC_CURSE: + calc_flag = 1; + break; + } - case SC_SIGHT: - *option &= ~1; - opt_flag = 1; - break; - case SC_WEDDING: //結婚用(結婚衣裳になって歩くのが遅いとか) - *option &= ~4096; - opt_flag = 1; - break; - case SC_RUWACH: - *option &= ~8192; - opt_flag = 1; - break; - - //opt3 - case SC_TWOHANDQUICKEN: /* 2HQ */ - case SC_SPEARSQUICKEN: /* スピアクイッケン */ - case SC_CONCENTRATION: /* コンセントレーション */ - *opt3 &= ~1; - break; - case SC_OVERTHRUST: /* オーバースラスト */ - *opt3 &= ~2; - break; - case SC_ENERGYCOAT: /* エナジーコート */ - *opt3 &= ~4; - break; - case SC_EXPLOSIONSPIRITS: // 爆裂波動 - *opt3 &= ~8; - break; - case SC_STEELBODY: // 金剛 - *opt3 &= ~16; - break; - case SC_BLADESTOP: /* 白刃取り */ - *opt3 &= ~32; - break; - case SC_BERSERK: /* バーサーク */ - *opt3 &= ~128; - break; - case SC_MARIONETTE: /* マリオネットコントロール */ - *opt3 &= ~1024; - break; - case SC_ASSUMPTIO: /* アスムプティオ */ - *opt3 &= ~2048; - break; - } + if (bl->type == BL_PC && type < SC_SENDMAX) + clif_status_change (bl, type, 0); /* アイコン消去 */ + + switch (type) + { /* 正常に戻るときなにか処理が必要 */ + case SC_STONE: + case SC_FREEZE: + case SC_STAN: + case SC_SLEEP: + *opt1 = 0; + opt_flag = 1; + break; + + case SC_POISON: + case SC_CURSE: + case SC_SILENCE: + case SC_BLIND: + *opt2 &= ~(1 << (type - SC_POISON)); + opt_flag = 1; + break; + + case SC_SLOWPOISON: + if (sc_data[SC_POISON].timer != -1) + *opt2 |= 0x1; + *opt2 &= ~0x200; + opt_flag = 1; + break; + + case SC_SIGNUMCRUCIS: + *opt2 &= ~0x40; + opt_flag = 1; + break; + + case SC_SPEEDPOTION0: + *opt2 &= ~0x20; + opt_flag = 1; + break; + + case SC_ATKPOT: + *opt2 &= ~0x80; + opt_flag = 1; + break; + + case SC_HIDING: + case SC_CLOAKING: + *option &= ~((type == SC_HIDING) ? 2 : 4); + opt_flag = 1; + break; + + case SC_CHASEWALK: + *option &= ~16388; + opt_flag = 1; + break; + + case SC_SIGHT: + *option &= ~1; + opt_flag = 1; + break; + case SC_WEDDING: //結婚用(結婚衣裳になって歩くのが遅いとか) + *option &= ~4096; + opt_flag = 1; + break; + case SC_RUWACH: + *option &= ~8192; + opt_flag = 1; + break; + + //opt3 + case SC_TWOHANDQUICKEN: /* 2HQ */ + case SC_SPEARSQUICKEN: /* スピアクイッケン */ + case SC_CONCENTRATION: /* コンセントレーション */ + *opt3 &= ~1; + break; + case SC_OVERTHRUST: /* オーバースラスト */ + *opt3 &= ~2; + break; + case SC_ENERGYCOAT: /* エナジーコート */ + *opt3 &= ~4; + break; + case SC_EXPLOSIONSPIRITS: // 爆裂波動 + *opt3 &= ~8; + break; + case SC_STEELBODY: // 金剛 + *opt3 &= ~16; + break; + case SC_BLADESTOP: /* 白刃取り */ + *opt3 &= ~32; + break; + case SC_BERSERK: /* バーサーク */ + *opt3 &= ~128; + break; + case SC_MARIONETTE: /* マリオネットコントロール */ + *opt3 &= ~1024; + break; + case SC_ASSUMPTIO: /* アスムプティオ */ + *opt3 &= ~2048; + break; + } - if (night_flag == 1 && (*opt2 & STATE_BLIND) == 0 && bl->type == BL_PC) { // by [Yor] - *opt2 |= STATE_BLIND; - opt_flag = 1; - } + if (night_flag == 1 && (*opt2 & STATE_BLIND) == 0 + && bl->type == BL_PC) + { // by [Yor] + *opt2 |= STATE_BLIND; + opt_flag = 1; + } - if(opt_flag) /* optionの変更を伝える */ - clif_changeoption(bl); + if (opt_flag) /* optionの変更を伝える */ + clif_changeoption (bl); - if (bl->type == BL_PC && calc_flag) - pc_calcstatus((struct map_session_data *)bl,0); /* ステータス再計算 */ - } + if (bl->type == BL_PC && calc_flag) + pc_calcstatus ((struct map_session_data *) bl, 0); /* ステータス再計算 */ + } - return 0; + return 0; } - -int -skill_update_heal_animation(struct map_session_data *sd) +int skill_update_heal_animation (struct map_session_data *sd) { - const int mask = 0x100; - int was_active; - int is_active; + const int mask = 0x100; + int was_active; + int is_active; - nullpo_retr (0, sd); - was_active = sd->opt2 & mask; - is_active = sd->quick_regeneration_hp.amount > 0; + nullpo_retr (0, sd); + was_active = sd->opt2 & mask; + is_active = sd->quick_regeneration_hp.amount > 0; - if ((was_active && is_active) - || (!was_active && !is_active)) - return 0; // no update + if ((was_active && is_active) || (!was_active && !is_active)) + return 0; // no update - if (is_active) - sd->opt2 |= mask; - else - sd->opt2 &= ~mask; + if (is_active) + sd->opt2 |= mask; + else + sd->opt2 &= ~mask; - return clif_changeoption(&sd->bl); + return clif_changeoption (&sd->bl); } /*========================================== * ステータス異常終了タイマー *------------------------------------------ */ -int skill_status_change_timer(int tid, unsigned int tick, int id, int data) +int skill_status_change_timer (int tid, unsigned int tick, int id, int data) { - int type=data; - struct block_list *bl; - struct map_session_data *sd=NULL; - struct status_change *sc_data; - //short *sc_count; //使ってない? + int type = data; + struct block_list *bl; + struct map_session_data *sd = NULL; + struct status_change *sc_data; + //short *sc_count; //使ってない? + + if ((bl = map_id2bl (id)) == NULL) + return 0; //該当IDがすでに消滅しているというのはいかにもありそうなのでスルーしてみる + nullpo_retr (0, sc_data = battle_get_sc_data (bl)); + + if (bl->type == BL_PC) + sd = (struct map_session_data *) bl; + + //sc_count=battle_get_sc_count(bl); //使ってない? + + if (sc_data[type].timer != tid) + { + if (battle_config.error_log) + printf ("skill_status_change_timer %d != %d\n", tid, + sc_data[type].timer); + } + + if (sc_data[type].spell_invocation) + { // Must report termination + spell_effect_report_termination (sc_data[type].spell_invocation, + bl->id, type, 0); + sc_data[type].spell_invocation = 0; + } + + switch (type) + { /* 特殊な処理になる場合 */ + case SC_MAXIMIZEPOWER: /* マキシマイズパワー */ + case SC_CLOAKING: /* クローキング */ + case SC_CHASEWALK: + if (sd) + { + if (sd->status.sp > 0) + { /* SP切れるまで持続 */ + sd->status.sp--; + clif_updatestatus (sd, SP_SP); + sc_data[type].timer = add_timer ( /* タイマー再設定 */ + sc_data[type].val2 + + tick, + skill_status_change_timer, + bl->id, data); + return 0; + } + } + break; - if( (bl=map_id2bl(id)) == NULL ) - return 0; //該当IDがすでに消滅しているというのはいかにもありそうなのでスルーしてみる - nullpo_retr(0, sc_data=battle_get_sc_data(bl)); + case SC_HIDING: /* ハイディング */ + if (sd) + { /* SPがあって、時間制限の間は持続 */ + if (sd->status.sp > 0 && (--sc_data[type].val2) > 0) + { + if (sc_data[type].val2 % (sc_data[type].val1 + 3) == 0) + { + sd->status.sp--; + clif_updatestatus (sd, SP_SP); + } + sc_data[type].timer = add_timer ( /* タイマー再設定 */ + 1000 + tick, + skill_status_change_timer, + bl->id, data); + return 0; + } + } + break; - if(bl->type==BL_PC) - sd=(struct map_session_data *)bl; + case SC_SIGHT: /* サイト */ + { + const int range = 7; + map_foreachinarea (skill_status_change_timer_sub, + bl->m, bl->x - range, bl->y - range, + bl->x + range, bl->y + range, 0, bl, type, + tick); + + if ((--sc_data[type].val2) > 0) + { + sc_data[type].timer = add_timer ( /* タイマー再設定 */ + 250 + tick, + skill_status_change_timer, + bl->id, data); + return 0; + } + } + break; + case SC_RUWACH: /* ルアフ */ + { + const int range = 5; + map_foreachinarea (skill_status_change_timer_sub, + bl->m, bl->x - range, bl->y - range, + bl->x + range, bl->y + range, 0, bl, type, + tick); + + if ((--sc_data[type].val2) > 0) + { + sc_data[type].timer = add_timer ( /* タイマー再設定 */ + 250 + tick, + skill_status_change_timer, + bl->id, data); + return 0; + } + } + break; - //sc_count=battle_get_sc_count(bl); //使ってない? + case SC_SIGNUMCRUCIS: /* シグナムクルシス */ + { + int race = battle_get_race (bl); + if (race == 6 + || battle_check_undead (race, battle_get_elem_type (bl))) + { + sc_data[type].timer = + add_timer (1000 * 600 + tick, skill_status_change_timer, + bl->id, data); + return 0; + } + } + break; - if(sc_data[type].timer != tid) { - if(battle_config.error_log) - printf("skill_status_change_timer %d != %d\n",tid,sc_data[type].timer); - } + case SC_PROVOKE: /* プロボック/オートバーサーク */ + if (sc_data[type].val2 != 0) + { /* オートバーサーク(1秒ごとにHPチェック) */ + if (sd && sd->status.hp > sd->status.max_hp >> 2) /* 停止 */ + break; + sc_data[type].timer = + add_timer (1000 + tick, skill_status_change_timer, bl->id, + data); + return 0; + } + break; - if (sc_data[type].spell_invocation) { // Must report termination - spell_effect_report_termination(sc_data[type].spell_invocation, bl->id, type, 0); - sc_data[type].spell_invocation = 0; - } - - switch(type){ /* 特殊な処理になる場合 */ - case SC_MAXIMIZEPOWER: /* マキシマイズパワー */ - case SC_CLOAKING: /* クローキング */ - case SC_CHASEWALK: - if(sd){ - if( sd->status.sp > 0 ){ /* SP切れるまで持続 */ - sd->status.sp--; - clif_updatestatus(sd,SP_SP); - sc_data[type].timer=add_timer( /* タイマー再設定 */ - sc_data[type].val2+tick, skill_status_change_timer, - bl->id, data); - return 0; - } - } - break; - - case SC_HIDING: /* ハイディング */ - if(sd){ /* SPがあって、時間制限の間は持続 */ - if( sd->status.sp > 0 && (--sc_data[type].val2)>0 ){ - if(sc_data[type].val2 % (sc_data[type].val1+3) ==0 ){ - sd->status.sp--; - clif_updatestatus(sd,SP_SP); - } - sc_data[type].timer=add_timer( /* タイマー再設定 */ - 1000+tick, skill_status_change_timer, - bl->id, data); - return 0; - } - } - break; - - case SC_SIGHT: /* サイト */ - { - const int range=7; - map_foreachinarea( skill_status_change_timer_sub, - bl->m, bl->x-range, bl->y-range, bl->x+range,bl->y+range,0, - bl,type,tick); - - if( (--sc_data[type].val2)>0 ){ - sc_data[type].timer=add_timer( /* タイマー再設定 */ - 250+tick, skill_status_change_timer, - bl->id, data); - return 0; - } - } - break; - case SC_RUWACH: /* ルアフ */ - { - const int range=5; - map_foreachinarea( skill_status_change_timer_sub, - bl->m, bl->x-range, bl->y-range, bl->x+range,bl->y+range,0, - bl,type,tick); - - if( (--sc_data[type].val2)>0 ){ - sc_data[type].timer=add_timer( /* タイマー再設定 */ - 250+tick, skill_status_change_timer, - bl->id, data); - return 0; - } - } - break; - - case SC_SIGNUMCRUCIS: /* シグナムクルシス */ - { - int race = battle_get_race(bl); - if(race == 6 || battle_check_undead(race,battle_get_elem_type(bl))) { - sc_data[type].timer=add_timer(1000*600+tick,skill_status_change_timer, bl->id, data ); - return 0; - } - } - break; + case SC_WATERBALL: /* ウォーターボール */ + { + struct block_list *target = map_id2bl (sc_data[type].val2); + if (target == NULL || target->prev == NULL) + break; + skill_attack (BF_MAGIC, bl, bl, target, WZ_WATERBALL, + sc_data[type].val1, tick, 0); + if ((--sc_data[type].val3) > 0) + { + sc_data[type].timer = + add_timer (150 + tick, skill_status_change_timer, bl->id, + data); + return 0; + } + } + break; - case SC_PROVOKE: /* プロボック/オートバーサーク */ - if(sc_data[type].val2!=0){ /* オートバーサーク(1秒ごとにHPチェック) */ - if(sd && sd->status.hp>sd->status.max_hp>>2) /* 停止 */ - break; - sc_data[type].timer=add_timer( 1000+tick,skill_status_change_timer, bl->id, data ); - return 0; - } - break; + case SC_ENDURE: /* インデュア */ + if (sd && sd->special_state.infinite_endure) + { + sc_data[type].timer = + add_timer (1000 * 600 + tick, skill_status_change_timer, + bl->id, data); + sc_data[type].val2 = 1; + return 0; + } + break; - case SC_WATERBALL: /* ウォーターボール */ - { - struct block_list *target=map_id2bl(sc_data[type].val2); - if(target==NULL || target->prev==NULL) - break; - skill_attack(BF_MAGIC,bl,bl,target,WZ_WATERBALL,sc_data[type].val1,tick,0); - if((--sc_data[type].val3)>0) { - sc_data[type].timer=add_timer( 150+tick,skill_status_change_timer, bl->id, data ); - return 0; - } - } - break; + case SC_DISSONANCE: /* 不協和音 */ + if ((--sc_data[type].val2) > 0) + { + struct skill_unit *unit = + (struct skill_unit *) sc_data[type].val4; + struct block_list *src; + + if (!unit || !unit->group) + break; + src = map_id2bl (unit->group->src_id); + if (!src) + break; + skill_attack (BF_MISC, src, &unit->bl, bl, + unit->group->skill_id, sc_data[type].val1, tick, + 0); + sc_data[type].timer = + add_timer (skill_get_time2 + (unit->group->skill_id, + unit->group->skill_lv) + tick, + skill_status_change_timer, bl->id, data); + return 0; + } + break; - case SC_ENDURE: /* インデュア */ - if(sd && sd->special_state.infinite_endure) { - sc_data[type].timer=add_timer( 1000*600+tick,skill_status_change_timer, bl->id, data ); - sc_data[type].val2=1; - return 0; - } - break; + case SC_LULLABY: /* 子守唄 */ + if ((--sc_data[type].val2) > 0) + { + struct skill_unit *unit = + (struct skill_unit *) sc_data[type].val4; + if (!unit || !unit->group || unit->group->src_id == bl->id) + break; + skill_additional_effect (bl, bl, unit->group->skill_id, + sc_data[type].val1, + BF_LONG | BF_SKILL | BF_MISC, tick); + sc_data[type].timer = + add_timer (skill_get_time + (unit->group->skill_id, + unit->group->skill_lv) / 10 + tick, + skill_status_change_timer, bl->id, data); + return 0; + } + break; - case SC_DISSONANCE: /* 不協和音 */ - if( (--sc_data[type].val2)>0){ - struct skill_unit *unit= - (struct skill_unit *)sc_data[type].val4; - struct block_list *src; + case SC_STONE: + if (sc_data[type].val2 != 0) + { + short *opt1 = battle_get_opt1 (bl); + sc_data[type].val2 = 0; + sc_data[type].val4 = 0; + battle_stopwalking (bl, 1); + if (opt1) + { + *opt1 = 1; + clif_changeoption (bl); + } + sc_data[type].timer = + add_timer (1000 + tick, skill_status_change_timer, bl->id, + data); + return 0; + } + else if ((--sc_data[type].val3) > 0) + { + int hp = battle_get_max_hp (bl); + if ((++sc_data[type].val4) % 5 == 0 + && battle_get_hp (bl) > hp >> 2) + { + hp = hp / 100; + if (hp < 1) + hp = 1; + if (bl->type == BL_PC) + pc_heal ((struct map_session_data *) bl, -hp, 0); + else if (bl->type == BL_MOB) + { + struct mob_data *md; + if ((md = ((struct mob_data *) bl)) == NULL) + break; + md->hp -= hp; + } + } + sc_data[type].timer = + add_timer (1000 + tick, skill_status_change_timer, bl->id, + data); + return 0; + } + break; + case SC_POISON: + if (sc_data[SC_SLOWPOISON].timer == -1) + { + const int resist_poison = + skill_power_bl (bl, TMW_RESIST_POISON) >> 3; + if (resist_poison) + sc_data[type].val1 -= MRAND (resist_poison + 1); + + if ((--sc_data[type].val1) > 0) + { + + int hp = battle_get_max_hp (bl); + if (battle_get_hp (bl) > hp >> 4) + { + if (bl->type == BL_PC) + { + hp = 3 + hp * 3 / 200; + pc_heal ((struct map_session_data *) bl, -hp, 0); + } + else if (bl->type == BL_MOB) + { + struct mob_data *md; + if ((md = ((struct mob_data *) bl)) == NULL) + break; + hp = 3 + hp / 200; + md->hp -= hp; + } + } + sc_data[type].timer = + add_timer (1000 + tick, skill_status_change_timer, + bl->id, data); + } + } + else + sc_data[type].timer = + add_timer (2000 + tick, skill_status_change_timer, bl->id, + data); + break; - if(!unit || !unit->group) - break; - src=map_id2bl(unit->group->src_id); - if(!src) - break; - skill_attack(BF_MISC,src,&unit->bl,bl,unit->group->skill_id,sc_data[type].val1,tick,0); - sc_data[type].timer=add_timer(skill_get_time2(unit->group->skill_id,unit->group->skill_lv)+tick, - skill_status_change_timer, bl->id, data ); - return 0; - } - break; + case SC_TENSIONRELAX: /* テンションリラックス */ + if (sd) + { /* SPがあって、HPが満タンでなければ継続 */ + if (sd->status.sp > 12 && sd->status.max_hp > sd->status.hp) + { + if (sc_data[type].val2 % (sc_data[type].val1 + 3) == 0) + { + sd->status.sp -= 12; + clif_updatestatus (sd, SP_SP); + } + sc_data[type].timer = add_timer ( /* タイマー再設定 */ + 10000 + tick, + skill_status_change_timer, + bl->id, data); + return 0; + } + if (sd->status.max_hp <= sd->status.hp) + skill_status_change_end (&sd->bl, SC_TENSIONRELAX, -1); + } + break; - case SC_LULLABY: /* 子守唄 */ - if( (--sc_data[type].val2)>0){ - struct skill_unit *unit= - (struct skill_unit *)sc_data[type].val4; - if(!unit || !unit->group || unit->group->src_id==bl->id) - break; - skill_additional_effect(bl,bl,unit->group->skill_id,sc_data[type].val1,BF_LONG|BF_SKILL|BF_MISC,tick); - sc_data[type].timer=add_timer(skill_get_time(unit->group->skill_id,unit->group->skill_lv)/10+tick, - skill_status_change_timer, bl->id, data ); - return 0; - } - break; - - case SC_STONE: - if(sc_data[type].val2 != 0) { - short *opt1 = battle_get_opt1(bl); - sc_data[type].val2 = 0; - sc_data[type].val4 = 0; - battle_stopwalking(bl,1); - if(opt1) { - *opt1 = 1; - clif_changeoption(bl); - } - sc_data[type].timer=add_timer(1000+tick,skill_status_change_timer, bl->id, data ); - return 0; - } - else if( (--sc_data[type].val3) > 0) { - int hp = battle_get_max_hp(bl); - if((++sc_data[type].val4)%5 == 0 && battle_get_hp(bl) > hp>>2) { - hp = hp/100; - if(hp < 1) hp = 1; - if(bl->type == BL_PC) - pc_heal((struct map_session_data *)bl,-hp,0); - else if(bl->type == BL_MOB){ - struct mob_data *md; - if((md=((struct mob_data *)bl)) == NULL) - break; - md->hp -= hp; - } - } - sc_data[type].timer=add_timer(1000+tick,skill_status_change_timer, bl->id, data ); - return 0; - } - break; - case SC_POISON: - if(sc_data[SC_SLOWPOISON].timer == -1) { - const int resist_poison = skill_power_bl(bl, TMW_RESIST_POISON) >> 3; - if (resist_poison) - sc_data[type].val1 -= MRAND(resist_poison + 1); - - if( (--sc_data[type].val1) > 0) { - - int hp = battle_get_max_hp(bl); - if(battle_get_hp(bl) > hp>>4) { - if(bl->type == BL_PC) { - hp = 3 + hp*3/200; - pc_heal((struct map_session_data *)bl,-hp,0); - } - else if(bl->type == BL_MOB) { - struct mob_data *md; - if((md=((struct mob_data *)bl)) == NULL) - break; - hp = 3 + hp/200; - md->hp -= hp; - } - } - sc_data[type].timer=add_timer(1000+tick,skill_status_change_timer, bl->id, data ); - } - } - else - sc_data[type].timer=add_timer(2000+tick,skill_status_change_timer, bl->id, data ); - break; - - case SC_TENSIONRELAX: /* テンションリラックス */ - if(sd){ /* SPがあって、HPが満タンでなければ継続 */ - if( sd->status.sp > 12 && sd->status.max_hp > sd->status.hp ){ - if(sc_data[type].val2 % (sc_data[type].val1+3) ==0 ){ - sd->status.sp -= 12; - clif_updatestatus(sd,SP_SP); - } - sc_data[type].timer=add_timer( /* タイマー再設定 */ - 10000+tick, skill_status_change_timer, - bl->id, data); - return 0; - } - if(sd->status.max_hp <= sd->status.hp) - skill_status_change_end(&sd->bl,SC_TENSIONRELAX,-1); - } - break; - - /* 時間切れ無し?? */ - case SC_AETERNA: - case SC_TRICKDEAD: - case SC_RIDING: - case SC_FALCON: - case SC_WEIGHT50: - case SC_WEIGHT90: - case SC_MAGICPOWER: /* 魔法力増幅 */ - case SC_REJECTSWORD: /* リジェクトソード */ - case SC_MEMORIZE: /* メモライズ */ - case SC_BROKNWEAPON: - case SC_BROKNARMOR: - if(sc_data[type].timer==tid) - sc_data[type].timer=add_timer( 1000*600+tick,skill_status_change_timer, bl->id, data ); - return 0; - - case SC_DANCING: //ダンススキルの時間SP消費 - { - int s=0; - if(sd){ - if(sd->status.sp > 0 && (--sc_data[type].val3)>0){ - switch(sc_data[type].val1){ - case BD_RICHMANKIM: /* ニヨルドの宴 3秒にSP1 */ - case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き 3秒にSP1 */ - case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 3秒にSP1 */ - case BD_SIEGFRIED: /* 不死身のジークフリード 3秒にSP1 */ - case BA_DISSONANCE: /* 不協和音 3秒でSP1 */ - case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス 3秒でSP1 */ - case DC_UGLYDANCE: /* 自分勝手なダンス 3秒でSP1 */ - s=3; - break; - case BD_LULLABY: /* 子守歌 4秒にSP1 */ - case BD_ETERNALCHAOS: /* 永遠の混沌 4秒にSP1 */ - case BD_ROKISWEIL: /* ロキの叫び 4秒にSP1 */ - case DC_FORTUNEKISS: /* 幸運のキス 4秒でSP1 */ - s=4; - break; - case BD_INTOABYSS: /* 深淵の中に 5秒にSP1 */ - case BA_WHISTLE: /* 口笛 5秒でSP1 */ - case DC_HUMMING: /* ハミング 5秒でSP1 */ - case BA_POEMBRAGI: /* ブラギの詩 5秒でSP1 */ - case DC_SERVICEFORYOU: /* サービスフォーユー 5秒でSP1 */ - s=5; - break; - case BA_APPLEIDUN: /* イドゥンの林檎 6秒でSP1 */ - s=6; - break; - case DC_DONTFORGETME: /* 私を忘れないで… 10秒でSP1 */ - case CG_MOONLIT: /* 月明りの泉に落ちる花びら 10秒でSP1? */ - s=10; - break; - } - if(s && ((sc_data[type].val3 % s) == 0)){ - sd->status.sp--; - clif_updatestatus(sd,SP_SP); - } - sc_data[type].timer=add_timer( /* タイマー再設定 */ - 1000+tick, skill_status_change_timer, - bl->id, data); - return 0; - } - } - } - break; - case SC_BERSERK: /* バーサーク */ - if(sd){ /* HPが100以上なら継続 */ - if( (sd->status.hp - sd->status.hp/100) > 100 ){ - sd->status.hp -= sd->status.hp/100; - clif_updatestatus(sd,SP_HP); - sc_data[type].timer=add_timer( /* タイマー再設定 */ - 15000+tick, skill_status_change_timer, - bl->id, data); - return 0; - } - } - break; - case SC_WEDDING: //結婚用(結婚衣裳になって歩くのが遅いとか) - if(sd){ - time_t timer; - if(time(&timer) < ((sc_data[type].val2) + 3600)){ //1時間たっていないので継続 - sc_data[type].timer=add_timer( /* タイマー再設定 */ - 10000+tick, skill_status_change_timer, - bl->id, data); - return 0; - } - } - break; - case SC_NOCHAT: //チャット禁止状態 - if(sd && battle_config.muting_players){ - time_t timer; - if((++sd->status.manner) && time(&timer) < ((sc_data[type].val2) + 60*(0-sd->status.manner))){ //開始からstatus.manner分経ってないので継続 - clif_updatestatus(sd,SP_MANNER); - sc_data[type].timer=add_timer( /* タイマー再設定(60秒) */ - 60000+tick, skill_status_change_timer, - bl->id, data); - return 0; - } - } - break; - case SC_SELFDESTRUCTION: /* 自爆 */ - if(--sc_data[type].val3>0){ - struct mob_data *md; - if(bl->type==BL_MOB && (md=(struct mob_data *)bl) && md->stats[MOB_SPEED] > 250){ - md->stats[MOB_SPEED] -= 250; - md->next_walktime=tick; - } - sc_data[type].timer=add_timer( /* タイマー再設定 */ - 1000+tick, skill_status_change_timer, - bl->id, data); - return 0; - } - break; + /* 時間切れ無し?? */ + case SC_AETERNA: + case SC_TRICKDEAD: + case SC_RIDING: + case SC_FALCON: + case SC_WEIGHT50: + case SC_WEIGHT90: + case SC_MAGICPOWER: /* 魔法力増幅 */ + case SC_REJECTSWORD: /* リジェクトソード */ + case SC_MEMORIZE: /* メモライズ */ + case SC_BROKNWEAPON: + case SC_BROKNARMOR: + if (sc_data[type].timer == tid) + sc_data[type].timer = + add_timer (1000 * 600 + tick, skill_status_change_timer, + bl->id, data); + return 0; + + case SC_DANCING: //ダンススキルの時間SP消費 + { + int s = 0; + if (sd) + { + if (sd->status.sp > 0 && (--sc_data[type].val3) > 0) + { + switch (sc_data[type].val1) + { + case BD_RICHMANKIM: /* ニヨルドの宴 3秒にSP1 */ + case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き 3秒にSP1 */ + case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 3秒にSP1 */ + case BD_SIEGFRIED: /* 不死身のジークフリード 3秒にSP1 */ + case BA_DISSONANCE: /* 不協和音 3秒でSP1 */ + case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス 3秒でSP1 */ + case DC_UGLYDANCE: /* 自分勝手なダンス 3秒でSP1 */ + s = 3; + break; + case BD_LULLABY: /* 子守歌 4秒にSP1 */ + case BD_ETERNALCHAOS: /* 永遠の混沌 4秒にSP1 */ + case BD_ROKISWEIL: /* ロキの叫び 4秒にSP1 */ + case DC_FORTUNEKISS: /* 幸運のキス 4秒でSP1 */ + s = 4; + break; + case BD_INTOABYSS: /* 深淵の中に 5秒にSP1 */ + case BA_WHISTLE: /* 口笛 5秒でSP1 */ + case DC_HUMMING: /* ハミング 5秒でSP1 */ + case BA_POEMBRAGI: /* ブラギの詩 5秒でSP1 */ + case DC_SERVICEFORYOU: /* サービスフォーユー 5秒でSP1 */ + s = 5; + break; + case BA_APPLEIDUN: /* イドゥンの林檎 6秒でSP1 */ + s = 6; + break; + case DC_DONTFORGETME: /* 私を忘れないで… 10秒でSP1 */ + case CG_MOONLIT: /* 月明りの泉に落ちる花びら 10秒でSP1? */ + s = 10; + break; + } + if (s && ((sc_data[type].val3 % s) == 0)) + { + sd->status.sp--; + clif_updatestatus (sd, SP_SP); + } + sc_data[type].timer = add_timer ( /* タイマー再設定 */ + 1000 + tick, + skill_status_change_timer, + bl->id, data); + return 0; + } + } + } + break; + case SC_BERSERK: /* バーサーク */ + if (sd) + { /* HPが100以上なら継続 */ + if ((sd->status.hp - sd->status.hp / 100) > 100) + { + sd->status.hp -= sd->status.hp / 100; + clif_updatestatus (sd, SP_HP); + sc_data[type].timer = add_timer ( /* タイマー再設定 */ + 15000 + tick, + skill_status_change_timer, + bl->id, data); + return 0; + } + } + break; + case SC_WEDDING: //結婚用(結婚衣裳になって歩くのが遅いとか) + if (sd) + { + time_t timer; + if (time (&timer) < ((sc_data[type].val2) + 3600)) + { //1時間たっていないので継続 + sc_data[type].timer = add_timer ( /* タイマー再設定 */ + 10000 + tick, + skill_status_change_timer, + bl->id, data); + return 0; + } + } + break; + case SC_NOCHAT: //チャット禁止状態 + if (sd && battle_config.muting_players) + { + time_t timer; + if ((++sd->status.manner) + && time (&timer) < + ((sc_data[type].val2) + 60 * (0 - sd->status.manner))) + { //開始からstatus.manner分経ってないので継続 + clif_updatestatus (sd, SP_MANNER); + sc_data[type].timer = add_timer ( /* タイマー再設定(60秒) */ + 60000 + tick, + skill_status_change_timer, + bl->id, data); + return 0; + } + } + break; + case SC_SELFDESTRUCTION: /* 自爆 */ + if (--sc_data[type].val3 > 0) + { + struct mob_data *md; + if (bl->type == BL_MOB && (md = (struct mob_data *) bl) + && md->stats[MOB_SPEED] > 250) + { + md->stats[MOB_SPEED] -= 250; + md->next_walktime = tick; + } + sc_data[type].timer = add_timer ( /* タイマー再設定 */ + 1000 + tick, + skill_status_change_timer, + bl->id, data); + return 0; + } + break; case SC_FLYING_BACKPACK: - clif_updatestatus(sd, SP_WEIGHT); + clif_updatestatus (sd, SP_WEIGHT); break; - } + } - return skill_status_change_end( bl,type,tid ); + return skill_status_change_end (bl, type, tid); } /*========================================== * ステータス異常終了 *------------------------------------------ */ -int skill_encchant_eremental_end(struct block_list *bl,int type) +int skill_encchant_eremental_end (struct block_list *bl, int type) { - struct status_change *sc_data; - - nullpo_retr(0, bl); - nullpo_retr(0, sc_data=battle_get_sc_data(bl)); - - if( type!=SC_ENCPOISON && sc_data[SC_ENCPOISON].timer!=-1 ) /* エンチャントポイズン解除 */ - skill_status_change_end(bl,SC_ENCPOISON,-1); - if( type!=SC_ASPERSIO && sc_data[SC_ASPERSIO].timer!=-1 ) /* アスペルシオ解除 */ - skill_status_change_end(bl,SC_ASPERSIO,-1); - if( type!=SC_FLAMELAUNCHER && sc_data[SC_FLAMELAUNCHER].timer!=-1 ) /* フレイムランチャ解除 */ - skill_status_change_end(bl,SC_FLAMELAUNCHER,-1); - if( type!=SC_FROSTWEAPON && sc_data[SC_FROSTWEAPON].timer!=-1 ) /* フロストウェポン解除 */ - skill_status_change_end(bl,SC_FROSTWEAPON,-1); - if( type!=SC_LIGHTNINGLOADER && sc_data[SC_LIGHTNINGLOADER].timer!=-1 ) /* ライトニングローダー解除 */ - skill_status_change_end(bl,SC_LIGHTNINGLOADER,-1); - if( type!=SC_SEISMICWEAPON && sc_data[SC_SEISMICWEAPON].timer!=-1 ) /* サイスミックウェポン解除 */ - skill_status_change_end(bl,SC_SEISMICWEAPON,-1); - - return 0; + struct status_change *sc_data; + + nullpo_retr (0, bl); + nullpo_retr (0, sc_data = battle_get_sc_data (bl)); + + if (type != SC_ENCPOISON && sc_data[SC_ENCPOISON].timer != -1) /* エンチャントポイズン解除 */ + skill_status_change_end (bl, SC_ENCPOISON, -1); + if (type != SC_ASPERSIO && sc_data[SC_ASPERSIO].timer != -1) /* アスペルシオ解除 */ + skill_status_change_end (bl, SC_ASPERSIO, -1); + if (type != SC_FLAMELAUNCHER && sc_data[SC_FLAMELAUNCHER].timer != -1) /* フレイムランチャ解除 */ + skill_status_change_end (bl, SC_FLAMELAUNCHER, -1); + if (type != SC_FROSTWEAPON && sc_data[SC_FROSTWEAPON].timer != -1) /* フロストウェポン解除 */ + skill_status_change_end (bl, SC_FROSTWEAPON, -1); + if (type != SC_LIGHTNINGLOADER && sc_data[SC_LIGHTNINGLOADER].timer != -1) /* ライトニングローダー解除 */ + skill_status_change_end (bl, SC_LIGHTNINGLOADER, -1); + if (type != SC_SEISMICWEAPON && sc_data[SC_SEISMICWEAPON].timer != -1) /* サイスミックウェポン解除 */ + skill_status_change_end (bl, SC_SEISMICWEAPON, -1); + + return 0; } + /*========================================== * ステータス異常開始 *------------------------------------------ */ -int skill_status_change_start(struct block_list *bl, int type, int val1, int val2, int val3, int val4, int tick, int flag) +int skill_status_change_start (struct block_list *bl, int type, int val1, + int val2, int val3, int val4, int tick, + int flag) { - return skill_status_effect(bl, type, val1, val2, val3, val4, tick, flag, 0); + return skill_status_effect (bl, type, val1, val2, val3, val4, tick, flag, + 0); } - -int skill_status_effect(struct block_list *bl, int type, int val1, int val2, int val3, int val4, int tick, int flag, int spell_invocation) +int skill_status_effect (struct block_list *bl, int type, int val1, int val2, + int val3, int val4, int tick, int flag, + int spell_invocation) { - struct map_session_data *sd = NULL; - struct status_change* sc_data; - short *sc_count, *option, *opt1, *opt2, *opt3; - int opt_flag = 0, calc_flag = 0,updateflag = 0, race, mode, elem, undead_flag; - int scdef=0; - - nullpo_retr(0, bl); - if(bl->type == BL_SKILL) - return 0; - nullpo_retr(0, sc_data=battle_get_sc_data(bl)); - nullpo_retr(0, sc_count=battle_get_sc_count(bl)); - nullpo_retr(0, option=battle_get_option(bl)); - nullpo_retr(0, opt1=battle_get_opt1(bl)); - nullpo_retr(0, opt2=battle_get_opt2(bl)); - nullpo_retr(0, opt3=battle_get_opt3(bl)); - - race=battle_get_race(bl); - mode=battle_get_mode(bl); - elem=battle_get_elem_type(bl); - undead_flag=battle_check_undead(race,elem); - - if(type == SC_AETERNA && (sc_data[SC_STONE].timer != -1 || sc_data[SC_FREEZE].timer != -1) ) - return 0; - - switch(type){ - case SC_STONE: - case SC_FREEZE: - scdef=3+battle_get_mdef(bl)+battle_get_luk(bl)/3; - break; - case SC_STAN: - case SC_SILENCE: - case SC_POISON: - scdef=3+battle_get_vit(bl)+battle_get_luk(bl)/3; - break; - case SC_SLEEP: - case SC_BLIND: - scdef=3+battle_get_int(bl)+battle_get_luk(bl)/3; - break; - case SC_CURSE: - scdef=3+battle_get_luk(bl); - break; + struct map_session_data *sd = NULL; + struct status_change *sc_data; + short *sc_count, *option, *opt1, *opt2, *opt3; + int opt_flag = 0, calc_flag = 0, updateflag = + 0, race, mode, elem, undead_flag; + int scdef = 0; + + nullpo_retr (0, bl); + if (bl->type == BL_SKILL) + return 0; + nullpo_retr (0, sc_data = battle_get_sc_data (bl)); + nullpo_retr (0, sc_count = battle_get_sc_count (bl)); + nullpo_retr (0, option = battle_get_option (bl)); + nullpo_retr (0, opt1 = battle_get_opt1 (bl)); + nullpo_retr (0, opt2 = battle_get_opt2 (bl)); + nullpo_retr (0, opt3 = battle_get_opt3 (bl)); + + race = battle_get_race (bl); + mode = battle_get_mode (bl); + elem = battle_get_elem_type (bl); + undead_flag = battle_check_undead (race, elem); + + if (type == SC_AETERNA + && (sc_data[SC_STONE].timer != -1 || sc_data[SC_FREEZE].timer != -1)) + return 0; -// case SC_CONFUSION: - default: - scdef=0; - } - if(scdef>=100) - return 0; - if(bl->type==BL_PC){ - sd=(struct map_session_data *)bl; - if( sd && type == SC_ADRENALINE && !(skill_get_weapontype(BS_ADRENALINE)&(1<<sd->status.weapon))) - return 0; - - if(SC_STONE<=type && type<=SC_BLIND){ /* カードによる耐性 */ - if( sd && sd->reseff[type-SC_STONE] > 0 && MRAND(10000)<sd->reseff[type-SC_STONE]){ - if(battle_config.battle_log) - printf("PC %d skill_sc_start: cardによる異常耐性発動\n",sd->bl.id); - return 0; - } - } - } - else if(bl->type == BL_MOB) { - } - else { - if(battle_config.error_log) - printf("skill_status_change_start: neither MOB nor PC !\n"); - return 0; - } + switch (type) + { + case SC_STONE: + case SC_FREEZE: + scdef = 3 + battle_get_mdef (bl) + battle_get_luk (bl) / 3; + break; + case SC_STAN: + case SC_SILENCE: + case SC_POISON: + scdef = 3 + battle_get_vit (bl) + battle_get_luk (bl) / 3; + break; + case SC_SLEEP: + case SC_BLIND: + scdef = 3 + battle_get_int (bl) + battle_get_luk (bl) / 3; + break; + case SC_CURSE: + scdef = 3 + battle_get_luk (bl); + break; - if(type==SC_FREEZE && undead_flag && !(flag&1)) - return 0; +// case SC_CONFUSION: + default: + scdef = 0; + } + if (scdef >= 100) + return 0; + if (bl->type == BL_PC) + { + sd = (struct map_session_data *) bl; + if (sd && type == SC_ADRENALINE + && !(skill_get_weapontype (BS_ADRENALINE) & + (1 << sd->status.weapon))) + return 0; + + if (SC_STONE <= type && type <= SC_BLIND) + { /* カードによる耐性 */ + if (sd && sd->reseff[type - SC_STONE] > 0 + && MRAND (10000) < sd->reseff[type - SC_STONE]) + { + if (battle_config.battle_log) + printf ("PC %d skill_sc_start: cardによる異常耐性発動\n", + sd->bl.id); + return 0; + } + } + } + else if (bl->type == BL_MOB) + { + } + else + { + if (battle_config.error_log) + printf ("skill_status_change_start: neither MOB nor PC !\n"); + return 0; + } - if((type == SC_ADRENALINE || type == SC_WEAPONPERFECTION || type == SC_OVERTHRUST) && - sc_data[type].timer != -1 && sc_data[type].val2 && !val2) - return 0; + if (type == SC_FREEZE && undead_flag && !(flag & 1)) + return 0; - if(mode & 0x20 && (type==SC_STONE || type==SC_FREEZE || - type==SC_STAN || type==SC_SLEEP || type==SC_SILENCE || type==SC_QUAGMIRE || type == SC_DECREASEAGI || type == SC_SIGNUMCRUCIS || type == SC_PROVOKE || - (type == SC_BLESSING && (undead_flag || race == 6))) && !(flag&1)){ - /* ボスには効かない(ただしカードによる効果は適用される) */ - return 0; - } - if(type==SC_FREEZE || type==SC_STAN || type==SC_SLEEP) - battle_stopwalking(bl,1); - - if(sc_data[type].timer != -1){ /* すでに同じ異常になっている場合タイマ解除 */ - if(sc_data[type].val1 > val1 && type != SC_COMBO && type != SC_DANCING && type != SC_DEVOTION && - type != SC_SPEEDPOTION0 && type != SC_SPEEDPOTION1 && type != SC_SPEEDPOTION2 - && type != SC_ATKPOT && type != SC_MATKPOT) // added atk and matk potions [Valaris] - return 0; - if(type >=SC_STAN && type <= SC_BLIND) - return 0;/* 継ぎ足しができない状態異常である時は状態異常を行わない */ - if(type == SC_GRAFFITI){ //異常中にもう一度状態異常になった時に解除してから再度かかる - skill_status_change_end(bl,type,-1); - }else{ - (*sc_count)--; - delete_timer(sc_data[type].timer, skill_status_change_timer); - sc_data[type].timer = -1; - } - } + if ((type == SC_ADRENALINE || type == SC_WEAPONPERFECTION + || type == SC_OVERTHRUST) && sc_data[type].timer != -1 + && sc_data[type].val2 && !val2) + return 0; - switch(type){ /* 異常の種類ごとの処理 */ - case SC_PROVOKE: /* プロボック */ - calc_flag = 1; - if(tick <= 0) tick = 1000; /* (オートバーサーク) */ - break; - case SC_ENDURE: /* インデュア */ - if(tick <= 0) tick = 1000 * 60; - break; - case SC_CONCENTRATE: /* 集中力向上 */ - calc_flag = 1; - break; - case SC_BLESSING: /* ブレッシング */ - { - if(bl->type == BL_PC || (!undead_flag && race != 6)) { - if(sc_data[SC_CURSE].timer!=-1 ) - skill_status_change_end(bl,SC_CURSE,-1); - if(sc_data[SC_STONE].timer!=-1 && sc_data[SC_STONE].val2 == 0) - skill_status_change_end(bl,SC_STONE,-1); - } - calc_flag = 1; - } - break; - case SC_ANGELUS: /* アンゼルス */ - calc_flag = 1; - break; - case SC_INCREASEAGI: /* 速度上昇 */ - calc_flag = 1; - if(sc_data[SC_DECREASEAGI].timer!=-1 ) - skill_status_change_end(bl,SC_DECREASEAGI,-1); - if(sc_data[SC_WINDWALK].timer!=-1 ) /* ウインドウォーク */ - skill_status_change_end(bl,SC_WINDWALK,-1); - break; - case SC_DECREASEAGI: /* 速度減少 */ - calc_flag = 1; - if(sc_data[SC_INCREASEAGI].timer!=-1 ) - skill_status_change_end(bl,SC_INCREASEAGI,-1); - break; - case SC_SIGNUMCRUCIS: /* シグナムクルシス */ - calc_flag = 1; -// val2 = 14 + val1; - val2 = 10 + val1*2; - tick = 600*1000; - clif_emotion(bl,4); - break; - case SC_SLOWPOISON: - if(sc_data[SC_POISON].timer == -1 ) - return 0; - break; - case SC_TWOHANDQUICKEN: /* 2HQ */ - *opt3 |= 1; - calc_flag = 1; - break; - case SC_ADRENALINE: /* アドレナリンラッシュ */ - calc_flag = 1; - break; - case SC_WEAPONPERFECTION: /* ウェポンパーフェクション */ - if(battle_config.party_skill_penaly && !val2) tick /= 5; - break; - case SC_OVERTHRUST: /* オーバースラスト */ - *opt3 |= 2; - if(battle_config.party_skill_penaly && !val2) tick /= 10; - break; - case SC_MAXIMIZEPOWER: /* マキシマイズパワー(SPが1減る時間,val2にも) */ - if(bl->type == BL_PC) - val2 = tick; - else - tick = 5000*val1; - break; - case SC_ENCPOISON: /* エンチャントポイズン */ - calc_flag = 1; - val2=(((val1 - 1) / 2) + 3)*100; /* 毒付与確率 */ - skill_encchant_eremental_end(bl,SC_ENCPOISON); - break; - case SC_POISONREACT: /* ポイズンリアクト */ - break; - case SC_IMPOSITIO: /* インポシティオマヌス */ - calc_flag = 1; - break; - case SC_ASPERSIO: /* アスペルシオ */ - skill_encchant_eremental_end(bl,SC_ASPERSIO); - break; - case SC_SUFFRAGIUM: /* サフラギム */ - case SC_BENEDICTIO: /* 聖体 */ - case SC_MAGNIFICAT: /* マグニフィカート */ - case SC_AETERNA: /* エーテルナ */ - break; - case SC_ENERGYCOAT: /* エナジーコート */ - *opt3 |= 4; - break; - case SC_MAGICROD: - val2 = val1*20; - break; - case SC_KYRIE: /* キリエエレイソン */ - val2 = battle_get_max_hp(bl) * (val1 * 2 + 10) / 100;/* 耐久度 */ - val3 = (val1 / 2 + 5); /* 回数 */ + if (mode & 0x20 && (type == SC_STONE || type == SC_FREEZE || + type == SC_STAN || type == SC_SLEEP + || type == SC_SILENCE || type == SC_QUAGMIRE + || type == SC_DECREASEAGI || type == SC_SIGNUMCRUCIS + || type == SC_PROVOKE || (type == SC_BLESSING + && (undead_flag + || race == 6))) + && !(flag & 1)) + { + /* ボスには効かない(ただしカードによる効果は適用される) */ + return 0; + } + if (type == SC_FREEZE || type == SC_STAN || type == SC_SLEEP) + battle_stopwalking (bl, 1); + + if (sc_data[type].timer != -1) + { /* すでに同じ異常になっている場合タイマ解除 */ + if (sc_data[type].val1 > val1 && type != SC_COMBO && type != SC_DANCING && type != SC_DEVOTION && type != SC_SPEEDPOTION0 && type != SC_SPEEDPOTION1 && type != SC_SPEEDPOTION2 && type != SC_ATKPOT && type != SC_MATKPOT) // added atk and matk potions [Valaris] + return 0; + if (type >= SC_STAN && type <= SC_BLIND) + return 0; /* 継ぎ足しができない状態異常である時は状態異常を行わない */ + if (type == SC_GRAFFITI) + { //異常中にもう一度状態異常になった時に解除してから再度かかる + skill_status_change_end (bl, type, -1); + } + else + { + (*sc_count)--; + delete_timer (sc_data[type].timer, skill_status_change_timer); + sc_data[type].timer = -1; + } + } + + switch (type) + { /* 異常の種類ごとの処理 */ + case SC_PROVOKE: /* プロボック */ + calc_flag = 1; + if (tick <= 0) + tick = 1000; /* (オートバーサーク) */ + break; + case SC_ENDURE: /* インデュア */ + if (tick <= 0) + tick = 1000 * 60; + break; + case SC_CONCENTRATE: /* 集中力向上 */ + calc_flag = 1; + break; + case SC_BLESSING: /* ブレッシング */ + { + if (bl->type == BL_PC || (!undead_flag && race != 6)) + { + if (sc_data[SC_CURSE].timer != -1) + skill_status_change_end (bl, SC_CURSE, -1); + if (sc_data[SC_STONE].timer != -1 + && sc_data[SC_STONE].val2 == 0) + skill_status_change_end (bl, SC_STONE, -1); + } + calc_flag = 1; + } + break; + case SC_ANGELUS: /* アンゼルス */ + calc_flag = 1; + break; + case SC_INCREASEAGI: /* 速度上昇 */ + calc_flag = 1; + if (sc_data[SC_DECREASEAGI].timer != -1) + skill_status_change_end (bl, SC_DECREASEAGI, -1); + if (sc_data[SC_WINDWALK].timer != -1) /* ウインドウォーク */ + skill_status_change_end (bl, SC_WINDWALK, -1); + break; + case SC_DECREASEAGI: /* 速度減少 */ + calc_flag = 1; + if (sc_data[SC_INCREASEAGI].timer != -1) + skill_status_change_end (bl, SC_INCREASEAGI, -1); + break; + case SC_SIGNUMCRUCIS: /* シグナムクルシス */ + calc_flag = 1; +// val2 = 14 + val1; + val2 = 10 + val1 * 2; + tick = 600 * 1000; + clif_emotion (bl, 4); + break; + case SC_SLOWPOISON: + if (sc_data[SC_POISON].timer == -1) + return 0; + break; + case SC_TWOHANDQUICKEN: /* 2HQ */ + *opt3 |= 1; + calc_flag = 1; + break; + case SC_ADRENALINE: /* アドレナリンラッシュ */ + calc_flag = 1; + break; + case SC_WEAPONPERFECTION: /* ウェポンパーフェクション */ + if (battle_config.party_skill_penaly && !val2) + tick /= 5; + break; + case SC_OVERTHRUST: /* オーバースラスト */ + *opt3 |= 2; + if (battle_config.party_skill_penaly && !val2) + tick /= 10; + break; + case SC_MAXIMIZEPOWER: /* マキシマイズパワー(SPが1減る時間,val2にも) */ + if (bl->type == BL_PC) + val2 = tick; + else + tick = 5000 * val1; + break; + case SC_ENCPOISON: /* エンチャントポイズン */ + calc_flag = 1; + val2 = (((val1 - 1) / 2) + 3) * 100; /* 毒付与確率 */ + skill_encchant_eremental_end (bl, SC_ENCPOISON); + break; + case SC_POISONREACT: /* ポイズンリアクト */ + break; + case SC_IMPOSITIO: /* インポシティオマヌス */ + calc_flag = 1; + break; + case SC_ASPERSIO: /* アスペルシオ */ + skill_encchant_eremental_end (bl, SC_ASPERSIO); + break; + case SC_SUFFRAGIUM: /* サフラギム */ + case SC_BENEDICTIO: /* 聖体 */ + case SC_MAGNIFICAT: /* マグニフィカート */ + case SC_AETERNA: /* エーテルナ */ + break; + case SC_ENERGYCOAT: /* エナジーコート */ + *opt3 |= 4; + break; + case SC_MAGICROD: + val2 = val1 * 20; + break; + case SC_KYRIE: /* キリエエレイソン */ + val2 = battle_get_max_hp (bl) * (val1 * 2 + 10) / 100; /* 耐久度 */ + val3 = (val1 / 2 + 5); /* 回数 */ // -- moonsoul (added to undo assumptio status if target has it) - if(sc_data[SC_ASSUMPTIO].timer!=-1 ) - skill_status_change_end(bl,SC_ASSUMPTIO,-1); - break; - case SC_MINDBREAKER: - calc_flag = 1; - if(tick <= 0) tick = 1000; /* (オートバーサーク) */ - case SC_GLORIA: /* グロリア */ - calc_flag = 1; - break; - case SC_LOUD: /* ラウドボイス */ - calc_flag = 1; - break; - case SC_TRICKDEAD: /* 死んだふり */ - break; - case SC_QUAGMIRE: /* クァグマイア */ - calc_flag = 1; - if(sc_data[SC_CONCENTRATE].timer!=-1 ) /* 集中力向上解除 */ - skill_status_change_end(bl,SC_CONCENTRATE,-1); - if(sc_data[SC_INCREASEAGI].timer!=-1 ) /* 速度上昇解除 */ - skill_status_change_end(bl,SC_INCREASEAGI,-1); - if(sc_data[SC_TWOHANDQUICKEN].timer!=-1 ) - skill_status_change_end(bl,SC_TWOHANDQUICKEN,-1); - if(sc_data[SC_SPEARSQUICKEN].timer!=-1 ) - skill_status_change_end(bl,SC_SPEARSQUICKEN,-1); - if(sc_data[SC_ADRENALINE].timer!=-1 ) - skill_status_change_end(bl,SC_ADRENALINE,-1); - if(sc_data[SC_LOUD].timer!=-1 ) - skill_status_change_end(bl,SC_LOUD,-1); - if(sc_data[SC_TRUESIGHT].timer!=-1 ) /* トゥルーサイト */ - skill_status_change_end(bl,SC_TRUESIGHT,-1); - if(sc_data[SC_WINDWALK].timer!=-1 ) /* ウインドウォーク */ - skill_status_change_end(bl,SC_WINDWALK,-1); - if(sc_data[SC_CARTBOOST].timer!=-1 ) /* カートブースト */ - skill_status_change_end(bl,SC_CARTBOOST,-1); - break; - case SC_FLAMELAUNCHER: /* フレームランチャー */ - skill_encchant_eremental_end(bl,SC_FLAMELAUNCHER); - break; - case SC_FROSTWEAPON: /* フロストウェポン */ - skill_encchant_eremental_end(bl,SC_FROSTWEAPON); - break; - case SC_LIGHTNINGLOADER: /* ライトニングローダー */ - skill_encchant_eremental_end(bl,SC_LIGHTNINGLOADER); - break; - case SC_SEISMICWEAPON: /* サイズミックウェポン */ - skill_encchant_eremental_end(bl,SC_SEISMICWEAPON); - break; - case SC_DEVOTION: /* ディボーション */ - calc_flag = 1; - break; - case SC_PROVIDENCE: /* プロヴィデンス */ - calc_flag = 1; - val2=val1*5; - break; - case SC_REFLECTSHIELD: - val2=10+val1*3; - break; - case SC_STRIPWEAPON: - case SC_STRIPSHIELD: - case SC_STRIPARMOR: - case SC_STRIPHELM: - case SC_CP_WEAPON: - case SC_CP_SHIELD: - case SC_CP_ARMOR: - case SC_CP_HELM: - break; + if (sc_data[SC_ASSUMPTIO].timer != -1) + skill_status_change_end (bl, SC_ASSUMPTIO, -1); + break; + case SC_MINDBREAKER: + calc_flag = 1; + if (tick <= 0) + tick = 1000; /* (オートバーサーク) */ + case SC_GLORIA: /* グロリア */ + calc_flag = 1; + break; + case SC_LOUD: /* ラウドボイス */ + calc_flag = 1; + break; + case SC_TRICKDEAD: /* 死んだふり */ + break; + case SC_QUAGMIRE: /* クァグマイア */ + calc_flag = 1; + if (sc_data[SC_CONCENTRATE].timer != -1) /* 集中力向上解除 */ + skill_status_change_end (bl, SC_CONCENTRATE, -1); + if (sc_data[SC_INCREASEAGI].timer != -1) /* 速度上昇解除 */ + skill_status_change_end (bl, SC_INCREASEAGI, -1); + if (sc_data[SC_TWOHANDQUICKEN].timer != -1) + skill_status_change_end (bl, SC_TWOHANDQUICKEN, -1); + if (sc_data[SC_SPEARSQUICKEN].timer != -1) + skill_status_change_end (bl, SC_SPEARSQUICKEN, -1); + if (sc_data[SC_ADRENALINE].timer != -1) + skill_status_change_end (bl, SC_ADRENALINE, -1); + if (sc_data[SC_LOUD].timer != -1) + skill_status_change_end (bl, SC_LOUD, -1); + if (sc_data[SC_TRUESIGHT].timer != -1) /* トゥルーサイト */ + skill_status_change_end (bl, SC_TRUESIGHT, -1); + if (sc_data[SC_WINDWALK].timer != -1) /* ウインドウォーク */ + skill_status_change_end (bl, SC_WINDWALK, -1); + if (sc_data[SC_CARTBOOST].timer != -1) /* カートブースト */ + skill_status_change_end (bl, SC_CARTBOOST, -1); + break; + case SC_FLAMELAUNCHER: /* フレームランチャー */ + skill_encchant_eremental_end (bl, SC_FLAMELAUNCHER); + break; + case SC_FROSTWEAPON: /* フロストウェポン */ + skill_encchant_eremental_end (bl, SC_FROSTWEAPON); + break; + case SC_LIGHTNINGLOADER: /* ライトニングローダー */ + skill_encchant_eremental_end (bl, SC_LIGHTNINGLOADER); + break; + case SC_SEISMICWEAPON: /* サイズミックウェポン */ + skill_encchant_eremental_end (bl, SC_SEISMICWEAPON); + break; + case SC_DEVOTION: /* ディボーション */ + calc_flag = 1; + break; + case SC_PROVIDENCE: /* プロヴィデンス */ + calc_flag = 1; + val2 = val1 * 5; + break; + case SC_REFLECTSHIELD: + val2 = 10 + val1 * 3; + break; + case SC_STRIPWEAPON: + case SC_STRIPSHIELD: + case SC_STRIPARMOR: + case SC_STRIPHELM: + case SC_CP_WEAPON: + case SC_CP_SHIELD: + case SC_CP_ARMOR: + case SC_CP_HELM: + break; - case SC_AUTOSPELL: /* オートスペル */ - val4 = 5 + val1*2; - break; + case SC_AUTOSPELL: /* オートスペル */ + val4 = 5 + val1 * 2; + break; - case SC_VOLCANO: - calc_flag = 1; - val3 = val1*10; - val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) ); - break; - case SC_DELUGE: - calc_flag = 1; - val3 = val1>=5?15: (val1==4?14: (val1==3?12: ( val1==2?9:5 ) ) ); - val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) ); - break; - case SC_VIOLENTGALE: - calc_flag = 1; - val3 = val1*3; - val4 = val1>=5?20: (val1==4?19: (val1==3?17: ( val1==2?14:10 ) ) ); - break; + case SC_VOLCANO: + calc_flag = 1; + val3 = val1 * 10; + val4 = + val1 >= 5 ? 20 : (val1 == + 4 ? 19 : (val1 == + 3 ? 17 : (val1 == 2 ? 14 : 10))); + break; + case SC_DELUGE: + calc_flag = 1; + val3 = + val1 >= 5 ? 15 : (val1 == + 4 ? 14 : (val1 == + 3 ? 12 : (val1 == 2 ? 9 : 5))); + val4 = + val1 >= 5 ? 20 : (val1 == + 4 ? 19 : (val1 == + 3 ? 17 : (val1 == 2 ? 14 : 10))); + break; + case SC_VIOLENTGALE: + calc_flag = 1; + val3 = val1 * 3; + val4 = + val1 >= 5 ? 20 : (val1 == + 4 ? 19 : (val1 == + 3 ? 17 : (val1 == 2 ? 14 : 10))); + break; - case SC_SPEARSQUICKEN: /* スピアクイッケン */ - calc_flag = 1; - val2 = 20+val1; - *opt3 |= 1; - break; - case SC_COMBO: - break; - case SC_BLADESTOP_WAIT: /* 白刃取り(待ち) */ - break; - case SC_BLADESTOP: /* 白刃取り */ - if(val2==2) clif_bladestop((struct block_list *)val3,(struct block_list *)val4,1); - *opt3 |= 32; - break; + case SC_SPEARSQUICKEN: /* スピアクイッケン */ + calc_flag = 1; + val2 = 20 + val1; + *opt3 |= 1; + break; + case SC_COMBO: + break; + case SC_BLADESTOP_WAIT: /* 白刃取り(待ち) */ + break; + case SC_BLADESTOP: /* 白刃取り */ + if (val2 == 2) + clif_bladestop ((struct block_list *) val3, + (struct block_list *) val4, 1); + *opt3 |= 32; + break; - case SC_LULLABY: /* 子守唄 */ - val2 = 11; - break; - case SC_RICHMANKIM: - break; - case SC_ETERNALCHAOS: /* エターナルカオス */ - calc_flag = 1; - break; - case SC_DRUMBATTLE: /* 戦太鼓の響き */ - calc_flag = 1; - val2 = (val1+1)*25; - val3 = (val1+1)*2; - break; - case SC_NIBELUNGEN: /* ニーベルングの指輪 */ - calc_flag = 1; - val2 = (val1+2)*50; - val3 = (val1+2)*25; - break; - case SC_ROKISWEIL: /* ロキの叫び */ - break; - case SC_INTOABYSS: /* 深淵の中に */ - break; - case SC_SIEGFRIED: /* 不死身のジークフリード */ - calc_flag = 1; - val2 = 40 + val1*5; - val3 = val1*10; - break; - case SC_DISSONANCE: /* 不協和音 */ - val2 = 10; - break; - case SC_WHISTLE: /* 口笛 */ - calc_flag = 1; - break; - case SC_ASSNCROS: /* 夕陽のアサシンクロス */ - calc_flag = 1; - break; - case SC_POEMBRAGI: /* ブラギの詩 */ - break; - case SC_APPLEIDUN: /* イドゥンの林檎 */ - calc_flag = 1; - break; - case SC_UGLYDANCE: /* 自分勝手なダンス */ - val2 = 10; - break; - case SC_HUMMING: /* ハミング */ - calc_flag = 1; - break; - case SC_DONTFORGETME: /* 私を忘れないで */ - calc_flag = 1; - if(sc_data[SC_INCREASEAGI].timer!=-1 ) /* 速度上昇解除 */ - skill_status_change_end(bl,SC_INCREASEAGI,-1); - if(sc_data[SC_TWOHANDQUICKEN].timer!=-1 ) - skill_status_change_end(bl,SC_TWOHANDQUICKEN,-1); - if(sc_data[SC_SPEARSQUICKEN].timer!=-1 ) - skill_status_change_end(bl,SC_SPEARSQUICKEN,-1); - if(sc_data[SC_ADRENALINE].timer!=-1 ) - skill_status_change_end(bl,SC_ADRENALINE,-1); - if(sc_data[SC_ASSNCROS].timer!=-1 ) - skill_status_change_end(bl,SC_ASSNCROS,-1); - if(sc_data[SC_TRUESIGHT].timer!=-1 ) /* トゥルーサイト */ - skill_status_change_end(bl,SC_TRUESIGHT,-1); - if(sc_data[SC_WINDWALK].timer!=-1 ) /* ウインドウォーク */ - skill_status_change_end(bl,SC_WINDWALK,-1); - if(sc_data[SC_CARTBOOST].timer!=-1 ) /* カートブースト */ - skill_status_change_end(bl,SC_CARTBOOST,-1); - break; - case SC_FORTUNE: /* 幸運のキス */ - calc_flag = 1; - break; - case SC_SERVICE4U: /* サービスフォーユー */ - calc_flag = 1; - break; - case SC_DANCING: /* ダンス/演奏中 */ - calc_flag = 1; - val3= tick / 1000; - tick = 1000; - break; + case SC_LULLABY: /* 子守唄 */ + val2 = 11; + break; + case SC_RICHMANKIM: + break; + case SC_ETERNALCHAOS: /* エターナルカオス */ + calc_flag = 1; + break; + case SC_DRUMBATTLE: /* 戦太鼓の響き */ + calc_flag = 1; + val2 = (val1 + 1) * 25; + val3 = (val1 + 1) * 2; + break; + case SC_NIBELUNGEN: /* ニーベルングの指輪 */ + calc_flag = 1; + val2 = (val1 + 2) * 50; + val3 = (val1 + 2) * 25; + break; + case SC_ROKISWEIL: /* ロキの叫び */ + break; + case SC_INTOABYSS: /* 深淵の中に */ + break; + case SC_SIEGFRIED: /* 不死身のジークフリード */ + calc_flag = 1; + val2 = 40 + val1 * 5; + val3 = val1 * 10; + break; + case SC_DISSONANCE: /* 不協和音 */ + val2 = 10; + break; + case SC_WHISTLE: /* 口笛 */ + calc_flag = 1; + break; + case SC_ASSNCROS: /* 夕陽のアサシンクロス */ + calc_flag = 1; + break; + case SC_POEMBRAGI: /* ブラギの詩 */ + break; + case SC_APPLEIDUN: /* イドゥンの林檎 */ + calc_flag = 1; + break; + case SC_UGLYDANCE: /* 自分勝手なダンス */ + val2 = 10; + break; + case SC_HUMMING: /* ハミング */ + calc_flag = 1; + break; + case SC_DONTFORGETME: /* 私を忘れないで */ + calc_flag = 1; + if (sc_data[SC_INCREASEAGI].timer != -1) /* 速度上昇解除 */ + skill_status_change_end (bl, SC_INCREASEAGI, -1); + if (sc_data[SC_TWOHANDQUICKEN].timer != -1) + skill_status_change_end (bl, SC_TWOHANDQUICKEN, -1); + if (sc_data[SC_SPEARSQUICKEN].timer != -1) + skill_status_change_end (bl, SC_SPEARSQUICKEN, -1); + if (sc_data[SC_ADRENALINE].timer != -1) + skill_status_change_end (bl, SC_ADRENALINE, -1); + if (sc_data[SC_ASSNCROS].timer != -1) + skill_status_change_end (bl, SC_ASSNCROS, -1); + if (sc_data[SC_TRUESIGHT].timer != -1) /* トゥルーサイト */ + skill_status_change_end (bl, SC_TRUESIGHT, -1); + if (sc_data[SC_WINDWALK].timer != -1) /* ウインドウォーク */ + skill_status_change_end (bl, SC_WINDWALK, -1); + if (sc_data[SC_CARTBOOST].timer != -1) /* カートブースト */ + skill_status_change_end (bl, SC_CARTBOOST, -1); + break; + case SC_FORTUNE: /* 幸運のキス */ + calc_flag = 1; + break; + case SC_SERVICE4U: /* サービスフォーユー */ + calc_flag = 1; + break; + case SC_DANCING: /* ダンス/演奏中 */ + calc_flag = 1; + val3 = tick / 1000; + tick = 1000; + break; - case SC_EXPLOSIONSPIRITS: // 爆裂波動 - calc_flag = 1; - val2 = 75 + 25*val1; - *opt3 |= 8; - break; - case SC_STEELBODY: // 金剛 - calc_flag = 1; - *opt3 |= 16; - break; - case SC_EXTREMITYFIST: /* 阿修羅覇凰拳 */ - break; - case SC_AUTOCOUNTER: - val3 = val4 = 0; - break; + case SC_EXPLOSIONSPIRITS: // 爆裂波動 + calc_flag = 1; + val2 = 75 + 25 * val1; + *opt3 |= 8; + break; + case SC_STEELBODY: // 金剛 + calc_flag = 1; + *opt3 |= 16; + break; + case SC_EXTREMITYFIST: /* 阿修羅覇凰拳 */ + break; + case SC_AUTOCOUNTER: + val3 = val4 = 0; + break; - case SC_SPEEDPOTION0: /* 増速ポーション */ - *opt2 |= 0x20; - case SC_SPEEDPOTION1: - case SC_SPEEDPOTION2: - calc_flag = 1; - tick = 1000 * tick; -// val2 = 5*(2+type-SC_SPEEDPOTION0); - break; + case SC_SPEEDPOTION0: /* 増速ポーション */ + *opt2 |= 0x20; + case SC_SPEEDPOTION1: + case SC_SPEEDPOTION2: + calc_flag = 1; + tick = 1000 * tick; +// val2 = 5*(2+type-SC_SPEEDPOTION0); + break; - /* atk & matk potions [Valaris] */ - case SC_ATKPOT: - *opt2 |= 0x80; - case SC_MATKPOT: - calc_flag = 1; - tick = 1000 * tick; - break; - case SC_WEDDING: //結婚用(結婚衣裳になって歩くのが遅いとか) - { - time_t timer; - - calc_flag = 1; - tick = 10000; - if(!val2) - val2 = time(&timer); - } - break; - case SC_NOCHAT: //チャット禁止状態 - { - time_t timer; - - if(!battle_config.muting_players) - break; - - tick = 60000; - if(!val2) - val2 = time(&timer); - updateflag = SP_MANNER; - } - break; - case SC_SELFDESTRUCTION: //自爆 - clif_skillcasting(bl,bl->id, bl->id,0,0,331,skill_get_time(val2,val1)); - val3 = tick / 1000; - tick = 1000; - break; + /* atk & matk potions [Valaris] */ + case SC_ATKPOT: + *opt2 |= 0x80; + case SC_MATKPOT: + calc_flag = 1; + tick = 1000 * tick; + break; + case SC_WEDDING: //結婚用(結婚衣裳になって歩くのが遅いとか) + { + time_t timer; + + calc_flag = 1; + tick = 10000; + if (!val2) + val2 = time (&timer); + } + break; + case SC_NOCHAT: //チャット禁止状態 + { + time_t timer; - /* option1 */ - case SC_STONE: /* 石化 */ - if(!(flag&2)) { - int sc_def = battle_get_mdef(bl)*200; - tick = tick - sc_def; - } - val3 = tick/1000; - if(val3 < 1) val3 = 1; - tick = 5000; - val2 = 1; - break; - case SC_SLEEP: /* 睡眠 */ - if(!(flag&2)) { -// int sc_def = 100 - (battle_get_int(bl) + battle_get_luk(bl)/3); -// tick = tick * sc_def / 100; -// if(tick < 1000) tick = 1000; - tick = 30000;//睡眠はステータス耐性に関わらず30秒 - } - break; - case SC_FREEZE: /* 凍結 */ - if(!(flag&2)) { - int sc_def = 100 - battle_get_mdef(bl); - tick = tick * sc_def / 100; - } - break; - case SC_STAN: /* スタン(val2にミリ秒セット) */ - if(!(flag&2)) { - int sc_def = 100 - (battle_get_vit(bl) + battle_get_luk(bl)/3); - tick = tick * sc_def / 100; - } - break; + if (!battle_config.muting_players) + break; - /* option2 */ - case SC_POISON: /* 毒 */ - calc_flag = 1; - if(!(flag&2)) { - int sc_def = 100 - (battle_get_vit(bl) + battle_get_luk(bl)/5); - tick = tick * sc_def / 100; - } - val3 = tick/1000; - if(val3 < 1) val3 = 1; - tick = 1000; - break; - case SC_SILENCE: /* 沈黙(レックスデビーナ) */ - if(!(flag&2)) { - int sc_def = 100 - battle_get_vit(bl); - tick = tick * sc_def / 100; - } - break; - case SC_BLIND: /* 暗黒 */ - calc_flag = 1; - if(!(flag&2)) { - int sc_def = battle_get_lv(bl)/10 + battle_get_int(bl)/15; - tick = 30000 - sc_def; - } - break; - case SC_CURSE: - calc_flag = 1; - if(!(flag&2)) { - int sc_def = 100 - battle_get_vit(bl); - tick = tick * sc_def / 100; - } - break; + tick = 60000; + if (!val2) + val2 = time (&timer); + updateflag = SP_MANNER; + } + break; + case SC_SELFDESTRUCTION: //自爆 + clif_skillcasting (bl, bl->id, bl->id, 0, 0, 331, + skill_get_time (val2, val1)); + val3 = tick / 1000; + tick = 1000; + break; - /* option */ - case SC_HIDING: /* ハイディング */ - calc_flag = 1; - if(bl->type == BL_PC) { - val2 = tick / 1000; /* 持続時間 */ - tick = 1000; - } - break; - case SC_CHASEWALK: - case SC_CLOAKING: /* クローキング */ - if(bl->type == BL_PC) - val2 = tick; - else - tick = 5000*val1; - break; - case SC_SIGHT: /* サイト/ルアフ */ - case SC_RUWACH: - val2 = tick/250; - tick = 10; - break; + /* option1 */ + case SC_STONE: /* 石化 */ + if (!(flag & 2)) + { + int sc_def = battle_get_mdef (bl) * 200; + tick = tick - sc_def; + } + val3 = tick / 1000; + if (val3 < 1) + val3 = 1; + tick = 5000; + val2 = 1; + break; + case SC_SLEEP: /* 睡眠 */ + if (!(flag & 2)) + { +// int sc_def = 100 - (battle_get_int(bl) + battle_get_luk(bl)/3); +// tick = tick * sc_def / 100; +// if(tick < 1000) tick = 1000; + tick = 30000; //睡眠はステータス耐性に関わらず30秒 + } + break; + case SC_FREEZE: /* 凍結 */ + if (!(flag & 2)) + { + int sc_def = 100 - battle_get_mdef (bl); + tick = tick * sc_def / 100; + } + break; + case SC_STAN: /* スタン(val2にミリ秒セット) */ + if (!(flag & 2)) + { + int sc_def = + 100 - (battle_get_vit (bl) + battle_get_luk (bl) / 3); + tick = tick * sc_def / 100; + } + break; - /* セーフティウォール、ニューマ */ - case SC_SAFETYWALL: case SC_PNEUMA: - tick=((struct skill_unit *)val2)->group->limit; - break; + /* option2 */ + case SC_POISON: /* 毒 */ + calc_flag = 1; + if (!(flag & 2)) + { + int sc_def = + 100 - (battle_get_vit (bl) + battle_get_luk (bl) / 5); + tick = tick * sc_def / 100; + } + val3 = tick / 1000; + if (val3 < 1) + val3 = 1; + tick = 1000; + break; + case SC_SILENCE: /* 沈黙(レックスデビーナ) */ + if (!(flag & 2)) + { + int sc_def = 100 - battle_get_vit (bl); + tick = tick * sc_def / 100; + } + break; + case SC_BLIND: /* 暗黒 */ + calc_flag = 1; + if (!(flag & 2)) + { + int sc_def = + battle_get_lv (bl) / 10 + battle_get_int (bl) / 15; + tick = 30000 - sc_def; + } + break; + case SC_CURSE: + calc_flag = 1; + if (!(flag & 2)) + { + int sc_def = 100 - battle_get_vit (bl); + tick = tick * sc_def / 100; + } + break; - /* アンクル */ - case SC_ANKLE: - break; + /* option */ + case SC_HIDING: /* ハイディング */ + calc_flag = 1; + if (bl->type == BL_PC) + { + val2 = tick / 1000; /* 持続時間 */ + tick = 1000; + } + break; + case SC_CHASEWALK: + case SC_CLOAKING: /* クローキング */ + if (bl->type == BL_PC) + val2 = tick; + else + tick = 5000 * val1; + break; + case SC_SIGHT: /* サイト/ルアフ */ + case SC_RUWACH: + val2 = tick / 250; + tick = 10; + break; - /* ウォーターボール */ - case SC_WATERBALL: - tick=150; - if(val1>5) //レベルが5以上の場合は25発に制限(1発目はすでに打ってるので-1) - val3=5*5-1; - else - val3= (val1|1)*(val1|1)-1; - break; + /* セーフティウォール、ニューマ */ + case SC_SAFETYWALL: + case SC_PNEUMA: + tick = ((struct skill_unit *) val2)->group->limit; + break; - /* スキルじゃない/時間に関係しない */ - case SC_RIDING: - calc_flag = 1; - tick = 600*1000; - break; - case SC_FALCON: - case SC_WEIGHT50: - case SC_WEIGHT90: - case SC_BROKNWEAPON: - case SC_BROKNARMOR: - tick=600*1000; - break; + /* アンクル */ + case SC_ANKLE: + break; - case SC_AUTOGUARD: - { - int i,t; - for(i=val2=0;i<val1;i++) { - t = 5-(i>>1); - val2 += (t < 0)? 1:t; - } - } - break; + /* ウォーターボール */ + case SC_WATERBALL: + tick = 150; + if (val1 > 5) //レベルが5以上の場合は25発に制限(1発目はすでに打ってるので-1) + val3 = 5 * 5 - 1; + else + val3 = (val1 | 1) * (val1 | 1) - 1; + break; - case SC_DEFENDER: - calc_flag = 1; - val2 = 5 + val1*15; - break; + /* スキルじゃない/時間に関係しない */ + case SC_RIDING: + calc_flag = 1; + tick = 600 * 1000; + break; + case SC_FALCON: + case SC_WEIGHT50: + case SC_WEIGHT90: + case SC_BROKNWEAPON: + case SC_BROKNARMOR: + tick = 600 * 1000; + break; - case SC_KEEPING: - case SC_BARRIER: - case SC_HALLUCINATION: - break; - case SC_CONCENTRATION: /* コンセントレーション */ - *opt3 |= 1; - calc_flag = 1; - break; - case SC_TENSIONRELAX: /* テンションリラックス */ - calc_flag = 1; - if(bl->type == BL_PC) { - tick = 10000; - } - break; - case SC_AURABLADE: /* オーラブレード */ - case SC_PARRYING: /* パリイング */ -// case SC_ASSUMPTIO: /* */ - case SC_HEADCRUSH: /* ヘッドクラッシュ */ - case SC_JOINTBEAT: /* ジョイントビート */ -// case SC_MARIONETTE: /* マリオネットコントロール */ - - //とりあえず手抜き - break; + case SC_AUTOGUARD: + { + int i, t; + for (i = val2 = 0; i < val1; i++) + { + t = 5 - (i >> 1); + val2 += (t < 0) ? 1 : t; + } + } + break; -// -- moonsoul (for new upper class related skill status effects) + case SC_DEFENDER: + calc_flag = 1; + val2 = 5 + val1 * 15; + break; + + case SC_KEEPING: + case SC_BARRIER: + case SC_HALLUCINATION: + break; + case SC_CONCENTRATION: /* コンセントレーション */ + *opt3 |= 1; + calc_flag = 1; + break; + case SC_TENSIONRELAX: /* テンションリラックス */ + calc_flag = 1; + if (bl->type == BL_PC) + { + tick = 10000; + } + break; + case SC_AURABLADE: /* オーラブレード */ + case SC_PARRYING: /* パリイング */ +// case SC_ASSUMPTIO: /* */ + case SC_HEADCRUSH: /* ヘッドクラッシュ */ + case SC_JOINTBEAT: /* ジョイントビート */ +// case SC_MARIONETTE: /* マリオネットコントロール */ + + //とりあえず手抜き + break; + +// -- moonsoul (for new upper class related skill status effects) /* case SC_AURABLADE: val2 = val1*10; @@ -8849,185 +10667,196 @@ int skill_status_effect(struct block_list *bl, int type, int val1, int val2, int skill_status_change_end(bl,SC_KYRIE,-1); break; */ - case SC_WINDWALK: /* ウインドウォーク */ - calc_flag = 1; - val2 = (val1 / 2); //Flee上昇率 - break; - case SC_BERSERK: /* バーサーク */ - if(sd){ - sd->status.sp = 0; - clif_updatestatus(sd,SP_SP); - clif_status_change(bl,SC_INCREASEAGI,1); /* アイコン表示 */ - } - *opt3 |= 128; - tick = 1000; - calc_flag = 1; - break; - case SC_ASSUMPTIO: /* アスムプティオ */ - *opt3 |= 2048; - break; - case SC_MARIONETTE: /* マリオネットコントロール */ - *opt3 |= 1024; - break; - case SC_MELTDOWN: /* メルトダウン */ - case SC_CARTBOOST: /* カートブースト */ - case SC_TRUESIGHT: /* トゥルーサイト */ - case SC_SPIDERWEB: /* スパイダーウェッブ */ - case SC_MAGICPOWER: /* 魔法力増幅 */ - calc_flag = 1; - break; - case SC_REJECTSWORD: /* リジェクトソード */ - val2 = 3; //3回攻撃を跳ね返す - break; - case SC_MEMORIZE: /* メモライズ */ - val2 = 3; //3回詠唱を1/3にする - break; - case SC_GRAFFITI: /* グラフィティ */ - { - struct skill_unit_group *sg = skill_unitsetting(bl,RG_GRAFFITI,val1,val2,val3,0); - if(sg) - val4 = (int)sg; - } - break; - case SC_HASTE: - calc_flag = 1; - case SC_SPLASHER: /* ベナムスプラッシャー */ - case SC_PHYS_SHIELD: - case SC_MBARRIER: - case SC_HALT_REGENERATE: - case SC_HIDE: - break; - case SC_FLYING_BACKPACK: - updateflag = SP_WEIGHT; - break; - default: - if(battle_config.error_log) - printf("UnknownStatusChange [%d]\n", type); - return 0; - } - - if(bl->type==BL_PC && type<SC_SENDMAX) - clif_status_change(bl,type,1); /* アイコン表示 */ - - /* optionの変更 */ - switch(type){ - case SC_STONE: - case SC_FREEZE: - case SC_STAN: - case SC_SLEEP: - battle_stopattack(bl); /* 攻撃停止 */ - skill_stop_dancing(bl,0); /* 演奏/ダンスの中断 */ - { /* 同時に掛からないステータス異常を解除 */ - int i; - for(i = SC_STONE; i <= SC_SLEEP; i++){ - if(sc_data[i].timer != -1){ - (*sc_count)--; - delete_timer(sc_data[i].timer, skill_status_change_timer); - sc_data[i].timer = -1; - } - } - } - if(type == SC_STONE) - *opt1 = 6; - else - *opt1 = type - SC_STONE + 1; - opt_flag = 1; - break; - case SC_POISON: - if (sc_data[SC_SLOWPOISON].timer == -1) { - *opt2 |= 0x1; - opt_flag = 1; - } - break; - - case SC_CURSE: - case SC_SILENCE: - case SC_BLIND: - *opt2 |= 1<<(type-SC_POISON); - opt_flag = 1; - break; - case SC_SLOWPOISON: - *opt2 &= ~0x1; - *opt2 |= 0x200; - opt_flag = 1; - break; - case SC_SIGNUMCRUCIS: - *opt2 |= 0x40; - opt_flag = 1; - break; - case SC_HIDING: - case SC_CLOAKING: - battle_stopattack(bl); /* 攻撃停止 */ - *option |= ((type==SC_HIDING)?2:4); - opt_flag =1 ; - break; - case SC_CHASEWALK: - battle_stopattack(bl); /* 攻撃停止 */ - *option |= 16388; - opt_flag =1 ; - break; - case SC_SIGHT: - *option |= 1; - opt_flag = 1; - break; - case SC_RUWACH: - *option |= 8192; - opt_flag = 1; - break; - case SC_WEDDING: - *option |= 4096; - opt_flag = 1; - } + case SC_WINDWALK: /* ウインドウォーク */ + calc_flag = 1; + val2 = (val1 / 2); //Flee上昇率 + break; + case SC_BERSERK: /* バーサーク */ + if (sd) + { + sd->status.sp = 0; + clif_updatestatus (sd, SP_SP); + clif_status_change (bl, SC_INCREASEAGI, 1); /* アイコン表示 */ + } + *opt3 |= 128; + tick = 1000; + calc_flag = 1; + break; + case SC_ASSUMPTIO: /* アスムプティオ */ + *opt3 |= 2048; + break; + case SC_MARIONETTE: /* マリオネットコントロール */ + *opt3 |= 1024; + break; + case SC_MELTDOWN: /* メルトダウン */ + case SC_CARTBOOST: /* カートブースト */ + case SC_TRUESIGHT: /* トゥルーサイト */ + case SC_SPIDERWEB: /* スパイダーウェッブ */ + case SC_MAGICPOWER: /* 魔法力増幅 */ + calc_flag = 1; + break; + case SC_REJECTSWORD: /* リジェクトソード */ + val2 = 3; //3回攻撃を跳ね返す + break; + case SC_MEMORIZE: /* メモライズ */ + val2 = 3; //3回詠唱を1/3にする + break; + case SC_GRAFFITI: /* グラフィティ */ + { + struct skill_unit_group *sg = + skill_unitsetting (bl, RG_GRAFFITI, val1, val2, val3, 0); + if (sg) + val4 = (int) sg; + } + break; + case SC_HASTE: + calc_flag = 1; + case SC_SPLASHER: /* ベナムスプラッシャー */ + case SC_PHYS_SHIELD: + case SC_MBARRIER: + case SC_HALT_REGENERATE: + case SC_HIDE: + break; + case SC_FLYING_BACKPACK: + updateflag = SP_WEIGHT; + break; + default: + if (battle_config.error_log) + printf ("UnknownStatusChange [%d]\n", type); + return 0; + } + + if (bl->type == BL_PC && type < SC_SENDMAX) + clif_status_change (bl, type, 1); /* アイコン表示 */ + + /* optionの変更 */ + switch (type) + { + case SC_STONE: + case SC_FREEZE: + case SC_STAN: + case SC_SLEEP: + battle_stopattack (bl); /* 攻撃停止 */ + skill_stop_dancing (bl, 0); /* 演奏/ダンスの中断 */ + { /* 同時に掛からないステータス異常を解除 */ + int i; + for (i = SC_STONE; i <= SC_SLEEP; i++) + { + if (sc_data[i].timer != -1) + { + (*sc_count)--; + delete_timer (sc_data[i].timer, + skill_status_change_timer); + sc_data[i].timer = -1; + } + } + } + if (type == SC_STONE) + *opt1 = 6; + else + *opt1 = type - SC_STONE + 1; + opt_flag = 1; + break; + case SC_POISON: + if (sc_data[SC_SLOWPOISON].timer == -1) + { + *opt2 |= 0x1; + opt_flag = 1; + } + break; - if(opt_flag) /* optionの変更 */ - clif_changeoption(bl); + case SC_CURSE: + case SC_SILENCE: + case SC_BLIND: + *opt2 |= 1 << (type - SC_POISON); + opt_flag = 1; + break; + case SC_SLOWPOISON: + *opt2 &= ~0x1; + *opt2 |= 0x200; + opt_flag = 1; + break; + case SC_SIGNUMCRUCIS: + *opt2 |= 0x40; + opt_flag = 1; + break; + case SC_HIDING: + case SC_CLOAKING: + battle_stopattack (bl); /* 攻撃停止 */ + *option |= ((type == SC_HIDING) ? 2 : 4); + opt_flag = 1; + break; + case SC_CHASEWALK: + battle_stopattack (bl); /* 攻撃停止 */ + *option |= 16388; + opt_flag = 1; + break; + case SC_SIGHT: + *option |= 1; + opt_flag = 1; + break; + case SC_RUWACH: + *option |= 8192; + opt_flag = 1; + break; + case SC_WEDDING: + *option |= 4096; + opt_flag = 1; + } - (*sc_count)++; /* ステータス異常の数 */ + if (opt_flag) /* optionの変更 */ + clif_changeoption (bl); - sc_data[type].val1 = val1; - sc_data[type].val2 = val2; - sc_data[type].val3 = val3; - sc_data[type].val4 = val4; - if (sc_data[type].spell_invocation) // Supplant by newer spell - spell_effect_report_termination(sc_data[type].spell_invocation, bl->id, type, 1); + (*sc_count)++; /* ステータス異常の数 */ - sc_data[type].spell_invocation = spell_invocation; + sc_data[type].val1 = val1; + sc_data[type].val2 = val2; + sc_data[type].val3 = val3; + sc_data[type].val4 = val4; + if (sc_data[type].spell_invocation) // Supplant by newer spell + spell_effect_report_termination (sc_data[type].spell_invocation, + bl->id, type, 1); - /* タイマー設定 */ - sc_data[type].timer = add_timer( - gettick() + tick, skill_status_change_timer, bl->id, type); + sc_data[type].spell_invocation = spell_invocation; - if(bl->type==BL_PC && calc_flag) - pc_calcstatus(sd,0); /* ステータス再計算 */ + /* タイマー設定 */ + sc_data[type].timer = + add_timer (gettick () + tick, skill_status_change_timer, bl->id, + type); - if(bl->type==BL_PC && updateflag) - clif_updatestatus(sd,updateflag); /* ステータスをクライアントに送る */ + if (bl->type == BL_PC && calc_flag) + pc_calcstatus (sd, 0); /* ステータス再計算 */ + if (bl->type == BL_PC && updateflag) + clif_updatestatus (sd, updateflag); /* ステータスをクライアントに送る */ - return 0; + return 0; } + /*========================================== * ステータス異常全解除 *------------------------------------------ */ -int skill_status_change_clear(struct block_list *bl, int type) +int skill_status_change_clear (struct block_list *bl, int type) { - struct status_change* sc_data; - short *sc_count, *option, *opt1, *opt2, *opt3; - int i; - - nullpo_retr(0, bl); - nullpo_retr(0, sc_data = battle_get_sc_data(bl)); - nullpo_retr(0, sc_count = battle_get_sc_count(bl)); - nullpo_retr(0, option = battle_get_option(bl)); - nullpo_retr(0, opt1 = battle_get_opt1(bl)); - nullpo_retr(0, opt2 = battle_get_opt2(bl)); - nullpo_retr(0, opt3 = battle_get_opt3(bl)); - - if (*sc_count == 0) - return 0; - for(i = 0; i < MAX_STATUSCHANGE; i++){ - if(sc_data[i].timer != -1){ /* 異常があるならタイマーを削除する */ + struct status_change *sc_data; + short *sc_count, *option, *opt1, *opt2, *opt3; + int i; + + nullpo_retr (0, bl); + nullpo_retr (0, sc_data = battle_get_sc_data (bl)); + nullpo_retr (0, sc_count = battle_get_sc_count (bl)); + nullpo_retr (0, option = battle_get_option (bl)); + nullpo_retr (0, opt1 = battle_get_opt1 (bl)); + nullpo_retr (0, opt2 = battle_get_opt2 (bl)); + nullpo_retr (0, opt3 = battle_get_opt3 (bl)); + + if (*sc_count == 0) + return 0; + for (i = 0; i < MAX_STATUSCHANGE; i++) + { + if (sc_data[i].timer != -1) + { /* 異常があるならタイマーを削除する */ /* delete_timer(sc_data[i].timer, skill_status_change_timer); sc_data[i].timer = -1; @@ -9036,49 +10865,52 @@ int skill_status_change_clear(struct block_list *bl, int type) clif_status_change(bl, i, 0); */ - skill_status_change_end(bl, i, -1); - } - } - *sc_count = 0; - *opt1 = 0; - *opt2 = 0; - *opt3 = 0; - *option &= OPTION_MASK; + skill_status_change_end (bl, i, -1); + } + } + *sc_count = 0; + *opt1 = 0; + *opt2 = 0; + *opt3 = 0; + *option &= OPTION_MASK; - if (night_flag == 1 && type == BL_PC) // by [Yor] - *opt2 |= STATE_BLIND; + if (night_flag == 1 && type == BL_PC) // by [Yor] + *opt2 |= STATE_BLIND; - if(!type || type&2) - clif_changeoption(bl); + if (!type || type & 2) + clif_changeoption (bl); - return 0; + return 0; } /* クローキング検査(周りに移動不可能地帯があるか) */ -int skill_check_cloaking(struct block_list *bl) +int skill_check_cloaking (struct block_list *bl) { - struct map_session_data *sd=NULL; - static int dx[]={-1, 0, 1,-1, 1,-1, 0, 1}; - static int dy[]={-1,-1,-1, 0, 0, 1, 1, 1}; - int end=1,i; - - nullpo_retr(0, bl); - - if(pc_checkskill(sd,AS_CLOAKING)>2) - return 0; - if(bl->type == BL_PC && battle_config.pc_cloak_check_type&1) - return 0; - if(bl->type == BL_MOB && battle_config.monster_cloak_check_type&1) - return 0; - for(i=0;i<sizeof(dx)/sizeof(dx[0]);i++){ - int c=map_getcell(bl->m,bl->x+dx[i],bl->y+dy[i]); - if(c==1 || c==5) end=0; - } - if(end){ - skill_status_change_end(bl, SC_CLOAKING, -1); - *battle_get_option(bl)&=~4; /* 念のための処理 */ - } - return end; + struct map_session_data *sd = NULL; + static int dx[] = { -1, 0, 1, -1, 1, -1, 0, 1 }; + static int dy[] = { -1, -1, -1, 0, 0, 1, 1, 1 }; + int end = 1, i; + + nullpo_retr (0, bl); + + if (pc_checkskill (sd, AS_CLOAKING) > 2) + return 0; + if (bl->type == BL_PC && battle_config.pc_cloak_check_type & 1) + return 0; + if (bl->type == BL_MOB && battle_config.monster_cloak_check_type & 1) + return 0; + for (i = 0; i < sizeof (dx) / sizeof (dx[0]); i++) + { + int c = map_getcell (bl->m, bl->x + dx[i], bl->y + dy[i]); + if (c == 1 || c == 5) + end = 0; + } + if (end) + { + skill_status_change_end (bl, SC_CLOAKING, -1); + *battle_get_option (bl) &= ~4; /* 念のための処理 */ + } + return end; } /* @@ -9093,40 +10925,41 @@ int skill_check_cloaking(struct block_list *bl) * 戻り ダンスじゃない=0 合奏=2 それ以外のダンス=1 *------------------------------------------ */ -int skill_is_danceskill(int id) +int skill_is_danceskill (int id) { - int i; - switch(id){ - case BD_LULLABY: /* 子守歌 */ - case BD_RICHMANKIM: /* ニヨルドの宴 */ - case BD_ETERNALCHAOS: /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ - case BD_ROKISWEIL: /* ロキの叫び */ - case BD_INTOABYSS: /* 深淵の中に */ - case BD_SIEGFRIED: /* 不死身のジークフリード */ - case BD_RAGNAROK: /* 神々の黄昏 */ - case CG_MOONLIT: /* 月明りの泉に落ちる花びら */ - i=2; - break; - case BA_DISSONANCE: /* 不協和音 */ - case BA_FROSTJOKE: /* 寒いジョーク */ - case BA_WHISTLE: /* 口笛 */ - case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */ - case BA_POEMBRAGI: /* ブラギの詩 */ - case BA_APPLEIDUN: /* イドゥンの林檎 */ - case DC_UGLYDANCE: /* 自分勝手なダンス */ - case DC_SCREAM: /* スクリーム */ - case DC_HUMMING: /* ハミング */ - case DC_DONTFORGETME: /* 私を忘れないで… */ - case DC_FORTUNEKISS: /* 幸運のキス */ - case DC_SERVICEFORYOU: /* サービスフォーユー */ - i=1; - break; - default: - i=0; - } - return i; + int i; + switch (id) + { + case BD_LULLABY: /* 子守歌 */ + case BD_RICHMANKIM: /* ニヨルドの宴 */ + case BD_ETERNALCHAOS: /* 永遠の混沌 */ + case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ + case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ + case BD_ROKISWEIL: /* ロキの叫び */ + case BD_INTOABYSS: /* 深淵の中に */ + case BD_SIEGFRIED: /* 不死身のジークフリード */ + case BD_RAGNAROK: /* 神々の黄昏 */ + case CG_MOONLIT: /* 月明りの泉に落ちる花びら */ + i = 2; + break; + case BA_DISSONANCE: /* 不協和音 */ + case BA_FROSTJOKE: /* 寒いジョーク */ + case BA_WHISTLE: /* 口笛 */ + case BA_ASSASSINCROSS: /* 夕陽のアサシンクロス */ + case BA_POEMBRAGI: /* ブラギの詩 */ + case BA_APPLEIDUN: /* イドゥンの林檎 */ + case DC_UGLYDANCE: /* 自分勝手なダンス */ + case DC_SCREAM: /* スクリーム */ + case DC_HUMMING: /* ハミング */ + case DC_DONTFORGETME: /* 私を忘れないで… */ + case DC_FORTUNEKISS: /* 幸運のキス */ + case DC_SERVICEFORYOU: /* サービスフォーユー */ + i = 1; + break; + default: + i = 0; + } + return i; } /*========================================== @@ -9135,631 +10968,688 @@ int skill_is_danceskill(int id) * *------------------------------------------ */ -void skill_stop_dancing(struct block_list *src, int flag) +void skill_stop_dancing (struct block_list *src, int flag) { - struct status_change* sc_data; - struct skill_unit_group* group; - - nullpo_retv(src); - - sc_data=battle_get_sc_data(src); - if(sc_data && sc_data[SC_DANCING].timer==-1) - return; - group=(struct skill_unit_group *)sc_data[SC_DANCING].val2; //ダンスのスキルユニットIDはval2に入ってる - if(group && src->type==BL_PC && sc_data && sc_data[SC_DANCING].val4){ //合奏中断 - struct map_session_data* dsd=map_id2sd(sc_data[SC_DANCING].val4); //相方のsd取得 - if(flag){ //ログアウトなど片方が落ちても演奏が継続される - if(dsd && src->id == group->src_id){ //グループを持ってるPCが落ちる - group->src_id=sc_data[SC_DANCING].val4; //相方にグループを任せる - if(flag&1) //ログアウト - dsd->sc_data[SC_DANCING].val4=0; //相方の相方を0にして合奏終了→通常のダンス状態 - if(flag&2) //ハエ飛びなど - return; //合奏もダンス状態も終了させない&スキルユニットは置いてけぼり - }else if(dsd && dsd->bl.id == group->src_id){ //相方がグループを持っているPCが落ちる(自分はグループを持っていない) - if(flag&1) //ログアウト - dsd->sc_data[SC_DANCING].val4=0; //相方の相方を0にして合奏終了→通常のダンス状態 - if(flag&2) //ハエ飛びなど - return; //合奏もダンス状態も終了させない&スキルユニットは置いてけぼり - } - skill_status_change_end(src,SC_DANCING,-1);//自分のステータスを終了させる - //そしてグループは消さない&消さないのでステータス計算もいらない? - return; - }else{ - if(dsd && src->id == group->src_id){ //グループを持ってるPCが止める - skill_status_change_end((struct block_list *)dsd,SC_DANCING,-1);//相手のステータスを終了させる - } - if(dsd && dsd->bl.id == group->src_id){ //相方がグループを持っているPCが止める(自分はグループを持っていない) - skill_status_change_end(src,SC_DANCING,-1);//自分のステータスを終了させる - } - } - } - if(flag&2 && group && src->type==BL_PC){ //ハエで飛んだときとかはユニットも飛ぶ - struct map_session_data *sd = (struct map_session_data *)src; - skill_unit_move_unit_group(group, sd->bl.m,(sd->to_x - sd->bl.x),(sd->to_y - sd->bl.y)); - return; - } - skill_delunitgroup(group); - if(src->type==BL_PC) - pc_calcstatus((struct map_session_data *)src,0); + struct status_change *sc_data; + struct skill_unit_group *group; + + nullpo_retv (src); + + sc_data = battle_get_sc_data (src); + if (sc_data && sc_data[SC_DANCING].timer == -1) + return; + group = (struct skill_unit_group *) sc_data[SC_DANCING].val2; //ダンスのスキルユニットIDはval2に入ってる + if (group && src->type == BL_PC && sc_data && sc_data[SC_DANCING].val4) + { //合奏中断 + struct map_session_data *dsd = map_id2sd (sc_data[SC_DANCING].val4); //相方のsd取得 + if (flag) + { //ログアウトなど片方が落ちても演奏が継続される + if (dsd && src->id == group->src_id) + { //グループを持ってるPCが落ちる + group->src_id = sc_data[SC_DANCING].val4; //相方にグループを任せる + if (flag & 1) //ログアウト + dsd->sc_data[SC_DANCING].val4 = 0; //相方の相方を0にして合奏終了→通常のダンス状態 + if (flag & 2) //ハエ飛びなど + return; //合奏もダンス状態も終了させない&スキルユニットは置いてけぼり + } + else if (dsd && dsd->bl.id == group->src_id) + { //相方がグループを持っているPCが落ちる(自分はグループを持っていない) + if (flag & 1) //ログアウト + dsd->sc_data[SC_DANCING].val4 = 0; //相方の相方を0にして合奏終了→通常のダンス状態 + if (flag & 2) //ハエ飛びなど + return; //合奏もダンス状態も終了させない&スキルユニットは置いてけぼり + } + skill_status_change_end (src, SC_DANCING, -1); //自分のステータスを終了させる + //そしてグループは消さない&消さないのでステータス計算もいらない? + return; + } + else + { + if (dsd && src->id == group->src_id) + { //グループを持ってるPCが止める + skill_status_change_end ((struct block_list *) dsd, SC_DANCING, -1); //相手のステータスを終了させる + } + if (dsd && dsd->bl.id == group->src_id) + { //相方がグループを持っているPCが止める(自分はグループを持っていない) + skill_status_change_end (src, SC_DANCING, -1); //自分のステータスを終了させる + } + } + } + if (flag & 2 && group && src->type == BL_PC) + { //ハエで飛んだときとかはユニットも飛ぶ + struct map_session_data *sd = (struct map_session_data *) src; + skill_unit_move_unit_group (group, sd->bl.m, (sd->to_x - sd->bl.x), + (sd->to_y - sd->bl.y)); + return; + } + skill_delunitgroup (group); + if (src->type == BL_PC) + pc_calcstatus ((struct map_session_data *) src, 0); } /*========================================== * スキルユニット初期化 *------------------------------------------ */ -struct skill_unit *skill_initunit(struct skill_unit_group *group,int idx,int x,int y) +struct skill_unit *skill_initunit (struct skill_unit_group *group, int idx, + int x, int y) { - struct skill_unit *unit; - - nullpo_retr(NULL, group); - nullpo_retr(NULL, unit=&group->unit[idx]); - - if(!unit->alive) - group->alive_count++; - - unit->bl.id=map_addobject(&unit->bl); - unit->bl.type=BL_SKILL; - unit->bl.m=group->map; - unit->bl.x=x; - unit->bl.y=y; - unit->group=group; - unit->val1=unit->val2=0; - unit->alive=1; - - map_addblock(&unit->bl); - clif_skill_setunit(unit); - return unit; + struct skill_unit *unit; + + nullpo_retr (NULL, group); + nullpo_retr (NULL, unit = &group->unit[idx]); + + if (!unit->alive) + group->alive_count++; + + unit->bl.id = map_addobject (&unit->bl); + unit->bl.type = BL_SKILL; + unit->bl.m = group->map; + unit->bl.x = x; + unit->bl.y = y; + unit->group = group; + unit->val1 = unit->val2 = 0; + unit->alive = 1; + + map_addblock (&unit->bl); + clif_skill_setunit (unit); + return unit; } -int skill_unit_timer_sub_ondelete( struct block_list *bl, va_list ap ); +int skill_unit_timer_sub_ondelete (struct block_list *bl, va_list ap); /*========================================== * スキルユニット削除 *------------------------------------------ */ -int skill_delunit(struct skill_unit *unit) +int skill_delunit (struct skill_unit *unit) { - struct skill_unit_group *group; - int range; + struct skill_unit_group *group; + int range; - nullpo_retr(0, unit); - if(!unit->alive) - return 0; - nullpo_retr(0, group=unit->group); + nullpo_retr (0, unit); + if (!unit->alive) + return 0; + nullpo_retr (0, group = unit->group); - /* onlimitイベント呼び出し */ - skill_unit_onlimit( unit,gettick() ); + /* onlimitイベント呼び出し */ + skill_unit_onlimit (unit, gettick ()); - /* ondeleteイベント呼び出し */ - range=group->range; - map_foreachinarea( skill_unit_timer_sub_ondelete, unit->bl.m, - unit->bl.x-range,unit->bl.y-range,unit->bl.x+range,unit->bl.y+range,0, - &unit->bl,gettick() ); + /* ondeleteイベント呼び出し */ + range = group->range; + map_foreachinarea (skill_unit_timer_sub_ondelete, unit->bl.m, + unit->bl.x - range, unit->bl.y - range, + unit->bl.x + range, unit->bl.y + range, 0, &unit->bl, + gettick ()); - clif_skill_delunit(unit); + clif_skill_delunit (unit); - unit->group=NULL; - unit->alive=0; - map_delobjectnofree(unit->bl.id, BL_SKILL); - if(group->alive_count>0 && (--group->alive_count)<=0) - skill_delunitgroup(group); + unit->group = NULL; + unit->alive = 0; + map_delobjectnofree (unit->bl.id, BL_SKILL); + if (group->alive_count > 0 && (--group->alive_count) <= 0) + skill_delunitgroup (group); - return 0; + return 0; } + /*========================================== * スキルユニットグループ初期化 *------------------------------------------ */ -static int skill_unit_group_newid=10; -struct skill_unit_group *skill_initunitgroup(struct block_list *src, - int count,int skillid,int skilllv,int unit_id) +static int skill_unit_group_newid = 10; +struct skill_unit_group *skill_initunitgroup (struct block_list *src, + int count, int skillid, + int skilllv, int unit_id) { - int i; - struct skill_unit_group *group=NULL, *list=NULL; - int maxsug=0; - - nullpo_retr(NULL, src); - - if(src->type==BL_PC){ - list=((struct map_session_data *)src)->skillunit; - maxsug=MAX_SKILLUNITGROUP; - }else if(src->type==BL_MOB){ - list=((struct mob_data *)src)->skillunit; - maxsug=MAX_MOBSKILLUNITGROUP; - } - if(list){ - for(i=0;i<maxsug;i++) /* 空いているもの検索 */ - if(list[i].group_id==0){ - group=&list[i]; - break; - } - - if(group==NULL){ /* 空いてないので古いもの検索 */ - int j=0; - unsigned maxdiff=0,x,tick=gettick(); - for(i=0;i<maxsug;i++) - if((x=DIFF_TICK(tick,list[i].tick))>maxdiff){ - maxdiff=x; - j=i; - } - skill_delunitgroup(&list[j]); - group=&list[j]; - } - } - - if(group==NULL){ - printf("skill_initunitgroup: error unit group !\n"); - exit(1); - } - - group->src_id=src->id; - group->party_id=battle_get_party_id(src); - group->guild_id=battle_get_guild_id(src); - group->group_id=skill_unit_group_newid++; - if(skill_unit_group_newid<=0) - skill_unit_group_newid=10; - group->unit=(struct skill_unit *)aCalloc(count,sizeof(struct skill_unit)); - group->unit_count=count; - group->val1=group->val2=0; - group->skill_id=skillid; - group->skill_lv=skilllv; - group->unit_id=unit_id; - group->map=src->m; - group->range=0; - group->limit=10000; - group->interval=1000; - group->tick=gettick(); - group->valstr=NULL; - - if( skill_is_danceskill(skillid) ){ - struct map_session_data *sd = NULL; - if(src->type==BL_PC && (sd=(struct map_session_data *)src) ){ - sd->skillid_dance=skillid; - sd->skilllv_dance=skilllv; - } - skill_status_change_start(src,SC_DANCING,skillid,(int)group,0,0,skill_get_time(skillid,skilllv)+1000,0); - switch(skillid){ //合奏スキルは相方をダンス状態にする - case BD_LULLABY: /* 子守歌 */ - case BD_RICHMANKIM: /* ニヨルドの宴 */ - case BD_ETERNALCHAOS: /* 永遠の混沌 */ - case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ - case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ - case BD_ROKISWEIL: /* ロキの叫び */ - case BD_INTOABYSS: /* 深淵の中に */ - case BD_SIEGFRIED: /* 不死身のジークフリード */ - case BD_RAGNAROK: /* 神々の黄昏 */ - case CG_MOONLIT: /* 月明りの泉に落ちる花びら */ - { - int range=1; - int c=0; - if(sd){ - map_foreachinarea(skill_check_condition_use_sub,sd->bl.m, - sd->bl.x-range,sd->bl.y-range, - sd->bl.x+range,sd->bl.y+range,BL_PC,&sd->bl,&c); - } - } - } - } - return group; + int i; + struct skill_unit_group *group = NULL, *list = NULL; + int maxsug = 0; + + nullpo_retr (NULL, src); + + if (src->type == BL_PC) + { + list = ((struct map_session_data *) src)->skillunit; + maxsug = MAX_SKILLUNITGROUP; + } + else if (src->type == BL_MOB) + { + list = ((struct mob_data *) src)->skillunit; + maxsug = MAX_MOBSKILLUNITGROUP; + } + if (list) + { + for (i = 0; i < maxsug; i++) /* 空いているもの検索 */ + if (list[i].group_id == 0) + { + group = &list[i]; + break; + } + + if (group == NULL) + { /* 空いてないので古いもの検索 */ + int j = 0; + unsigned maxdiff = 0, x, tick = gettick (); + for (i = 0; i < maxsug; i++) + if ((x = DIFF_TICK (tick, list[i].tick)) > maxdiff) + { + maxdiff = x; + j = i; + } + skill_delunitgroup (&list[j]); + group = &list[j]; + } + } + + if (group == NULL) + { + printf ("skill_initunitgroup: error unit group !\n"); + exit (1); + } + + group->src_id = src->id; + group->party_id = battle_get_party_id (src); + group->guild_id = battle_get_guild_id (src); + group->group_id = skill_unit_group_newid++; + if (skill_unit_group_newid <= 0) + skill_unit_group_newid = 10; + group->unit = + (struct skill_unit *) aCalloc (count, sizeof (struct skill_unit)); + group->unit_count = count; + group->val1 = group->val2 = 0; + group->skill_id = skillid; + group->skill_lv = skilllv; + group->unit_id = unit_id; + group->map = src->m; + group->range = 0; + group->limit = 10000; + group->interval = 1000; + group->tick = gettick (); + group->valstr = NULL; + + if (skill_is_danceskill (skillid)) + { + struct map_session_data *sd = NULL; + if (src->type == BL_PC && (sd = (struct map_session_data *) src)) + { + sd->skillid_dance = skillid; + sd->skilllv_dance = skilllv; + } + skill_status_change_start (src, SC_DANCING, skillid, (int) group, 0, + 0, skill_get_time (skillid, + skilllv) + 1000, 0); + switch (skillid) + { //合奏スキルは相方をダンス状態にする + case BD_LULLABY: /* 子守歌 */ + case BD_RICHMANKIM: /* ニヨルドの宴 */ + case BD_ETERNALCHAOS: /* 永遠の混沌 */ + case BD_DRUMBATTLEFIELD: /* 戦太鼓の響き */ + case BD_RINGNIBELUNGEN: /* ニーベルングの指輪 */ + case BD_ROKISWEIL: /* ロキの叫び */ + case BD_INTOABYSS: /* 深淵の中に */ + case BD_SIEGFRIED: /* 不死身のジークフリード */ + case BD_RAGNAROK: /* 神々の黄昏 */ + case CG_MOONLIT: /* 月明りの泉に落ちる花びら */ + { + int range = 1; + int c = 0; + if (sd) + { + map_foreachinarea (skill_check_condition_use_sub, + sd->bl.m, sd->bl.x - range, + sd->bl.y - range, sd->bl.x + range, + sd->bl.y + range, BL_PC, &sd->bl, &c); + } + } + } + } + return group; } /*========================================== * スキルユニットグループ削除 *------------------------------------------ */ -int skill_delunitgroup(struct skill_unit_group *group) +int skill_delunitgroup (struct skill_unit_group *group) { - struct block_list *src; - int i; - - nullpo_retr(0, group); - if(group->unit_count<=0) - return 0; - - src=map_id2bl(group->src_id); - if( skill_is_danceskill(group->skill_id) ){ //ダンススキルはダンス状態を解除する - if(src) - skill_status_change_end(src,SC_DANCING,-1); - } + struct block_list *src; + int i; - group->alive_count=0; - if(group->unit!=NULL){ - for(i=0;i<group->unit_count;i++) - if(group->unit[i].alive) - skill_delunit(&group->unit[i]); - } - if(group->valstr!=NULL){ - map_freeblock(group->valstr); - group->valstr=NULL; - } + nullpo_retr (0, group); + if (group->unit_count <= 0) + return 0; - map_freeblock(group->unit); /* free()の替わり */ - group->unit=NULL; - group->src_id=0; - group->group_id=0; - group->unit_count=0; - return 0; + src = map_id2bl (group->src_id); + if (skill_is_danceskill (group->skill_id)) + { //ダンススキルはダンス状態を解除する + if (src) + skill_status_change_end (src, SC_DANCING, -1); + } + + group->alive_count = 0; + if (group->unit != NULL) + { + for (i = 0; i < group->unit_count; i++) + if (group->unit[i].alive) + skill_delunit (&group->unit[i]); + } + if (group->valstr != NULL) + { + map_freeblock (group->valstr); + group->valstr = NULL; + } + + map_freeblock (group->unit); /* free()の替わり */ + group->unit = NULL; + group->src_id = 0; + group->group_id = 0; + group->unit_count = 0; + return 0; } /*========================================== * スキルユニットグループ全削除 *------------------------------------------ */ -int skill_clear_unitgroup(struct block_list *src) +int skill_clear_unitgroup (struct block_list *src) { - struct skill_unit_group *group=NULL; - int maxsug=0; - - nullpo_retr(0, src); - - if(src->type==BL_PC){ - group=((struct map_session_data *)src)->skillunit; - maxsug=MAX_SKILLUNITGROUP; - }else if(src->type==BL_MOB){ - group=((struct mob_data *)src)->skillunit; - maxsug=MAX_MOBSKILLUNITGROUP; - } - if(group){ - int i; - for(i=0;i<maxsug;i++) - if(group[i].group_id>0 && group[i].src_id == src->id) - skill_delunitgroup(&group[i]); - } - return 0; + struct skill_unit_group *group = NULL; + int maxsug = 0; + + nullpo_retr (0, src); + + if (src->type == BL_PC) + { + group = ((struct map_session_data *) src)->skillunit; + maxsug = MAX_SKILLUNITGROUP; + } + else if (src->type == BL_MOB) + { + group = ((struct mob_data *) src)->skillunit; + maxsug = MAX_MOBSKILLUNITGROUP; + } + if (group) + { + int i; + for (i = 0; i < maxsug; i++) + if (group[i].group_id > 0 && group[i].src_id == src->id) + skill_delunitgroup (&group[i]); + } + return 0; } /*========================================== * スキルユニットグループの被影響tick検索 *------------------------------------------ */ -struct skill_unit_group_tickset *skill_unitgrouptickset_search( - struct block_list *bl,int group_id) +struct skill_unit_group_tickset *skill_unitgrouptickset_search (struct + block_list + *bl, + int group_id) { - int i,j=0,k,s=group_id%MAX_SKILLUNITGROUPTICKSET; - struct skill_unit_group_tickset *set=NULL; - - nullpo_retr(0, bl); - - if(bl->type==BL_PC){ - set=((struct map_session_data *)bl)->skillunittick; - }else{ - set=((struct mob_data *)bl)->skillunittick; - } - if(set==NULL) - return 0; - for(i=0;i<MAX_SKILLUNITGROUPTICKSET;i++) - if( set[(k=(i+s)%MAX_SKILLUNITGROUPTICKSET)].group_id == group_id ) - return &set[k]; - else if( set[k].group_id==0 ) - j=k; - - return &set[j]; + int i, j = 0, k, s = group_id % MAX_SKILLUNITGROUPTICKSET; + struct skill_unit_group_tickset *set = NULL; + + nullpo_retr (0, bl); + + if (bl->type == BL_PC) + { + set = ((struct map_session_data *) bl)->skillunittick; + } + else + { + set = ((struct mob_data *) bl)->skillunittick; + } + if (set == NULL) + return 0; + for (i = 0; i < MAX_SKILLUNITGROUPTICKSET; i++) + if (set[(k = (i + s) % MAX_SKILLUNITGROUPTICKSET)].group_id == + group_id) + return &set[k]; + else if (set[k].group_id == 0) + j = k; + + return &set[j]; } /*========================================== * スキルユニットグループの被影響tick削除 *------------------------------------------ */ -int skill_unitgrouptickset_delete(struct block_list *bl,int group_id) +int skill_unitgrouptickset_delete (struct block_list *bl, int group_id) { - int i,s=group_id%MAX_SKILLUNITGROUPTICKSET; - struct skill_unit_group_tickset *set=NULL,*ts; - - nullpo_retr(0, bl); - - if(bl->type==BL_PC){ - set=((struct map_session_data *)bl)->skillunittick; - }else{ - set=((struct mob_data *)bl)->skillunittick; - } - - if(set!=NULL){ - - for(i=0;i<MAX_SKILLUNITGROUPTICKSET;i++) - if( (ts=&set[(i+s)%MAX_SKILLUNITGROUPTICKSET])->group_id == group_id ) - ts->group_id=0; - - } - return 0; + int i, s = group_id % MAX_SKILLUNITGROUPTICKSET; + struct skill_unit_group_tickset *set = NULL, *ts; + + nullpo_retr (0, bl); + + if (bl->type == BL_PC) + { + set = ((struct map_session_data *) bl)->skillunittick; + } + else + { + set = ((struct mob_data *) bl)->skillunittick; + } + + if (set != NULL) + { + + for (i = 0; i < MAX_SKILLUNITGROUPTICKSET; i++) + if ((ts = + &set[(i + s) % MAX_SKILLUNITGROUPTICKSET])->group_id == + group_id) + ts->group_id = 0; + + } + return 0; } /*========================================== * スキルユニットタイマー発動処理用(foreachinarea) *------------------------------------------ */ -int skill_unit_timer_sub_onplace( struct block_list *bl, va_list ap ) +int skill_unit_timer_sub_onplace (struct block_list *bl, va_list ap) { - struct block_list *src; - struct skill_unit *su; - unsigned int tick; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - src=va_arg(ap,struct block_list*); - - tick=va_arg(ap,unsigned int); - su = (struct skill_unit *)src; - - if( su && su->alive ) { - struct skill_unit_group *sg; - sg = su->group; - if(sg && battle_check_target(src,bl,sg->target_flag )>0) - skill_unit_onplace( su, bl, tick ); - } - return 0; + struct block_list *src; + struct skill_unit *su; + unsigned int tick; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + src = va_arg (ap, struct block_list *); + + tick = va_arg (ap, unsigned int); + su = (struct skill_unit *) src; + + if (su && su->alive) + { + struct skill_unit_group *sg; + sg = su->group; + if (sg && battle_check_target (src, bl, sg->target_flag) > 0) + skill_unit_onplace (su, bl, tick); + } + return 0; } /*========================================== * スキルユニットタイマー削除処理用(foreachinarea) *------------------------------------------ */ -int skill_unit_timer_sub_ondelete( struct block_list *bl, va_list ap ) +int skill_unit_timer_sub_ondelete (struct block_list *bl, va_list ap) { - struct block_list *src; - struct skill_unit *su; - unsigned int tick; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - src=va_arg(ap,struct block_list*); - - tick=va_arg(ap,unsigned int); - su = (struct skill_unit *)src; - - if( su && su->alive ){ - struct skill_unit_group *sg; - sg = su->group; - if( sg && battle_check_target(src,bl,sg->target_flag )>0 ) - skill_unit_ondelete( su, bl, tick ); - } - return 0; + struct block_list *src; + struct skill_unit *su; + unsigned int tick; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + src = va_arg (ap, struct block_list *); + + tick = va_arg (ap, unsigned int); + su = (struct skill_unit *) src; + + if (su && su->alive) + { + struct skill_unit_group *sg; + sg = su->group; + if (sg && battle_check_target (src, bl, sg->target_flag) > 0) + skill_unit_ondelete (su, bl, tick); + } + return 0; } /*========================================== * スキルユニットタイマー処理用(foreachobject) *------------------------------------------ */ -int skill_unit_timer_sub( struct block_list *bl, va_list ap ) +int skill_unit_timer_sub (struct block_list *bl, va_list ap) { - struct skill_unit *unit; - struct skill_unit_group *group; - int range; - unsigned int tick; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, unit=(struct skill_unit *)bl); - nullpo_retr(0, group=unit->group); - tick=va_arg(ap,unsigned int); - - if(!unit->alive) - return 0; - - range=(unit->range!=0)?unit->range:group->range; - - /* onplaceイベント呼び出し */ - if(unit->alive && unit->range>=0){ - map_foreachinarea( skill_unit_timer_sub_onplace, bl->m, - bl->x-range,bl->y-range,bl->x+range,bl->y+range,0, - bl,tick); - if(group->unit_id == 0xaa && DIFF_TICK(tick,group->tick)>=6000*group->val2){ - map_foreachinarea( skill_idun_heal, bl->m, - bl->x-range,bl->y-range,bl->x+range,bl->y+range,0,unit); - group->val2++; - } - } - /* 時間切れ削除 */ - if(unit->alive && - (DIFF_TICK(tick,group->tick)>=group->limit || DIFF_TICK(tick,group->tick)>=unit->limit) ){ - switch(group->unit_id){ - - - - - + struct skill_unit *unit; + struct skill_unit_group *group; + int range; + unsigned int tick; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, unit = (struct skill_unit *) bl); + nullpo_retr (0, group = unit->group); + tick = va_arg (ap, unsigned int); + + if (!unit->alive) + return 0; - case 0x8f: /* ブラストマイン */ - group->unit_id = 0x8c; - clif_changelook(bl,LOOK_BASE,group->unit_id); - group->limit=DIFF_TICK(tick+1500,group->tick); - unit->limit=DIFF_TICK(tick+1500,group->tick); - break; - case 0x90: /* スキッドトラップ */ - case 0x91: /* アンクルスネア */ - case 0x93: /* ランドマイン */ - case 0x94: /* ショックウェーブトラップ */ - case 0x95: /* サンドマン */ - case 0x96: /* フラッシャー */ - case 0x97: /* フリージングトラップ */ - case 0x98: /* クレイモアートラップ */ - case 0x99: /* トーキーボックス */ - { - struct block_list *src=map_id2bl(group->src_id); - if(group->unit_id == 0x91 && group->val2); - else{ - if(src && src->type==BL_PC){ - struct item item_tmp; - memset(&item_tmp,0,sizeof(item_tmp)); - item_tmp.nameid=1065; - item_tmp.identify=1; - map_addflooritem(&item_tmp,1,bl->m,bl->x,bl->y,NULL,NULL,NULL,0); // 罠返還 - } - } - } - default: - skill_delunit(unit); - } - } + range = (unit->range != 0) ? unit->range : group->range; + + /* onplaceイベント呼び出し */ + if (unit->alive && unit->range >= 0) + { + map_foreachinarea (skill_unit_timer_sub_onplace, bl->m, + bl->x - range, bl->y - range, bl->x + range, + bl->y + range, 0, bl, tick); + if (group->unit_id == 0xaa + && DIFF_TICK (tick, group->tick) >= 6000 * group->val2) + { + map_foreachinarea (skill_idun_heal, bl->m, + bl->x - range, bl->y - range, bl->x + range, + bl->y + range, 0, unit); + group->val2++; + } + } + /* 時間切れ削除 */ + if (unit->alive && + (DIFF_TICK (tick, group->tick) >= group->limit + || DIFF_TICK (tick, group->tick) >= unit->limit)) + { + switch (group->unit_id) + { + + case 0x8f: /* ブラストマイン */ + group->unit_id = 0x8c; + clif_changelook (bl, LOOK_BASE, group->unit_id); + group->limit = DIFF_TICK (tick + 1500, group->tick); + unit->limit = DIFF_TICK (tick + 1500, group->tick); + break; + case 0x90: /* スキッドトラップ */ + case 0x91: /* アンクルスネア */ + case 0x93: /* ランドマイン */ + case 0x94: /* ショックウェーブトラップ */ + case 0x95: /* サンドマン */ + case 0x96: /* フラッシャー */ + case 0x97: /* フリージングトラップ */ + case 0x98: /* クレイモアートラップ */ + case 0x99: /* トーキーボックス */ + { + struct block_list *src = map_id2bl (group->src_id); + if (group->unit_id == 0x91 && group->val2); + else + { + if (src && src->type == BL_PC) + { + struct item item_tmp; + memset (&item_tmp, 0, sizeof (item_tmp)); + item_tmp.nameid = 1065; + item_tmp.identify = 1; + map_addflooritem (&item_tmp, 1, bl->m, bl->x, bl->y, NULL, NULL, NULL, 0); // 罠返還 + } + } + } + default: + skill_delunit (unit); + } + } - if(group->unit_id == 0x8d) { - unit->val1 -= 5; - if(unit->val1 <= 0 && unit->limit + group->tick > tick + 700) - unit->limit = DIFF_TICK(tick+700,group->tick); - } + if (group->unit_id == 0x8d) + { + unit->val1 -= 5; + if (unit->val1 <= 0 && unit->limit + group->tick > tick + 700) + unit->limit = DIFF_TICK (tick + 700, group->tick); + } - return 0; + return 0; } + /*========================================== * スキルユニットタイマー処理 *------------------------------------------ */ -int skill_unit_timer( int tid,unsigned int tick,int id,int data) +int skill_unit_timer (int tid, unsigned int tick, int id, int data) { - map_freeblock_lock(); + map_freeblock_lock (); - map_foreachobject( skill_unit_timer_sub, BL_SKILL, tick ); + map_foreachobject (skill_unit_timer_sub, BL_SKILL, tick); - map_freeblock_unlock(); + map_freeblock_unlock (); - return 0; + return 0; } /*========================================== * スキルユニット移動時処理用(foreachinarea) *------------------------------------------ */ -int skill_unit_out_all_sub( struct block_list *bl, va_list ap ) +int skill_unit_out_all_sub (struct block_list *bl, va_list ap) { - struct skill_unit *unit; - struct skill_unit_group *group; - struct block_list *src; - int range; - unsigned int tick; + struct skill_unit *unit; + struct skill_unit_group *group; + struct block_list *src; + int range; + unsigned int tick; - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, src=va_arg(ap,struct block_list*)); - nullpo_retr(0, unit=(struct skill_unit *)bl); - nullpo_retr(0, group=unit->group); + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, src = va_arg (ap, struct block_list *)); + nullpo_retr (0, unit = (struct skill_unit *) bl); + nullpo_retr (0, group = unit->group); - tick=va_arg(ap,unsigned int); + tick = va_arg (ap, unsigned int); - if(!unit->alive || src->prev==NULL) - return 0; + if (!unit->alive || src->prev == NULL) + return 0; - range=(unit->range!=0)?unit->range:group->range; + range = (unit->range != 0) ? unit->range : group->range; - if( range<0 || battle_check_target(bl,src,group->target_flag )<=0 ) - return 0; + if (range < 0 || battle_check_target (bl, src, group->target_flag) <= 0) + return 0; - if( src->x >= bl->x-range && src->x <= bl->x+range && - src->y >= bl->y-range && src->y <= bl->y+range ) - skill_unit_onout( unit, src, tick ); + if (src->x >= bl->x - range && src->x <= bl->x + range && + src->y >= bl->y - range && src->y <= bl->y + range) + skill_unit_onout (unit, src, tick); - return 0; + return 0; } - /*========================================== * スキルユニット移動時処理 *------------------------------------------ */ -int skill_unit_out_all( struct block_list *bl,unsigned int tick,int range) +int skill_unit_out_all (struct block_list *bl, unsigned int tick, int range) { - nullpo_retr(0, bl); + nullpo_retr (0, bl); - if( bl->prev==NULL ) - return 0; + if (bl->prev == NULL) + return 0; - if(range<7) - range=7; - map_foreachinarea( skill_unit_out_all_sub, - bl->m,bl->x-range,bl->y-range,bl->x+range,bl->y+range,BL_SKILL, - bl,tick ); + if (range < 7) + range = 7; + map_foreachinarea (skill_unit_out_all_sub, + bl->m, bl->x - range, bl->y - range, bl->x + range, + bl->y + range, BL_SKILL, bl, tick); - return 0; + return 0; } /*========================================== * スキルユニット移動時処理用(foreachinarea) *------------------------------------------ */ -int skill_unit_move_sub( struct block_list *bl, va_list ap ) +int skill_unit_move_sub (struct block_list *bl, va_list ap) { - struct skill_unit *unit; - struct skill_unit_group *group; - struct block_list *src; - int range; - unsigned int tick; + struct skill_unit *unit; + struct skill_unit_group *group; + struct block_list *src; + int range; + unsigned int tick; - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, unit=(struct skill_unit *)bl); - nullpo_retr(0, src=va_arg(ap,struct block_list*)); + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, unit = (struct skill_unit *) bl); + nullpo_retr (0, src = va_arg (ap, struct block_list *)); - tick=va_arg(ap,unsigned int); + tick = va_arg (ap, unsigned int); - if(!unit->alive || src->prev==NULL) - return 0; + if (!unit->alive || src->prev == NULL) + return 0; - if((group=unit->group) == NULL) - return 0; - range=(unit->range!=0)?unit->range:group->range; + if ((group = unit->group) == NULL) + return 0; + range = (unit->range != 0) ? unit->range : group->range; - if( range<0 || battle_check_target(bl,src,group->target_flag )<=0 ) - return 0; + if (range < 0 || battle_check_target (bl, src, group->target_flag) <= 0) + return 0; - if( src->x >= bl->x-range && src->x <= bl->x+range && - src->y >= bl->y-range && src->y <= bl->y+range ) - skill_unit_onplace( unit, src, tick ); - else - skill_unit_onout( unit, src, tick ); + if (src->x >= bl->x - range && src->x <= bl->x + range && + src->y >= bl->y - range && src->y <= bl->y + range) + skill_unit_onplace (unit, src, tick); + else + skill_unit_onout (unit, src, tick); - return 0; + return 0; } /*========================================== * スキルユニット移動時処理 *------------------------------------------ */ -int skill_unit_move( struct block_list *bl,unsigned int tick,int range) +int skill_unit_move (struct block_list *bl, unsigned int tick, int range) { - nullpo_retr(0, bl); + nullpo_retr (0, bl); - if( bl->prev==NULL ) - return 0; + if (bl->prev == NULL) + return 0; - if(range<7) - range=7; - map_foreachinarea( skill_unit_move_sub, - bl->m,bl->x-range,bl->y-range,bl->x+range,bl->y+range,BL_SKILL, - bl,tick ); + if (range < 7) + range = 7; + map_foreachinarea (skill_unit_move_sub, + bl->m, bl->x - range, bl->y - range, bl->x + range, + bl->y + range, BL_SKILL, bl, tick); - return 0; + return 0; } /*========================================== * スキルユニット自体の移動時処理(foreachinarea) *------------------------------------------ */ -int skill_unit_move_unit_group_sub( struct block_list *bl, va_list ap ) +int skill_unit_move_unit_group_sub (struct block_list *bl, va_list ap) { - struct skill_unit *unit; - struct skill_unit_group *group; - struct block_list *src; - int range; - unsigned int tick; - - nullpo_retr(0, bl); - nullpo_retr(0, ap); - nullpo_retr(0, src=va_arg(ap,struct block_list*)); - nullpo_retr(0, unit=(struct skill_unit *)src); - nullpo_retr(0, group=unit->group); - - tick=va_arg(ap,unsigned int); - - if(!unit->alive || bl->prev==NULL) - return 0; - - range=(unit->range!=0)?unit->range:group->range; - - if( range<0 || battle_check_target(src,bl,group->target_flag )<=0 ) - return 0; - if( bl->x >= src->x-range && bl->x <= src->x+range && - bl->y >= src->y-range && bl->y <= src->y+range ) - skill_unit_onplace( unit, bl, tick ); - else - skill_unit_onout( unit, bl, tick ); - return 0; + struct skill_unit *unit; + struct skill_unit_group *group; + struct block_list *src; + int range; + unsigned int tick; + + nullpo_retr (0, bl); + nullpo_retr (0, ap); + nullpo_retr (0, src = va_arg (ap, struct block_list *)); + nullpo_retr (0, unit = (struct skill_unit *) src); + nullpo_retr (0, group = unit->group); + + tick = va_arg (ap, unsigned int); + + if (!unit->alive || bl->prev == NULL) + return 0; + + range = (unit->range != 0) ? unit->range : group->range; + + if (range < 0 || battle_check_target (src, bl, group->target_flag) <= 0) + return 0; + if (bl->x >= src->x - range && bl->x <= src->x + range && + bl->y >= src->y - range && bl->y <= src->y + range) + skill_unit_onplace (unit, bl, tick); + else + skill_unit_onout (unit, bl, tick); + return 0; } /*========================================== @@ -9767,118 +11657,150 @@ int skill_unit_move_unit_group_sub( struct block_list *bl, va_list ap ) * 引数はグループと移動量 *------------------------------------------ */ -int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int dy) +int skill_unit_move_unit_group (struct skill_unit_group *group, int m, int dx, + int dy) { - nullpo_retr(0, group); - - if( group->unit_count<=0) - return 0; - - if(group->unit!=NULL){ - if(!battle_config.unit_movement_type){ - int i; - for(i=0;i<group->unit_count;i++){ - struct skill_unit *unit=&group->unit[i]; - if(unit->alive && !(m==unit->bl.m && dx==0 && dy==0)){ - int range=unit->range; - map_delblock(&unit->bl); - unit->bl.m = m; - unit->bl.x += dx; - unit->bl.y += dy; - map_addblock(&unit->bl); - clif_skill_setunit(unit); - if(range>0){ - if(range<7) - range=7; - map_foreachinarea( skill_unit_move_unit_group_sub, unit->bl.m, - unit->bl.x-range,unit->bl.y-range,unit->bl.x+range,unit->bl.y+range,0, - &unit->bl,gettick() ); - } - } - } - }else{ - int i,j, *r_flag, *s_flag, *m_flag; - struct skill_unit *unit1; - struct skill_unit *unit2; - r_flag = (int *) malloc(sizeof(int) * group->unit_count); - s_flag = (int *) malloc(sizeof(int) * group->unit_count); - m_flag = (int *) malloc(sizeof(int) * group->unit_count); - memset(r_flag,0, sizeof(int) * group->unit_count);// 継承フラグ - memset(s_flag,0, sizeof(int) * group->unit_count);// 継承フラグ - memset(m_flag,0, sizeof(int) * group->unit_count);// 継承フラグ - - //先にフラグを全部決める - for(i=0;i<group->unit_count;i++){ - int move_check=0;// かぶりフラグ - unit1=&group->unit[i]; - for(j=0;j<group->unit_count;j++){ - unit2=&group->unit[j]; - if(unit1->bl.m==m && unit1->bl.x+dx==unit2->bl.x && unit1->bl.y+dy==unit2->bl.y){ - //移動先にユニットがかぶってたら - s_flag[i]=1;// 移動前のユニットナンバーの継承フラグon - r_flag[j]=1;// かぶるユニットナンバーの残留フラグon - move_check=1;//ユニットがかぶった。 - break; - } - } - if(!move_check)// ユニットがかぶってなかったら - m_flag[i]=1;// 移動前ユニットナンバーの移動フラグon - } + nullpo_retr (0, group); - //フラグに基づいてユニット移動 - for(i=0;i<group->unit_count;i++){ - unit1=&group->unit[i]; - if(m_flag[i]){// 移動フラグがonで - if(!r_flag[i]){// 残留フラグがoffなら - //単純移動(rangeも継承の必要無し) - int range=unit1->range; - map_delblock(&unit1->bl); - unit1->bl.m = m; - unit1->bl.x += dx; - unit1->bl.y += dy; - map_addblock(&unit1->bl); - clif_skill_setunit(unit1); - if(range > 0){ - if(range < 7) - range = 7; - map_foreachinarea( skill_unit_move_unit_group_sub, unit1->bl.m, - unit1->bl.x-range,unit1->bl.y-range,unit1->bl.x+range,unit1->bl.y+range,0, - &unit1->bl,gettick() ); - } - }else{// 残留フラグがonなら - //空ユニットになるので、継承可能なユニットを探す - for(j=0;j<group->unit_count;j++){ - unit2=&group->unit[j]; - if(s_flag[j] && !r_flag[j]){ - // 継承移動(range継承付き) - int range=unit1->range; - map_delblock(&unit2->bl); - unit2->bl.m = m; - unit2->bl.x = unit1->bl.x + dx; - unit2->bl.y = unit1->bl.y + dy; - unit2->range = unit1->range; - map_addblock(&unit2->bl); - clif_skill_setunit(unit2); - if(range > 0){ - if(range < 7) - range = 7; - map_foreachinarea( skill_unit_move_unit_group_sub, unit2->bl.m, - unit2->bl.x-range,unit2->bl.y-range,unit2->bl.x+range,unit2->bl.y+range,0, - &unit2->bl,gettick() ); - } - s_flag[j]=0;// 継承完了したのでoff - break; - } - } - } - } - } - free(r_flag); - free(s_flag); - free(m_flag); - } - } - return 0; + if (group->unit_count <= 0) + return 0; + + if (group->unit != NULL) + { + if (!battle_config.unit_movement_type) + { + int i; + for (i = 0; i < group->unit_count; i++) + { + struct skill_unit *unit = &group->unit[i]; + if (unit->alive && !(m == unit->bl.m && dx == 0 && dy == 0)) + { + int range = unit->range; + map_delblock (&unit->bl); + unit->bl.m = m; + unit->bl.x += dx; + unit->bl.y += dy; + map_addblock (&unit->bl); + clif_skill_setunit (unit); + if (range > 0) + { + if (range < 7) + range = 7; + map_foreachinarea (skill_unit_move_unit_group_sub, + unit->bl.m, unit->bl.x - range, + unit->bl.y - range, + unit->bl.x + range, + unit->bl.y + range, 0, &unit->bl, + gettick ()); + } + } + } + } + else + { + int i, j, *r_flag, *s_flag, *m_flag; + struct skill_unit *unit1; + struct skill_unit *unit2; + r_flag = (int *) malloc (sizeof (int) * group->unit_count); + s_flag = (int *) malloc (sizeof (int) * group->unit_count); + m_flag = (int *) malloc (sizeof (int) * group->unit_count); + memset (r_flag, 0, sizeof (int) * group->unit_count); // 継承フラグ + memset (s_flag, 0, sizeof (int) * group->unit_count); // 継承フラグ + memset (m_flag, 0, sizeof (int) * group->unit_count); // 継承フラグ + + //先にフラグを全部決める + for (i = 0; i < group->unit_count; i++) + { + int move_check = 0; // かぶりフラグ + unit1 = &group->unit[i]; + for (j = 0; j < group->unit_count; j++) + { + unit2 = &group->unit[j]; + if (unit1->bl.m == m && unit1->bl.x + dx == unit2->bl.x + && unit1->bl.y + dy == unit2->bl.y) + { + //移動先にユニットがかぶってたら + s_flag[i] = 1; // 移動前のユニットナンバーの継承フラグon + r_flag[j] = 1; // かぶるユニットナンバーの残留フラグon + move_check = 1; //ユニットがかぶった。 + break; + } + } + if (!move_check) // ユニットがかぶってなかったら + m_flag[i] = 1; // 移動前ユニットナンバーの移動フラグon + } + + //フラグに基づいてユニット移動 + for (i = 0; i < group->unit_count; i++) + { + unit1 = &group->unit[i]; + if (m_flag[i]) + { // 移動フラグがonで + if (!r_flag[i]) + { // 残留フラグがoffなら + //単純移動(rangeも継承の必要無し) + int range = unit1->range; + map_delblock (&unit1->bl); + unit1->bl.m = m; + unit1->bl.x += dx; + unit1->bl.y += dy; + map_addblock (&unit1->bl); + clif_skill_setunit (unit1); + if (range > 0) + { + if (range < 7) + range = 7; + map_foreachinarea (skill_unit_move_unit_group_sub, + unit1->bl.m, + unit1->bl.x - range, + unit1->bl.y - range, + unit1->bl.x + range, + unit1->bl.y + range, 0, + &unit1->bl, gettick ()); + } + } + else + { // 残留フラグがonなら + //空ユニットになるので、継承可能なユニットを探す + for (j = 0; j < group->unit_count; j++) + { + unit2 = &group->unit[j]; + if (s_flag[j] && !r_flag[j]) + { + // 継承移動(range継承付き) + int range = unit1->range; + map_delblock (&unit2->bl); + unit2->bl.m = m; + unit2->bl.x = unit1->bl.x + dx; + unit2->bl.y = unit1->bl.y + dy; + unit2->range = unit1->range; + map_addblock (&unit2->bl); + clif_skill_setunit (unit2); + if (range > 0) + { + if (range < 7) + range = 7; + map_foreachinarea + (skill_unit_move_unit_group_sub, + unit2->bl.m, unit2->bl.x - range, + unit2->bl.y - range, + unit2->bl.x + range, + unit2->bl.y + range, 0, &unit2->bl, + gettick ()); + } + s_flag[j] = 0; // 継承完了したのでoff + break; + } + } + } + } + } + free (r_flag); + free (s_flag); + free (m_flag); + } + } + return 0; } /*---------------------------------------------------------------------------- @@ -9890,30 +11812,29 @@ int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int * 初期化系 */ -static int -scan_stat(char *statname) +static int scan_stat (char *statname) { - if (!strcmpi(statname, "str")) - return SP_STR; - if (!strcmpi(statname, "dex")) - return SP_DEX; - if (!strcmpi(statname, "agi")) - return SP_AGI; - if (!strcmpi(statname, "vit")) - return SP_VIT; - if (!strcmpi(statname, "int")) - return SP_INT; - if (!strcmpi(statname, "luk")) - return SP_LUK; - if (!strcmpi(statname, "none")) - return 0; - - else fprintf(stderr, "Unknown stat `%s'\n", statname); + if (!strcmpi (statname, "str")) + return SP_STR; + if (!strcmpi (statname, "dex")) + return SP_DEX; + if (!strcmpi (statname, "agi")) + return SP_AGI; + if (!strcmpi (statname, "vit")) + return SP_VIT; + if (!strcmpi (statname, "int")) + return SP_INT; + if (!strcmpi (statname, "luk")) + return SP_LUK; + if (!strcmpi (statname, "none")) return 0; + + else + fprintf (stderr, "Unknown stat `%s'\n", statname); + return 0; } -extern void -skill_pool_register(int id); // [Fate] Remember that a certain skill ID belongs to a pool skill +extern void skill_pool_register (int id); // [Fate] Remember that a certain skill ID belongs to a pool skill /*========================================== * スキル関係ファイル読み込み @@ -9921,372 +11842,464 @@ skill_pool_register(int id); // [Fate] Remember that a certain skill ID belongs * skill_cast_db.txt スキルの詠唱時間とディレイデータ *------------------------------------------ */ -int skill_readdb(void) +int skill_readdb (void) { - int i,j,k,l; - FILE *fp; - char line[1024],*p; - - /* The main skill database */ - memset(skill_db,0,sizeof(skill_db)); - fp=fopen_("db/skill_db.txt","r"); - if(fp==NULL){ - printf("can't read db/skill_db.txt\n"); - return 1; - } - while(fgets(line,1020,fp)){ - char *split[50], *split2[MAX_SKILL_LEVEL]; - if(line[0]=='/' && line[1]=='/') - continue; - for(j=0,p=line;j<18 && p;j++){ - while (*p == '\t' || *p == ' ') p++; - split[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } - if(split[17]==NULL || j<18) { - fprintf(stderr, "Incomplete skill db data online (%d entries)\n", j); - continue; - } - - i=atoi(split[0]); - if(i<0 || i>MAX_SKILL_DB) - continue; - - memset(split2,0,sizeof(split2)); - for(j=0,p=split[1];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].range[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - skill_db[i].hit=atoi(split[2]); - skill_db[i].inf=atoi(split[3]); - skill_db[i].pl=atoi(split[4]); - skill_db[i].nk=atoi(split[5]); - skill_db[i].max_raise=atoi(split[6]); - skill_db[i].max=atoi(split[7]); - - memset(split2,0,sizeof(split2)); - for(j=0,p=split[8];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].num[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - - if(strcmpi(split[9],"yes") == 0) - skill_db[i].castcancel=1; - else - skill_db[i].castcancel=0; - skill_db[i].cast_def_rate=atoi(split[9]); - skill_db[i].inf2=atoi(split[10]); - skill_db[i].maxcount=atoi(split[11]); - if(strcmpi(split[13],"weapon") == 0) - skill_db[i].skill_type=BF_WEAPON; - else if(strcmpi(split[12],"magic") == 0) - skill_db[i].skill_type=BF_MAGIC; - else if(strcmpi(split[12],"misc") == 0) - skill_db[i].skill_type=BF_MISC; - else - skill_db[i].skill_type=0; - memset(split2,0,sizeof(split2)); - for(j=0,p=split[14];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].blewcount[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - - if (!strcmpi(split[15], "passive")) { - skill_pool_register(i); - skill_db[i].poolflags = SKILL_POOL_FLAG; - } else if (!strcmpi(split[15], "active")) { - skill_pool_register(i); - skill_db[i].poolflags = SKILL_POOL_FLAG | SKILL_POOL_ACTIVE; - } else - skill_db[i].poolflags = 0; - - skill_db[i].stat = scan_stat(split[16]); - - skill_names[i].desc = strdup(split[17]); - { // replace "_" by " " - char *s = skill_names[i].desc; - while ((s = strchr(s, '_'))) - *s = ' '; - if ((s = strchr(skill_names[i].desc, '\t')) || (s = strchr (skill_names[i].desc, ' ')) || (s = strchr (skill_names[i].desc, '\n'))) - *s = '\000'; - } - } - fclose_(fp); - printf("read db/skill_db.txt done\n"); - - fp=fopen_("db/skill_require_db.txt","r"); - if(fp==NULL){ - printf("can't read db/skill_require_db.txt\n"); - return 1; - } - while(fgets(line,1020,fp)){ - char *split[51], *split2[MAX_SKILL_LEVEL]; - if(line[0]=='/' && line[1]=='/') - continue; - for(j=0,p=line;j<30 && p;j++){ - while (*p == '\t' || *p == ' ') p++; - split[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } - if(split[29]==NULL || j<30) - continue; - - i=atoi(split[0]); - if(i<0 || i>MAX_SKILL_DB) - continue; - - memset(split2,0,sizeof(split2)); - for(j=0,p=split[1];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].hp[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - - memset(split2,0,sizeof(split2)); - for(j=0,p=split[2];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].mhp[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - - memset(split2,0,sizeof(split2)); - for(j=0,p=split[3];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].sp[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - - memset(split2,0,sizeof(split2)); - for(j=0,p=split[4];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].hp_rate[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - - memset(split2,0,sizeof(split2)); - for(j=0,p=split[5];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].sp_rate[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - - memset(split2,0,sizeof(split2)); - for(j=0,p=split[6];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].zeny[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - - memset(split2,0,sizeof(split2)); - for(j=0,p=split[7];j<32 && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<32 && split2[k];k++) { - l = atoi(split2[k]); - if(l == 99) { - skill_db[i].weapon = 0xffffffff; - break; - } - else - skill_db[i].weapon |= 1<<l; - } - - if( strcmpi(split[8],"hiding")==0 ) skill_db[i].state=ST_HIDING; - else if( strcmpi(split[8],"cloaking")==0 ) skill_db[i].state=ST_CLOAKING; - else if( strcmpi(split[8],"hidden")==0 ) skill_db[i].state=ST_HIDDEN; - else if( strcmpi(split[8],"riding")==0 ) skill_db[i].state=ST_RIDING; - else if( strcmpi(split[8],"falcon")==0 ) skill_db[i].state=ST_FALCON; - else if( strcmpi(split[8],"cart")==0 ) skill_db[i].state=ST_CART; - else if( strcmpi(split[8],"shield")==0 ) skill_db[i].state=ST_SHIELD; - else if( strcmpi(split[8],"sight")==0 ) skill_db[i].state=ST_SIGHT; - else if( strcmpi(split[8],"explosionspirits")==0 ) skill_db[i].state=ST_EXPLOSIONSPIRITS; - else if( strcmpi(split[8],"recover_weight_rate")==0 ) skill_db[i].state=ST_RECOV_WEIGHT_RATE; - else if( strcmpi(split[8],"move_enable")==0 ) skill_db[i].state=ST_MOVE_ENABLE; - else if( strcmpi(split[8],"water")==0 ) skill_db[i].state=ST_WATER; - else skill_db[i].state=ST_NONE; - - memset(split2,0,sizeof(split2)); - for(j=0,p=split[9];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].spiritball[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - skill_db[i].itemid[0]=atoi(split[10]); - skill_db[i].amount[0]=atoi(split[11]); - skill_db[i].itemid[1]=atoi(split[12]); - skill_db[i].amount[1]=atoi(split[13]); - skill_db[i].itemid[2]=atoi(split[14]); - skill_db[i].amount[2]=atoi(split[15]); - skill_db[i].itemid[3]=atoi(split[16]); - skill_db[i].amount[3]=atoi(split[17]); - skill_db[i].itemid[4]=atoi(split[18]); - skill_db[i].amount[4]=atoi(split[19]); - skill_db[i].itemid[5]=atoi(split[20]); - skill_db[i].amount[5]=atoi(split[21]); - skill_db[i].itemid[6]=atoi(split[22]); - skill_db[i].amount[6]=atoi(split[23]); - skill_db[i].itemid[7]=atoi(split[24]); - skill_db[i].amount[7]=atoi(split[25]); - skill_db[i].itemid[8]=atoi(split[26]); - skill_db[i].amount[8]=atoi(split[27]); - skill_db[i].itemid[9]=atoi(split[28]); - skill_db[i].amount[9]=atoi(split[29]); - } - fclose_(fp); - printf("read db/skill_require_db.txt done\n"); - - /* ? */ - fp=fopen_("db/skill_cast_db.txt","r"); - if(fp==NULL){ - printf("can't read db/skill_cast_db.txt\n"); - return 1; - } - while(fgets(line,1020,fp)){ - char *split[50], *split2[MAX_SKILL_LEVEL]; - memset(split,0,sizeof(split)); // [Valaris] thanks to fov - if(line[0]=='/' && line[1]=='/') - continue; - for(j=0,p=line;j<5 && p;j++){ - while (*p == '\t' || *p == ' ') p++; - split[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } - if(split[4]==NULL || j<5) - continue; - - i=atoi(split[0]); - if(i<0 || i>MAX_SKILL_DB) - continue; - - memset(split2,0,sizeof(split2)); - for(j=0,p=split[1];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].cast[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - - memset(split2,0,sizeof(split2)); - for(j=0,p=split[2];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].delay[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - - memset(split2,0,sizeof(split2)); - for(j=0,p=split[3];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].upkeep_time[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - - memset(split2,0,sizeof(split2)); - for(j=0,p=split[4];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].upkeep_time2[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - } - fclose_(fp); - printf("read db/skill_cast_db.txt done\n"); + int i, j, k, l; + FILE *fp; + char line[1024], *p; + + /* The main skill database */ + memset (skill_db, 0, sizeof (skill_db)); + fp = fopen_ ("db/skill_db.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/skill_db.txt\n"); + return 1; + } + while (fgets (line, 1020, fp)) + { + char *split[50], *split2[MAX_SKILL_LEVEL]; + if (line[0] == '/' && line[1] == '/') + continue; + for (j = 0, p = line; j < 18 && p; j++) + { + while (*p == '\t' || *p == ' ') + p++; + split[j] = p; + p = strchr (p, ','); + if (p) + *p++ = 0; + } + if (split[17] == NULL || j < 18) + { + fprintf (stderr, "Incomplete skill db data online (%d entries)\n", + j); + continue; + } - fp=fopen_("db/skill_castnodex_db.txt","r"); - if(fp==NULL){ - printf("can't read db/skill_castnodex_db.txt\n"); - return 1; - } - while(fgets(line,1020,fp)){ - char *split[50], *split2[MAX_SKILL_LEVEL]; - memset(split,0,sizeof(split)); - if(line[0]=='/' && line[1]=='/') - continue; - for(j=0,p=line;j<2 && p;j++){ - while (*p == '\t' || *p == ' ') p++; - split[j]=p; - p=strchr(p,','); - if(p) *p++=0; - } + i = atoi (split[0]); + if (i < 0 || i > MAX_SKILL_DB) + continue; + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[1]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].range[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); + skill_db[i].hit = atoi (split[2]); + skill_db[i].inf = atoi (split[3]); + skill_db[i].pl = atoi (split[4]); + skill_db[i].nk = atoi (split[5]); + skill_db[i].max_raise = atoi (split[6]); + skill_db[i].max = atoi (split[7]); + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[8]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].num[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); - i=atoi(split[0]); - if(i<0 || i>MAX_SKILL_DB) - continue; + if (strcmpi (split[9], "yes") == 0) + skill_db[i].castcancel = 1; + else + skill_db[i].castcancel = 0; + skill_db[i].cast_def_rate = atoi (split[9]); + skill_db[i].inf2 = atoi (split[10]); + skill_db[i].maxcount = atoi (split[11]); + if (strcmpi (split[13], "weapon") == 0) + skill_db[i].skill_type = BF_WEAPON; + else if (strcmpi (split[12], "magic") == 0) + skill_db[i].skill_type = BF_MAGIC; + else if (strcmpi (split[12], "misc") == 0) + skill_db[i].skill_type = BF_MISC; + else + skill_db[i].skill_type = 0; + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[14]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].blewcount[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); + + if (!strcmpi (split[15], "passive")) + { + skill_pool_register (i); + skill_db[i].poolflags = SKILL_POOL_FLAG; + } + else if (!strcmpi (split[15], "active")) + { + skill_pool_register (i); + skill_db[i].poolflags = SKILL_POOL_FLAG | SKILL_POOL_ACTIVE; + } + else + skill_db[i].poolflags = 0; + + skill_db[i].stat = scan_stat (split[16]); + + skill_names[i].desc = strdup (split[17]); + { // replace "_" by " " + char *s = skill_names[i].desc; + while ((s = strchr (s, '_'))) + *s = ' '; + if ((s = strchr (skill_names[i].desc, '\t')) + || (s = strchr (skill_names[i].desc, ' ')) + || (s = strchr (skill_names[i].desc, '\n'))) + *s = '\000'; + } + } + fclose_ (fp); + printf ("read db/skill_db.txt done\n"); + + fp = fopen_ ("db/skill_require_db.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/skill_require_db.txt\n"); + return 1; + } + while (fgets (line, 1020, fp)) + { + char *split[51], *split2[MAX_SKILL_LEVEL]; + if (line[0] == '/' && line[1] == '/') + continue; + for (j = 0, p = line; j < 30 && p; j++) + { + while (*p == '\t' || *p == ' ') + p++; + split[j] = p; + p = strchr (p, ','); + if (p) + *p++ = 0; + } + if (split[29] == NULL || j < 30) + continue; + + i = atoi (split[0]); + if (i < 0 || i > MAX_SKILL_DB) + continue; + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[1]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].hp[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[2]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].mhp[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[3]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].sp[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[4]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].hp_rate[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[5]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].sp_rate[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[6]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].zeny[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[7]; j < 32 && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < 32 && split2[k]; k++) + { + l = atoi (split2[k]); + if (l == 99) + { + skill_db[i].weapon = 0xffffffff; + break; + } + else + skill_db[i].weapon |= 1 << l; + } - memset(split2,0,sizeof(split2)); - for(j=0,p=split[1];j<MAX_SKILL_LEVEL && p;j++){ - split2[j]=p; - p=strchr(p,':'); - if(p) *p++=0; - } - for(k=0;k<MAX_SKILL_LEVEL;k++) - skill_db[i].castnodex[k]=(split2[k])? atoi(split2[k]):atoi(split2[0]); - } - fclose_(fp); - printf("read db/skill_castnodex_db.txt done\n"); + if (strcmpi (split[8], "hiding") == 0) + skill_db[i].state = ST_HIDING; + else if (strcmpi (split[8], "cloaking") == 0) + skill_db[i].state = ST_CLOAKING; + else if (strcmpi (split[8], "hidden") == 0) + skill_db[i].state = ST_HIDDEN; + else if (strcmpi (split[8], "riding") == 0) + skill_db[i].state = ST_RIDING; + else if (strcmpi (split[8], "falcon") == 0) + skill_db[i].state = ST_FALCON; + else if (strcmpi (split[8], "cart") == 0) + skill_db[i].state = ST_CART; + else if (strcmpi (split[8], "shield") == 0) + skill_db[i].state = ST_SHIELD; + else if (strcmpi (split[8], "sight") == 0) + skill_db[i].state = ST_SIGHT; + else if (strcmpi (split[8], "explosionspirits") == 0) + skill_db[i].state = ST_EXPLOSIONSPIRITS; + else if (strcmpi (split[8], "recover_weight_rate") == 0) + skill_db[i].state = ST_RECOV_WEIGHT_RATE; + else if (strcmpi (split[8], "move_enable") == 0) + skill_db[i].state = ST_MOVE_ENABLE; + else if (strcmpi (split[8], "water") == 0) + skill_db[i].state = ST_WATER; + else + skill_db[i].state = ST_NONE; + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[9]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].spiritball[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); + skill_db[i].itemid[0] = atoi (split[10]); + skill_db[i].amount[0] = atoi (split[11]); + skill_db[i].itemid[1] = atoi (split[12]); + skill_db[i].amount[1] = atoi (split[13]); + skill_db[i].itemid[2] = atoi (split[14]); + skill_db[i].amount[2] = atoi (split[15]); + skill_db[i].itemid[3] = atoi (split[16]); + skill_db[i].amount[3] = atoi (split[17]); + skill_db[i].itemid[4] = atoi (split[18]); + skill_db[i].amount[4] = atoi (split[19]); + skill_db[i].itemid[5] = atoi (split[20]); + skill_db[i].amount[5] = atoi (split[21]); + skill_db[i].itemid[6] = atoi (split[22]); + skill_db[i].amount[6] = atoi (split[23]); + skill_db[i].itemid[7] = atoi (split[24]); + skill_db[i].amount[7] = atoi (split[25]); + skill_db[i].itemid[8] = atoi (split[26]); + skill_db[i].amount[8] = atoi (split[27]); + skill_db[i].itemid[9] = atoi (split[28]); + skill_db[i].amount[9] = atoi (split[29]); + } + fclose_ (fp); + printf ("read db/skill_require_db.txt done\n"); + + /* ? */ + fp = fopen_ ("db/skill_cast_db.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/skill_cast_db.txt\n"); + return 1; + } + while (fgets (line, 1020, fp)) + { + char *split[50], *split2[MAX_SKILL_LEVEL]; + memset (split, 0, sizeof (split)); // [Valaris] thanks to fov + if (line[0] == '/' && line[1] == '/') + continue; + for (j = 0, p = line; j < 5 && p; j++) + { + while (*p == '\t' || *p == ' ') + p++; + split[j] = p; + p = strchr (p, ','); + if (p) + *p++ = 0; + } + if (split[4] == NULL || j < 5) + continue; + + i = atoi (split[0]); + if (i < 0 || i > MAX_SKILL_DB) + continue; + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[1]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].cast[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[2]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].delay[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[3]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].upkeep_time[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[4]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].upkeep_time2[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); + } + fclose_ (fp); + printf ("read db/skill_cast_db.txt done\n"); + + fp = fopen_ ("db/skill_castnodex_db.txt", "r"); + if (fp == NULL) + { + printf ("can't read db/skill_castnodex_db.txt\n"); + return 1; + } + while (fgets (line, 1020, fp)) + { + char *split[50], *split2[MAX_SKILL_LEVEL]; + memset (split, 0, sizeof (split)); + if (line[0] == '/' && line[1] == '/') + continue; + for (j = 0, p = line; j < 2 && p; j++) + { + while (*p == '\t' || *p == ' ') + p++; + split[j] = p; + p = strchr (p, ','); + if (p) + *p++ = 0; + } - return 0; + i = atoi (split[0]); + if (i < 0 || i > MAX_SKILL_DB) + continue; + + memset (split2, 0, sizeof (split2)); + for (j = 0, p = split[1]; j < MAX_SKILL_LEVEL && p; j++) + { + split2[j] = p; + p = strchr (p, ':'); + if (p) + *p++ = 0; + } + for (k = 0; k < MAX_SKILL_LEVEL; k++) + skill_db[i].castnodex[k] = + (split2[k]) ? atoi (split2[k]) : atoi (split2[0]); + } + fclose_ (fp); + printf ("read db/skill_castnodex_db.txt done\n"); + + return 0; } -void skill_reload(void) +void skill_reload (void) { - /* - - <empty skill database> - <?> - - */ - - do_init_skill(); + /* + * + * <empty skill database> + * <?> + * + */ + + do_init_skill (); } /*========================================== * スキル関係初期化処理 *------------------------------------------ */ -int do_init_skill(void) +int do_init_skill (void) { - skill_readdb(); - - add_timer_func_list(skill_unit_timer,"skill_unit_timer"); - add_timer_func_list(skill_castend_id,"skill_castend_id"); - add_timer_func_list(skill_castend_pos,"skill_castend_pos"); - add_timer_func_list(skill_timerskill,"skill_timerskill"); - add_timer_func_list(skill_status_change_timer,"skill_status_change_timer"); - add_timer_interval(gettick()+SKILLUNITTIMER_INVERVAL,skill_unit_timer,0,0,SKILLUNITTIMER_INVERVAL); - - return 0; + skill_readdb (); + + add_timer_func_list (skill_unit_timer, "skill_unit_timer"); + add_timer_func_list (skill_castend_id, "skill_castend_id"); + add_timer_func_list (skill_castend_pos, "skill_castend_pos"); + add_timer_func_list (skill_timerskill, "skill_timerskill"); + add_timer_func_list (skill_status_change_timer, + "skill_status_change_timer"); + add_timer_interval (gettick () + SKILLUNITTIMER_INVERVAL, + skill_unit_timer, 0, 0, SKILLUNITTIMER_INVERVAL); + + return 0; } diff --git a/src/map/skill.h b/src/map/skill.h index 0f7b369..686269a 100644 --- a/src/map/skill.h +++ b/src/map/skill.h @@ -15,25 +15,29 @@ #define SKILL_POOL_ACTIVATED 0x4 // pool skill has been activated (used for clif) // スキルデータベース -struct skill_db { - int range[MAX_SKILL_LEVEL],hit,inf,pl,nk,max, stat, poolflags, max_raise; // `max' is the global max, `max_raise' is the maximum attainable via skill-ups - int num[MAX_SKILL_LEVEL]; - int cast[MAX_SKILL_LEVEL],delay[MAX_SKILL_LEVEL]; - int upkeep_time[MAX_SKILL_LEVEL],upkeep_time2[MAX_SKILL_LEVEL]; - int castcancel,cast_def_rate; - int inf2,maxcount,skill_type; - int blewcount[MAX_SKILL_LEVEL]; - int hp[MAX_SKILL_LEVEL],sp[MAX_SKILL_LEVEL],mhp[MAX_SKILL_LEVEL],hp_rate[MAX_SKILL_LEVEL],sp_rate[MAX_SKILL_LEVEL],zeny[MAX_SKILL_LEVEL]; - int weapon,state,spiritball[MAX_SKILL_LEVEL]; - int itemid[10],amount[10]; - int castnodex[MAX_SKILL_LEVEL]; +struct skill_db +{ + int range[MAX_SKILL_LEVEL], hit, inf, pl, nk, max, stat, poolflags, max_raise; // `max' is the global max, `max_raise' is the maximum attainable via skill-ups + int num[MAX_SKILL_LEVEL]; + int cast[MAX_SKILL_LEVEL], delay[MAX_SKILL_LEVEL]; + int upkeep_time[MAX_SKILL_LEVEL], upkeep_time2[MAX_SKILL_LEVEL]; + int castcancel, cast_def_rate; + int inf2, maxcount, skill_type; + int blewcount[MAX_SKILL_LEVEL]; + int hp[MAX_SKILL_LEVEL], sp[MAX_SKILL_LEVEL], mhp[MAX_SKILL_LEVEL], + hp_rate[MAX_SKILL_LEVEL], sp_rate[MAX_SKILL_LEVEL], + zeny[MAX_SKILL_LEVEL]; + int weapon, state, spiritball[MAX_SKILL_LEVEL]; + int itemid[10], amount[10]; + int castnodex[MAX_SKILL_LEVEL]; }; extern struct skill_db skill_db[MAX_SKILL_DB]; -struct skill_name_db { - int id; // skill id - char *name; // search strings - char *desc; // description that shows up for search's +struct skill_name_db +{ + int id; // skill id + char *name; // search strings + char *desc; // description that shows up for search's }; extern struct skill_name_db skill_names[]; @@ -42,797 +46,821 @@ struct map_session_data; struct skill_unit; struct skill_unit_group; -int do_init_skill(void); +int do_init_skill (void); // スキルデータベースへのアクセサ -int skill_get_hit( int id ); -int skill_get_inf( int id ); -int skill_get_pl( int id ); -int skill_get_nk( int id ); -int skill_get_max( int id ); -int skill_get_max_raise( int id ); -int skill_get_range( int id , int lv ); -int skill_get_hp( int id ,int lv ); -int skill_get_mhp( int id ,int lv ); -int skill_get_sp( int id ,int lv ); -int skill_get_zeny( int id ,int lv ); -int skill_get_num( int id ,int lv ); -int skill_get_cast( int id ,int lv ); -int skill_get_delay( int id ,int lv ); -int skill_get_time( int id ,int lv ); -int skill_get_time2( int id ,int lv ); -int skill_get_castdef( int id ); -int skill_get_weapontype( int id ); -int skill_get_unit_id(int id,int flag); -int skill_get_inf2( int id ); -int skill_get_maxcount( int id ); -int skill_get_blewcount( int id ,int lv ); +int skill_get_hit (int id); +int skill_get_inf (int id); +int skill_get_pl (int id); +int skill_get_nk (int id); +int skill_get_max (int id); +int skill_get_max_raise (int id); +int skill_get_range (int id, int lv); +int skill_get_hp (int id, int lv); +int skill_get_mhp (int id, int lv); +int skill_get_sp (int id, int lv); +int skill_get_zeny (int id, int lv); +int skill_get_num (int id, int lv); +int skill_get_cast (int id, int lv); +int skill_get_delay (int id, int lv); +int skill_get_time (int id, int lv); +int skill_get_time2 (int id, int lv); +int skill_get_castdef (int id); +int skill_get_weapontype (int id); +int skill_get_unit_id (int id, int flag); +int skill_get_inf2 (int id); +int skill_get_maxcount (int id); +int skill_get_blewcount (int id, int lv); // スキルの使用 -int skill_use_id( struct map_session_data *sd, int target_id, - int skill_num,int skill_lv); -int skill_use_pos( struct map_session_data *sd, - int skill_x, int skill_y, int skill_num, int skill_lv); +int skill_use_id (struct map_session_data *sd, int target_id, + int skill_num, int skill_lv); +int skill_use_pos (struct map_session_data *sd, + int skill_x, int skill_y, int skill_num, int skill_lv); -int skill_castend_map( struct map_session_data *sd,int skill_num, const char *map); +int skill_castend_map (struct map_session_data *sd, int skill_num, + const char *map); -int skill_cleartimerskill(struct block_list *src); -int skill_addtimerskill(struct block_list *src,unsigned int tick,int target,int x,int y,int skill_id,int skill_lv,int type,int flag); +int skill_cleartimerskill (struct block_list *src); +int skill_addtimerskill (struct block_list *src, unsigned int tick, + int target, int x, int y, int skill_id, + int skill_lv, int type, int flag); // 追加効果 -int skill_additional_effect( struct block_list* src, struct block_list *bl,int skillid,int skilllv,int attack_type,unsigned int tick); +int skill_additional_effect (struct block_list *src, struct block_list *bl, + int skillid, int skilllv, int attack_type, + unsigned int tick); // ユニットスキル -struct skill_unit *skill_initunit(struct skill_unit_group *group,int idx,int x,int y); -int skill_delunit(struct skill_unit *unit); -struct skill_unit_group *skill_initunitgroup(struct block_list *src, - int count,int skillid,int skilllv,int unit_id); -int skill_delunitgroup(struct skill_unit_group *group); -struct skill_unit_group_tickset *skill_unitgrouptickset_search( - struct block_list *bl,int group_id); -int skill_unitgrouptickset_delete(struct block_list *bl,int group_id); -int skill_clear_unitgroup(struct block_list *src); - -int skill_unit_ondamaged(struct skill_unit *src,struct block_list *bl, - int damage,unsigned int tick); - -int skill_castfix( struct block_list *bl, int time ); -int skill_delayfix( struct block_list *bl, int time ); -int skill_check_unit_range(int m,int x,int y,int range,int skillid); -int skill_check_unit_range2(int m,int x,int y,int range); -// -- moonsoul (added skill_check_unit_cell) -int skill_check_unit_cell(int skillid,int m,int x,int y,int unit_id); -int skill_unit_out_all( struct block_list *bl,unsigned int tick,int range); -int skill_unit_move( struct block_list *bl,unsigned int tick,int range); -int skill_unit_move_unit_group( struct skill_unit_group *group, int m,int dx,int dy); - -struct skill_unit_group *skill_check_dancing( struct block_list *src ); -void skill_stop_dancing(struct block_list *src, int flag); +struct skill_unit *skill_initunit (struct skill_unit_group *group, int idx, + int x, int y); +int skill_delunit (struct skill_unit *unit); +struct skill_unit_group *skill_initunitgroup (struct block_list *src, + int count, int skillid, + int skilllv, int unit_id); +int skill_delunitgroup (struct skill_unit_group *group); +struct skill_unit_group_tickset *skill_unitgrouptickset_search (struct + block_list + *bl, + int group_id); +int skill_unitgrouptickset_delete (struct block_list *bl, int group_id); +int skill_clear_unitgroup (struct block_list *src); + +int skill_unit_ondamaged (struct skill_unit *src, struct block_list *bl, + int damage, unsigned int tick); + +int skill_castfix (struct block_list *bl, int time); +int skill_delayfix (struct block_list *bl, int time); +int skill_check_unit_range (int m, int x, int y, int range, int skillid); +int skill_check_unit_range2 (int m, int x, int y, int range); +// -- moonsoul (added skill_check_unit_cell) +int skill_check_unit_cell (int skillid, int m, int x, int y, int unit_id); +int skill_unit_out_all (struct block_list *bl, unsigned int tick, int range); +int skill_unit_move (struct block_list *bl, unsigned int tick, int range); +int skill_unit_move_unit_group (struct skill_unit_group *group, int m, + int dx, int dy); + +struct skill_unit_group *skill_check_dancing (struct block_list *src); +void skill_stop_dancing (struct block_list *src, int flag); // 詠唱キャンセル -int skill_castcancel(struct block_list *bl,int type); - -int skill_gangsterparadise(struct map_session_data *sd ,int type); -void skill_brandishspear_first(struct square *tc,int dir,int x,int y); -void skill_brandishspear_dir(struct square *tc,int dir,int are); -int skill_autospell(struct map_session_data *md,int skillid); -void skill_devotion(struct map_session_data *md,int target); -void skill_devotion2(struct block_list *bl,int crusader); -int skill_devotion3(struct block_list *bl,int target); -void skill_devotion_end(struct map_session_data *md,struct map_session_data *sd,int target); +int skill_castcancel (struct block_list *bl, int type); + +int skill_gangsterparadise (struct map_session_data *sd, int type); +void skill_brandishspear_first (struct square *tc, int dir, int x, int y); +void skill_brandishspear_dir (struct square *tc, int dir, int are); +int skill_autospell (struct map_session_data *md, int skillid); +void skill_devotion (struct map_session_data *md, int target); +void skill_devotion2 (struct block_list *bl, int crusader); +int skill_devotion3 (struct block_list *bl, int target); +void skill_devotion_end (struct map_session_data *md, + struct map_session_data *sd, int target); #define skill_calc_heal(bl,skill_lv) (( battle_get_lv(bl)+battle_get_int(bl) )/8 *(4+ skill_lv*8)) // その他 -int skill_check_cloaking(struct block_list *bl); -int skill_is_danceskill(int id); +int skill_check_cloaking (struct block_list *bl); +int skill_is_danceskill (int id); // ステータス異常 -int skill_status_effect(struct block_list *bl,int type,int val1,int val2,int val3,int val4,int tick,int flag, int spell_invocation); -int skill_status_change_start(struct block_list *bl,int type,int val1,int val2,int val3,int val4,int tick,int flag); -int skill_status_change_timer(int tid, unsigned int tick, int id, int data); -int skill_status_change_active(struct block_list *bl,int type); // [fate] -int skill_encchant_eremental_end(struct block_list *bl, int type); -int skill_status_change_end( struct block_list* bl , int type,int tid ); -int skill_status_change_clear(struct block_list *bl,int type); +int skill_status_effect (struct block_list *bl, int type, int val1, int val2, + int val3, int val4, int tick, int flag, + int spell_invocation); +int skill_status_change_start (struct block_list *bl, int type, int val1, + int val2, int val3, int val4, int tick, + int flag); +int skill_status_change_timer (int tid, unsigned int tick, int id, int data); +int skill_status_change_active (struct block_list *bl, int type); // [fate] +int skill_encchant_eremental_end (struct block_list *bl, int type); +int skill_status_change_end (struct block_list *bl, int type, int tid); +int skill_status_change_clear (struct block_list *bl, int type); // mobスキルのため -int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag ); -int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag ); -int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skilllv,unsigned int tick,int flag); +int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, + int skillid, int skilllv, unsigned int tick, + int flag); +int skill_castend_damage_id (struct block_list *src, struct block_list *bl, + int skillid, int skilllv, unsigned int tick, + int flag); +int skill_castend_pos2 (struct block_list *src, int x, int y, int skillid, + int skilllv, unsigned int tick, int flag); // スキル攻撃一括処理 -int skill_attack( int attack_type, struct block_list* src, struct block_list *dsrc, - struct block_list *bl,int skillid,int skilllv,unsigned int tick,int flag ); +int skill_attack (int attack_type, struct block_list *src, + struct block_list *dsrc, struct block_list *bl, + int skillid, int skilllv, unsigned int tick, int flag); -int skill_update_heal_animation(struct map_session_data *sd); // [Fate] Check whether the healing flag must be updated, do so if needed +int skill_update_heal_animation (struct map_session_data *sd); // [Fate] Check whether the healing flag must be updated, do so if needed -void skill_reload(void); +void skill_reload (void); -enum { - ST_NONE,ST_HIDING,ST_CLOAKING,ST_HIDDEN,ST_RIDING,ST_FALCON,ST_CART,ST_SHIELD,ST_SIGHT,ST_EXPLOSIONSPIRITS, - ST_RECOV_WEIGHT_RATE,ST_MOVE_ENABLE,ST_WATER, +enum +{ + ST_NONE, ST_HIDING, ST_CLOAKING, ST_HIDDEN, ST_RIDING, ST_FALCON, ST_CART, + ST_SHIELD, ST_SIGHT, ST_EXPLOSIONSPIRITS, + ST_RECOV_WEIGHT_RATE, ST_MOVE_ENABLE, ST_WATER, }; -enum { // struct map_session_data の status_changeの番号テーブル - SC_SENDMAX = 256, - SC_PROVOKE = 0, - SC_ENDURE = 1, - SC_TWOHANDQUICKEN = 2, - SC_CONCENTRATE = 3, - SC_HIDING = 4, - SC_CLOAKING = 5, - SC_ENCPOISON = 6, - SC_POISONREACT = 7, - SC_QUAGMIRE = 8, - SC_ANGELUS = 9, - SC_BLESSING =10, - SC_SIGNUMCRUCIS =11, - SC_INCREASEAGI =12, - SC_DECREASEAGI =13, - SC_SLOWPOISON =14, - SC_IMPOSITIO =15, - SC_SUFFRAGIUM =16, - SC_ASPERSIO =17, - SC_BENEDICTIO =18, - SC_KYRIE =19, - SC_MAGNIFICAT =20, - SC_GLORIA =21, - SC_AETERNA =22, - SC_ADRENALINE =23, - SC_WEAPONPERFECTION =24, - SC_OVERTHRUST =25, - SC_MAXIMIZEPOWER =26, - SC_RIDING =27, - SC_FALCON =28, - SC_TRICKDEAD =29, - SC_LOUD =30, - SC_ENERGYCOAT =31, - SC_BROKNARMOR =32, - SC_BROKNWEAPON =33, - SC_HALLUCINATION =34, - SC_WEIGHT50 =35, - SC_WEIGHT90 =36, - SC_SPEEDPOTION0 =37, - SC_SPEEDPOTION1 =38, - SC_SPEEDPOTION2 =39, - - SC_STRIPWEAPON =50, - SC_STRIPSHIELD =51, - SC_STRIPARMOR =52, - SC_STRIPHELM =53, - SC_CP_WEAPON =54, - SC_CP_SHIELD =55, - SC_CP_ARMOR =56, - SC_CP_HELM =57, - SC_AUTOGUARD =58, - SC_REFLECTSHIELD =59, - SC_DEVOTION =60, - SC_PROVIDENCE =61, - SC_DEFENDER =62, - SC_AUTOSPELL =65, - SC_EXPLOSIONSPIRITS =86, - SC_STEELBODY =87, - SC_SPEARSQUICKEN =68, - - SC_HEALING =70, - - SC_SIGHTTRASHER =73, - - SC_COMBO =89, - SC_FLAMELAUNCHER =90, - SC_FROSTWEAPON =91, - SC_LIGHTNINGLOADER =92, - SC_SEISMICWEAPON =93, - - SC_AURABLADE =103, - SC_PARRYING =104, - SC_CONCENTRATION =105, - SC_TENSIONRELAX =106, - SC_BERSERK =107, - - SC_ASSUMPTIO =110, - - SC_MAGICPOWER =113, - - SC_TRUESIGHT =115, - SC_WINDWALK =116, - SC_MELTDOWN =117, - SC_CARTBOOST =118, - - SC_REJECTSWORD =120, - SC_MARIONETTE =121, - - SC_HEADCRUSH =124, - SC_JOINTBEAT =125, - SC_BASILICA =125, - - SC_STONE =128, - SC_FREEZE =129, - SC_STAN =130, - SC_SLEEP =131, - SC_POISON =132, - SC_CURSE =133, - SC_SILENCE =134, - SC_CONFUSION =135, - SC_BLIND =136, - - SC_SAFETYWALL =140, - SC_PNEUMA =141, - SC_WATERBALL =142, - SC_ANKLE =143, - SC_DANCING =144, - SC_KEEPING =145, - SC_BARRIER =146, - - SC_MAGICROD =149, - SC_SIGHT =150, - SC_RUWACH =151, - SC_AUTOCOUNTER =152, - SC_VOLCANO =153, - SC_DELUGE =154, - SC_VIOLENTGALE =155, - SC_BLADESTOP_WAIT =156, - SC_BLADESTOP =157, - SC_EXTREMITYFIST =158, - SC_GRAFFITI =159, - SC_ENSEMBLE =159, - - SC_LULLABY =160, - SC_RICHMANKIM =161, - SC_ETERNALCHAOS =162, - SC_DRUMBATTLE =163, - SC_NIBELUNGEN =164, - SC_ROKISWEIL =165, - SC_INTOABYSS =166, - SC_SIEGFRIED =167, - SC_DISSONANCE =168, - SC_WHISTLE =169, - SC_ASSNCROS =170, - SC_POEMBRAGI =171, - SC_APPLEIDUN =172, - SC_UGLYDANCE =173, - SC_HUMMING =174, - SC_DONTFORGETME =175, - SC_FORTUNE =176, - SC_SERVICE4U =177, - SC_FOGWALL =178, - SC_GOSPEL =179, - SC_SPIDERWEB =180, - SC_MEMORIZE =181, - SC_LANDPROTECTOR =182, - SC_ADAPTATION =183, - SC_CHASEWALK =184, - SC_ATKPOT =185, - SC_MATKPOT =186, - SC_WEDDING =187, - SC_NOCHAT =188, - SC_SPLASHER =189, - SC_SELFDESTRUCTION =190, - SC_MINDBREAKER =191, - SC_SPELLBREAKER =192, +enum +{ // struct map_session_data の status_changeの番号テーブル + SC_SENDMAX = 256, + SC_PROVOKE = 0, + SC_ENDURE = 1, + SC_TWOHANDQUICKEN = 2, + SC_CONCENTRATE = 3, + SC_HIDING = 4, + SC_CLOAKING = 5, + SC_ENCPOISON = 6, + SC_POISONREACT = 7, + SC_QUAGMIRE = 8, + SC_ANGELUS = 9, + SC_BLESSING = 10, + SC_SIGNUMCRUCIS = 11, + SC_INCREASEAGI = 12, + SC_DECREASEAGI = 13, + SC_SLOWPOISON = 14, + SC_IMPOSITIO = 15, + SC_SUFFRAGIUM = 16, + SC_ASPERSIO = 17, + SC_BENEDICTIO = 18, + SC_KYRIE = 19, + SC_MAGNIFICAT = 20, + SC_GLORIA = 21, + SC_AETERNA = 22, + SC_ADRENALINE = 23, + SC_WEAPONPERFECTION = 24, + SC_OVERTHRUST = 25, + SC_MAXIMIZEPOWER = 26, + SC_RIDING = 27, + SC_FALCON = 28, + SC_TRICKDEAD = 29, + SC_LOUD = 30, + SC_ENERGYCOAT = 31, + SC_BROKNARMOR = 32, + SC_BROKNWEAPON = 33, + SC_HALLUCINATION = 34, + SC_WEIGHT50 = 35, + SC_WEIGHT90 = 36, + SC_SPEEDPOTION0 = 37, + SC_SPEEDPOTION1 = 38, + SC_SPEEDPOTION2 = 39, + + SC_STRIPWEAPON = 50, + SC_STRIPSHIELD = 51, + SC_STRIPARMOR = 52, + SC_STRIPHELM = 53, + SC_CP_WEAPON = 54, + SC_CP_SHIELD = 55, + SC_CP_ARMOR = 56, + SC_CP_HELM = 57, + SC_AUTOGUARD = 58, + SC_REFLECTSHIELD = 59, + SC_DEVOTION = 60, + SC_PROVIDENCE = 61, + SC_DEFENDER = 62, + SC_AUTOSPELL = 65, + SC_EXPLOSIONSPIRITS = 86, + SC_STEELBODY = 87, + SC_SPEARSQUICKEN = 68, + + SC_HEALING = 70, + + SC_SIGHTTRASHER = 73, + + SC_COMBO = 89, + SC_FLAMELAUNCHER = 90, + SC_FROSTWEAPON = 91, + SC_LIGHTNINGLOADER = 92, + SC_SEISMICWEAPON = 93, + + SC_AURABLADE = 103, + SC_PARRYING = 104, + SC_CONCENTRATION = 105, + SC_TENSIONRELAX = 106, + SC_BERSERK = 107, + + SC_ASSUMPTIO = 110, + + SC_MAGICPOWER = 113, + + SC_TRUESIGHT = 115, + SC_WINDWALK = 116, + SC_MELTDOWN = 117, + SC_CARTBOOST = 118, + + SC_REJECTSWORD = 120, + SC_MARIONETTE = 121, + + SC_HEADCRUSH = 124, + SC_JOINTBEAT = 125, + SC_BASILICA = 125, + + SC_STONE = 128, + SC_FREEZE = 129, + SC_STAN = 130, + SC_SLEEP = 131, + SC_POISON = 132, + SC_CURSE = 133, + SC_SILENCE = 134, + SC_CONFUSION = 135, + SC_BLIND = 136, + + SC_SAFETYWALL = 140, + SC_PNEUMA = 141, + SC_WATERBALL = 142, + SC_ANKLE = 143, + SC_DANCING = 144, + SC_KEEPING = 145, + SC_BARRIER = 146, + + SC_MAGICROD = 149, + SC_SIGHT = 150, + SC_RUWACH = 151, + SC_AUTOCOUNTER = 152, + SC_VOLCANO = 153, + SC_DELUGE = 154, + SC_VIOLENTGALE = 155, + SC_BLADESTOP_WAIT = 156, + SC_BLADESTOP = 157, + SC_EXTREMITYFIST = 158, + SC_GRAFFITI = 159, + SC_ENSEMBLE = 159, + + SC_LULLABY = 160, + SC_RICHMANKIM = 161, + SC_ETERNALCHAOS = 162, + SC_DRUMBATTLE = 163, + SC_NIBELUNGEN = 164, + SC_ROKISWEIL = 165, + SC_INTOABYSS = 166, + SC_SIEGFRIED = 167, + SC_DISSONANCE = 168, + SC_WHISTLE = 169, + SC_ASSNCROS = 170, + SC_POEMBRAGI = 171, + SC_APPLEIDUN = 172, + SC_UGLYDANCE = 173, + SC_HUMMING = 174, + SC_DONTFORGETME = 175, + SC_FORTUNE = 176, + SC_SERVICE4U = 177, + SC_FOGWALL = 178, + SC_GOSPEL = 179, + SC_SPIDERWEB = 180, + SC_MEMORIZE = 181, + SC_LANDPROTECTOR = 182, + SC_ADAPTATION = 183, + SC_CHASEWALK = 184, + SC_ATKPOT = 185, + SC_MATKPOT = 186, + SC_WEDDING = 187, + SC_NOCHAT = 188, + SC_SPLASHER = 189, + SC_SELFDESTRUCTION = 190, + SC_MINDBREAKER = 191, + SC_SPELLBREAKER = 192, // Added for Fate's spells - SC_HIDE = 194, // Hide from `detect' magic - SC_HALT_REGENERATE = 195, // Suspend regeneration - SC_FLYING_BACKPACK = 196, // Flying backpack - SC_MBARRIER = 197, // Magical barrier, magic resistance (val1 : power (%)) - SC_HASTE = 198, // `Haste' spell (val1 : power) - SC_PHYS_SHIELD = 199, // `Protect' spell, reduce damage (val1: power) - - SC_DIVINA = SC_SILENCE, + SC_HIDE = 194, // Hide from `detect' magic + SC_HALT_REGENERATE = 195, // Suspend regeneration + SC_FLYING_BACKPACK = 196, // Flying backpack + SC_MBARRIER = 197, // Magical barrier, magic resistance (val1 : power (%)) + SC_HASTE = 198, // `Haste' spell (val1 : power) + SC_PHYS_SHIELD = 199, // `Protect' spell, reduce damage (val1: power) + + SC_DIVINA = SC_SILENCE, }; extern int SkillStatusChangeTable[]; -enum { - NV_EMOTE = 1, - NV_TRADE, - NV_PARTY, - - SM_SWORD, - SM_TWOHAND, - SM_RECOVERY, - SM_BASH, - SM_PROVOKE, - SM_MAGNUM, - SM_ENDURE, - - MG_SRECOVERY, - MG_SIGHT, - MG_NAPALMBEAT, - MG_SAFETYWALL, - MG_SOULSTRIKE, - MG_COLDBOLT, - MG_FROSTDIVER, - MG_STONECURSE, - MG_FIREBALL, - MG_FIREWALL, - MG_FIREBOLT, - MG_LIGHTNINGBOLT, - MG_THUNDERSTORM, - - AL_DP, - AL_DEMONBANE, - AL_RUWACH, - AL_PNEUMA, - AL_TELEPORT, - AL_WARP, - AL_HEAL, - AL_INCAGI, - AL_DECAGI, - AL_HOLYWATER, - AL_CRUCIS, - AL_ANGELUS, - AL_BLESSING, - AL_CURE, - - MC_INCCARRY, - MC_DISCOUNT, - MC_OVERCHARGE, - MC_PUSHCART, - MC_IDENTIFY, - MC_VENDING, - MC_MAMMONITE, - - AC_OWL = 45, - AC_VULTURE, - AC_CONCENTRATION, - AC_DOUBLE, - AC_SHOWER, - - TF_DOUBLE, - TF_MISS, - TF_STEAL, - TF_HIDING, - TF_POISON, - TF_DETOXIFY, - - ALL_RESURRECTION, - - KN_SPEARMASTERY, - KN_PIERCE, - KN_BRANDISHSPEAR, - KN_SPEARSTAB, - KN_SPEARBOOMERANG, - KN_TWOHANDQUICKEN, - KN_AUTOCOUNTER, - KN_BOWLINGBASH, - KN_RIDING, - KN_CAVALIERMASTERY, - - PR_MACEMASTERY, - PR_IMPOSITIO, - PR_SUFFRAGIUM, - PR_ASPERSIO, - PR_BENEDICTIO, - PR_SANCTUARY, - PR_SLOWPOISON, - PR_STRECOVERY, - PR_KYRIE, - PR_MAGNIFICAT, - PR_GLORIA, - PR_LEXDIVINA, - PR_TURNUNDEAD, - PR_LEXAETERNA, - PR_MAGNUS, - - WZ_FIREPILLAR, - WZ_SIGHTRASHER, - WZ_FIREIVY, - WZ_METEOR, - WZ_JUPITEL, - WZ_VERMILION, - WZ_WATERBALL, - WZ_ICEWALL, - WZ_FROSTNOVA, - WZ_STORMGUST, - WZ_EARTHSPIKE, - WZ_HEAVENDRIVE, - WZ_QUAGMIRE, - WZ_ESTIMATION, - - BS_IRON, - BS_STEEL, - BS_ENCHANTEDSTONE, - BS_ORIDEOCON, - BS_DAGGER, - BS_SWORD, - BS_TWOHANDSWORD, - BS_AXE, - BS_MACE, - BS_KNUCKLE, - BS_SPEAR, - BS_HILTBINDING, - BS_FINDINGORE, - BS_WEAPONRESEARCH, - BS_REPAIRWEAPON, - BS_SKINTEMPER, - BS_HAMMERFALL, - BS_ADRENALINE, - BS_WEAPONPERFECT, - BS_OVERTHRUST, - BS_MAXIMIZE, - - HT_SKIDTRAP, - HT_LANDMINE, - HT_ANKLESNARE, - HT_SHOCKWAVE, - HT_SANDMAN, - HT_FLASHER, - HT_FREEZINGTRAP, - HT_BLASTMINE, - HT_CLAYMORETRAP, - HT_REMOVETRAP, - HT_TALKIEBOX, - HT_BEASTBANE, - HT_FALCON, - HT_STEELCROW, - HT_BLITZBEAT, - HT_DETECTING, - HT_SPRINGTRAP, - - AS_RIGHT, - AS_LEFT, - AS_KATAR, - AS_CLOAKING, - AS_SONICBLOW, - AS_GRIMTOOTH, - AS_ENCHANTPOISON, - AS_POISONREACT, - AS_VENOMDUST, - AS_SPLASHER, - - NV_FIRSTAID, - NV_TRICKDEAD, - SM_MOVINGRECOVERY, - SM_FATALBLOW, - SM_AUTOBERSERK, - AC_MAKINGARROW, - AC_CHARGEARROW, - TF_SPRINKLESAND, - TF_BACKSLIDING, - TF_PICKSTONE, - TF_THROWSTONE, - MC_CARTREVOLUTION, - MC_CHANGECART, - MC_LOUD, - AL_HOLYLIGHT, - MG_ENERGYCOAT, - - NPC_PIERCINGATT, - NPC_MENTALBREAKER, - NPC_RANGEATTACK, - NPC_ATTRICHANGE, - NPC_CHANGEWATER, - NPC_CHANGEGROUND, - NPC_CHANGEFIRE, - NPC_CHANGEWIND, - NPC_CHANGEPOISON, - NPC_CHANGEHOLY, - NPC_CHANGEDARKNESS, - NPC_CHANGETELEKINESIS, - NPC_CRITICALSLASH, - NPC_COMBOATTACK, - NPC_GUIDEDATTACK, - NPC_SELFDESTRUCTION, - NPC_SPLASHATTACK, - NPC_SUICIDE, - NPC_POISON, - NPC_BLINDATTACK, - NPC_SILENCEATTACK, - NPC_STUNATTACK, - NPC_PETRIFYATTACK, - NPC_CURSEATTACK, - NPC_SLEEPATTACK, - NPC_RANDOMATTACK, - NPC_WATERATTACK, - NPC_GROUNDATTACK, - NPC_FIREATTACK, - NPC_WINDATTACK, - NPC_POISONATTACK, - NPC_HOLYATTACK, - NPC_DARKNESSATTACK, - NPC_TELEKINESISATTACK, - NPC_MAGICALATTACK, - NPC_METAMORPHOSIS, - NPC_PROVOCATION, - NPC_SMOKING, - NPC_SUMMONSLAVE, - NPC_EMOTION, - NPC_TRANSFORMATION, - NPC_BLOODDRAIN, - NPC_ENERGYDRAIN, - NPC_KEEPING, - NPC_DARKBREATH, - NPC_DARKBLESSING, - NPC_BARRIER, - NPC_DEFENDER, - NPC_LICK, - NPC_HALLUCINATION, - NPC_REBIRTH, - NPC_SUMMONMONSTER, - - RG_SNATCHER, - RG_STEALCOIN, - RG_BACKSTAP, - RG_TUNNELDRIVE, - RG_RAID, - RG_STRIPWEAPON, - RG_STRIPSHIELD, - RG_STRIPARMOR, - RG_STRIPHELM, - RG_INTIMIDATE, - RG_GRAFFITI, - RG_FLAGGRAFFITI, - RG_CLEANER, - RG_GANGSTER, - RG_COMPULSION, - RG_PLAGIARISM, - - AM_AXEMASTERY, - AM_LEARNINGPOTION, - AM_PHARMACY, - AM_DEMONSTRATION, - AM_ACIDTERROR, - AM_POTIONPITCHER, - AM_CANNIBALIZE, - AM_SPHEREMINE, - AM_CP_WEAPON, - AM_CP_SHIELD, - AM_CP_ARMOR, - AM_CP_HELM, - AM_BIOETHICS, - AM_BIOTECHNOLOGY, - AM_CREATECREATURE, - AM_CULTIVATION, - AM_FLAMECONTROL, - AM_CALLHOMUN, - AM_REST, - AM_DRILLMASTER, - AM_HEALHOMUN, - AM_RESURRECTHOMUN, - - CR_TRUST, - CR_AUTOGUARD, - CR_SHIELDCHARGE, - CR_SHIELDBOOMERANG, - CR_REFLECTSHIELD, - CR_HOLYCROSS, - CR_GRANDCROSS, - CR_DEVOTION, - CR_PROVIDENCE, - CR_DEFENDER, - CR_SPEARQUICKEN, - - MO_IRONHAND, - MO_SPIRITSRECOVERY, - MO_CALLSPIRITS, - MO_ABSORBSPIRITS, - MO_TRIPLEATTACK, - MO_BODYRELOCATION, - MO_DODGE, - MO_INVESTIGATE, - MO_FINGEROFFENSIVE, - MO_STEELBODY, - MO_BLADESTOP, - MO_EXPLOSIONSPIRITS, - MO_EXTREMITYFIST, - MO_CHAINCOMBO, - MO_COMBOFINISH, - - SA_ADVANCEDBOOK, - SA_CASTCANCEL, - SA_MAGICROD, - SA_SPELLBREAKER, - SA_FREECAST, - SA_AUTOSPELL, - SA_FLAMELAUNCHER, - SA_FROSTWEAPON, - SA_LIGHTNINGLOADER, - SA_SEISMICWEAPON, - SA_DRAGONOLOGY, - SA_VOLCANO, - SA_DELUGE, - SA_VIOLENTGALE, - SA_LANDPROTECTOR, - SA_DISPELL, - SA_ABRACADABRA, - SA_MONOCELL, - SA_CLASSCHANGE, - SA_SUMMONMONSTER, - SA_REVERSEORCISH, - SA_DEATH, - SA_FORTUNE, - SA_TAMINGMONSTER, - SA_QUESTION, - SA_GRAVITY, - SA_LEVELUP, - SA_INSTANTDEATH, - SA_FULLRECOVERY, - SA_COMA, - - BD_ADAPTATION, - BD_ENCORE, - BD_LULLABY, - BD_RICHMANKIM, - BD_ETERNALCHAOS, - BD_DRUMBATTLEFIELD, - BD_RINGNIBELUNGEN, - BD_ROKISWEIL, - BD_INTOABYSS, - BD_SIEGFRIED, - BD_RAGNAROK, - - BA_MUSICALLESSON, - BA_MUSICALSTRIKE, - BA_DISSONANCE, - BA_FROSTJOKE, - BA_WHISTLE, - BA_ASSASSINCROSS, - BA_POEMBRAGI, - BA_APPLEIDUN, - - DC_DANCINGLESSON, - DC_THROWARROW, - DC_UGLYDANCE, - DC_SCREAM, - DC_HUMMING, - DC_DONTFORGETME, - DC_FORTUNEKISS, - DC_SERVICEFORYOU, - - NPC_SELFDESTRUCTION2 = 333, - - WE_MALE = 334, - WE_FEMALE, - WE_CALLPARTNER, - - NPC_DARKCROSS = 338, - - TMW_SKILLPOOL = 339, // skill pool size - - TMW_MAGIC = 340, - TMW_MAGIC_LIFE = 341, - TMW_MAGIC_WAR = 342, - TMW_MAGIC_TRANSMUTE = 343, - TMW_MAGIC_NATURE = 344, - TMW_MAGIC_ETHER = 345, - TMW_MAGIC_DARK = 346, - TMW_MAGIC_LIGHT = 347, - - TMW_BRAWLING = 350, - TMW_LUCKY_COUNTER = 351, - TMW_SPEED = 352, - TMW_RESIST_POISON = 353, - TMW_ASTRAL_SOUL = 354, - - LK_AURABLADE = 355, - LK_PARRYING, - LK_CONCENTRATION, - LK_TENSIONRELAX, - LK_BERSERK, - LK_FURY, - HP_ASSUMPTIO, - HP_BASILICA, - HP_MEDITATIO, - HW_SOULDRAIN, - HW_MAGICCRASHER, - HW_MAGICPOWER, - PA_PRESSURE, - PA_SACRIFICE, - PA_GOSPEL, - CH_PALMSTRIKE, - CH_TIGERFIST, - CH_CHAINCRUSH, - PF_HPCONVERSION, - PF_SOULCHANGE, - PF_SOULBURN, - ASC_KATAR, - ASC_HALLUCINATION, - ASC_EDP, - ASC_BREAKER, - SN_SIGHT, - SN_FALCONASSAULT, - SN_SHARPSHOOTING, - SN_WINDWALK, - WS_MELTDOWN, - WS_CREATECOIN, - WS_CREATENUGGET, - WS_CARTBOOST, - WS_SYSTEMCREATE, - ST_CHASEWALK, - ST_REJECTSWORD, - ST_STEALBACKPACK, - CR_ALCHEMY, - CR_SYNTHESISPOTION, - CG_ARROWVULCAN, - CG_MOONLIT, - CG_MARIONETTE, - LK_SPIRALPIERCE, - LK_HEADCRUSH, - LK_JOINTBEAT, - HW_NAPALMVULCAN, - CH_SOULCOLLECT, - PF_MINDBREAKER, - PF_MEMORIZE, - PF_FOGWALL, - PF_SPIDERWEB, - ASC_METEORASSAULT, - ASC_CDP, - WE_BABY, - WE_CALLPARENT, - WE_CALLBABY, - TK_RUN, - TK_READYSTORM, - TK_STORMKICK, - TK_READYDOWN, - TK_DOWNKICK, - TK_READYTURN, - TK_TURNKICK, - TK_READYCOUNTER, - TK_COUNTER, - TK_DODGE, - TK_JUMPKICK, - TK_HPTIME, - TK_SPTIME, - TK_POWER, - TK_SEVENWIND, - TK_HIGHJUMP, - SG_FEEL, - SG_SUN_WARM, - SG_MOON_WARM, - SG_STAR_WARM, - SG_SUN_COMFORT, - SG_MOON_COMFORT, - SG_STAR_COMFORT, - SG_HATE, - SG_SUN_ANGER, - SG_MOON_ANGER, - SG_STAR_ANGER, - SG_SUN_BLESS, - SG_MOON_BLESS, - SG_STAR_BLESS, - SG_DEVIL, - SG_FRIEND, - SG_KNOWLEDGE, - SG_FUSION, - SL_ALCHEMIST, - AM_BERSERKPITCHER, - SL_MONK, - SL_STAR, - SL_SAGE, - SL_CRUSADER, - SL_SUPERNOVICE, - SL_KNIGHT, - SL_WIZARD, - SL_PRIEST, - SL_BARDDANCER, - SL_ROGUE, - SL_ASSASIN, - SL_BLACKSMITH, - BS_ADRENALINE2, - SL_HUNTER, - SL_SOULLINKER, - SL_KAIZEL, - SL_KAAHI, - SL_KAUPE, - SL_KAITE, - SL_KAINA, - SL_STIN, - SL_STUN, - SL_SMA, - SL_SWOO, - SL_SKE, - SL_SKA, - - GD_APPROVAL=10000, - GD_KAFRACONTACT, - GD_GUARDIANRESEARCH, - GD_CHARISMA, - GD_EXTENSION, +enum +{ + NV_EMOTE = 1, + NV_TRADE, + NV_PARTY, + + SM_SWORD, + SM_TWOHAND, + SM_RECOVERY, + SM_BASH, + SM_PROVOKE, + SM_MAGNUM, + SM_ENDURE, + + MG_SRECOVERY, + MG_SIGHT, + MG_NAPALMBEAT, + MG_SAFETYWALL, + MG_SOULSTRIKE, + MG_COLDBOLT, + MG_FROSTDIVER, + MG_STONECURSE, + MG_FIREBALL, + MG_FIREWALL, + MG_FIREBOLT, + MG_LIGHTNINGBOLT, + MG_THUNDERSTORM, + + AL_DP, + AL_DEMONBANE, + AL_RUWACH, + AL_PNEUMA, + AL_TELEPORT, + AL_WARP, + AL_HEAL, + AL_INCAGI, + AL_DECAGI, + AL_HOLYWATER, + AL_CRUCIS, + AL_ANGELUS, + AL_BLESSING, + AL_CURE, + + MC_INCCARRY, + MC_DISCOUNT, + MC_OVERCHARGE, + MC_PUSHCART, + MC_IDENTIFY, + MC_VENDING, + MC_MAMMONITE, + + AC_OWL = 45, + AC_VULTURE, + AC_CONCENTRATION, + AC_DOUBLE, + AC_SHOWER, + + TF_DOUBLE, + TF_MISS, + TF_STEAL, + TF_HIDING, + TF_POISON, + TF_DETOXIFY, + + ALL_RESURRECTION, + + KN_SPEARMASTERY, + KN_PIERCE, + KN_BRANDISHSPEAR, + KN_SPEARSTAB, + KN_SPEARBOOMERANG, + KN_TWOHANDQUICKEN, + KN_AUTOCOUNTER, + KN_BOWLINGBASH, + KN_RIDING, + KN_CAVALIERMASTERY, + + PR_MACEMASTERY, + PR_IMPOSITIO, + PR_SUFFRAGIUM, + PR_ASPERSIO, + PR_BENEDICTIO, + PR_SANCTUARY, + PR_SLOWPOISON, + PR_STRECOVERY, + PR_KYRIE, + PR_MAGNIFICAT, + PR_GLORIA, + PR_LEXDIVINA, + PR_TURNUNDEAD, + PR_LEXAETERNA, + PR_MAGNUS, + + WZ_FIREPILLAR, + WZ_SIGHTRASHER, + WZ_FIREIVY, + WZ_METEOR, + WZ_JUPITEL, + WZ_VERMILION, + WZ_WATERBALL, + WZ_ICEWALL, + WZ_FROSTNOVA, + WZ_STORMGUST, + WZ_EARTHSPIKE, + WZ_HEAVENDRIVE, + WZ_QUAGMIRE, + WZ_ESTIMATION, + + BS_IRON, + BS_STEEL, + BS_ENCHANTEDSTONE, + BS_ORIDEOCON, + BS_DAGGER, + BS_SWORD, + BS_TWOHANDSWORD, + BS_AXE, + BS_MACE, + BS_KNUCKLE, + BS_SPEAR, + BS_HILTBINDING, + BS_FINDINGORE, + BS_WEAPONRESEARCH, + BS_REPAIRWEAPON, + BS_SKINTEMPER, + BS_HAMMERFALL, + BS_ADRENALINE, + BS_WEAPONPERFECT, + BS_OVERTHRUST, + BS_MAXIMIZE, + + HT_SKIDTRAP, + HT_LANDMINE, + HT_ANKLESNARE, + HT_SHOCKWAVE, + HT_SANDMAN, + HT_FLASHER, + HT_FREEZINGTRAP, + HT_BLASTMINE, + HT_CLAYMORETRAP, + HT_REMOVETRAP, + HT_TALKIEBOX, + HT_BEASTBANE, + HT_FALCON, + HT_STEELCROW, + HT_BLITZBEAT, + HT_DETECTING, + HT_SPRINGTRAP, + + AS_RIGHT, + AS_LEFT, + AS_KATAR, + AS_CLOAKING, + AS_SONICBLOW, + AS_GRIMTOOTH, + AS_ENCHANTPOISON, + AS_POISONREACT, + AS_VENOMDUST, + AS_SPLASHER, + + NV_FIRSTAID, + NV_TRICKDEAD, + SM_MOVINGRECOVERY, + SM_FATALBLOW, + SM_AUTOBERSERK, + AC_MAKINGARROW, + AC_CHARGEARROW, + TF_SPRINKLESAND, + TF_BACKSLIDING, + TF_PICKSTONE, + TF_THROWSTONE, + MC_CARTREVOLUTION, + MC_CHANGECART, + MC_LOUD, + AL_HOLYLIGHT, + MG_ENERGYCOAT, + + NPC_PIERCINGATT, + NPC_MENTALBREAKER, + NPC_RANGEATTACK, + NPC_ATTRICHANGE, + NPC_CHANGEWATER, + NPC_CHANGEGROUND, + NPC_CHANGEFIRE, + NPC_CHANGEWIND, + NPC_CHANGEPOISON, + NPC_CHANGEHOLY, + NPC_CHANGEDARKNESS, + NPC_CHANGETELEKINESIS, + NPC_CRITICALSLASH, + NPC_COMBOATTACK, + NPC_GUIDEDATTACK, + NPC_SELFDESTRUCTION, + NPC_SPLASHATTACK, + NPC_SUICIDE, + NPC_POISON, + NPC_BLINDATTACK, + NPC_SILENCEATTACK, + NPC_STUNATTACK, + NPC_PETRIFYATTACK, + NPC_CURSEATTACK, + NPC_SLEEPATTACK, + NPC_RANDOMATTACK, + NPC_WATERATTACK, + NPC_GROUNDATTACK, + NPC_FIREATTACK, + NPC_WINDATTACK, + NPC_POISONATTACK, + NPC_HOLYATTACK, + NPC_DARKNESSATTACK, + NPC_TELEKINESISATTACK, + NPC_MAGICALATTACK, + NPC_METAMORPHOSIS, + NPC_PROVOCATION, + NPC_SMOKING, + NPC_SUMMONSLAVE, + NPC_EMOTION, + NPC_TRANSFORMATION, + NPC_BLOODDRAIN, + NPC_ENERGYDRAIN, + NPC_KEEPING, + NPC_DARKBREATH, + NPC_DARKBLESSING, + NPC_BARRIER, + NPC_DEFENDER, + NPC_LICK, + NPC_HALLUCINATION, + NPC_REBIRTH, + NPC_SUMMONMONSTER, + + RG_SNATCHER, + RG_STEALCOIN, + RG_BACKSTAP, + RG_TUNNELDRIVE, + RG_RAID, + RG_STRIPWEAPON, + RG_STRIPSHIELD, + RG_STRIPARMOR, + RG_STRIPHELM, + RG_INTIMIDATE, + RG_GRAFFITI, + RG_FLAGGRAFFITI, + RG_CLEANER, + RG_GANGSTER, + RG_COMPULSION, + RG_PLAGIARISM, + + AM_AXEMASTERY, + AM_LEARNINGPOTION, + AM_PHARMACY, + AM_DEMONSTRATION, + AM_ACIDTERROR, + AM_POTIONPITCHER, + AM_CANNIBALIZE, + AM_SPHEREMINE, + AM_CP_WEAPON, + AM_CP_SHIELD, + AM_CP_ARMOR, + AM_CP_HELM, + AM_BIOETHICS, + AM_BIOTECHNOLOGY, + AM_CREATECREATURE, + AM_CULTIVATION, + AM_FLAMECONTROL, + AM_CALLHOMUN, + AM_REST, + AM_DRILLMASTER, + AM_HEALHOMUN, + AM_RESURRECTHOMUN, + + CR_TRUST, + CR_AUTOGUARD, + CR_SHIELDCHARGE, + CR_SHIELDBOOMERANG, + CR_REFLECTSHIELD, + CR_HOLYCROSS, + CR_GRANDCROSS, + CR_DEVOTION, + CR_PROVIDENCE, + CR_DEFENDER, + CR_SPEARQUICKEN, + + MO_IRONHAND, + MO_SPIRITSRECOVERY, + MO_CALLSPIRITS, + MO_ABSORBSPIRITS, + MO_TRIPLEATTACK, + MO_BODYRELOCATION, + MO_DODGE, + MO_INVESTIGATE, + MO_FINGEROFFENSIVE, + MO_STEELBODY, + MO_BLADESTOP, + MO_EXPLOSIONSPIRITS, + MO_EXTREMITYFIST, + MO_CHAINCOMBO, + MO_COMBOFINISH, + + SA_ADVANCEDBOOK, + SA_CASTCANCEL, + SA_MAGICROD, + SA_SPELLBREAKER, + SA_FREECAST, + SA_AUTOSPELL, + SA_FLAMELAUNCHER, + SA_FROSTWEAPON, + SA_LIGHTNINGLOADER, + SA_SEISMICWEAPON, + SA_DRAGONOLOGY, + SA_VOLCANO, + SA_DELUGE, + SA_VIOLENTGALE, + SA_LANDPROTECTOR, + SA_DISPELL, + SA_ABRACADABRA, + SA_MONOCELL, + SA_CLASSCHANGE, + SA_SUMMONMONSTER, + SA_REVERSEORCISH, + SA_DEATH, + SA_FORTUNE, + SA_TAMINGMONSTER, + SA_QUESTION, + SA_GRAVITY, + SA_LEVELUP, + SA_INSTANTDEATH, + SA_FULLRECOVERY, + SA_COMA, + + BD_ADAPTATION, + BD_ENCORE, + BD_LULLABY, + BD_RICHMANKIM, + BD_ETERNALCHAOS, + BD_DRUMBATTLEFIELD, + BD_RINGNIBELUNGEN, + BD_ROKISWEIL, + BD_INTOABYSS, + BD_SIEGFRIED, + BD_RAGNAROK, + + BA_MUSICALLESSON, + BA_MUSICALSTRIKE, + BA_DISSONANCE, + BA_FROSTJOKE, + BA_WHISTLE, + BA_ASSASSINCROSS, + BA_POEMBRAGI, + BA_APPLEIDUN, + + DC_DANCINGLESSON, + DC_THROWARROW, + DC_UGLYDANCE, + DC_SCREAM, + DC_HUMMING, + DC_DONTFORGETME, + DC_FORTUNEKISS, + DC_SERVICEFORYOU, + + NPC_SELFDESTRUCTION2 = 333, + + WE_MALE = 334, + WE_FEMALE, + WE_CALLPARTNER, + + NPC_DARKCROSS = 338, + + TMW_SKILLPOOL = 339, // skill pool size + + TMW_MAGIC = 340, + TMW_MAGIC_LIFE = 341, + TMW_MAGIC_WAR = 342, + TMW_MAGIC_TRANSMUTE = 343, + TMW_MAGIC_NATURE = 344, + TMW_MAGIC_ETHER = 345, + TMW_MAGIC_DARK = 346, + TMW_MAGIC_LIGHT = 347, + + TMW_BRAWLING = 350, + TMW_LUCKY_COUNTER = 351, + TMW_SPEED = 352, + TMW_RESIST_POISON = 353, + TMW_ASTRAL_SOUL = 354, + + LK_AURABLADE = 355, + LK_PARRYING, + LK_CONCENTRATION, + LK_TENSIONRELAX, + LK_BERSERK, + LK_FURY, + HP_ASSUMPTIO, + HP_BASILICA, + HP_MEDITATIO, + HW_SOULDRAIN, + HW_MAGICCRASHER, + HW_MAGICPOWER, + PA_PRESSURE, + PA_SACRIFICE, + PA_GOSPEL, + CH_PALMSTRIKE, + CH_TIGERFIST, + CH_CHAINCRUSH, + PF_HPCONVERSION, + PF_SOULCHANGE, + PF_SOULBURN, + ASC_KATAR, + ASC_HALLUCINATION, + ASC_EDP, + ASC_BREAKER, + SN_SIGHT, + SN_FALCONASSAULT, + SN_SHARPSHOOTING, + SN_WINDWALK, + WS_MELTDOWN, + WS_CREATECOIN, + WS_CREATENUGGET, + WS_CARTBOOST, + WS_SYSTEMCREATE, + ST_CHASEWALK, + ST_REJECTSWORD, + ST_STEALBACKPACK, + CR_ALCHEMY, + CR_SYNTHESISPOTION, + CG_ARROWVULCAN, + CG_MOONLIT, + CG_MARIONETTE, + LK_SPIRALPIERCE, + LK_HEADCRUSH, + LK_JOINTBEAT, + HW_NAPALMVULCAN, + CH_SOULCOLLECT, + PF_MINDBREAKER, + PF_MEMORIZE, + PF_FOGWALL, + PF_SPIDERWEB, + ASC_METEORASSAULT, + ASC_CDP, + WE_BABY, + WE_CALLPARENT, + WE_CALLBABY, + TK_RUN, + TK_READYSTORM, + TK_STORMKICK, + TK_READYDOWN, + TK_DOWNKICK, + TK_READYTURN, + TK_TURNKICK, + TK_READYCOUNTER, + TK_COUNTER, + TK_DODGE, + TK_JUMPKICK, + TK_HPTIME, + TK_SPTIME, + TK_POWER, + TK_SEVENWIND, + TK_HIGHJUMP, + SG_FEEL, + SG_SUN_WARM, + SG_MOON_WARM, + SG_STAR_WARM, + SG_SUN_COMFORT, + SG_MOON_COMFORT, + SG_STAR_COMFORT, + SG_HATE, + SG_SUN_ANGER, + SG_MOON_ANGER, + SG_STAR_ANGER, + SG_SUN_BLESS, + SG_MOON_BLESS, + SG_STAR_BLESS, + SG_DEVIL, + SG_FRIEND, + SG_KNOWLEDGE, + SG_FUSION, + SL_ALCHEMIST, + AM_BERSERKPITCHER, + SL_MONK, + SL_STAR, + SL_SAGE, + SL_CRUSADER, + SL_SUPERNOVICE, + SL_KNIGHT, + SL_WIZARD, + SL_PRIEST, + SL_BARDDANCER, + SL_ROGUE, + SL_ASSASIN, + SL_BLACKSMITH, + BS_ADRENALINE2, + SL_HUNTER, + SL_SOULLINKER, + SL_KAIZEL, + SL_KAAHI, + SL_KAUPE, + SL_KAITE, + SL_KAINA, + SL_STIN, + SL_STUN, + SL_SMA, + SL_SWOO, + SL_SKE, + SL_SKA, + + GD_APPROVAL = 10000, + GD_KAFRACONTACT, + GD_GUARDIANRESEARCH, + GD_CHARISMA, + GD_EXTENSION, }; - // [Fate] Skill pools API // Max. # of active entries in the skill pool @@ -840,22 +868,21 @@ enum { // Max. # of skills that may be classified as pool skills in db/skill_db.txt #define MAX_POOL_SKILLS 128 -extern int skill_pool_skills[MAX_POOL_SKILLS]; // All pool skills -extern int skill_pool_skills_size; // Number of entries in skill_pool_skills - -int skill_pool(struct map_session_data *sd, int *skills); // Yields all active skills in the skill pool; no more than MAX_SKILL_POOL. Return is number of skills. -int skill_pool_size(struct map_session_data *sd); -int skill_pool_max(struct map_session_data *sd); // Max. number of pool skills -void skill_pool_empty(struct map_session_data *sd); // Deactivate all pool skills -int skill_pool_activate(struct map_session_data *sd, int skill); // Skill into skill pool. Return is zero iff okay. -int skill_pool_is_activated(struct map_session_data *sd, int skill); // Skill into skill pool. Return is zero when activated. -int skill_pool_deactivate(struct map_session_data *sd, int skill); // Skill out of skill pool. Return is zero iff okay. -char *skill_name(int skill); // Yield configurable skill name -int skill_stat(int skill); // Yields the stat associated with a skill. Returns zero if none, or SP_STR, SP_VIT, ... otherwise -int skill_power(struct map_session_data *sd, int skill); // Yields the power of a skill. This is zero if the skill is unknown or if it's a pool skill that is outside of the skill pool, - // otherwise a value from 0 to 255 (with 200 being the `normal maximum') -int skill_power_bl(struct block_list *bl, int skill); // Yields the power of a skill. This is zero if the skill is unknown or if it's a pool skill that is outside of the skill pool, - // otherwise a value from 0 to 255 (with 200 being the `normal maximum') +extern int skill_pool_skills[MAX_POOL_SKILLS]; // All pool skills +extern int skill_pool_skills_size; // Number of entries in skill_pool_skills + +int skill_pool (struct map_session_data *sd, int *skills); // Yields all active skills in the skill pool; no more than MAX_SKILL_POOL. Return is number of skills. +int skill_pool_size (struct map_session_data *sd); +int skill_pool_max (struct map_session_data *sd); // Max. number of pool skills +void skill_pool_empty (struct map_session_data *sd); // Deactivate all pool skills +int skill_pool_activate (struct map_session_data *sd, int skill); // Skill into skill pool. Return is zero iff okay. +int skill_pool_is_activated (struct map_session_data *sd, int skill); // Skill into skill pool. Return is zero when activated. +int skill_pool_deactivate (struct map_session_data *sd, int skill); // Skill out of skill pool. Return is zero iff okay. +char *skill_name (int skill); // Yield configurable skill name +int skill_stat (int skill); // Yields the stat associated with a skill. Returns zero if none, or SP_STR, SP_VIT, ... otherwise +int skill_power (struct map_session_data *sd, int skill); // Yields the power of a skill. This is zero if the skill is unknown or if it's a pool skill that is outside of the skill pool, + // otherwise a value from 0 to 255 (with 200 being the `normal maximum') +int skill_power_bl (struct block_list *bl, int skill); // Yields the power of a skill. This is zero if the skill is unknown or if it's a pool skill that is outside of the skill pool, + // otherwise a value from 0 to 255 (with 200 being the `normal maximum') #endif - diff --git a/src/map/storage.c b/src/map/storage.c index 25ecd90..e717ba2 100644 --- a/src/map/storage.c +++ b/src/map/storage.c @@ -26,725 +26,772 @@ static struct dbt *guild_storage_db; * 倉庫内アイテムソート *------------------------------------------ */ -int storage_comp_item(const void *_i1, const void *_i2) +int storage_comp_item (const void *_i1, const void *_i2) { - struct item *i1 = (struct item *)_i1; - struct item *i2 = (struct item *)_i2; + struct item *i1 = (struct item *) _i1; + struct item *i2 = (struct item *) _i2; - if (i1->nameid == i2->nameid) - return 0; - else if (!(i1->nameid) || !(i1->amount)) - return 1; - else if (!(i2->nameid) || !(i2->amount)) - return -1; - return i1->nameid - i2->nameid; + if (i1->nameid == i2->nameid) + return 0; + else if (!(i1->nameid) || !(i1->amount)) + return 1; + else if (!(i2->nameid) || !(i2->amount)) + return -1; + return i1->nameid - i2->nameid; } -static int guild_storage_db_final(void *key,void *data,va_list ap) +static int guild_storage_db_final (void *key, void *data, va_list ap) { - struct guild_storage *gstor=(struct guild_storage *) data; - free(gstor); - return 0; + struct guild_storage *gstor = (struct guild_storage *) data; + free (gstor); + return 0; } -static int storage_db_final(void *key,void *data,va_list ap) +static int storage_db_final (void *key, void *data, va_list ap) { - struct storage *stor=(struct storage *) data; - free(stor); - return 0; + struct storage *stor = (struct storage *) data; + free (stor); + return 0; } void sortage_sortitem (struct storage *stor) { - nullpo_retv(stor); - qsort(stor->storage_, MAX_STORAGE, sizeof(struct item), storage_comp_item); + nullpo_retv (stor); + qsort (stor->storage_, MAX_STORAGE, sizeof (struct item), + storage_comp_item); } -void sortage_gsortitem (struct guild_storage* gstor) +void sortage_gsortitem (struct guild_storage *gstor) { - nullpo_retv(gstor); - qsort(gstor->storage_, MAX_GUILD_STORAGE, sizeof(struct item), storage_comp_item); + nullpo_retv (gstor); + qsort (gstor->storage_, MAX_GUILD_STORAGE, sizeof (struct item), + storage_comp_item); } /*========================================== * 初期化とか *------------------------------------------ */ -int do_init_storage(void) // map.c::do_init()から呼ばれる +int do_init_storage (void) // map.c::do_init()から呼ばれる { - storage_db=numdb_init(); - guild_storage_db=numdb_init(); - return 1; + storage_db = numdb_init (); + guild_storage_db = numdb_init (); + return 1; } -void do_final_storage(void) // by [MC Cameri] + +void do_final_storage (void) // by [MC Cameri] { - if (storage_db) - numdb_final(storage_db,storage_db_final); - if (guild_storage_db) - numdb_final(guild_storage_db,guild_storage_db_final); + if (storage_db) + numdb_final (storage_db, storage_db_final); + if (guild_storage_db) + numdb_final (guild_storage_db, guild_storage_db_final); } - -static int storage_reconnect_sub(void *key,void *data,va_list ap) -{ //Parses storage and saves 'dirty' ones upon reconnect. [Skotlex] - int type = va_arg(ap, int); - if (type) - { //Guild Storage - struct guild_storage* stor = (struct guild_storage*) data; - if (stor->dirty && stor->storage_status == 0) //Save closed storages. - storage_guild_storagesave(0, stor->guild_id,0); - } - else - { //Account Storage - struct storage* stor = (struct storage*) data; - if (stor->dirty && stor->storage_status == 0) //Save closed storages. - storage_storage_save(stor->account_id,stor->dirty==2?1:0); - } - return 0; +static int storage_reconnect_sub (void *key, void *data, va_list ap) +{ //Parses storage and saves 'dirty' ones upon reconnect. [Skotlex] + int type = va_arg (ap, int); + if (type) + { //Guild Storage + struct guild_storage *stor = (struct guild_storage *) data; + if (stor->dirty && stor->storage_status == 0) //Save closed storages. + storage_guild_storagesave (0, stor->guild_id, 0); + } + else + { //Account Storage + struct storage *stor = (struct storage *) data; + if (stor->dirty && stor->storage_status == 0) //Save closed storages. + storage_storage_save (stor->account_id, stor->dirty == 2 ? 1 : 0); + } + return 0; } //Function to be invoked upon server reconnection to char. To save all 'dirty' storages [Skotlex -void do_reconnect_storage(void) +void do_reconnect_storage (void) { - numdb_foreach(storage_db, storage_reconnect_sub, 0); - numdb_foreach(guild_storage_db, storage_reconnect_sub, 1); + numdb_foreach (storage_db, storage_reconnect_sub, 0); + numdb_foreach (guild_storage_db, storage_reconnect_sub, 1); } -struct storage *account2storage(int account_id) +struct storage *account2storage (int account_id) { - struct storage *stor = (struct storage *) numdb_search (storage_db,account_id); - if(stor == NULL) { - stor = (struct storage *) aCallocA (sizeof(struct storage), 1); - stor->account_id = account_id; - numdb_insert(storage_db, stor->account_id, stor); - } - return stor; + struct storage *stor = + (struct storage *) numdb_search (storage_db, account_id); + if (stor == NULL) + { + stor = (struct storage *) aCallocA (sizeof (struct storage), 1); + stor->account_id = account_id; + numdb_insert (storage_db, stor->account_id, stor); + } + return stor; } // Just to ask storage, without creation -struct storage *account2storage2(int account_id) +struct storage *account2storage2 (int account_id) { - return (struct storage *) numdb_search(storage_db, account_id); + return (struct storage *) numdb_search (storage_db, account_id); } -int storage_delete(int account_id) +int storage_delete (int account_id) { - struct storage *stor = (struct storage *) numdb_search(storage_db,account_id); - if(stor) { - numdb_erase(storage_db,account_id); - free(stor); - } - return 0; + struct storage *stor = + (struct storage *) numdb_search (storage_db, account_id); + if (stor) + { + numdb_erase (storage_db, account_id); + free (stor); + } + return 0; } /*========================================== * カプラ倉庫を開く *------------------------------------------ */ -int storage_storageopen(struct map_session_data *sd) +int storage_storageopen (struct map_session_data *sd) { - struct storage *stor; - nullpo_retr(0, sd); + struct storage *stor; + nullpo_retr (0, sd); - if(sd->state.storage_flag) - return 1; //Already open? + if (sd->state.storage_flag) + return 1; //Already open? - if((stor = (struct storage *) numdb_search(storage_db,sd->status.account_id)) == NULL) - { //Request storage. - intif_request_storage(sd->status.account_id); - return 1; - } + if ((stor = + (struct storage *) numdb_search (storage_db, + sd->status.account_id)) == NULL) + { //Request storage. + intif_request_storage (sd->status.account_id); + return 1; + } - if (stor->storage_status) - return 1; //Already open/player already has it open... + if (stor->storage_status) + return 1; //Already open/player already has it open... - stor->storage_status = 1; - sd->state.storage_flag = 1; - clif_storageitemlist(sd,stor); - clif_storageequiplist(sd,stor); - clif_updatestorageamount(sd,stor); - return 0; + stor->storage_status = 1; + sd->state.storage_flag = 1; + clif_storageitemlist (sd, stor); + clif_storageequiplist (sd, stor); + clif_updatestorageamount (sd, stor); + return 0; } /*========================================== * Internal add-item function. *------------------------------------------ */ -static int storage_additem(struct map_session_data *sd,struct storage *stor,struct item *item_data,int amount) -{ - struct item_data *data; - int i; - - if(item_data->nameid <= 0 || amount <= 0) - return 1; - - data = itemdb_search(item_data->nameid); - - if(!itemdb_isequip2(data)){ //Stackable - for(i=0;i<MAX_STORAGE;i++){ - if( compare_item (&stor->storage_[i], item_data)) { - if(amount > MAX_AMOUNT - stor->storage_[i].amount) - return 1; - stor->storage_[i].amount+=amount; - clif_storageitemadded(sd,stor,i,amount); - stor->dirty = 1; - return 0; - } - } - } - //Add item - for(i=0;i<MAX_STORAGE && stor->storage_[i].nameid;i++); - - if(i>=MAX_STORAGE) - return 1; - - memcpy(&stor->storage_[i],item_data,sizeof(stor->storage_[0])); - stor->storage_[i].amount=amount; - stor->storage_amount++; - clif_storageitemadded(sd,stor,i,amount); - clif_updatestorageamount(sd,stor); - stor->dirty = 1; - return 0; +static int storage_additem (struct map_session_data *sd, struct storage *stor, + struct item *item_data, int amount) +{ + struct item_data *data; + int i; + + if (item_data->nameid <= 0 || amount <= 0) + return 1; + + data = itemdb_search (item_data->nameid); + + if (!itemdb_isequip2 (data)) + { //Stackable + for (i = 0; i < MAX_STORAGE; i++) + { + if (compare_item (&stor->storage_[i], item_data)) + { + if (amount > MAX_AMOUNT - stor->storage_[i].amount) + return 1; + stor->storage_[i].amount += amount; + clif_storageitemadded (sd, stor, i, amount); + stor->dirty = 1; + return 0; + } + } + } + //Add item + for (i = 0; i < MAX_STORAGE && stor->storage_[i].nameid; i++); + + if (i >= MAX_STORAGE) + return 1; + + memcpy (&stor->storage_[i], item_data, sizeof (stor->storage_[0])); + stor->storage_[i].amount = amount; + stor->storage_amount++; + clif_storageitemadded (sd, stor, i, amount); + clif_updatestorageamount (sd, stor); + stor->dirty = 1; + return 0; } + /*========================================== * Internal del-item function *------------------------------------------ */ -static int storage_delitem(struct map_session_data *sd,struct storage *stor,int n,int amount) +static int storage_delitem (struct map_session_data *sd, struct storage *stor, + int n, int amount) { - if(stor->storage_[n].nameid==0 || stor->storage_[n].amount<amount) - return 1; + if (stor->storage_[n].nameid == 0 || stor->storage_[n].amount < amount) + return 1; - stor->storage_[n].amount-=amount; - if(stor->storage_[n].amount==0){ - memset(&stor->storage_[n],0,sizeof(stor->storage_[0])); - stor->storage_amount--; - clif_updatestorageamount(sd,stor); - } - clif_storageitemremoved(sd,n,amount); + stor->storage_[n].amount -= amount; + if (stor->storage_[n].amount == 0) + { + memset (&stor->storage_[n], 0, sizeof (stor->storage_[0])); + stor->storage_amount--; + clif_updatestorageamount (sd, stor); + } + clif_storageitemremoved (sd, n, amount); - stor->dirty = 1; - return 0; + stor->dirty = 1; + return 0; } + /*========================================== * Add an item to the storage from the inventory. *------------------------------------------ */ -int storage_storageadd(struct map_session_data *sd,int index,int amount) +int storage_storageadd (struct map_session_data *sd, int index, int amount) { - struct storage *stor; + struct storage *stor; - nullpo_retr(0, sd); - nullpo_retr(0, stor=account2storage2(sd->status.account_id)); + nullpo_retr (0, sd); + nullpo_retr (0, stor = account2storage2 (sd->status.account_id)); - if((stor->storage_amount > MAX_STORAGE) || !stor->storage_status) - return 0; // storage full / storage closed + if ((stor->storage_amount > MAX_STORAGE) || !stor->storage_status) + return 0; // storage full / storage closed - if(index<0 || index>=MAX_INVENTORY) - return 0; + if (index < 0 || index >= MAX_INVENTORY) + return 0; - if(sd->status.inventory[index].nameid <= 0) - return 0; //No item on that spot + if (sd->status.inventory[index].nameid <= 0) + return 0; //No item on that spot - if(amount < 1 || amount > sd->status.inventory[index].amount) - return 0; + if (amount < 1 || amount > sd->status.inventory[index].amount) + return 0; -// log_tostorage(sd, index, 0); - if(storage_additem(sd,stor,&sd->status.inventory[index],amount)==0) { - // remove item from inventory - pc_unequipinvyitem(sd,index,1); - pc_delitem(sd,index,amount,0); - } +// log_tostorage(sd, index, 0); + if (storage_additem (sd, stor, &sd->status.inventory[index], amount) == 0) + { + // remove item from inventory + pc_unequipinvyitem (sd, index, 1); + pc_delitem (sd, index, amount, 0); + } - return 1; + return 1; } /*========================================== * Retrieve an item from the storage. *------------------------------------------ */ -int storage_storageget(struct map_session_data *sd,int index,int amount) +int storage_storageget (struct map_session_data *sd, int index, int amount) { - struct storage *stor; - int flag; - - nullpo_retr(0, sd); - nullpo_retr(0, stor=account2storage2(sd->status.account_id)); + struct storage *stor; + int flag; + nullpo_retr (0, sd); + nullpo_retr (0, stor = account2storage2 (sd->status.account_id)); - if(index<0 || index>=MAX_STORAGE) - return 0; + if (index < 0 || index >= MAX_STORAGE) + return 0; - if(stor->storage_[index].nameid <= 0) - return 0; //Nothing there + if (stor->storage_[index].nameid <= 0) + return 0; //Nothing there - if(amount < 1 || amount > stor->storage_[index].amount) - return 0; + if (amount < 1 || amount > stor->storage_[index].amount) + return 0; - if((flag = pc_additem(sd,&stor->storage_[index],amount)) == 0) - storage_delitem(sd,stor,index,amount); - else - clif_additem(sd,0,0,flag); -// log_fromstorage(sd, index, 0); - return 1; + if ((flag = pc_additem (sd, &stor->storage_[index], amount)) == 0) + storage_delitem (sd, stor, index, amount); + else + clif_additem (sd, 0, 0, flag); +// log_fromstorage(sd, index, 0); + return 1; } + /*========================================== * Move an item from cart to storage. *------------------------------------------ */ -int storage_storageaddfromcart(struct map_session_data *sd,int index,int amount) +int storage_storageaddfromcart (struct map_session_data *sd, int index, + int amount) { - struct storage *stor; + struct storage *stor; - nullpo_retr(0, sd); - nullpo_retr(0, stor=account2storage2(sd->status.account_id)); + nullpo_retr (0, sd); + nullpo_retr (0, stor = account2storage2 (sd->status.account_id)); - if(stor->storage_amount > MAX_STORAGE || !stor->storage_status) - return 0; // storage full / storage closed + if (stor->storage_amount > MAX_STORAGE || !stor->storage_status) + return 0; // storage full / storage closed - if(index< 0 || index>=MAX_CART) - return 0; + if (index < 0 || index >= MAX_CART) + return 0; - if(sd->status.cart[index].nameid <= 0) - return 0; //No item there. + if (sd->status.cart[index].nameid <= 0) + return 0; //No item there. - if(amount < 1 || amount > sd->status.cart[index].amount) - return 0; + if (amount < 1 || amount > sd->status.cart[index].amount) + return 0; - if(storage_additem(sd,stor,&sd->status.cart[index],amount)==0) - pc_cart_delitem(sd,index,amount,0); + if (storage_additem (sd, stor, &sd->status.cart[index], amount) == 0) + pc_cart_delitem (sd, index, amount, 0); - return 1; + return 1; } /*========================================== * Get from Storage to the Cart *------------------------------------------ */ -int storage_storagegettocart(struct map_session_data *sd,int index,int amount) +int storage_storagegettocart (struct map_session_data *sd, int index, + int amount) { - struct storage *stor; + struct storage *stor; - nullpo_retr(0, sd); - nullpo_retr(0, stor=account2storage2(sd->status.account_id)); + nullpo_retr (0, sd); + nullpo_retr (0, stor = account2storage2 (sd->status.account_id)); - if(!stor->storage_status) - return 0; + if (!stor->storage_status) + return 0; - if(index< 0 || index>=MAX_STORAGE) - return 0; + if (index < 0 || index >= MAX_STORAGE) + return 0; - if(stor->storage_[index].nameid <= 0) - return 0; //Nothing there. + if (stor->storage_[index].nameid <= 0) + return 0; //Nothing there. - if(amount < 1 || amount > stor->storage_[index].amount) - return 0; + if (amount < 1 || amount > stor->storage_[index].amount) + return 0; - if(pc_cart_additem(sd,&stor->storage_[index],amount)==0) - storage_delitem(sd,stor,index,amount); + if (pc_cart_additem (sd, &stor->storage_[index], amount) == 0) + storage_delitem (sd, stor, index, amount); - return 1; + return 1; } - /*========================================== * Modified By Valaris to save upon closing [massdriller] *------------------------------------------ */ -int storage_storageclose(struct map_session_data *sd) +int storage_storageclose (struct map_session_data *sd) { - struct storage *stor; + struct storage *stor; - nullpo_retr(0, sd); - nullpo_retr(0, stor=account2storage2(sd->status.account_id)); + nullpo_retr (0, sd); + nullpo_retr (0, stor = account2storage2 (sd->status.account_id)); - clif_storageclose(sd); - if (stor->storage_status) - { - if (save_settings&4) - chrif_save(sd); //Invokes the storage saving as well. - else - storage_storage_save(sd->status.account_id, 0); - } - stor->storage_status=0; - sd->state.storage_flag=0; + clif_storageclose (sd); + if (stor->storage_status) + { + if (save_settings & 4) + chrif_save (sd); //Invokes the storage saving as well. + else + storage_storage_save (sd->status.account_id, 0); + } + stor->storage_status = 0; + sd->state.storage_flag = 0; - if (sd->npc_flags.storage) { - sd->npc_flags.storage = 0; - map_scriptcont(sd, sd->npc_id); - } + if (sd->npc_flags.storage) + { + sd->npc_flags.storage = 0; + map_scriptcont (sd, sd->npc_id); + } - return 0; + return 0; } /*========================================== * When quitting the game. *------------------------------------------ */ -int storage_storage_quit(struct map_session_data *sd) +int storage_storage_quit (struct map_session_data *sd) { - struct storage *stor; + struct storage *stor; - nullpo_retr(0, sd); + nullpo_retr (0, sd); - stor = account2storage2(sd->status.account_id); - if(stor) { - chrif_save(sd); //Invokes the storage saving as well. - stor->storage_status = 0; - sd->state.storage_flag = 0; - } + stor = account2storage2 (sd->status.account_id); + if (stor) + { + chrif_save (sd); //Invokes the storage saving as well. + stor->storage_status = 0; + sd->state.storage_flag = 0; + } - return 0; + return 0; } -void storage_storage_dirty(struct map_session_data *sd) +void storage_storage_dirty (struct map_session_data *sd) { - struct storage *stor; + struct storage *stor; - stor=account2storage2(sd->status.account_id); + stor = account2storage2 (sd->status.account_id); - if(stor) - stor->dirty = 1; + if (stor) + stor->dirty = 1; } -int storage_storage_save(int account_id, int final) +int storage_storage_save (int account_id, int final) { - struct storage *stor; + struct storage *stor; - stor=account2storage2(account_id); - if(!stor) return 0; + stor = account2storage2 (account_id); + if (!stor) + return 0; - if(stor->dirty) - { - if (final) { - stor->dirty = 2; - stor->storage_status = 0; //To prevent further manipulation of it. - } - intif_send_storage(stor); - return 1; - } - if (final) - { //Clear storage from memory. Nothing to save. - storage_delete(account_id); - return 1; - } + if (stor->dirty) + { + if (final) + { + stor->dirty = 2; + stor->storage_status = 0; //To prevent further manipulation of it. + } + intif_send_storage (stor); + return 1; + } + if (final) + { //Clear storage from memory. Nothing to save. + storage_delete (account_id); + return 1; + } - return 0; + return 0; } //Ack from Char-server indicating the storage was saved. [Skotlex] -int storage_storage_saved(int account_id) -{ - struct storage *stor; - - if((stor=account2storage2(account_id)) != NULL) - { //Only mark it clean if it's not in use. [Skotlex] - if (stor->dirty && stor->storage_status == 0) - { - stor->dirty = 0; - sortage_sortitem(stor); - } - return 1; - } - return 0; -} - -struct guild_storage *guild2storage(int guild_id) -{ - struct guild_storage *gs = NULL; - if(guild_search(guild_id) != NULL) { - gs=(struct guild_storage *) numdb_search(guild_storage_db,guild_id); - if(gs == NULL) { - gs = (struct guild_storage *) aCallocA(sizeof(struct guild_storage), 1); - if(gs==NULL){ - printf("storage: out of memory!\n"); - exit(0); - } - gs->guild_id=guild_id; - numdb_insert(guild_storage_db,gs->guild_id,gs); - } - } - return gs; -} - -struct guild_storage *guild2storage2(int guild_id) -{ //For just locating a storage without creating one. [Skotlex] - return (struct guild_storage *) numdb_search(guild_storage_db,guild_id); -} - -int guild_storage_delete(int guild_id) -{ - struct guild_storage *gstor = (struct guild_storage *) numdb_search(guild_storage_db,guild_id); - if(gstor) { - numdb_erase(guild_storage_db,guild_id); - free(gstor); - } - return 0; -} - -int storage_guild_storageopen(struct map_session_data *sd) -{ - struct guild_storage *gstor; - - nullpo_retr(0, sd); - - if(sd->status.guild_id <= 0) - return 2; - - if(sd->state.storage_flag) - return 1; //Can't open both storages at a time. - - if((gstor = guild2storage2(sd->status.guild_id)) == NULL) { - intif_request_guild_storage(sd->status.account_id,sd->status.guild_id); - return 0; - } - if(gstor->storage_status) - return 1; - - gstor->storage_status = 1; - sd->state.storage_flag = 2; - clif_guildstorageitemlist(sd,gstor); - clif_guildstorageequiplist(sd,gstor); - clif_updateguildstorageamount(sd,gstor); - return 0; -} - -int guild_storage_additem(struct map_session_data *sd,struct guild_storage *stor,struct item *item_data,int amount) -{ - struct item_data *data; - int i; - - nullpo_retr(1, sd); - nullpo_retr(1, stor); - nullpo_retr(1, item_data); - nullpo_retr(1, data = itemdb_search(item_data->nameid)); +int storage_storage_saved (int account_id) +{ + struct storage *stor; + + if ((stor = account2storage2 (account_id)) != NULL) + { //Only mark it clean if it's not in use. [Skotlex] + if (stor->dirty && stor->storage_status == 0) + { + stor->dirty = 0; + sortage_sortitem (stor); + } + return 1; + } + return 0; +} + +struct guild_storage *guild2storage (int guild_id) +{ + struct guild_storage *gs = NULL; + if (guild_search (guild_id) != NULL) + { + gs = (struct guild_storage *) numdb_search (guild_storage_db, + guild_id); + if (gs == NULL) + { + gs = (struct guild_storage *) + aCallocA (sizeof (struct guild_storage), 1); + if (gs == NULL) + { + printf ("storage: out of memory!\n"); + exit (0); + } + gs->guild_id = guild_id; + numdb_insert (guild_storage_db, gs->guild_id, gs); + } + } + return gs; +} + +struct guild_storage *guild2storage2 (int guild_id) +{ //For just locating a storage without creating one. [Skotlex] + return (struct guild_storage *) numdb_search (guild_storage_db, guild_id); +} + +int guild_storage_delete (int guild_id) +{ + struct guild_storage *gstor = + (struct guild_storage *) numdb_search (guild_storage_db, guild_id); + if (gstor) + { + numdb_erase (guild_storage_db, guild_id); + free (gstor); + } + return 0; +} + +int storage_guild_storageopen (struct map_session_data *sd) +{ + struct guild_storage *gstor; + + nullpo_retr (0, sd); + + if (sd->status.guild_id <= 0) + return 2; + + if (sd->state.storage_flag) + return 1; //Can't open both storages at a time. + + if ((gstor = guild2storage2 (sd->status.guild_id)) == NULL) + { + intif_request_guild_storage (sd->status.account_id, + sd->status.guild_id); + return 0; + } + if (gstor->storage_status) + return 1; + + gstor->storage_status = 1; + sd->state.storage_flag = 2; + clif_guildstorageitemlist (sd, gstor); + clif_guildstorageequiplist (sd, gstor); + clif_updateguildstorageamount (sd, gstor); + return 0; +} + +int guild_storage_additem (struct map_session_data *sd, + struct guild_storage *stor, struct item *item_data, + int amount) +{ + struct item_data *data; + int i; + + nullpo_retr (1, sd); + nullpo_retr (1, stor); + nullpo_retr (1, item_data); + nullpo_retr (1, data = itemdb_search (item_data->nameid)); - if(item_data->nameid <= 0 || amount <= 0) - return 1; + if (item_data->nameid <= 0 || amount <= 0) + return 1; - if(!itemdb_isequip2(data)){ //Stackable - for(i=0;i<MAX_GUILD_STORAGE;i++){ - if(compare_item(&stor->storage_[i], item_data)) { - if(stor->storage_[i].amount+amount > MAX_AMOUNT) - return 1; - stor->storage_[i].amount+=amount; - clif_guildstorageitemadded(sd,stor,i,amount); - stor->dirty = 1; - return 0; - } - } - } - //Add item - for(i=0;i<MAX_GUILD_STORAGE && stor->storage_[i].nameid;i++); + if (!itemdb_isequip2 (data)) + { //Stackable + for (i = 0; i < MAX_GUILD_STORAGE; i++) + { + if (compare_item (&stor->storage_[i], item_data)) + { + if (stor->storage_[i].amount + amount > MAX_AMOUNT) + return 1; + stor->storage_[i].amount += amount; + clif_guildstorageitemadded (sd, stor, i, amount); + stor->dirty = 1; + return 0; + } + } + } + //Add item + for (i = 0; i < MAX_GUILD_STORAGE && stor->storage_[i].nameid; i++); - if(i>=MAX_GUILD_STORAGE) - return 1; + if (i >= MAX_GUILD_STORAGE) + return 1; - memcpy(&stor->storage_[i],item_data,sizeof(stor->storage_[0])); - stor->storage_[i].amount=amount; - stor->storage_amount++; - clif_guildstorageitemadded(sd,stor,i,amount); - clif_updateguildstorageamount(sd,stor); - stor->dirty = 1; - return 0; + memcpy (&stor->storage_[i], item_data, sizeof (stor->storage_[0])); + stor->storage_[i].amount = amount; + stor->storage_amount++; + clif_guildstorageitemadded (sd, stor, i, amount); + clif_updateguildstorageamount (sd, stor); + stor->dirty = 1; + return 0; } -int guild_storage_delitem(struct map_session_data *sd,struct guild_storage *stor,int n,int amount) +int guild_storage_delitem (struct map_session_data *sd, + struct guild_storage *stor, int n, int amount) { - nullpo_retr(1, sd); - nullpo_retr(1, stor); + nullpo_retr (1, sd); + nullpo_retr (1, stor); - if(stor->storage_[n].nameid==0 || stor->storage_[n].amount<amount) - return 1; + if (stor->storage_[n].nameid == 0 || stor->storage_[n].amount < amount) + return 1; - stor->storage_[n].amount-=amount; - if(stor->storage_[n].amount==0){ - memset(&stor->storage_[n],0,sizeof(stor->storage_[0])); - stor->storage_amount--; - clif_updateguildstorageamount(sd,stor); - } - clif_storageitemremoved(sd,n,amount); - stor->dirty = 1; - return 0; + stor->storage_[n].amount -= amount; + if (stor->storage_[n].amount == 0) + { + memset (&stor->storage_[n], 0, sizeof (stor->storage_[0])); + stor->storage_amount--; + clif_updateguildstorageamount (sd, stor); + } + clif_storageitemremoved (sd, n, amount); + stor->dirty = 1; + return 0; } -int storage_guild_storageadd(struct map_session_data *sd,int index,int amount) +int storage_guild_storageadd (struct map_session_data *sd, int index, + int amount) { - struct guild_storage *stor; + struct guild_storage *stor; - nullpo_retr(0, sd); - nullpo_retr(0, stor=guild2storage2(sd->status.guild_id)); + nullpo_retr (0, sd); + nullpo_retr (0, stor = guild2storage2 (sd->status.guild_id)); - if (!stor->storage_status || stor->storage_amount > MAX_GUILD_STORAGE) - return 0; + if (!stor->storage_status || stor->storage_amount > MAX_GUILD_STORAGE) + return 0; - if(index<0 || index>=MAX_INVENTORY) - return 0; + if (index < 0 || index >= MAX_INVENTORY) + return 0; - if(sd->status.inventory[index].nameid <= 0) - return 0; + if (sd->status.inventory[index].nameid <= 0) + return 0; - if(amount < 1 || amount > sd->status.inventory[index].amount) - return 0; + if (amount < 1 || amount > sd->status.inventory[index].amount) + return 0; -// log_tostorage(sd, index, 1); - if(guild_storage_additem(sd,stor,&sd->status.inventory[index],amount)==0) - pc_delitem(sd,index,amount,0); +// log_tostorage(sd, index, 1); + if (guild_storage_additem (sd, stor, &sd->status.inventory[index], amount) + == 0) + pc_delitem (sd, index, amount, 0); - return 1; + return 1; } -int storage_guild_storageget(struct map_session_data *sd,int index,int amount) +int storage_guild_storageget (struct map_session_data *sd, int index, + int amount) { - struct guild_storage *stor; - int flag; + struct guild_storage *stor; + int flag; - nullpo_retr(0, sd); - nullpo_retr(0, stor=guild2storage2(sd->status.guild_id)); + nullpo_retr (0, sd); + nullpo_retr (0, stor = guild2storage2 (sd->status.guild_id)); - if(!stor->storage_status) - return 0; + if (!stor->storage_status) + return 0; - if(index<0 || index>=MAX_GUILD_STORAGE) - return 0; + if (index < 0 || index >= MAX_GUILD_STORAGE) + return 0; - if(stor->storage_[index].nameid <= 0) - return 0; + if (stor->storage_[index].nameid <= 0) + return 0; - if(amount < 1 || amount > stor->storage_[index].amount) - return 0; + if (amount < 1 || amount > stor->storage_[index].amount) + return 0; - if((flag = pc_additem(sd,&stor->storage_[index],amount)) == 0) - guild_storage_delitem(sd,stor,index,amount); - else - clif_additem(sd,0,0,flag); -// log_fromstorage(sd, index, 1); + if ((flag = pc_additem (sd, &stor->storage_[index], amount)) == 0) + guild_storage_delitem (sd, stor, index, amount); + else + clif_additem (sd, 0, 0, flag); +// log_fromstorage(sd, index, 1); - return 0; + return 0; } -int storage_guild_storageaddfromcart(struct map_session_data *sd,int index,int amount) +int storage_guild_storageaddfromcart (struct map_session_data *sd, int index, + int amount) { - struct guild_storage *stor; + struct guild_storage *stor; - nullpo_retr(0, sd); - nullpo_retr(0, stor=guild2storage2(sd->status.guild_id)); + nullpo_retr (0, sd); + nullpo_retr (0, stor = guild2storage2 (sd->status.guild_id)); - if(!stor->storage_status || stor->storage_amount > MAX_GUILD_STORAGE) - return 0; + if (!stor->storage_status || stor->storage_amount > MAX_GUILD_STORAGE) + return 0; - if(index<0 || index>=MAX_CART) - return 0; + if (index < 0 || index >= MAX_CART) + return 0; - if(sd->status.cart[index].nameid <= 0) - return 0; + if (sd->status.cart[index].nameid <= 0) + return 0; - if(amount < 1 || amount > sd->status.cart[index].amount) - return 0; + if (amount < 1 || amount > sd->status.cart[index].amount) + return 0; - if(guild_storage_additem(sd,stor,&sd->status.cart[index],amount)==0) - pc_cart_delitem(sd,index,amount,0); + if (guild_storage_additem (sd, stor, &sd->status.cart[index], amount) == + 0) + pc_cart_delitem (sd, index, amount, 0); - return 1; + return 1; } -int storage_guild_storagegettocart(struct map_session_data *sd,int index,int amount) +int storage_guild_storagegettocart (struct map_session_data *sd, int index, + int amount) { - struct guild_storage *stor; + struct guild_storage *stor; - nullpo_retr(0, sd); - nullpo_retr(0, stor=guild2storage2(sd->status.guild_id)); + nullpo_retr (0, sd); + nullpo_retr (0, stor = guild2storage2 (sd->status.guild_id)); - if(!stor->storage_status) - return 0; + if (!stor->storage_status) + return 0; - if(index<0 || index>=MAX_GUILD_STORAGE) - return 0; + if (index < 0 || index >= MAX_GUILD_STORAGE) + return 0; - if(stor->storage_[index].nameid<=0) - return 0; + if (stor->storage_[index].nameid <= 0) + return 0; - if(amount < 1 || amount > stor->storage_[index].amount) - return 0; + if (amount < 1 || amount > stor->storage_[index].amount) + return 0; - if(pc_cart_additem(sd,&stor->storage_[index],amount)==0) - guild_storage_delitem(sd,stor,index,amount); + if (pc_cart_additem (sd, &stor->storage_[index], amount) == 0) + guild_storage_delitem (sd, stor, index, amount); - return 1; + return 1; } -int storage_guild_storagesave(int account_id, int guild_id, int flag) +int storage_guild_storagesave (int account_id, int guild_id, int flag) { - struct guild_storage *stor = guild2storage2(guild_id); + struct guild_storage *stor = guild2storage2 (guild_id); - if(stor) - { - if (flag) //Char quitting, close it. - stor->storage_status = 0; - if (stor->dirty) - intif_send_guild_storage(account_id,stor); - return 1; - } - return 0; + if (stor) + { + if (flag) //Char quitting, close it. + stor->storage_status = 0; + if (stor->dirty) + intif_send_guild_storage (account_id, stor); + return 1; + } + return 0; } -int storage_guild_storagesaved(int guild_id) +int storage_guild_storagesaved (int guild_id) { - struct guild_storage *stor; + struct guild_storage *stor; - if((stor=guild2storage2(guild_id)) != NULL) { - if (stor->dirty && stor->storage_status == 0) - { //Storage has been correctly saved. - stor->dirty = 0; - sortage_gsortitem(stor); - } - return 1; - } - return 0; + if ((stor = guild2storage2 (guild_id)) != NULL) + { + if (stor->dirty && stor->storage_status == 0) + { //Storage has been correctly saved. + stor->dirty = 0; + sortage_gsortitem (stor); + } + return 1; + } + return 0; } -int storage_guild_storageclose(struct map_session_data *sd) +int storage_guild_storageclose (struct map_session_data *sd) { - struct guild_storage *stor; + struct guild_storage *stor; - nullpo_retr(0, sd); - nullpo_retr(0, stor=guild2storage2(sd->status.guild_id)); + nullpo_retr (0, sd); + nullpo_retr (0, stor = guild2storage2 (sd->status.guild_id)); - clif_storageclose(sd); - chrif_save(sd); //This one also saves the storage. [Skotlex] + clif_storageclose (sd); + chrif_save (sd); //This one also saves the storage. [Skotlex] - stor->storage_status=0; - sd->state.storage_flag = 0; + stor->storage_status = 0; + sd->state.storage_flag = 0; - return 0; + return 0; } -int storage_guild_storage_quit(struct map_session_data *sd,int flag) +int storage_guild_storage_quit (struct map_session_data *sd, int flag) { - struct guild_storage *stor; + struct guild_storage *stor; - nullpo_retr(0, sd); - nullpo_retr(0, stor=guild2storage2(sd->status.guild_id)); + nullpo_retr (0, sd); + nullpo_retr (0, stor = guild2storage2 (sd->status.guild_id)); - if(flag) - { //Only during a guild break flag is 1 (don't save storage) - sd->state.storage_flag = 0; - stor->storage_status = 0; - clif_storageclose(sd); - if (save_settings&4) - chrif_save(sd); - return 0; - } + if (flag) + { //Only during a guild break flag is 1 (don't save storage) + sd->state.storage_flag = 0; + stor->storage_status = 0; + clif_storageclose (sd); + if (save_settings & 4) + chrif_save (sd); + return 0; + } - if(stor->storage_status) { - if (save_settings&4) - chrif_save(sd); - else - storage_guild_storagesave(sd->status.account_id,sd->status.guild_id,1); - } - sd->state.storage_flag = 0; - stor->storage_status = 0; + if (stor->storage_status) + { + if (save_settings & 4) + chrif_save (sd); + else + storage_guild_storagesave (sd->status.account_id, + sd->status.guild_id, 1); + } + sd->state.storage_flag = 0; + stor->storage_status = 0; - return 0; + return 0; } diff --git a/src/map/storage.h b/src/map/storage.h index cc93f86..daaec2c 100644 --- a/src/map/storage.h +++ b/src/map/storage.h @@ -6,40 +6,49 @@ #include "../common/mmo.h" -int storage_storageopen(struct map_session_data *sd); -int storage_storageadd(struct map_session_data *sd,int index,int amount); -int storage_storageget(struct map_session_data *sd,int index,int amount); -int storage_storageaddfromcart(struct map_session_data *sd,int index,int amount); -int storage_storagegettocart(struct map_session_data *sd,int index,int amount); -int storage_storageclose(struct map_session_data *sd); -int do_init_storage(void); -void do_final_storage(void); -void do_reconnect_storage(void); -struct storage *account2storage(int account_id); -struct storage *account2storage2(int account_id); -int storage_delete(int account_id); -int storage_storage_quit(struct map_session_data *sd); -int storage_storage_save(int account_id, int final); -int storage_storage_saved(int account_id); //Ack from char server that guild store was saved. -void storage_storage_dirty(struct map_session_data *sd); +int storage_storageopen (struct map_session_data *sd); +int storage_storageadd (struct map_session_data *sd, int index, int amount); +int storage_storageget (struct map_session_data *sd, int index, int amount); +int storage_storageaddfromcart (struct map_session_data *sd, int index, + int amount); +int storage_storagegettocart (struct map_session_data *sd, int index, + int amount); +int storage_storageclose (struct map_session_data *sd); +int do_init_storage (void); +void do_final_storage (void); +void do_reconnect_storage (void); +struct storage *account2storage (int account_id); +struct storage *account2storage2 (int account_id); +int storage_delete (int account_id); +int storage_storage_quit (struct map_session_data *sd); +int storage_storage_save (int account_id, int final); +int storage_storage_saved (int account_id); //Ack from char server that guild store was saved. +void storage_storage_dirty (struct map_session_data *sd); -struct guild_storage *guild2storage(int guild_id); -int guild_storage_delete(int guild_id); -int storage_guild_storageopen(struct map_session_data *sd); -int guild_storage_additem(struct map_session_data *sd,struct guild_storage *stor,struct item *item_data,int amount); -int guild_storage_delitem(struct map_session_data *sd,struct guild_storage *stor,int n,int amount); -int storage_guild_storageadd(struct map_session_data *sd,int index,int amount); -int storage_guild_storageget(struct map_session_data *sd,int index,int amount); -int storage_guild_storageaddfromcart(struct map_session_data *sd,int index,int amount); -int storage_guild_storagegettocart(struct map_session_data *sd,int index,int amount); -int storage_guild_storageclose(struct map_session_data *sd); -int storage_guild_storage_quit(struct map_session_data *sd,int flag); -int storage_guild_storagesave(int account_id, int guild_id, int flag); -int storage_guild_storagesaved(int guild_id); //Ack from char server that guild store was saved. +struct guild_storage *guild2storage (int guild_id); +int guild_storage_delete (int guild_id); +int storage_guild_storageopen (struct map_session_data *sd); +int guild_storage_additem (struct map_session_data *sd, + struct guild_storage *stor, + struct item *item_data, int amount); +int guild_storage_delitem (struct map_session_data *sd, + struct guild_storage *stor, int n, int amount); +int storage_guild_storageadd (struct map_session_data *sd, int index, + int amount); +int storage_guild_storageget (struct map_session_data *sd, int index, + int amount); +int storage_guild_storageaddfromcart (struct map_session_data *sd, int index, + int amount); +int storage_guild_storagegettocart (struct map_session_data *sd, int index, + int amount); +int storage_guild_storageclose (struct map_session_data *sd); +int storage_guild_storage_quit (struct map_session_data *sd, int flag); +int storage_guild_storagesave (int account_id, int guild_id, int flag); +int storage_guild_storagesaved (int guild_id); //Ack from char server that guild store was saved. -int storage_comp_item(const void *_i1, const void *_i2); +int storage_comp_item (const void *_i1, const void *_i2); //int storage_comp_item(const struct item* i1, const struct item* i2); -void sortage_sortitem(struct storage* stor); -void sortage_gsortitem(struct guild_storage* gstor); +void sortage_sortitem (struct storage *stor); +void sortage_gsortitem (struct guild_storage *gstor); #endif diff --git a/src/map/tmw.c b/src/map/tmw.c index a19eb26..2849983 100644 --- a/src/map/tmw.c +++ b/src/map/tmw.c @@ -4,7 +4,6 @@ #include <ctype.h> #include <stdarg.h> - #include "tmw.h" #include "socket.h" @@ -32,176 +31,222 @@ #include "storage.h" #include "trade.h" -int tmw_CheckChatSpam(struct map_session_data *sd, char* message) { - nullpo_retr(1, sd); - time_t now = time(NULL); - - if (pc_isGM(sd)) return 0; - - if (now > sd->chat_reset_due) { - sd->chat_reset_due = now + battle_config.chat_spam_threshold; - sd->chat_lines_in = 0; - } - - if (now > sd->chat_repeat_reset_due) { - sd->chat_repeat_reset_due = now + (battle_config.chat_spam_threshold * 60); - sd->chat_total_repeats = 0; - } - - sd->chat_lines_in++; - - // Penalty for repeats. - if (strncmp(sd->chat_lastmsg, message, tmw_ShorterStrlen(sd->chat_lastmsg, message)) == 0) { - sd->chat_lines_in += battle_config.chat_lame_penalty; - sd->chat_total_repeats++; - } - else { - sd->chat_total_repeats=0; - } - - // Penalty for lame, it can stack on top of the repeat penalty. - if (tmw_CheckChatLameness(sd, message)) - sd->chat_lines_in += battle_config.chat_lame_penalty; - - strncpy((char*)sd->chat_lastmsg, message, battle_config.chat_maxline); - - if (sd->chat_lines_in >= battle_config.chat_spam_flood || sd->chat_total_repeats >= battle_config.chat_spam_flood) { - sd->chat_lines_in = sd->chat_total_repeats = 0; - - if (battle_config.chat_spam_ban > 0 && !sd->auto_ban_info.in_progress) { - tmw_GmHackMsg("%s has been autobanned for chat spam", sd->status.name); - gm_log("server(0,0) Server : @autoban %s %dh (chat spam)", sd->status.name, battle_config.chat_spam_ban); - - sd->auto_ban_info.in_progress = 1; - - clif_displaymessage(sd->fd, "You have been banned for spamming. Please do not spam."); - chrif_char_ask_name(-1, sd->status.name, 2, 0, 0, 0, battle_config.chat_spam_ban, 0, 0); // type: 2 - ban (year, month, day, hour, minute, second) - clif_setwaitclose(sd->fd); - } - - return 1; - } - - if (battle_config.chat_spam_ban && - (sd->chat_lines_in >= battle_config.chat_spam_warn || sd->chat_total_repeats >= battle_config.chat_spam_warn)) { - clif_displaymessage(sd->fd, "WARNING : You are about to be automaticly banned for spam!"); - clif_displaymessage(sd->fd, "WARNING : Please slow down, do not repeat, and do not SHOUT!"); - } - - return 0; +int tmw_CheckChatSpam (struct map_session_data *sd, char *message) +{ + nullpo_retr (1, sd); + time_t now = time (NULL); + + if (pc_isGM (sd)) + return 0; + + if (now > sd->chat_reset_due) + { + sd->chat_reset_due = now + battle_config.chat_spam_threshold; + sd->chat_lines_in = 0; + } + + if (now > sd->chat_repeat_reset_due) + { + sd->chat_repeat_reset_due = + now + (battle_config.chat_spam_threshold * 60); + sd->chat_total_repeats = 0; + } + + sd->chat_lines_in++; + + // Penalty for repeats. + if (strncmp + (sd->chat_lastmsg, message, + tmw_ShorterStrlen (sd->chat_lastmsg, message)) == 0) + { + sd->chat_lines_in += battle_config.chat_lame_penalty; + sd->chat_total_repeats++; + } + else + { + sd->chat_total_repeats = 0; + } + + // Penalty for lame, it can stack on top of the repeat penalty. + if (tmw_CheckChatLameness (sd, message)) + sd->chat_lines_in += battle_config.chat_lame_penalty; + + strncpy ((char *) sd->chat_lastmsg, message, battle_config.chat_maxline); + + if (sd->chat_lines_in >= battle_config.chat_spam_flood + || sd->chat_total_repeats >= battle_config.chat_spam_flood) + { + sd->chat_lines_in = sd->chat_total_repeats = 0; + + if (battle_config.chat_spam_ban > 0 && !sd->auto_ban_info.in_progress) + { + tmw_GmHackMsg ("%s has been autobanned for chat spam", + sd->status.name); + gm_log ("server(0,0) Server : @autoban %s %dh (chat spam)", + sd->status.name, battle_config.chat_spam_ban); + + sd->auto_ban_info.in_progress = 1; + + clif_displaymessage (sd->fd, + "You have been banned for spamming. Please do not spam."); + chrif_char_ask_name (-1, sd->status.name, 2, 0, 0, 0, battle_config.chat_spam_ban, 0, 0); // type: 2 - ban (year, month, day, hour, minute, second) + clif_setwaitclose (sd->fd); + } + + return 1; + } + + if (battle_config.chat_spam_ban && + (sd->chat_lines_in >= battle_config.chat_spam_warn + || sd->chat_total_repeats >= battle_config.chat_spam_warn)) + { + clif_displaymessage (sd->fd, + "WARNING : You are about to be automaticly banned for spam!"); + clif_displaymessage (sd->fd, + "WARNING : Please slow down, do not repeat, and do not SHOUT!"); + } + + return 0; } // Compares the length of two strings and returns that of the shorter -int tmw_ShorterStrlen(char *s1, char *s2) { - int s1_len = strlen(s1); - int s2_len = strlen(s2); - return(s2_len >= s1_len ? s1_len : s2_len); +int tmw_ShorterStrlen (char *s1, char *s2) +{ + int s1_len = strlen (s1); + int s2_len = strlen (s2); + return (s2_len >= s1_len ? s1_len : s2_len); } // Returns true if more than 50% of input message is caps or punctuation -int tmw_CheckChatLameness(struct map_session_data *sd, char *message) +int tmw_CheckChatLameness (struct map_session_data *sd, char *message) { - int count, lame; + int count, lame; - // Ignore the name - message += strlen(sd->status.name); + // Ignore the name + message += strlen (sd->status.name); - for(count = lame = 0; *message; message++,count++) - if (isupper(*message) || ispunct(*message)) - lame++; + for (count = lame = 0; *message; message++, count++) + if (isupper (*message) || ispunct (*message)) + lame++; - if (count > 7 && lame > count / 2) - return(1); + if (count > 7 && lame > count / 2) + return (1); - return(0); + return (0); } // Sends a whisper to all GMs -void tmw_GmHackMsg(const char *fmt, ...) { - char buf[512]; - va_list ap; +void tmw_GmHackMsg (const char *fmt, ...) +{ + char buf[512]; + va_list ap; - va_start(ap, fmt); - vsnprintf(buf, 511, fmt, ap); - va_end(ap); + va_start (ap, fmt); + vsnprintf (buf, 511, fmt, ap); + va_end (ap); - char outbuf[512+5]; - strcat(outbuf, "[GM] "); - strcat(outbuf, buf); + char outbuf[512 + 5]; + strcat (outbuf, "[GM] "); + strcat (outbuf, buf); - intif_wis_message_to_gm(wisp_server_name, battle_config.hack_info_GM_level, outbuf, strlen(outbuf) + 1); + intif_wis_message_to_gm (wisp_server_name, + battle_config.hack_info_GM_level, outbuf, + strlen (outbuf) + 1); } -int tmw_CheckTradeSpam(struct map_session_data *sd) { - nullpo_retr(1, sd); - time_t now = time(NULL); - - if (pc_isGM(sd)) return 0; - - if (now > sd->trade_reset_due) { - sd->trade_reset_due = now + battle_config.trade_spam_threshold; - sd->trades_in = 0; - } - - sd->trades_in++; - - if (sd->trades_in >= battle_config.trade_spam_flood) { - sd->trades_in = 0; - - if (battle_config.trade_spam_ban > 0 && !sd->auto_ban_info.in_progress) { - tmw_GmHackMsg("%s has been autobanned for trade spam", sd->status.name); - gm_log("server(0,0) Server : @autoban %s %dh (trade spam)", sd->status.name, battle_config.trade_spam_ban); - - sd->auto_ban_info.in_progress = 1; - - clif_displaymessage(sd->fd, "You have been banned for trade spamming. Please do not trade spam."); - chrif_char_ask_name(-1, sd->status.name, 2, 0, 0, 0, battle_config.trade_spam_ban, 0, 0); // type: 2 - ban (year, month, day, hour, minute, second) - clif_setwaitclose(sd->fd); - } - - return 1; - } - - if (battle_config.trade_spam_ban && sd->trades_in >= battle_config.trade_spam_warn) { - clif_displaymessage(sd->fd, "WARNING : You are about to be automaticly banned for trade spam!"); - } - - return 0; +int tmw_CheckTradeSpam (struct map_session_data *sd) +{ + nullpo_retr (1, sd); + time_t now = time (NULL); + + if (pc_isGM (sd)) + return 0; + + if (now > sd->trade_reset_due) + { + sd->trade_reset_due = now + battle_config.trade_spam_threshold; + sd->trades_in = 0; + } + + sd->trades_in++; + + if (sd->trades_in >= battle_config.trade_spam_flood) + { + sd->trades_in = 0; + + if (battle_config.trade_spam_ban > 0 + && !sd->auto_ban_info.in_progress) + { + tmw_GmHackMsg ("%s has been autobanned for trade spam", + sd->status.name); + gm_log ("server(0,0) Server : @autoban %s %dh (trade spam)", + sd->status.name, battle_config.trade_spam_ban); + + sd->auto_ban_info.in_progress = 1; + + clif_displaymessage (sd->fd, + "You have been banned for trade spamming. Please do not trade spam."); + chrif_char_ask_name (-1, sd->status.name, 2, 0, 0, 0, battle_config.trade_spam_ban, 0, 0); // type: 2 - ban (year, month, day, hour, minute, second) + clif_setwaitclose (sd->fd); + } + + return 1; + } + + if (battle_config.trade_spam_ban + && sd->trades_in >= battle_config.trade_spam_warn) + { + clif_displaymessage (sd->fd, + "WARNING : You are about to be automaticly banned for trade spam!"); + } + + return 0; } -int tmw_CheckSitSpam(struct map_session_data *sd) { - nullpo_retr(1, sd); - time_t now = time(NULL); - - if (pc_isGM(sd)) return 0; - - if (now > sd->sit_reset_due) { - sd->sit_reset_due = now + battle_config.sit_spam_threshold; - sd->sits_in = 0; - } - - sd->sits_in++; - - if (sd->sits_in >= battle_config.sit_spam_flood) { - sd->sits_in = 0; - - if (battle_config.sit_spam_ban > 0 && !sd->auto_ban_info.in_progress) { - tmw_GmHackMsg("%s has been autobanned for sit spam", sd->status.name); - gm_log("server(0,0) Server : @autoban %s %dh (sit spam)", sd->status.name, battle_config.sit_spam_ban); - - sd->auto_ban_info.in_progress = 1; - - clif_displaymessage(sd->fd, "You have been banned for sit spamming. Please do not sit spam."); - chrif_char_ask_name(-1, sd->status.name, 2, 0, 0, 0, battle_config.sit_spam_ban, 0, 0); // type: 2 - ban (year, month, day, hour, minute, second) - clif_setwaitclose(sd->fd); - } - - return 1; - } - - if (battle_config.sit_spam_ban && sd->sits_in >= battle_config.sit_spam_warn) { - clif_displaymessage(sd->fd, "WARNING : You are about to be automaticly banned for sit spam!"); - } - - return 0; +int tmw_CheckSitSpam (struct map_session_data *sd) +{ + nullpo_retr (1, sd); + time_t now = time (NULL); + + if (pc_isGM (sd)) + return 0; + + if (now > sd->sit_reset_due) + { + sd->sit_reset_due = now + battle_config.sit_spam_threshold; + sd->sits_in = 0; + } + + sd->sits_in++; + + if (sd->sits_in >= battle_config.sit_spam_flood) + { + sd->sits_in = 0; + + if (battle_config.sit_spam_ban > 0 && !sd->auto_ban_info.in_progress) + { + tmw_GmHackMsg ("%s has been autobanned for sit spam", + sd->status.name); + gm_log ("server(0,0) Server : @autoban %s %dh (sit spam)", + sd->status.name, battle_config.sit_spam_ban); + + sd->auto_ban_info.in_progress = 1; + + clif_displaymessage (sd->fd, + "You have been banned for sit spamming. Please do not sit spam."); + chrif_char_ask_name (-1, sd->status.name, 2, 0, 0, 0, battle_config.sit_spam_ban, 0, 0); // type: 2 - ban (year, month, day, hour, minute, second) + clif_setwaitclose (sd->fd); + } + + return 1; + } + + if (battle_config.sit_spam_ban + && sd->sits_in >= battle_config.sit_spam_warn) + { + clif_displaymessage (sd->fd, + "WARNING : You are about to be automaticly banned for sit spam!"); + } + + return 0; } diff --git a/src/map/tmw.h b/src/map/tmw.h index 8248a71..e23aa51 100644 --- a/src/map/tmw.h +++ b/src/map/tmw.h @@ -2,9 +2,9 @@ #include "map.h" -int tmw_CheckChatSpam(struct map_session_data *sd, char* message); -int tmw_ShorterStrlen(char *s1, char *s2); -int tmw_CheckChatLameness(struct map_session_data *sd, char *message); -void tmw_GmHackMsg(const char *fmt, ...); -int tmw_CheckTradeSpam(struct map_session_data *sd); -int tmw_CheckSitSpam(struct map_session_data *sd); +int tmw_CheckChatSpam (struct map_session_data *sd, char *message); +int tmw_ShorterStrlen (char *s1, char *s2); +int tmw_CheckChatLameness (struct map_session_data *sd, char *message); +void tmw_GmHackMsg (const char *fmt, ...); +int tmw_CheckTradeSpam (struct map_session_data *sd); +int tmw_CheckSitSpam (struct map_session_data *sd); diff --git a/src/map/trade.c b/src/map/trade.c index 31f29ce..a62677d 100644 --- a/src/map/trade.c +++ b/src/map/trade.c @@ -15,233 +15,292 @@ * 取引要請を相手に送る *------------------------------------------ */ -void trade_traderequest(struct map_session_data *sd,int target_id) +void trade_traderequest (struct map_session_data *sd, int target_id) { - struct map_session_data *target_sd; + struct map_session_data *target_sd; - nullpo_retv(sd); + nullpo_retv (sd); - if((target_sd = map_id2sd(target_id)) != NULL){ - if(!battle_config.invite_request_check) { - if(target_sd->guild_invite>0 || target_sd->party_invite>0){ - clif_tradestart(sd,2); // 相手はPT要請中かGuild要請中 - return; - } - } - if (target_sd->npc_id) - { - //Trade fails if you are using an NPC. - clif_tradestart(sd, 2); - return; - } - if((target_sd->trade_partner !=0) || (sd->trade_partner !=0)) { - trade_tradecancel(sd); //person is in another trade - } - else{ - if(sd->bl.m != target_sd->bl.m - || (sd->bl.x - target_sd->bl.x <= -5 || sd->bl.x - target_sd->bl.x >= 5) - || (sd->bl.y - target_sd->bl.y <= -5 || sd->bl.y - target_sd->bl.y >= 5)) { - clif_tradestart(sd,0); //too far - } - else if(sd!=target_sd) { - target_sd->trade_partner = sd->status.account_id; - sd->trade_partner = target_sd->status.account_id; - clif_traderequest(target_sd,sd->status.name); - } - } - } - else{ - clif_tradestart(sd,1); //character does not exist - } + if ((target_sd = map_id2sd (target_id)) != NULL) + { + if (!battle_config.invite_request_check) + { + if (target_sd->guild_invite > 0 || target_sd->party_invite > 0) + { + clif_tradestart (sd, 2); // 相手はPT要請中かGuild要請中 + return; + } + } + if (target_sd->npc_id) + { + //Trade fails if you are using an NPC. + clif_tradestart (sd, 2); + return; + } + if ((target_sd->trade_partner != 0) || (sd->trade_partner != 0)) + { + trade_tradecancel (sd); //person is in another trade + } + else + { + if (sd->bl.m != target_sd->bl.m + || (sd->bl.x - target_sd->bl.x <= -5 + || sd->bl.x - target_sd->bl.x >= 5) + || (sd->bl.y - target_sd->bl.y <= -5 + || sd->bl.y - target_sd->bl.y >= 5)) + { + clif_tradestart (sd, 0); //too far + } + else if (sd != target_sd) + { + target_sd->trade_partner = sd->status.account_id; + sd->trade_partner = target_sd->status.account_id; + clif_traderequest (target_sd, sd->status.name); + } + } + } + else + { + clif_tradestart (sd, 1); //character does not exist + } } /*========================================== * 取引要請 *------------------------------------------ */ -void trade_tradeack(struct map_session_data *sd,int type) +void trade_tradeack (struct map_session_data *sd, int type) { - struct map_session_data *target_sd; - nullpo_retv(sd); + struct map_session_data *target_sd; + nullpo_retv (sd); - if((target_sd = map_id2sd(sd->trade_partner)) != NULL){ - clif_tradestart(target_sd,type); - clif_tradestart(sd,type); - if(type == 4){ // Cancel - sd->deal_locked =0; - sd->trade_partner=0; - target_sd->deal_locked=0; - target_sd->trade_partner=0; - } - if(sd->npc_id != 0) - npc_event_dequeue(sd); - if(target_sd->npc_id != 0) - npc_event_dequeue(target_sd); + if ((target_sd = map_id2sd (sd->trade_partner)) != NULL) + { + clif_tradestart (target_sd, type); + clif_tradestart (sd, type); + if (type == 4) + { // Cancel + sd->deal_locked = 0; + sd->trade_partner = 0; + target_sd->deal_locked = 0; + target_sd->trade_partner = 0; + } + if (sd->npc_id != 0) + npc_event_dequeue (sd); + if (target_sd->npc_id != 0) + npc_event_dequeue (target_sd); - //close STORAGE window if it's open. It protects from spooffing packets [Lupus] - if (sd->state.storage_flag == 1) - storage_storageclose(sd); - else if (sd->state.storage_flag == 2) - storage_guild_storageclose(sd); - } + //close STORAGE window if it's open. It protects from spooffing packets [Lupus] + if (sd->state.storage_flag == 1) + storage_storageclose (sd); + else if (sd->state.storage_flag == 2) + storage_guild_storageclose (sd); + } } /*========================================== * アイテム追加 *------------------------------------------ */ -void trade_tradeadditem(struct map_session_data *sd,int index,int amount) +void trade_tradeadditem (struct map_session_data *sd, int index, int amount) { - struct map_session_data *target_sd; - struct item_data *id; - int trade_i; - int trade_weight=0; - int free = 0; - int c; - int i; + struct map_session_data *target_sd; + struct item_data *id; + int trade_i; + int trade_weight = 0; + int free = 0; + int c; + int i; - nullpo_retv(sd); + nullpo_retv (sd); - if(((target_sd = map_id2sd(sd->trade_partner)) != NULL) && (sd->deal_locked < 1)){ - if(index<2 || index>=MAX_INVENTORY+2){ - if(index == 0 && amount > 0 && amount <= sd->status.zeny){ - sd->deal_zeny=amount; - clif_tradeadditem(sd,target_sd,0,amount); - } - }else if(amount <= sd->status.inventory[index-2].amount && amount > 0){ - // determine free slots of receiver - for(i=0;i<MAX_INVENTORY;i++){ - if(target_sd->status.inventory[i].nameid==0 && target_sd->inventory_data[i] == NULL) - free++; - } - for(trade_i=0; trade_i<10;trade_i++){ - if(sd->deal_item_amount[trade_i] == 0){ - // calculate trade weight - trade_weight+=sd->inventory_data[index-2]->weight*amount; + if (((target_sd = map_id2sd (sd->trade_partner)) != NULL) + && (sd->deal_locked < 1)) + { + if (index < 2 || index >= MAX_INVENTORY + 2) + { + if (index == 0 && amount > 0 && amount <= sd->status.zeny) + { + sd->deal_zeny = amount; + clif_tradeadditem (sd, target_sd, 0, amount); + } + } + else if (amount <= sd->status.inventory[index - 2].amount + && amount > 0) + { + // determine free slots of receiver + for (i = 0; i < MAX_INVENTORY; i++) + { + if (target_sd->status.inventory[i].nameid == 0 + && target_sd->inventory_data[i] == NULL) + free++; + } + for (trade_i = 0; trade_i < 10; trade_i++) + { + if (sd->deal_item_amount[trade_i] == 0) + { + // calculate trade weight + trade_weight += + sd->inventory_data[index - 2]->weight * amount; - // determine if item is a stackable already in receivers inventory, and up free count - for(i=0;i<MAX_INVENTORY;i++){ - if (target_sd->status.inventory[i].nameid==sd->status.inventory[index-2].nameid && target_sd->inventory_data[i] != NULL){ - id = target_sd->inventory_data[i]; - if (id->type != 4 && id->type != 5 && id->type != 7 && id->type != 8){ - free++; - break; - } - } - } + // determine if item is a stackable already in receivers inventory, and up free count + for (i = 0; i < MAX_INVENTORY; i++) + { + if (target_sd->status.inventory[i].nameid == + sd->status.inventory[index - 2].nameid + && target_sd->inventory_data[i] != NULL) + { + id = target_sd->inventory_data[i]; + if (id->type != 4 && id->type != 5 + && id->type != 7 && id->type != 8) + { + free++; + break; + } + } + } - if(target_sd->weight + trade_weight > target_sd->max_weight){ - clif_tradeitemok(sd,index,0,1); //fail to add item -- the player was over weighted. - amount = 0; // [MouseJstr] - } - else if (free <= 0) - { - clif_tradeitemok(sd,index,0,2); //fail to add item -- no free slots at receiver - amount = 0; // peavey - } - else - { - for(c=0; c==trade_i-1;c++){ // re-deal exploit protection [Valaris] - if(sd->deal_item_index[c]==index) { - trade_tradecancel(sd); - return; - } - } - pc_unequipinvyitem(sd, index - 2, 1); - sd->deal_item_index[trade_i] =index; - sd->deal_item_amount[trade_i]+=amount; - clif_tradeitemok(sd,index,amount,0); //success to add item - clif_tradeadditem(sd,target_sd,index,amount); - } - break; - }else{ - // calculate weight for stored deal - trade_weight+=sd->inventory_data[sd->deal_item_index[trade_i]-2]->weight*sd->deal_item_amount[trade_i]; - // count free stackables in stored deal - for(i=0;i<MAX_INVENTORY;i++){ - if (target_sd->status.inventory[i].nameid==sd->status.inventory[sd->deal_item_index[trade_i]-2].nameid && target_sd->inventory_data[i] != NULL){ - id = target_sd->inventory_data[i]; - if (id->type != 4 && id->type != 5 && id->type != 7 && id->type != 8){ - free++; - break; - } - } - } - } - // used a slot, but might be cancelled out by stackable checks above - free--; - } - } - } + if (target_sd->weight + trade_weight > + target_sd->max_weight) + { + clif_tradeitemok (sd, index, 0, 1); //fail to add item -- the player was over weighted. + amount = 0; // [MouseJstr] + } + else if (free <= 0) + { + clif_tradeitemok (sd, index, 0, 2); //fail to add item -- no free slots at receiver + amount = 0; // peavey + } + else + { + for (c = 0; c == trade_i - 1; c++) + { // re-deal exploit protection [Valaris] + if (sd->deal_item_index[c] == index) + { + trade_tradecancel (sd); + return; + } + } + pc_unequipinvyitem (sd, index - 2, 1); + sd->deal_item_index[trade_i] = index; + sd->deal_item_amount[trade_i] += amount; + clif_tradeitemok (sd, index, amount, 0); //success to add item + clif_tradeadditem (sd, target_sd, index, amount); + } + break; + } + else + { + // calculate weight for stored deal + trade_weight += + sd->inventory_data[sd->deal_item_index[trade_i] - + 2]->weight * + sd->deal_item_amount[trade_i]; + // count free stackables in stored deal + for (i = 0; i < MAX_INVENTORY; i++) + { + if (target_sd->status.inventory[i].nameid == + sd->status. + inventory[sd->deal_item_index[trade_i] - 2].nameid + && target_sd->inventory_data[i] != NULL) + { + id = target_sd->inventory_data[i]; + if (id->type != 4 && id->type != 5 + && id->type != 7 && id->type != 8) + { + free++; + break; + } + } + } + } + // used a slot, but might be cancelled out by stackable checks above + free--; + } + } + } } /*========================================== * アイテム追加完了(ok押し) *------------------------------------------ */ -void trade_tradeok(struct map_session_data *sd) +void trade_tradeok (struct map_session_data *sd) { - struct map_session_data *target_sd; - int trade_i; + struct map_session_data *target_sd; + int trade_i; - nullpo_retv(sd); - - for(trade_i=0;trade_i<10;trade_i++) { - if(sd->deal_item_amount[trade_i]>sd->status.inventory[sd->deal_item_index[trade_i]-2].amount || - sd->deal_item_amount[trade_i]<0) { - trade_tradecancel(sd); - return; - } - - } - - if((target_sd = map_id2sd(sd->trade_partner)) != NULL){ - sd->deal_locked=1; - clif_tradeitemok(sd,0,0,0); - clif_tradedeal_lock(sd,0); - clif_tradedeal_lock(target_sd,1); - } + nullpo_retv (sd); + + for (trade_i = 0; trade_i < 10; trade_i++) + { + if (sd->deal_item_amount[trade_i] > + sd->status.inventory[sd->deal_item_index[trade_i] - 2].amount + || sd->deal_item_amount[trade_i] < 0) + { + trade_tradecancel (sd); + return; + } + + } + + if ((target_sd = map_id2sd (sd->trade_partner)) != NULL) + { + sd->deal_locked = 1; + clif_tradeitemok (sd, 0, 0, 0); + clif_tradedeal_lock (sd, 0); + clif_tradedeal_lock (target_sd, 1); + } } /*========================================== * 取引キャンセル *------------------------------------------ */ -void trade_tradecancel(struct map_session_data *sd) +void trade_tradecancel (struct map_session_data *sd) { - struct map_session_data *target_sd; - int trade_i; + struct map_session_data *target_sd; + int trade_i; - nullpo_retv(sd); + nullpo_retv (sd); - if((target_sd = map_id2sd(sd->trade_partner)) != NULL){ - for(trade_i=0; trade_i<10;trade_i++) { //give items back (only virtual) - if(sd->deal_item_amount[trade_i] != 0) { - clif_additem(sd,sd->deal_item_index[trade_i]-2,sd->deal_item_amount[trade_i],0); - sd->deal_item_index[trade_i] =0; - sd->deal_item_amount[trade_i]=0; - } - if(target_sd->deal_item_amount[trade_i] != 0) { - clif_additem(target_sd,target_sd->deal_item_index[trade_i]-2,target_sd->deal_item_amount[trade_i],0); - target_sd->deal_item_index[trade_i] =0; - target_sd->deal_item_amount[trade_i]=0; - } - } - if(sd->deal_zeny) { - sd->deal_zeny=0; - clif_updatestatus(sd,SP_ZENY); - } - if(target_sd->deal_zeny) { - clif_updatestatus(target_sd,SP_ZENY); - target_sd->deal_zeny=0; - } - sd->deal_locked =0; - sd->trade_partner=0; - target_sd->deal_locked=0; - target_sd->trade_partner=0; - clif_tradecancelled(sd); - clif_tradecancelled(target_sd); - } + if ((target_sd = map_id2sd (sd->trade_partner)) != NULL) + { + for (trade_i = 0; trade_i < 10; trade_i++) + { //give items back (only virtual) + if (sd->deal_item_amount[trade_i] != 0) + { + clif_additem (sd, sd->deal_item_index[trade_i] - 2, + sd->deal_item_amount[trade_i], 0); + sd->deal_item_index[trade_i] = 0; + sd->deal_item_amount[trade_i] = 0; + } + if (target_sd->deal_item_amount[trade_i] != 0) + { + clif_additem (target_sd, + target_sd->deal_item_index[trade_i] - 2, + target_sd->deal_item_amount[trade_i], 0); + target_sd->deal_item_index[trade_i] = 0; + target_sd->deal_item_amount[trade_i] = 0; + } + } + if (sd->deal_zeny) + { + sd->deal_zeny = 0; + clif_updatestatus (sd, SP_ZENY); + } + if (target_sd->deal_zeny) + { + clif_updatestatus (target_sd, SP_ZENY); + target_sd->deal_zeny = 0; + } + sd->deal_locked = 0; + sd->trade_partner = 0; + target_sd->deal_locked = 0; + target_sd->trade_partner = 0; + clif_tradecancelled (sd); + clif_tradecancelled (target_sd); + } } #define MAP_LOG_PC(sd, fmt, args...) MAP_LOG("PC%d %d:%d,%d " fmt, sd->status.char_id, sd->bl.m, sd->bl.x, sd->bl.y, ## args) @@ -250,95 +309,124 @@ void trade_tradecancel(struct map_session_data *sd) * 取引許諾(trade押し) *------------------------------------------ */ -void trade_tradecommit(struct map_session_data *sd) +void trade_tradecommit (struct map_session_data *sd) { - struct map_session_data *target_sd; - int trade_i; + struct map_session_data *target_sd; + int trade_i; - nullpo_retv(sd); + nullpo_retv (sd); - if((target_sd = map_id2sd(sd->trade_partner)) != NULL){ - MAP_LOG_PC(sd, " TRADECOMMIT WITH %d GIVE %d GET %d", target_sd->status.char_id, sd->deal_zeny, target_sd->deal_zeny); - if( (sd->deal_locked >=1) && (target_sd->deal_locked >=1) ){ // both have pressed 'ok' - if(sd->deal_locked < 2) {sd->deal_locked=2;} // set locked to 2 - if(target_sd->deal_locked==2) { // the other one pressed 'trade' too - if(sd->deal_zeny > sd->status.zeny) { - sd->deal_zeny = 0; - trade_tradecancel(sd); - MAP_LOG_PC(sd, " TRADECANCEL"); - return; - } - if(target_sd->deal_zeny > target_sd->status.zeny) { - target_sd->deal_zeny = 0; - trade_tradecancel(sd); - MAP_LOG_PC(sd, " TRADECANCEL"); - return; - } - for(trade_i=0; trade_i<10;trade_i++) { - if(sd->deal_item_amount[trade_i] != 0) { - int n=sd->deal_item_index[trade_i]-2; - int flag; - flag = pc_additem(target_sd,&sd->status.inventory[n],sd->deal_item_amount[trade_i]); - if(flag==0) - pc_delitem(sd,n,sd->deal_item_amount[trade_i],1); - else - clif_additem(sd,n,sd->deal_item_amount[trade_i],0); - sd->deal_item_index[trade_i] =0; - sd->deal_item_amount[trade_i]=0; - } - if(target_sd->deal_item_amount[trade_i] != 0) { - int n=target_sd->deal_item_index[trade_i]-2; - int flag; - flag = pc_additem(sd,&target_sd->status.inventory[n],target_sd->deal_item_amount[trade_i]); - if(flag==0) - pc_delitem(target_sd,n,target_sd->deal_item_amount[trade_i],1); - else - clif_additem(target_sd,n,target_sd->deal_item_amount[trade_i],0); - target_sd->deal_item_index[trade_i] =0; - target_sd->deal_item_amount[trade_i]=0; - } - } - if(sd->deal_zeny) { - int deal = sd->deal_zeny; - sd->deal_zeny=0; - sd->status.zeny -= deal; - clif_updatestatus(sd,SP_ZENY); - target_sd->status.zeny += deal; - clif_updatestatus(target_sd,SP_ZENY); - } - if(target_sd->deal_zeny) { - int deal = target_sd->deal_zeny; - target_sd->deal_zeny=0; - target_sd->status.zeny -= deal; - clif_updatestatus(target_sd,SP_ZENY); - sd->status.zeny += deal; - clif_updatestatus(sd,SP_ZENY); - } - sd->deal_locked =0; - sd->trade_partner=0; - target_sd->deal_locked=0; - target_sd->trade_partner=0; - clif_tradecompleted(sd,0); - clif_tradecompleted(target_sd,0); - MAP_LOG_PC(sd, " TRADEOK"); - } - } - } + if ((target_sd = map_id2sd (sd->trade_partner)) != NULL) + { + MAP_LOG_PC (sd, " TRADECOMMIT WITH %d GIVE %d GET %d", + target_sd->status.char_id, sd->deal_zeny, + target_sd->deal_zeny); + if ((sd->deal_locked >= 1) && (target_sd->deal_locked >= 1)) + { // both have pressed 'ok' + if (sd->deal_locked < 2) + { + sd->deal_locked = 2; + } // set locked to 2 + if (target_sd->deal_locked == 2) + { // the other one pressed 'trade' too + if (sd->deal_zeny > sd->status.zeny) + { + sd->deal_zeny = 0; + trade_tradecancel (sd); + MAP_LOG_PC (sd, " TRADECANCEL"); + return; + } + if (target_sd->deal_zeny > target_sd->status.zeny) + { + target_sd->deal_zeny = 0; + trade_tradecancel (sd); + MAP_LOG_PC (sd, " TRADECANCEL"); + return; + } + for (trade_i = 0; trade_i < 10; trade_i++) + { + if (sd->deal_item_amount[trade_i] != 0) + { + int n = sd->deal_item_index[trade_i] - 2; + int flag; + flag = + pc_additem (target_sd, &sd->status.inventory[n], + sd->deal_item_amount[trade_i]); + if (flag == 0) + pc_delitem (sd, n, sd->deal_item_amount[trade_i], + 1); + else + clif_additem (sd, n, + sd->deal_item_amount[trade_i], 0); + sd->deal_item_index[trade_i] = 0; + sd->deal_item_amount[trade_i] = 0; + } + if (target_sd->deal_item_amount[trade_i] != 0) + { + int n = target_sd->deal_item_index[trade_i] - 2; + int flag; + flag = + pc_additem (sd, &target_sd->status.inventory[n], + target_sd->deal_item_amount[trade_i]); + if (flag == 0) + pc_delitem (target_sd, n, + target_sd->deal_item_amount[trade_i], + 1); + else + clif_additem (target_sd, n, + target_sd->deal_item_amount + [trade_i], 0); + target_sd->deal_item_index[trade_i] = 0; + target_sd->deal_item_amount[trade_i] = 0; + } + } + if (sd->deal_zeny) + { + int deal = sd->deal_zeny; + sd->deal_zeny = 0; + sd->status.zeny -= deal; + clif_updatestatus (sd, SP_ZENY); + target_sd->status.zeny += deal; + clif_updatestatus (target_sd, SP_ZENY); + } + if (target_sd->deal_zeny) + { + int deal = target_sd->deal_zeny; + target_sd->deal_zeny = 0; + target_sd->status.zeny -= deal; + clif_updatestatus (target_sd, SP_ZENY); + sd->status.zeny += deal; + clif_updatestatus (sd, SP_ZENY); + } + sd->deal_locked = 0; + sd->trade_partner = 0; + target_sd->deal_locked = 0; + target_sd->trade_partner = 0; + clif_tradecompleted (sd, 0); + clif_tradecompleted (target_sd, 0); + MAP_LOG_PC (sd, " TRADEOK"); + } + } + } } // This is called when a char's zeny is changed // This helps prevent money duplication and other problems // [Jaxad0127] -void trade_verifyzeny(struct map_session_data *sd) +void trade_verifyzeny (struct map_session_data *sd) { - struct map_session_data *target_sd; + struct map_session_data *target_sd; - nullpo_retv(sd); + nullpo_retv (sd); - if((target_sd = map_id2sd(sd->trade_partner)) != NULL) { - if (sd->deal_zeny > sd->status.zeny) { - if (sd->deal_locked < 1) trade_tradeadditem(sd, 0, sd->status.zeny); // Fix money ammount - else trade_tradecancel(sd); // Or cancel the trade if we can't fix it - } - } + if ((target_sd = map_id2sd (sd->trade_partner)) != NULL) + { + if (sd->deal_zeny > sd->status.zeny) + { + if (sd->deal_locked < 1) + trade_tradeadditem (sd, 0, sd->status.zeny); // Fix money ammount + else + trade_tradecancel (sd); // Or cancel the trade if we can't fix it + } + } } diff --git a/src/map/trade.h b/src/map/trade.h index 4ef112b..a846388 100644 --- a/src/map/trade.h +++ b/src/map/trade.h @@ -3,12 +3,12 @@ #define _TRADE_H_ #include "map.h" -void trade_traderequest(struct map_session_data *sd,int target_id); -void trade_tradeack(struct map_session_data *sd,int type); -void trade_tradeadditem(struct map_session_data *sd,int index,int amount); -void trade_tradeok(struct map_session_data *sd); -void trade_tradecancel(struct map_session_data *sd); -void trade_tradecommit(struct map_session_data *sd); -void trade_verifyzeny(struct map_session_data *sd); +void trade_traderequest (struct map_session_data *sd, int target_id); +void trade_tradeack (struct map_session_data *sd, int type); +void trade_tradeadditem (struct map_session_data *sd, int index, int amount); +void trade_tradeok (struct map_session_data *sd); +void trade_tradecancel (struct map_session_data *sd); +void trade_tradecommit (struct map_session_data *sd); +void trade_verifyzeny (struct map_session_data *sd); -#endif // _TRADE_H_ +#endif // _TRADE_H_ diff --git a/src/tool/adduser.c b/src/tool/adduser.c index e22e7e9..6ebbdf1 100644 --- a/src/tool/adduser.c +++ b/src/tool/adduser.c @@ -12,85 +12,104 @@ char *account_txt = "../save/account.txt"; //----------------------------------------------------- // Function to suppress control characters in a string. //----------------------------------------------------- -int remove_control_chars(unsigned char *str) { - int i; - int change = 0; - - for(i = 0; str[i]; i++) { - if (str[i] < 32) { - str[i] = '_'; - change = 1; - } - } - - return change; +int remove_control_chars (unsigned char *str) +{ + int i; + int change = 0; + + for (i = 0; str[i]; i++) + { + if (str[i] < 32) + { + str[i] = '_'; + change = 1; + } + } + + return change; } -int main(int argc, char *argv[]) { - - char username[24]; - char password[24]; - char sex[2]; - - int next_id, id; - char line[1024]; - - // Check to see if account.txt exists. - printf("Checking if '%s' file exists...\n", account_txt); - FILE *FPaccin = fopen_(account_txt, "r"); - if (FPaccin == NULL) { - printf("'%s' file not found!\n", account_txt); - printf("Run the setup wizard please.\n"); - exit(0); - } - - next_id = 2000000; - while(fgets(line, sizeof(line)-1, FPaccin)) { - if (line[0] == '/' && line[1] == '/') { continue; } - if (sscanf(line, "%d\t%%newid%%\n", &id) == 1) { - if (next_id < id) { - next_id = id; - } - } else { - sscanf(line,"%i%[^ ]", &id); - if (next_id <= id) { - next_id = id +1; - } - } - } - close(FPaccin); - printf("File exists.\n"); - - printf("Don't create an account if the login-server is online!!!\n"); - printf("If the login-server is online, press ctrl+C now to stop this software.\n"); - printf("\n"); - - strcpy(username, ""); - while (strlen(username) < 4 || strlen(username) > 23) { - printf("Enter an username (4-23 characters): "); - scanf("%s", &username); - username[23] = 0; - remove_control_chars(username); - } - - strcpy(password, ""); - while (strlen(password) < 4 || strlen(password) > 23) { - printf("Enter a password (4-23 characters): "); - scanf("%s", &password); - password[23] = 0; - remove_control_chars(password); - } - - strcpy(sex, ""); - while (strcmp(sex, "F") != 0 && strcmp(sex, "M") != 0) { - printf("Enter a gender (M for male, F for female): "); - scanf("%s", &sex); - } - - FILE *FPaccout = fopen_(account_txt, "r+"); - fseek(FPaccout, 0, SEEK_END); - fprintf(FPaccout, "%i %s %s - %s -\r\n", next_id, username, password, sex); - close(FPaccout); - - printf("Account added.\n"); +int main (int argc, char *argv[]) +{ + + char username[24]; + char password[24]; + char sex[2]; + + int next_id, id; + char line[1024]; + + // Check to see if account.txt exists. + printf ("Checking if '%s' file exists...\n", account_txt); + FILE *FPaccin = fopen_ (account_txt, "r"); + if (FPaccin == NULL) + { + printf ("'%s' file not found!\n", account_txt); + printf ("Run the setup wizard please.\n"); + exit (0); + } + + next_id = 2000000; + while (fgets (line, sizeof (line) - 1, FPaccin)) + { + if (line[0] == '/' && line[1] == '/') + { + continue; + } + if (sscanf (line, "%d\t%%newid%%\n", &id) == 1) + { + if (next_id < id) + { + next_id = id; + } + } + else + { + sscanf (line, "%i%[^ ]", &id); + if (next_id <= id) + { + next_id = id + 1; + } + } + } + close (FPaccin); + printf ("File exists.\n"); + + printf ("Don't create an account if the login-server is online!!!\n"); + printf + ("If the login-server is online, press ctrl+C now to stop this software.\n"); + printf ("\n"); + + strcpy (username, ""); + while (strlen (username) < 4 || strlen (username) > 23) + { + printf ("Enter an username (4-23 characters): "); + scanf ("%s", &username); + username[23] = 0; + remove_control_chars (username); + } + + strcpy (password, ""); + while (strlen (password) < 4 || strlen (password) > 23) + { + printf ("Enter a password (4-23 characters): "); + scanf ("%s", &password); + password[23] = 0; + remove_control_chars (password); + } + + strcpy (sex, ""); + while (strcmp (sex, "F") != 0 && strcmp (sex, "M") != 0) + { + printf ("Enter a gender (M for male, F for female): "); + scanf ("%s", &sex); + } + + FILE *FPaccout = fopen_ (account_txt, "r+"); + fseek (FPaccout, 0, SEEK_END); + fprintf (FPaccout, "%i %s %s - %s -\r\n", next_id, username, + password, sex); + close (FPaccout); + + printf ("Account added.\n"); } diff --git a/src/tool/convert.c b/src/tool/convert.c index b747116..154b154 100644 --- a/src/tool/convert.c +++ b/src/tool/convert.c @@ -8,289 +8,297 @@ #define MAX_SKILL 350 #define GLOBAL_REG_NUM 16 -struct item { - int id; - short nameid; - short amount; - short equip; - char identify; - char refine; - char attribute; - short card[4]; +struct item +{ + int id; + short nameid; + short amount; + short equip; + char identify; + char refine; + char attribute; + short card[4]; }; -struct point{ - char map[16]; - short x,y; +struct point +{ + char map[16]; + short x, y; }; -struct skill { - unsigned short id,lv,flag; +struct skill +{ + unsigned short id, lv, flag; }; -struct global_reg { - char str[16]; - int value; +struct global_reg +{ + char str[16]; + int value; }; -struct mmo_charstatus { - int char_id; - int account_id; - int base_exp,job_exp,zeny; +struct mmo_charstatus +{ + int char_id; + int account_id; + int base_exp, job_exp, zeny; - short class; - short status_point,skill_point; - short hp,max_hp,sp,max_sp; - short option,karma,manner; - short hair,hair_color,clothes_color; - int party_id,guild_id,pet_id; + short class; + short status_point, skill_point; + short hp, max_hp, sp, max_sp; + short option, karma, manner; + short hair, hair_color, clothes_color; + int party_id, guild_id, pet_id; - short weapon,shield; - short head_top,head_mid,head_bottom; + short weapon, shield; + short head_top, head_mid, head_bottom; - char name[24]; - unsigned char base_level,job_level; - unsigned char str,agi,vit,int_,dex,luk,char_num,sex; + char name[24]; + unsigned char base_level, job_level; + unsigned char str, agi, vit, int_, dex, luk, char_num, sex; - struct point last_point,save_point,memo_point[3]; - struct item inventory[MAX_INVENTORY],cart[MAX_CART]; - struct skill skill[MAX_SKILL]; - int global_reg_num; - struct global_reg global_reg[GLOBAL_REG_NUM]; + struct point last_point, save_point, memo_point[3]; + struct item inventory[MAX_INVENTORY], cart[MAX_CART]; + struct skill skill[MAX_SKILL]; + int global_reg_num; + struct global_reg global_reg[GLOBAL_REG_NUM]; }; -int mmo_char_tostr(char *str,struct mmo_charstatus *p) +int mmo_char_tostr (char *str, struct mmo_charstatus *p) { - int i; - sprintf(str,"%d\t%d,%d\t%s\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" - "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" - "\t%s,%d,%d\t%s,%d,%d", - p->char_id,p->account_id,p->char_num,p->name, // - p->class,p->base_level,p->job_level, - p->base_exp,p->job_exp,p->zeny, - p->hp,p->max_hp,p->sp,p->max_sp, - p->str,p->agi,p->vit,p->int_,p->dex,p->luk, - p->status_point,p->skill_point, - p->option,p->karma,p->manner, // - p->party_id,p->guild_id,p->pet_id, - p->hair,p->hair_color,p->clothes_color, - p->weapon,p->shield,p->head_top,p->head_mid,p->head_bottom, - p->last_point.map,p->last_point.x,p->last_point.y, // - p->save_point.map,p->save_point.x,p->save_point.y - ); - strcat(str,"\t"); - for(i=0;i<3;i++) - if(p->memo_point[i].map[0]){ - sprintf(str+strlen(str),"%s,%d,%d",p->memo_point[i].map,p->memo_point[i].x,p->memo_point[i].y); - } - strcat(str,"\t"); - for(i=0;i<MAX_INVENTORY;i++) - if(p->inventory[i].nameid){ - sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ", - p->inventory[i].id,p->inventory[i].nameid,p->inventory[i].amount,p->inventory[i].equip, - p->inventory[i].identify,p->inventory[i].refine,p->inventory[i].attribute, - p->inventory[i].card[0],p->inventory[i].card[1],p->inventory[i].card[2],p->inventory[i].card[3]); - } - strcat(str,"\t"); - for(i=0;i<MAX_CART;i++) - if(p->cart[i].nameid){ - sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ", - p->cart[i].id,p->cart[i].nameid,p->cart[i].amount,p->cart[i].equip, - p->cart[i].identify,p->cart[i].refine,p->cart[i].attribute, - p->cart[i].card[0],p->cart[i].card[1],p->cart[i].card[2],p->cart[i].card[3]); - } - strcat(str,"\t"); - for(i=0;i<MAX_SKILL;i++) - if(p->skill[i].id){ - sprintf(str+strlen(str),"%d,%d ",p->skill[i].id,p->skill[i].lv); - } - strcat(str,"\t"); - for(i=0;i<p->global_reg_num;i++) - sprintf(str+strlen(str),"%s,%d ",p->global_reg[i].str,p->global_reg[i].value); - strcat(str,"\t"); - return 0; + int i; + sprintf (str, "%d\t%d,%d\t%s\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" "\t%s,%d,%d\t%s,%d,%d", p->char_id, p->account_id, p->char_num, p->name, // + p->class, p->base_level, p->job_level, p->base_exp, p->job_exp, p->zeny, p->hp, p->max_hp, p->sp, p->max_sp, p->str, p->agi, p->vit, p->int_, p->dex, p->luk, p->status_point, p->skill_point, p->option, p->karma, p->manner, // + p->party_id, p->guild_id, p->pet_id, p->hair, p->hair_color, p->clothes_color, p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom, p->last_point.map, p->last_point.x, p->last_point.y, // + p->save_point.map, p->save_point.x, p->save_point.y); + strcat (str, "\t"); + for (i = 0; i < 3; i++) + if (p->memo_point[i].map[0]) + { + sprintf (str + strlen (str), "%s,%d,%d", p->memo_point[i].map, + p->memo_point[i].x, p->memo_point[i].y); + } + strcat (str, "\t"); + for (i = 0; i < MAX_INVENTORY; i++) + if (p->inventory[i].nameid) + { + sprintf (str + strlen (str), "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ", + p->inventory[i].id, p->inventory[i].nameid, + p->inventory[i].amount, p->inventory[i].equip, + p->inventory[i].identify, p->inventory[i].refine, + p->inventory[i].attribute, p->inventory[i].card[0], + p->inventory[i].card[1], p->inventory[i].card[2], + p->inventory[i].card[3]); + } + strcat (str, "\t"); + for (i = 0; i < MAX_CART; i++) + if (p->cart[i].nameid) + { + sprintf (str + strlen (str), "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ", + p->cart[i].id, p->cart[i].nameid, p->cart[i].amount, + p->cart[i].equip, p->cart[i].identify, p->cart[i].refine, + p->cart[i].attribute, p->cart[i].card[0], + p->cart[i].card[1], p->cart[i].card[2], + p->cart[i].card[3]); + } + strcat (str, "\t"); + for (i = 0; i < MAX_SKILL; i++) + if (p->skill[i].id) + { + sprintf (str + strlen (str), "%d,%d ", p->skill[i].id, + p->skill[i].lv); + } + strcat (str, "\t"); + for (i = 0; i < p->global_reg_num; i++) + sprintf (str + strlen (str), "%s,%d ", p->global_reg[i].str, + p->global_reg[i].value); + strcat (str, "\t"); + return 0; } -int mmo_char_fromstr(char *str,struct mmo_charstatus *p) +int mmo_char_fromstr (char *str, struct mmo_charstatus *p) { - int tmp_int[256]; - int set,next,len,i; + int tmp_int[256]; + int set, next, len, i; - set=sscanf(str,"%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" - "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" - "\t%[^,],%d,%d\t%[^,],%d,%d%n", - &tmp_int[0],&tmp_int[1],&tmp_int[2],p->name, // - &tmp_int[3],&tmp_int[4],&tmp_int[5], - &tmp_int[6],&tmp_int[7],&tmp_int[8], - &tmp_int[9],&tmp_int[10],&tmp_int[11],&tmp_int[12], - &tmp_int[13],&tmp_int[14],&tmp_int[15],&tmp_int[16],&tmp_int[17],&tmp_int[18], - &tmp_int[19],&tmp_int[20], - &tmp_int[21],&tmp_int[22],&tmp_int[23], // - &tmp_int[24],&tmp_int[25], - &tmp_int[26],&tmp_int[27],&tmp_int[28], - &tmp_int[29],&tmp_int[30],&tmp_int[31],&tmp_int[32],&tmp_int[33], - p->last_point.map,&tmp_int[34],&tmp_int[35], // - p->save_point.map,&tmp_int[36],&tmp_int[37],&next - ); - p->char_id=tmp_int[0]; - p->account_id=tmp_int[1]; - p->char_num=tmp_int[2]; - p->class=tmp_int[3]; - p->base_level=tmp_int[4]; - p->job_level=tmp_int[5]; - p->base_exp=tmp_int[6]; - p->job_exp=tmp_int[7]; - p->zeny=tmp_int[8]; - p->hp=tmp_int[9]; - p->max_hp=tmp_int[10]; - p->sp=tmp_int[11]; - p->max_sp=tmp_int[12]; - p->str=tmp_int[13]; - p->agi=tmp_int[14]; - p->vit=tmp_int[15]; - p->int_=tmp_int[16]; - p->dex=tmp_int[17]; - p->luk=tmp_int[18]; - p->status_point=tmp_int[19]; - p->skill_point=tmp_int[20]; - p->option=tmp_int[21]; - p->karma=tmp_int[22]; - p->manner=tmp_int[23]; - p->party_id=tmp_int[24]; - p->guild_id=tmp_int[25]; - p->pet_id=0; - p->hair=tmp_int[26]; - p->hair_color=tmp_int[27]; - p->clothes_color=tmp_int[28]; - p->weapon=tmp_int[29]; - p->shield=tmp_int[30]; - p->head_top=tmp_int[31]; - p->head_mid=tmp_int[32]; - p->head_bottom=tmp_int[33]; - p->last_point.x=tmp_int[34]; - p->last_point.y=tmp_int[35]; - p->save_point.x=tmp_int[36]; - p->save_point.y=tmp_int[37]; - if(set!=41) - return 0; - if(str[next]=='\n' || str[next]=='\r') - return 1; // 新規データ - next++; - for(i=0;str[next] && str[next]!='\t';i++){ - set=sscanf(str+next,"%[^,],%d,%d%n",p->memo_point[i].map,&tmp_int[0],&tmp_int[1],&len); - if(set!=3) - return 0; - p->memo_point[i].x=tmp_int[0]; - p->memo_point[i].y=tmp_int[1]; - next+=len; - if(str[next]==' ') - next++; - } - next++; - for(i=0;str[next] && str[next]!='\t';i++){ - set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3], - &tmp_int[4],&tmp_int[5],&tmp_int[6], - &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len); - if(set!=11) - return 0; - p->inventory[i].id=tmp_int[0]; - p->inventory[i].nameid=tmp_int[1]; - p->inventory[i].amount=tmp_int[2]; - p->inventory[i].equip=tmp_int[3]; - p->inventory[i].identify=tmp_int[4]; - p->inventory[i].refine=tmp_int[5]; - p->inventory[i].attribute=tmp_int[6]; - p->inventory[i].card[0]=tmp_int[7]; - p->inventory[i].card[1]=tmp_int[8]; - p->inventory[i].card[2]=tmp_int[9]; - p->inventory[i].card[3]=tmp_int[10]; - next+=len; - if(str[next]==' ') - next++; - } - next++; - for(i=0;str[next] && str[next]!='\t';i++){ - set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3], - &tmp_int[4],&tmp_int[5],&tmp_int[6], - &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len); - if(set!=11) - return 0; - p->cart[i].id=tmp_int[0]; - p->cart[i].nameid=tmp_int[1]; - p->cart[i].amount=tmp_int[2]; - p->cart[i].equip=tmp_int[3]; - p->cart[i].identify=tmp_int[4]; - p->cart[i].refine=tmp_int[5]; - p->cart[i].attribute=tmp_int[6]; - p->cart[i].card[0]=tmp_int[7]; - p->cart[i].card[1]=tmp_int[8]; - p->cart[i].card[2]=tmp_int[9]; - p->cart[i].card[3]=tmp_int[10]; - next+=len; - if(str[next]==' ') - next++; - } - next++; - for(i=0;str[next] && str[next]!='\t';i++){ - set=sscanf(str+next,"%d,%d%n", - &tmp_int[0],&tmp_int[1],&len); - if(set!=2) - return 0; - p->skill[tmp_int[0]].id=tmp_int[0]; - p->skill[tmp_int[0]].lv=tmp_int[1]; - next+=len; - if(str[next]==' ') - next++; - } - next++; - for(i=0;str[next] && str[next]!='\t' && str[next]!='\n' && str[next]!='\r';i++){ //global_reg実装以前のathena.txt互換のため一応'\n'チェック - set=sscanf(str+next,"%[^,],%d%n", - p->global_reg[i].str,&p->global_reg[i].value,&len); - if(set!=2) - return 0; - next+=len; - if(str[next]==' ') - next++; - } - p->global_reg_num=i; - return 1; + set = sscanf (str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" "\t%[^,],%d,%d\t%[^,],%d,%d%n", &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, // + &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], &tmp_int[19], &tmp_int[20], &tmp_int[21], &tmp_int[22], &tmp_int[23], // + &tmp_int[24], &tmp_int[25], &tmp_int[26], &tmp_int[27], &tmp_int[28], &tmp_int[29], &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], p->last_point.map, &tmp_int[34], &tmp_int[35], // + p->save_point.map, &tmp_int[36], &tmp_int[37], &next); + p->char_id = tmp_int[0]; + p->account_id = tmp_int[1]; + p->char_num = tmp_int[2]; + p->class = tmp_int[3]; + p->base_level = tmp_int[4]; + p->job_level = tmp_int[5]; + p->base_exp = tmp_int[6]; + p->job_exp = tmp_int[7]; + p->zeny = tmp_int[8]; + p->hp = tmp_int[9]; + p->max_hp = tmp_int[10]; + p->sp = tmp_int[11]; + p->max_sp = tmp_int[12]; + p->str = tmp_int[13]; + p->agi = tmp_int[14]; + p->vit = tmp_int[15]; + p->int_ = tmp_int[16]; + p->dex = tmp_int[17]; + p->luk = tmp_int[18]; + p->status_point = tmp_int[19]; + p->skill_point = tmp_int[20]; + p->option = tmp_int[21]; + p->karma = tmp_int[22]; + p->manner = tmp_int[23]; + p->party_id = tmp_int[24]; + p->guild_id = tmp_int[25]; + p->pet_id = 0; + p->hair = tmp_int[26]; + p->hair_color = tmp_int[27]; + p->clothes_color = tmp_int[28]; + p->weapon = tmp_int[29]; + p->shield = tmp_int[30]; + p->head_top = tmp_int[31]; + p->head_mid = tmp_int[32]; + p->head_bottom = tmp_int[33]; + p->last_point.x = tmp_int[34]; + p->last_point.y = tmp_int[35]; + p->save_point.x = tmp_int[36]; + p->save_point.y = tmp_int[37]; + if (set != 41) + return 0; + if (str[next] == '\n' || str[next] == '\r') + return 1; // 新規データ + next++; + for (i = 0; str[next] && str[next] != '\t'; i++) + { + set = + sscanf (str + next, "%[^,],%d,%d%n", p->memo_point[i].map, + &tmp_int[0], &tmp_int[1], &len); + if (set != 3) + return 0; + p->memo_point[i].x = tmp_int[0]; + p->memo_point[i].y = tmp_int[1]; + next += len; + if (str[next] == ' ') + next++; + } + next++; + for (i = 0; str[next] && str[next] != '\t'; i++) + { + set = sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &len); + if (set != 11) + return 0; + p->inventory[i].id = tmp_int[0]; + p->inventory[i].nameid = tmp_int[1]; + p->inventory[i].amount = tmp_int[2]; + p->inventory[i].equip = tmp_int[3]; + p->inventory[i].identify = tmp_int[4]; + p->inventory[i].refine = tmp_int[5]; + p->inventory[i].attribute = tmp_int[6]; + p->inventory[i].card[0] = tmp_int[7]; + p->inventory[i].card[1] = tmp_int[8]; + p->inventory[i].card[2] = tmp_int[9]; + p->inventory[i].card[3] = tmp_int[10]; + next += len; + if (str[next] == ' ') + next++; + } + next++; + for (i = 0; str[next] && str[next] != '\t'; i++) + { + set = sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &len); + if (set != 11) + return 0; + p->cart[i].id = tmp_int[0]; + p->cart[i].nameid = tmp_int[1]; + p->cart[i].amount = tmp_int[2]; + p->cart[i].equip = tmp_int[3]; + p->cart[i].identify = tmp_int[4]; + p->cart[i].refine = tmp_int[5]; + p->cart[i].attribute = tmp_int[6]; + p->cart[i].card[0] = tmp_int[7]; + p->cart[i].card[1] = tmp_int[8]; + p->cart[i].card[2] = tmp_int[9]; + p->cart[i].card[3] = tmp_int[10]; + next += len; + if (str[next] == ' ') + next++; + } + next++; + for (i = 0; str[next] && str[next] != '\t'; i++) + { + set = sscanf (str + next, "%d,%d%n", &tmp_int[0], &tmp_int[1], &len); + if (set != 2) + return 0; + p->skill[tmp_int[0]].id = tmp_int[0]; + p->skill[tmp_int[0]].lv = tmp_int[1]; + next += len; + if (str[next] == ' ') + next++; + } + next++; + for (i = 0; + str[next] && str[next] != '\t' && str[next] != '\n' + && str[next] != '\r'; i++) + { //global_reg実装以前のathena.txt互換のため一応'\n'チェック + set = sscanf (str + next, "%[^,],%d%n", + p->global_reg[i].str, &p->global_reg[i].value, &len); + if (set != 2) + return 0; + next += len; + if (str[next] == ' ') + next++; + } + p->global_reg_num = i; + return 1; } -int mmo_char_convert(char *fname1,char *fname2) +int mmo_char_convert (char *fname1, char *fname2) { - char line[65536]; - int ret; - struct mmo_charstatus char_dat; - FILE *ifp,*ofp; + char line[65536]; + int ret; + struct mmo_charstatus char_dat; + FILE *ifp, *ofp; - ifp=fopen_(fname1,"r"); - ofp=fopen_(fname2,"w"); - if(ifp==NULL) { - printf("file not found %s\n",fname1); - return 0; - } - if(ofp==NULL) { - printf("file open error %s\n",fname2); - return 0; - } - while(fgets(line,65535,ifp)){ - memset(&char_dat,0,sizeof(struct mmo_charstatus)); - ret=mmo_char_fromstr(line,&char_dat); - if(ret){ - mmo_char_tostr(line,&char_dat); - fprintf(ofp,"%s" RETCODE,line); + ifp = fopen_ (fname1, "r"); + ofp = fopen_ (fname2, "w"); + if (ifp == NULL) + { + printf ("file not found %s\n", fname1); + return 0; + } + if (ofp == NULL) + { + printf ("file open error %s\n", fname2); + return 0; } - } - fcloseall(); - return 0; + while (fgets (line, 65535, ifp)) + { + memset (&char_dat, 0, sizeof (struct mmo_charstatus)); + ret = mmo_char_fromstr (line, &char_dat); + if (ret) + { + mmo_char_tostr (line, &char_dat); + fprintf (ofp, "%s" RETCODE, line); + } + } + fcloseall (); + return 0; } -int main(int argc,char *argv[]) +int main (int argc, char *argv[]) { - if(argc < 3) { - printf("Usage: convert <input filename> <output filename>\n"); - exit(0); - } - mmo_char_convert(argv[1],argv[2]); + if (argc < 3) + { + printf ("Usage: convert <input filename> <output filename>\n"); + exit (0); + } + mmo_char_convert (argv[1], argv[2]); - return 0; + return 0; } diff --git a/src/tool/itemfrob.c b/src/tool/itemfrob.c index 999834c..bc9ff35 100644 --- a/src/tool/itemfrob.c +++ b/src/tool/itemfrob.c @@ -8,111 +8,128 @@ // Well, this is not terribly elegant, but I don't have that much time. #define MAX_ITEM_ID 65535 -int inv_translate[MAX_ITEM_ID]; +int inv_translate[MAX_ITEM_ID]; -void -transform_char(struct mmo_charstatus *p) +void transform_char (struct mmo_charstatus *p) { - int k; - for (k = 0; k < MAX_INVENTORY; k++) - p->inventory[k].nameid = inv_translate[p->inventory[k].nameid]; + int k; + for (k = 0; k < MAX_INVENTORY; k++) + p->inventory[k].nameid = inv_translate[p->inventory[k].nameid]; } -int mmo_char_convert() +int mmo_char_convert () { - char line[965536]; - int ret; - struct mmo_charstatus char_dat; - FILE *ifp,*ofp; - - ifp=stdin; - ofp=stdout; - while(fgets(line,65535,ifp)){ - memset(&char_dat,0,sizeof(struct mmo_charstatus)); - ret=mmo_char_fromstr(line,&char_dat); - if(ret){ - transform_char(&char_dat); - mmo_char_tostr(line,&char_dat); - fprintf(ofp,"%s" RETCODE,line); - } + char line[965536]; + int ret; + struct mmo_charstatus char_dat; + FILE *ifp, *ofp; + + ifp = stdin; + ofp = stdout; + while (fgets (line, 65535, ifp)) + { + memset (&char_dat, 0, sizeof (struct mmo_charstatus)); + ret = mmo_char_fromstr (line, &char_dat); + if (ret) + { + transform_char (&char_dat); + mmo_char_tostr (line, &char_dat); + fprintf (ofp, "%s" RETCODE, line); } - fcloseall(); - return 0; + } + fcloseall (); + return 0; } #define PARSE_MODE_NEXTNUM 0 #define PARSE_MODE_RANGE 1 -int init(char *source, char *dest) +int init (char *source, char *dest) { - int i; - char *end_of_num; - int dest_nr = strtol(dest, &end_of_num, 0); - int range_start; - int mode = PARSE_MODE_NEXTNUM; - - if (*end_of_num) { - fprintf(stderr, "Invalid inventory ID: `%s'\n", dest); - return 1; + int i; + char *end_of_num; + int dest_nr = strtol (dest, &end_of_num, 0); + int range_start; + int mode = PARSE_MODE_NEXTNUM; + + if (*end_of_num) + { + fprintf (stderr, "Invalid inventory ID: `%s'\n", dest); + return 1; + } + + /* init */ + for (i = 0; i < MAX_ITEM_ID; i++) + inv_translate[i] = i; + + while (*source) + { + int nr = strtol (source, &end_of_num, 0); + char sep; + + if (end_of_num == source) + { + fprintf (stderr, "Invalid source range description: `%s'\n", + source); + return 1; } - /* init */ - for (i = 0; i < MAX_ITEM_ID; i++) - inv_translate[i] = i; - - while (*source) { - int nr = strtol(source, &end_of_num, 0); - char sep; - - if (end_of_num == source) { - fprintf(stderr, "Invalid source range description: `%s'\n", source); - return 1; - } - - switch (mode) { - case PARSE_MODE_NEXTNUM: - inv_translate[nr] = dest_nr; - break; - case PARSE_MODE_RANGE: - for (i = range_start; i <= nr; i++) - inv_translate[i] = dest_nr; - break; - default: fprintf(stderr, "Internal error at %d\n", __LINE__); - return 1; - }; - - sep = *end_of_num++; - - switch (sep) { - case '-': - range_start = nr; - mode = PARSE_MODE_RANGE; break; - case ',': mode = PARSE_MODE_NEXTNUM; break; - case 0: return 0; - default: fprintf(stderr, "Invalid token in range spec: `%c'\n", sep); - return 1; - } - - source = end_of_num; + switch (mode) + { + case PARSE_MODE_NEXTNUM: + inv_translate[nr] = dest_nr; + break; + case PARSE_MODE_RANGE: + for (i = range_start; i <= nr; i++) + inv_translate[i] = dest_nr; + break; + default: + fprintf (stderr, "Internal error at %d\n", __LINE__); + return 1; + }; + + sep = *end_of_num++; + + switch (sep) + { + case '-': + range_start = nr; + mode = PARSE_MODE_RANGE; + break; + case ',': + mode = PARSE_MODE_NEXTNUM; + break; + case 0: + return 0; + default: + fprintf (stderr, "Invalid token in range spec: `%c'\n", sep); + return 1; } - return 0; + + source = end_of_num; + } + return 0; } -int main(int argc,char *argv[]) +int main (int argc, char *argv[]) { - if(argc < 3) { - printf("Usage: %s <inventory ID input range> <inventory ID output>\n", argv[0]); - printf("e.g., %s 501-555 701\n", argv[0]); - exit(0); - } - if (init(argv[1], argv[2])) - return 1; - - mmo_char_convert(); - - return 0; + if (argc < 3) + { + printf + ("Usage: %s <inventory ID input range> <inventory ID output>\n", + argv[0]); + printf ("e.g., %s 501-555 701\n", argv[0]); + exit (0); + } + if (init (argv[1], argv[2])) + return 1; + + mmo_char_convert (); + + return 0; } - /* satisfy linker */ -void set_termfunc(void (*termfunc)(void)) {}; +void set_termfunc (void (*termfunc) (void)) +{ +}; diff --git a/src/tool/mapfrob.c b/src/tool/mapfrob.c index 7173f0b..d410878 100644 --- a/src/tool/mapfrob.c +++ b/src/tool/mapfrob.c @@ -9,118 +9,126 @@ // Well, this is not terribly elegant, but I don't have that much time. #define MAX_MAP 1024 #define MAP_NAME_SIZE 32 -int maps_nr = 0; -struct { +int maps_nr = 0; +struct +{ char old[MAP_NAME_SIZE], new[MAP_NAME_SIZE]; } maps[MAX_MAP]; -void -transform_point(struct point *p) +void transform_point (struct point *p) { - int k; + int k; - if (!p->map[0]) - return; + if (!p->map[0]) + return; - for (k = 0; k < maps_nr; k++) - if (!strcmp(p->map, maps[k].old)) { - strcpy(p->map, maps[k].new); - return; - } + for (k = 0; k < maps_nr; k++) + if (!strcmp (p->map, maps[k].old)) + { + strcpy (p->map, maps[k].new); + return; + } - fprintf(stderr, "Warning: untranslated map `%s'\n", p->map); + fprintf (stderr, "Warning: untranslated map `%s'\n", p->map); } -void -transform_char(struct mmo_charstatus *p) +void transform_char (struct mmo_charstatus *p) { - int i; + int i; - transform_point(&p->last_point); - transform_point(&p->save_point); + transform_point (&p->last_point); + transform_point (&p->save_point); - for (i = 0; i < 10; i++) - transform_point(&p->memo_point[i]); + for (i = 0; i < 10; i++) + transform_point (&p->memo_point[i]); } -int mmo_char_convert() +int mmo_char_convert () { - char line[965536]; - int ret; - struct mmo_charstatus char_dat; - FILE *ifp,*ofp; - - ifp=stdin; - ofp=stdout; - while(fgets(line,65535,ifp)){ - memset(&char_dat,0,sizeof(struct mmo_charstatus)); - ret=mmo_char_fromstr(line,&char_dat); - if(ret){ - transform_char(&char_dat); - mmo_char_tostr(line,&char_dat); - fprintf(ofp,"%s" RETCODE,line); - } + char line[965536]; + int ret; + struct mmo_charstatus char_dat; + FILE *ifp, *ofp; + + ifp = stdin; + ofp = stdout; + while (fgets (line, 65535, ifp)) + { + memset (&char_dat, 0, sizeof (struct mmo_charstatus)); + ret = mmo_char_fromstr (line, &char_dat); + if (ret) + { + transform_char (&char_dat); + mmo_char_tostr (line, &char_dat); + fprintf (ofp, "%s" RETCODE, line); } - fcloseall(); - return 0; + } + fcloseall (); + return 0; } #define PARSE_MODE_NEXTNUM 0 #define PARSE_MODE_RANGE 1 -int init(int count, char **translates) +int init (int count, char **translates) { - int i; - char *suffix = ".gat"; - - for (i = 0; i < count; i++) { - char *src = translates[i]; - char *dest = strchr(src, ':'); - - if (!dest) { - fprintf(stderr, "Missing colon in: `%s'\n", src); - return 1; - } + int i; + char *suffix = ".gat"; + + for (i = 0; i < count; i++) + { + char *src = translates[i]; + char *dest = strchr (src, ':'); + + if (!dest) + { + fprintf (stderr, "Missing colon in: `%s'\n", src); + return 1; + } - *dest++ = 0; + *dest++ = 0; - if (strlen(src) + strlen(suffix) >= MAP_NAME_SIZE) { - fprintf(stderr, "Map name prefix too long: `%s'\n", src); - return 1; - } + if (strlen (src) + strlen (suffix) >= MAP_NAME_SIZE) + { + fprintf (stderr, "Map name prefix too long: `%s'\n", src); + return 1; + } - if (strlen(dest) + strlen(suffix) >= MAP_NAME_SIZE) { - fprintf(stderr, "Map name prefix too long: `%s'\n", dest); - return 1; - } + if (strlen (dest) + strlen (suffix) >= MAP_NAME_SIZE) + { + fprintf (stderr, "Map name prefix too long: `%s'\n", dest); + return 1; + } - strncpy(maps[maps_nr].old, src, MAP_NAME_SIZE); - strcat(maps[maps_nr].old, suffix); - strncpy(maps[maps_nr].new, dest, MAP_NAME_SIZE); - strcat(maps[maps_nr].new, suffix); + strncpy (maps[maps_nr].old, src, MAP_NAME_SIZE); + strcat (maps[maps_nr].old, suffix); + strncpy (maps[maps_nr].new, dest, MAP_NAME_SIZE); + strcat (maps[maps_nr].new, suffix); - ++maps_nr; - } + ++maps_nr; + } - return 0; + return 0; } -int main(int argc,char *argv[]) +int main (int argc, char *argv[]) { - if(argc < 2) { - printf("Usage: %s oldmap0:newmap0 oldmap1:newmap1 ...\n", argv[0]); - printf("e.g., %s new_1-1:001-2 new_2-1:001-1\n", argv[0]); - puts("The extension `.gat' is appended implicitly."); - exit(0); - } - if (init(argc - 1, argv + 1)) - return 1; - - mmo_char_convert(); - - return 0; + if (argc < 2) + { + printf ("Usage: %s oldmap0:newmap0 oldmap1:newmap1 ...\n", argv[0]); + printf ("e.g., %s new_1-1:001-2 new_2-1:001-1\n", argv[0]); + puts ("The extension `.gat' is appended implicitly."); + exit (0); + } + if (init (argc - 1, argv + 1)) + return 1; + + mmo_char_convert (); + + return 0; } - /* satisfy linker */ -void set_termfunc(void (*termfunc)(void)) {}; +void set_termfunc (void (*termfunc) (void)) +{ +}; diff --git a/src/tool/skillfrob.c b/src/tool/skillfrob.c index 3d6132c..ea68660 100644 --- a/src/tool/skillfrob.c +++ b/src/tool/skillfrob.c @@ -8,72 +8,78 @@ unsigned char skills[MAX_SKILL]; -void transform_char(struct mmo_charstatus *p) +void transform_char (struct mmo_charstatus *p) { - int i; + int i; - for (i = 0; i < MAX_SKILL; i++) - { - if (skills[(*p).skill[i].id]) - { - (*p).skill[i].lv = 0; - (*p).skill[i].flags = 0; - } - } + for (i = 0; i < MAX_SKILL; i++) + { + if (skills[(*p).skill[i].id]) + { + (*p).skill[i].lv = 0; + (*p).skill[i].flags = 0; + } + } } -int mmo_char_convert() +int mmo_char_convert () { - char line[965536]; - int ret; - struct mmo_charstatus char_dat; - FILE *ifp,*ofp; + char line[965536]; + int ret; + struct mmo_charstatus char_dat; + FILE *ifp, *ofp; - ifp=stdin; - ofp=stdout; - while(fgets(line,65535,ifp)){ - memset(&char_dat,0,sizeof(struct mmo_charstatus)); - ret=mmo_char_fromstr(line,&char_dat); - if(ret){ - transform_char(&char_dat); - mmo_char_tostr(line,&char_dat); - fprintf(ofp,"%s" RETCODE,line); - } + ifp = stdin; + ofp = stdout; + while (fgets (line, 65535, ifp)) + { + memset (&char_dat, 0, sizeof (struct mmo_charstatus)); + ret = mmo_char_fromstr (line, &char_dat); + if (ret) + { + transform_char (&char_dat); + mmo_char_tostr (line, &char_dat); + fprintf (ofp, "%s" RETCODE, line); } - fcloseall(); - return 0; + } + fcloseall (); + return 0; } -int init(int count, char **translates) +int init (int count, char **translates) { - int i, skill; + int i, skill; - memset(skills, 0, sizeof(skills)); + memset (skills, 0, sizeof (skills)); - for (i = 0; i < count; i++) { - skill = atoi(translates[i]); - if (skill > 0) - { - skills[skill] = 1; - } + for (i = 0; i < count; i++) + { + skill = atoi (translates[i]); + if (skill > 0) + { + skills[skill] = 1; } + } - return 0; + return 0; } -int main(int argc,char *argv[]) +int main (int argc, char *argv[]) { - if(argc < 2) { - printf("Usage: %s skillid1 skillid2 ...\n", argv[0]); - exit(0); - } - if (init(argc - 1, argv + 1)) - return 1; + if (argc < 2) + { + printf ("Usage: %s skillid1 skillid2 ...\n", argv[0]); + exit (0); + } + if (init (argc - 1, argv + 1)) + return 1; - mmo_char_convert(); + mmo_char_convert (); - return 0; + return 0; } /* satisfy linker */ -void set_termfunc(void (*termfunc)(void)) {}; +void set_termfunc (void (*termfunc) (void)) +{ +}; diff --git a/src/txt-converter/char/char-converter.c b/src/txt-converter/char/char-converter.c index 1890049..8b4336f 100644 --- a/src/txt-converter/char/char-converter.c +++ b/src/txt-converter/char/char-converter.c @@ -14,829 +14,958 @@ #include <string.h> #include <arpa/inet.h> - #define STORAGE_MEMINC 16 - + #include "char.h" #include "strlib.h" #ifdef MEMWATCH #include "memwatch.h" #endif - -char pet_txt[256]="save/pet.txt"; -char storage_txt[256]="save/storage.txt"; + +char pet_txt[256] = "save/pet.txt"; +char storage_txt[256] = "save/storage.txt"; MYSQL mysql_handle; -MYSQL_RES* sql_res ; -MYSQL_ROW sql_row ; -int sql_fields, sql_cnt; +MYSQL_RES *sql_res; +MYSQL_ROW sql_row; +int sql_fields, sql_cnt; char tmp_sql[65535]; -int db_server_port = 3306; +int db_server_port = 3306; char db_server_ip[16] = "127.0.0.1"; char db_server_id[32] = "ragnarok"; char db_server_pw[32] = "ragnarok"; char db_server_logindb[32] = "ragnarok"; -struct storage *storage=NULL; +struct storage *storage = NULL; struct mmo_map_server server[MAX_MAP_SERVERS]; -int server_fd[MAX_MAP_SERVERS]; +int server_fd[MAX_MAP_SERVERS]; -int login_fd; +int login_fd; char userid[24]; char passwd[24]; char server_name[20]; char login_ip_str[16]; -int login_port = 6900; +int login_port = 6900; char char_ip_str[16]; -int char_ip; -int char_port = 6121; -int char_maintenance; -int char_new; +int char_ip; +int char_port = 6121; +int char_maintenance; +int char_new; char char_txt[256]; char t_name[256]; #define CHAR_STATE_WAITAUTH 0 #define CHAR_STATE_AUTHOK 1 -struct char_session_data{ - int state; - int account_id, login_id1, login_id2, sex; - int found_char[9]; +struct char_session_data +{ + int state; + int account_id, login_id1, login_id2, sex; + int found_char[9]; }; #define AUTH_FIFO_SIZE 256 -struct { - int account_id, char_id, login_id1, char_pos, delflag, sex; +struct +{ + int account_id, char_id, login_id1, char_pos, delflag, sex; } auth_fifo[AUTH_FIFO_SIZE]; -int auth_fifo_pos=0; +int auth_fifo_pos = 0; -int char_id_count=100000; +int char_id_count = 100000; struct mmo_charstatus *char_dat; -int char_num, char_max; -int max_connect_user=0; -int autosave_interval=DEFAULT_AUTOSAVE_INTERVAL; +int char_num, char_max; +int max_connect_user = 0; +int autosave_interval = DEFAULT_AUTOSAVE_INTERVAL; // テハア タァト。(conf ニトタマキホコホナヘ タ郛ウチ、 ー。エノ) -struct point start_point={"new_1-1.gat", 53,111}; - +struct point start_point = { "new_1-1.gat", 53, 111 }; - -int inter_pet_fromstr(char *str, struct s_pet *p) +int inter_pet_fromstr (char *str, struct s_pet *p) { - int s; - int tmp_int[16]; - char tmp_str[256]; - - memset(p, 0, sizeof(struct s_pet)); - -// printf("sscanf pet main info\n"); - s=sscanf(str,"%d, %d,%[^\t]\t%d, %d, %d, %d, %d, %d, %d, %d, %d", &tmp_int[0], &tmp_int[1], tmp_str, &tmp_int[2], - &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10]); - - if(s!=12) - return 1; - - p->pet_id = tmp_int[0]; - p->class = tmp_int[1]; - memcpy(p->name, tmp_str, 24); - p->account_id = tmp_int[2]; - p->char_id = tmp_int[3]; - p->level = tmp_int[4]; - p->egg_id = tmp_int[5]; - p->equip = tmp_int[6]; - p->intimate = tmp_int[7]; - p->hungry = tmp_int[8]; - p->rename_flag = tmp_int[9]; - p->incuvate = tmp_int[10]; - - if(p->hungry < 0) - p->hungry = 0; - else if(p->hungry > 100) - p->hungry = 100; - if(p->intimate < 0) - p->intimate = 0; - else if(p->intimate > 1000) - p->intimate = 1000; - - return 0; + int s; + int tmp_int[16]; + char tmp_str[256]; + + memset (p, 0, sizeof (struct s_pet)); + +// printf("sscanf pet main info\n"); + s = sscanf (str, "%d, %d,%[^\t]\t%d, %d, %d, %d, %d, %d, %d, %d, %d", + &tmp_int[0], &tmp_int[1], tmp_str, &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], + &tmp_int[8], &tmp_int[9], &tmp_int[10]); + + if (s != 12) + return 1; + + p->pet_id = tmp_int[0]; + p->class = tmp_int[1]; + memcpy (p->name, tmp_str, 24); + p->account_id = tmp_int[2]; + p->char_id = tmp_int[3]; + p->level = tmp_int[4]; + p->egg_id = tmp_int[5]; + p->equip = tmp_int[6]; + p->intimate = tmp_int[7]; + p->hungry = tmp_int[8]; + p->rename_flag = tmp_int[9]; + p->incuvate = tmp_int[10]; + + if (p->hungry < 0) + p->hungry = 0; + else if (p->hungry > 100) + p->hungry = 100; + if (p->intimate < 0) + p->intimate = 0; + else if (p->intimate > 1000) + p->intimate = 1000; + + return 0; } + //--------------------------------------------------------- -int inter_pet_tosql(int pet_id, struct s_pet *p) { - //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) - - char tmp_sql[65535]; - MYSQL_RES* sql_res ; - MYSQL_ROW sql_row ; - - jstrescapecpy (t_name, p->name); - if(p->hungry < 0) - p->hungry = 0; - else if(p->hungry > 100) - p->hungry = 100; - if(p->intimate < 0) - p->intimate = 0; - else if(p->intimate > 1000) - p->intimate = 1000; - sprintf(tmp_sql,"SELECT * FROM `pet` WHERE `pet_id`='%d'",pet_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - sql_res = mysql_store_result(&mysql_handle) ; - sql_row = mysql_fetch_row(sql_res); //row fetching - if (!sql_row) //no row -> insert - sprintf(tmp_sql,"INSERT INTO `pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) VALUES ('%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", - p->pet_id, p->class, t_name, p->account_id, p->char_id, p->level, p->egg_id, - p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate); - else //row reside -> updating - sprintf(tmp_sql, "UPDATE `pet` SET `class`='%d',`name`='%s',`account_id`='%d',`char_id`='%d',`level`='%d',`egg_id`='%d',`equip`='%d',`intimate`='%d',`hungry`='%d',`rename_flag`='%d',`incuvate`='%d' WHERE `pet_id`='%d'", - p->class, t_name, p->account_id, p->char_id, p->level, p->egg_id, - p->equip, p->intimate, p->hungry, p->rename_flag, p->incuvate, p->pet_id); - mysql_free_result(sql_res) ; //resource free - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - - printf ("pet dump success! - %d:%s\n", pet_id, p->name); - - return 0; +int inter_pet_tosql (int pet_id, struct s_pet *p) +{ + //`pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) + + char tmp_sql[65535]; + MYSQL_RES *sql_res; + MYSQL_ROW sql_row; + + jstrescapecpy (t_name, p->name); + if (p->hungry < 0) + p->hungry = 0; + else if (p->hungry > 100) + p->hungry = 100; + if (p->intimate < 0) + p->intimate = 0; + else if (p->intimate > 1000) + p->intimate = 1000; + sprintf (tmp_sql, "SELECT * FROM `pet` WHERE `pet_id`='%d'", pet_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + sql_res = mysql_store_result (&mysql_handle); + sql_row = mysql_fetch_row (sql_res); //row fetching + if (!sql_row) //no row -> insert + sprintf (tmp_sql, + "INSERT INTO `pet` (`pet_id`, `class`,`name`,`account_id`,`char_id`,`level`,`egg_id`,`equip`,`intimate`,`hungry`,`rename_flag`,`incuvate`) VALUES ('%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", + p->pet_id, p->class, t_name, p->account_id, p->char_id, + p->level, p->egg_id, p->equip, p->intimate, p->hungry, + p->rename_flag, p->incuvate); + else //row reside -> updating + sprintf (tmp_sql, + "UPDATE `pet` SET `class`='%d',`name`='%s',`account_id`='%d',`char_id`='%d',`level`='%d',`egg_id`='%d',`equip`='%d',`intimate`='%d',`hungry`='%d',`rename_flag`='%d',`incuvate`='%d' WHERE `pet_id`='%d'", + p->class, t_name, p->account_id, p->char_id, p->level, + p->egg_id, p->equip, p->intimate, p->hungry, p->rename_flag, + p->incuvate, p->pet_id); + mysql_free_result (sql_res); //resource free + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + + printf ("pet dump success! - %d:%s\n", pet_id, p->name); + + return 0; } -int storage_tosql(int account_id,struct storage *p){ - // id -> DB dump - // storage {`account_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`} - int i,j; - - j=0; - - //printf ("starting storage dump to DB - id: %d\n", account_id); - - //delete old data. - sprintf(tmp_sql,"DELETE FROM `storage` WHERE `account_id`='%d'",account_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - - //printf ("all storage item was deleted ok\n"); - - for(i=0;i<MAX_STORAGE;i++) { - //printf ("save storage num: %d (%d:%d)\n",i, p->storage[i].nameid , p->storage[i].amount); - - if( (p->storage[i].nameid) && (p->storage[i].amount) ){ - sprintf(tmp_sql,"INSERT INTO `storage` (`account_id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3`,`broken`) VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", - p->account_id, p->storage[i].nameid, p->storage[i].amount, p->storage[i].equip, - p->storage[i].identify, p->storage[i].refine, p->storage[i].attribute, - p->storage[i].card[0], p->storage[i].card[1], p->storage[i].card[2], p->storage[i].card[3], p->storage[i].broken ); - //printf ("%s\n",tmp_sql); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - j++; - } - } - - printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j); - return 0; +int storage_tosql (int account_id, struct storage *p) +{ + // id -> DB dump + // storage {`account_id`/`id`/`nameid`/`amount`/`equip`/`identify`/`refine`/`attribute`/`card0`/`card1`/`card2`/`card3`} + int i, j; + + j = 0; + + //printf ("starting storage dump to DB - id: %d\n", account_id); + + //delete old data. + sprintf (tmp_sql, "DELETE FROM `storage` WHERE `account_id`='%d'", + account_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + + //printf ("all storage item was deleted ok\n"); + + for (i = 0; i < MAX_STORAGE; i++) + { + //printf ("save storage num: %d (%d:%d)\n",i, p->storage[i].nameid , p->storage[i].amount); + + if ((p->storage[i].nameid) && (p->storage[i].amount)) + { + sprintf (tmp_sql, + "INSERT INTO `storage` (`account_id`,`nameid`,`amount`,`equip`,`identify`,`refine`,`attribute`,`card0`,`card1`,`card2`,`card3`,`broken`) VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", + p->account_id, p->storage[i].nameid, + p->storage[i].amount, p->storage[i].equip, + p->storage[i].identify, p->storage[i].refine, + p->storage[i].attribute, p->storage[i].card[0], + p->storage[i].card[1], p->storage[i].card[2], + p->storage[i].card[3], p->storage[i].broken); + //printf ("%s\n",tmp_sql); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error - %s\n", + mysql_error (&mysql_handle)); + } + j++; + } + } + + printf ("storage dump to DB - id: %d (total: %d)\n", account_id, j); + return 0; } + // char to storage -int storage_fromstr(char *str, struct storage *p) +int storage_fromstr (char *str, struct storage *p) { - int tmp_int[256]; - int set, next, len, i; - - set=sscanf(str,"%d, %d%n", &tmp_int[0], &tmp_int[1], &next); - p->storage_amount=tmp_int[1]; - - if(set!=2) - return 0; - if(str[next]=='\n' || str[next]=='\r') - return 1; - next++; - for(i=0;str[next] && str[next]!='\t';i++){ - if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &len) == 12) { - p->storage[i].id = tmp_int[0]; - p->storage[i].nameid = tmp_int[1]; - p->storage[i].amount = tmp_int[2]; - p->storage[i].equip = tmp_int[3]; - p->storage[i].identify = tmp_int[4]; - p->storage[i].refine = tmp_int[5]; - p->storage[i].attribute = tmp_int[6]; - p->storage[i].card[0] = tmp_int[7]; - p->storage[i].card[1] = tmp_int[8]; - p->storage[i].card[2] = tmp_int[9]; - p->storage[i].card[3] = tmp_int[10]; - p->storage[i].broken = tmp_int[11]; - next += len; - if (str[next] == ' ') - next++; - } - - else if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) { - p->storage[i].id = tmp_int[0]; - p->storage[i].nameid = tmp_int[1]; - p->storage[i].amount = tmp_int[2]; - p->storage[i].equip = tmp_int[3]; - p->storage[i].identify = tmp_int[4]; - p->storage[i].refine = tmp_int[5]; - p->storage[i].attribute = tmp_int[6]; - p->storage[i].card[0] = tmp_int[7]; - p->storage[i].card[1] = tmp_int[8]; - p->storage[i].card[2] = tmp_int[9]; - p->storage[i].card[3] = tmp_int[10]; - p->storage[i].broken = 0; - next += len; - if (str[next] == ' ') - next++; - } - - else return 0; - } - return 1; + int tmp_int[256]; + int set, next, len, i; + + set = sscanf (str, "%d, %d%n", &tmp_int[0], &tmp_int[1], &next); + p->storage_amount = tmp_int[1]; + + if (set != 2) + return 0; + if (str[next] == '\n' || str[next] == '\r') + return 1; + next++; + for (i = 0; str[next] && str[next] != '\t'; i++) + { + if (sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &tmp_int[11], &len) == 12) + { + p->storage[i].id = tmp_int[0]; + p->storage[i].nameid = tmp_int[1]; + p->storage[i].amount = tmp_int[2]; + p->storage[i].equip = tmp_int[3]; + p->storage[i].identify = tmp_int[4]; + p->storage[i].refine = tmp_int[5]; + p->storage[i].attribute = tmp_int[6]; + p->storage[i].card[0] = tmp_int[7]; + p->storage[i].card[1] = tmp_int[8]; + p->storage[i].card[2] = tmp_int[9]; + p->storage[i].card[3] = tmp_int[10]; + p->storage[i].broken = tmp_int[11]; + next += len; + if (str[next] == ' ') + next++; + } + + else if (sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &len) == 11) + { + p->storage[i].id = tmp_int[0]; + p->storage[i].nameid = tmp_int[1]; + p->storage[i].amount = tmp_int[2]; + p->storage[i].equip = tmp_int[3]; + p->storage[i].identify = tmp_int[4]; + p->storage[i].refine = tmp_int[5]; + p->storage[i].attribute = tmp_int[6]; + p->storage[i].card[0] = tmp_int[7]; + p->storage[i].card[1] = tmp_int[8]; + p->storage[i].card[2] = tmp_int[9]; + p->storage[i].card[3] = tmp_int[10]; + p->storage[i].broken = 0; + next += len; + if (str[next] == ' ') + next++; + } + + else + return 0; + } + return 1; } ///////////////////////////////// -int mmo_char_fromstr(char *str, struct mmo_charstatus *p) { - int tmp_int[256]; - int set, next, len, i; - - // initilialise character - memset(p, '\0', sizeof(struct mmo_charstatus)); - - // If it's not char structure of version 1008 and after - if ((set = sscanf(str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" - "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" - "\t%[^,],%d,%d\t%[^,],%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, // - &tmp_int[3], &tmp_int[4], &tmp_int[5], - &tmp_int[6], &tmp_int[7], &tmp_int[8], - &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], - &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], - &tmp_int[19], &tmp_int[20], - &tmp_int[21], &tmp_int[22], &tmp_int[23], // - &tmp_int[24], &tmp_int[25], &tmp_int[26], - &tmp_int[27], &tmp_int[28], &tmp_int[29], - &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34], - p->last_point.map, &tmp_int[35], &tmp_int[36], // - p->save_point.map, &tmp_int[37], &tmp_int[38], &tmp_int[39], &next)) != 43) { - tmp_int[39] = 0; // partner id - // If not char structure from version 384 to 1007 - if ((set = sscanf(str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" - "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" - "\t%[^,],%d,%d\t%[^,],%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, // - &tmp_int[3], &tmp_int[4], &tmp_int[5], - &tmp_int[6], &tmp_int[7], &tmp_int[8], - &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], - &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], - &tmp_int[19], &tmp_int[20], - &tmp_int[21], &tmp_int[22], &tmp_int[23], // - &tmp_int[24], &tmp_int[25], &tmp_int[26], - &tmp_int[27], &tmp_int[28], &tmp_int[29], - &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34], - p->last_point.map, &tmp_int[35], &tmp_int[36], // - p->save_point.map, &tmp_int[37], &tmp_int[38], &next)) != 42) { - // It's char structure of a version before 384 - tmp_int[26] = 0; // pet id - set = sscanf(str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" - "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" - "\t%[^,],%d,%d\t%[^,],%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, // - &tmp_int[3], &tmp_int[4], &tmp_int[5], - &tmp_int[6], &tmp_int[7], &tmp_int[8], - &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], - &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], - &tmp_int[19], &tmp_int[20], - &tmp_int[21], &tmp_int[22], &tmp_int[23], // - &tmp_int[24], &tmp_int[25], // - &tmp_int[27], &tmp_int[28], &tmp_int[29], - &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34], - p->last_point.map, &tmp_int[35], &tmp_int[36], // - p->save_point.map, &tmp_int[37], &tmp_int[38], &next); - set += 2; - //printf("char: old char data ver.1\n"); - // Char structure of version 1007 or older - } else { - set++; - //printf("char: old char data ver.2\n"); - } - // Char structure of version 1008+ - } else { - //printf("char: new char data ver.3\n"); - } - if (set != 43) - return 0; - - p->char_id = tmp_int[0]; - p->account_id = tmp_int[1]; - p->char_num = tmp_int[2]; - p->class = tmp_int[3]; - p->base_level = tmp_int[4]; - p->job_level = tmp_int[5]; - p->base_exp = tmp_int[6]; - p->job_exp = tmp_int[7]; - p->zeny = tmp_int[8]; - p->hp = tmp_int[9]; - p->max_hp = tmp_int[10]; - p->sp = tmp_int[11]; - p->max_sp = tmp_int[12]; - p->str = tmp_int[13]; - p->agi = tmp_int[14]; - p->vit = tmp_int[15]; - p->int_ = tmp_int[16]; - p->dex = tmp_int[17]; - p->luk = tmp_int[18]; - p->status_point = tmp_int[19]; - p->skill_point = tmp_int[20]; - p->option = tmp_int[21]; - p->karma = tmp_int[22]; - p->manner = tmp_int[23]; - p->party_id = tmp_int[24]; - p->guild_id = tmp_int[25]; - p->pet_id = tmp_int[26]; - p->hair = tmp_int[27]; - p->hair_color = tmp_int[28]; - p->clothes_color = tmp_int[29]; - p->weapon = tmp_int[30]; - p->shield = tmp_int[31]; - p->head_top = tmp_int[32]; - p->head_mid = tmp_int[33]; - p->head_bottom = tmp_int[34]; - p->last_point.x = tmp_int[35]; - p->last_point.y = tmp_int[36]; - p->save_point.x = tmp_int[37]; - p->save_point.y = tmp_int[38]; - p->partner_id = tmp_int[39]; - - // Some checks - for(i = 0; i < char_num; i++) { - if (char_dat[i].char_id == p->char_id) { - printf("\033[1;31mmmo_auth_init: ******Error: a character has an identical id to another.\n"); - printf(" character id #%d -> new character not readed.\n", p->char_id); - printf(" Character saved in log file.\033[0m\n"); - return -1; - } else if (strcmp(char_dat[i].name, p->name) == 0) { - printf("\033[1;31mmmo_auth_init: ******Error: character name already exists.\n"); - printf(" character name '%s' -> new character not readed.\n", p->name); - printf(" Character saved in log file.\033[0m\n"); - return -2; - } - } - - if (str[next] == '\n' || str[next] == '\r') - return 1; // 新規データ - - next++; - - for(i = 0; str[next] && str[next] != '\t'; i++) { - set = sscanf(str+next, "%[^,],%d,%d%n", p->memo_point[i].map, &tmp_int[0], &tmp_int[1], &len); - if (set != 3) - return -3; - p->memo_point[i].x = tmp_int[0]; - p->memo_point[i].y = tmp_int[1]; - next += len; - if (str[next] == ' ') - next++; - } - - next++; - - for(i = 0; str[next] && str[next] != '\t'; i++) { - if (sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &len) == 12) { - // do nothing, it's ok - } else if(sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) { - tmp_int[11] = 0; // broken doesn't exist in this version -> 0 - } else // invalid structure - return -4; - p->inventory[i].id = tmp_int[0]; - p->inventory[i].nameid = tmp_int[1]; - p->inventory[i].amount = tmp_int[2]; - p->inventory[i].equip = tmp_int[3]; - p->inventory[i].identify = tmp_int[4]; - p->inventory[i].refine = tmp_int[5]; - p->inventory[i].attribute = tmp_int[6]; - p->inventory[i].card[0] = tmp_int[7]; - p->inventory[i].card[1] = tmp_int[8]; - p->inventory[i].card[2] = tmp_int[9]; - p->inventory[i].card[3] = tmp_int[10]; - p->inventory[i].broken = tmp_int[11]; - next += len; - if (str[next] == ' ') - next++; - } - - next++; - - for(i = 0; str[next] && str[next] != '\t'; i++) { - if (sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &len) == 12) { - // do nothing, it's ok - } else if (sscanf(str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", - &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], - &tmp_int[4], &tmp_int[5], &tmp_int[6], - &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &len) == 11) { - tmp_int[11] = 0; // broken doesn't exist in this version -> 0 - } else // invalid structure - return -5; - p->cart[i].id = tmp_int[0]; - p->cart[i].nameid = tmp_int[1]; - p->cart[i].amount = tmp_int[2]; - p->cart[i].equip = tmp_int[3]; - p->cart[i].identify = tmp_int[4]; - p->cart[i].refine = tmp_int[5]; - p->cart[i].attribute = tmp_int[6]; - p->cart[i].card[0] = tmp_int[7]; - p->cart[i].card[1] = tmp_int[8]; - p->cart[i].card[2] = tmp_int[9]; - p->cart[i].card[3] = tmp_int[10]; - p->cart[i].broken = tmp_int[11]; - next += len; - if (str[next] == ' ') - next++; - } - - next++; - - for(i = 0; str[next] && str[next] != '\t'; i++) { - set = sscanf(str + next, "%d,%d%n", &tmp_int[0], &tmp_int[1], &len); - if (set != 2) - return -6; - p->skill[tmp_int[0]].id = tmp_int[0]; - p->skill[tmp_int[0]].lv = tmp_int[1]; - next += len; - if (str[next] == ' ') - next++; - } - - next++; - - for(i = 0; str[next] && str[next] != '\t' && str[next] != '\n' && str[next] != '\r'; i++) { // global_reg実装以前のathena.txt互換のため一応'\n'チェック - set = sscanf(str + next, "%[^,],%d%n", p->global_reg[i].str, &p->global_reg[i].value, &len); - if (set != 2) { - // because some scripts are not correct, the str can be "". So, we must check that. - // If it's, we must not refuse the character, but just this REG value. - // Character line will have something like: nov_2nd_cos,9 ,9 nov_1_2_cos_c,1 (here, ,9 is not good) - if (str[next] == ',' && sscanf(str + next, ",%d%n", &p->global_reg[i].value, &len) == 1) - i--; - else - return -7; - } - next += len; - if (str[next] == ' ') - next++; - } - p->global_reg_num = i; - - return 1; +int mmo_char_fromstr (char *str, struct mmo_charstatus *p) +{ + int tmp_int[256]; + int set, next, len, i; + + // initilialise character + memset (p, '\0', sizeof (struct mmo_charstatus)); + + // If it's not char structure of version 1008 and after + if ((set = sscanf (str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" "\t%[^,],%d,%d\t%[^,],%d,%d,%d%n", &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, // + &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], &tmp_int[19], &tmp_int[20], &tmp_int[21], &tmp_int[22], &tmp_int[23], // + &tmp_int[24], &tmp_int[25], &tmp_int[26], &tmp_int[27], &tmp_int[28], &tmp_int[29], &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34], p->last_point.map, &tmp_int[35], &tmp_int[36], // + p->save_point.map, &tmp_int[37], &tmp_int[38], + &tmp_int[39], &next)) != 43) + { + tmp_int[39] = 0; // partner id + // If not char structure from version 384 to 1007 + if ((set = sscanf (str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" "\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" "\t%[^,],%d,%d\t%[^,],%d,%d%n", &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, // + &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], &tmp_int[19], &tmp_int[20], &tmp_int[21], &tmp_int[22], &tmp_int[23], // + &tmp_int[24], &tmp_int[25], &tmp_int[26], &tmp_int[27], &tmp_int[28], &tmp_int[29], &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34], p->last_point.map, &tmp_int[35], &tmp_int[36], // + p->save_point.map, &tmp_int[37], &tmp_int[38], + &next)) != 42) + { + // It's char structure of a version before 384 + tmp_int[26] = 0; // pet id + set = sscanf (str, "%d\t%d,%d\t%[^\t]\t%d,%d,%d\t%d,%d,%d\t%d,%d,%d,%d\t%d,%d,%d,%d,%d,%d\t%d,%d" "\t%d,%d,%d\t%d,%d\t%d,%d,%d\t%d,%d,%d,%d,%d" "\t%[^,],%d,%d\t%[^,],%d,%d%n", &tmp_int[0], &tmp_int[1], &tmp_int[2], p->name, // + &tmp_int[3], &tmp_int[4], &tmp_int[5], &tmp_int[6], &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], &tmp_int[11], &tmp_int[12], &tmp_int[13], &tmp_int[14], &tmp_int[15], &tmp_int[16], &tmp_int[17], &tmp_int[18], &tmp_int[19], &tmp_int[20], &tmp_int[21], &tmp_int[22], &tmp_int[23], // + &tmp_int[24], &tmp_int[25], // + &tmp_int[27], &tmp_int[28], &tmp_int[29], &tmp_int[30], &tmp_int[31], &tmp_int[32], &tmp_int[33], &tmp_int[34], p->last_point.map, &tmp_int[35], &tmp_int[36], // + p->save_point.map, &tmp_int[37], &tmp_int[38], + &next); + set += 2; + //printf("char: old char data ver.1\n"); + // Char structure of version 1007 or older + } + else + { + set++; + //printf("char: old char data ver.2\n"); + } + // Char structure of version 1008+ + } + else + { + //printf("char: new char data ver.3\n"); + } + if (set != 43) + return 0; + + p->char_id = tmp_int[0]; + p->account_id = tmp_int[1]; + p->char_num = tmp_int[2]; + p->class = tmp_int[3]; + p->base_level = tmp_int[4]; + p->job_level = tmp_int[5]; + p->base_exp = tmp_int[6]; + p->job_exp = tmp_int[7]; + p->zeny = tmp_int[8]; + p->hp = tmp_int[9]; + p->max_hp = tmp_int[10]; + p->sp = tmp_int[11]; + p->max_sp = tmp_int[12]; + p->str = tmp_int[13]; + p->agi = tmp_int[14]; + p->vit = tmp_int[15]; + p->int_ = tmp_int[16]; + p->dex = tmp_int[17]; + p->luk = tmp_int[18]; + p->status_point = tmp_int[19]; + p->skill_point = tmp_int[20]; + p->option = tmp_int[21]; + p->karma = tmp_int[22]; + p->manner = tmp_int[23]; + p->party_id = tmp_int[24]; + p->guild_id = tmp_int[25]; + p->pet_id = tmp_int[26]; + p->hair = tmp_int[27]; + p->hair_color = tmp_int[28]; + p->clothes_color = tmp_int[29]; + p->weapon = tmp_int[30]; + p->shield = tmp_int[31]; + p->head_top = tmp_int[32]; + p->head_mid = tmp_int[33]; + p->head_bottom = tmp_int[34]; + p->last_point.x = tmp_int[35]; + p->last_point.y = tmp_int[36]; + p->save_point.x = tmp_int[37]; + p->save_point.y = tmp_int[38]; + p->partner_id = tmp_int[39]; + + // Some checks + for (i = 0; i < char_num; i++) + { + if (char_dat[i].char_id == p->char_id) + { + printf + ("\033[1;31mmmo_auth_init: ******Error: a character has an identical id to another.\n"); + printf + (" character id #%d -> new character not readed.\n", + p->char_id); + printf (" Character saved in log file.\033[0m\n"); + return -1; + } + else if (strcmp (char_dat[i].name, p->name) == 0) + { + printf + ("\033[1;31mmmo_auth_init: ******Error: character name already exists.\n"); + printf + (" character name '%s' -> new character not readed.\n", + p->name); + printf (" Character saved in log file.\033[0m\n"); + return -2; + } + } + + if (str[next] == '\n' || str[next] == '\r') + return 1; // 新規データ + + next++; + + for (i = 0; str[next] && str[next] != '\t'; i++) + { + set = + sscanf (str + next, "%[^,],%d,%d%n", p->memo_point[i].map, + &tmp_int[0], &tmp_int[1], &len); + if (set != 3) + return -3; + p->memo_point[i].x = tmp_int[0]; + p->memo_point[i].y = tmp_int[1]; + next += len; + if (str[next] == ' ') + next++; + } + + next++; + + for (i = 0; str[next] && str[next] != '\t'; i++) + { + if (sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &tmp_int[11], &len) == 12) + { + // do nothing, it's ok + } + else if (sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &len) == 11) + { + tmp_int[11] = 0; // broken doesn't exist in this version -> 0 + } + else // invalid structure + return -4; + p->inventory[i].id = tmp_int[0]; + p->inventory[i].nameid = tmp_int[1]; + p->inventory[i].amount = tmp_int[2]; + p->inventory[i].equip = tmp_int[3]; + p->inventory[i].identify = tmp_int[4]; + p->inventory[i].refine = tmp_int[5]; + p->inventory[i].attribute = tmp_int[6]; + p->inventory[i].card[0] = tmp_int[7]; + p->inventory[i].card[1] = tmp_int[8]; + p->inventory[i].card[2] = tmp_int[9]; + p->inventory[i].card[3] = tmp_int[10]; + p->inventory[i].broken = tmp_int[11]; + next += len; + if (str[next] == ' ') + next++; + } + + next++; + + for (i = 0; str[next] && str[next] != '\t'; i++) + { + if (sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &tmp_int[11], &len) == 12) + { + // do nothing, it's ok + } + else if (sscanf (str + next, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n", + &tmp_int[0], &tmp_int[1], &tmp_int[2], &tmp_int[3], + &tmp_int[4], &tmp_int[5], &tmp_int[6], + &tmp_int[7], &tmp_int[8], &tmp_int[9], &tmp_int[10], + &len) == 11) + { + tmp_int[11] = 0; // broken doesn't exist in this version -> 0 + } + else // invalid structure + return -5; + p->cart[i].id = tmp_int[0]; + p->cart[i].nameid = tmp_int[1]; + p->cart[i].amount = tmp_int[2]; + p->cart[i].equip = tmp_int[3]; + p->cart[i].identify = tmp_int[4]; + p->cart[i].refine = tmp_int[5]; + p->cart[i].attribute = tmp_int[6]; + p->cart[i].card[0] = tmp_int[7]; + p->cart[i].card[1] = tmp_int[8]; + p->cart[i].card[2] = tmp_int[9]; + p->cart[i].card[3] = tmp_int[10]; + p->cart[i].broken = tmp_int[11]; + next += len; + if (str[next] == ' ') + next++; + } + + next++; + + for (i = 0; str[next] && str[next] != '\t'; i++) + { + set = sscanf (str + next, "%d,%d%n", &tmp_int[0], &tmp_int[1], &len); + if (set != 2) + return -6; + p->skill[tmp_int[0]].id = tmp_int[0]; + p->skill[tmp_int[0]].lv = tmp_int[1]; + next += len; + if (str[next] == ' ') + next++; + } + + next++; + + for (i = 0; + str[next] && str[next] != '\t' && str[next] != '\n' + && str[next] != '\r'; i++) + { // global_reg実装以前のathena.txt互換のため一応'\n'チェック + set = + sscanf (str + next, "%[^,],%d%n", p->global_reg[i].str, + &p->global_reg[i].value, &len); + if (set != 2) + { + // because some scripts are not correct, the str can be "". So, we must check that. + // If it's, we must not refuse the character, but just this REG value. + // Character line will have something like: nov_2nd_cos,9 ,9 nov_1_2_cos_c,1 (here, ,9 is not good) + if (str[next] == ',' + && sscanf (str + next, ",%d%n", &p->global_reg[i].value, + &len) == 1) + i--; + else + return -7; + } + next += len; + if (str[next] == ' ') + next++; + } + p->global_reg_num = i; + + return 1; } //========================================================================================================== -int mmo_char_tosql(int char_id, struct mmo_charstatus *p){ - int i,save_flag; - - save_flag = char_id; - printf("request save char data... (%d)\n",char_id); - - //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9 - //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15 - //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21 - //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27 - //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35 - //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`) - sprintf(tmp_sql ,"INSERT INTO `char` SET `char_id`='%d', `account_id`='%d', `char_num`='%d', `name`='%s', `class`='%d', `base_level`='%d', `job_level`='%d'," - "`base_exp`='%d', `job_exp`='%d', `zeny`='%d'," - "`max_hp`='%d',`hp`='%d',`max_sp`='%d',`sp`='%d',`status_point`='%d',`skill_point`='%d'," - "`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d'," - "`option`='%d',`karma`='%d',`manner`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d'," - "`hair`='%d',`hair_color`='%d',`clothes_color`='%d',`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d'," - "`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d', `partner_id` = '%d'", - char_id,p->account_id,p->char_num,p->name,p->class, p->base_level, p->job_level, - p->base_exp, p->job_exp, p->zeny, - p->max_hp, p->hp, p->max_sp, p->sp, p->status_point, p->skill_point, - p->str, p->agi, p->vit, p->int_, p->dex, p->luk, - p->option, p->karma, p->manner, p->party_id, p->guild_id, p->pet_id, - p->hair, p->hair_color, p->clothes_color, - p->weapon, p->shield, p->head_top, p->head_mid, p->head_bottom, - p->last_point.map, p->last_point.x, p->last_point.y, - p->save_point.map, p->save_point.x, p->save_point.y, p->partner_id - ); - - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (update `char`)- %s\n", mysql_error(&mysql_handle) ); - } - - //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`) - sprintf(tmp_sql,"DELETE FROM `memo` WHERE `char_id`='%d'",char_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `memo`)- %s\n", mysql_error(&mysql_handle) ); - } - - //insert here. - for(i=0;i<10;i++){ - if(p->memo_point[i].map[0]){ - sprintf(tmp_sql,"INSERT INTO `memo`(`char_id`,`map`,`x`,`y`) VALUES ('%d', '%s', '%d', '%d')", - char_id, p->memo_point[i].map, p->memo_point[i].x, p->memo_point[i].y); - if(mysql_query(&mysql_handle, tmp_sql) ) - printf("DB server Error (insert `memo`)- %s\n", mysql_error(&mysql_handle) ); - } - } - //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`) - sprintf(tmp_sql,"DELETE FROM `inventory` WHERE `char_id`='%d'",char_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `inventory`)- %s\n", mysql_error(&mysql_handle) ); - } - - //insert here. - for(i=0;i<MAX_INVENTORY;i++){ - if(p->inventory[i].nameid){ - sprintf(tmp_sql,"INSERT INTO `inventory`(`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)" - " VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", - p->inventory[i].id, char_id,p->inventory[i].nameid, p->inventory[i].amount, p->inventory[i].equip, - p->inventory[i].identify, p->inventory[i].refine, p->inventory[i].attribute, - p->inventory[i].card[0], p->inventory[i].card[1], p->inventory[i].card[2], p->inventory[i].card[3], p->inventory[i].broken); - if(mysql_query(&mysql_handle, tmp_sql) ) - printf("DB server Error (insert `inventory`)- %s\n", mysql_error(&mysql_handle) ); - } - } - - //`cart_inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`) - sprintf (tmp_sql, "DELETE FROM `cart_inventory` WHERE `char_id`='%d'", char_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `cart_inventory`)- %s\n", mysql_error(&mysql_handle) ); - } - - //insert here. - for(i=0;i<MAX_CART;i++){ - if(p->cart[i].nameid){ - sprintf(tmp_sql,"INSERT INTO `cart_inventory`(`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)" - " VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d' )", - p->cart[i].id, char_id, p->cart[i].nameid, p->cart[i].amount, p->cart[i].equip, - p->cart[i].identify, p->cart[i].refine, p->cart[i].attribute, - p->cart[i].card[0], p->cart[i].card[1], p->cart[i].card[2], p->cart[i].card[3], p->cart[i].broken ); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (insert `cart_inventory`)- %s\n", mysql_error(&mysql_handle) ); - } - } - } - - - //`skill` (`char_id`, `id`, `lv`) - sprintf(tmp_sql,"DELETE FROM `skill` WHERE `char_id`='%d'",char_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `skill`)- %s\n", mysql_error(&mysql_handle) ); - } - - //insert here. - for(i=0;i<MAX_SKILL;i++){ - if(p->skill[i].id){ - if (p->skill[i].id && p->skill[i].flag!=1) { - sprintf(tmp_sql,"INSERT INTO `skill`(`char_id`,`id`, `lv`) VALUES ('%d', '%d', '%d')", - char_id, p->skill[i].id, (p->skill[i].flag==0)?p->skill[i].lv:p->skill[i].flag-2); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (insert `skill`)- %s\n", mysql_error(&mysql_handle) ); - } - } - } - } - //`global_reg_value` (`char_id`, `str`, `value`) - sprintf(tmp_sql,"DELETE FROM `global_reg_value` WHERE `char_id`='%d'",char_id); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (delete `global_reg_value`)- %s\n", mysql_error(&mysql_handle) ); - } - - //insert here. - for(i=0;i<p->global_reg_num;i++){ - if(p->global_reg[i].value !=0){ - sprintf(tmp_sql,"INSERT INTO `global_reg_value` (`char_id`, `str`, `value`) VALUES ('%d', '%s','%d')", - char_id, p->global_reg[i].str, p->global_reg[i].value); - if(mysql_query(&mysql_handle, tmp_sql) ) { - printf("DB server Error (insert `global_reg_value`)- %s\n", mysql_error(&mysql_handle) ); - } - } - } - - printf("saving char is done... (%d)\n",char_id); - save_flag = 0; - - return 0; +int mmo_char_tosql (int char_id, struct mmo_charstatus *p) +{ + int i, save_flag; + + save_flag = char_id; + printf ("request save char data... (%d)\n", char_id); + + //`char`( `char_id`,`account_id`,`char_num`,`name`,`class`,`base_level`,`job_level`,`base_exp`,`job_exp`,`zeny`, //9 + //`str`,`agi`,`vit`,`int`,`dex`,`luk`, //15 + //`max_hp`,`hp`,`max_sp`,`sp`,`status_point`,`skill_point`, //21 + //`option`,`karma`,`manner`,`party_id`,`guild_id`,`pet_id`, //27 + //`hair`,`hair_color`,`clothes_color`,`weapon`,`shield`,`head_top`,`head_mid`,`head_bottom`, //35 + //`last_map`,`last_x`,`last_y`,`save_map`,`save_x`,`save_y`) + sprintf (tmp_sql, + "INSERT INTO `char` SET `char_id`='%d', `account_id`='%d', `char_num`='%d', `name`='%s', `class`='%d', `base_level`='%d', `job_level`='%d'," + "`base_exp`='%d', `job_exp`='%d', `zeny`='%d'," + "`max_hp`='%d',`hp`='%d',`max_sp`='%d',`sp`='%d',`status_point`='%d',`skill_point`='%d'," + "`str`='%d',`agi`='%d',`vit`='%d',`int`='%d',`dex`='%d',`luk`='%d'," + "`option`='%d',`karma`='%d',`manner`='%d',`party_id`='%d',`guild_id`='%d',`pet_id`='%d'," + "`hair`='%d',`hair_color`='%d',`clothes_color`='%d',`weapon`='%d',`shield`='%d',`head_top`='%d',`head_mid`='%d',`head_bottom`='%d'," + "`last_map`='%s',`last_x`='%d',`last_y`='%d',`save_map`='%s',`save_x`='%d',`save_y`='%d', `partner_id` = '%d'", + char_id, p->account_id, p->char_num, p->name, p->class, + p->base_level, p->job_level, p->base_exp, p->job_exp, p->zeny, + p->max_hp, p->hp, p->max_sp, p->sp, p->status_point, + p->skill_point, p->str, p->agi, p->vit, p->int_, p->dex, p->luk, + p->option, p->karma, p->manner, p->party_id, p->guild_id, + p->pet_id, p->hair, p->hair_color, p->clothes_color, p->weapon, + p->shield, p->head_top, p->head_mid, p->head_bottom, + p->last_point.map, p->last_point.x, p->last_point.y, + p->save_point.map, p->save_point.x, p->save_point.y, + p->partner_id); + + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (update `char`)- %s\n", + mysql_error (&mysql_handle)); + } + + //`memo` (`memo_id`,`char_id`,`map`,`x`,`y`) + sprintf (tmp_sql, "DELETE FROM `memo` WHERE `char_id`='%d'", char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `memo`)- %s\n", + mysql_error (&mysql_handle)); + } + + //insert here. + for (i = 0; i < 10; i++) + { + if (p->memo_point[i].map[0]) + { + sprintf (tmp_sql, + "INSERT INTO `memo`(`char_id`,`map`,`x`,`y`) VALUES ('%d', '%s', '%d', '%d')", + char_id, p->memo_point[i].map, p->memo_point[i].x, + p->memo_point[i].y); + if (mysql_query (&mysql_handle, tmp_sql)) + printf ("DB server Error (insert `memo`)- %s\n", + mysql_error (&mysql_handle)); + } + } + //`inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`) + sprintf (tmp_sql, "DELETE FROM `inventory` WHERE `char_id`='%d'", + char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `inventory`)- %s\n", + mysql_error (&mysql_handle)); + } + + //insert here. + for (i = 0; i < MAX_INVENTORY; i++) + { + if (p->inventory[i].nameid) + { + sprintf (tmp_sql, + "INSERT INTO `inventory`(`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)" + " VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')", + p->inventory[i].id, char_id, p->inventory[i].nameid, + p->inventory[i].amount, p->inventory[i].equip, + p->inventory[i].identify, p->inventory[i].refine, + p->inventory[i].attribute, p->inventory[i].card[0], + p->inventory[i].card[1], p->inventory[i].card[2], + p->inventory[i].card[3], p->inventory[i].broken); + if (mysql_query (&mysql_handle, tmp_sql)) + printf ("DB server Error (insert `inventory`)- %s\n", + mysql_error (&mysql_handle)); + } + } + + //`cart_inventory` (`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`) + sprintf (tmp_sql, "DELETE FROM `cart_inventory` WHERE `char_id`='%d'", + char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `cart_inventory`)- %s\n", + mysql_error (&mysql_handle)); + } + + //insert here. + for (i = 0; i < MAX_CART; i++) + { + if (p->cart[i].nameid) + { + sprintf (tmp_sql, + "INSERT INTO `cart_inventory`(`id`,`char_id`, `nameid`, `amount`, `equip`, `identify`, `refine`, `attribute`, `card0`, `card1`, `card2`, `card3`, `broken`)" + " VALUES ('%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d' )", + p->cart[i].id, char_id, p->cart[i].nameid, + p->cart[i].amount, p->cart[i].equip, p->cart[i].identify, + p->cart[i].refine, p->cart[i].attribute, + p->cart[i].card[0], p->cart[i].card[1], + p->cart[i].card[2], p->cart[i].card[3], + p->cart[i].broken); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `cart_inventory`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + + //`skill` (`char_id`, `id`, `lv`) + sprintf (tmp_sql, "DELETE FROM `skill` WHERE `char_id`='%d'", char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `skill`)- %s\n", + mysql_error (&mysql_handle)); + } + + //insert here. + for (i = 0; i < MAX_SKILL; i++) + { + if (p->skill[i].id) + { + if (p->skill[i].id && p->skill[i].flag != 1) + { + sprintf (tmp_sql, + "INSERT INTO `skill`(`char_id`,`id`, `lv`) VALUES ('%d', '%d', '%d')", + char_id, p->skill[i].id, + (p->skill[i].flag == + 0) ? p->skill[i].lv : p->skill[i].flag - 2); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `skill`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + } + //`global_reg_value` (`char_id`, `str`, `value`) + sprintf (tmp_sql, "DELETE FROM `global_reg_value` WHERE `char_id`='%d'", + char_id); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (delete `global_reg_value`)- %s\n", + mysql_error (&mysql_handle)); + } + + //insert here. + for (i = 0; i < p->global_reg_num; i++) + { + if (p->global_reg[i].value != 0) + { + sprintf (tmp_sql, + "INSERT INTO `global_reg_value` (`char_id`, `str`, `value`) VALUES ('%d', '%s','%d')", + char_id, p->global_reg[i].str, p->global_reg[i].value); + if (mysql_query (&mysql_handle, tmp_sql)) + { + printf ("DB server Error (insert `global_reg_value`)- %s\n", + mysql_error (&mysql_handle)); + } + } + } + + printf ("saving char is done... (%d)\n", char_id); + save_flag = 0; + + return 0; } + //========================================================================================================== -int mmo_char_init(void){ - char line[65536]; - struct s_pet *p; - int ret; - int i=0,set,tmp_int[2], c= 0; - char input; - FILE *fp; - - - //DB connection initialized - mysql_init(&mysql_handle); - printf("Connect DB server.... (inter server)\n"); - if(!mysql_real_connect(&mysql_handle, db_server_ip, db_server_id, db_server_pw, - db_server_logindb ,db_server_port, (char *)NULL, 0)) { - //pointer check - printf("%s\n",mysql_error(&mysql_handle)); - exit(1); - } - else { - printf ("connect success! (inter server)\n"); - } - - - - printf("Warning : Make sure you backup your databases before continuing!\n"); - printf("\nDo you wish to convert your Character Database to SQL? (y/n) : "); - input=getchar(); - if(input == 'y' || input == 'Y'){ - printf("\nConverting Character Database...\n"); - fp=fopen_("save/athena.txt","r"); - char_dat=malloc(sizeof(char_dat[0])*256); - char_max=256; - if(fp==NULL) - return 0; - while(fgets(line, 65535, fp)){ - if(char_num>=char_max){ - char_max+=256; - char_dat=realloc(char_dat, sizeof(char_dat[0]) *char_max); - } - memset(&char_dat[char_num], 0, sizeof(char_dat[0])); - ret=mmo_char_fromstr(line, &char_dat[char_num]); - if(ret){ - mmo_char_tosql(char_dat[char_num].char_id , &char_dat[char_num]); - printf ("convert %d -> DB\n",char_dat[char_num].char_id); - if(char_dat[char_num].char_id>=char_id_count) - char_id_count=char_dat[char_num].char_id+1; - char_num++; - } - } - printf("char data convert end\n"); - fclose_(fp); - } - - while(getchar() != '\n'); - printf("\nDo you wish to convert your Storage Database to SQL? (y/n) : "); - input=getchar(); - if(input == 'y' || input == 'Y') { - printf("\nConverting Storage Database...\n"); - fp=fopen_(storage_txt,"r"); - if(fp==NULL){ - printf("cant't read : %s\n",storage_txt); - return 0; - } - - while(fgets(line,65535,fp)){ - set=sscanf(line,"%d,%d",&tmp_int[0],&tmp_int[1]); - if(set==2) { - if(i==0){ - storage=malloc(sizeof(struct storage)); - }else{ - storage=realloc(storage,sizeof(struct storage)*(i+1)); - } - memset(&storage[i],0,sizeof(struct storage)); - storage[i].account_id=tmp_int[0]; - storage_fromstr(line,&storage[i]); - storage_tosql(tmp_int[0],&storage[i]); //to sql. (dump) - i++; - } - } - fclose_(fp); - } - - while(getchar() != '\n'); - printf("\nDo you wish to convert your Pet Database to SQL? (y/n) : "); - input=getchar(); - if(input == 'y' || input == 'Y') { - printf("\nConverting Pet Database...\n"); - if( (fp=fopen_(pet_txt,"r")) ==NULL ) - return 1; - - p=malloc(sizeof(struct s_pet)); - while(fgets(line, sizeof(line), fp)){ - if(p==NULL){ - printf("int_pet: out of memory!\n"); - exit(0); - } - if(inter_pet_fromstr(line, p)==0 && p->pet_id>0){ - //pet dump - inter_pet_tosql(p->pet_id,p); - }else{ - printf("int_pet: broken data [%s] line %d\n", pet_txt, c); - } - c++; - } - fclose_(fp); - } - - return 0; +int mmo_char_init (void) +{ + char line[65536]; + struct s_pet *p; + int ret; + int i = 0, set, tmp_int[2], c = 0; + char input; + FILE *fp; + + //DB connection initialized + mysql_init (&mysql_handle); + printf ("Connect DB server.... (inter server)\n"); + if (!mysql_real_connect + (&mysql_handle, db_server_ip, db_server_id, db_server_pw, + db_server_logindb, db_server_port, (char *) NULL, 0)) + { + //pointer check + printf ("%s\n", mysql_error (&mysql_handle)); + exit (1); + } + else + { + printf ("connect success! (inter server)\n"); + } + + printf + ("Warning : Make sure you backup your databases before continuing!\n"); + printf + ("\nDo you wish to convert your Character Database to SQL? (y/n) : "); + input = getchar (); + if (input == 'y' || input == 'Y') + { + printf ("\nConverting Character Database...\n"); + fp = fopen_ ("save/athena.txt", "r"); + char_dat = malloc (sizeof (char_dat[0]) * 256); + char_max = 256; + if (fp == NULL) + return 0; + while (fgets (line, 65535, fp)) + { + if (char_num >= char_max) + { + char_max += 256; + char_dat = + realloc (char_dat, sizeof (char_dat[0]) * char_max); + } + memset (&char_dat[char_num], 0, sizeof (char_dat[0])); + ret = mmo_char_fromstr (line, &char_dat[char_num]); + if (ret) + { + mmo_char_tosql (char_dat[char_num].char_id, + &char_dat[char_num]); + printf ("convert %d -> DB\n", char_dat[char_num].char_id); + if (char_dat[char_num].char_id >= char_id_count) + char_id_count = char_dat[char_num].char_id + 1; + char_num++; + } + } + printf ("char data convert end\n"); + fclose_ (fp); + } + + while (getchar () != '\n'); + printf + ("\nDo you wish to convert your Storage Database to SQL? (y/n) : "); + input = getchar (); + if (input == 'y' || input == 'Y') + { + printf ("\nConverting Storage Database...\n"); + fp = fopen_ (storage_txt, "r"); + if (fp == NULL) + { + printf ("cant't read : %s\n", storage_txt); + return 0; + } + + while (fgets (line, 65535, fp)) + { + set = sscanf (line, "%d,%d", &tmp_int[0], &tmp_int[1]); + if (set == 2) + { + if (i == 0) + { + storage = malloc (sizeof (struct storage)); + } + else + { + storage = + realloc (storage, sizeof (struct storage) * (i + 1)); + } + memset (&storage[i], 0, sizeof (struct storage)); + storage[i].account_id = tmp_int[0]; + storage_fromstr (line, &storage[i]); + storage_tosql (tmp_int[0], &storage[i]); //to sql. (dump) + i++; + } + } + fclose_ (fp); + } + + while (getchar () != '\n'); + printf ("\nDo you wish to convert your Pet Database to SQL? (y/n) : "); + input = getchar (); + if (input == 'y' || input == 'Y') + { + printf ("\nConverting Pet Database...\n"); + if ((fp = fopen_ (pet_txt, "r")) == NULL) + return 1; + + p = malloc (sizeof (struct s_pet)); + while (fgets (line, sizeof (line), fp)) + { + if (p == NULL) + { + printf ("int_pet: out of memory!\n"); + exit (0); + } + if (inter_pet_fromstr (line, p) == 0 && p->pet_id > 0) + { + //pet dump + inter_pet_tosql (p->pet_id, p); + } + else + { + printf ("int_pet: broken data [%s] line %d\n", pet_txt, c); + } + c++; + } + fclose_ (fp); + } + + return 0; } -int inter_config_read(const char *cfgName) { - printf ("start reading interserver configuration: %s\n",cfgName); - int i; - char line[1024], w1[1024], w2[1024]; - FILE *fp; - - fp=fopen_(cfgName,"r"); - if(fp==NULL){ - printf("file not found: %s\n", cfgName); - return 1; - } - while(fgets(line, 1020, fp)){ - i=sscanf(line,"%[^:]:%s", w1, w2); - if(i!=2) - continue; - if(strcmpi(w1,"storage_txt")==0){ - printf ("set storage_txt : %s\n",w2); - strncpy(storage_txt, w2, sizeof(storage_txt)); - } else if(strcmpi(w1,"pet_txt")==0){ - printf ("set pet_txt : %s\n",w2); - strncpy(pet_txt, w2, sizeof(pet_txt)); - } - //add for DB connection - else if(strcmpi(w1,"db_server_ip")==0){ - strcpy(db_server_ip, w2); - printf ("set db_server_ip : %s\n",w2); - } - else if(strcmpi(w1,"db_server_port")==0){ - db_server_port=atoi(w2); - printf ("set db_server_port : %s\n",w2); - } - else if(strcmpi(w1,"db_server_id")==0){ - strcpy(db_server_id, w2); - printf ("set db_server_id : %s\n",w2); - } - else if(strcmpi(w1,"db_server_pw")==0){ - strcpy(db_server_pw, w2); - printf ("set db_server_pw : %s\n",w2); - } - else if(strcmpi(w1,"db_server_logindb")==0){ - strcpy(db_server_logindb, w2); - printf ("set db_server_logindb : %s\n",w2); - } - } - fclose_(fp); - - printf ("success reading interserver configuration\n"); - - return 0; + +int inter_config_read (const char *cfgName) +{ + printf ("start reading interserver configuration: %s\n", cfgName); + int i; + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + fp = fopen_ (cfgName, "r"); + if (fp == NULL) + { + printf ("file not found: %s\n", cfgName); + return 1; + } + while (fgets (line, 1020, fp)) + { + i = sscanf (line, "%[^:]:%s", w1, w2); + if (i != 2) + continue; + if (strcmpi (w1, "storage_txt") == 0) + { + printf ("set storage_txt : %s\n", w2); + strncpy (storage_txt, w2, sizeof (storage_txt)); + } + else if (strcmpi (w1, "pet_txt") == 0) + { + printf ("set pet_txt : %s\n", w2); + strncpy (pet_txt, w2, sizeof (pet_txt)); + } + //add for DB connection + else if (strcmpi (w1, "db_server_ip") == 0) + { + strcpy (db_server_ip, w2); + printf ("set db_server_ip : %s\n", w2); + } + else if (strcmpi (w1, "db_server_port") == 0) + { + db_server_port = atoi (w2); + printf ("set db_server_port : %s\n", w2); + } + else if (strcmpi (w1, "db_server_id") == 0) + { + strcpy (db_server_id, w2); + printf ("set db_server_id : %s\n", w2); + } + else if (strcmpi (w1, "db_server_pw") == 0) + { + strcpy (db_server_pw, w2); + printf ("set db_server_pw : %s\n", w2); + } + else if (strcmpi (w1, "db_server_logindb") == 0) + { + strcpy (db_server_logindb, w2); + printf ("set db_server_logindb : %s\n", w2); + } + } + fclose_ (fp); + + printf ("success reading interserver configuration\n"); + + return 0; } -int char_config_read(const char *cfgName) { - printf ("start reading interserver configuration: %s\n",cfgName); - int i; - char line[1024], w1[1024], w2[1024]; - FILE *fp; - - fp=fopen_(cfgName,"r"); - if(fp==NULL){ - printf("file not found: %s\n", cfgName); - return 1; - } - - while(fgets(line, 1020, fp)){ - if(line[0] == '/' && line[1] == '/') - continue; - - i=sscanf(line,"%[^:]:%s", w1, w2); - if(i!=2) - continue; - if(strcmpi(w1,"char_txt")==0){ - printf ("set char_txt : %s\n",w2); - strcpy(char_txt, w2); - } - } - fclose_(fp); - printf("reading configure done.....\n"); - - return 0; +int char_config_read (const char *cfgName) +{ + printf ("start reading interserver configuration: %s\n", cfgName); + int i; + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + fp = fopen_ (cfgName, "r"); + if (fp == NULL) + { + printf ("file not found: %s\n", cfgName); + return 1; + } + + while (fgets (line, 1020, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + + i = sscanf (line, "%[^:]:%s", w1, w2); + if (i != 2) + continue; + if (strcmpi (w1, "char_txt") == 0) + { + printf ("set char_txt : %s\n", w2); + strcpy (char_txt, w2); + } + } + fclose_ (fp); + printf ("reading configure done.....\n"); + + return 0; } -int do_init(int argc, char **argv){ +int do_init (int argc, char **argv) +{ - - char_config_read((argc>1)?argv[1]:CHAR_CONF_NAME); - inter_config_read((argc>2)?argv[2]:inter_cfgName); + char_config_read ((argc > 1) ? argv[1] : CHAR_CONF_NAME); + inter_config_read ((argc > 2) ? argv[2] : inter_cfgName); - mmo_char_init(); - printf ("all conversion success!\n"); - exit (0); - return 0; + mmo_char_init (); + printf ("all conversion success!\n"); + exit (0); + return 0; } - - diff --git a/src/txt-converter/char/char.h b/src/txt-converter/char/char.h index 4712b4d..6ea18a3 100644 --- a/src/txt-converter/char/char.h +++ b/src/txt-converter/char/char.h @@ -16,16 +16,17 @@ #define DEFAULT_AUTOSAVE_INTERVAL 300*1000 -struct mmo_map_server{ - long ip; - short port; - int users; - char map[MAX_MAP_PER_SERVER][16]; +struct mmo_map_server +{ + long ip; + short port; + int users; + char map[MAX_MAP_PER_SERVER][16]; }; -int mapif_sendall(unsigned char *buf,unsigned int len); -int mapif_sendallwos(int fd,unsigned char *buf,unsigned int len); -int mapif_send(int fd,unsigned char *buf,unsigned int len); +int mapif_sendall (unsigned char *buf, unsigned int len); +int mapif_sendallwos (int fd, unsigned char *buf, unsigned int len); +int mapif_send (int fd, unsigned char *buf, unsigned int len); extern int autosave_interval; diff --git a/src/txt-converter/char/int_guild.h b/src/txt-converter/char/int_guild.h index 2ea8594..98aea58 100644 --- a/src/txt-converter/char/int_guild.h +++ b/src/txt-converter/char/int_guild.h @@ -1,9 +1,9 @@ #ifndef _INT_GUILD_H_ #define _INT_GUILD_H_ -int inter_guild_init(); -int inter_guild_save(); -int inter_guild_parse_frommap(int fd); +int inter_guild_init (); +int inter_guild_save (); +int inter_guild_parse_frommap (int fd); extern char guild_txt[256]; diff --git a/src/txt-converter/char/int_party.h b/src/txt-converter/char/int_party.h index 036db1a..30fdd04 100644 --- a/src/txt-converter/char/int_party.h +++ b/src/txt-converter/char/int_party.h @@ -1,10 +1,10 @@ #ifndef _INT_PARTY_H_ #define _INT_PARTY_H_ -int inter_party_init(); -int inter_party_save(); +int inter_party_init (); +int inter_party_save (); -int inter_party_parse_frommap(int fd); +int inter_party_parse_frommap (int fd); extern char party_txt[256]; diff --git a/src/txt-converter/char/int_pet.h b/src/txt-converter/char/int_pet.h index 27ba4fc..7f1157c 100644 --- a/src/txt-converter/char/int_pet.h +++ b/src/txt-converter/char/int_pet.h @@ -1,11 +1,11 @@ #ifndef _INT_PET_H_ #define _INT_PET_H_ -int inter_pet_init(); -int inter_pet_save(); -int inter_pet_delete(int pet_id); +int inter_pet_init (); +int inter_pet_save (); +int inter_pet_delete (int pet_id); -int inter_pet_parse_frommap(int fd); +int inter_pet_parse_frommap (int fd); //extern char pet_txt[256]; diff --git a/src/txt-converter/char/int_storage.h b/src/txt-converter/char/int_storage.h index 3572ae5..1c5c3f9 100644 --- a/src/txt-converter/char/int_storage.h +++ b/src/txt-converter/char/int_storage.h @@ -1,10 +1,10 @@ #ifndef _INT_STORAGE_H_ #define _INT_STORAGE_H_ -int inter_storage_init(); -int inter_storage_save(); +int inter_storage_init (); +int inter_storage_save (); -int inter_storage_parse_frommap(int fd); +int inter_storage_parse_frommap (int fd); //extern char storage_txt[256]; diff --git a/src/txt-converter/char/inter.h b/src/txt-converter/char/inter.h index ee39944..2662052 100644 --- a/src/txt-converter/char/inter.h +++ b/src/txt-converter/char/inter.h @@ -1,23 +1,22 @@ #ifndef _INTER_H_ #define _INTER_H_ -int inter_init(const char *file); -int inter_save(); -int inter_parse_frommap(int fd); +int inter_init (const char *file); +int inter_save (); +int inter_parse_frommap (int fd); -int inter_check_length(int fd,int length); +int inter_check_length (int fd, int length); #define inter_cfgName "conf/inter_athena.conf" - //add include for DBMS(mysql) #include <mysql.h> extern MYSQL mysql_handle; extern char tmp_sql[65535]; -extern MYSQL_RES* sql_res ; -extern MYSQL_ROW sql_row ; -extern int sql_cnt; +extern MYSQL_RES *sql_res; +extern MYSQL_ROW sql_row; +extern int sql_cnt; extern int db_server_port; extern char db_server_ip[16]; diff --git a/src/txt-converter/char/strlib.c b/src/txt-converter/char/strlib.c index 60803c1..463b830 100644 --- a/src/txt-converter/char/strlib.c +++ b/src/txt-converter/char/strlib.c @@ -6,61 +6,71 @@ //----------------------------------------------- // string lib. -unsigned char* jstrescape (unsigned char* pt) { - //copy from here - unsigned char * ptr; - int i =0, j=0; - - //copy string to temporary - ptr = malloc(J_MAX_MALLOC_SIZE); - strcpy (ptr,pt); - - while (ptr[i] != '\0') { - switch (ptr[i]) { - case '\'': - pt[j++] = '\\'; - pt[j++] = ptr[i++]; - break; - default: - pt[j++] = ptr[i++]; - } - } - pt[j++] = '\0'; - free (ptr); - return (unsigned char*) &pt[0]; +unsigned char *jstrescape (unsigned char *pt) +{ + //copy from here + unsigned char *ptr; + int i = 0, j = 0; + + //copy string to temporary + ptr = malloc (J_MAX_MALLOC_SIZE); + strcpy (ptr, pt); + + while (ptr[i] != '\0') + { + switch (ptr[i]) + { + case '\'': + pt[j++] = '\\'; + pt[j++] = ptr[i++]; + break; + default: + pt[j++] = ptr[i++]; + } + } + pt[j++] = '\0'; + free (ptr); + return (unsigned char *) &pt[0]; } -unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt) { - //copy from here - int i =0, j=0; - - while (spt[i] != '\0') { - switch (spt[i]) { - case '\'': - pt[j++] = '\\'; - pt[j++] = spt[i++]; - break; - default: - pt[j++] = spt[i++]; - } - } - pt[j++] = '\0'; - return (unsigned char*) &pt[0]; +unsigned char *jstrescapecpy (unsigned char *pt, unsigned char *spt) +{ + //copy from here + int i = 0, j = 0; + + while (spt[i] != '\0') + { + switch (spt[i]) + { + case '\'': + pt[j++] = '\\'; + pt[j++] = spt[i++]; + break; + default: + pt[j++] = spt[i++]; + } + } + pt[j++] = '\0'; + return (unsigned char *) &pt[0]; } -int jmemescapecpy (unsigned char* pt,unsigned char* spt, int size) { - //copy from here - int i =0, j=0; - - while (i < size) { - switch (spt[i]) { - case '\'': - pt[j++] = '\\'; - pt[j++] = spt[i++]; - break; - default: - pt[j++] = spt[i++]; - } - } - // copy size is 0 ~ (j-1) - return j; + +int jmemescapecpy (unsigned char *pt, unsigned char *spt, int size) +{ + //copy from here + int i = 0, j = 0; + + while (i < size) + { + switch (spt[i]) + { + case '\'': + pt[j++] = '\\'; + pt[j++] = spt[i++]; + break; + default: + pt[j++] = spt[i++]; + } + } + // copy size is 0 ~ (j-1) + return j; } diff --git a/src/txt-converter/char/strlib.h b/src/txt-converter/char/strlib.h index 442cfac..962f1bc 100644 --- a/src/txt-converter/char/strlib.h +++ b/src/txt-converter/char/strlib.h @@ -3,7 +3,7 @@ #define J_MAX_MALLOC_SIZE 65535 //string functions. //code by Jioh L. Jung -unsigned char* jstrescape (unsigned char* pt); -unsigned char* jstrescapecpy (unsigned char* pt,unsigned char* spt); -int jmemescapecpy (unsigned char* pt,unsigned char* spt, int size); +unsigned char *jstrescape (unsigned char *pt); +unsigned char *jstrescapecpy (unsigned char *pt, unsigned char *spt); +int jmemescapecpy (unsigned char *pt, unsigned char *spt, int size); #endif diff --git a/src/txt-converter/common/mmo.h b/src/txt-converter/common/mmo.h index df42783..589b569 100644 --- a/src/txt-converter/common/mmo.h +++ b/src/txt-converter/common/mmo.h @@ -7,9 +7,9 @@ #ifdef CYGWIN // txtやlogなどの書き出すファイルの改行コード -#define RETCODE "\r\n" // (CR/LF:Windows系) +#define RETCODE "\r\n" // (CR/LF:Windows系) #else -#define RETCODE "\n" // (LF:Unix系) +#define RETCODE "\n" // (LF:Unix系) #endif #define FIFOSIZE_SERVERLINK 128*1024 @@ -17,7 +17,7 @@ #define MAX_MAP_PER_SERVER 512 #define MAX_INVENTORY 100 #define MAX_AMOUNT 30000 -#define MAX_ZENY 1000000000 // 1G zeny +#define MAX_ZENY 1000000000 // 1G zeny #define MAX_CART 100 #define MAX_SKILL 450 #define GLOBAL_REG_NUM 96 @@ -29,12 +29,12 @@ #define MAX_STORAGE 100 #define MAX_GUILD_STORAGE 1000 #define MAX_PARTY 12 -#define MAX_GUILD 56 // increased max guild members to accomodate for +2 increase for extension levels [Valaris] -#define MAX_GUILDPOSITION 56 // increased max guild positions to accomodate for all members [Valaris] +#define MAX_GUILD 56 // increased max guild members to accomodate for +2 increase for extension levels [Valaris] +#define MAX_GUILDPOSITION 56 // increased max guild positions to accomodate for all members [Valaris] #define MAX_GUILDEXPLUSION 32 #define MAX_GUILDALLIANCE 16 #define MAX_GUILDSKILL 8 -#define MAX_GUILDCASTLE 24 // increased to include novice castles [Valaris] +#define MAX_GUILDCASTLE 24 // increased to include novice castles [Valaris] #define MAX_GUILDLEVEL 50 #define MIN_HAIR_STYLE 0 @@ -61,206 +61,226 @@ #define CHAR_CONF_NAME "conf/char_athena.conf" -struct item { - int id; - short nameid; - short amount; - unsigned short equip; - char identify; - char refine; - char attribute; - short card[4]; - short broken; +struct item +{ + int id; + short nameid; + short amount; + unsigned short equip; + char identify; + char refine; + char attribute; + short card[4]; + short broken; }; -struct point{ - char map[24]; - short x,y; +struct point +{ + char map[24]; + short x, y; }; -struct skill { - unsigned short id,lv,flag; +struct skill +{ + unsigned short id, lv, flag; }; -struct global_reg { - char str[32]; - int value; +struct global_reg +{ + char str[32]; + int value; }; -struct s_pet { - int account_id; - int char_id; - int pet_id; - short class; - short level; - short egg_id;//pet egg id - short equip;//pet equip name_id - short intimate;//pet friendly - short hungry;//pet hungry - char name[24]; - char rename_flag; - char incuvate; +struct s_pet +{ + int account_id; + int char_id; + int pet_id; + short class; + short level; + short egg_id; //pet egg id + short equip; //pet equip name_id + short intimate; //pet friendly + short hungry; //pet hungry + char name[24]; + char rename_flag; + char incuvate; }; -struct mmo_charstatus { - int char_id; - int account_id; - int partner_id; +struct mmo_charstatus +{ + int char_id; + int account_id; + int partner_id; - int base_exp,job_exp,zeny; + int base_exp, job_exp, zeny; - short class; - short status_point,skill_point; - int hp,max_hp,sp,max_sp; - short option,karma,manner; - short hair,hair_color,clothes_color; - int party_id,guild_id,pet_id; + short class; + short status_point, skill_point; + int hp, max_hp, sp, max_sp; + short option, karma, manner; + short hair, hair_color, clothes_color; + int party_id, guild_id, pet_id; - short weapon,shield; - short head_top,head_mid,head_bottom; + short weapon, shield; + short head_top, head_mid, head_bottom; - char name[24]; - unsigned char base_level,job_level; - short str,agi,vit,int_,dex,luk; - unsigned char char_num,sex; + char name[24]; + unsigned char base_level, job_level; + short str, agi, vit, int_, dex, luk; + unsigned char char_num, sex; - struct point last_point,save_point,memo_point[10]; - struct item inventory[MAX_INVENTORY],cart[MAX_CART]; - struct skill skill[MAX_SKILL]; - int global_reg_num; - struct global_reg global_reg[GLOBAL_REG_NUM]; - int account_reg_num; - struct global_reg account_reg[ACCOUNT_REG_NUM]; - int account_reg2_num; - struct global_reg account_reg2[ACCOUNT_REG2_NUM]; + struct point last_point, save_point, memo_point[10]; + struct item inventory[MAX_INVENTORY], cart[MAX_CART]; + struct skill skill[MAX_SKILL]; + int global_reg_num; + struct global_reg global_reg[GLOBAL_REG_NUM]; + int account_reg_num; + struct global_reg account_reg[ACCOUNT_REG_NUM]; + int account_reg2_num; + struct global_reg account_reg2[ACCOUNT_REG2_NUM]; }; -struct storage { - int account_id; - short storage_status; - short storage_amount; - struct item storage[MAX_STORAGE]; +struct storage +{ + int account_id; + short storage_status; + short storage_amount; + struct item storage[MAX_STORAGE]; }; -struct guild_storage { - int guild_id; - short storage_status; - short storage_amount; - struct item storage[MAX_GUILD_STORAGE]; +struct guild_storage +{ + int guild_id; + short storage_status; + short storage_amount; + struct item storage[MAX_GUILD_STORAGE]; }; struct map_session_data; -struct gm_account { - int account_id; - int level; +struct gm_account +{ + int account_id; + int level; }; -struct party_member { - int account_id; - char name[24],map[24]; - int leader,online,lv; - struct map_session_data *sd; +struct party_member +{ + int account_id; + char name[24], map[24]; + int leader, online, lv; + struct map_session_data *sd; }; -struct party { - int party_id; - char name[24]; - int exp; - int item; - struct party_member member[MAX_PARTY]; +struct party +{ + int party_id; + char name[24]; + int exp; + int item; + struct party_member member[MAX_PARTY]; }; -struct guild_member { - int account_id, char_id; - short hair,hair_color,gender,class,lv; - int exp,exp_payper; - short online,position; - int rsv1,rsv2; - char name[24]; - struct map_session_data *sd; +struct guild_member +{ + int account_id, char_id; + short hair, hair_color, gender, class, lv; + int exp, exp_payper; + short online, position; + int rsv1, rsv2; + char name[24]; + struct map_session_data *sd; }; -struct guild_position { - char name[24]; - int mode; - int exp_mode; +struct guild_position +{ + char name[24]; + int mode; + int exp_mode; }; -struct guild_alliance { - int opposition; - int guild_id; - char name[24]; +struct guild_alliance +{ + int opposition; + int guild_id; + char name[24]; }; -struct guild_explusion { - char name[24]; - char mes[40]; - char acc[40]; - int account_id; - int rsv1,rsv2,rsv3; +struct guild_explusion +{ + char name[24]; + char mes[40]; + char acc[40]; + int account_id; + int rsv1, rsv2, rsv3; }; -struct guild_skill { - int id,lv; +struct guild_skill +{ + int id, lv; }; -struct guild { - int guild_id; - short guild_lv, connect_member, max_member, average_lv; - int exp,next_exp,skill_point,castle_id; - char name[24],master[24]; - struct guild_member member[MAX_GUILD]; - struct guild_position position[MAX_GUILDPOSITION]; - char mes1[60],mes2[120]; - int emblem_len,emblem_id; - char emblem_data[2048]; - struct guild_alliance alliance[MAX_GUILDALLIANCE]; - struct guild_explusion explusion[MAX_GUILDEXPLUSION]; - struct guild_skill skill[MAX_GUILDSKILL]; +struct guild +{ + int guild_id; + short guild_lv, connect_member, max_member, average_lv; + int exp, next_exp, skill_point, castle_id; + char name[24], master[24]; + struct guild_member member[MAX_GUILD]; + struct guild_position position[MAX_GUILDPOSITION]; + char mes1[60], mes2[120]; + int emblem_len, emblem_id; + char emblem_data[2048]; + struct guild_alliance alliance[MAX_GUILDALLIANCE]; + struct guild_explusion explusion[MAX_GUILDEXPLUSION]; + struct guild_skill skill[MAX_GUILDSKILL]; }; -struct guild_castle { - int castle_id; - char map_name[24]; - char castle_name[24]; - int guild_id; - int economy; - int defense; - int triggerE; - int triggerD; - int nextTime; - int payTime; - int createTime; - int visibleC; - int visibleG0; - int visibleG1; - int visibleG2; - int visibleG3; - int visibleG4; - int visibleG5; - int visibleG6; - int visibleG7; - int Ghp0; // added Guardian HP [Valaris] - int Ghp1; - int Ghp2; - int Ghp3; - int Ghp4; - int Ghp5; - int Ghp6; - int Ghp7; - int GID0; - int GID1; - int GID2; - int GID3; - int GID4; - int GID5; - int GID6; - int GID7; // end addition [Valaris] +struct guild_castle +{ + int castle_id; + char map_name[24]; + char castle_name[24]; + int guild_id; + int economy; + int defense; + int triggerE; + int triggerD; + int nextTime; + int payTime; + int createTime; + int visibleC; + int visibleG0; + int visibleG1; + int visibleG2; + int visibleG3; + int visibleG4; + int visibleG5; + int visibleG6; + int visibleG7; + int Ghp0; // added Guardian HP [Valaris] + int Ghp1; + int Ghp2; + int Ghp3; + int Ghp4; + int Ghp5; + int Ghp6; + int Ghp7; + int GID0; + int GID1; + int GID2; + int GID3; + int GID4; + int GID5; + int GID6; + int GID7; // end addition [Valaris] }; -struct square { - int val1[5]; - int val2[5]; +struct square +{ + int val1[5]; + int val2[5]; }; -enum { - GBI_EXP =1, // ギルドのEXP - GBI_GUILDLV =2, // ギルドのLv - GBI_SKILLPOINT =3, // ギルドのスキルポイント - GBI_SKILLLV =4, // ギルドスキルLv +enum +{ + GBI_EXP = 1, // ギルドのEXP + GBI_GUILDLV = 2, // ギルドのLv + GBI_SKILLPOINT = 3, // ギルドのスキルポイント + GBI_SKILLLV = 4, // ギルドスキルLv - GMI_POSITION =0, // メンバーの役職変更 - GMI_EXP =1, // メンバーのEXP + GMI_POSITION = 0, // メンバーの役職変更 + GMI_EXP = 1, // メンバーのEXP }; @@ -277,4 +297,4 @@ enum { #define strnicmp strncasecmp #endif -#endif // _MMO_H_ +#endif // _MMO_H_ diff --git a/src/txt-converter/login/login-converter.c b/src/txt-converter/login/login-converter.c index 22957ff..2836866 100644 --- a/src/txt-converter/login/login-converter.c +++ b/src/txt-converter/login/login-converter.c @@ -25,228 +25,258 @@ #include "../../common/version.h" #include "../../common/db.h" -int account_id_count = START_ACCOUNT_NUM; -int server_num; -int new_account_flag = 0; -int login_port = 6900; +int account_id_count = START_ACCOUNT_NUM; +int server_num; +int new_account_flag = 0; +int login_port = 6900; struct mmo_char_server server[MAX_SERVERS]; -int server_fd[MAX_SERVERS]; +int server_fd[MAX_SERVERS]; #define AUTH_FIFO_SIZE 256 -struct { - int account_id,login_id1,login_id2; - int sex,delflag; +struct +{ + int account_id, login_id1, login_id2; + int sex, delflag; } auth_fifo[AUTH_FIFO_SIZE]; -int auth_fifo_pos=0; -struct { - int account_id, sex; - char userid[24], pass[24], lastlogin[24]; - int logincount; - int state; // packet 0x006a value + 1 (0: compte OK) - char email[40]; // e-mail (by default: a@a.com) - char error_message[20]; // Message of error code #6 = Your are Prohibited to log in until %s (packet 0x006a) - time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban) - time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) - char last_ip[16]; // save of last IP of connection - char memo[255]; // a memo field - int account_reg2_num; - struct global_reg account_reg2[ACCOUNT_REG2_NUM]; -} *auth_dat; -int auth_num=0,auth_max=0; - -char login_account_id[256]="account_id"; -char login_userid[256]="userid"; -char login_user_pass[256]="user_pass"; -char login_db[256]="login"; +int auth_fifo_pos = 0; +struct +{ + int account_id, sex; + char userid[24], pass[24], lastlogin[24]; + int logincount; + int state; // packet 0x006a value + 1 (0: compte OK) + char email[40]; // e-mail (by default: a@a.com) + char error_message[20]; // Message of error code #6 = Your are Prohibited to log in until %s (packet 0x006a) + time_t ban_until_time; // # of seconds 1/1/1970 (timestamp): ban time limit of the account (0 = no ban) + time_t connect_until_time; // # of seconds 1/1/1970 (timestamp): Validity limit of the account (0 = unlimited) + char last_ip[16]; // save of last IP of connection + char memo[255]; // a memo field + int account_reg2_num; + struct global_reg account_reg2[ACCOUNT_REG2_NUM]; +} *auth_dat; +int auth_num = 0, auth_max = 0; + +char login_account_id[256] = "account_id"; +char login_userid[256] = "userid"; +char login_user_pass[256] = "user_pass"; +char login_db[256] = "login"; static struct dbt *gm_account_db; -int db_server_port = 3306; +int db_server_port = 3306; char db_server_ip[16] = "127.0.0.1"; char db_server_id[32] = "ragnarok"; char db_server_pw[32] = "ragnarok"; char db_server_logindb[32] = "ragnarok"; -int isGM(int account_id) +int isGM (int account_id) { - struct gm_account *p; - p = numdb_search(gm_account_db,account_id); - if( p == NULL) - return 0; - return p->level; + struct gm_account *p; + p = numdb_search (gm_account_db, account_id); + if (p == NULL) + return 0; + return p->level; } -int read_gm_account() +int read_gm_account () { - char line[8192]; - struct gm_account *p; - FILE *fp; - int c=0; - - gm_account_db = numdb_init(); - printf("gm_account: read start\n"); - - if( (fp=fopen_("conf/GM_account.txt","r"))==NULL ) - return 1; - while(fgets(line,sizeof(line),fp)){ - if(line[0] == '/' && line[1] == '/') - continue; - p=malloc(sizeof(struct gm_account)); - if(p==NULL){ - printf("gm_account: out of memory!\n"); - exit(0); - } - if(sscanf(line,"%d %d",&p->account_id,&p->level) != 2 || p->level <= 0) { - printf("gm_account: broken data [conf/GM_account.txt] line %d\n",c); - } - else { - if(p->level > 99) - p->level = 99; - numdb_insert(gm_account_db,p->account_id,p); - } - c++; - } - fclose_(fp); - printf("gm_account: read done (%d gm account ID)\n",c); - return 0; + char line[8192]; + struct gm_account *p; + FILE *fp; + int c = 0; + + gm_account_db = numdb_init (); + printf ("gm_account: read start\n"); + + if ((fp = fopen_ ("conf/GM_account.txt", "r")) == NULL) + return 1; + while (fgets (line, sizeof (line), fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + p = malloc (sizeof (struct gm_account)); + if (p == NULL) + { + printf ("gm_account: out of memory!\n"); + exit (0); + } + if (sscanf (line, "%d %d", &p->account_id, &p->level) != 2 + || p->level <= 0) + { + printf ("gm_account: broken data [conf/GM_account.txt] line %d\n", + c); + } + else + { + if (p->level > 99) + p->level = 99; + numdb_insert (gm_account_db, p->account_id, p); + } + c++; + } + fclose_ (fp); + printf ("gm_account: read done (%d gm account ID)\n", c); + return 0; } -int mmo_auth_init(void) +int mmo_auth_init (void) { - MYSQL mysql_handle; - char tmpsql[1024]; - MYSQL_RES* sql_res ; - MYSQL_ROW sql_row ; - - mysql_init(&mysql_handle); - if(!mysql_real_connect(&mysql_handle, db_server_ip, db_server_id, db_server_pw, - db_server_logindb ,db_server_port, (char *)NULL, 0)) { - //pointer check - printf("%s\n",mysql_error(&mysql_handle)); - exit(1); - } - else { - printf ("connect success!\n"); - } - printf ("convert start...\n"); - - FILE *fp; - int account_id, logincount, user_level, state, n, i; - char line[2048], userid[2048], pass[2048], lastlogin[2048], sex, email[2048], error_message[2048], last_ip[2048], memo[2048]; - time_t ban_until_time; - time_t connect_until_time; - char t_uid[256]; - - fp=fopen_("save/account.txt","r"); - auth_dat=malloc(sizeof(auth_dat[0])*256); - auth_max=256; - if(fp==NULL) - return 0; - while(fgets(line,1023,fp)!=NULL){ - - if(line[0]=='/' && line[1]=='/') - continue; - - i = sscanf(line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t" - "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]\t%ld%n", - &account_id, userid, pass, lastlogin, &sex, &logincount, &state, - email, error_message, &connect_until_time, last_ip, memo, &ban_until_time, &n); - - sprintf(tmpsql, "SELECT `%s`,`%s`,`%s`,`lastlogin`,`logincount`,`sex`,`connect_until`,`last_ip`,`ban_until`,`state`" - " FROM `%s` WHERE `%s`='%s'", login_account_id, login_userid, login_user_pass, login_db, login_userid, t_uid); - - if(mysql_query(&mysql_handle, tmpsql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - user_level = isGM(account_id); - printf ("userlevel: %s (%d)- %d\n",userid, account_id, user_level); - sql_res = mysql_store_result(&mysql_handle) ; - sql_row = mysql_fetch_row(sql_res); //row fetching - if (!sql_row) //no row -> insert - sprintf(tmpsql, "INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `lastlogin`, `sex`, `logincount`, `email`, `level`) VALUES (%d, '%s', '%s', '%s', '%c', %d, 'user@athena', %d);",account_id , userid, pass,lastlogin,sex,logincount, user_level); - else //row reside -> updating - sprintf(tmpsql, "UPDATE `login` SET `account_id`='%d', `userid`='%s', `user_pass`='%s', `lastlogin`='%s', `sex`='%c', `logincount`='%d', `email`='user@athena', `level`='%d'\nWHERE `account_id`='%d';",account_id , userid, pass,lastlogin,sex,logincount, user_level, account_id); - printf ("Query: %s\n",tmpsql); - mysql_free_result(sql_res) ; //resource free - if(mysql_query(&mysql_handle, tmpsql) ) { - printf("DB server Error - %s\n", mysql_error(&mysql_handle) ); - } - } - fclose_(fp); - - printf ("convert end...\n"); - - return 0; + MYSQL mysql_handle; + char tmpsql[1024]; + MYSQL_RES *sql_res; + MYSQL_ROW sql_row; + + mysql_init (&mysql_handle); + if (!mysql_real_connect + (&mysql_handle, db_server_ip, db_server_id, db_server_pw, + db_server_logindb, db_server_port, (char *) NULL, 0)) + { + //pointer check + printf ("%s\n", mysql_error (&mysql_handle)); + exit (1); + } + else + { + printf ("connect success!\n"); + } + printf ("convert start...\n"); + + FILE *fp; + int account_id, logincount, user_level, state, n, i; + char line[2048], userid[2048], pass[2048], lastlogin[2048], sex, + email[2048], error_message[2048], last_ip[2048], memo[2048]; + time_t ban_until_time; + time_t connect_until_time; + char t_uid[256]; + + fp = fopen_ ("save/account.txt", "r"); + auth_dat = malloc (sizeof (auth_dat[0]) * 256); + auth_max = 256; + if (fp == NULL) + return 0; + while (fgets (line, 1023, fp) != NULL) + { + + if (line[0] == '/' && line[1] == '/') + continue; + + i = sscanf (line, "%d\t%[^\t]\t%[^\t]\t%[^\t]\t%c\t%d\t%d\t" + "%[^\t]\t%[^\t]\t%ld\t%[^\t]\t%[^\t]\t%ld%n", + &account_id, userid, pass, lastlogin, &sex, &logincount, + &state, email, error_message, &connect_until_time, + last_ip, memo, &ban_until_time, &n); + + sprintf (tmpsql, + "SELECT `%s`,`%s`,`%s`,`lastlogin`,`logincount`,`sex`,`connect_until`,`last_ip`,`ban_until`,`state`" + " FROM `%s` WHERE `%s`='%s'", login_account_id, login_userid, + login_user_pass, login_db, login_userid, t_uid); + + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + user_level = isGM (account_id); + printf ("userlevel: %s (%d)- %d\n", userid, account_id, user_level); + sql_res = mysql_store_result (&mysql_handle); + sql_row = mysql_fetch_row (sql_res); //row fetching + if (!sql_row) //no row -> insert + sprintf (tmpsql, + "INSERT INTO `login` (`account_id`, `userid`, `user_pass`, `lastlogin`, `sex`, `logincount`, `email`, `level`) VALUES (%d, '%s', '%s', '%s', '%c', %d, 'user@athena', %d);", + account_id, userid, pass, lastlogin, sex, logincount, + user_level); + else //row reside -> updating + sprintf (tmpsql, + "UPDATE `login` SET `account_id`='%d', `userid`='%s', `user_pass`='%s', `lastlogin`='%s', `sex`='%c', `logincount`='%d', `email`='user@athena', `level`='%d'\nWHERE `account_id`='%d';", + account_id, userid, pass, lastlogin, sex, logincount, + user_level, account_id); + printf ("Query: %s\n", tmpsql); + mysql_free_result (sql_res); //resource free + if (mysql_query (&mysql_handle, tmpsql)) + { + printf ("DB server Error - %s\n", mysql_error (&mysql_handle)); + } + } + fclose_ (fp); + + printf ("convert end...\n"); + + return 0; } // アカウントデ??ベ?スの書き込み -void nowork(void) +void nowork (void) { - //null + //null } -int login_config_read(const char *cfgName){ - int i; - char line[1024], w1[1024], w2[1024]; - FILE *fp; - - fp=fopen_(cfgName,"r"); - - if(fp==NULL){ - printf("file not found: %s\n", cfgName); - return 1; - } - printf ("start reading configuration...\n"); - while(fgets(line, 1020, fp)){ - if(line[0] == '/' && line[1] == '/') - continue; - - i=sscanf(line,"%[^:]:%s", w1, w2); - if(i!=2) - continue; - - - //add for DB connection - if(strcmpi(w1,"db_server_ip")==0){ - strcpy(db_server_ip, w2); - printf ("set db_server_ip : %s\n",w2); - } - else if(strcmpi(w1,"db_server_port")==0){ - db_server_port=atoi(w2); - printf ("set db_server_port : %s\n",w2); - } - else if(strcmpi(w1,"db_server_id")==0){ - strcpy(db_server_id, w2); - printf ("set db_server_id : %s\n",w2); - } - else if(strcmpi(w1,"db_server_pw")==0){ - strcpy(db_server_pw, w2); - printf ("set db_server_pw : %s\n",w2); - } - else if(strcmpi(w1,"db_server_logindb")==0){ - strcpy(db_server_logindb, w2); - printf ("set db_server_logindb : %s\n",w2); - } - } - fclose_(fp); - printf ("End reading configuration...\n"); - return 0; +int login_config_read (const char *cfgName) +{ + int i; + char line[1024], w1[1024], w2[1024]; + FILE *fp; + + fp = fopen_ (cfgName, "r"); + + if (fp == NULL) + { + printf ("file not found: %s\n", cfgName); + return 1; + } + printf ("start reading configuration...\n"); + while (fgets (line, 1020, fp)) + { + if (line[0] == '/' && line[1] == '/') + continue; + + i = sscanf (line, "%[^:]:%s", w1, w2); + if (i != 2) + continue; + + //add for DB connection + if (strcmpi (w1, "db_server_ip") == 0) + { + strcpy (db_server_ip, w2); + printf ("set db_server_ip : %s\n", w2); + } + else if (strcmpi (w1, "db_server_port") == 0) + { + db_server_port = atoi (w2); + printf ("set db_server_port : %s\n", w2); + } + else if (strcmpi (w1, "db_server_id") == 0) + { + strcpy (db_server_id, w2); + printf ("set db_server_id : %s\n", w2); + } + else if (strcmpi (w1, "db_server_pw") == 0) + { + strcpy (db_server_pw, w2); + printf ("set db_server_pw : %s\n", w2); + } + else if (strcmpi (w1, "db_server_logindb") == 0) + { + strcpy (db_server_logindb, w2); + printf ("set db_server_logindb : %s\n", w2); + } + } + fclose_ (fp); + printf ("End reading configuration...\n"); + return 0; } -int do_init(int argc,char **argv) +int do_init (int argc, char **argv) { - char input; - login_config_read( (argc>1)?argv[1]:LOGIN_CONF_NAME ); - read_gm_account(); - - printf("\nWarning : Make sure you backup your databases before continuing!\n"); - printf("\nDo you wish to convert your Login Database to SQL? (y/n) : "); - input=getchar(); - if(input == 'y' || input == 'Y') - mmo_auth_init(); - - exit(0); + char input; + login_config_read ((argc > 1) ? argv[1] : LOGIN_CONF_NAME); + read_gm_account (); + + printf + ("\nWarning : Make sure you backup your databases before continuing!\n"); + printf ("\nDo you wish to convert your Login Database to SQL? (y/n) : "); + input = getchar (); + if (input == 'y' || input == 'Y') + mmo_auth_init (); + + exit (0); } - - diff --git a/src/webserver/generate.c b/src/webserver/generate.c index ad050db..1fed224 100644 --- a/src/webserver/generate.c +++ b/src/webserver/generate.c @@ -1,38 +1,35 @@ -void generate_page(char password[25], int sock_in, char *query, char *ip) +void generate_page (char password[25], int sock_in, char *query, char *ip) { - char *page = get_param(query, 0); - char *ppass = get_param(query, "password"); - - - if ( (ppass == 0) || (strcmp(password, ppass) != 0) ) - { - web_send(sock_in, html_header("Enter your password")); - web_send(sock_in, "<H1>NOT LOGGED IN!</H1><form action=\"/\" method=\"GET\">\n"); - web_send(sock_in, "Enter your password:<br>\n<input type=\"text\" name=\"password\">\n"); - web_send(sock_in, "<input type=\"submit\" value=\"Login\">\n"); - } - else - { - - - //To make this simple, we will have a bunch of if statements - //that then shoot out data off into functions. - - - //The 'index' - if ( strcmp(page, "/") == 0 ) - generate_notdone(sock_in, query, ip); - - - //About page: - if ( strcmp(page, "/about.html") == 0 ) - generate_about(sock_in, query, ip); - - - //Test page: - if ( strcmp(page, "/testing/") == 0 ) - generate_sample(sock_in, query, ip); - - } + char *page = get_param (query, 0); + char *ppass = get_param (query, "password"); + + if ((ppass == 0) || (strcmp (password, ppass) != 0)) + { + web_send (sock_in, html_header ("Enter your password")); + web_send (sock_in, + "<H1>NOT LOGGED IN!</H1><form action=\"/\" method=\"GET\">\n"); + web_send (sock_in, + "Enter your password:<br>\n<input type=\"text\" name=\"password\">\n"); + web_send (sock_in, "<input type=\"submit\" value=\"Login\">\n"); + } + else + { + + //To make this simple, we will have a bunch of if statements + //that then shoot out data off into functions. + + //The 'index' + if (strcmp (page, "/") == 0) + generate_notdone (sock_in, query, ip); + + //About page: + if (strcmp (page, "/about.html") == 0) + generate_about (sock_in, query, ip); + + //Test page: + if (strcmp (page, "/testing/") == 0) + generate_sample (sock_in, query, ip); + + } } diff --git a/src/webserver/htmlstyle.c b/src/webserver/htmlstyle.c index c3a4b92..3007a24 100644 --- a/src/webserver/htmlstyle.c +++ b/src/webserver/htmlstyle.c @@ -1,51 +1,45 @@ char output[10000]; -char *html_header(char *title) +char *html_header (char *title) { - memset(output, 0x0, 10000); - char *text = "<body text=\"#000000\" bgcolor=\"#939393\" link=\"#0033FF\">\n" - "<br><table width=\"92%\" cellspacing=\"1\" cellpadding=\"0\" border=\"0\"\n" - "align=\"center\" class=\"bordercolor\"><tbody><tr><td class=\"bordercolor\" width=\"100%\">\n" - "<table bgcolor=\"#ffffff\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n" - "<tbody><tr><td><table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#ffffff\">\n" - "<tbody><tr><img src=\"http://eathena.sourceforge.net/athena.jpg\" alt=\"Athena\">\n" - "<td bgcolor=\"#ffffff\"></td></tr></tbody></table></td></tr></tbody></table>\n" - "</td></tr><tr align=\"left\"><td class=\"bordercolor\"><table bgcolor=\"#c6c6c6\" width=\"100%\" cellspacing=\"0\"\n" - "cellpadding=\"0\" style=\"text-align: left; margin-right: auto; margin-left: 0px;\">\n"; - "<tbody><tr><td width=\"100%\" align=\"center\"><table border=\"0\" width=\"100%\" cellpadding=\"3\"\n" - "cellspacing=\"0\" bgcolor=\"#c6c6c6\" align=\"center\"><tbody><tr>" - "<td valign=\"middle\" bgcolor=\"#c6c6c6\" align=\"center\"><a href=\"/cgi-bin/forum/YaBB.cgi\">" - "<span style=\"text-decoration: underline;\"><span style=\"font-weight: bold;\">\n" - "To the Forum</span></span></a><br></td></tr></tbody></table></td></tr></tbody>\n" - "</table></td></tr><tr><td class=\"bordercolor\" align=\"center\">\n" - "<table bgcolor=\"#ffffff\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n" + memset (output, 0x0, 10000); + char *text = + "<body text=\"#000000\" bgcolor=\"#939393\" link=\"#0033FF\">\n" + "<br><table width=\"92%\" cellspacing=\"1\" cellpadding=\"0\" border=\"0\"\n" + "align=\"center\" class=\"bordercolor\"><tbody><tr><td class=\"bordercolor\" width=\"100%\">\n" + "<table bgcolor=\"#ffffff\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\">\n" + "<tbody><tr><td><table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\" bgcolor=\"#ffffff\">\n" + "<tbody><tr><img src=\"http://eathena.sourceforge.net/athena.jpg\" alt=\"Athena\">\n" + "<td bgcolor=\"#ffffff\"></td></tr></tbody></table></td></tr></tbody></table>\n" + "</td></tr><tr align=\"left\"><td class=\"bordercolor\"><table bgcolor=\"#c6c6c6\" width=\"100%\" cellspacing=\"0\"\n" + "cellpadding=\"0\" style=\"text-align: left; margin-right: auto; margin-left: 0px;\">\n"; + "<tbody><tr><td width=\"100%\" align=\"center\"><table border=\"0\" width=\"100%\" cellpadding=\"3\"\n" + "cellspacing=\"0\" bgcolor=\"#c6c6c6\" align=\"center\"><tbody><tr>" + "<td valign=\"middle\" bgcolor=\"#c6c6c6\" align=\"center\"><a href=\"/cgi-bin/forum/YaBB.cgi\">" + "<span style=\"text-decoration: underline;\"><span style=\"font-weight: bold;\">\n" + "To the Forum</span></span></a><br></td></tr></tbody></table></td></tr></tbody>\n" + "</table></td></tr><tr><td class=\"bordercolor\" align=\"center\">\n" + "<table bgcolor=\"#ffffff\" width=\"100%\" cellspacing=\"0\" cellpadding=\"0\" align=\"center\">\n" "<tbody><tr><td width=\"100%\" align=\"center\"><table border=\"0\" width=\"100%\" cellpadding=\"5\"\n" - "cellspacing=\"0\" bgcolor=\"#ffffff\" align=\"center\"><tbody><tr>\n" + "cellspacing=\"0\" bgcolor=\"#ffffff\" align=\"center\"><tbody><tr>\n" "<td valign=\"middle\" bgcolor=\"#ffffff\" align=\"center\"><font size=\"2\" color=\"#6e94b7\">\n" - "<b>Athena</b> « Portal »</font></td></tr></tbody></table></td></tr></tbody>" + "<b>Athena</b> « Portal »</font></td></tr></tbody></table></td></tr></tbody>" "</table></td></tr></tbody></table>\n"; - sprintf(output, "<title>%s</title>\n%s\n", title, text); + sprintf (output, "<title>%s</title>\n%s\n", title, text); - return output; + return output; } - - -char *html_start_form(char *location, char *action) +char *html_start_form (char *location, char *action) { - memset(output, 0x0, 10000); - sprintf(output, "<form action=\"%s\" method=\"%s\">", location, action); - return output; - + memset (output, 0x0, 10000); + sprintf (output, "<form action=\"%s\" method=\"%s\">", location, action); + return output; } - -char *html_end_forum(void) +char *html_end_forum (void) { - return "</form>"; + return "</form>"; } - - - diff --git a/src/webserver/logs.c b/src/webserver/logs.c index 405b488..67bf55e 100644 --- a/src/webserver/logs.c +++ b/src/webserver/logs.c @@ -1,8 +1,8 @@ #include <time.h> -void log_visit(char *query, char *ip) +void log_visit (char *query, char *ip) { - time_t timer; - timer=time(NULL); - printf("%s - \"%s\" - %s", ip, query, asctime(localtime(&timer))); + time_t timer; + timer = time (NULL); + printf ("%s - \"%s\" - %s", ip, query, asctime (localtime (&timer))); } diff --git a/src/webserver/main.c b/src/webserver/main.c index 5936255..0e227d3 100644 --- a/src/webserver/main.c +++ b/src/webserver/main.c @@ -15,7 +15,6 @@ * * ***************************************************************************/ - #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -32,111 +31,115 @@ char *header = "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n"; char recvin[500], password[25]; -int s_port; +int s_port; -void sigchld_handler(int s) +void sigchld_handler (int s) { - while(wait(NULL) > 0); + while (wait (NULL) > 0); } -int main(int argc, char **argv) +int main (int argc, char **argv) { - if (argc < 3) - { - printf("eAthena Web Server\n"); - printf("usage: %s [password] [port]\n", argv[0]); - exit(0); - } - - s_port = atoi(argv[2]); - - if ((s_port < 1) || (s_port > 65534)) - { - printf("Error: The port you choose is not valid port.\n"); - exit(0); - } - - if (strlen(argv[1]) > 25) - { - printf("Error: Your password is too long.\n"); - printf("It must be shorter than 25 characters.\n"); - exit(0); - } - - memset(password, 0x0, 25); - memcpy(password, argv[1], strlen(argv[1])); - - int sockfd, new_fd; - struct sockaddr_in my_addr; - struct sockaddr_in their_addr; - int sin_size; - - struct sigaction sa; - - int yes=1; - - if ((sockfd = socket(AF_INET, SOCK_STREAM,0)) == -1) - { - perror("Darn, this is broken."); - exit(0); - } - - if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) - { - perror("Error... :-("); - } - - //Now we know we have a working socket. :-) - - my_addr.sin_family = AF_INET; - my_addr.sin_port = htons(s_port); - my_addr.sin_addr.s_addr = INADDR_ANY; - memset(&(my_addr.sin_zero), '\0', 8); - - if ( bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) - { - perror("can not bind to this port"); - exit(0); - } - - if ( listen(sockfd, BLOG) == -1) - { - perror("can not listen on port"); - exit(0); - } - - sa.sa_handler = sigchld_handler; - - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_RESTART; - - if (sigaction(SIGCHLD, &sa, NULL) == -1) - { - perror("sigaction sucks"); - exit(0); - } - - printf("The eAthena webserver is up and listening on port %i.\n", s_port); - - while(1) - { - sin_size = sizeof(struct sockaddr_in); - new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size); - - if (!fork()) - { - close(sockfd); - memset(recvin, 0x0, 500); - recv(new_fd, recvin, 500, 0); - send(new_fd, header, strlen(header), 0); - generate_page(password, new_fd, get_query(recvin), inet_ntoa(their_addr.sin_addr)); - log_visit(get_query(recvin), inet_ntoa(their_addr.sin_addr)); - - close(new_fd); - exit(0); - } - close(new_fd); - } - - return 0; + if (argc < 3) + { + printf ("eAthena Web Server\n"); + printf ("usage: %s [password] [port]\n", argv[0]); + exit (0); + } + + s_port = atoi (argv[2]); + + if ((s_port < 1) || (s_port > 65534)) + { + printf ("Error: The port you choose is not valid port.\n"); + exit (0); + } + + if (strlen (argv[1]) > 25) + { + printf ("Error: Your password is too long.\n"); + printf ("It must be shorter than 25 characters.\n"); + exit (0); + } + + memset (password, 0x0, 25); + memcpy (password, argv[1], strlen (argv[1])); + + int sockfd, new_fd; + struct sockaddr_in my_addr; + struct sockaddr_in their_addr; + int sin_size; + + struct sigaction sa; + + int yes = 1; + + if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1) + { + perror ("Darn, this is broken."); + exit (0); + } + + if (setsockopt (sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof (int)) == + -1) + { + perror ("Error... :-("); + } + + //Now we know we have a working socket. :-) + + my_addr.sin_family = AF_INET; + my_addr.sin_port = htons (s_port); + my_addr.sin_addr.s_addr = INADDR_ANY; + memset (&(my_addr.sin_zero), '\0', 8); + + if (bind (sockfd, (struct sockaddr *) &my_addr, sizeof (struct sockaddr)) + == -1) + { + perror ("can not bind to this port"); + exit (0); + } + + if (listen (sockfd, BLOG) == -1) + { + perror ("can not listen on port"); + exit (0); + } + + sa.sa_handler = sigchld_handler; + + sigemptyset (&sa.sa_mask); + sa.sa_flags = SA_RESTART; + + if (sigaction (SIGCHLD, &sa, NULL) == -1) + { + perror ("sigaction sucks"); + exit (0); + } + + printf ("The eAthena webserver is up and listening on port %i.\n", + s_port); + + while (1) + { + sin_size = sizeof (struct sockaddr_in); + new_fd = accept (sockfd, (struct sockaddr *) &their_addr, &sin_size); + + if (!fork ()) + { + close (sockfd); + memset (recvin, 0x0, 500); + recv (new_fd, recvin, 500, 0); + send (new_fd, header, strlen (header), 0); + generate_page (password, new_fd, get_query (recvin), + inet_ntoa (their_addr.sin_addr)); + log_visit (get_query (recvin), inet_ntoa (their_addr.sin_addr)); + + close (new_fd); + exit (0); + } + close (new_fd); + } + + return 0; } diff --git a/src/webserver/pages/about.c b/src/webserver/pages/about.c index 2b0002a..b548da9 100644 --- a/src/webserver/pages/about.c +++ b/src/webserver/pages/about.c @@ -1,6 +1,6 @@ -void generate_about(int sock_in, char *query, char *ip) +void generate_about (int sock_in, char *query, char *ip) { //printf("%s", html_header("About")); - web_send(sock_in, html_header("About")); - web_send(sock_in, "<center>eAthena Web Server!</center>\n"); + web_send (sock_in, html_header ("About")); + web_send (sock_in, "<center>eAthena Web Server!</center>\n"); } diff --git a/src/webserver/pages/notdone.c b/src/webserver/pages/notdone.c index a6492e3..1fcd44b 100644 --- a/src/webserver/pages/notdone.c +++ b/src/webserver/pages/notdone.c @@ -1,5 +1,6 @@ -void generate_notdone(int sock_in, char *query, char *ip) +void generate_notdone (int sock_in, char *query, char *ip) { - web_send(sock_in, "<title>Not here!</title>\n"); - web_send(sock_in, "<h2><center>This page/feature is not done yet.</center>\n</h2>"); + web_send (sock_in, "<title>Not here!</title>\n"); + web_send (sock_in, + "<h2><center>This page/feature is not done yet.</center>\n</h2>"); } diff --git a/src/webserver/pages/sample.c b/src/webserver/pages/sample.c index be900a1..6a33dc0 100644 --- a/src/webserver/pages/sample.c +++ b/src/webserver/pages/sample.c @@ -1,24 +1,22 @@ - -void generate_sample(int sock_in, char *query, char *ip) +void generate_sample (int sock_in, char *query, char *ip) { - char *name = get_param(query, "name"); - - web_send(sock_in, "<title>SAMPLE</title>\n"); + char *name = get_param (query, "name"); + web_send (sock_in, "<title>SAMPLE</title>\n"); - //If a name was not entered... - if ( name == '\0' ) - { - web_send(sock_in, "<form action=\"/testing/\" method=\"GET\">\n"); - web_send(sock_in, "<input type=\"text\" name=\"name\">\n"); - web_send(sock_in, "<input type=\"submit\">\n"); - } - else - { - web_send(sock_in, "Your name is: "); - web_send(sock_in, get_param(query, "name")); - } -printf("OK!\n"); + //If a name was not entered... + if (name == '\0') + { + web_send (sock_in, "<form action=\"/testing/\" method=\"GET\">\n"); + web_send (sock_in, "<input type=\"text\" name=\"name\">\n"); + web_send (sock_in, "<input type=\"submit\">\n"); + } + else + { + web_send (sock_in, "Your name is: "); + web_send (sock_in, get_param (query, "name")); + } + printf ("OK!\n"); } diff --git a/src/webserver/parse.c b/src/webserver/parse.c index 8e54a81..66ef43b 100644 --- a/src/webserver/parse.c +++ b/src/webserver/parse.c @@ -5,131 +5,128 @@ char rdata[500]; char param_n[500]; char param_d[500]; - -char *get_query(char *inquery) +char *get_query (char *inquery) { - memset(filtered_query, 0x0, 2000); - sscanf(inquery, "GET %s %[$]", filtered_query); - return(filtered_query); + memset (filtered_query, 0x0, 2000); + sscanf (inquery, "GET %s %[$]", filtered_query); + return (filtered_query); } -void web_send(int sockin, char *in_data) +void web_send (int sockin, char *in_data) { - send(sockin, in_data, strlen(in_data), 0); + send (sockin, in_data, strlen (in_data), 0); } - //THIS IS BAD CODE BE CAREFULL WITH IT! //Watch out for buffer overflow... //When using please make sure to check the string size. //Also note: //I take no pride in this code, it is a really bad way of doing this... -char *get_param(char in_string[500], char swhat[500]) +char *get_param (char in_string[500], char swhat[500]) { - int i = 0; - int marker, iswitch, pint, dint; - char flux[500]; - memset(flux, 0x0, 500); - - //Get the path of out "page" - if (swhat == 0) - { - //while i is not equal to array size - while (i != 500) - { - //if there is a question mark, halt! - if (in_string[i] == '?') - { - i = 499; - } - else - rdata[i] = in_string[i]; - - i++; - } - return rdata; - } - else //so, we want a param... - { - //calculate where param begins - while (i != 500) - { - if (in_string[i] == '?') - { - marker = i + 1; - i = 499; - } - i++; - } - - i = 0; - - //keep morons from trying to crash this - if ((marker > 500)||(marker < 1)) - marker = 500; - - while(marker != 500) - { - if ((in_string[marker] != '&') && (in_string[marker] != '\0')) - { - flux[i] = in_string[marker]; - i++; - } - else - { - - //we have a param, now we must dig through it - - //clear temp vars - memset(param_n, 0x0, 500); - memset(param_d, 0x0, 500); - iswitch = 0; - pint = 0; - dint = 0; - i = 0; - - //split result into param_n and param_d - while(i != 500) - { - if ( (flux[i] != '=') && (flux[i] != '\0') ) - { - if (iswitch == 0) - { - param_n[pint] = flux[i]; - pint++; - } - else - { - param_d[dint] = flux[i]; - dint++; - } - } - else - { - iswitch = 1; - } - if (flux[i] == '\0') - i = 499; - - i++; - } - - if ( strcmp(param_n, swhat) == 0 ) - { - return param_d; - } - - i = 0; - } - - if (in_string[marker] == '\0') - { - marker = 499; - } - marker++; - } - return 0; - } + int i = 0; + int marker, iswitch, pint, dint; + char flux[500]; + memset (flux, 0x0, 500); + + //Get the path of out "page" + if (swhat == 0) + { + //while i is not equal to array size + while (i != 500) + { + //if there is a question mark, halt! + if (in_string[i] == '?') + { + i = 499; + } + else + rdata[i] = in_string[i]; + + i++; + } + return rdata; + } + else //so, we want a param... + { + //calculate where param begins + while (i != 500) + { + if (in_string[i] == '?') + { + marker = i + 1; + i = 499; + } + i++; + } + + i = 0; + + //keep morons from trying to crash this + if ((marker > 500) || (marker < 1)) + marker = 500; + + while (marker != 500) + { + if ((in_string[marker] != '&') && (in_string[marker] != '\0')) + { + flux[i] = in_string[marker]; + i++; + } + else + { + + //we have a param, now we must dig through it + + //clear temp vars + memset (param_n, 0x0, 500); + memset (param_d, 0x0, 500); + iswitch = 0; + pint = 0; + dint = 0; + i = 0; + + //split result into param_n and param_d + while (i != 500) + { + if ((flux[i] != '=') && (flux[i] != '\0')) + { + if (iswitch == 0) + { + param_n[pint] = flux[i]; + pint++; + } + else + { + param_d[dint] = flux[i]; + dint++; + } + } + else + { + iswitch = 1; + } + if (flux[i] == '\0') + i = 499; + + i++; + } + + if (strcmp (param_n, swhat) == 0) + { + return param_d; + } + + i = 0; + } + + if (in_string[marker] == '\0') + { + marker = 499; + } + marker++; + } + return 0; + } } - |